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 开始存放的就是默认中断向量表! J, z7 n' k6 X0 @1 ~
" |3 ]4 i" \3 \* e. i. |ARM Cortex-M/R 内核的中断向量表布局情况如下图所示:
4 B9 S" J. y( C% @& G5 K
3 ?1 R4 W8 T: B! B5 Q) l% ?( P
注意:中断向量表的位置可以改变,此处是默认情况下的设置。
在 ARM Cortex-M/R 内核中,发生异常后,并不是去执行中断向量表中对应位置处的代码,而是将对应位置处的数据存入PC中,然后去此地址处进行取指。简而言之,在ARM Cortex-M/R的中断向量表中不应该放置跳转指令,而是该放置 ISR 程序的入口地址。另外还有两个细节问题需要注意: - 0x00000000 处存放的 MSP 初始值最低三位需要是 0;
- 0x00000004 处存放的地址最低位必须是 1。
' j! R& s8 [8 k
第一条是因为在ARM上编程,但凡涉及到调用,就需要遵循一套规约AAPCS ——《Procedure Call Standard for the ARM Architecture》。AAPCS 中对栈使用的约定是这样的: 5.2.1.1
" c% B8 G7 b, [4 X7 M, KUniversal stack constraints
, q4 R; w6 I. A N( xAt all times the following basic constraints must hold:
! ^+ [% }2 X1 o* u; wStack-limit < SP <= stack-base. The stack pointer must lie within the extent of the stack.. {1 g) p# T0 F
SP mod 4 = 0. The stack must at all times be aligned to a word boundary.. h# y3 G1 p8 y( P8 P7 a6 B+ q
5.2.1.2
# n+ Z, j2 E9 @, ?Stack constraints at a public inteRFace
. t4 [8 S; i* W: U, O2 CThe stack must also conform to the following constraint at a public interface:
7 M Z1 E: ~$ x; P9 m3 \SP mod 8 = 0. The stack must be double-word aligned.
简而言之,规约规定栈任何时候都必须 4 字节对齐,在调用入口需8字节对齐,而且 SP 的最低两位在硬件上就被置为 0 了。
; Y) x7 R: Y. V2 }) K 第二条与 ARM 模式与 Thumb 模式有关。ARM 中 PC 中的地址必须是 32 位对齐的,其最低两位也被硬件上置 0 了,故写入PC 中的数据最低两位并不代表真实的取址地址。ARM中使用最低一位来判断这条指令是 ARM 指令还是 Thumb 指令,若最低位为 0,代表 ARM 指令;若最低位为 1,代表 Thumb 指令。在 Cortex-M/R 内核中,并不支持 ARM 模式,若强行切换到 ARM 模式会引发一个 Hard Fault。
) e; K0 ?' A0 X5 D/ O |