提问人:chaya kumar 提问时间:11/8/2023 最后编辑:Adrian Molechaya kumar 更新时间:11/10/2023 访问量:65
ISR 中的上下文保存与线程之间的上下文切换 [已关闭]
Context saving in ISR vs Context switching between threads [closed]
问:
让我们以 Cortex M4 处理器为例:每当触发 ISR 时,它都会将 R0-R3、R12 和 R14 (LR) 寄存器保存在其私有堆栈中,作为上下文保存的一部分;此外,在 RTOS 实现的情况下,在两个不同线程之间进行上下文切换时,它还将剩余的寄存器(即 R4-R8、R10、R11 和 SP)以及前面提到的寄存器保存在其私有堆栈中。
我想知道的是为什么要进行这种设计?在 ISR 和 RTOS 场景中,程序将从返回后中断的位置继续执行。这种上下文保存设计如何发挥作用?
答:
我只想知道为什么要做这个设计?尽管在 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 范围内工作。函数调用比上下文切换更频繁地发生;所以这就是推动你观察的原因。
评论