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套总线

  1. I-Code总线(读取指令)
  2. D-Code总线(访问数据)
  3. 系统总线

图示


四、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位的地址,而不是跳转指令。向量表的第一个条目指向复位后应执行的第一条指令

posted @ 2019-03-31 16:11  盼归汀  阅读(5976)  评论(1编辑  收藏  举报