【问题标题】:Cortex M0+ MSP/PSP Context SwitchingCortex M0+ MSP/PSP 上下文切换
【发布时间】:2021-07-04 04:03:35
【问题描述】:

我使用的是 NXP S32K118 Cortex M0+ 处理器

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

  • 为这个“调度器”函数使用主堆栈指针(MSP)

  • 将进程堆栈指针 (PSP) 用于从该调度程序函数调用的计划任务列表。

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

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

【问题讨论】:

    标签: assembly arm stack cortex-m context-switch


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-04-11
      • 2020-03-22
      • 2014-10-01
      • 2013-04-07
      • 1970-01-01
      • 2016-06-19
      • 2021-10-08
      • 1970-01-01
      • 2015-08-23
      相关资源
      最近更新 更多