FREE RTOS 中的任务抢占

Task Preemption in FREE RTOS

翻阅 Free RTOS 手册时,我遇到了一句话

It is important to note that the end of a time slice is not the only place that the scheduler can select a new task to run; as will be demonstrated throughout this book, the scheduler will also select a new task to run immediately after the currently executing task enters the Blocked state, or when an interrupt moves a higher priority task into the Ready state.

我对 Free RTOS 中抢占的工作方式感到困惑。考虑优先级为 1 的任务 A 处于 运行 状态。同样考虑当任务A处于时间片中间时,优先级2更高的任务B进入READY状态。

Q1:手册中说的是什么类型的中断?

Q2:当任务 A 处于 运行 状态时,中断是使任务 B 进入 READY 状态的唯一方法吗?

Q3:如果Q2的答案是否定的,如果不是中断驱动,什么时候会发生任务切换?是在时间片结束后,还是不等时间片结束,就在时间片的中间?

您描述了以下情况,您有两个任务具有不同的优先级:

  • 优先级为 1(较低)的任务 A,当前处于 运行 状态
  • 优先级为 2(更高)的任务 B,进入 READY 状态

在这种情况下,问自己一个问题很重要 - 导致这种情况的可能情况是什么?

在 FreeRTOS 中处理不同优先级的任务时的一般经验法则是优先级较高的任务将被给予 所有 可用时间,除非它不能 运行 由于被挂起、阻塞(等待队列、信号量、互斥锁)或延迟(这也属于阻塞状态)。因此,在您的情况下 - 任务 A 永远不会进入 运行 状态,除非任务 B 之前被暂停或阻止。

回答您的问题:

Q1:手册中说的是什么类型的中断?

我假设他们在谈论任务 B 由于等待 semaphore/queue 而处于阻塞状态的情况,并且您从中断中“给出信号量”/“发送到 quque”。发生这种情况的示例:IO 级中断给出信号量,UART 中断将接收到的字节推入队列。

Q2:当任务A处于运行状态时,中断是使任务B进入READY状态的唯一方法吗?

我会说不。想到的其他例子(除了上面提到的中断案例):

  • 任务B被暂停,任务A决定恢复任务B。当你这样做时,任务B应该立即恢复执行,并占用从此时开始的所有可用时间,除非它再次进入暂停状态或阻塞状态。

  • 任务 B 正在等待任务 A 持有的互斥体,任务 A 释放了它。

  • 任务 B 正在等待 semaphore/queue 并且任务 A“提供信号量”、“发送到队列”。

  • 任务 B 有延迟,延迟结束。

Q3:如果Q2的答案是否定的,如果不是中断驱动,什么时候会发生任务切换?是在时间片结束之后,还是不等时间片结束,就在时间片的中间?

我已经在上面列出了可能的示例。再次提及 - 当您有两个具有不同优先级的任务时,除非优先级较高的任务进入 BLOCKED 或 SUSPENDED 状态,否则它将占用优先级较低的任务的所有可用时间。虽然从技术上讲,在这种情况下您仍然可以说“时间片”,但所有时间片都将由更高优先级的任务 assigned/consumed 分配。因此,只有当您有两个或多个任务 运行 具有相同优先级时,谈论“时间切片”才真正有意义,在这种情况下,时间应该在它们之间平均分配(除非它们被阻塞或暂停)。