Cortex-M7内核外设
-
中断向量控制器 NVIC是一种嵌入式的中断控制器,它支持低延迟的中断处理。 -
系统控制模块 系统控制模块(SCB)是访问处理器的接口,它提供了包含配置,控制,报告异常信息在内的系统实现和系统控制。 -
系统定时器 一个24位的向下计数计数器,可以用作实时操作系统的节拍计时器或者普通计时器。 -
集成指令和数据缓存(可选) 指令和数据缓存提供了对频繁访问的数据和指令的快速访问,提高了系统访问内存的平均性能。 -
内存保护单元(可选) 内存保护单元通过为不同的内存区域定义访问属性提高了系统的可靠性,它提供了多达八个或者16个不同的区域,和一个可选择的预定义备份区。 -
浮点运算单元 浮点运行单元支持32位的单精度浮点运算和64位的双精度浮点运算。
Cortex-M7处理器编程者模型
程序员模型是指从编程者的角度来看,处理器提供了哪些可用的特性给编程人员,这部分除了单独的核心寄存器描述外,还包含有关处理器模式的信息和软件执行和堆栈的特权级别。
软件运行时的处理器模式和特权级
两种处理器模式:
线程模式
- 线程模式用于执行应用程序,当复位结束之后处理器就进入了线程模式。
Handler模式
软件运行时的两种特权等级:
非特权级:
- 对MRS和MSR指令(访问特殊功能寄存器)的访问受限,并且不能使用CPS指令(Change Processor State)。
- 不能访问系统定时器,NVIC,和SCB。
- 访问内存或者外设可能受到限制。
特权级:
栈
- 处理器使用的是满递减式栈,这意味着栈顶指针保存着最后一个入栈的元素的地址,当一个新的元素入栈,栈指针将递减,然后将新的值写入栈中。
- 处理器实现了两种栈,一种是主栈,另一个是进程栈,他们拥有独立的栈指针。
- 在线程模式下,控制寄存器控制着处理器使用主栈还是进程栈,而在Handler模式,始终使用主栈。
处理器模式 | 执行的程序 | 软件运行时的特权级 | 使用的栈 |
---|
Thread | 应用程序 | 特权级或者非特权级 | 主栈或者进程栈 | Handler | 异常处理 | 特权级 | 主栈 |
处理器寄存器
寄存器 | 读写属性 | 特权/非特权访问 | 复位后的值 | 描述 |
---|
R0-R12 | RW | 均可以 | 未知 | 32位的通用寄存器 | MSP | RW | 均可以 | 复位后从地址0x00000000加载MSP的初始值 (引导程序的中断向量表从0x00000000开始,前四个字节为sp初值) | 主栈指针 | PSP | RW | 均可以 | 0x00000000 | 主栈指针 | LR | RW | 均可以 | 0xFFFFFFFF | 链接寄存器 | PC | RW | 均可以 | 复位后从地址0x00000004加载复位向量的值,该值的第0位会被加载到ESSR的T位,用于决定程序是否运行于Thumb状态 | 程序计数器 | PSR | RW | 均可以 | 0x01000000 | 程序状态寄存器不是一个寄存器,它包含APSR,IPSR,EPSR | APSR | RW | 均可以 | 未知 | 应用程序状态寄存器 | IPSPR | RO | 特权 | 0x00000000 | 中断程序状态寄存器 | EPSR | RO | 特权 | 0x01000000 | 运行程序状态寄存器 | PRIMASK | RW | 特权 | 0x00000000 | 优先级掩码寄存器 | FAULTMASK | RW | 特权 | 0x00000000 | 故障掩码寄存器 | BASEPRI | RW | 特权 | 0x00000000 | 基本优先级掩码寄存器 | CONTROL | RW | 特权 | 0x00000000 | 控制寄存器 |
栈指针
在线程模式下,控制寄存器的bit[1]指示当前使用的是哪一个栈指针
链接寄存器
存储了函数调用,异常处理的返回信息,复位后值为0xFFFFFFFF
程序计数器
包含当前指令的地址,复位后从0x00000004加载复位向量的值作为初值,该值的bit[0]会被加载到运行程序状态寄存器(EPSR)的T位,表明当前程序运行在Thumb状态还是其他状态。
程序状态寄存器
程序状态寄存器是APSR,EPSR,IPSR的组合,它们之间的位域相互独立,比特位的分布如下: 这些状态寄存器可以单独访问,也可以两个或者三个寄存器组合访问,访问他们使用MSR指令和MRS指令,下面是组合访问时的寄存器名称:
应用程序状态寄存器
应用程序状态寄存器中的标识位表示了运行指令后的当前状态。
中断程序状态寄存器
- 中断程序状态寄存器中保存了当前中断服务程序的中断号,和中断向量表对应,在中断向量表0项存储的是MSP初值,第一项是复位向量,这两个都不是程序正常运行时的中断向量,下表中将0用于代表线程模式,1进行了保留,其他值和中断向量的位置一一对应。
运行程序状态寄存器
ICI域:
- 当中断发生时程序正在执行STM,LDM,PUSH,POP指令,或者FPU正在运行VSTM,VLDM,VPUSH,VPOP时会暂停该指令,然后把下一个操作数放到ICI域中,当中断执行完成之后,从ICI域中恢复操作数,继续执行该指令。
Thumb 状态:
- Cortex-M7只能在Thumb状态下运行指令,下面几种情况会把该位清零
- BLX, BX, POP{PC}
- 异常返回时从栈中恢复状态寄存器的值。
- 一个中断向量的Bit[0]或者复位。
- 当T位为0时运行指令会发生故障或者锁住。
使用MRS指令读取该寄存器直接返回0,用MSR指令写该寄存器直接忽略。
异常掩码寄存器
异常掩码寄存器用于处理器屏蔽中断或者异常,但是它会影响任务的实时性,要想修改这些寄存器的值需要通过MSR或者MRS,CPS指令修改FAULTMASK或者PRIMASK。
优先级掩码寄存器
PRIMASK的Bit[0]用于屏蔽优先级可配置的异常,也就是除了NMI和HardFault都可以屏蔽。
故障掩码寄存器
它的第0位决定了是否屏蔽除了不可屏蔽中断(NMI)之外的其他中断,通过MSR指令在特权模式下可以访问。
基本优先级掩码寄存器
当BASEPRI的值不为0时,将会屏蔽小于等于该优先级的中断。
控制寄存器
该寄存器控制着线程模式下程序运行时的特权等级和使用的栈,还可以指示当前是否处于FPU状态。
- Handler模式下始终使用MSP,因此在Handler模式下处理器会忽略对SPSEL位的写入,异常的进入和返回机制会根据EXC_RETURN的值自动更新控制寄存器的值。
- 在带操作系统的环境下,作者建议在线程模式下使用PSP,内核和异常处理使用MSP。
- 默认情况下,线程模式下使用的是MSP,如果想切换成PSP:
- 可以使用MSR指令修改SPSEL位为1
- 执行一个异常处理然后使用一个适当的EXC_RETURN进行返回。
- 当切换栈指针之后必须使用ISB指令刷新流水线,以保证在ISB之后执行的指令都使用新的栈。
|