ISR 中的上下文保存与线程之间的上下文切换 [已关闭]

Context saving in ISR vs Context switching between threads [closed]

提问人:chaya kumar 提问时间:11/8/2023 最后编辑:Adrian Molechaya kumar 更新时间:11/10/2023 访问量:65

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

15天前关闭。

截至 15 天前,社区正在审查是否重新讨论此问题。

让我们以 Cortex M4 处理器为例:每当触发 ISR 时,它都会将 R0-R3、R12 和 R14 (LR) 寄存器保存在其私有堆栈中,作为上下文保存的一部分;此外,在 RTOS 实现的情况下,在两个不同线程之间进行上下文切换时,它还将剩余的寄存器(即 R4-R8、R10、R11 和 SP)以及前面提到的寄存器保存在其私有堆栈中。

我想知道的是为什么要进行这种设计?在 ISR 和 RTOS 场景中,程序将从返回后中断的位置继续执行。这种上下文保存设计如何发挥作用?

ARM 嵌入式 中断 Cortex-M

评论

1赞 Lundin 11/8/2023
最重要的是,它保存了退货地址。如果该程序未保存,则程序将在到达 ISR 的末尾时崩溃。具体到 Cortex M,我认为它堆叠寄存器的唯一目的是创建可调用的 ISR,这意味着寄存器必须像调用普通函数一样堆叠。
0赞 artless noise 11/9/2023
@Ludin 有一个好点我没有解决(也不在问题中)。ISR 可以是“可重入”的。这是一个独立于用户空间/主线返回的主题。对于 Cortex-M,对于我所知道的大多数系统,可以选择性地启用/禁用重入中断。通过重入,当死亡射线 ISR 线变高时,低优先级 ISR1(按键)处于活动状态。如果您需要立即处理死亡射线,则可能会延迟按键 ISR 代码以处理死亡射线设备。上下文切换代码可能也需要处理这个问题;它可能被禁用的原因(相对于关键的 IRQ 延迟)
0赞 old_timer 11/9/2023
我们在之前的问题中已经谈到了这一点。因此,您可以像处理程序一样使用编译函数,而无需特殊构造。你应该只问你所追求的真正问题,而不是一系列的问题(已经在这里和 ARM 或其他文档中有了答案)。您对此主题还有其他问题吗?
0赞 artless noise 11/10/2023
@old_timer 如果您认为还有其他问题可以回答该主题,ISR 中的上下文保存与 Cortex-M 线程之间的上下文切换,您可以自动将问题作为重复项关闭,它们将被链接。通常,我也认为存在重复项,但最终发现没有完全拟合(或者重复项未得到答复)。我不记得与此完全相同的副本;有关于Cortex-M(RTOS)上下文切换的问题。
0赞 artless noise 11/10/2023
这是我能找到的最接近的。RTOS 如何从中断切换任务,但似乎并不完全重复;当然相关。尽管这是一个 X-Y 问题,但无法理解上下文切换不会像普通 IRQ 那样返回到同一个位置。

答:

1赞 artless noise 11/8/2023 #1

我只想知道为什么要做这个设计?尽管在 ISR 和 RTOS 场景中,程序将从返回后中断的位置继续执行。这些上下文保存设计将如何发挥作用?

在两个不同线程之间进行上下文切换的 RTOS 实现中,它还将剩余的寄存器(即 R4-R8、R10、R11 和 SP)以及前面提到的寄存器保存在其私有堆栈中。

您引用的寄存器(R4-R8,R10,R11,SP)是“被调用者保存”寄存器。这意味着给定一个用“C”编写的中断处理程序,这些寄存器自然会被保存和恢复。甚至在 ISR 中调用的子函数之间也是如此。对于 Cortex-M 类 CPU,设计目标是允许用“C”编写 ISR 的中断结构。

这些上下文保存设计将如何发挥作用?

它认为你有一个根本的脱节。上下文切换期间,所有寄存器都将更改。因此,在 ISR 开始时保存的堆栈槽在上下文切换中是垃圾。它需要移动到“旧任务”上下文存储中。所有寄存器都需要从“新任务”上下文存储中更新。

通常,上下文切换可能不会发生。在这种情况下,不需要保存“旧任务”上下文,并且可以在抢占式系统中发生“正常”ISR 返回。

ARM Link 和 Frame 指针概述了 Cortex-A CPU 上的函数调用机制。它在 Cortex-M(函数调用机制)上非常相似。许多 Cortex-A 和世界切换任务都类似于 Cortex-M。它只是要存储/恢复的寄存器列表以及存储/恢复位置。通常,您有一个带有寄存器列表的“from”和“to”指针。即,上下文保存将成为下一个上下文还原的一部分。上下文切换代码在定义的 ABI 范围内工作。函数调用比上下文切换更频繁地发生;所以这就是推动你观察的原因。