--- type: concept title: FreeRTOS 任务调度与状态管理 tags: [freertos, rtos, scheduling, task, concept] created: 2026-07-12 --- # FreeRTOS 任务调度与状态管理 ## 任务调度 调度器是内核中负责决定在任何特定时间应执行哪些任务的部分。FreeRTOS 默认使用 **固定优先级的抢占式调度策略**,对 **同等优先级的任务执行时间片轮询**: - **抢占式调度**:更高优先级的任务可随时抢占低优先级任务 - **时间片轮询**:同优先级任务轮流执行一个时间片长度(即 SysTick 中断周期) 如果高优先级任务等待资源(延时/信号量)而无法执行,调度器会选择执行其他就绪的高优先级任务。 ![Preemptive scheduling](../raw/FreeRTOS/尚硅谷FreeRTOS教程/assets/freertos_scheduling_preemptive.png) ![Round-robin scheduling](../raw/FreeRTOS/尚硅谷FreeRTOS教程/assets/freertos_scheduling_round_robin.png) ## 任务状态 FreeRTOS 中共 4 种任务状态: | 状态 | 说明 | |------|------| | **运行态** (Running) | 任务实际执行中,单核下仅一个任务处于此状态 | | **就绪态** (Ready) | 任务可执行但尚未运行,因同/更高优先级任务正在运行 | | **阻塞态** (Blocked) | 任务等待延时或外部事件 | | **挂起态** (Suspended) | 调用 `vTaskSuspend()` 进入,需 `vTaskResume()` 恢复 | 只有就绪态可转变成运行态,其他状态必须先转为就绪态。 ![Task state diagram](../raw/FreeRTOS/尚硅谷FreeRTOS教程/assets/freertos_task_state_diagram.png) 每种状态对应一个任务状态列表: - **就绪列表**:`pxReadyTasksLists[x]`(x 为优先级数值) - **阻塞列表**:`pxDelayedTaskList` - **挂起列表**:`xSuspendedTaskList` 32 位硬件中保存 32 位变量代表 0-31 优先级,某位置 1 代表该优先级就绪列表有任务。多个同优先级任务连接在同一就绪列表上。 ![Ready list bitmap](../raw/FreeRTOS/尚硅谷FreeRTOS教程/assets/freertos_ready_list_bitmap.png) ![Multiple tasks same priority](../raw/FreeRTOS/尚硅谷FreeRTOS教程/assets/freertos_ready_list_multiple_tasks.png) ## FreeRTOS 滴答(Tick) FreeRTOS 通过滴答计数变量测量时间。定时器中断(RTOS 滴答中断)以严格时间精度增加滴答数。每次滴答增加时,内核检查是否需解除阻塞或唤醒任务。 ## 上下文切换 **上下文**包括处理器寄存器、堆栈等任务执行资源。当任务被挂起时保存上下文,恢复时还原。 切换时机: 1. **RTOS 滴答中断**:处理就绪列表,判断是否切换(抢占/时间片) 2. **任务执行完毕**:主动调用任务切换函数 上下文切换在 PendSV ISR 中处理(PendSV 设置为最低中断优先级,避免影响其他 ISR)。 ![Context switch save](../raw/FreeRTOS/尚硅谷FreeRTOS教程/assets/freertos_context_switch_save.png) ![Context switch restore](../raw/FreeRTOS/尚硅谷FreeRTOS教程/assets/freertos_context_switch_restore.png) ## 空闲任务 调度器启动时自动创建空闲任务(最低优先级),确保始终有任务可运行。负责释放被删除任务的内存。 ## 相关页面 - [[source-freertos|尚硅谷 FreeRTOS 教程 - 资料页]] - [[freertos-intro|FreeRTOS 基础概念]] - [[freertos-task-api|任务 API 详解]]