RTOS学习笔记,二、多任务管理
用RTOS在一块板子上同时实现LED灯控制,OLED显示,LCD闪烁任务。
在MX_FREERTOS_Init函数中创建多个任务,这里还是使用创建任务函数,分为动态和静态
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 函数指针, 任务函数 const char * const pcName, // 任务的名字 const configSTACK_DEPTH_TYPE usStackDepth, // 栈大小,单位为word,10表示40字节 void * const pvParameters, // 调用任务函数时传入的参数 UBaseType_t uxPriority, // 优先级 TaskHandle_t * const pxCreatedTask ); // 任务句柄, 以后使用它来操作这个任务TaskHandle_t xTaskCreateStatic ( TaskFunction_t pxTaskCode, // 函数指针, 任务函数 const char * const pcName, // 任务的名字 const uint32_t ulStackDepth, // 栈大小,单位为word,10表示40字节 void * const pvParameters, // 调用任务函数时传入的参数 UBaseType_t uxPriority, // 优先级 StackType_t * const puxStackBuffer, // 静态分配的栈,就是一个buffer StaticTask_t * const pxTaskBuffer // 静态分配的任务结构体的指针,用它来操作这个任务 );/* 创建任务: 影 */
这里用的是默认任务
defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes); void StartDefaultTask(void *argument) { /* USER CODE BEGIN StartDefaultTask */ /* Infinite loop */ LCD_Init(); LCD_Clear(); for(;;) { IRReceiver_Test();/*影*/ } /* USER CODE END StartDefaultTask */ }/* 创建任务: 光 */
static StackType_t g_pucStackOfLightTask[128]; static StaticTask_t g_TCBOfLightTask; static TaskHandle_t xLightTaskHandle; xLightTaskHandle = xTaskCreateStatic(Led_Test, "LightTask", 128, NULL, osPriorityNormal, g_pucStackOfLightTask, &g_TCBOfLightTask);/* 创建任务: 色 */
static StackType_t g_pucStackOfColorTask[128]; static StaticTask_t g_TCBOfColorTask; static TaskHandle_t xColorTaskHandle; xColorTaskHandle = xTaskCreateStatic(ColorLED_Test, "ColorTask", 128, NULL, osPriorityNormal, g_pucStackOfColorTask, &g_TCBOfColorTask);这里使用了静态任务创建,需要说明栈的大小,那栈的大小如何确定呢。
考虑三个因素:
1.返回地址LR和其他寄存器会存在栈中,所以要看函数调用深度
2.局部变量大小
3.现场
这里每个函数都直接用了128*4个字节。肯定够但没必要那么大
