EDA365电子论坛网

标题: Cortex-M/R 内核启动过程 / 程序启动流程之内核规范 [打印本页]

作者: uperrua    时间: 2020-10-21 17:13
标题: Cortex-M/R 内核启动过程 / 程序启动流程之内核规范
内核规范

  ARM Cortex-M/R 内核的复位启动过程也被称为复位序列(Reset sequence)。ARM Cortex-M/R内核的复位启动过程与其他大部分CPU不同,也与之前的ARM架构(ARM920T、ARM7TDMI等)不相同。大部分CPU复位后都是从 0x00000000 处取得第一条指令开始运行的,然而在ARM Cortex-M/R内核中并不是这样的。其复位序列为:

注意:中断向量表的位置可以改变,此处是默认情况下的设置。

  在 ARM Cortex-M/R 内核中,发生异常后,并不是去执行中断向量表中对应位置处的代码,而是将对应位置处的数据存入PC中,然后去此地址处进行取指。简而言之,在ARM Cortex-M/R的中断向量表中不应该放置跳转指令,而是该放置 ISR 程序的入口地址。另外还有两个细节问题需要注意:

  第一条是因为在ARM上编程,但凡涉及到调用,就需要遵循一套规约AAPCS ——《Procedure Call Standard for the ARM Architecture》。AAPCS 中对栈使用的约定是这样的:

5.2.1.12 D* z. ?9 o  ^9 J$ J+ y
Universal stack constraints
9 K; N/ G0 W% r/ ^( R9 EAt all times the following basic constraints must hold:
' O, h, R# P" XStack-limit < SP <= stack-base. The stack pointer must lie within the extent of the stack.
7 D/ B& q+ C5 ~6 ^9 {SP mod 4 = 0. The stack must at all times be aligned to a word boundary.
6 M# J  f& h9 V$ F4 E4 s1 w" x% h6 j5.2.1.2+ I6 ^+ g  g. U5 R# e9 I( V3 T) k/ b
Stack constraints at a public interface- Y3 {- i( b% y/ z3 @
The stack must also conform to the following constraint at a public interface:* N2 X% o' D, W$ O5 `
SP mod 8 = 0. The stack must be double-word aligned.

简而言之,规约规定栈任何时候都必须 4 字节对齐,在调用入口需8字节对齐,而且 SP 的最低两位在硬件上就被置为 0 了。
/ A8 x, |) H7 Z; N7 c3 k  第二条与 ARM 模式与 Thumb 模式有关。ARM 中 PC 中的地址必须是 32 位对齐的,其最低两位也被硬件上置 0 了,故写入PC 中的数据最低两位并不代表真实的取址地址。ARM中使用最低一位来判断这条指令是 ARM 指令还是 Thumb 指令,若最低位为 0,代表 ARM 指令;若最低位为 1,代表 Thumb 指令。在 Cortex-M/R 内核中,并不支持 ARM 模式,若强行切换到 ARM 模式会引发一个 Hard Fault。


- v9 n1 C# N: w7 t9 m. q$ l3 V/ J
作者: youOK    时间: 2020-10-21 19:09
Cortex-M/R 内核启动过程 / 程序启动流程之内核规范




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2