本文重点介绍CortexM3的架构,以及通用寄存器。
- 架构描述
Cortex-M3是一个32位处理器内核,内部的数据路径是32位的,寄存器是32位的,存储器接口也是32位的。它采用了哈佛结构,拥有独立的指令总线和数据总线,可以让取指与数据访问同时运行。
Cortex-M3内部含有多条总线接口,每条都为自己的应用场合优化过,并且它们可以并行工作。指令总线和数据总线共享同一个存储器空间(一个统一的存储器系统),而不是因为有两条总线,可寻址空间就变成8GB了。为实现这个特性,于是Cortex-M3内部设计了多条总线接口。
同时,Cortex-M3内部还附赠了好多调试组件,用于在硬件水平上支持调试操作,如指令断点,数据观察点等。另外,为支持更高级的调试,还有其它可选组件,包括指令跟踪和多种类型的调试接口。
以下是一张比较经典的CM3内部架构图,从图中我们能看出,Arm只设计了内核和调试部分,以及内核对外的总线接口。芯片公司则将一些外围接口通过总线供内核访问。

- 寄存器描述

R0-R12(通用寄存器):这些寄存器可用于存储任意数据,R0是特殊寄存器,通常被用作子函数的返回值,R1-R3可以用于存储函数参数。这部分又分高低两部分,R0 – R7为低组寄存器,能被16位指令访问;R8 – R12为高组寄存器,只能被32位指令和少量16位指令访问。
R13(SP堆栈指针):指定当前栈的顶部位置。在Cortex-M3中,堆栈用于存储函数调用和中断服务例程(ISR)的上下文。SP也用于在函数返回时恢复调用者寄存器的值。SP略有特殊,跟CPU模式有关,如果当前模式为特权模式,那么R13放的是主堆栈指针;如果模式是进程则R13中放的是进程对战指针。
R14(LR链接寄存器):用于存储函数返回地址。当一个函数调用另一个函数时,被调用函数的返回地址被存储在LR中,以便在函数返回时使用。
R15(PC程序计数器):包含当前执行的指令地址。当微控制器执行一条指令时,PC会自动增加一个指令的长度,以便指向下一条指令。
- HardFault
当程序产生异常或中断时,CM3硬件会进行压栈操作,会依次将xPSR, PC, LR, R12以及R3‐R0由硬件自动压入适当的堆栈中。这个操作是硬件完成的。所以在排查hardfault问题时,首先在hardfault异常中断处理中打个断点,程序运行到断点时,打开堆栈view,或者通过CPU寄存器的堆栈地址,定位到memory view中的位置,然后往回推第6个值LR即跳转前出错函数的地址。