arm cortex-m 架构简述

1. cortex-m 处理器的体系架构与指令集

本文仅讨论 cortex-m0/m0+/m3/m4/m7 armv8架构暂不讨论

  • cortex-m0/m0+/m1 基于ARMv6-M架构
  • cortex-m3基于ARMv7-M架构(ARMv7-Mcortex-m3处理器一起发布)
  • cortex-m4/m7基于ARMv7E-M架构(ARMv7-Mcortex-m4处理器一起发布)
    在这里插入图片描述
  • corte-m处理器都支持Thumb-2指令集(既支持16位指令,也支持32位指令)。
  • 上图是ARMv6-M,ARMv7-M,ARMv7E-M所有指令,上图也能看出所支持指令的长度。
  • cortex-m1处理器一般用于FPGA,针对FPGA进行了优化

2. cortex-m内核寄存器

2.1 cortex-m0, cortex-m0+寄存器

在这里插入图片描述

2.2 cortex-m3, cortex-m4, cortex-m7 寄存器

在这里插入图片描述

2.3 PRIMASK、FAULTMASK和BASEPRI寄存器

  • PRIMASK寄存器有1个bit生效,可屏蔽所有 可配置优先级的异常 ,即屏蔽除 Reset(-3), NMI(-2), HardFault(-2) 外的所有中断。
  • FAULTMASK寄存器有1个bit生效,屏蔽除 Reset(-3), NMI(-2) 外的所有中断。
  • BASEPRI:可屏蔽优先级 小于或等于 BASEPRI配置值的中断或异常。BASEPRI位宽是可配置的(微控制器设计厂商可配置,非软件可配置),一般是3bit4bit
    在这里插入图片描述

2.4 SP寄存器

SP寄存器在物理实现上有两个,分别是MSPPSP,通过SP这个名字访问的可能是不同的物理存储,当然也可以直接在汇编中使用MSPPSP

  • MSP:Main Stack Pointer(主栈指针),Handler mode(处理异常或中断)使用MSP,Thread mode可以选择使用MSPPSP(通过CONTROL寄存器选择)
  • PSP:Process Stack Pointer(线程栈指针),在Thread mode下可由CONTROL寄存器配置使用PSP.

3. PSR 寄存器

因为支持的指令不同,所以不同处理器的PSR寄存器会略有不同

3.1 cortex-m0, cortex-m0+(ARMv6-M)

在这里插入图片描述

3.2 cortex-m3(ARMv7-M)

在这里插入图片描述

3.3 cortex-m4,cortex-m7(ARMv7E-M)

在这里插入图片描述

  • GE[3:0]:大于或等于标志
  • ICI:Interruptible-continuable instruction(中断继续指令),如LDM指令,STM指令均需要多个时钟周期,且是可被中断的, ICI只要作用是记录中断位置。
  • IT:用于If-Then指令(IT指令,在此处暂不展开讨论IT指令)。
  • T:指示处于ARM状态还是Thumb状态,cortex-m处理器只支持Thumb状态,所以此位一直为1。

3.4 ISR_NUMBER

  • cortex-m0/m0+的ISR_NUMBER
    在这里插入图片描述

  • cortex-m3/m4/m7的ISR_NUMBER
    在这里插入图片描述

  • 总结

    • cortex-m3/m4/m7相比cortex-m0/m0+ 增加了如下异常

      • MemManage
      • BusFault
      • UsageFault
      • Reserved for Debug
    • cortex-m3/m4/m7相比cortex-m0/m0+ IRQ中断数量由32个扩展到了240个
    • systickcortex-m0/m0+ 中是可选实现的,systickcortex-m3/m4/m7中是必须实现的。

4. cortex-m处理器模式与特权级

4.1 cortex-m处理器特权级

cortex-m处理器分为两个特权级:

  • Unprivileged(非特权级)

    • 不能使用MRS,MSR,CPS(开关中断) 指令。
    • 不能访问systick、NVIC、SCB等
    • 对MPU保护的资源访问受限

    注:cortex-m0不支持非特权模式(CONTROL没有对应的配置位)。cortex-m0+ 可选的支持非特权模式。cortex-m3/m4/m7强制支持非特权模式。

  • Privileged(特权):

    • 所有指令,所有资源均可访问。

4.2 cortex-m0/m0+处理器寄存器访问的特权级

  • cortex-m0只支持特权级(不支持非特权级),所有的寄存器都只能在特权级下访问。
  • cortex-m0+可已选择支持特权级,也可以选择不支持特权级。
    在这里插入图片描述

    <<DUI0662B_cortex_m0p_r0p1_dgug>> 文档中并没有对各个寄存器中访问的特权级进行描述,欢迎大家补充,或后续我找一下其他资料或实测一下再补充。

4.3 cortex-m3/m4/m7处理器寄存器访问的特权级

  • cortex-m3/m4 存器访问的特权级
    在这里插入图片描述
  • cortex-m7 存器访问的特权级
    在这里插入图片描述
  • 由上面两个表可以看出cortex-m7cortext-m3/m4 仅在 MSP的访问权限上存在区别。

4.4 cortex-m处理器模式

  • Thread mode:线程模式(没有进行中断处理)

    • 可配置特权模式或者非特权模式CONTROL寄存器配置,。
    • 可配置使用MSP或者PSP,CONTROL寄存器配置。

    注:在Thread mode下,cortex-m0只支持特权模式(CONTROL寄存器没有相关的配置位),cortex-m0+可选支持非特权模式,cortex-m3/m4/m7既支持特权模式,也支持非特权模式。

  • Handler mode:处理模式

    • 一定处于特权模式
    • 使用MSP

4.5 cortex-m处理器模式和特权级切换简析

  • 下表是寄存器的初始值,通过寄存器的初始值我们可以得出很多结论
    在这里插入图片描述

4.5.1 CONTROL寄存器的初始值

CONTROL寄存器的初始值为全0,我们可以得出如下结论:

  • 针对cortex-m0cortex-m0+(不支持非特权级) ,表征在初始状态下使用MSP
  • 针对cortex-m0+(支持非特权级)/m4/m7,表征在初始状态下使用MSP且处于特权模式

    cortex-m4/m7在 CONTROL寄存器中增加了FPCA位用于指示中断发生时上下文中有没有浮点运算,用于指示中断发生时的硬件压栈,这与cortex-m的异常处理有关,在此暂不展开,后续会专门写一篇文章来分析cortex-m的异常处理

4.5.2 PSR寄存器的初始值

  • PSR寄存器的初始为0x01000000, 即T位为1表示处于thumb状态(cortex-m只支持Thumb状态),ISR_NUMBER 为零表示处于Thread mode

4.5.3 PRIMASK,FAULTMASK,BASEPRI寄存器的初始值

PRIMASK,FAULTMASK,BASEPRI寄存器的初始值都为0,便是不屏蔽任何中断。

4.5.4 MSP PSP PC寄存器的初始值

初始状态下栈指针使用MSP , 不关心PSP的初始值,MSP PC寄存器的初始值比较特殊,上电或复位后,硬件会将向量表中的第一个字放入MSP中,将向量表中的第二个字放入PC中,又因为复位状态下VTOR 寄存器的初始值为0,所以硬件会到0地址处找向量表,软件要保证0地址出有向量表。

4.5.5 LR寄存器的初始值

LR寄存器的初始值是0xFFFFFFFF,这是一个非法值,函数调用不会在这里返回。

4.5.6 总结

结合通过上述描述,我画了一张图描述状态和特权级的切换,比较好理解,便不过多赘述。
在这里插入图片描述

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>