打印

由stm32中断寄存器自动保存联想到uc移植

[复制链接]
3305|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
say_sth_freely|  楼主 | 2010-12-1 16:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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,所以在任务栈初始化函数中的排放顺序也
是这样的。
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:今年三个愿望,希望实现

3

主题

167

帖子

1

粉丝