Cortex-M3内核
1.内核工作模式即权限级别
两种操作模式分别为:处理者模式(handler mode)和线程模式(thread mode)。引入两个模式的本意,是用于区别普通应用程序的代码和异常服务例程的代码——包括中断服务例程的代码1。
Cortex-M3 的另一个侧面则是特权的分级——特权级和用户级。这可以提供一种存储器访问的保护机制,使得普通的用户程序代码不能意外地,甚至是恶意地执行涉及到要害的操作。处理器支持两种特权级,这也是一个基本的安全模型。
在 CM3 运行主应用程序时(线程模式),既可以使用特权级,也可以使用用户级;但是异常服务例程必须在特权级下执行。
2.寄存器组
2.1 通用寄存器
Cortex-M3 处理器拥有 R0-R15 的寄存器组。其中 R13 作为堆栈指针 SP。SP 有两个,但在同一时刻只能有一个可以看到,这也就是所谓的“banked”寄存器1。
- R0~R7,低组寄存器
- R8~R12,高组寄存器
- R13(SP):堆栈指针寄存器
- R14(LR):存储子程序调用的返回地址
- R15(PC):程序计数器
其中R13(SP),在 CM3 处理器内核中共有两个堆栈指针,于是也就支持两个堆栈,根据 CM3 处理器的特权级别选择使用MSP还是PSP:
- MSP:主堆栈指针
- PSP:进程堆栈指针
2.2 特殊功能寄存器
- ①算术运算单元运算标志
- ②T标志,必须置为1
- ③当前异常的序号
2.3 中断屏蔽寄存器组
PRIMASK, FAULTMASK 和 BASEPRI,这三个寄存器用于控制异常的使能和除能,具体功能如图所示,
其中PRIMASK寄存器置为1,总中断关闭。
3.存储映射
代码区:用于存放可执行代码、常量
SRAM区:用于存放堆栈、变量
基于CM3 处理器的单片机存储映射都需要遵循这个框架,仅有部分存储区域由单片机生产厂商根据其产品自定义。
4.堆栈
堆栈是一种存储器的使用模型。它由一块连续的内存和一个栈顶指针组成,用于实现“后进先出”的缓冲区。其最典型的应用,就是在数据处理前先保存寄存器的值,再在处理任务完成后从中恢复先前保护的这些值。
CM3 处理器使用的向下生长的满栈,采用双堆栈机制。
5.异常/中断处理
5.1 异常处理过程
进入异常后:
步骤一:硬件会将xPSR、PC、LR、R12,R0~R3自动压入堆栈,其他寄存器在中断服务函数中根据需要保存
步骤二:从中断向量表中取当前异常的入口地址
步骤三:执行异常与中断的处理程序
退出异常:
步骤一:执行返回指令,BX LR
步骤二:恢复先前入栈的寄存器,堆栈指针的值也需要修改回去
步骤三:从原中断发生的位置继续向下执行
5.2 PendSV异常
用于RTOS上下文切换,优先级最低,等待所有的中断执行完毕之后然后在执行,并且可被其他中断抢断;
RTOS需要执行任务切换时,软件触发PendSV异常,在中断服务函数中将寄存器压入堆栈,实现对现场保护,只要将这个任务中对应的堆栈中所保存的寄存器的值恢复,即可返回原来的任务运行。
6.指令集
Thumb-2指令集,长度可以为16、32。RTOS任务切换保存寄存器需要用到汇编进行操作。以下是需要用到的一些汇编指令。