前言
Cortex-M3/M4架构都是基于ARMv7-M架构。在一般应用中使用Cortex-M微控制器无需了解架构的详细内容,只需要对编程模型、异常处理、存储器映射、外设以及软件驱动库即可。
操作模式和状态
M3/M4处理器有两种操作状态和两个模式,同时处理器还分为特权和非特权模式。非特权模式意味着有些存储器区域是无法访问的(用户状态);
操作状态:1.调试状态:处理器被暂停时会进入调试状态,停止指令执行;
2.Thumb状态:执行指令时的状态;
操作模式:1.处理模式:执行中断服务程序等异常处理,在此模式下处理器具有特权访问等级;
2.线程模式:执行普通的程序代码。
软件可以将处理器从特权模式切换为非特权模式,但需要借助异常机制才能从非特权模式切换为特权模式;
NVIC寄存器只支持特权访问,线程模式使用特殊的影子栈寄存器SP使得应用任务的栈空间和OS内核相互独立。
寄存器
处理器内核中有多个执行数据处理和控制的寄存器,大多以寄存器组的形式进行分组。
对于ARM架构,若处理的是存储器中的数据就需要将其从存储器加载到寄存器组的寄存器里。在处理器内处理完后若有必要还要写回寄存器,这就是“加载—存储架构”。
Cortex-M3/M4寄存器组中有16个寄存器,其中13个为32位通用寄存器,3个特殊用途,如图所示;
R13栈寄存器SP:可以通过PUSH和POP实现对栈存储的访问,物理上存在两个栈指针:
1.主栈指针MSP:默认的栈指针,处理模式时使用;
2.进程栈指针PSP:只能用于线程模式;
大多数情况下,若应用不需要嵌入式OS,PSP也没必要使用,若使用PSP则内核和应用程序栈相互独立,栈指针的选择由特殊寄存器CONTROL决定;
R14链接寄存器LR:用于函数或子程序调用时返回地址的保存。在函数或子程序结束时,程序控制可以通过将LR的数值加载计数器PC中返回调用程序处继续执行。
在异常处理期间,LR也会自动更新为EXC_RETURN(异常返回)数值;
R15,程序计数器PC:可读可写,写操作会引起跳转,读操作会返回当前指令地址加4;
多数情况下,跳转和调用会由专门的指令实现,利用数据处理指令更新PC的情况较少,但是在访问位于程序存储器的字符数据时PC的数值非常有用;
特殊寄存器
除了寄存器组的寄存器外,还存在一些特殊寄存器。如图所示:
这些寄存器表示处理器状态、定义了操作状态和中断/异常屏蔽,在开发嵌入式OS/高级中断屏蔽时一般需要访问。
特殊寄存器未经过寄存器映射,可以使用MSR/MRS等寄存器访问指令进行访问。
1.程序状态寄存器
包括三个状态寄存器:应用APSR、执行EPSR、中断IPSR
对于ARM汇编器,在访问时用的是PSR:MRS PSR, r0,也可以单独访问每个PSR:MRS r0,IPSR,下图为程序状态寄存器的位域;
2.PRIMASK、FAULTMASK、BASEPRI寄存器
用于异常或中断屏蔽,每个中断/异常都具有优先等级,数值小的优先级高,反之优先级低。
特殊寄存器基于优先级屏蔽异常,默认全为0,也就是屏蔽不起作用;
PRIMASK寄存器是1位的中断屏蔽寄存器,为1时会阻止不可屏蔽异常和HardFault外的所有异常,实际上,它是将当前异常优先级提升为0(最高优先级);
FAULTMASK寄存器类似于PRIMASK寄存器,但是它还能屏蔽HardFault异常,实际上将异常优先级提高到了-1。在异常返回时会自动清除。
BASEPRI寄存器会根据优先级屏蔽异常或中断。寄存器宽度决定于优先级数量;
3.CONTROL寄存器
CONTROL寄存器定义了1.栈指针的选择;2.线程模式的访问等级(特权/非特权);
对于Cortex-M4还包括一位是否使用浮点单元。
CONTROL只能在特权模式下进行修改,可以在任意模式进行读操作;
默认寄存器状态为0,也就是线程模式、特权等级、主栈指针;
浮点寄存器
Cortex-M4具有可选的浮点单元,其提供了浮点数据处理的一些寄存器、浮点状态和控制寄存器(FPSCR),如图所示:
除了这些寄存器外,浮点单元还引入了一些经过存储器映射的寄存器,如CPACR,用于使能/禁止浮点单元的协处理器访问控制寄存器。