CM3基础(持续更新)

CM3基础

操作模式和特权级别

参考Cortex-M3操作模式和特权级别

总结

系统有两种模式,handler模式和线程模式,前者始终位于特权级(用于处理异常),后者有特权和用户级两种。特权级别能够访问更多的数据范围。在系统复位后运行在线程模式的特权级下,位于特权级可以通过置为control[0]来进入用户级,而用户级别要进入特权级,只能被动等待异常出现然后进入handler模式来进入特权级。如下图
特权级和用户级

MSP&PSP

SP是堆栈指针,用于指向系统当前使用的堆栈位置,其实际位置取决于MSP或者PSP指向的地址,Cortex-M3的有两个堆栈指针寄存器MSP和PSP,任何时刻只能使用一个寄存器作为SP堆栈指针的索引值,可以在特权模式下通过修改control[1]来设置当前使用哪个寄存器,当系统位于handle模式时,只能使用MSP,即handle模式下虽然是特权模式但control[1]=0(即只能使用MSP),当处于线程模式时,则在特权级时可以设置为0(MSP)或者1(PSP)。
当然,我们不用担心何时去切换SP所对应寄存器地址,牢记一点:当处于中断中时,系统使用MSP,出中断前后使用PSP。更一般的,进入中断前,系统会自动使用PSP保存部分寄存器(R0-R3,R12,14,15,XPSR)到任务堆栈,在出中断前,系统会调用SP恢复寄存器,但出中断时仍处于MSP,所以在出中断前要先设置当前SP参考寄存器为PSPORR LR, LR, #0x04,这样出中断过程中会根据PSP恢复对应的软件堆栈寄存器(R0-R3,R12,14,15,XPSR)。


使用这种双指针是为了保护系统内核的堆栈数据,当系统位于软件层面时,系统使用的堆栈指针为PSP,而处理系统级别事务时则使用MSP,由于两个寄存器的储存值不同,系统堆栈和任务堆栈被人为分开了,这样能够确保软件层面的操作不会影响到系统层面。
MSP堆栈指针实际上就是整个SRAM的堆栈指针,而PSP指针只是作为任务堆栈指针来使用。
下图为MSP堆栈指针的初始化示例。因为代码中使用的数据结构可能不同(如使用了大量的数组时,位于最后的堆栈指针MSP所指的位置肯定要更靠后,即地址更高),导致实际的MSP的初始位置不同。
MSP和PSP堆栈1
在初始化SRAM时,诸如数组这样的全局变量占用SRAM低地址空间,这些数组在系统中就作为任务堆栈的储存空间,数组的末尾(数组的高地址段)就作为储存任务寄存器的地方,其中PSP就指向所压入堆栈的最后一个寄存器的地址。这样在空间上就把任务堆栈(PSP)和系统堆栈(MSP)分离开,分别标志不同的地址位,互不干扰。同时,不同的任务都有一个自己保存好的任务堆栈栈顶备份(位于TCB中),当切换回该任务时,会把自己的栈顶备份写入PSP寄存器,实现不同任务间的切换。
MSP和PSP指向不同的堆栈位置
MSP和PSP堆栈2
参考
Cortex-M3 双堆栈指针(MSP&PSP)
STM32双堆栈及其在uC/OS-II中的使用
PendSVC切换任务时,PSP和MSP的使用

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值