我正在尝试使用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参考资料,但它们似乎不够清晰。
我在确定如何在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参考资料,但它们似乎不够清晰。