三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

RTOS学习笔记,二、多任务管理

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个字节。肯定够但没必要那么大

← 返回列表