sggt/Core/Src/freertos.c

424 lines
11 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name : freertos.c
* Description : Code for freertos applications
******************************************************************************
* @attention
*
* Copyright (c) 2024 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "apps_gather.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */
uint16_t breathe_cnt = 0;
uint8_t screen_suspend_flag = 0;
/* USER CODE END Variables */
osThreadId defaultTaskHandle;
osThreadId task_lcdHandle;
osThreadId task_hartHandle;
osThreadId task_bleHandle;
osThreadId task_rs485Handle;
osThreadId task_mux_analogHandle;
osThreadId task_menuHandle;
osThreadId task_monitorHandle;
/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */
/* USER CODE END FunctionPrototypes */
void StartDefaultTask(void const * argument);
void start_task_lcd(void const * argument);
void start_task_hart(void const * argument);
void start_task_ble(void const * argument);
void start_rs485(void const * argument);
void start_mux_analog(void const * argument);
void start_menu(void const * argument);
void start_task_monitor(void const * argument);
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
/* GetIdleTaskMemory prototype (linked to static allocation support) */
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize );
/* USER CODE BEGIN GET_IDLE_TASK_MEMORY */
static StaticTask_t xIdleTaskTCBBuffer;
static StackType_t xIdleStack[configMINIMAL_STACK_SIZE];
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize)
{
*ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer;
*ppxIdleTaskStackBuffer = &xIdleStack[0];
*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
/* place for user code */
}
/* USER CODE END GET_IDLE_TASK_MEMORY */
/**
* @brief FreeRTOS initialization
* @param None
* @retval None
*/
void MX_FREERTOS_Init(void) {
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* USER CODE BEGIN RTOS_MUTEX */
/* add mutexes, ... */
/* USER CODE END RTOS_MUTEX */
/* USER CODE BEGIN RTOS_SEMAPHORES */
/* add semaphores, ... */
/* USER CODE END RTOS_SEMAPHORES */
/* USER CODE BEGIN RTOS_TIMERS */
/* start timers, add new ones, ... */
/* USER CODE END RTOS_TIMERS */
/* USER CODE BEGIN RTOS_QUEUES */
/* add queues, ... */
/* USER CODE END RTOS_QUEUES */
/* Create the thread(s) */
/* definition and creation of defaultTask */
osThreadDef(defaultTask, StartDefaultTask, osPriorityIdle, 0, 128);
defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
/* definition and creation of task_lcd */
osThreadDef(task_lcd, start_task_lcd, osPriorityAboveNormal, 0, 768);
task_lcdHandle = osThreadCreate(osThread(task_lcd), NULL);
/* definition and creation of task_hart */
osThreadDef(task_hart, start_task_hart, osPriorityHigh, 0, 256);
task_hartHandle = osThreadCreate(osThread(task_hart), NULL);
/* definition and creation of task_ble */
osThreadDef(task_ble, start_task_ble, osPriorityBelowNormal, 0, 256);
task_bleHandle = osThreadCreate(osThread(task_ble), NULL);
/* definition and creation of task_rs485 */
osThreadDef(task_rs485, start_rs485, osPriorityHigh, 0, 256);
task_rs485Handle = osThreadCreate(osThread(task_rs485), NULL);
/* definition and creation of task_mux_analog */
osThreadDef(task_mux_analog, start_mux_analog, osPriorityRealtime, 0, 128);
task_mux_analogHandle = osThreadCreate(osThread(task_mux_analog), NULL);
/* definition and creation of task_menu */
osThreadDef(task_menu, start_menu, osPriorityNormal, 0, 512);
task_menuHandle = osThreadCreate(osThread(task_menu), NULL);
/* definition and creation of task_monitor */
osThreadDef(task_monitor, start_task_monitor, osPriorityIdle, 0, 128);
task_monitorHandle = osThreadCreate(osThread(task_monitor), NULL);
/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
/* USER CODE END RTOS_THREADS */
}
/* USER CODE BEGIN Header_StartDefaultTask */
/**
* @brief Function implementing the defaultTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for (;;)
{
osDelay(5000);
}
/* USER CODE END StartDefaultTask */
}
/* USER CODE BEGIN Header_start_task_lcd */
/**
* @brief Function implementing the task_lcd thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_start_task_lcd */
void start_task_lcd(void const * argument)
{
/* USER CODE BEGIN start_task_lcd */
/* Infinite loop */
for (;;)
{
//挂起自身
if( screen_suspend_flag == 1 ) vTaskSuspend(task_lcdHandle);
lv_timer_handler(); //LVGL刷新任务
system_sts.lvgl_stack_consume = uxTaskGetStackHighWaterMark(NULL);
system_sts.lvgl_stack_consume = 768 - system_sts.lvgl_stack_consume;
osDelay(LVGL_TASK_PERIOD);
}
/* USER CODE END start_task_lcd */
}
/* USER CODE BEGIN Header_start_task_hart */
/**
* @brief Function implementing the task_hart thread.
* @param argument: Not used
* @retval None
*/
uint8_t hart_test = 0;
/* USER CODE END Header_start_task_hart */
void start_task_hart(void const * argument)
{
/* USER CODE BEGIN start_task_hart */
/* Infinite loop */
for (;;)
{
if(tabdata.hart_enable == 1)
{
if(fre_set != 460800)
{
//freq_operation(460800, 50, TIM_CHANNEL_3);
frequence_output(460800, 50, TIM_CHANNEL_3);
fre_set = 460800;
}
//驱动验证DEVICE <--- HART ---> SIG
if(hart_test == 1)
{
hart_test = 0;
scom1_hart.tx_flag = TRUE;
hart_communicate(&scom1_hart);
}
}
else
{
if(fre_set != 0)
{
//freq_operation(0, 50, TIM_CHANNEL_3);
frequence_output(0, 50, TIM_CHANNEL_3);
fre_set = 0;
}
}
osDelay(HART_TASK_PERIOD);
}
/* USER CODE END start_task_hart */
}
/* USER CODE BEGIN Header_start_task_ble */
/**
* @brief Function implementing the task_ble thread.
* @param argument: Not used
* @retval None
*/
uint8_t ble_send_test = 0;
/* USER CODE END Header_start_task_ble */
void start_task_ble(void const * argument)
{
/* USER CODE BEGIN start_task_ble */
/* Infinite loop */
for (;;)
{
if( ble_init() == 1 )
{
if(tabdata.bluetooth_enable == 1)
{
if(ble_send_test == 1)
{
ble_send_test = 0;
//驱动验证DEVICE <--- BLUETOOTH ---> SIG
strcpy((char *)scom6_ble.tx_buff, "hellow I am ble.\r\n");
ble_send(&huart6, scom6_ble.tx_buff);
}
}
}
osDelay(BLE_TASK_PERIOD);
}
/* USER CODE END start_task_ble */
}
/* USER CODE BEGIN Header_start_rs485 */
/**
* @brief Function implementing the task_rs485 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_start_rs485 */
void start_rs485(void const * argument)
{
/* USER CODE BEGIN start_rs485 */
/* Infinite loop */
for (;;)
{
if( !(tabdata.bluetooth_enable||tabdata.hart_enable||tabdata.modbus_enable) )
{
sig_trans = TRANS_NONE;
}
osDelay(RS485_TASK_PERIOD);
}
/* USER CODE END start_rs485 */
}
/* USER CODE BEGIN Header_start_mux_analog */
/**
* @brief Function implementing the task_mux_analog thread.
* @param argument: Not used
* @retval None
*/
uint8_t my_monitor_cnt = 0;
lv_mem_monitor_t my_mon;
/* USER CODE END Header_start_mux_analog */
void start_mux_analog(void const * argument)
{
/* USER CODE BEGIN start_mux_analog */
SIG24130_Init(); //多路输入输出初始化
/* Infinite loop */
for (;;)
{
//编程输出过程,放在此处实时性更好
if( progout_data.process == PROGOUT_RUNNING)
{
switch (progout_data.output_mode)
{
case PROG_OUT_STEP:
{
running_process_step();
}
break;
case PROG_OUT_TRIANGLE:
{
running_process_triangle();
}
break;
default:
break;
}
}
//按键扫描
tm1650_read_key(&hi2c1, &kp_flag, COMMAND_READ_KEY_DATA, &key);
//输出&输入通道切换
mux_signal_switch(&mux_signal);
my_monitor_cnt++;
if( my_monitor_cnt * MUX_TASK_PERIOD >= 200)
{
my_monitor_cnt = 0;
system_sts.cpu_consume = 100 - lv_timer_get_idle();
lv_mem_monitor(&my_mon);
system_sts.mem_consume = my_mon.used_pct;
system_sts.mem_frag = my_mon.frag_pct;
system_sts.mem_consume_max = (system_sts.mem_consume_max < system_sts.mem_consume)?(system_sts.mem_consume):(system_sts.mem_consume_max);
}
osDelay(MUX_TASK_PERIOD);
}
/* USER CODE END start_mux_analog */
}
/* USER CODE BEGIN Header_start_menu */
/**
* @brief Function implementing the task_menu thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_start_menu */
void start_menu(void const * argument)
{
/* USER CODE BEGIN start_menu */
screen_data_init(); //显示数据初始化
/* Infinite loop */
for(;;)
{
//挂起自身
if( screen_suspend_flag == 1 ) vTaskSuspend(task_menuHandle);
screen_run();
system_sts.menu_stack_consume = uxTaskGetStackHighWaterMark(NULL);
system_sts.menu_stack_consume = 512 - system_sts.menu_stack_consume;
osDelay(MENU_TASK_PERIOD);
}
/* USER CODE END start_menu */
}
/* USER CODE BEGIN Header_start_task_monitor */
/**
* @brief Function implementing the task_monitor thread.
* @param argument: Not used
* @retval None
*/
//char task_status[255];
/* USER CODE END Header_start_task_monitor */
void start_task_monitor(void const * argument)
{
/* USER CODE BEGIN start_task_monitor */
/* Infinite loop */
for(;;)
{
//串口打印当前各个任务的详细信息
//任务名 状态 优先级 空闲栈 任务号
//vTaskList(task_status);
//HAL_UART_Transmit(&huart3, (uint8_t *)task_status, 255, 0xFFFF);
osDelay(3000);
}
/* USER CODE END start_task_monitor */
}
/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */
/* USER CODE END Application */