RTOS如何从中断进行任务切换

How RTOS does task switching from interrupt

假设有两个任务 运行 TASK_A 和 TASK_B。 TASK_A 为 运行 时发生中断,需要上下文切换到 TASK_B。

在 ISR 中,TASK_B 不应该直接跳转,因为它仍在 ISR 中并且尚未返回(例如:RETI 未执行)。如果正常从 ISR 返回,它将像往常一样返回到 TASK_A 的最后一个程序计数器。所以 RTOS 必须离开 ISR,一旦它离开 ISR,它就必须将上下文切换到 TASK_B。而不是回到 TASK_A RTOS 如何在退出 ISR 后立即取回控制权。

如果从 RTOS 功能切换,例如解锁互斥量,可以通过备份寄存器进行直接切换。

实时操作系统如何处理这种情况

如果这是一个笼统的问题,请原谅...

ISR 必须以允许上下文切换的方式实现。通常,在 ISR 结束时,将调用 RTOS 函数来检查并执行上下文切换。

当中断发生时,CPU 保存其上下文并跳转到 ISR。上下文的保存方式因 CPU 个家庭而异。当 ISR 完成时,它应该调用一个特殊的 RTOS 例程,允许在 ISR 之后进行上下文切换。如果有更高优先级的任务准备好 运行,则此例程将执行上下文切换。它将使用 CPU 保存的中断前上下文并用 TASK_A 保存它。然后它会得到保存的TASK_B的上下文并将其恢复到CPU中,这样当调用中断结束指令时,执行returns到[=17=的上下文].

所有这些的细节非常CPU和 RTOS 相关。

RTOS 需要在每个可能导致上下文切换的 ISR 中包含特定的 ISR entry/exit 代码(通常是任何调用 RTOS API 的代码)。这些函数维护一个允许嵌套中断的计数器;当计数器递减为零时,最外层的 ISR 即将 return,退出代码调用内核调度程序。

调度器会将上下文恢复到最高优先级就绪任务;这包括修改 return 地址,以便 RETI 指令导致 程序计数器 被设置为 TASK_B 的重启点而不是 TASK_A。调度程序会将 TASK_A 重启点存储在 任务控制块 (TCB) 中,以便可以类似地恢复其上下文。