ARM发展至今,已经设计了9代处理器构架,每一代架构又设计了不同的处理器核心。
下表并没有把全部的处理器核心列举出来,只做为参考。
从第6代开始,ARM11以后的处理器命名方式改为3个系列:
Cortex-A:面向性能密集型系统的应用处理器内核
Cortex-R:面向实时应用的高性能内核
Cortex-M:面向各类嵌入式应用的微控制器内核
目前市面上主流的微控制器主要还是Cortex-M0,M3,M4和M7。
Cortex-M33,M35等新一代微控制器内核应该还要几年才会普及开来。
目前所有Cortex-M内核的ARM官方提供的功能对比如下:
官方提供的表内容很多,但是有一些参数并没有出现在这个表里面。
因此我自己整理了一个我们平常比较关心的几个参数:
架构 | DMIPS | FPU | 硬件除法 | 中断数 | 中断优先级 | |
Cortex-M0 | ARMv6-M | 0.87/MHz | 无 | 无 | 32 | 4 |
Cortex-M0+ | ARMv6-M | 0.95/MHz | 无 | 无 | 32 | 4 |
Cortex-M3 | ARMv7-M | 1.25/MHz | 无 | 有 | 240 | 256 |
Cortex-M4 | ARMv7-M | 1.25/MHz | 单精度 | 有 | 240 | 256 |
Cortex-M7 | ARMv7-M | 2.14/MHz | 双精度 | 有 | 240 | 256 |
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寄存器。