EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
内核规范 ARM Cortex-M/R 内核的复位启动过程也被称为复位序列(Reset sequence)。ARM Cortex-M/R内核的复位启动过程与其他大部分CPU不同,也与之前的ARM架构(ARM920T、ARM7TDMI等)不相同。大部分CPU复位后都是从 0x00000000 处取得第一条指令开始运行的,然而在ARM Cortex-M/R内核中并不是这样的。其复位序列为: - 从地址 0x0000_0000 处取出 MSP 的初始值;
- 从地址 0x0000_0004 处取出PC的初始值,然后从这个值对应的地址处取指。事实上,地址 0x00000004 开始存放的就是默认中断向量表, x& P- c+ |0 I, |$ v
% y& h* h B, W5 v* yARM Cortex-M/R 内核的中断向量表布局情况如下图所示:
+ r& m0 P4 K `7 q* X0 Q F5 U
0 o- G* m% I# T0 ]. V
注意:中断向量表的位置可以改变,此处是默认情况下的设置。
在 ARM Cortex-M/R 内核中,发生异常后,并不是去执行中断向量表中对应位置处的代码,而是将对应位置处的数据存入PC中,然后去此地址处进行取指。简而言之,在ARM Cortex-M/R的中断向量表中不应该放置跳转指令,而是该放置 ISR 程序的入口地址。另外还有两个细节问题需要注意: - 0x00000000 处存放的 MSP 初始值最低三位需要是 0;
- 0x00000004 处存放的地址最低位必须是 1。
2 r# ]5 O; w) i2 v) C# w
第一条是因为在ARM上编程,但凡涉及到调用,就需要遵循一套规约AAPCS ——《Procedure Call Standard for the ARM Architecture》。AAPCS 中对栈使用的约定是这样的: 5.2.1.1* O' [- M& {6 i+ s# l$ ?0 P
Universal stack constraints
4 W- ?7 M& N% u0 }1 m" T4 t- mAt all times the following basic constraints must hold:8 C' }8 s3 ~1 a9 m T- D9 Z
Stack-limit < SP <= stack-base. The stack pointer must lie within the extent of the stack.
a. _% K% x7 k0 I) y* VSP mod 4 = 0. The stack must at all times be aligned to a word boundary.4 b3 \1 {) O5 I8 f
5.2.1.28 J8 e G! t% l# A# I/ `
Stack constraints at a public inteRFace3 \2 E) l! z% X( g# y( D' l
The stack must also conform to the following constraint at a public interface:
7 b# ~3 f" c/ b4 z- c1 HSP mod 8 = 0. The stack must be double-word aligned.
简而言之,规约规定栈任何时候都必须 4 字节对齐,在调用入口需8字节对齐,而且 SP 的最低两位在硬件上就被置为 0 了。' u8 `: U4 o2 ~
第二条与 ARM 模式与 Thumb 模式有关。ARM 中 PC 中的地址必须是 32 位对齐的,其最低两位也被硬件上置 0 了,故写入PC 中的数据最低两位并不代表真实的取址地址。ARM中使用最低一位来判断这条指令是 ARM 指令还是 Thumb 指令,若最低位为 0,代表 ARM 指令;若最低位为 1,代表 Thumb 指令。在 Cortex-M/R 内核中,并不支持 ARM 模式,若强行切换到 ARM 模式会引发一个 Hard Fault。
" I6 k, c% T- |, C% d/ O0 s |