1. FreeRTOS多任务编程基础
在嵌入式开发中,实时操作系统(RTOS)的任务管理是核心功能之一。FreeRTOS作为一款轻量级RTOS,其任务创建与管理机制既强大又灵活。让我们从一个实际案例入手:如何让LED控制和LCD显示这两个功能并行运行。
注意:FreeRTOS中"任务"(Task)的概念相当于其他系统中的"线程",是调度的基本单位。每个任务拥有独立的栈空间和优先级。
1.1 任务创建函数解析
FreeRTOS提供了xTaskCreate()函数用于动态创建任务,其完整原型如下:
c复制BaseType_t xTaskCreate(
TaskFunction_t pxTaskCode,
const char * const pcName,
const configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask
);
各参数详解:
- pxTaskCode:任务函数指针,该函数应永不返回或通过
vTaskDelete(NULL)显式删除自身 - pcName:任务名称字符串,用于调试,长度不超过
configMAX_TASK_NAME_LEN - usStackDepth:栈大小,单位为字(Word)。例如STM32中1Word=4字节
- pvParameters:传递给任务函数的参数
- uxPriority:优先级(0~configMAX_PRIORITIES-1),数值越大优先级越高
- pxCreatedTask:输出参数,用于保存任务句柄
1.2 栈大小估算技巧
确定任务栈大小是实际开发中的难点。以下是几种实用方法:
-
经验值法:
- 简单任务:128-256字
- 中等复杂度任务:256-512字
- 复杂任务:512-1024字
-
运行时检查法:
c复制void vApplicationStackOverflowHook(Ta
