有一个问题一直萦绕在我的脑海里。他们中的大多数人可能会觉得这是一个愚蠢的问题,但我希望没有人介意:)
以 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,设计目标是允许 ISR 用“C”编写的中断结构。
这些上下文保存的设计会产生什么影响?
它认为你有根本性的脱节。 ALL 寄存器将在上下文切换期间发生变化。因此,在 ISR 开始时保存的堆栈槽在上下文切换中是垃圾。它需要移至“旧任务”上下文存储。所有寄存器都需要从“新任务”上下文存储中更新。
一般来说,上下文切换可能不会发生。在这种情况下,不需要保存“旧任务”上下文,并且“正常”ISR 返回可以在抢占式系统中发生。
ARM 链接和帧指针 概述了 Cortex-A CPU 上的函数调用机制。它在 Cortex-M(函数调用机制)上非常相似。许多 Cortex-A 和世界切换任务与 Cortex-M 类似。它只是要存储/恢复及其位置的寄存器列表。通常,您有一个带有寄存器列表的“from”和“to”指针。即,上下文保存将是下一个上下文恢复的一部分。上下文切换代码在定义的 ABI 范围内工作。函数调用比上下文切换发生得更频繁;所以这就是你观察到的事物的驱动力。