Cortex-M3拥有通⽤寄存器R0-R15以及⼀些特殊功能寄存器。R0-R12是最”通⽤⽬的“的,绝⼤多数的16位指令只能使⽤R0-R7,⽽32位的Thumb-2指令则可以访问所有的通⽤寄存器。特殊功能寄存器必须通过专⽤的指令来访问。通⽤⽬的寄存器R0-R7
R0-R7称为低组寄存器。所有指令都可以访问,R8-R12称为⾼组寄存器,只有很少的16位Thumb指令能访问他们,32位的Thumb-2指令则不受。
访问堆栈⽤堆栈指针,并且PUSH指令和POP指令默认使⽤SP。堆栈的PUSH与POP
堆栈是⼀种存储器的使⽤模型。它由⼀块连续的内存和⼀个栈顶指针组成,⽤于实现”后进先出“的缓冲区。其最典型的应⽤,就是在数据处理前先保存寄存器的值,再在处理任务完成后从中恢复先前保护的这些值。
注:寄存器的PUSH和POP操作永远都是4字节对齐的。原因是:堆栈指针的最低两位永远是0。
栈内存操作
在Cortex-M3中,除了可以使⽤PUSH和POP指令来处理堆栈外,内核还会在异常处理的始末⾃动PUSH和POP操作。堆栈的基本操作
堆栈的功能就是把寄存器的数据临时备份在内存中,以便将来能恢复之——在⼀个任务或⼀段⼦程序执⾏完毕后恢复。
.....(主程序); R0, R1=Y, R2=ZBL Fx1
Fx1
PUSH {R0} ;把R0存⼊栈&调整SP PUSH {R1} ;把R1存⼊栈&调整SP PUSH {R2} ;把R2存⼊栈&调整SP
..... ;执⾏Fx1的功能,中途可以改变R0-R2的值 POP {R2} ;恢复R2早先的值&再次调整SP POP {R1} ;恢复R1早先的值&再次调整SP POP {R0} ;恢复R0早先的值&再次调整SP BX LR ;返回;返回主程序
;R0=X,R1=Y.R2=Z(调⽤Fx1的前后R0-R2的值完好⽆损)
PUSH/POP指令⾜够体贴,⽀持⼀次操作多个寄存器。
Cortex-M3的堆栈实现
Cortex-M3使⽤的是”向下⽣长的满栈“模型。堆栈指针SP指向⼀个被压⼊堆栈的32位数值。在下⼀次压栈时,SP先⾃减4,在存⼊新的数值。如下图:
在看看Cortex-M3的双堆栈机制
我们上⾯已经知道了堆栈是分为两个:主堆栈和进程堆栈,CONTROL[1]决定如何选择。当CONTROL[1]=0时,只使⽤MSP,此时⽤户程序和异常handler共享同⼀个堆栈。这⾥写图⽚描述
当CONTROL=[1]=1时,线程模式将不再使⽤MSP,⽽改⽤PSP(handler模式永远使⽤MSP)。这⾥写图⽚描述
这样的好处是:在使⽤OS的环境下,只要OS内核仅在handler模式下执⾏,⽤户应⽤程序仅在⽤户模式下执⾏,这样就可以防⽌⽤户程序的堆栈错误破坏OS使⽤的堆栈。
通过读取PSP的值,OS就能够获取⽤户应⽤程序使⽤的堆栈,进⼀步地知道了在发⽣异常时,被压⼊寄存器的内容,⽽且还可以把其它寄存器进⼀步压栈。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务