目录
什么是任务调度器
FreeRTOS的任务调度器
抢占式调度
协作式调度
时间片调度
什么是任务调度器
任务调度器是实时操作系统(RTOS)的一个关键组件,它负责决定在多个可运行任务中哪一个将获得CPU时间以执行。它基于任务的优先级和状态来做出这些决定。
在一个RTOS中,可能会有多个任务同时运行,但是在任意时刻,CPU只能执行一个任务。任务调度器的主要目标是按照系统的需求合理分配CPU时间。
基本功能
- 任务的选择:任务调度器会根据预设的算法从所有可运行的任务中选择一个要执行的任务。
- 任务的优先级:任务通常会被分配一个优先级,优先级越高的任务在抢占式调度中会优先执行。
- 任务状态管理:任务可能处于就绪状态(可立即运行)、阻塞状态(等待某些条件满足)或者挂起状态(暂停执行)。
- 上下文切换:任务调度器负责在不同任务之间进行上下文切换。这意味着将当前任务的状态保存起来,然后加载另一个任务的状态,以便它可以继续执行。
- 定时器管理:任务调度器通常会关注系统中的定时器,以便能够在特定事件发生时唤醒相应的任务。
- 中断处理:任务调度器需要与系统的中断处理程序协同工作,以确保在中断上下文中也能够正常进行任务调度。
-
任务调度器确保了各个任务之间的合理分配和调度,以满足实时性要求和系统的功能需求。
FreeRTOS的任务调度器
FreeRTOS提供了多种任务调度器,每种调度器适用于不同的应用场景和需求。
以下是一些常见的FreeRTOS任务调度器
1. 抢占式调度器(Preemptive Scheduler)
解释:抢占式调度器是一种优先级基础的调度器,它允许更高优先级的任务可以抢占正在执行的低优先级任务,以确保紧急任务得到及时处理。
优点:适用于实时要求严格的系统,可以确保高优先级任务及时响应。
缺点:上下文切换的开销较大,可能会影响系统的性能。
2. 协作式调度器(Cooperative Scheduler)
解释:协作式调度器依赖于任务自行释放CPU,没有明确的任务优先级。任务必须自愿放弃CPU控制权,以便其他任务能够运行。
优点:上下文切换开销较小,适用于资源受限的系统。
缺点:如果任务不合作,可能会导致系统响应性降低。
3. 时间片轮转调度器(Time-Slicing Scheduler)
解释:时间片轮转调度器是一种抢占式调度器,它将CPU时间划分成小的时间片段,每个任务在一个时间片段内运行。
优点:适用于多个任务优先级相近的场景,可以避免某个任务长时间占用CPU。
缺点:会引入一定的上下文切换开销。
这些调度器提供了不同的调度策略,可以根据系统的实时性需求和资源约束选择合适的调度器。例如,对于实时性要求高的系统,可以选择抢占式调度器,而对于资源受限的系统,协作式调度器可能是一个更好的选择。 Time-Slicing调度器则可以在优先级相近的任务之间实现公平分配CPU时间。
抢占式调度
抢占式调度是一种实时操作系统(RTOS)中的任务调度策略。在抢占式调度中,RTOS具有能力在任意时刻暂停当前正在执行的任务,并切换到具有更高优先级的任务上去执行。
1. 任务优先级:每个任务都会被分配一个优先级。优先级较高的任务被认为更紧急,将会在可运行时抢占具有较低优先级的任务。
2. 抢占:当一个高优先级的任务准备好运行时,RTOS会暂停当前正在执行的低优先级任务,并将CPU的控制权转交给高优先级任务。
3. 上下文切换:在抢占发生时,RTOS会保存当前任务的上下文(包括寄存器状态等),然后加载高优先级任务的上下文,使其可以继续执行。这个过程称为上下文切换。
4. 实时性:抢占式调度器可以保证高优先级任务能够及时响应紧急事件。这对于实时系统和需要快速响应的应用程序非常重要。
5. 任务挂起:在抢占式调度中,可以随时挂起(暂停)一个任务,以便给更高优先级的任务让路。
6. 任务阻塞:一个任务可以由于等待某些条件的发生而被阻塞。当这些条件满足时,RTOS会将其重新置为就绪状态。
7. 中断处理:抢占式调度需要能够在中断上下文中正确地处理任务的切换。
8. 实时性保证:抢占式调度对于需要在严格的实时约束下工作的系统非常重要,因为它可以确保高优先级任务在预期的时间内得到处理。
抢占式调度提供了对任务优先级的动态响应能力,使得RTOS可以有效地处理紧急情况,同时保证了系统的实时性。然而,抢占式调度也可能会引入一些上下文切换的开销,因此在设计系统时需要权衡好实时性和性能。
协作式调度
在协作式调度中,任务的执行权由任务自行释放,而不是由RTOS强制性地进行抢占。换句话说,任务必须自愿地让出CPU控制权,以便其他任务能够运行。
1. 任务自主控制:在协作式调度中,任务负责自己的执行时间。任务在需要让出CPU时,会主动调用RTOS提供的让出控制权的函数。
2. 没有明确的任务优先级:协作式调度中通常没有明确的任务优先级概念。所有的任务被视为平等,没有任务可以强制其他任务停止执行。
3. 低上下文切换开销:相比抢占式调度,协作式调度通常具有更低的上下文切换开销,因为任务只有在愿意让出CPU时才会发生切换。
4. 任务合作:任务之间需要合作以确保系统的正常运行。如果一个任务长时间占用CPU,其他任务可能会受到影响。
5. 适用于资源受限的系统:协作式调度适用于资源有限的嵌入式系统,因为它减少了抢占式调度中的上下文切换开销。
6. 可能导致响应性降低:如果一个任务不合作,即使有更高优先级的任务需要执行,也可能导致响应性降低,因为任务不会主动让出CPU。
7. 任务挂起和任务阻塞:虽然没有抢占,但任务仍然可以被挂起(暂停)或者阻塞,等待某些条件的发生。
协作式调度依赖于任务之间的自愿合作,适用于资源有限或者对上下文切换开销敏感的嵌入式系统。然而,它也需要任务之间的良好协作,以确保系统的正常运行。
时间片调度
在时间片调度中,RTOS将CPU的执行时间划分为小的时间片段,每个任务在一个时间片段内运行。
1. 时间片段:CPU的执行时间被划分成固定长度的时间片段。每个时间片段可以是几毫秒或者更短的时间,具体取决于系统的配置。
2. 任务优先级:每个任务都被分配一个优先级。在一个时间片段内,具有相同优先级的任务会依次轮流执行。
3. 抢占:当一个时间片段结束时,RTOS会暂停当前执行的任务,并将CPU的控制权转交给具有相同优先级的下一个任务。
4. 上下文切换:在每个时间片段结束时,RTOS会进行上下文切换,将当前任务的状态保存起来,并加载下一个任务的状态,以便其可以继续执行。
5. 公平分配CPU时间:时间片调度确保了每个任务在一定时间段内都有机会执行,从而实现了相对公平的CPU时间分配。
6. 避免任务长时间占用CPU:时间片调度可以防止某个任务长时间占用CPU,从而保证了其他任务也有机会执行。
7. 适用于优先级相近的任务:时间片调度特别适用于具有相近优先级的任务集,因为它可以确保它们在相对公平的条件下执行。
8. 降低实时性:相比于抢占式调度,时间片调度可能会引入一定的上下文切换开销,从而降低了系统的实时性。
时间片调度是一种抢占式调度策略,通过将CPU时间划分为小的时间片段,确保了相对公平的CPU时间分配。它特别适用于具有相近优先级的任务集。