RTOS如何从中断切换任务

时间:2015-02-12 19:34:08

标签: rtos freertos

假设有两个任务正在运行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功能切换,例如在解锁互斥锁时,可以通过备份寄存器来进行直接切换。

RTOS如何处理这种情况

如果这是一个普遍的问题,请原谅我......

2 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:4)

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

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