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

Posted

技术标签:

【中文标题】RTOS如何从中断进行任务切换【英文标题】:How RTOS does task switching from interrupt 【发布时间】:2015-04-13 16:57:22 【问题描述】:

假设有两个任务在运行 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 如何处理这种情况

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

谢谢kkrambo...所以如果我们以arm系列为例,存储ISR后应该返回的地址的链接寄存器将被替换为TASK_B的最后一台PC与其他寄存器也。我的理解正确吗? 是的,这听起来很正确。 FreeRTOS Putting It All Together 页面提供了 FreeRTOS 如何在 AVR 微控制器上执行上下文切换的详细示例。您可以下载 FreeRTOS 的 ARM 端口以查看 ARM 实现的详细信息。【参考方案2】:

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

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

【讨论】:

以上是关于RTOS如何从中断进行任务切换的主要内容,如果未能解决你的问题,请参考以下文章

free rtos 任务切换的理解

free rtos 任务切换的理解

基于RTOS的软件开发理论

基于RTOS的软件开发理论

如何从中断模式异常中获取更多信息

FreeRTOS Posix原理