了解Cortex-M3 的双堆栈机制
发布时间:2021-11-12 18:03:39 所属栏目:教程 来源:互联网
导读:根据PHP编程网_黄冈站长网 Www.0713Zz.Com报道 CM3 的堆栈分为两个:主堆栈和进程堆栈。 那么,这两个栈分别在什么情况下使用呢? 这时,我们看一下CM3的控制寄存器(CONTROL):控制寄存器用于定义特权级别,还用于选择当前使用哪个堆栈指针。 CONTROL[1]
根据PHP编程网_黄冈站长网 Www.0713Zz.Com报道
CM3 的堆栈分为两个:主堆栈和进程堆栈。 那么,这两个栈分别在什么情况下使用呢? 这时,我们看一下CM3的控制寄存器(CONTROL):控制寄存器用于定义特权级别,还用于选择当前使用哪个堆栈指针。 CONTROL[1] 在 Cortex㎝3 的 handler 模式中, CONTROL[1]总是 0。在线程模式中则可以为 0 或 1。 仅当处于特权级的线程模式下,此位才可写,其它场合下禁止写此位。改变处理器的模 式也有其它的方式:在异常返回时,通过修改 LR 的位 2,也能实现模式切换。 而在uC/OS-II中利用的就是LR的位2来进行堆栈模式的切换,其实我们在上一篇文中也有说到,就是PendSV_Handler_Nosave中的这条指令ORR LR, LR, #0x04 将位2赋1,这样退出异常时切换回 PSP ,之后就可以完成任务的切换。 响应异常的第一个动作,就是自动保存现场的必要部分:依次把xPSR, PC, LR, R12以及R3㏑0由硬件自动压入适当的堆栈中:如果当响应异常时,当前的代码正在使用PSP,则压入PSP,即使用线程堆栈;否则压入MSP,使用主堆栈。 大家要记住,一旦进入了中断服务程序,CPU就将一直使用主堆栈(MSP)。 uC/OS-II的任务,也可以叫做它的线程,使用的堆栈就是PSP,低优先级任务到高优先级任务的切换也正是由PSP完成的。 当开发的程序比较简单(CM3不跑系统的时候)时,可以从头到尾都只使用 MSP。这时,只需要保证开出一个容量够大的堆栈,再把 MSP 初始化到其顶即可——这也是单片机开发最常见的做法。 ![]() (编辑:我爱制作网_潮州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |