作者:Joseph Yiu, 高級嵌入式技術經理, ARM William Gao, ARM 中國應用工程師與Gabriel Wang,ARM中國嵌入式應用工程師對于本文中文版亦有幫助 概要 ARM Cortex-M處理器家族現在有8款處理器成員。在本文中,我們會比較Cortex-M系列處理器之間的產品特性,重點講述如何根據產品應用選擇正確的Cortex-M處理器。本文中會詳細的對照Cortex-M 系列處理器的指令集和高級中斷處理能力,以及 SoC系統級特性,調試和追蹤功能和性能的比較。 1 簡介 今天, ARM Cortex-M 處理器家族有8款處理器成員。除此之外,ARM的產品系列還有很多其他的處理器成員。對很多初學者,甚至某些芯片設計經驗豐富但是不熟悉ARM系列處理器的設計者來說,也是很容易混淆這些產品的。不同的ARM 處理器有不同的指令集,系統功能和性能。本文會深入展現Cortex-M系列處理器之間的關鍵區別,以及它們和ARM其他系列處理器的不同。 1.1 ARM處理器家族 多年來, ARM已經研發了相當多的不同的處理器產品。 如下圖中(圖1): ARM 處理器產品分為經典ARM處理器系列和最新的Cortex處理器系列。并且根據應用范圍的不同,ARM處理器可以分類成3個系列。 Application Processors(應用處理器)–面向移動計算,智能手機,服務器等市場的的高端處理器。這類處理器運行在很高的時鐘頻率(超過1GHz),支持像Linux,Android,MS Windows和移動操作系統等完整操作系統需要的內存管理單元(MMU)。 如果規劃開發的產品需要運行上述其中的一個操作系統,你需要選擇ARM 應用處理器. Real-time Processors (實時處理器)–面向實時應用的高性能處理器系列,例如硬盤控制器,汽車傳動系統和無線通訊的基帶控制。多數實時處理器不支持MMU,不過通常具有MPU、Cache和其他針對工業應用設計的存儲器功能。實時處理器運行在比較高的時鐘頻率(例如200MHz 到 >1GHz ),響應延遲非常低。雖然實時處理器不能運行完整版本的Linux和Windows操作系統, 但是支持大量的實時操作系統(RTOS)。 Microcontroller Processors(微控制器處理器)–微控制器處理器通常設計成面積很小和能效比很高。通常這些處理器的流水線很短,最高時鐘頻率很低(雖然市場上有此類的處理器可以運行在200Mhz之上)。 并且,新的Cortex-M處理器家族設計的非常容易使用。因此,ARM 微控制器處理器在單片機和深度嵌入式系統市場非常成功和受歡迎。 圖 1: 處理器家族 表1總結了三個處理器系列的主要特征。
1.2 Cortex-M 處理器家族 Cortex-M處理器家族更多的集中在低性能端,但是這些處理器相比于許多微控制器使用的傳統處理器性能仍然很強大。例如,Cortex-M4和Cortex-M7處理器應用在許多高性能的微控制器產品中,最大的時鐘頻率可以達到400Mhz。 當然,性能不是選擇處理器的唯一指標。在許多應用中,低功耗和成本是關鍵的選擇指標。因此,Cortex-M處理器家族包含各種產品來滿足不同的需求:
不同于老的經典ARM處理器(例如,ARM7TDMI, ARM9), Cortex-M處理器有一個非常不同的架構。例如: - 僅支持ARM Thumb®指令,已擴展到同時支持16位和32位指令Thumb-2版本 - 內置的嵌套向量中斷控制負責中斷處理,自動處理中斷優先級,中斷屏蔽,中斷嵌套和系統異常處理。 - 中斷處理函數可以使用標準的C語言編程,嵌套中斷處理機制避免了使用軟件判斷哪一個中斷需要響應處理。同時,中斷響應速度是確定性的,低延遲的 - 向量表從跳轉指令變為中斷和系統異常處理函數的起始地址。 - 寄存器組和某些編程模式也做了改變。 這些變化意味著許多為經典ARM處理器編寫的匯編代碼需要修改,老的項目需要修改和重新編譯才能遷移到Cortex-M的產品上。軟件移植具體的細節記錄在ARM文檔: ARM Cortex-M3 Processor Software Development for ARM7TDMI Processor Programmers http://www.arm.com/files/pdf/Cortex-M3_programming_for_ARM7_developers.pdf 1.3 Cortex-M系列處理器的共同特性 Cortex-M0, M0+, M3, M4 and M7之間有很多的相似之處,例如: - 基本編程模型 (章節 3.1) - 嵌套向量中斷控制器(NVIC)的中斷響應管理 - 架構設計的休眠模式:睡眠模式和深度睡眠模式 (章節 4.1) - 操作系統支持特性 (章節 3.3) - 調試功能 (章節 6) - 易用性 例如,嵌套向量中斷控制器是內置的中斷控制器 圖 2: Cortex-M處理器的嵌套向量中斷控制器 支持許多外圍設備的中斷輸入,一個不可屏蔽的中斷請求,一個來自內置時鐘(SysTick)的中斷請求(見章節 3.3)和一定數量的系統異常請求。NVIC處理這些中斷和異常的優先級和屏蔽管理。 NVIC以及異常處理模型的更多的內容在章節3.2描述。其他Cortex-M處理器間的異同點會在本文的其余部分講解。 2 Cortex-M處理器指令集 2.1 指令集簡介 大多數情況下,應用程序代碼可以用C或其他高級語言編寫。但是,對Cortex-M 處理器支持指令集的基本了解有助于開發者針對具體應用選擇合適的Cortex-M處理器。指令集(ISA)是處理器架構的一部分,Cortex-M處理器可以分為幾個架構規范
所有的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)總結了那些關鍵的差異。
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但是沒有配置浮點運算單元的產品。在這種情況下,當程序中使用了浮點數,編譯工具包會在鏈接階段插入需要的運行軟件庫。軟件模式的浮點運算需要更長的運行時間,并且會略微的增加代碼大小。但是,如果浮點運算不是頻繁使用的,這種方案是適合這種應用的。 3 架構特性 3.1 編程模型 Cortex-M處理器家族的編程模型是高度一致的。例如所有的Crotex-M處理器都支持R0到R15,PSR, CONTROL 和 PRIMASK。兩個特殊的寄存器— FAULTMASK 和 BASEPRI—只有Cortex-M3, Cortex-M4, Cortex-M7 和 Cortex-M33支持;浮點寄存器組和FPSCR(浮點狀態和控制寄存器)寄存器,是Cortex-M4/M7/M33可選的浮點運算單元使用的。 圖 5: 編程模型 BASEPRI寄存器允許程序阻止指定優先級或者低的優先級中斷和異常。對ARMv7-M來說這是很重要的,因為Cortex-M3, Cortex-M4, Cortex-M7 和 Cortex-M33有大量的優先級等級,而ARMv6-M 和 ARMv8-M Baseline只有有限的4個優先等級。FAULTMASK通常用在復雜的錯誤處理上(查看章節3.4) 非特權級別的實現對ARMv6-M處理器是可選的,對ARMv7-M 和ARMv8-M處理器一直支持的。對Cortex-M0+處理器,它是可選的, Cortex-M0 and Cortex-M1不支持這個功能。這意味著在各種Cortex-M處理器的CONTROL 寄存器是稍微不同的。FPU的配置也會影響到CONTROL寄存器,如圖6所示。 圖 6: CONTROL 寄存器 另外一個編程模型之間的不同是PSR寄存器(程序狀態寄存器)的細節。所有的Cortex-M處理器,PSR寄存器都被再分成應用程序狀態寄存器(APSR),執行程序狀態寄存器(EPSR)和中斷程序狀態寄存器(IPSR)。 ARMv6-M 和 ARMv8-M Baseline系列的處理器不支持APSR的Q位和EPSR的ICI/IT位。ARMv7E-M系列 ( Cortex-M4, Cortex-M7) 和ARMv8-M Mainline (配置了DSP擴展的Cortex-M33 )支持GE位。另外,ARMv6-M系列處理器IPSR的中斷號數字范圍很小,如圖7所示。 圖 7: PSR 差異 請注意Cortex-M的編程模型和ARM7TDMI等這些經典的ARM處理器是不一樣的。除了寄存器組不同外,經典ARM處理器中“模式”和“狀態”的定義與Cortex-M中的也是不同的。Cortex-M只有兩個模式:線程模式(Thread)和管理者模式(Handler),并且Cortex-M處理器一直運行在Thumb狀態(不支持ARM指令) 3.2 異常處理模型和嵌套向量中斷控制器NVIC 所有的Cortex-M處理器都包含了NVIC模塊,采用同樣的異常處理模型。如果一個異常中斷發生,它的優先等級高于當前運行等級,并且沒有被任何的中斷屏蔽寄存器屏蔽,處理器會響應這個中斷/異常,把某些寄存器入棧到當前的堆棧上。這種堆棧機制下,中斷處理程序可以編寫為一個普通的C函數,許多小的中斷處理函數可以立即直接響應工作而不需要額外的堆棧處理花銷。 一些ARMv7-M/ARMv8-M Mainline系列的處理器使用的中斷和系統異常并不被ARMv6-M/ARMv8-M Baseline的產品支持,如圖8. 例如,Cortex-M0, M0+ 和M1的中斷數被限制在32個以下,沒有調試監測異常,錯誤異常也只限于HardFault(錯誤處理細節請參看章節3.4)。相比之下,Cortex-M23, Cortex-M3, Cortex-M4 和Cortex-M7處理器可以支持到多達240個外圍設備中斷。Cortex-M33支持最多480個中斷。 另外一個區別是可以使用的優先等級數量: ARMv6-M 架構 - ARMv6-M支持2級固定的(NMI 和 HardFault)和4級可編程的(由每個優先等級寄存器的兩個位表示)中斷/異常優先級。這對大多數的微控制器應用來說足夠了。 ARMv7-M 架構 - ARMv7-M系列處理器的可編程優先級等級數范圍,根據面積的限制,可以配置成8級(3位)到256級(8位)。ARMv7-M處理器還有一個叫做中斷優先級分組的功能,可以把中斷優先級寄存器再進一步分為組優先級和子優先級,這樣可以詳細地制定搶占式優先級的行為。 ARMv8-M Baseline – 類似 ARMv6-M,M23也有2位的優先級等級寄存器。借助可選的TrustZone安全擴展組件,安全軟件可以把非安全環境中的中斷的優先等級轉換到優先等級區間的下半區,這就保證了安全環境中的某些中斷/異常總是比非安全環境中的優先級要高。 ARMv8-M Mainline – 類似于 ARMv7-M。 可以支持8到256個中斷優先等級和中斷優先級分組。還支持ARMv8-M Baseline具有的優先等級調整功能。 圖 8: Cortex-M 處理器異常中斷類型 所有的Cortex-M處理器在異常處理是都要依靠向量表。向量表保存著異常處理函數的起始地址(如圖8所示)。向量表的起始地址由名為向量表偏移寄存器(VTOR)決定。 • Cortex-M0+, Cortex-M3 and Cortex-M4 processors: by default the vector table is located in the starting of the memory map (address 0x0). Cortex-M0+, Cortex-M3 and Cortex-M4: 向量表默認放在存儲空間的起始地址(地址 0x0)。 • In Cortex-M7, Cortex-M23 and Cortex-M33 processors: the default value for VTOR is defined by chip designers. Cortex-M23 and Cortex-M33 processors can have two separated vector tables for Secure and Non-secure exceptions/interrupts. Cortex-M7, Cortex-M23 and Cortex-M33:VTOR的初始值由芯片設計者定義。Cortex-M23 and Cortex-M33處理器面向安全和非安全的異常/中斷有兩個獨立的向量表。 • Cortex-M0 and Cortex-M1 does not implement programmable VTOR and vector table starting address is always 0x00000000. Cortex-M0 and Cortex-M1沒有實現可編程的VTOR,向量表起始地址一直為0x00000000。 Cortex-M0+ 和 Cortex-M23處理器的VTOR是可選項。如果VTOR被實現了,向量表的起始地址可以通過設置VTOR來改變,這個功能對下列情況有用: • 重定位向量表到SRAM來實現動態改變異常處理函數入口點 • 重定位向量表到SRAM來實現更快的向量讀取(如果flash存儲器很慢) • 重定位向量表到ROM不同位置(或者Flash),不同的程序運行階段可以有不同的異常處理程序 不同的Cortex-M處理器之間的NVIC編程模型也有額外的不同。差異點總結在表 5中:
大部分情況下,對NVIC的中斷控制特性的操作都是通過CMSIS-CORE提供的APIs處理的,他們在微控制器廠商提供的設備驅動程序庫里。對Cortex-M3/M4/M7/M23/M33處理器,即使中斷被使能了,它的優先級也可以被改變。ARMv6-M處理器不支持動態優先等級調整,當你需要改變中斷優先等級是,需要暫時的關掉這個中斷。 3.3 操作系統支持特性 Cortex-M處理器架構在設計時就考慮到了操作系統的支持。針對操作系統的特性有: • 影子堆棧指針 • 系統服務調用(SVC)和可掛起系統調用(PenSV)異常 • SysTick – 24位遞減計時器,為操作系統的計時和任務管理產生周期性的異常中斷 • Cortex-M0+/M3/M4/M7/M23/M33支持的非特權執行和存儲保護單元(MPU) 系統服務調用(SVC)異常由SVC指令觸發,他可以讓運行在非特權狀態的應用任務啟動特權級的操作系統服務。可掛起系統調用異常在操作系統中像上下文切換這樣的非關鍵操作的調度非常有幫助。 為了能把Cortex-M1放到很小的FPGA器件中,所有用來支持操作系統的特性對Cortex-M1都是可選的。對Cortex-M0, Cortex-M0+ 和Cortex-M23處理器,系統時鐘SysTick是可選的。 通常,所有的Cortex-M處理器都支持操作系統。執行在Cortex-M0+, Cortex-M3, Cortex-M4, Cortex-M7, Cortex-M23 和 Cortex-M33的應用可以運行在非特權運行狀態,并且可以同時利用可選的存儲器管理單元(MPU)以避免內存非法訪問。這可以增強系統的魯棒性。 3.4 TrustZone安全擴展 近幾年來, 物聯網(IoT)成為了嵌入式系統開發者們的熱門話題。IoT系統產品變得更加復雜,上市時間的壓力也與日俱增。嵌入式系統產品需要更好的方案來保證系統的安全,但是同時又要方便軟件開發者開發。傳統的方案是通過把軟件分成特權和非特權兩部分解決的,特權級軟件利用MPU防止非特權的應用訪問包含安全敏感信息在內的的關鍵的系統資源。這種方案對一些IoT系統非常適合,但是在一些情況下,只有兩層劃分是不夠的。特別是那些包含很多復雜特權級別的軟件組件的系統,特權級的代碼的一個缺陷就可以導致黑客徹底的控制這個系統。 ARMv8-M架構包含了一個叫做TrustZone的安全擴展,TrustZone導入了安全和非安全狀態的正交劃分。 • 普通應用是非安全態 • 軟件組件和安全相關的資源(例如,安全存儲,加密加速器,正隨機數發生器(TRNG))處在安全狀態。 圖 9: 安全狀態和非安全狀態的隔離 非安全狀態的軟件只能訪問非安全狀態的存儲空間和外圍設備,安全軟件可以訪問兩種狀態下的所有資源。 用這種方案,軟件開發者可以用以往的方式開發非安全環境下的應用程序。同時,他們可以借助芯片廠商提供的安全通訊軟件庫執行安全物聯網連接。并且即使運行在非安全環境的特權級的程序有漏洞,TrustZone安全機制可以阻止黑客控制整個設備,限制了攻擊的影響,還可以實現系統遠程恢復。此外,ARMv8-M架構也引入了堆棧邊界檢查和增強的MPU設計,促使額外安全措施的采用。 安全架構定義也擴展到了系統級別,每個中斷都可以被設置為安全或者非安全屬性。中斷異常處理程序也會自動保存和恢復安全環境中的寄存器數據以防止安全信息泄露。所以,TrustZone安全擴展讓系統能夠支持實時系統的需求,為IoT應用提供了堅實的安全基礎,并且容易讓軟件開發在此技術上開發應用程序。 TrustZone模塊對Cortex-M23 and Cortex-M33處理器是可選的。關于ARMv8-M TrustZone更多的信息請查找The Next Steps in the Evolution of Embedded Processors for the Smart Connected Era。更多的TrustZone的資源請查看community.arm.com網站上的“TrustZone for ARMv8-M Community”。 3.5 錯誤處理 ARM處理器和其他架構的微控制器的一個區別是錯誤處理能力。當錯誤被檢測到時,一個錯誤異常處理程序被觸發去執行恰當的處理。觸發錯誤的情況可能是: • 未定義的指令(例如,Flash存儲器損壞) • 訪問非法地址空間(例如,堆棧指針崩潰)或者MPU非法訪問 • 非法操作(例如,當處理器已經在優先級高于SVC的中斷中試圖觸發SVC異常) 錯誤處理機制使嵌入式系統能夠更快的響應各種問題。否則,如果系統死機了,看門狗定時需要非常長的時間重啟系統。 ARMv6-M架構中,所有的錯誤事件都會觸發HardFault處理程序,它的優先級是-1(優先級比所有的可編程異常都高,但是僅低于非屏蔽中斷NMI)。 所有的錯誤事件都被認為是不可恢復的,通常我們在HardFault處理程序中僅運行錯誤報告然后進一步觸發自動復位。 ARMv8-M Baseline架構和ARMv6-M類似,只有一個錯誤異常(HardFault)。但是ARMv8-M Baseline的HardFault優先級可以是-1或者當實現了TrustZone安全擴展時優先級是-3. ARMv7-M 和 ARMv8-M Mainline產品除了HardFault還有幾個可配置的錯誤異常: • Memmanage(內存管理錯誤) • 總線錯誤(總線返回錯誤的響應) • 用法錯誤(未定義指令或者其他的非法操作) • SecureFault(只用ARMv8-M Mainline產品支持,處理TrustZone安全擴展中的安全非法操作) 這些異常的優先級可以編程改變,可以單獨的打開和關掉。如果需要,它們也可以利用FAULTMASK寄存器把它們的優先級提高到和HardFault相同的級別。ARMv7-M 和 ARMv8-M Mainline產品還有幾個錯誤狀態寄存器可以提供關于觸發錯誤異常事件的線索和錯誤地址的寄存器,用來確定觸發這個錯誤異常的訪問地址,使調試更加容易。 ARMv7-M 和 ARMv8-M Mainline產品子規范中額外的錯誤處理程序提供了靈活的錯誤處理能力,錯誤狀態寄存器讓錯誤事件的定位和調試更加容易。很多商業開發套件中的調試器已經內嵌了使用錯誤狀態寄存器來診斷錯誤事件的功能。此外,錯誤處理程序可以在運行時做一些修復工作。
4 系統特性 4.1 低功耗 低功耗是Cortex-M處理器的一個關鍵優點。低功耗是其架構的組成部分: • WFI和WFE指令 • 架構級的休眠模式定義 此外,Cortex-M支持許多其他的低功耗特性: • 休眠和深度休眠模式:架構級支持的特性,通過設備特定的功耗管理寄存器可以進一步擴展。 • Sleep-on-exit模式:中斷驅動的應用的低功耗技術。開啟設置后,當異常處理程序結束并且沒有其他等待處理的異常中斷時,處理器自動進入到休眠模式。這樣避免了額外的線程模式中指令的執行從而省電,并且減少了不必要的堆棧讀寫操作。 • 喚醒中斷控制器(WIC):一個可選的特性,在特定的低功耗狀態,由一個獨立于處理器的小模塊偵測中斷情況。例如,在狀態保留功耗管理(SRPG)設計中,當處理器被關電的設計。 • 時鐘關閉和架構級時鐘關閉:通過關閉處理器的寄存器或者子模塊的時鐘輸入來省電 所有這些特性都被Cortex-M0, Cortex-M0+, Cortex-M3, Cortex-M4, Cortex-M7, Cortex-M23 和 Cortex-M33支持。此外,各種低功耗設計技術被用來降低處理器功耗。 因為更少的電路,Cortex-M0 and Cortex-M0+處理器比Cortex-M3, Cortex-M4 和 Cortex-M7功耗低。此外,Cortex-M0+額外優化減少了程序存取(例如跳轉備份)來保持系統層級的低功耗。 Cortex-M23沒有Cortex-M0 和 Cortex-M0+那么小,但是在相同的配置下,仍然和Cortex-M0+能效一樣。 由于更好性能和低功耗優化,在相同配置下,Cortex-M33比Cortex-M4能效比更好。 4.2 Bit-band feature位段 Cortex-M3 和Cortex-M4處理器支持一個叫做位段的可選功能,允許有兩段通過位段別名地址實現可以位尋址的1MB的地址空間(一段在從地址0x20000000起始的SRAM空間。另一段是從地址0x40000000起始的外圍設備空間)。Cortex-M0, M0+ 和 Cortex-M1不支持位段(bit-band)功能,但是可以利用ARM Cortex-M系統設計套件(CMSDK)中的總線級組件在系統層面實現位段(bit-band)功能。Cortex-M7不支持位段(bit-band),因為M7的Cache功能不能與位段一塊使用(Cache控制器不知道內存空間的別名地址)。 ARMv8-M的TrustZone 不支持位段, 這是由于位段別名需要的兩個不同的地址可能會在不同的安全域中。對于這些系統,外圍設備數據的位操作反而可以在外圍設備層面處理(例如,通過添加位設置和清除寄存器)。 4.3 存儲器保護單元(MPU) 除了Cortex-M0, 其他的Cortex-M處理器都有可選的MPU來實現存儲空間訪問權限和存儲空間屬性或者存儲區間的定義。運行實時操作系統的嵌入式系統, 操作系統會每個任務定義存儲空間訪問權限和內存空間配置來保證每個任務都不會破壞其他的任務或者操作系統內核的地址空間。Cortex-M0+, Cortex-M3 和 Cortex-M4都有8個可編程區域空間和非常相似的編程模型。主要的區別是Cortex-M3/M4的MPU允許兩級的存儲空間屬性(例如,系統級cache類型),Cortex-M0+僅支持一級。Cortex-M7的MPU可以配置成支持8個或者16個區域,兩級的存儲空間屬性。Cortex-M0 和 Cortex-M1不支持MPU. Cortex-M23 和 Cortex-M33也支持MPU選項,如果實現了TrustZone安全擴展(一個用于安全軟件程序,另一個用于非安全軟件程序)可以有最多兩個MPU。 4.4 單周期I/O接口 單周期I/O接口是Cortex-M0+處理器獨特的功能,這使Cortex-M0+可以很快的運行I/O控制任務。Cortex-M大多數的處理器的總線接口是基于AHB Lite或者AHB 5協議的,這些接口都是流水實現總線協議,運行在高時鐘頻率。但是,這意味著每個傳輸需要兩個時鐘周期。單時鐘周期I/O接口添加了額外的簡單的非流水線總線接口,連接到像GPIO(通用輸入輸出)這樣的一部分設備特定的外設上。結合單周期I/O和Cortex-M0+天然比較低的跳轉代價(只有兩級流水線),許多I/O控制操作都會比大多數其他微控制器架構的產品運行的更快。 5 性能考慮 5.1 通用數據處理能力 在通用微控制器市場,benchmark數據經常用來衡量微控制器的性能,表7是Cortex-M處理器常用benchmark測試的性能數據:
(來源:CoreMark.org 網站 and ARM 網站) 關于Dhrystone需要注意的是用來測試的Dhrystone是由官方源程序在沒有啟用inline and 和multi-file compilation編譯選項的情況編譯出來的(官方分數)。但是,很多微控制器廠商引用的是完全優化編譯的Dhrystone測試出來的數據。 但是,benchmark工具的性能測試數據可能無法準確反應你的應用能達到的性能。例如,單周期I/O接口和DSP應用中使用SIMD,或者Cortex-M4/M7中使用FPU的加速效果并沒有在這些測試數據中體現出來。 通常,Cortex-M3 和 Cortex-M4由于以下原因提供了更高的數據處理性能: • 更豐富的指令集 • 哈佛總線架構 • 寫緩存(單周期寫操作) • 跳轉目標的預測取指 Cortex-M33也是基于哈佛總線的架構,有豐富的指令集。但是不像Cortex-M3 和 Cortex-M4,Cortex-M33處理器流水線是重新設計的高效流水線,支持有限的指令雙發射(可以在一個時鐘周期中執行最多兩條指令)。 Cortex-M7支持更高的性能,這是因為M7擁有雙發射六級流水線并支持分支預測。而且,通過支持指令和數據Cache,和即便使用慢速內存(例如,嵌入式Flash)也能避免性能損失的緊耦合內存,來實現更高的系統級性能。 但是,某些I/O操作密集的任務在Cortex-M0+上運行更快,這是因為: • 更短的流水線(跳轉只需要兩個周期) • 單周期I/O端口 當然也有設備相關的因素。例如,系統級設計,內存的速度也會影響到系統的性能。 你自己的應用程序經常是你需要的最好的benchmark。CoreMark分數是另外一個處理器兩倍的處理器并不意味著執行你的應用也快一倍。對I/O密集操作的應用來說,設備相關的系統級架構對性能有巨大的影響。 5.2 中斷延遲 性能相關的另外一個指標是中斷延遲。這通常用從中斷請求到中斷服務程序第一條指令執行的時鐘周期數來衡量。表8列出了Cortex-M處理器在零等待內存系統條件下的中斷延遲比較。
事實上,真正的中斷延遲受到內存系統等待狀態的影響。例如,許多運行頻率超過100Mhz的微控制器搭配的是非常慢的Flash存儲器(例如30到50MHz)。雖然使用了Flash訪問加速硬件來提高性能,中斷延遲仍然受到Flash存儲系統等待狀態的影響。所以完全有可能運行在零等待內存系統Cortex-M0/M0+系統比Cortex-M3/M4/M7有更短的中斷延遲。 當評估性能的時候,不要忘記把中斷處理程序的執行時間考慮在內。某些8位或者16位處理器架構可能中斷延遲很短,但是會花費數倍的時鐘周期完成中斷處理。非常短的中斷響應時間和很短的中斷處理時間才是實際有效的。 6 調試和跟蹤特性 6.1 調試和跟蹤特性簡介 不同Cortex-M處理器之間有若干區別。總結在表9中。
Cortex-M處理器的調試架構是基于ARM CoreSight調試架構設計的,它是個非常容易擴展的架構,支持多處理器系統。 表9列出的是典型設計需要考慮的。在CoreSight架構下,調試接口和跟蹤接口模塊是和處理器分離的。因此你采用的設備的調試和跟蹤連接和表9的可能不一樣。也可能通過添加一些額外的CoreSight調試組件來增加一些調試特性。 6.2 Debug connections調試接口 調試接口可以讓調試者實現 - 訪問控制調試和跟蹤特性的寄存器。 - 訪問內存空間。對Cortex-M系列處理器,及時當處理器運行時也可以執行內存空間訪問。這被稱作實時內存訪問。 - 訪問處理器核心寄存器。這只能當處理器停止的時候才可以操作。 - 訪問Cortex-M0處理器中微跟蹤緩存(MTB)生成的跟蹤歷史記錄。 另外,調試接口也會用作: - Flash 編程 Cortex-M系列處理器可以選擇傳統的4到5個引腳(TDI, TDO, TCK, TMS 和可選的 nTRST)的JTAG接口,或者選擇新的只需要兩個引腳的串行調試協議接口,串行調試接口對有限數目引腳的設備是非常適合的。 圖 10: 串口線或者JTAG調試接口allows access to processor’s debug features and memory space including peripherals 串行線調試協議接口可以處理JTAG支持的所有特性,支持奇偶校驗。串行調試協議被ARM工具廠商廣泛的采用,許多調試適配器兩種協議都支持,串行線型號共享調試接口上TCK和TMS針腳。 6.3 跟蹤接口 跟蹤接口讓調試者可以在程序執行時實時的(很小的延時)收集程序運行的信息。收集的信息可以是Cortex-M3/M4/M7/M33支持的嵌入式跟蹤單元(ETM)生成的程序指令流信息(指令跟蹤),可以是數據跟蹤單元(DWT)生成的數據/事件/性能分析信息,或者是軟件控制數據跟蹤單元(ITM)生成的信息。 有兩種類型的跟蹤接口可用: - 跟蹤端口(Trace port)– 多個數據線加上時鐘信號線。比SWV有更高的跟蹤帶寬,可以支持SWV的所有跟蹤類型加上指令跟蹤。Cortex-M3/M4/M7或者 Cortex-M33的設備上,跟蹤端口通常有4個數據線和一個時鐘線。(圖11) - 串行監視器(SWV)– 單引腳線跟蹤接口,可以選擇性的支持數據跟蹤,事件跟蹤,性能分析和測量跟蹤。(圖 12) 圖 11: Trace port 支持指令跟蹤和其他跟蹤功能必要的帶寬 跟蹤接口提供了在處理器運行的時候獲取大量有用信息的能力。例如嵌入式跟蹤單元(ETM)可以獲取指令運行歷史記錄,數據跟蹤單元(ITM)讓軟件產生消息(例如,通過printf)并利用Trace接口獲取。另外,Cortex-M3/M4/M7/M33支持數據跟蹤單元(DWT)模塊。 - 可選的數據跟蹤:內存地址的信息(例如,地址,數據和時間戳的組合)可以在處理器訪問這個地址的時候采集 - 性能分析跟蹤:CPU在不同操作任務使用的時鐘周期數(例如,內存訪問,休眠) - 事件跟蹤:提供服務器響應的中斷/異常的運行時間和歷史 圖 12: Serial wire viewer 提供了低成本,少引腳的跟蹤方案 這些跟蹤特性被各種工具廠商廣泛采用,采集的信息也被以各種方式直觀的展現出來。例如DWT獲取的數據可以在Keil µVision調試器中以波形的方式展現出來(Keil微控制器開發工具的一部分)如圖 13所示。 Figure 13: Keil µVision 調試器的邏輯分析器 雖然Cortex-M0 和 Cortex-M0+不支持跟蹤接口,Cortex-M0+支持叫做微跟蹤緩存的特性(MTB,圖14)。MTB讓用戶分配一小塊系統SRAM作為存儲指令的緩存,通常設置為循環緩存,這樣可以抓取最新的指令執行歷史并在調試器上顯示出來。 這個MTB跟蹤特性也被Cortex-M23 and Cortex-M33支持。 圖 14: Cortex-M0+/M23/M33 的MTB提供了低成本指令跟蹤方案 7 基于Cortex-M處理器的產品開發 7.1 為什么Cortex-M系列處理器容易使用 雖然Cortex-M系列處理器有非常多的特性,但是很容易使用的。例如,差不多所有的開發都可以用像C語言這樣的高級編程語言。雖然,基于Cortex-M系列處理器產品都大不相同(例如,有不同大小的內存,不同的外設,性能和封裝等等),架構的一致性讓開發者一旦對他們其中的一塊有開發經驗,就很容易開始使用新的Cortex-M處理器。 為了實現更容易的軟件開發,更好的軟件重用性和可移植性,ARM開發了CMSIS-CORE,這兒CMSIS表示Cortex-Microcontroller Software Interface Standard,CMSIS-CORE通過一組APIs為處理器的各種特性像終端管理控制提供了一個標準的硬件抽象層(HAL), CMSIS-CORE集成在各種微處理器廠商提供的設備驅動程序庫里,被各種開發工具套件支持。 除了CMSIS-CORE, CMSIS還包含一個DSP軟件庫(CMSIS-DSP)。這個庫提供了為Cortex-M4 和 Cortex-M7優化過的各種DSP函數,當然也支持其他的Cortex-M系列處理器。CMSIS-CORE 和 CMSIS-DSP庫都是免費的,可以從GitHub (CMSIS 4, CMSIS 5)下載到,并被許多工具廠商支持。 7.2 處理器選擇 對大多數微控制器用戶來說,微控制器設備的選擇標準主要取決于成本和外設的支持情況。但是,你們中間的很多人可能是為下個芯片產品選擇處理器核心芯片設計者,這種情況下,處理器 本身會是考慮的焦點。 明顯的,在這樣的情況下,性能,芯片面積,功耗和成本會是至關重要的因素。同時,還有各種其他的因素需要考慮。例如,如果你在開發一款互聯網連接產品,你也許需要選擇有TrustZone安全擴展和MPU的處理器,這樣你可以用TrustZone保護關鍵的安全特性數據,運行某些任務在非特權級別并用MPU來保護內存空間。另一方面,如果你需要在某些方面認證你的產品,Cortex-M23, Cortex-M33, Cortex-M3, Cortex-M4 和 Cortex-M7支持的ETM生成的指令跟蹤會對代碼覆蓋率認證非常有幫助。 在其他的芯片設計領域,如果你正在設計可以運行在能量采集設備供電的小傳感器,那么Cortex-M23 和 Cortex-M0+會是最好的選擇,因為他們非常小并且做了最先進的功耗優化。 7.3 生態系統 使用ARM Cortex-M系列處理器的關鍵優勢之一是廣泛的成熟設備,開發工具鏈和軟件庫的支持。目前有 - 超過15家微控制器廠商正在銷售基于ARM Cortex-M系列內核的微控制器產品 - 超過10種開發套件支持ARM Cortex-M系列處理器 - 40多家操作系統廠商的操作系統支持Cortex-M系列處理器 這給了你大量選擇,讓你可以獲得適合目標應用的最好的設備,開發工具和中間件組合。 8 總結 性能,特性和芯片面積,功耗之間總是需要平衡。為此,ARM開發了各種Cortex-M處理器,擁有不同級別的指令集特性,性能,系統和調試特性。本文介紹了Cortex-M處理器家族各種異同。 雖然存在這差別,但架構的一致性和CMSIS-CORE標準化的APIs都讓Cortex-M系列處理器軟件有更好的移植性和可重用性。同時,Cortex-M系列處理器非常方便使用。因此,Cortex-M系列處理器很快成為微控制器市場的最受歡迎的32位處理器架構。 額外的資源 Cortex-M系列處理器產品信息可以查找https://developer.arm.com/products/processors/cortex-m 一系列有用的Cortex-M資源存在下面的網址https://community.arm.com/proces ... /cortex-m-resources 關于ARMv8-M TrustZone的其他的有用的資源可以查找ARM社區(community.arm.com)的“TrustZone for ARMv8-M Community”。ARM社區是為開發者和開發工具廠商,產品方案商之間提供的一個免費的,開放的,非正式的交流區 本文中出現的商標是ARM有限公司(或其子公司)在歐盟和/或其他地方注冊的/或未注冊的商標。保留所有權利。文中所有其他標志可能是其他所有人的商標。欲了解更多信息,請訪問arm.com/about/trademarks。 |