【轉貼】一文看懂ARM Cortex-M處理器

ARM Cortex-M處理器家族如今有8款處理器成員。在本文中,咱們會比較Cortex-M系列處理器之間的產品特性,重點講述如何根據產品應用選擇正確的Cortex-M處理器。本文中會詳細的對照Cortex-M 系列處理器的指令集和高級中斷處理能力,以及 SoC系統級特性,調試和追蹤功能和性能的比較。
  一、簡介
  今天, ARM Cortex-M 處理器家族有8款處理器成員。除此以外,ARM的產品系列還有不少其餘的處理器成員。對不少初學者,甚至某些芯片設計經驗豐富可是不熟悉ARM系列處理器的設計者來講,也是很容易混淆這些產品的。不一樣的ARM 處理器有不一樣的指令集,系統功能和性能。本文會深刻展示Cortex-M系列處理器之間的關鍵區別,以及它們和ARM其餘系列處理器的不一樣。
  1.1ARM處理器家族
  多年來, 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 微控制器處理器在單片機和深度嵌入式系統市場很是成功和受歡迎。html


  圖 1: 處理器家族編程


  表1總結了三個處理器系列的主要特徵。緩存


  表 1: 處理器特性總結安全


  1.2Cortex-M 處理器家族
  Cortex-M處理器家族更多的集中在低性能端,可是這些處理器相比於許多微控制器使用的傳統處理器性能仍然很強大。例如,Cortex-M4和Cortex-M7處理器應用在許多高性能的微控制器產品中,最大的時鐘頻率能夠達到400Mhz。
  固然,性能不是選擇處理器的惟一指標。在許多應用中,低功耗和成本是關鍵的選擇指標。所以,Cortex-M處理器家族包含各類產品來知足不一樣的需求:服務器

  表 2: 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.3Cortex-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處理器間的異同點會在本文的其他部分講解。
  二、Cortex-M處理器指令集
  2.1指令集簡介
  大多數狀況下,應用程序代碼能夠用C或其餘高級語言編寫。可是,對Cortex-M 處理器支持指令集的基本瞭解有助於開發者針對具體應用選擇合適的Cortex-M處理器。指令集(ISA)是處理器架構的一部分,Cortex-M處理器能夠分爲幾個架構規範。工具


  表 3: Cortex-M 處理器ARM架構規範的規範post


  全部的Cortex-M 處理器都支持Thumb指令集。整套Thumb指令集擴展到Thumb-2版本時變得至關大。可是,不一樣的Cortex-M處理器支持不一樣的Thumb 指令集的子集,如圖3所示


  圖 3: Cortex-M 處理器的指令集

  2.2Cortex-M0/M0+/M1指令集
  Cortex-M0/M0+/M1處理器基於ARMv6-M架構。這是一個只支持56條指令的小指令集,大部分指令是16位指令,如圖3所示只佔很小的一部分。可是,此類處理器中的寄存器和處理的數據長度是32位的。對於大多數簡單的I/O控制任務和普通的數據處理,這些指令已經足夠了。這麼小的指令集能夠用不多的電路門數來實現處理器設計,Cortex-M0 和 Cortex-M0+最小配置僅僅12K門。
  然而,其中的不少指令沒法使用高位寄存器(R8 到R12), 而且生成當即數的能力有限。這是平衡了超低功耗和性能需求的結果。
  2.3Cortex-M3指令集
  Cortex-M3處理器是基於ARMv7-M架構的處理器,支持更豐富的指令集,包括許多32位指令,這些指令能夠高效的使用高位寄存器。另外,M3還支持:
  查表跳轉指令和條件執行(使用IT指令)
  硬件除法指令
  乘加指令(MAC)
  各類位操做指令
  更豐富的指令集經過幾種途徑來加強性能;例如,32位Thumb指令支持了更大範圍的當即數,跳轉偏移和內存數據範圍的地址偏移。支持基本的DSP操做(例如,支持若干條須要多個時鐘週期執行的MAC指令,還有飽和運算指令)。最後,這些32位指令容許用單個指令對多個數據一塊兒作桶型移位操做。
  支持更豐富的指令致使了更大的面積成本和更高的功耗。典型的微控制器,Cortex-M3的電路門數是Cortex-M0 和 Cortex-M0+兩倍還多。可是,處理器的面積只是大多數現代微控制器的很小的一部分,多出來的面積和功耗常常不那麼重要。
  2.4Cortex-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


   在某些DSP運算中,使用SIMD能夠加速更快計算16位和8位數據,由於這些運算能夠並行處理。可是,通常的編程中,C編譯器並不能充分利用SIMD運算能力。這是爲何Cortex-M3 和 Cortex-M4典型benchmark的分數差很少。然而,Cortex-M4的內部數據通路和Cortex-M3的不一樣,某些狀況下Cortex-M4能夠處理的更快(例如,單週期MAC,能夠在一個週期中寫回到兩個寄存器)。
  2.5Cortex-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.6Cortex-M23指令集
  Cortex-M23的指令集是基於ARMv8-M的Baseline子規範,它是ARMv6-M的超集。擴展的指令包括:
  硬件除法指令
  比較和跳轉指令,32位跳轉指令
  支持TrustZone安全擴展的指令
  互斥數據訪問指令(一般用於信號量操做)
  16位當即數生成指令
  載入獲取及存儲釋放指令(支持C11)
  在某些狀況下,這些加強的指令集能夠提升處理器性能,而且對包含多個處理器的SoC設計有用(例如,互斥訪問對多處理器的信號量處理有幫助)
  2.7I 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可是沒有配置浮點運算單元的產品。在這種狀況下,當程序中使用了浮點數,編譯工具包會在連接階段插入須要的運行軟件庫。軟件模式的浮點運算須要更長的運行時間,而且會略微的增長代碼大小。可是,若是浮點運算不是頻繁使用的,這種方案是適合這種應用的。
  三、架構特性
  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中:


  表 5: NVIC 編程模型和特性差別

  大部分狀況下,對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.4TrustZone安全擴展
  近幾年來, 物聯網(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產品子規範中額外的錯誤處理程序提供了靈活的錯誤處理能力,錯誤狀態寄存器讓錯誤事件的定位和調試更加容易。不少商業開發套件中的調試器已經內嵌了使用錯誤狀態寄存器來診斷錯誤事件的功能。此外,錯誤處理程序能夠在運行時作一些修復工做。


  表 6: 錯誤處理特性比較總結


  四、系統特性
  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.2Bit-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.1通用數據處理能力
  在通用微控制器市場,benchmark數據常常用來衡量微控制器的性能,表7是Cortex-M處理器經常使用benchmark測試的性能數據:


  表 7: Cortex-M處理器經常使用benchmakr的性能分數(: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處理器在零等待內存系統條件下的中斷延遲比較。


  表 8: 零等待內存系統條件下的中斷延遲比較


  事實上,真正的中斷延遲受到內存系統等待狀態的影響。例如,許多運行頻率超過100Mhz的微控制器搭配的是很是慢的Flash存儲器(例如30到50MHz)。雖然使用了Flash訪問加速硬件來提升性能,中斷延遲仍然受到Flash存儲系統等待狀態的影響。因此徹底有可能運行在零等待內存系統Cortex-M0/M0+系統比Cortex-M3/M4/M7有更短的中斷延遲。
  當評估性能的時候,不要忘記把中斷處理程序的執行時間考慮在內。某些8位或者16位處理器架構可能中斷延遲很短,可是會花費數倍的時鐘週期完成中斷處理。很是短的中斷響應時間和很短的中斷處理時間纔是實際有效的。
  六、調試和跟蹤特性
  6.1調試和跟蹤特性簡介
  不一樣Cortex-M處理器之間有若干區別。總結在表9中。


  表9: 調試和跟蹤特性比較


  Cortex-M處理器的調試架構是基於ARM CoreSight調試架構設計的,它是個很是容易擴展的架構,支持多處理器系統。
  表9列出的是典型設計須要考慮的。在CoreSight架構下,調試接口和跟蹤接口模塊是和處理器分離的。所以你採用的設備的調試和跟蹤鏈接和表9的可能不同。也可能經過添加一些額外的CoreSight調試組件來增長一些調試特性。
  6.2Debug 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提供了低成本指令跟蹤方案


  七、基於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系列處理器
  這給了你大量選擇,讓你能夠得到適合目標應用的最好的設備,開發工具和中間件組合。
  八、總結  性能,特性和芯片面積,功耗之間老是須要平衡。爲此,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/processors/b/blog/posts/cortex-m-resources  關於ARMv8-M TrustZone的其餘的有用的資源能夠查找ARM社區(community.arm.com)的「TrustZone for ARMv8-M Community」。ARM社區是爲開發者和開發工具廠商,產品方案商之間提供的一個免費的,開放的,非正式的交流區  本文中出現的商標是ARM有限公司(或其子公司)在歐盟和/或其餘地方註冊的/或未註冊的商標。保留全部權利。文中全部其餘標誌多是其餘全部人的商標。欲瞭解更多信息,請訪問arm.com/about/trademarks。

相關文章
相關標籤/搜索