/* 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 */ #define LVGL_BREATHE_INTERVAL 5 /* 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; /* 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(500); } /* USER CODE END StartDefaultTask */ } /* USER CODE BEGIN Header_start_task_lcd */ /** * @brief Function implementing the task_lcd thread. * @param argument: Not used * @retval None */ int16_t lvgl_stack_watch = 0; /* USER CODE END Header_start_task_lcd */ void start_task_lcd(void const * argument) { /* USER CODE BEGIN start_task_lcd */ /* Infinite loop */ for (;;) { lv_timer_handler(); //LVGL刷新任务 osDelay(LVGL_BREATHE_INTERVAL); lvgl_stack_watch = uxTaskGetStackHighWaterMark(NULL); lvgl_stack_watch = 768 - lvgl_stack_watch; } /* 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 */ /* USER CODE END Header_start_task_hart */ void start_task_hart(void const * argument) { /* USER CODE BEGIN start_task_hart */ /* Infinite loop */ for (;;) { //hart_communicate(&scom1_hart); tm1650_read_key(&hi2c1, &kp_flag, COMMAND_READ_KEY_DATA, &key); osDelay(10); } /* 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 */ /* USER CODE END Header_start_task_ble */ void start_task_ble(void const * argument) { /* USER CODE BEGIN start_task_ble */ /* Infinite loop */ for (;;) { // strcpy((char *)(scom6_ble.tx_buff), "hellow I am ble.\r\n"); // ble_send(&huart6, scom6_ble.tx_buff); osDelay(100); } /* 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 (;;) { //parse_scom_485(&scom2_rs485); osDelay(10); } /* 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; uint32_t cpu_watch = 0, memuse_watch = 0, cpu_max = 0, memuse_max = 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 (;;) { mux_signal_switch(&mux_signal); osDelay(50); my_monitor_cnt++; //my monitors if(my_monitor_cnt >= 5) { my_monitor_cnt = 0; cpu_watch = 100 - lv_timer_get_idle(); cpu_max = (cpu_max < cpu_watch)?(cpu_watch):(cpu_max); lv_mem_monitor(&my_mon); memuse_watch = my_mon.used_pct; memuse_max = (memuse_max < memuse_watch)?(memuse_watch):(memuse_max); } } /* 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 */ int16_t menu_stack_watch = 0; // Word /* USER CODE END Header_start_menu */ void start_menu(void const * argument) { /* USER CODE BEGIN start_menu */ screen_data_init(); /* Infinite loop */ for(;;) { screen_run(); osDelay(500); menu_stack_watch = uxTaskGetStackHighWaterMark(NULL); menu_stack_watch = 512 - menu_stack_watch; } /* 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 */