内核、指令集和架构:【3】M0和M3

指令集确实是与内核紧密对应的,不同的内核通常对应着不同的指令集或指令集扩展。 ARM Cortex-M系列的内核(M0, M0+, M3, M4, M7, M23, M33, M55等)都基于ARMv6-MARMv7-MARMv8-M架构,它们共享核心的32位RISC设计理念和Thumb/Thumb-2指令集基础,但在支持的指令子集、性能、功能和扩展方面存在显著差异。

Cortex-M3 与 Cortex-M0/M0+ 的核心区别与指令集差异:

  1. 架构版本与目标市场:

    • Cortex-M0/M0+: 基于 ARMv6-M 架构。设计目标是极致的面积和功耗优化,提供最小的硅片面积和最低的功耗,适用于成本敏感、电池驱动的超低功耗应用(如简单传感器、可穿戴设备、小型家电、基础控制)。
    • Cortex-M3: 基于 ARMv7-M 架构。设计目标是性能、能效和功能的平衡,在提供显著高于M0性能的同时,保持较好的功耗控制,适用于需要更复杂处理能力、实时控制、连接性的应用(如工业控制、电机驱动、网络设备、消费电子主控)。
  2. 指令集差异(核心区别):

    • 共同基础:Thumb-2 技术
      • 两者都支持 Thumb-2 指令集技术。这是ARM的一项革命性技术,将传统的16位Thumb指令集(代码密度高)和32位ARM指令集(性能高)融合在一起。
      • 编译器可以混合生成16位和32位指令,在保持接近Thumb代码密度的同时,提供接近传统ARM指令集的性能。这是所有Cortex-M内核高性能、高效率的关键。
    • 主要差异:M3 支持的指令更丰富、更强大
      • 硬件整数除法: 这是最显著的指令差异之一。
        • M0/M0+: 支持硬件除法指令 (UDIV, SDIV)。除法操作需要通过软件库(通常是编译器提供的运行时库)进行模拟,这可能需要数十甚至上百个时钟周期,非常耗时。
        • M3: 支持硬件整数除法指令 (UDIV, SDIV)。大多数除法操作可以在 2-12个周期内完成(取决于操作数),性能提升巨大,对涉及除法的算法(如控制、数据处理)非常有利。
      • 位带操作:
        • M0/M0+: 支持硬件位带特性。修改内存或外设寄存器中的单个位需要通过传统的“读-修改-写”操作(LDR -> AND/ORR/BIC -> STR),这至少需要3条指令,且不是原子操作(可能被中断打断)。
        • M3: 支持硬件位带特性。通过特殊的“位带别名区”地址,可以直接使用 STRB/LDRB 指令对单个位进行原子级的读写操作(只需1条指令)。这极大地简化了位操作,提高了效率和可靠性(对控制寄存器、状态标志操作尤其重要)。
      • Thumb-2 指令范围:
        • M0/M0+: 仅支持 ARMv6-M 定义的 Thumb-2 子集。这个子集主要包含16位Thumb指令和少量最常用的32位Thumb-2指令(如 BL, DSB, ISB, MRS, MSR 等)。它缺乏许多更强大的32位数据处理和控制指令。
        • M3: 支持完整的 ARMv7-M Thumb-2 指令集。它包含了丰富得多的32位指令,例如:
          • 更强大的桶形移位操作集成在数据处理指令中。
          • 更灵活的 MOV, MOVT 用于加载大常数。
          • 条件执行指令(IT 块)支持更复杂的条件分支结构。
          • 更多用于内存屏障、系统控制、协处理器访问的指令。
          • 更丰富的乘法累加指令(如 MLA, MLS)。
          • 饱和运算指令(SSAT, USAT)用于DSP。
          • 排它访问指令(LDREX, STREX)用于信号量和原子操作(虽然M0+后来也支持了)。
        • 总结指令集差异: Cortex-M3 支持一个比 Cortex-M0/M0+ 更庞大、功能更强大的 Thumb-2 指令子集。M0/M0+的指令集是M3指令集的一个严格子集(除了M0+新增的硬件除法)。这意味着所有在M0/M0+上能运行的机器码,在M3上也能运行(二进制兼容),反之则不成立(M3程序用了M0不支持的指令就无法在M0上运行)。
  3. 性能差异:

    • 主频: 在相似的工艺节点下,M3的最高运行频率通常高于M0/M0+(例如,M3可达 100MHz+,M0/M0+ 通常在 50MHz 以下,尽管也有更高频率的版本)。
    • 流水线:
      • M0: 3级流水线(取指、译码、执行)。较简单。
      • M0+: 2级流水线(取指+译码、执行)。更简单,面积功耗更优,但单周期效率可能略低于M0,总体性能与M0相当或略优(因减少了流水线气泡)。
      • M3: 3级流水线(取指、译码、执行),但设计更复杂高效,支持分支预测。这能显著减少分支指令带来的流水线停顿(刷新),尤其是在有较多if/else, switch, 循环的代码中,性能提升明显。M0/M0+没有分支预测,遇到分支指令必然导致流水线刷新和性能损失。
    • 指令执行效率: 得益于更丰富的指令集(尤其是硬件除法和更强大的数据处理指令)和分支预测,M3在执行相同算法时,通常需要更少的时钟周期,性能通常是同等频率下M0/M0+的1.5倍到数倍
  4. 中断处理能力:

    • NVIC 优先级位数:
      • M0/M0+: 通常只支持 4位 中断优先级(ARMv6-M规范允许2-8位,但厂商实现多为4位),即最多16级优先级。
      • M3: 支持 8位 中断优先级(ARMv7-M规范允许3-8位,常见实现为3-8位),即最多256级优先级,提供更精细的中断管理。
    • 中断延迟: M3的中断响应和处理通常更快(得益于更快的核心和更高效的中断压栈机制),中断延迟更低。M0+在中断响应速度上做了优化,接近甚至有时优于M3。
  5. 系统特性:

    • 内存保护单元:
      • M0/M0+: 集成MPU(可选,但厂商极少实现)。
      • M3: 集成可选的MPU(厂商通常提供)。MPU对提升系统健壮性、安全性(防止内存越界访问)和在RTOS中隔离任务非常有用。
    • 调试与跟踪:
      • M3: 通常提供更强大的调试和跟踪选项(如ETM指令跟踪需要额外硬件,但SWV数据跟踪更完善)。
    • 堆栈指针:
      • M0/M0+: 只有一个堆栈指针
      • M3:两个堆栈指针:主堆栈指针和进程堆栈指针。这对RTOS特别有用,内核模式用主堆栈,任务模式用各自的进程堆栈,提高安全性和效率。
    • 休眠模式: M0/M0+通常提供更精细的超低功耗休眠模式控制(得益于其极简设计)。
  6. 物理实现(面积与功耗):

    • M0: 最小的硅片面积(约12K门),最低的动态和静态功耗。
    • M0+: 面积比M0略大(约15K门),但功耗通常比M0更低(得益于优化的2级流水线和门控时钟技术)。
    • M3: 面积显著大于M0/M0+(约33K门),功耗也显著高于M0/M0+(但相比传统处理器仍非常高效)。

