繁体   English   中英

上下文切换

[英]Context Switching

我正在尝试按照教程在stm32f407发现板上执行计划任务。

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

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

我不明白的是,我认为寄存器是全局的,而不是像 function 中的变量那样私有。那么他如何为每个 function 保存这些寄存器值。这是给定的代码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-r3r12lr ( r14 )、 pc ( r15 ) 和 PSR 在进入处理程序模式时被推送到活动堆栈。 这只剩下r4-r11和堆栈指针( r13在线程模式下,但现在通过专用PSP寄存器访问,因为处理程序正在使用 MSP)。

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

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

暂无
暂无

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

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