Cortex‐M3内核学习笔记(一):概览

一、寄存器组

R0-R12:通用寄存器

R0‐R12 都是 32 位通用寄存器,用于数据操作。但是注意:绝大多数 16 位 Thumb 指令只能访问 R0‐R7,而 32 位 Thumb‐2 指令可以访问所有寄存器。

R13: 两个堆栈指针

Cortex‐M3 拥有两个堆栈指针,然而它们是 banked,因此任一时刻只能使用其中的一个。

●主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)

● 进程堆栈指针(PSP):由用户的应用程序代码使用。

R14:连接寄存器

不像大多数其它处理器, ARM 为了减少访问内存的次数(访问内存的操作往往要 3 个以上指令周期,带 MMU和 cache 的就更加不确定了),把返回地址直接存储在寄存器中。这样足以使很多只有 1 级子程序调用的代码无需访问内存(堆栈内存),从而提高了子程序调用的效率。

R15:程序计数寄存器

指向当前的程序地址。如果修改它的值,就能改变程序的执行流。

特殊功能寄存器

Cortex‐M3 还在内核水平上搭载了若干特殊功能寄存器,包括以下三种:

● 程序状态字寄存器组(PSRs);

● 中断屏蔽寄存器组(PRIMASK, FAULTMASK, BASEPRI);

● 控制寄存器(CONTROL)。

二、操作模式和特权极别

Cortex‐M3 处理器支持两种处理器的操作模式,还支持两级特权操作。

两种操作模式分别为: 处理者模式(handler mode)和线程模式(thread mode)。引入两个模式的本意,是用于区别普通应用程序的代码和异常服务例程的代码——包括中断服务例程的代码。

Cortex‐M3 的另一个侧面则是特权的分级——特权级用户级。这可以提供一种存储器访问的保护机制,使得普通的用户程序代码不能意外地,甚至是恶意地执行涉及到要害的操作。处理器支持两种特权级,这也是一个基本的安全模型。

Cortex‐M3内核学习笔记(一):概览

在 CM3线程模式,既可以使用特权级,也可以使用用户级;但是异常服务例程必须在特权级下执行。复位后,处理器默认进入线程模式,特权极访问。在特权级下,程序可以访问所有范围的存储器,并且可以执行所有指令。

特权级与用户级切换

从特权级进入用户级通过修改CONTROL寄存器,一旦切换到用户级,就不能随便切换到特权级。必须执行一条系统调用指令(SVC)。这会触发 SVC 异常,然后由异常服务例程(通常是操作系统的一部分)接管,如果批准了进入,则异常服务例程修改CONTROL寄存器,才能在用户级的线程模式下重新进入特权级。

用户级到特权级的唯一途径就是异常:如果在程序执行过程中触发了一个异常,处理器总是先切换入特权级,并且在异常服务例程执行完毕退出时,返回先前的状态。

Cortex‐M3内核学习笔记(一):概览

三、嵌套向量中断控制器

Cortex‐M3 在内核水平上搭载了一颗中断控制器——嵌套向量中断控制器 NVIC(Nested Vectored
Interrupt Controller)NVIC 提供如下的功能:

●可嵌套中断支持

●向量中断支持

●动态优先级调整支持

●中断延迟大大缩短

●中断可屏蔽

可嵌套中断支持

可嵌套中断支持的作用范围很广,覆盖了所有的外部中断和绝大多数系统异常。外在表现是,这些异常都可以被赋予不同的优先级。当前优先级被存储在 xPSR 的专用字段中。当一个异常发生时,硬件会自动比较该异常的优先级是否比当前的异常优先级更高。如果发现来了更高优先级的异常,处理器就会中断当前的中断服务例程,而服务新来的异常——即立即抢占。

向量中断支持

当开始响应一个中断后, CM3 会自动定位一张向量表,并且根据中断号从表中找出 ISR 的入口地址,然后跳转过去执行。

动态优先级调整支持

软件可以在运行时期更改中断的优先级。

中断延迟大大缩短

Cortex‐M3 为了缩短中断延迟,引入了好几个新特性。包括自动的现场保护和恢复,以及其它的措施,用于缩短中断嵌套时的 ISR 间延迟。

四、存储器映射

总体来说, Cortex‐M3支持4GB存储空间,如图下图所示地被划分成若干区域。

Cortex‐M3内核学习笔记(一):概览

五、总线接口

Cortex‐M3内部有若干个总线接口,以使CM3能同时取址和访内(访问内存),它们是:

●指令存储区总线(两条)

●系统总线

●私有外设总线

有两条代码存储区总线负责对代码存储区的访问,分别是 I‐Code 总线和 D‐Code 总线。前者用于取指,后者用于查表等操作,它们按最佳执行速度进行优化。

系统总线用于访问内存和外设,覆盖的区域包括 SRAM,片上外设,片外 RAM,片外扩展设备,以及系统级存储区的部分空间。

六、存储器保护单元(MPU)

Cortex‐M3有一个可选的存储器保护单元。配上它之后,就可以对特权级访问和用户级访问分别施加不同的访问限制。当检测到violated时,MPU就会产生一个fault异常,可以由fault异常的服务例程来分析该错误,并且在可能时改正它。

七、中断和异常

CM3 的所有中断机制都由 NVIC 实现。除了支持 240 条中断之外, NVIC 还支持 16‐4‐1=11 个内部异常源,可以实现fault管理机制。结果,CM3 就有了 256 个预定义的异常类型,异常类型如下:

Cortex‐M3内核学习笔记(一):概览

虽然 CM3 是支持 240 个外中断的,但具体使用了多少个是由芯片生产商决定。 CM3 还有一个NMI(不可屏蔽中断)输入脚。当它被置为有效(assert)时, NMI 服务例程会无条件地执行。

7.1先进的中断处理功能

●内建的嵌套向量中断控制器支持多达 240 条外部中断输入。中断的嵌套也是在硬件水平上实现的,不需要软件代码来实现。

●Cortex‐M3 在进入异常服务例程时,自动压栈了 R0‐R3, R12, LR, PSR 和 PC,并且在返回时自
动弹出它们,既加速了中断的响应,也再不需要汇编语言代码。

●NVIC 支持对每一路中断设置不同的优先级,使得中断管理极富弹性。

●有些需要较多周期才能执行完的指令,是可以被中断-继续的——就好比它们是一串指令一样。这些指令包括加载多个寄存器(LDM),存储多个寄存器(STM),多个寄存器参与的 PUSH,以及多个寄存器参与的 POP。

●除非系统被彻底地锁定, NMI(不可屏蔽中断)会在收到请求的第一时间予以响应。对于很多安全‐关键(safety‐critical)的应用, NMI 都是必不可少的。

参考文献

Cortex-M3权威指南