2.1 指令集簡介
大多數情況下,應用程序代碼可以用C或其他高級語言編寫。但是,對Cortex-M 處理器支持指令集的基本了解有助于開發者針對具體應用選擇合適的Cortex-M處理器。指令集(ISA)是處理器架構的一部分,Cortex-M處理器可以分為幾個架構規范。
表 3: Cortex-M 處理器ARM架構規范的規范
所有的Cortex-M 處理器都支持Thumb指令集。整套Thumb指令集擴展到Thumb-2版本時變得相當大。但是,不同的Cortex-M處理器支持不同的Thumb 指令集的子集,如圖3所示:
圖 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 操作:
圖 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)總結了那些關鍵的差異。
表 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但是沒有配置浮點運算單元的產品。在這種情況下,當程序中使用了浮點數,編譯工具包會在鏈接階段插入需要的運行軟件庫。軟件模式的浮點運算需要更長的運行時間,并且會略微的增加代碼大小。但是,如果浮點運算不是頻繁使用的,這種方案是適合這種應用的。