《电子技术应用》

Cortex-M处理器指令集

ARM 作者:Joseph Yiu
2017/4/19 13:57:00

2.1 指令集简介

       大多数情况下,应用程序代码可以用C或其他高级语言编写。但是,对Cortex-M 处理器支持指令集的基本了解有助于开发者针对具体应用选择合适的Cortex-M处理器。指令集(ISA)是处理器架构的一部分,Cortex-M处理器可以分为几个架构规范。

UJ@1RR~THSH`8)CH](FKD3T.png

表 3: Cortex-M 处理器ARM架构规范的规范

       所有的Cortex-M 处理器都支持Thumb指令集。整套Thumb指令集扩展到Thumb-2版本时变得相当大。但是,不同的Cortex-M处理器支持不同的Thumb 指令集的子集,如图3所示:

图片3_conew1.png

图片4_conew1.png

图 3: Cortex-M 处理器的指令集

2.2 Cortex-M0/M0+/M1指令集

Cortex-M0/M0+/M1处理器基于ARMv6-M架构。这是一个只支持56条指令的小指令集,大部分指令是16位指令,如图3所示只占很小的一部分。但是,此类处理器中的寄存器和处理的数据长度是32位的。对于大多数简单的I/O控制任务和普通的数据处理,这些指令已经足够了。这么小的指令集可以用很少的电路门数来实现处理器设计,Cortex-M0 和 Cortex-M0+最小配置仅仅12K门。然而,其中的很多指令无法使用高位寄存器(R8 到R12), 并且生成立即数的能力有限。这是平衡了超低功耗和性能需求的结果。

2.3 Cortex-M3指令集

Cortex-M3处理器是基于ARMv7-M架构的处理器,支持更丰富的指令集,包括许多32位指令,这些指令可以高效的使用高位寄存器。另外,M3还支持:

· 查表跳转指令和条件执行(使用IT指令)

· 硬件除法指令

· 乘加指令(MAC)

· 各种位操作指令

更丰富的指令集通过几种途径来增强性能;例如,32位Thumb指令支持了更大范围的立即数,跳转偏移和内存数据范围的地址偏移。支持基本的DSP操作(例如,支持若干条需要多个时钟周期执行的MAC指令,还有饱和运算指令)。最后,这些32位指令允许用单个指令对多个数据一起做桶型移位操作。

支持更丰富的指令导致了更大的面积成本和更高的功耗。典型的微控制器,Cortex-M3的电路门数是Cortex-M0 和 Cortex-M0+两倍还多。但是,处理器的面积只是大多数现代微控制器的很小的一部分,多出来的面积和功耗经常不那么重要。

2.4 Cortex-M4指令集

Cortex-M4在很多地方和Cortex-M3相同:流水线,编程模型。Cortex-M4支持Cortex-M3的所有功能,并额外支持各种面向DSP应用的指令,像SIMD, 饱和运算指令,一系列单周期MAC指令(Cortex-M3只支持有限条MAC指令,并且是多周期执行的),和可选的单精度浮点运算指令。

Cortex-M4的SIMD操作可以并行处理两个16位数据和4个8位数据。例如,图4展示的QADD8 和 QADD16 操作:

图片5_conew1.png   

图 4: SIMD指令例子: QADD8 and QADD16

The uses of SIMD enable much faster computation of 16-bit and 8-bit data in certain DSP operations as the calculation can be parallelized. However, in general programming, C compilers are unlikely to utilize the SIMD capability. That is why the typical benchmark results of the Cortex-M3 and Cortex-M4. However, the internal data path of the Cortex-M4 is different from Cortex-M3, which enable faster operations in a few cases (e.g. single cycle MAC, and allow write back of two registers in a single cycle).在某些DSP运算中,使用SIMD可以加速更快计算16位和8位数据,因为这些运算可以并行处理。但是,一般的编程中,C编译器并不能充分利用SIMD运算能力。这是为什么Cortex-M3 和 Cortex-M4典型benchmark的分数差不多。然而,Cortex-M4的内部数据通路和Cortex-M3的不同,某些情况下Cortex-M4可以处理的更快(例如,单周期MAC,可以在一个周期中写回到两个寄存器)。

2.5 Cortex-M7指令集

Cortex-M7支持的指令集和Cortex-M4相似,添加了:

· 浮点数据架构是基于FPv5的,而不是Cortex-M4的FPv4,所以Cortex-M7支持额外浮点指令

· 可选的双精度浮点数据处理指令

· 支持缓存数据预取指令(PLD)

Cortex-M7的流水线和Cortex-M4的非常不同。Cortex-M7是6级双发射流水线,可以获得更高的性能。多数为Cortex-M4设计的软件可以直接运行在Cortex-M7上。但是,为了充分利用流水线差异来达到最好的优化,软件需要重新编译,并且在许多情况下,软件需要一些小的升级,以充分利用像Cache这样的新功能。

2.6 Cortex-M23指令集

Cortex-M23的指令集是基于ARMv8-M的Baseline子规范,它是ARMv6-M的超集。扩展的指令包括:

· 硬件除法指令

· 比较和跳转指令,32位跳转指令

· 支持TrustZone安全扩展的指令

· 互斥数据访问指令(通常用于信号量操作)

· 16位立即数生成指令

· 载入获取及存储释放指令(支持C11)

在某些情况下,这些增强的指令集可以提高处理器性能,并且对包含多个处理器的SoC设计有用(例如,互斥访问对多处理器的信号量处理有帮助)

2.7 I Cortex-M33指令集

因为Cortex-M33设计是非常可配置的,某些指令也是可选的。例如:

· DSP指令(Cortex-M4 和Cortex-M7支持的)是可选的

· 单精度浮点运算指令是可选的,这些指令是基于FPv5的,并且比Cortex-M4多几条。

: Cortex-M33也支持那些ARMv8-M Mainline引入的新指令:

· 支持TrustZone安全扩展的指令

· 载入获取及存储释放指令(支持C11)

2.8 指令集特性比较总结

       ARMv6-M, ARMv7-M 和 ARMv8-M架构有许多指令集功能特点, 很难介绍到所有的细节。但是,下面的表格(表4)总结了那些关键的差异。

FWB)FJ${]NF{L%0$BZ_94~V.png

6(F6{KW6~NQ$2P%S6X`]O67.png

表 4: 指令集特性总结

Cortex-M处理器指令集的最重要的特点是向上兼容。Cortex-M3的指令是Cortex-M0/M0+/M1的超集。所以,理论上讲,如果存储空间分配是一致的,运行在Cortex-M0/M0+/M1上的二进制文件可以直接运行在Cortex-M3上。同样的原理也适用于Cortex-M4/M7和其他的Cortex-M处理器;Cortex-M0/M0+/M1/M3支持的指令也可以运行在Cortex-M4/M7上。

虽然Cortex-M0/M0+/M1/M3/M23处理器没有浮点运算单元配置选项,但是处理器仍然可以利用软件来做浮点数据运算。这也适用于基于Cortex-M4/M7/M33但是没有配置浮点运算单元的产品。在这种情况下,当程序中使用了浮点数,编译工具包会在链接阶段插入需要的运行软件库。软件模式的浮点运算需要更长的运行时间,并且会略微的增加代码大小。但是,如果浮点运算不是频繁使用的,这种方案是适合这种应用的。

继续阅读>>