type: concept title: FreeRTOS 任务调度与状态管理 tags: [freertos, rtos, scheduling, task, concept]
调度器是内核中负责决定在任何特定时间应执行哪些任务的部分。FreeRTOS 默认使用 固定优先级的抢占式调度策略,对 同等优先级的任务执行时间片轮询:
如果高优先级任务等待资源(延时/信号量)而无法执行,调度器会选择执行其他就绪的高优先级任务。
FreeRTOS 中共 4 种任务状态:
| 状态 | 说明 |
|---|---|
| 运行态 (Running) | 任务实际执行中,单核下仅一个任务处于此状态 |
| 就绪态 (Ready) | 任务可执行但尚未运行,因同/更高优先级任务正在运行 |
| 阻塞态 (Blocked) | 任务等待延时或外部事件 |
| 挂起态 (Suspended) | 调用 vTaskSuspend() 进入,需 vTaskResume() 恢复 |
只有就绪态可转变成运行态,其他状态必须先转为就绪态。
每种状态对应一个任务状态列表:
pxReadyTasksLists[x](x 为优先级数值)pxDelayedTaskListxSuspendedTaskList32 位硬件中保存 32 位变量代表 0-31 优先级,某位置 1 代表该优先级就绪列表有任务。多个同优先级任务连接在同一就绪列表上。
FreeRTOS 通过滴答计数变量测量时间。定时器中断(RTOS 滴答中断)以严格时间精度增加滴答数。每次滴答增加时,内核检查是否需解除阻塞或唤醒任务。
上下文包括处理器寄存器、堆栈等任务执行资源。当任务被挂起时保存上下文,恢复时还原。
切换时机:
上下文切换在 PendSV ISR 中处理(PendSV 设置为最低中断优先级,避免影响其他 ISR)。
调度器启动时自动创建空闲任务(最低优先级),确保始终有任务可运行。负责释放被删除任务的内存。