繁体   English   中英

Cortex M0+ MSP/PSP 上下文切换

[英]Cortex M0+ MSP/PSP Context Switching

我正在使用 NXP S32K118 Cortex M0+ 处理器

我有一个用于调用不同任务的“调度程序”function,我需要执行以下操作:

  • 为这个“调度程序”使用主堆栈指针 (MSP) function

  • 将进程堆栈指针 (PSP) 用于计划任务列表,这些任务是从此调度程序 function 调用的。

我在 ram 中定义了 3 个堆栈(主堆栈、辅助堆栈 1、辅助堆栈 2)。 这个想法是调度器 function 使用主堆栈,从这里调用的计划任务使用辅助堆栈 1 或辅助堆栈 2,所以我在调度程序中时需要从 MSP 切换到 PSP,然后再调用相应的任务,并在相应的任务完成后从 PSP 切换回 MSP 并返回调度程序。

我知道如何切换这些指针写入 PSP/MSP/CONTROL 寄存器,但我遇到的问题是我不知道如何进行此上下文切换/除了简单地更改堆栈指针以保持所有堆栈正常工作,所以如果有人知道如何正确实施,我在这里只是寻找任何帮助/提示。

你描述的安排有点奇怪。 一般来说,“调度程序函数”(上下文切换)不调用任何东西,而是安排返回到适当的任务。 除非您正在编写运行至完成 kernel,但如果您这样做,则不需要单独的堆栈,因为所有内容都嵌套。

假设您的目标是抢占,到目前为止,切换堆栈指针的最简单方法是允许硬件为您完成。 请记住, MSPPSP始终通过r13 (sp)进行镜像。 处理程序模式始终使用MSP ,因此如果您将线程模式配置为使用PSP使用 CONTROL 寄存器(请记住在删除线程模式特权之前从线程模式执行此操作,并且仅在PSP指向堆栈时执行此操作,并使用数据屏障)。 现在您所要做的就是确保您的上下文切换在处理程序模式下运行。 您的上下文切换将使用MSP ,并且可以在返回之前换出PSP中的活动任务堆栈。 当它返回时,它将跳转到堆栈程序计数器值(请参阅Cortex-M 参考手册),因此通过操纵此值,您可以强制返回到相应的任务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM