Cortex-M3 双堆栈指针的理解 以及在RTOS中的应用

在RTOS移植到Cortex-M3上,PendSV中断常用于任务切换。通过ORRLR,LR,#0x04指令改变LR的bit2,从而在异常返回时选择使用PSP作为堆栈指针,实现从MSP到PSP的切换。PendSV中断具有最低优先级,确保任务切换的顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在把RTOS移植到Cortex-M3内核上的项目中,在PendSV中断中都会有一句ORR LR, LR, #0x04,网上大量的资料都显示这条语句会改变堆栈指针,由MSP改变为PSP。在学习的时候有几个疑问出现,特此记录一下。

1、为什么在使用RTOS的时候要把SP指针从MSP改为PSP呢?
Cortex-M3内核中有两个堆栈指针(MSP&PSP),但任何时刻只能使用其中的一个。在我们使用裸机编程的时候,一般默认只使用MSP;而在使用RTOS编程的时候,应用程序task选择使用PSP;在Handler模式下(中断函数中),MCU只允许使用主堆栈指针MSP。网上有一篇博客把MSP和PSP分析的很透彻,https://blog.youkuaiyun.com/u012351051/article/details/125107815,建议仔细阅读。

2、ORR LR, LR, #0x04 是怎么把SP指针从MSP改为PSP的?
根据Cortex-M3的异常处理流程,当发生异常时,MCU会先将xPSR, PC, LR, R12以及R3‐R0压入当前堆栈,若此时SP是MSP就压入MSP堆栈,若是PSP则压入PSP堆栈。然后MCU会自动将LR设置为一个特殊的值,只有表中的这些值是合法的。
0xFFFFFFE1和0xFFFFFF1表明从一个中断返回到另一个中断,在此期间全部使用MSP指针,因为在Handler模式下(中断函数中),MCU只允许使用主堆栈指针MSP。
0xFFFFFFE9和0xFFFFFF9表明从MSP堆栈中恢复寄存器,然后继续使用MSP指针,相当于进入中断前就使用的是MSP指针。
0xFFFFFFED和0xFFFFFFD表明从PSP堆栈中恢复寄存器,然后继续使用PSP指针,相当于进入中断前就使用的是PSP指针。

ORR LR,LR,#0x04 这条指令的含义可以理解为将LR寄存器的bit2置1。

ORR LR,LR,#0x04 这条语句是放在PendSV中断中的,且PendSV中断的优先级设定的是最低的,所以此时的LR寄存器只有两种可能性,0xFFFFFF(E/F)9或者0xFFFFFF(E/F)D。如果是第一次进行任务切换,那么LR寄存器的值应该是0xFFFFFF(E/F)9,因为先前RTOS还没跑起来,使用的是MSP,通过ORR LR,LR,#0x04这条指令将LR变为0xFFFFFF(E/F)D。如果进入中断前使用的已经是PSP指针了,那么LR的值应为0xFFFFFF(E/F)D,那么ORR LR,LR,#0x04这条指令并不会对LR这个值有任何影响。至此从PendSV中断服务函数执行完成之后LR的值必为0xFFFFFF(E/F)D,SP就必定是使用PSP的了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值