Cortex-M系列处理器对比

ARM发展至今,已经设计了9代处理器构架,每一代架构又设计了不同的处理器核心。 下表并没有把全部的处理器核心列举出来,只做为参考。

从第6代开始,ARM11以后的处理器命名方式改为3个系列:

Cortex-A:面向性能密集型系统的应用处理器内核 Cortex-R:面向实时应用的高性能内核 Cortex-M:面向各类嵌入式应用的微控制器内核

目前市面上主流的微控制器主要还是Cortex-M0,M3,M4和M7。 Cortex-M33,M35等新一代微控制器内核应该还要几年才会普及开来。


目前所有Cortex-M内核的ARM官方提供的功能对比如下:

官方提供的表内容很多,但是有一些参数并没有出现在这个表里面。 因此我自己整理了一个我们平常比较关心的几个参数:

架构DMIPSFPU硬件除法中断数中断优先级
Cortex-M0ARMv6-M0.87/MHz324
Cortex-M0+ARMv6-M0.95/MHz324
Cortex-M3ARMv7-M1.25/MHz240256
Cortex-M4ARMv7-M1.25/MHz单精度240256
Cortex-M7ARMv7-M2.14/MHz双精度240256

Cortex-M3和Cortex-M4基本上只有FPU的区别,其实M4还多了一些DSP扩展指令。 Cortex-M7性能爆表,DMIPS跑分已经超过了Cortex-A8。

虽然它们之间存在这么多差异,但是向上兼容性却做的很好。 Cortex-M0向上兼容M3,M3向上兼容M4,M4向上兼容M7。 这种兼容是二进制级别的兼容,也就是说用Cortex-M0编译出来的代码,可以直接在M3运行。 只不过由于指令集的原因,不能发挥M3全部的性能。

为什么这么说呢? 因为Cortex-M0只支持Thumb基础指令集,大量16位指令,和少数几条32位指令。 其中大部分16位指令只能访问R0 - R7寄存器,比如LDR/STR。 要访问R8-R12只能使用MOV指令。

而Cortex-M3则支持Thumb2扩展指令,包含了大量的32位指令,运行效率可以极大提升。 比如LDRD指令,可以一次性读取64位数据到2个寄存器。

此外由于架构的原因,Cortex-M0不支持非4字节对齐的32位整数访问,而Cortex-M3则可以。


核心寄存器差异

Cortex-M0比后续产品,少了FAULTMASK和BASEPRI寄存器。