上下文切换
Context Switching
我正在尝试按照 stm32f407
发现板上的教程实施任务计划。
有四个函数,每次执行一个1ms,然后切换到下一个函数。
教程定义了整个流程,我们将保存每个函数的每个堆栈寄存器,即这些寄存器xpsr
、pc
、lr
、R0...R13
然后在上下文切换时将下一个函数的这个值加载到 PSP(处理器堆栈指针)(这将在 systick_handler 内部发生,它将以 1ms 的间隔触发)。
我不明白的是,我认为寄存器是全局的而不是私有的,就像 function.So 中的变量一样,他如何为每个函数保存这些寄存器值。这是给定的代码 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 在进入处理程序模式时的整个易失性上下文已保存到 运行ning 任务的堆栈中,并且堆栈指针已保存在 TCB 中。剩下的就是找到一个新任务到 运行,从它的 TCB 中取出它的堆栈指针,用它来弹出 r4-r11
,然后在返回之前更新 PSP
。退出处理程序模式时,r0-r3
、r12
、lr
、pc
和 PSR 都将由硬件自动弹出。
所以是的,寄存器是 'global',某种程度上,因为每个任务都使用相同的寄存器。但是,当任务未 运行ning 时,这些寄存器的内容将存储在其堆栈中,并在下一次准备 运行 时恢复到寄存器中。这就是上下文切换的目的。
我正在尝试按照 stm32f407
发现板上的教程实施任务计划。
有四个函数,每次执行一个1ms,然后切换到下一个函数。
教程定义了整个流程,我们将保存每个函数的每个堆栈寄存器,即这些寄存器xpsr
、pc
、lr
、R0...R13
然后在上下文切换时将下一个函数的这个值加载到 PSP(处理器堆栈指针)(这将在 systick_handler 内部发生,它将以 1ms 的间隔触发)。
我不明白的是,我认为寄存器是全局的而不是私有的,就像 function.So 中的变量一样,他如何为每个函数保存这些寄存器值。这是给定的代码 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 在进入处理程序模式时的整个易失性上下文已保存到 运行ning 任务的堆栈中,并且堆栈指针已保存在 TCB 中。剩下的就是找到一个新任务到 运行,从它的 TCB 中取出它的堆栈指针,用它来弹出 r4-r11
,然后在返回之前更新 PSP
。退出处理程序模式时,r0-r3
、r12
、lr
、pc
和 PSR 都将由硬件自动弹出。
所以是的,寄存器是 'global',某种程度上,因为每个任务都使用相同的寄存器。但是,当任务未 运行ning 时,这些寄存器的内容将存储在其堆栈中,并在下一次准备 运行 时恢复到寄存器中。这就是上下文切换的目的。