Cortex-M4内核知识点总结余明目录Cortex-M4内核知识点总结 (1)1 ARM处理器简介 (4)2 架构 (5)2.1架构简介 (5)2.2编程模型 (5)2.3存储器系统 (8)2.4复位和复位流程 (12)3 指令集 (14)3.1 CM4指令集特点 (14)3.2 Cortex-M处理器间的指令集比较 (14)3.3 汇编指令简要介绍 (14)3.3.1 处理器内传送数据 (14)3.3.2 存储器访问指令 (15)3.3.3 算数运算 (16)3.3.4 逻辑运算 (17)3.3.5 移位 (17)3.3.6 异常相关指令 (17)4 存储器系统 (18)4.1 存储器外设 (18)4.2 Bootloader (18)4.3位段操作 (19)4.4 存储器大小端 (19)5 异常和中断 (21)5.1 中断简介 (21)5.2异常类型 (21)5.3 中断管理 (22)5.4 异常或中断屏蔽寄存器 (23)5.4.1 PRIMASK (23)5.4.2 FAULMASK (M0中无) (23)5.4.3 BASEPRI(M0中无) (23)5.5 中断状态及中断行为 (23)5.5.1 中断状态 (23)5.5.2 中断行为 (24)5.6 各Cortex-M处理器NVIC差异 (26)6 异常处理 (28)6.1 C实现的异常处理 (28)6.2 栈帧 (28)6.3 EXC_RETURN (29)6.4异常流程 (30)6.4.1 异常进入和压栈 (30)6.4.2 异常返回和出栈 (31)7 低功耗和系统控制特性 (32)7.1 低功耗模式 (32)7.1 SysTick定时器 (32)8 OS支持特性 (34)8.1 OS支持特性简介 (34)8.2 SVC和PendSV (34)8.3 实际的上下文切换 (35)1 ARM处理器简介ARM处理器的种类很多,从手机上的高端处理器芯片到面向微控制器的芯片,都有ARM的身影。
2011年基于ARM处理器的芯片的出货量已经到达79亿。
这一章首先对ARM处理器有个简单的了解。
在早期的时候,ARM处理器使用后缀表明特性。
例如ARM7TDMI,T表示支持Thumb指令,D表示JTAG,M表示快速乘法器,I则表示嵌入式ICE模块。
近几年,ARM改变处理器的命名方式,统一使用了Cortex处理器的名称。
Cortex处理器下分为三类:·Cortex-A系列:需要处理高端嵌入式系统等复杂应用的应用处理器·Cortex-R系列:实时、高性能的处理器,面向较高端的实时市场·Cortex-M系列:面向微控制器和混合信号设计等小型应用,注重低成本、低功耗。
不同系列的处理器使用不同版本的架构在Cortex-M系列中,进一步都处理器进行了划分2 架构2.1架构简介Cortex-M3和Cortex-M4处理器都是基于ARMv7-M架构。
最初ARMv-7M 架构是随着Cortex-M3处理器一同引进的,而在Cortex-M4发布时,架构中又额外增加了新的指令和特性,改进后的架构有时也被称为ARMv7E-M。
2.2编程模型2.2.1操作模式和状态Cortex-M4处理器包括两种操作状态和模式,还有两种访问等级。
1.操作状态·调试状态:处理器被暂停后,就会进入调试状态,比如利用调试器触发断点,单步执行等。
·Thumb状态:处理器执行程序代码,它就是处在Thumb状态,因为Cortex-M4用的是Thumb指令,所以称为Thumb状态,并且在Cortex-M 处理器中已经不支持ARM指令,也就不存在ARM状态。
2.操作模式·处理模式:执行中断服务程序等异常处理。
在处理模式下,处理器总是具有特权访问等级。
·线程模式:执行普通的程序代码。
3.访问等级·特权访问等级:可以访问处理器中的所有资源。
·非特权访问等级:有些存储器区域无法访问,有些操作也无法使用。
访问等级有特殊寄存器CONTROL 控制。
软件可将处理器从特权访问等级转换至非特权访问等级,但反之无法直接转换,需要借助异常机制。
处理器的操作模式和状态可由图1.1来表示,在上电后,默认处于特权线程模式下的Thumb 状态。
2.2.2 寄存器对于ARM 架构来讲,处理存储器中的数据时,需将其从存储器加载到寄存器中,处理完毕后,若有必要,还可以再写回存储器。
这种方式被称作“加载-存储架构”(LOAD -STORE)。
Cortex -M4处理器的寄存器组中有16个寄存器,其中包括13个通用寄存器和3个有特殊用途的寄存器。
1 通用寄存器R0-R12R0-R7被称作低寄存器,许多16位指令只能访问低寄存器。
R8-R12称作高寄存器,可用32位指令和几个16位指令访问。
R0-R12初始值未定义。
2 栈指针R13R13为栈指针,可通过PUSH 和POP 操作实现栈存储的访问。
栈指针包括两个:主栈指针MSP 和进程栈指针PSP 。
MSP 为默认指针,复位后或处理模式时只能是MSP ,而PSP 只能在线程模式使用。
栈指针的选择有CONTROL 寄存器控制。
MSP 和PSP 的最低两位必须是0,也就是栈指针的地址操作必须4字节对齐。
链接寄存器程序计数器通用寄存器3 链接寄存器(LR )R14用于函数或子程序调用时返回地址的保存,在异常中则用来保存进异常前状态信息,包括系统模式、栈指针模式等。
异常返回时参考LR中的信息返回到相应状态。
4 程序计数器(PC)R15R15为程序计数器,读操作返回当前地址加4,写操作引起跳转。
2.2.3 特殊寄存器特殊寄存器有三类:程序状态寄存器、中断/异常屏蔽寄存器、处理器控制寄存器。
1 程序状态寄存器:应用PSR(APSR)、执行PSR(EPSR)、中断PSR(IPSR)。
三个寄存器可以单独访问,也可以组合到一个寄存器中访问。
在APSR中包含N(负标志)、Z(零标志)、C(进位标志)、V(溢出标志)、Q(饱和标志)和GE(大于或等于标志,只在M4中有)。
IPSR中是中断号,只读。
EPSR中,T为表示Thumb状态,由于M4支持Thumb状态,不支持ARM状态,T位始终为1。
ICI是中断继续指令位,保存的是中断被打断时的信息。
IT指令时IF-THEN指令,用于条件执行。
2 PRIMASK、FAULTMASK、和BASEPRI寄存器:这三个寄存器只能在特权模式下使用。
PRIMASK可屏蔽除NMI和HardFault之外的所有异常。
FAULTMASK还可屏蔽HardFault。
BASEPRI可以根据设置屏蔽低优先级的中断,可控制8个或16个中断,相应的改寄存器的宽度为3位或4位。
3 CONTROL寄存器CONTROL寄存器主要有以下几项作用:·线程模式下的访问等级·指针的选择·当前代码是否使用了浮点单元分别对应了寄存器的低三位2.2.4 浮点寄存器1 S0-S31和D0-D15S0-S31都为32位寄存器,也可以D0-D15的方式成对访问,但M4不支持双精度浮点运算,只是可以传输双精度数据。
2 浮点状态和控制寄存器(FPSCR)FPSCR两个功能·提供浮点运算结果的状态信息,如负标志、进位标志等。
·定义一些浮点运算动作,如何舍入等3 经过存储器映射的浮点单元控制寄存器(CPACR)该寄存器经过了映射,也就是说需要通过通用寄存器加载进行设置,寄存器的功能是可以设置浮点单元的访问权限,拒绝访问、特权访问,全访问。
2.3存储器系统2.3.1 存储器系统特性·4GB线性地址空间·架构定义的存储器映射。
4GB的存储器空间被划分为多个区域,用于预定义的存储器和外设。
·支持大端和小端的存储器系统。
·位段访问。
·写缓冲·存储器保护单元MPU·非对齐传输支持2.3.2 存储器映射CORTEX-M处理器的4GB地址空间被分为了多个存储器区域,如图所示。
区域根据各自典型用法进行划分,他们主要用于:·程序代码访问(如CODE区域)·数据访问(如SRAM区域)·外设(如外设区域)某款芯片的存储器映射分配0x5000_00000x5010_00000x5020_00000x5021_00000x5022_00000x5050_00000x5060_00000x5070_00000x5071_00000x5090_00000x50B0_00000x50C0_00000x50D0_00000x50F0_00000x5030_00000x5023_00000x5072_00000x5061_00000x5062_00000x5073_00000x5040_0000 一般Code 放在Flash 当中,数据放在RAM 中。
数据在RAM 存放有一定的顺序,可以分为数据段,BSS 段、堆和栈区域。
· 数据段,存储在内存的底部,包含初始化的全局变量和静态变量。
·BSS段,未初始化的数据。
·堆,C函数自动分配存储器区域,例如alloc()和malloc()。
·栈,用于临时数据存储,局部变量,函数调用2.3.3 栈存储同几乎所有的处理器架构一样,Cortex-M处理器在运行时需要栈存储和栈指针R13。
ARM处理器将系统主存储器用于栈空间操作,使用PUSH指令往栈中存储数据以及POP指令从栈中提取数据。
处理器使用的是满递减的模型,栈指针是向下增长的。
处理器启动后,SP 被设置为栈存储空间的最后的位置,也就是最低位置,PUSH时,SP指针首先减小,然后将数据压入栈中。
POP的时候相反,先将当前SP所指的数据出栈,然后再修改SP,SP此时增大。
可用下面两幅图加以理解,栈中主要用于:· 存储局部变量· 异常产生时保存处理器状态(LR 、xPSR )和寄存器数值 · 函数调用时2.4复位和复位流程对于典型的Cortex -M 处理器,复位类型有三种:· 上电复位。
复位微控制器中所有部分。
· 系统复位。
只会复位处理器和外设,不包括处理的调试支持部件 · 处理器复位。
只复位处理器。
在复位后以及处理器开始执行程序前,处理器会从存储器中读出头两个字节。
第一个字表示主栈指针的初始值。
第二个字代表复位处理起始地址的复位向量。
处理器读出这两个自己后,就会将这些数值赋给MSP 和PC 。
读地址0x00000000读地址0x00000004读取复位向量表示的地址时间之前在栈存储时讲到过,Cortex -M 处理器的栈操作时基于满递减的,所以S P 的初始值应该设置在栈顶的位置。