freertos-task-scheduling.md 3.3 KB


type: concept title: FreeRTOS 任务调度与状态管理 tags: [freertos, rtos, scheduling, task, concept]

created: 2026-07-12

FreeRTOS 任务调度与状态管理

任务调度

调度器是内核中负责决定在任何特定时间应执行哪些任务的部分。FreeRTOS 默认使用 固定优先级的抢占式调度策略,对 同等优先级的任务执行时间片轮询

  • 抢占式调度:更高优先级的任务可随时抢占低优先级任务
  • 时间片轮询:同优先级任务轮流执行一个时间片长度(即 SysTick 中断周期)

如果高优先级任务等待资源(延时/信号量)而无法执行,调度器会选择执行其他就绪的高优先级任务。

Preemptive scheduling Round-robin scheduling

任务状态

FreeRTOS 中共 4 种任务状态:

状态 说明
运行态 (Running) 任务实际执行中,单核下仅一个任务处于此状态
就绪态 (Ready) 任务可执行但尚未运行,因同/更高优先级任务正在运行
阻塞态 (Blocked) 任务等待延时或外部事件
挂起态 (Suspended) 调用 vTaskSuspend() 进入,需 vTaskResume() 恢复

只有就绪态可转变成运行态,其他状态必须先转为就绪态。

Task state diagram

每种状态对应一个任务状态列表:

  • 就绪列表pxReadyTasksLists[x](x 为优先级数值)
  • 阻塞列表pxDelayedTaskList
  • 挂起列表xSuspendedTaskList

32 位硬件中保存 32 位变量代表 0-31 优先级,某位置 1 代表该优先级就绪列表有任务。多个同优先级任务连接在同一就绪列表上。

Ready list bitmap Multiple tasks same priority

FreeRTOS 滴答(Tick)

FreeRTOS 通过滴答计数变量测量时间。定时器中断(RTOS 滴答中断)以严格时间精度增加滴答数。每次滴答增加时,内核检查是否需解除阻塞或唤醒任务。

上下文切换

上下文包括处理器寄存器、堆栈等任务执行资源。当任务被挂起时保存上下文,恢复时还原。

切换时机:

  1. RTOS 滴答中断:处理就绪列表,判断是否切换(抢占/时间片)
  2. 任务执行完毕:主动调用任务切换函数

上下文切换在 PendSV ISR 中处理(PendSV 设置为最低中断优先级,避免影响其他 ISR)。

Context switch save Context switch restore

空闲任务

调度器启动时自动创建空闲任务(最低优先级),确保始终有任务可运行。负责释放被删除任务的内存。

相关页面

  • [[source-freertos|尚硅谷 FreeRTOS 教程 - 资料页]]
  • [[freertos-intro|FreeRTOS 基础概念]]
  • [[freertos-task-api|任务 API 详解]]