Cortex-M 的Thumb指令集?
Cortex-M 的Thumb指令集?
Cortex-M 处理器中的 Thumb 指令集详解
这是一个非常核心的概念,理解它对于理解 Cortex-M 系列的成功至关重要。
核心摘要
Thumb 是一种16位和32位混合长度的指令集架构(ISA),它旨在以极高的代码密度(即用最少的内存存储程序)提供出色的性能。所有基于 ARM Cortex-M 系列的微控制器都只支持 Thumb 指令集(更准确地说,是它的增强版本 Thumb-2)。
1. 历史背景:为什么需要 Thumb?
在 Thumb 出现之前,ARM 处理器主要使用 ARM 指令集,该指令集中的每条指令都是 32 位 长。
- 优点:功能强大,性能高,每条指令能完成很多工作。
- 缺点:代码密度低。一个程序编译后占用的内存空间较大。
在早期的嵌入式系统中,内存(无论是 Flash 还是 RAM)都非常昂贵且容量有限。为了降低系统成本,ARM 公司需要一种方法,在保持不错性能的同时,大幅减少代码占用的空间。
于是,Thumb 指令集应运而生。
2. Thumb 指令集的特点
a. 高代码密度
最初的 Thumb 指令集(如用于 ARM7TDMI 的)主要是 16 位 的。通过将最常用的 ARM 指令压缩成 16 位格式,它可以将代码大小减少约 30%-35%。这意味着完成同样功能的程序,需要的 Flash 内存更少,系统成本更低。
b. 性能权衡
16 位的 Thumb 指令功能不如完整的 32 位 ARM 指令强大。通常,完成一个相同的操作,可能需要更多的 Thumb 指令。因此,虽然代码密度提高了,但绝对性能有所下降(与纯 ARM 代码相比)。
为了解决这个矛盾,早期的 ARM 处理器(如 ARM7TDMI)允许在 ARM 状态 和 Thumb 状态 之间切换。操作系统内核和性能关键代码可以用 32 位 ARM 指令编写,而应用程序的大部分代码可以用 16 位 Thumb 指令编写,以实现最佳平衡。
3. Thumb-2:革命性的进化
Thumb-2 技术是 Thumb 指令集的巨大增强,也是 Cortex-M 系列处理器的基础。
- 诞生:首次引入在 ARM1156 核心,并在 Cortex-M 系列中成为唯一的指令集。
- 核心创新:Thumb-2 不再是纯 16 位指令集,而是 16 位和 32 位指令的混合体(有时称为“可变长度指令集”)。
Thumb-2 的优势:
- 无模式切换:与早期的 ARM/Thumb 切换不同,Thumb-2 没有状态切换。处理器始终在一种模式下运行,编译器可以自由地混合使用 16 位和 32 位指令,无需任何开销。
- 兼得鱼与熊掌:
- 高代码密度:简单的操作使用高效的 16 位指令。
- 高性能:复杂的操作(如硬件除法、中断处理、内存屏障)使用强大的 32 位指令。
- 功能完备:Thumb-2 几乎提供了传统 32 位 ARM 指令集的所有功能,使得 Cortex-M 处理器能够高效地处理复杂的嵌入式应用,而无需切换到其他模式。
正是因为 Thumb-2,Cortex-M 处理器才能在保持极低成本和小芯片面积的同时,提供足够强大的性能,从而彻底统治了微控制器市场。
4. Cortex-M 与 Thumb-2
- Cortex-M0/M0+/M1:主要使用 16 位 的 Thumb-2 指令,只包含少数最必要的 32 位指令,以实现极低的功耗和成本。
- Cortex-M3/M4/M7/M33/M55…:支持完整的 Thumb-2 指令集,包含大量 16 位和 32 位指令。
- Cortex-M4/M55 等还增加了DSP 和单指令多数据(SIMD) 扩展,用于加速数字信号处理算法。
- Cortex-M7 增加了双发射、浮点运算等高级特性,但指令集基础仍是 Thumb-2。
重要提示: 当你为 Cortex-M 处理器编写程序(如使用 C 语言)时,编译器(GCC, ARM Clang, IAR)会自动为你选择最合适的 16 位或 32 位 Thumb 指令。开发者通常不需要关心具体用的是哪条指令,除非在进行极致的优化或编写汇编代码。
总结对比
特性 | 传统 ARM 指令集 | 传统 Thumb (ARM7TDMI) | Thumb-2 (Cortex-M) |
---|---|---|---|
指令长度 | 32 位 | 主要是 16 位 | 16 位 和 32 位混合 |
代码密度 | 低 | 高 | 非常高 (优于纯16位Thumb) |
绝对性能 | 高 | 较低 | 高 (接近传统ARM) |
运行模式 | ARM 状态 | Thumb 状态 | 单一状态,无切换 |
典型应用 | 应用处理器 | 低成本微控制器 | 所有 Cortex-M 微控制器 |
结论:
对于 Cortex-M 处理器而言,Thumb(特指 Thumb-2 技术)就是其原生且唯一的指令集。它完美地平衡了嵌入式系统最看重的三个要素:成本(代码密度)、性能和功耗,这是 Cortex-M 系列能够取得巨大成功的根本技术原因之一。