ISR 中的上下文保存与线程之间的上下文切换

问题描述 投票:0回答:1

有一个问题一直萦绕在我的脑海里。他们中的大多数人可能会觉得这是一个愚蠢的问题,但我希望没有人介意:)

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

我想知道的是为什么要做出这样的设计?尽管在ISR和RTOS场景中,程序返回后都会从中断点继续执行。这些上下文保存的设计会产生什么影响?

专家的任何答复将不胜感激:)

arm embedded interrupt freertos
1个回答
0
投票

我想知道的是为什么要做出这样的设计?尽管在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 范围内工作。函数调用比上下文切换发生得更频繁;所以这就是你观察到的事物的驱动力。

© www.soinside.com 2019 - 2024. All rights reserved.