前两周,我们相继介绍了Cortex-M3的发展近况,也了解了其相关技术背景。而作为一名初学者,在ARM的学习中,会遇到大量的或熟悉或陌生的名词缩写,有效的理解并记忆它们十分有利于我们的学习。下面,是我们大致做的一些总结:
AHB 先进高性能总线
AHB‐AP AHB访问端口
AMBA 先进单片机总线架构
APB 先进外设总线
ARM ARM ARM架构参考手册
ASIC 行业领域专用集成电路
ATB 先进跟踪总线
BE8 字节不变式大端模式
CPI 每条指令的周期数
CPU 中央处理单元
DAP 调试访问端口
DSP 数字信号处理器/数字信号处理
DWT 数据观察点及跟踪
ETM 嵌入式跟踪宏单元
FPB 闪存地址重载及断点
FSR Fault状态寄存器
HTM CoreSight AHB跟踪宏单元
ICE 在线仿真器
IDE 集成开发环境
IRQ 中断请求(通常是指外部中断的请求)
ISA 指令系统架构
ISR 中断服务例程
ITM 指令跟踪宏单元
JTAG 连结点测试行动组(一个关于测试和调试接口的标准)
JTAG‐DP JTAG调试端口
LR 连接寄存器
LSB 最低有效位
LSU 加载/存储单元
MCU 微控制器单元(俗称单片机)
MMU 存储器管理单元
MPU 存储器保护单元
MSB 最高有效位
MSP 主堆栈指针
NMI 不可屏蔽中断
NVIC 嵌套向量中断控制器
OS 操作系统
PC 程序计数器
PSP 进程堆栈指针
PPB 私有外设总线
接下来,请随我来了解一下Cortex-M3的寄存器组
Cortex‐M3处理器拥有R0‐R15的寄存器组。其中R13作为堆栈指针SP。SP有两个,但在同一时刻只能有一个可以看到,这也就是所谓的“banked”寄存器。
1. R0-R12:通用寄存器
R0‐R12都是32位通用寄存器,用于数据操作。但是注意:绝大多数16位Thumb指令只能访问R0‐R7,而32位Thumb‐2指令可以访问所有寄存器。
2. Banked R13: 两个堆栈指针
Cortex‐M3拥有两个堆栈指针,然而它们是banked,因此任一时刻只能使用其中的一个。主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)进程堆栈指针(PSP):由用户的应用程序代码使用。堆栈指针的最低两位永远是0,这意味着堆栈总是4字节对齐的。
在ARM编程领域中,凡是打断程序顺序执行的事件,都被称为异常(exception)。除了外部中断外,当有指令执行了“非法操作”,或者访问被禁的内存区间,因各种错误产生的fault,以及不可屏蔽中断发生时,都会打断程序的执行,这些情况统称为异常。在不严格的上下文中,异常与中断也可以混用。另外,程序代码也可以主动请求进入异常状态的(常用于系统调用)。
3. R14:连接寄存器
当呼叫一个子程序时,由R14存储返回地址 不像大多数其它处理器,ARM为了减少访问内存的次数(访问内存的操作往往要3个以上指令周期,带MMU和cache的就更加不确定了),把返回地址直接存储在寄存器中。这样足以使很多只有1级子程序调用的代码无需访问内存(堆栈内存),从而提高了子程序调用的效率。如果多于1级,则需要把前一级的R14值压到堆栈里。在ARM上编程时,应尽量只使用寄存器保存中间结果,迫不得以时才访问内存。在RISC处理器中,为了强调访内操作越过了处理器的界线,并且带来了对性能的不利影响,给它取了一个专业的术语:溅出。
4. R15:程序计数寄存器
指向当前的程序地址。如果修改它的值,就能改变程序的执行流(很多高级技巧就在这里面——译注)。
5. 特殊功能寄存器
Cortex‐M3还在内核水平上搭载了若干特殊功能寄存器,包括
程序状态字寄存器组(PSRs)
中断屏蔽寄存器组(PRIMASK,FAULTMASK, BASEPRI)
控制寄存器(CONTROL)