总结:

特性 Cortex-M0/M0+ (ARMv6-M) Cortex-M3 (ARMv7-M) 差异程度
指令集 Thumb-2 子集 (严格子集) 完整 Thumb-2 (包含更多32位指令)
硬件除法 (M0+) / (部分M0+) (UDIV, SDIV)
位带操作
分支预测
性能 (同频) 较低 (尤其除法、分支多时) 较高 (1.5x - 数倍)
最高主频 较低 (通常 < 50MHz) 较高 (通常 >= 100MHz)
中断优先级 少 (通常 4位/16级) 多 (通常 8位/256级)
MPU (或极少可选) (通常可选)
堆栈指针 1个 2个 (MSP, PSP)
硅片面积 最小 (M0 ~12K门, M0+ ~15K门) 较大 (~33K门)
功耗 最低 (M0+尤其静态功耗低) 较高 (但仍属超低功耗)
目标应用 超低成本、超低功耗、简单控制 性能、功能、能效平衡,复杂控制、连接性

结论:

  • 指令集差异显著: 虽然都基于Thumb-2,但Cortex-M3支持一个功能强大得多、指令数量多得多的Thumb-2子集,特别是硬件除法和位带操作是M0/M0+(除了较新的M0+)所不具备的关键指令。M3的指令集是M0/M0+的超集(二进制向下兼容)。
  • 性能差异大: M3凭借更丰富的指令、分支预测和通常更高的主频,性能远超M0/M0+。
  • 功能差异大: M3提供MPU、双堆栈指针等高级系统特性。
  • 功耗/面积差异大: M0/M0+在面积和功耗上具有绝对优势。

选择M0/M0+还是M3,取决于应用的具体需求:极致成本/功耗选M0/M0+;需要更高性能、更丰富功能选M3。M0+在M0的基础上增加了硬件除法并优化了功耗,成为了非常受欢迎的超低功耗主力。M4则在M3基础上增加了DSP扩展和可选的FPU,面向信号处理应用。

你可能感兴趣的:(arm开发,stm32)