第02章 FreeRTOS基础介绍
约 1427 字大约 5 分钟
2026-01-19
官网地址:https://freertos.org
仓库地址:https://github.com/FreeRTOS/FreeRTOS
2.1 多任务处理
如果一个操作系统能够以这种方式执行多个任务, 则可称其为多任务操作系统。
使用多任务操作系统可以简化原本复杂的软件应用程序的设计 :
(1)操作系统的多任务处理和任务间通信功能允许将复杂的应用程序分割成一组更小、更易于管理的任务。
(2)通过分割,您可以更轻松地执行软件测试、分解团队内部工作以及复用代码。
(3)复杂的时序和排序细节可以从应用程序代码中移除,由操作系统负责。
即使单核处理器一次只能执行一项任务。 多任务操作系统也可以通过任务之间的快速切换制造并发执行的假象。下图展示了与时间相关的三项任务的执行模式。 任务名称采用颜色编码,并写在左手边。 时间从左向右移动, 彩色线条显示了在任何特定时间正在执行的任务。 上方展示了所感知的并发执行模式, 下方展示了实际的多任务执行模式。

2.2 任务调度
一个处理器核心在某一时刻只能运行一个任务,如果在各个任务之间迅速切换,这样看起来就像多个任务在同时运行。操作系统中任务调度器的责任就是决定在某一时刻要执行哪个任务。
调度器是内核中负责决定在任何特定时间应执行哪些任务的部分。内核可以在任务生命周期内多次挂起并且稍后恢复一个任务。
调度策略是调度器用来决定在任何时间点执行哪个任务的算法。
FreeRTOS 默认使用固定优先级的抢占式调度策略和同等优先级的任务执行时间片轮询调度策略:
抢占式调度:FreeRTOS采用抢占式调度方式,允许更高优先级的任务在任何时刻抢占正在执行的低优先级任务。这确保了高优先级任务能够及时响应,并提高了系统的实时性。
时间片轮询:在相同优先级的任务之间,FreeRTOS采用时间片轮转策略。每个任务执行一个时间片,如果有其他同优先级的任务等待执行,则切换到下一个任务。这有助于公平地分配CPU时间。
但是并不是说高优先级的任务会一直执行,导致低优先级的任务无法得到执行。如果高优先级任务等待某个资源(延时或等待信号量等)而无法执行,调度器会选择执行其他就绪的高优先级的任务。
抢占式调度:

时间片轮询:

2.3 任务状态
运行态:当任务实际执行时,它被称为处于运行状态。如果运行 RTOS 的处理器只有一个内核, 那么在任何给定时间内都只能有一个任务处于运行状态。注意在STM32中,同一时间仅一个任务处于运行态。
就绪态:准备就绪任务指那些能够执行(它们不处于阻塞或挂起状态), 但目前没有执行的任务, 因为同等或更高优先级的不同任务已经处于运行状态。
阻塞态:如果任务当前正在等待延时或外部事件,则该任务被认为处于阻塞状态。
挂起态:类似暂停,调用函数 vTaskSuspend() 进入挂起态,需要调用解挂函数vTaskResume()才可以进入就绪态。

这四种状态中,除了运行态,其他三种任务状态的任务都有其对应的任务状态列表:
就绪列表:pxReadyTasksLists[x],其中x代表任务优先级数值。
阻塞列表:pxDelayedTaskList,由一组两个列表构成。
挂起列表:xSuspendedTaskList
以就绪列表为例。如果在32位的硬件中,会保存一个32位的变量,代表0-31的优先级。当某个位,置一时,代表所对应的优先级就绪列表有任务存在。

2.4 上下文切换
当一个任务执行时,它会利用处理器/微控制器寄存器,并像其他程序一样访问 RAM 和 ROM。这些资源(处理器寄存器,堆栈等)一起组成了任务执行上下文。
保存被挂起的任务的上下文和恢复被恢复的任务的上下文的过程被称为 上下文切换。
2.5 FreeRTOS的滴答
FreeRTOS 实时内核通过滴答计数变量测量时间。定时器中断(RTOS 滴答 中断)以严格的时间精度增加滴答数——允许实时内核以所选择的定时器中断频率的分辨率来测量时间。
2.6 空闲任务
RTOS 调度器启动时,自动创建空闲任务,以确保始终存在一个能够运行的任务。
空闲以最低优先级创建,以确保如果有更高的优先级应用程序任务处于准备就绪状态,空闲任务则不使用任何 CPU 时间。
空闲任务负责释放被删除的任务的内存。
