上下文切换

我正在尝试按照stm32f407发现板中的教程实施任务计划。

有四个函数,每次执行一个函数,每个函数执行 1ms,然后切换到下一个函数。

教程定义了整个流程,我们将保存每个函数的每个堆栈寄存器,即这些寄存器xpsrpclrR0...R13然后在上下文切换时将下一个函数的这个值加载到 PSP(处理器堆栈指针)(这将发生在内部sysstick_handler,它将以 1 毫秒的间隔触发)。

我不明白的是,我认为寄存器是全局的,而不是像函数内部的变量那样私有。那么他如何为每个函数保存这些寄存器值。这是给定的代码https://github.com/niekiran/CortexMxProgramming/blob/master/Source_code/015_task_scheduler/Src/main.c如果有人能向我简要介绍一下上下文切换部分,那么我将非常有信心关于我在做什么

谢谢你

回答

想象一下,你可以在某个时间点拍一张 CPU 的照片,这张照片可以向你展示 CPU 中那个瞬间的 1 和 0。如果您有办法在将来的某个时刻将照片中的 1 和 0 恢复到 CPU 中,然后您可以让 CPU 运行,那么假设 RAM 和 ROM 内容未更改,它会继续执行原来的操作在拍摄照片的时候做。

这本质上就是上下文切换正在做的事情。它保存了 CPU 的所有“易失性上下文”:所有通用寄存器的内容(包括告诉它正在执行的指令的程序计数器,粗略地说,以及堆栈指针)以及处理器的内容状态寄存器 (PSR)。这是足够的信息,可以让 CPU 在未来某个时间从这个确切点再次恢复。

在 Cortex-M 上,有两个堆栈指针,它们的存在使这个过程更容易。其中一个或另一个始终可以作为sp( r13)访问。本示例的配置方式是,处理程序模式代码使用 MSP(主堆栈指针),线程模式代码使用 PSP(进程堆栈指针)。寄存器r0-r3, r12, lr( r14), pc( r15) 和 PSR 在进入处理程序模式时被推送到活动堆栈。这只是离开r4-r11和堆栈指针(r13在线程模式下,但现在通过专用PSP寄存器访问,因为处理程序正在使用 MSP)。

因此上下文切换获取 的值PSP,然后r4-r11送到任务自己的堆栈,然后任务堆栈指针的更新值保存在其任务控制块中。现在,CPU 在进入处理程序模式时的整个易失性上下文已保存到正在运行的任务的堆栈中,并且堆栈指针已保存在 TCB 中。剩下的就是找到一个新任务来运行,从它的 TCB 中取出它的堆栈指针,用它来 pop r4-r11,然后PSP在返回之前更新。在退出处理程序模式时r0-r3r12lrpc和 PSR 都将由硬件自动弹出。

所以是的,寄存器是“全局的”,有点像,因为每个任务都使用相同的寄存器。但是当一个任务没有运行时,这些寄存器的内容存储在它的堆栈中,并在下一次准备运行时恢复到寄存器中。这就是上下文切换的目的。


以上是上下文切换的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>