/* 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; float32 fre_set_hart = 0; /* USER CODE END Header_start_task_hart */ void start_task_hart(void const * argument) { /* USER CODE BEGIN start_task_hart */ /* Infinite loop */ for (;;) { //该任务用于设置HART芯片所需频率、驱动验证 if(tabdata.hart_enable == 1) { if(fre_set_hart != 460800) { fre_set_hart = 460800; frequence_output(fre_set_hart, 50, PWM_HART); } //驱动验证,DEVICE <--- HART ---> SIG if(hart_test == 1) { hart_test = 0; scom1_hart.tx_flag = TRUE; hart_communicate(&scom1_hart); } } else { if(fre_set_hart != 0) { fre_set_hart = 0; frequence_output(fre_set_hart, 50, PWM_HART); } } 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; } //更新modbus的寄存器值 modbus_registers_update(); 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 */