首页 文章

RTOS如何从中断切换任务

提问于
浏览
4

假设有两个任务正在运行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 回答

  • 8

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

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

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

  • 3

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

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

相关问题