在FreeRTOS中,任务的优先级、堆栈大小和任务频率是任务配置的核心参数。以下一些详细介绍:
1. 任务优先级
-
规则:
- 数值越大,优先级越高(例如,优先级5的任务会抢占优先级2的任务)。
- 优先级范围:
0
到configMAX_PRIORITIES - 1
(在FreeRTOSConfig.h
中定义,默认通常为5
或25
)。 - 高优先级任务会抢占低优先级任务,同优先级任务按时间片轮转调度(需启用
configUSE_TIME_SLICING
)。
-
注意事项:
- 避免过多高优先级任务,否则低优先级任务可能无法运行。
- 实时关键任务(如中断服务、传感器采集)应分配高优先级。
-
示例:
xTaskCreate(taskFunction, "Task1", 128, NULL, 3, NULL); // 优先级3 xTaskCreate(taskFunction, "Task2", 128, NULL, 1, NULL); // 优先级1
2. 任务堆栈大小
-
单位与计算:
- 堆栈以**字(word)**为单位(32位系统为4字节/字)。
- 示例:
xTaskCreate(..., 1024, ...)
表示分配1024字(即4096字节)。
-
确定方法:
- 估算:根据局部变量、函数调用深度、中断嵌套等估算。
- 测试:使用
uxTaskGetStackHighWaterMark()
检测最小剩余堆栈。 - 溢出检测:启用
configCHECK_FOR_STACK_OVERFLOW
以捕获溢出。
-
示例:
void taskFunction(void *pvParameters) { UBaseType_t highWaterMark = uxTaskGetStackHighWaterMark(NULL); printf("最小剩余堆栈: %d 字\n", highWaterMark); }
3. 任务频率
-
控制方法:
- 阻塞延时:使用
vTaskDelay()
或vTaskDelayUntil()
。 - 定时器触发:使用软件定时器或硬件中断。
- 阻塞延时:使用
-
API对比:
vTaskDelay(pdMS_TO_TICKS(100))
:相对延时(从调用点开始阻塞100ms)。vTaskDelayUntil(&lastWakeTime, pdMS_TO_TICKS(100))
:绝对延时(固定周期,减少累积误差)。
-
注意事项:
- 实际频率受任务执行时间、中断和高优先级任务影响。
- 确保任务执行时间小于周期时长,否则可能导致系统延迟。
-
示例(10Hz任务):
void taskFunction(void *pvParameters) { TickType_t lastWakeTime = xTaskGetTickCount(); while(1) { // 任务逻辑 vTaskDelayUntil(&lastWakeTime, pdMS_TO_TICKS(100)); // 精确100ms周期 } }
总结
参数 | 说明 |
---|---|
优先级 | 数值越大优先级越高,范围由configMAX_PRIORITIES 定义。 |
堆栈大小 | 以字为单位,通过uxTaskGetStackHighWaterMark() 优化。 |
频率 | 使用vTaskDelayUntil() 实现稳定周期,避免任务执行时间超限。 |