FreeRTOS,其基本概念、定义、性质、定理
一个系统,尤其是像操作系统这样复杂的系统,其稳固性必然建立在一系列清晰明确的基本概念、定义、性质和(如果适用的话)定理之上。对于FreeRTOS这样的工程实践性很强的系统内核,我们可能不会像纯数学那样有严格的“定理”证明,但它背后遵循的操作系统原理和并发控制理论,以及它自身API设计所体现的“准则”或“性质”,是非常值得我们深入理解的。
来,让我们逐一剖析FreeRTOS的核心概念、定义和性质:
一、 核心概念 (Core Concepts)
- 任务 (Task)
- 定义:任务是FreeRTOS中执行调度的基本单元。你可以将其理解为一个独立的、顺序执行的程序流(一段C函数)。每个任务都有其自身的上下文(寄存器值、程序计数器、堆栈指针)和优先级。
- 性质:
- 并发性 (Concurrency):在单核CPU上,多个任务通过快速切换CPU使用权,给人一种同时运行的错觉(伪并发)。在多核CPU上(FreeRTOS SMP版本支持),任务可以真正并行执行。
- 独立性:每个任务拥有独立的堆栈空间,用于存储局部变量、函数调用返回地址等。这使得任务之间在内存使用上(至少在堆栈层面)是隔离的。
- 状态:任务在生命周期中会经历不同的状态,如:
- 运行态 (Running):任务当前正在占用CPU执行。
- 就绪态 (Ready):任务已准备好运行,但由于有更高优先级的任务正在运行,或者在同优先级任务中还未轮到它,所以它在等待CPU。
- 阻塞态 (Blocked):任务因等待某个事件(如队列中有数据、信号量可用、延时结束)而暂停执行,并且不消耗CPU时间。
- 挂起态 (Suspended):任务被显式地暂停执行,除非被显式地恢复,否则不会参与调度。与阻塞态不同,挂起通常不是因为等待某个内部事件。
- 删除态 (Deleted):任务执行完毕或被显式删除,其占用的资源将被回收(如果配置了)。
- 调度器 (Scheduler)
- 定义:调度器是FreeRTOS的心脏,负责根据预定的调度策略(主要是优先级抢占)决定哪个就绪态的任务应该获得CPU的控制权。
- 性质:
- 抢占式 (Preemptive):当一个更高优先级的任务变为就绪态时(例如,一个高优先级任务从阻塞态唤醒,或者一个中断服务程序使一个高优先级任务就绪),调度器会立即剥夺当前正在运行的低优先级任务的CPU使用权,切换到高优先级任务执行。这是保证实时性的关键。
- 合作式 (Cooperative)(可选配置):任务只有在主动放弃CPU(如调用
taskYIELD()
)或进入阻塞态时,才会发生任务切换。实时性较差,但上下文切换开销可能略小。FreeRTOS主要推荐和设计为抢占式。 - 时间片轮转 (Time Slicing / Round Robin)(同优先级任务):如果配置了时间片轮转(
configUSE_TIME_SLICING
为1),并且有多个相同最高优先级的就绪任务,调度器会在每个SysTick中断(时钟节拍中断)时,在这些同优先级任务之间轮流切换,给每个任务分配一个“时间片”的运行时间。如果未配置时间片,同优先级任务在没有更高优先级任务抢占的情况下,