假设有两个任务正在运行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如何处理这种情况
请原谅我这是一个普遍的问题......
kkr*_*mbo 11
ISR必须以允许上下文切换的方式实现.通常,在ISR结束时,将调用RTOS函数来检查并执行上下文切换.
发生中断时,CPU保存其上下文并跳转到ISR.保存上下文的方式因CPU系列而异.当ISR完成时,它应该调用一个特殊的RTOS例程,允许在ISR之后进行上下文切换.如果准备好运行更高优先级的任务,则此例程将执行上下文切换.它将采用CPU保存的预中断上下文并使用TASK_A进行保存.然后它将获得保存的TASK_B上下文并将其恢复到CPU中,以便在调用中断结束指令时,执行返回到TASK_B的上下文.
所有这些的细节都非常依赖于CPU和RTOS.
RTOS 需要在每个 ISR 中包含特定的 ISR 进入/退出代码,这可能会导致上下文切换(通常是任何调用 RTOS API 的)。这些函数维护一个允许嵌套中断的计数器;当计数器递减为零时,最外层的 ISR 即将返回,退出代码调用内核调度程序。
调度器将上下文恢复到最高优先级的就绪任务;这包括修改返回地址,以便 RETI 指令使程序计数器设置为 TASK_B 的重启点而不是 TASK_A。调度器会将 TASK_A 重启点存储在任务控制块(TCB) 中,以便其上下文可以类似地恢复。
| 归档时间: |
|
| 查看次数: |
4598 次 |
| 最近记录: |