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

8
假设有两个任务正在运行,TASK_A和TASK_B。当TASK_A在运行时发生中断,并需要切换到TASK_B。
在ISR内部,不应直接跳转到TASK_B,因为它仍处于ISR中,还没有返回(例如:RETI未执行)。如果按照正常方式从ISR返回,则会像往常一样返回到TASK_A的最后一个程序计数器。因此,RTOS必须从ISR中退出,并在退出ISR后立即进行上下文切换到TASK_B。RTOS如何在退出ISR时立即恢复控制权,而不是回到TASK_A?
在从RTOS函数(例如解锁互斥量时)切换的情况下,可以通过备份寄存器进行直接切换。
RTOS如何处理这种情况?请见谅,如果这是一个泛化的问题...
2个回答

14

ISR必须以允许上下文切换的方式实现。通常,在ISR结尾处会调用一个RTOS函数,该函数会检查并执行上下文切换。

当中断发生时,CPU保存其上下文并跳转到ISR。上下文保存的方式因CPU家族而异。完成ISR后,应调用特殊的RTOS例程,以允许在ISR之后进行上下文切换。如果有更高优先级的任务准备运行,则此例程将执行上下文切换。它将使用由CPU保存的预中断上下文并将其与TASK_A一起保存。然后,它将获取TASK_B的保存上下文,并将其恢复到CPU中,以便在调用中断结束指令时,执行返回到TASK_B的上下文。

所有这些细节都非常依赖于CPU和RTOS的特定实现。


1
谢谢kkrambo...所以如果我们以ARM系列为例,存储ISR返回后应返回的地址的链接寄存器将被替换为TASK_B的最后一个PC,同时还有其他寄存器。我的理解正确吗? - 0xAB1E
2
是的,听起来是正确的。FreeRTOS Putting It All Together 页面提供了一个详细的示例,展示了FreeRTOS如何在AVR微控制器上执行上下文切换。您可以下载FreeRTOS的ARM端口以查看ARM实现的详细信息。 - kkrambo

5

实时操作系统(RTOS)需要在每个可能引起上下文切换的中断服务程序(通常是任何调用RTOS API的中断服务程序)中包含特定的ISR进入/退出代码。这些函数维护一个计数器,允许嵌套中断;当计数器减到零时,最外层的ISR即将返回,退出代码调用内核调度程序。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接