stm32中cortex内核进入中断时,会自动保存xpsr,pc,lr,r12,r3-r0,而出中断时会自动恢复这8个
寄存器。而uc的上下文切换可以说正好利用了这一点也可以说顺从了这一点,首先uc的切换发生
在pendsv中断中,当进入任务切换函数时,触发pendsv中断,进入pendsv中断后进行真正的上下
文切换。
切换过程是这样:首先保存被暂停的任务现场,刚才说了一进入中断默认是要保护8个寄存器的,
这8个寄存器是硬件替我们做了,我们需要做的是把r11-r4也存入任务相应的位置,从而达到这个
任务的所有寄存器都被保存了,这里很巧妙的利用cortex内核的这个特性;下面是恢复要执行的
任务,因为中断退出时是要自动恢复8个寄存器的,所以这8个寄存器不需要咱们去恢复而是由硬
件自动恢复的,而r11-r4这几个寄存器还是要我们自己去恢复的,过程是:首先我们去从要执行
任务的栈中恢复r11-r4,然后把psp指向任务栈中硬件保存的那8个寄存器部分,等中断返回硬件
自动出栈。
因为在中断中做任务切换,因为寄存器压栈顺序总是硬件先压xpsr-r0,然后咱们在压r11-r4,所
以出栈是也正好是先出栈r11-r4,然后硬件自动出栈xpsr-r0,这样一点不会乱,这样正好利用了
中断返回来切换了任务的执行。
由于任务栈中的寄存器存放顺序总是xpsr-r0,r11-r4,所以在任务栈初始化函数中的排放顺序也
是这样的。 |