1. 概述
《CPU的架构》一文中我们介绍了指令集架构的三大家族:x86 家族
、ARM 家族
、RISC-V
。
你知道ARM指令集还有Cortex-A
、Cortex-R
和Cortex-M
三个不同的系列吗?你三个系列处理器核心之间区别和关系吗?本文将带你详细了解一下。
这三个系列分别针对不同的应用领域而设计,可以通俗地理解为:
- Cortex-A: 负责“思考”和“交互”的大脑。追求高性能,运行复杂的操作系统。
- Cortex-R: 负责“反应”和“控制”的脊髓。追求高实时性和可靠性,用于关键任务控制。
- Cortex-M: 负责“感知”和“动作”的周围神经。追求极致的能效比和低成本,用于微型嵌入式控制。
注意: 你会发现一个有趣的事情是这三个系列字母(A、R、M)的组合,正好是ARM。
下面我们从多个维度进行详细的对比。
2. 核心定位
系列 | 全称 | 核心定位 | 典型应用场景 |
---|---|---|---|
Cortex-A | Application | 应用处理器。专注于高性能、高计算能力,以运行复杂的操作系统和丰富的用户应用程序为目标。 | 智能手机、平板电脑、智能电视、机顶盒、服务器、汽车信息娱乐系统、单板计算机(如树莓派)。 |
Cortex-R | Real-time | 实时处理器。专注于高实时性、高可靠性和容错能力,用于对响应时间有严格要求的关键任务。 | 汽车制动系统、动力总成、安全气囊、硬盘/固态硬盘(SSD)控制器、工业控制、网络设备基带处理。 |
Cortex-M | Microcontroller | 微控制器。专注于极低的功耗、极小的芯片面积和低成本,用于资源受限的嵌入式系统和物联网(IoT)设备。 | 智能手表、智能家居设备(传感器、灯泡)、无人机飞控、电机控制、物联网终端、玩具、键盘鼠标。 |
3. 架构与技术特性
特性 | Cortex-A | Cortex-R | Cortex-M |
---|---|---|---|
架构 | 通常为 ARMv7-A 或 ARMv8-A / ARMv9-A(支持64位) | 通常为 ARMv7-R 或 ARMv8-R | 通常为 ARMv6-M, ARMv7-M, ARMv8-M |
内存管理 (MMU/MPU) |
完整的MMU(内存管理单元) | 可选的MPU(内存保护单元) | 通常只有MPU(甚至在低端型号上没有) |
中断处理 | 使用GIC(通用中断控制器),中断响应延迟较高 | 优化后的中断控制器,中断延迟极低且可预测 | 集成NVIC(嵌套向量中断控制器),中断延迟极低,入门级 |
流水线 | 长且复杂(多发射、乱序执行、超标量)以提升性能 | 中等长度,深度优化以实现确定性(指令执行时间可预测) | 非常短(3级流水线很常见),简单,追求能效和确定性 |
操作系统支持 | Linux, Android, Windows 等丰富操作系统 | RTOS(如FreeRTOS, VxWorks),确定性是关键 | RTOS(如FreeRTOS, Zephyr, μC/OS),甚至直接裸机编程 |
开发模式 | 类似于PC/服务器开发,应用运行在操作系统之上 | 通常是基于RTOS的固件开发,强调时序和可靠性 | 绝大部分是裸机(Bare-metal)或轻量级RTOS |
性能 | 极高 | 高(但侧重于实时性能,而非绝对峰值算力) | 低到中(但能效比极高) |
功耗 | 高 | 中 | 极低(许多型号支持休眠模式,功耗低至微安级) |
成本与面积 | 高(核心复杂,通常需要外挂DRAM) | 中 | 极低(核心简单,常与Flash、SRAM集成为单芯片MCU) |
4. 关键区别
4.1. 内存管理
4.1.1. MMU(内存管理单元)
MMU(Memory Management Unit
)是内存管理单元,其核心功能是虚拟内存,能将虚拟地址映射到物理地址。这是运行像Linux这样具有进程隔离、动态加载等特性的完整操作系统的必要条件。
除了虚拟内存内,MMU还具有以下特点:
- 地址转换: 应用程序看到的地址(虚拟地址)和实际硬件使用的地址(物理地址)是不同的。MMU 负责即时地将虚拟地址翻译成物理地址。这就像你只知道一个公司的部门名称(虚拟地址),而前台管家(MMU)负责帮你找到这个部门在大楼里的具体房间号(物理地址)。
- 内存保护: 它可以为每个内存页设置权限(如可读、可写、可执行)。如果一个用户程序试图写入操作系统的代码区域(只读),MMU会触发一个异常(段错误),阻止非法访问。
- 进程隔离: 每个进程都有自己独立的虚拟地址空间。进程A和进程B可以使用相同的虚拟地址,但它们会被MMU映射到不同的物理地址上,从而完全隔离,互不干扰。这是现代多任务操作系统稳定性的基石。
- 按需分页: 允许操作系统使用硬盘作为虚拟内存(交换空间),当物理内存不足时,将不常用的内存页换出到硬盘,需要时再换入。
4.1.2. MPU(内存保护单元)
MPU(Memory Protection Unit
)是内存保护单元,只能设置内存区域的访问权限(如只读、禁止执行)。它更简单,开销更小,主要用于保护关键代码和数据(例如,防止一个任务意外覆盖另一个任务的数据),从而增强系统的可靠性和安全性。它无法实现虚拟内存,因此不能运行Linux。
4.1.3. 两者的关系
- MMU 是 MPU 的超集。MMU 提供了 MPU 的所有功能(内存保护),并增加了虚拟内存管理这个至关重要的高级功能。
- 关系:你可以把 MPU 看作是一个功能阉割版的、轻量级的 MMU。它只负责“保安”的工作(保护区域),而 MMU 既当“保安”又当“高级管家”(管理虚拟地址映射)。
4.2. 实时性(Real-Time)
- Cortex-R 和 Cortex-M 都强调实时性,但侧重点不同。
- Cortex-R 的“实时”是硬实时(Hard Real-Time),意味着必须在严格确定的时间 deadline 内完成响应,否则会导致灾难性后果(如刹车失灵)。它的所有设计,从流水线到内存访问,都为此优化。
- Cortex-M 的实时性通常是软实时(Soft Real-Time) 或对硬实时要求不那么极端的场景。它也能快速响应中断,但其设计首要目标是低功耗和低成本。
4.3. 生态系统与开发
- Cortex-A:支持Linux, Android, Windows等复杂的操作系统。开发环境复杂(交叉编译、内核移植、驱动开发),更偏传统的应用软件开发。
- Cortex-M/R:同城只支持RTOS等实时操作系统。开发环境相对简单,常用IDE(如Keil MDK, IAR Embedded Workbench, STM32CubeIDE)进行固件开发,更贴近硬件。
5. 如何查看芯片的核心类型?
有以下方法可以查看设备所使用的ARM核心类型(Cortex-A
/Cortex-R
/Cortex-M
)。
5.1. 软件查询(最简单、最常用)
5.1.1. Cortex-A设备
Cortex-A设备同城会运行Linux或Android系统,可通过以下方法来查询。
1. 使用 lscpu
命令
在终端中输入这个命令,输出信息非常详尽。
1 | $ lscpu |
2. 读取 /proc/cpuinfo
文件
在终端中输入 cat /proc/cpuinfo
。
1 | $ cat /proc/cpuinfo |
3. 如何解读 CPU part
:
你需要将 CPU part
的十六进制代码(如 0xc07
)与ARM官方列表对照。
Part Num (Hex) | CPU 内核名称 | ARM 架构版本 | 典型特性与应用备注 |
---|---|---|---|
0x920 | ARM920T | ARMv4T | 带MMU,用于早期智能手机、嵌入式设备 |
0x922 | ARM922T | ARMv4T | ARM920T的变种,缓存大小不同 |
0x926 | ARM926EJ-S | ARMv5TE | 带Jazelle、MMU,广泛应用于功能手机、微控制器 |
0x940 | ARM940T | ARMv4T | 带MPU,用于实时嵌入式应用 |
0x946 | ARM946E-S | ARMv5TE | 带MPU、可配置TCM,用于游戏机、嵌入式控制 |
0x966 | ARM966E-S | ARMv5TE | 无缓存,带TCM,用于深度嵌入式应用 |
0xb02 | ARM11 MPCore | ARMv6K | 支持1-4核SMP,用于智能手机、应用处理器 |
0xb36 | ARM1136J(F)-S | ARMv6 | 带SIMD、Jazelle,用于移动设备 |
0xb56 | ARM1156T2(F)-S | ARMv6T2 | 带Thumb-2、MPU,用于实时嵌入式应用 |
0xb76 | ARM1176JZ(F)-S | ARMv6KZ | 带TrustZone技术,用于安全应用处理器 |
0xc05 | Cortex-A5 | ARMv7-A | 高效能应用处理器,支持多核 |
0xc07 | Cortex-A7 | ARMv7-A | 高能效应用处理器,常用于大小核架构中的小核 |
0xc08 | Cortex-A8 | ARMv7-A | 高性能单核应用处理器 |
0xc09 | Cortex-A9 | ARMv7-A | 高性能支持多核的应用处理器 |
0xc0c | Cortex-A12 | ARMv7-A | 中高端应用处理器 |
0xc0f | Cortex-A15 | ARMv7-A | 高性能应用处理器,常用于大小核架构中的大核 |
0xc14 | Cortex-R4 | ARMv7-R | 高性能实时处理器 |
0xc15 | Cortex-R5 | ARMv7-R | 实时处理器,支持双核锁步 |
0xc17 | Cortex-R7 | ARMv7-R | 高性能实时处理器 |
0xc20 | Cortex-M0 | ARMv6-M | 超低功耗微控制器 |
0xc21 | Cortex-M1 | ARMv6-M | 专为FPGA设计的微控制器 |
0xc23 | Cortex-M3 | ARMv7-M | 高性能微控制器 |
0xc24 | Cortex-M4 | ARMv7E-M | 带DSP指令的微控制器 |
0xc27 | Cortex-M7 | ARMv7E-M | 高性能带DSP和FPU的微控制器 |
0xc60 | Cortex-M0+ | ARMv6-M | 极致能效微控制器 |
0xd01 | Cortex-A32 | ARMv8-A | 32位-only, 高效能应用处理器 (AArch32) |
0xd03 | Cortex-A53 | ARMv8-A | 高能效64位应用处理器,常见于大小核中的小核 |
0xd04 | Cortex-A35 | ARMv8-A | 极高能效64位应用处理器 |
0xd05 | Cortex-A55 | ARMv8.2-A | 高能效AI增强型应用处理器 (常见于中端手机) |
0xd07 | Cortex-A57 | ARMv8-A | 高性能64位应用处理器,常见于大小核中的大核 |
0xd08 | Cortex-A72 | ARMv8-A | 高性能64位应用处理器 |
0xd09 | Cortex-A73 | ARMv8-A | 高性能高能效64位应用处理器 |
0xd0a | Cortex-A75 | ARMv8.2-A | 高性能64位应用处理器 |
0xd0b | Cortex-A76 | ARMv8.2-A | 高性能64位应用处理器 |
0xd0c | Cortex-A77 | ARMv8.2-A | 高性能64位应用处理器 |
0xd0d | Cortex-A78 | ARMv8.2-A | 高性能高能效64位应用处理器 |
0xd0e | Cortex-A710 | ARMv9-A | 高性能64位应用处理器 (ARMv9) |
0xd41 | Cortex-A78AE | ARMv8.2-A | 适用于汽车电子的Cortex-A78版本 |
0xd44 | Cortex-X1 | ARMv8.2-A | 极致性能64位应用处理器 |
0xd4a | Cortex-A510 | ARMv9-A | 高能效小核 (ARMv9) |
0xd4b | Cortex-A715 | ARMv9-A | 高性能高能效大核 (ARMv9) |
0xd4c | Cortex-X2 | ARMv9-A | 极致性能核 (ARMv9) |
0xd4d | Cortex-A720 | ARMv9-A | (2023年发布的高效大核) |
0xd4e | Cortex-X3 | ARMv9-A | (2023年发布的极致性能核) |
… | … (持续更新) | … | … |
5.1.2. Cortex-R设备
这类处理器通常深嵌入在专用设备中(如硬盘主控、汽车ABS系统),不向用户开放访问接口。普通用户几乎无法直接查询,只能通过:
- 查阅该设备的技术白皮书或芯片规格书。
- 询问设备制造商。
5.1.3. Cortex-M设备
Cortex-M设备(微控制器)通常没有通用的操作系统,所以无法运行 lscpu
。方法如下:
- 查看芯片型号: 这是最直接的方法。MCU芯片上会印有型号,例如 STM32F407VGT6。
- “ST”代表意法半导体(STMicroelectronics)。
- “M32”代表ARM Cortex-M内核。
- “F4”代表产品系列。F4系列通常使用Cortex-M4内核。
- 查阅芯片数据手册(Datasheet): 这是最权威的方法。去芯片制造商(如ST, NXP, Microchip, TI)的官网找到该型号的官方数据手册(Datasheet)。在首页或内核介绍章节一定会明确写明是 Cortex-M0, M3, M4, M7 等。
- 通过IDE识别: 当你使用Keil、IAR等IDE为芯片开发程序时,在选择设备型号时,IDE会明确列出该芯片的内核。
6. 与ARM指令集的版本对应关系
6.1. 版本对应关系
这是一个大致的对应关系表,可以帮助你理解它们的演进。需要注意的是,一个架构版本(如ARMv7)可以衍生出适用于不同场景的Profile(A, R, M)。
ARM 架构版本 (ISA) | 发布重点 | Cortex-A 应用处理器 | Cortex-R 实时处理器 | Cortex-M 微控制器 | 关键特性 |
---|---|---|---|---|---|
ARMv4 / v5 | 早期经典 | ARM9, ARM11 | - | - | 首次推出Thumb指令集 |
ARMv6 | 优化与扩展 | - | - | Cortex-M0 / M0+ / M1 | 引入Thumb-2,能效比极高 |
ARMv7 | Profile 分类 | Cortex-A5, A7, A8, A9, A15, A17 | Cortex-R4, R5, R7 | Cortex-M3, M4, M7 | NEON SIMD (A系列), Thumb-2, 硬件除法 |
ARMv8 | 64位革命 | Cortex-A53, A57, A72, A73, A75, A76, A77, A78, X1 | Cortex-R52, R82 | Cortex-M23, M33, M55, M85 | A64/ARM64指令集,TrustZone安全扩展 |
ARMv9 | 安全与AI | Cortex-A710, A715, A510, X2, X3, X4 | - | (未来M系列会跟进) | SVE2矢量扩展,机密计算领域 |
6.2. 如何理解这张表
Profile(应用领域细分):从ARMv7开始,架构明确分为三个Profile:
- **A-profile (Application)**:用于高性能应用处理器。我们手机里的CPU基本都是ARMv7-A或ARMv8-A/ARMv9-A。
- **R-profile (Real-time)**:用于高实时性处理器。
- **M-profile (Microcontroller)**:用于深度嵌入式的微控制器。
向后兼容:ARM架构是向后兼容的。例如,一个支持ARMv8-A的处理器(如Cortex-A53)可以运行为ARMv7-A编译的32位程序。
举例说明:
- 你的
lscpu
命令显示 **Model name: Cortex-A72
**,那么它使用的指令集架构就是 ARMv8-A。 - 你的芯片型号是 STM32F103,查阅数据手册知道它是 Cortex-M3 内核,那么它使用的指令集架构就是 ARMv7-M。
- 你的芯片型号是 RP2040(树莓派Pico),它的内核是 **Cortex-M0+**,那么它使用的指令集架构就是 ARMv6-M。
- 你的