在Cortex-M上,在中断服务程序(ISR)内切换上下文

10
我正在尝试使用CodeSourcery GCC工具链为Cortex-M编写一个简单的轮询调度器。我的调度器使用SysTick在时间片到期后触发中断,并在中断服务程序中进行上下文切换。为了保持简单,我只使用主堆栈指针(MSP)来处理所有事务。
我在确定如何在Cortex-M3上加载新上下文方面遇到了困难。根据Cortex-M3技术参考手册(TRM),该过程在进入中断服务程序时将PC、LR和状态寄存器推送到当前堆栈上。
如果我推送剩余的寄存器以保存当前任务的上下文,并从下一个任务的控制块中加载新的SP值,那么我应该如何恢复其余的上下文呢?
根据我所理解的,我需要弹出我推送的寄存器(比如{r4-r11}),当中断服务程序返回时,处理器会自动弹出剩余的寄存器(包括新任务的返回地址(LR)和状态寄存器)。所以我假设我只需要在完成后执行一个“BX”来切换任务?
以下是TRM上的说明:
异常返回会发生在以下指令之一将值0xFFFFFFFX加载到PC时:1)包括加载PC的POP/LDM指令2)将PC作为目标的LDR指令3)带有任意寄存器的BX指令。
我该如何加载EXC_RETURN的值?我是否应该将其推入堆栈(就像这里所说的那样here)?假设我已经通过软件弹出了我推送的寄存器,Cortex如何弹出它保存的寄存器?总体上,我如何恢复任务的上下文?
我尝试阅读TRM和其他ARM参考资料,但它们似乎不够清晰。

2
中断服务程序中存储在堆栈上的数据代表了先前上下文的状态,对吗?因此,除了需要保留作为旧上下文状态的其他寄存器外,还需要用新上下文的状态替换它们(包括从最后一次交换出来时的新上下文中的0xFFFf...值),然后从中断返回。 - old_timer
2
例如,这个图表似乎解释了一切?你不明白什么? - artless noise
是的,图表很清晰,但我不明白的是:a)什么是硬件弹出机制?它只是弹出最后8个单词并返回包含这些单词的LR吗?我们到底在哪里写EXC_RETURN值?链接似乎只是将其写入堆栈。 - Shrikant Giridhar
@Shrikant Giridhar 我已经发布了关于FreeRTOS如何在Cortex-M7上进行上下文切换的完整描述。 我认为Cortex-M7和Cortex-M3非常相似,除了M7中的浮点单元以及一些额外的速度和外设。 希望这个描述对你有用。 此致敬礼 - K.Mulier
3个回答

22

这确实相当复杂。我正在写一本关于在Cortex-M内核上运行的FreeRTOS操作系统的书,其中有一章专门讲述此内容。从阅读您的问题,我认为这一章会对您有所帮助:

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here


2

链接现在为https://github.com/DISTORTEC/distortos/blob/master/source/architecture/ARM/ARMv6-M-ARMv7-M/ARMv6-M-ARMv7-M-PendSV_Handler.cpp。 - Niclas Hedhman

2

经过一些阅读和在#ARM IRC频道上的帮助后,我能够理解异常返回机制。以下是我的理解。

如CM3 TRM所述,当发生异常时,核心会将寄存器r0-r3、r12以及状态、LR和PC推入当前进程堆栈。因此,在异常进入时,堆栈包含8个字,其中包括LR,其中包含要返回的地址。硬件弹出机制本质上是反转相同的操作,即弹出最后8个字,期间将LR加载到PC以返回到中断函数。

因此,可以通过将堆栈指针移动到适当的位置来简单地切换上下文,使得当前堆栈帧类似于刚被中断的任务的堆栈帧,即包含相同顺序的确切字。

在异常进入并将寄存器保存到堆栈后,LR将加载EXC_RETURN值。该值包含特殊的状态标志以指示返回条件。这也用于指示中断的结束。也就是说,如果ISR需要返回到任务并将堆栈指针从当前(MSP)切换到PSP,则可以使用适当的EXC_VALUE(在TRM中指示),并简单地执行BX LR以切换状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接