ARM Cortex-M 处理器家族发展至今(2016),已有 5 代产品,分别是 CM0/CM0+、CM1、CM3、CM4、CM7。
1.Cortex-M 兼容特性
为了能做到 Cortex-M 软件重用,ARM 公司在设计 Cortex-M 处理器时为其赋予了处理器向下兼容、软件二进制向上兼容特性。
首先看什么是二进制兼容,这个特性主要是针对软件而言,这里指的是当某软件(程序)依赖的头文件或库文件分别升级时,软件功能不受影响。要做到二进制兼容,被软件所依赖的头文件或库文件升级时必须是二进制兼容的。
那么什么又是向上兼容,向上兼容又叫向前兼容,指的是在较低版本处理器上编译的软件可以在较高版本处理器上执行。
跟向上兼容相对的另一个概念叫向下兼容,向下兼容又叫向后兼容,指的是较高版本处理器可以正确运行在较低版本处理器上编译的软件。
所以其实既可以用向上兼容,也可以用向下兼容来形容 Cortex-M 特性,只不过描述的主语不一样,我们可以说 Cortex-M 程序是向上兼容的,也可以说 Cortex-M 处理器是向下兼容的。
具体到 Cortex-M 处理器时,这个兼容特性表现为:
从处理器角度看:CM0 指令集和功能模块是最精简的,CM7 指令集和功能模块是最丰富的。不存在低版本处理器上存在的特性是高版本处理器所没有的。
从软件角度来看:CMSIS 提供的头文件和功能函数是二进制向上兼容的,比如某 CM0 软件 App 使用的是 core_cm0.h 头文件,而这个 App 要在 CM7 上运行时,不需要使用 core_cm7.h 再重新编译一次(当然使用新头文件编译后的 App 也是正常的。)
2.Cortex-M 功能模块差异
由于 CM1 主要是用在 FPGA 产品中,故下面对比忽略 CM1。我们知道 CM 处理器是向下兼容的,故 CM 功能模块是随着版本的升级而逐步增加的,我们逐步从最低版本开始对比。
2.1 CM0 vs CM0+
先来聊聊 CM0 与 CM0+,从最基准的 CM0 模块看起:
ARMv6-M CPU 内核:ARM 公司于 2007 年推出的内核。冯·诺依曼体系结构,3 级流水线,支持大部分 Thumb 和小部分 Thumb-2 指令集,所有指令一共 57 条。此外还内嵌 32-bit 返回结果的硬件乘法器。
NVIC 嵌套向量中断控制器:用于 CPU 在正常 Run 模式下中断管理。最大支持 32 个外部中断,外部中断可设 4 级抢占优先级(2bit)。
WIC 唤醒中断控制器:用于 CPU 在低功耗 Sleep 模式下中断管理。
AHB-Lite 总线:一条 32bit AMBA-3 标准的高性能 system 总线负责所有 Flash、SRAM 指令和数据存取。
调试模块:0-4 个硬件断点 Breakpoint,0-2 个数据监测点 Watchpoint。
DAP 调试接口:通过 DAP 模块支持 JTAG 和 SWD 接口。
那么 CM0+到底改进了什么?
ARMv6-M CPU 内核:流水线改为 2 级(很多 8bit MCU 都是 2 级流水线,主要用于降低功耗)
NVIC 嵌套向量中断控制器:增加了 VTOR 即中断重定向功能。
那么 CM0+到底增加了什么?
MPU 存储器保护单元:提供硬件方式管理和保护内存,控制访问权限,最大可将内存分为 8*8 个 region。内存越权访问,将返回 MemManage Fault。
MTB 片上跟踪单元:用户体验更好的的跟踪调试,优化的异常捕获机制,可以更快地定位 bug。
Fast I/O:可单周期访问的快速 I/O 口,更易于 Bit-banging(比如 GPIO 模拟 SPI、IIC 协议)。
2.2 CM0+ vs CM3
前面比较完了 CM0 与 CM0+,再来看看 CM3 比 CM0+增强在了哪里:
那么 CM3 到底改进了什么?
ARMv7-M CPU 内核:ARM 公司于 2004 年推出的内核。哈佛体系结构,3 级流水线+分支预测,支持全部的 Thumb 和 Thumb-2 指令集。内嵌 32-bit 硬件乘法器可返回 64-bit 运算结果,且新增 32-bit 硬件除法器。
NVIC 嵌套向量中断控制器:最大支持 240 个外部中断,中断优先级可分组(抢占优先级、响应优先级),8bit 优先级设置(最大 128 级抢占优先级(对应最小 2 级响应优先级),最大 256 级响应优先级(对应无抢占优先级))。
3x AHB-Lite 总线:除了原 system 总线负责 SRAM 存取外,还新增两条 ICode、DCode 总线分别完成 Flash 上指令和数据存取。
调试模块:0-8 个硬件断点 Breakpoint,0-4 个数据监测点 Watchpoint。
ITM/ETM 跟踪单元:ITM 更好地支持 printf 风格 debug,ETM 提供实时指令和数据跟踪。
那么 CM3 到底增加了什么?
额,CM3 相比 CM0+并没有增加什么独有模块,反倒是少了 Fast I/O Port。
2.3 CM3 vs CM4
前面比较完了 CM0+与 CM3,再来看看 CM4 比 CM3 增强在了哪里:
那么 CM4 到底改进了什么?
ARMv7E-M CPU 内核:增加了 DSP 相关指令支持。
那么 CM4 到底增加了什么?
DSP 数字信号处理单元:新增支持单周期 16/32-bit MAC、dual 16-bit MAC, 8/16-bit SIMD 算法的数字信号处理单元。
FPU 浮点运算单元:新增单精度(float 型)兼容 IEEE-754 标准的浮点运算单元(VFPv4-SP)。
2.4 CM4 vs CM7
前面比较完了 CM3 与 CM4,再来看看 CM7 比 CM4 增强在了哪里:
那么 CM7 到底改进了什么?
ARMv7E-M CPU 内核:6 级流水线+分支预测。
2x AHB-Lite 总线:精简为 2 条 AHB 总线,其中 AHB-P 外设接口完成原来 system 总线功能, AHB-S 从属接口负责外部总线控制器(如 DMA)功能以及与 TCM 接口功能。
MPU 存储器保护单元:最大可将内存分为 16*8 个 region。
FPU 浮点运算单元:新增双精度(double 型)兼容 IEEE-754 标准的浮点运算单元(VFPv5)。
那么 CM7 到底增加了什么?
I/D-Cache 缓存区:即是我们通常理解的 L1 Cache,每个 Cache 大小为 4-64KB。
I/D-TCM 紧密耦合存储器:紧密的与处理器内核相耦合的 RAM,提供与 Cache 相当的性能,但比 Cache 更具确定性,memory 最大均为 16MB。
ECC 特性:对 L1 Cache 提供错误校正和恢复功能,提高系统的可靠性。
AXI-M 总线:基于 AMBA 4 的 64bit AXI 总线,用于支持挂在系统上的 L2 memory。