Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 上下文转换_C_Embedded_Stm32_Cortex M - Fatal编程技术网

C 上下文转换

C 上下文转换,c,embedded,stm32,cortex-m,C,Embedded,Stm32,Cortex M,我试图按照stm32f407DiscoveryBoard中的教程实现任务计划 有四个功能,每次执行一个功能1ms,然后切换到下一个功能 教程定义了整个流程,如,我们将保存每个函数的每个堆栈寄存器,即寄存器xpsr,pc,lr,R0…R13,然后在上下文切换时将下一个函数的这个值加载到PSP(处理器堆栈指针)(这将发生在systick_处理器内部,该处理器将以1ms的间隔触发) 我不明白的是,我认为寄存器是全局的,不像函数中的变量那样是私有的。那么他是如何为每个函数保存这些寄存器值的呢?这是给定的

我试图按照
stm32f407
DiscoveryBoard中的教程实现任务计划

有四个功能,每次执行一个功能1ms,然后切换到下一个功能

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

我不明白的是,我认为寄存器是全局的,不像函数中的变量那样是私有的。那么他是如何为每个函数保存这些寄存器值的呢?这是给定的代码,如果有人能简单地向我介绍一下上下文切换部分,那么我将对我正在做的事情非常有信心


谢谢

想象一下,您可以在某个时间点拍摄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中取出,使用它弹出
r4-r11
,然后在返回之前更新
PSP
。退出处理程序模式时,
r0-r3
r12
lr
pc
,PSR都将被删除硬件自动弹出


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

想象一下,您可以拍摄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中取出,使用它弹出
r4-r11
,然后在返回之前更新
PSP
。退出处理程序模式时,
r0-r3
r12
lr
pc
,PSR都将被删除硬件自动弹出