STM_ 2、学习Cortex-M4内核结构
一、Cortex-M4采用的价格
Cortex-M4采用ARMv7-ME架构,主要特点有:
- 32位处理器,哈佛结构,三级流水线
- Thumb-2指令集,扩展的DSP指令和SIMD指令,单周期MAC
- 可选的单精度FPU,可选的MPU,可选的Debug$trace接口
- 可配置的NVIC,可配置的WIC(wakeup interrupt controller)
- 3套AHB-Lite总线接口
- 低功耗,高性能
- 与Cortex-M3内核兼容......
二、Cortex-M4流水线
Cortex-M4使用一个三级流水线,分别是取指、译码和执行
读取PC会返回当前指令地址+4,以兼容Thumb代码。 不管是执行16位指令还是32位指令, 其偏移量总是4,这保证了Thumb和Thumb-2指令之间的一致性。
内核的预取单元中有一个指令缓冲区,它允许后续的指令在执行前先在里面排队,也能在执行未对齐的32位指令时,避免流水线“断流”。
缓冲区并不会在流水线中添加额外的级数,因此不会恶化跳转导致的性能下降( penalty)
三、Cortex-M4的总线接口(简单了解)
Cortex-M4的3套总线
- I-Code总线(读取指令)
- D-Code总线(访问数据)
- 系统总线
图示
四、Cortex-M4的相关寄存器组
1、通用寄存器组
R0‐R12 是通用寄存器, 但是绝大多数的 16 位指令只能使用 R0‐R7(低组寄存器),而 32 位的 Thumb-2指令则可以访问所有通用寄存器
2、堆栈指针R13(SP)
- 主堆栈指针(MSP) ,或写作 SP_main。这是缺省的堆栈指针,它由 OS 内核、异常服务例程以及所有需要特权访问的应用程序代码来使用
- 进程堆栈指针(PSP) ,或写作 SP_process。用于常规的应用程序代码(不处于异常服用例程中时)
3、连接寄存器R14(LR)
连接寄存器用于在调用子程序时存储返回地址,如,在使用 BL指令时,自动填充 LR 的值。
4、程序计数器R15(PC)
因为 CM4 内部使用了指令流水线,读 PC 时返回的值是当前指令的地址+4。比如:0x2000: MOV R0, PC ; R0 = 0x2004
5、特殊功能寄存器组
5.1、程序状态寄存器(xPSR)
程序状态寄存器在其内部又被分为三个子状态寄存器:
- 应用程序状态寄存器( APSR)
- 中断状态寄存器( IPSR)
- 执行状态寄存器( EPSR)
5.2、中断屏蔽寄存器组
- PRIMASK,只有1个位的寄存器。当它置1时,就关掉所有可屏蔽的异常,只剩下 NMI和硬fault可以响应。它的缺省值是0,表示没有关中断。
- FAULTMASK,只有1个位的寄存器。当它置1时,只有NMI才能响应,所有其它的异常,包括中断和fault,通通闭嘴。它的缺省值也是 0,表示没有关异常。
- BASEPRI ,8位寄存器(由表达优先级的位数决定)。它定义了被屏蔽优先级的阈值。当它被设成某个值后,所有优先级号大于等于此值的中断都被关(优先级号越大,优先级越低)。但若被设成0,则不关闭任何中断,0是缺省值。
5.3、控制寄存器CONTROL
-
CONTROL[2]
- 0=FPU禁止
- 1=FPU激活
-
CONTROL[1]
-
- 0=选择主堆栈指针 MSP(复位后缺省值)
- 1=选择进程堆栈指针 PSP
- 线程模式可以使用 PSP。handler 模式下,只允许使用 MSP,所以此时不得往该位写 1。
-
CONTROL[0]
-
- 0=特权级的线程模式
- 1=用户级的线程模式
- Handler 模式永远都是特权级的。
五、Cortex-M4操作模式
Cortex-M4支持 2 个模式和两个权限等级
当处理器处在线程状态下时,既可以使用特权级,也可以使用用户级;
handler模式总是特权级的。在复位后,处理器进入线程模式+特权级
在特权级下的代码可以通过置位 CONTROL[0]来进入用户级。用户级下的代码不能再试图修改 CONTROL[0]来回到特权级。
而不管是任何原因产生了任何异常,处理器都将以特权级来运行其服务例程,异常返回后将回到产生异常之前的级别。
用户级变更为特权级的方式:用户级下的代码必须通过一个异常 handler,由那个异常 handler 来修改 CONTROL[0],才能在返回到线程模式后拿到特权级。
六、Cortex-M4复位序列
Cortex-M4内核复位后,读取下列两个32位整数的值:
- 从地址 0x0000,0000 处取出 MSP 的初始值。
- 从地址 0x0000,0004 处取出 PC 的初始值——这个值是复位向量, LSB 必须是 1。然后从这个值所对应的地址处取指。
传统的ARM 架构总是从0地址开始执行第一条指令。它们的0地址处总是一条跳转指令。在 CM4中,0地址处提供 MSP 的初始值,然后就是向量表(向量表在以后还可以被移至其它位置)。向量表中的数值是32位的地址,而不是跳转指令。向量表的第一个条目指向复位后应执行的第一条指令