3.1 編程模型
Cortex-M處理器家族的編程模型是高度一致的。例如所有的Crotex-M處理器都支持R0到R15,PSR, CONTROL 和 PRIMASK。兩個特殊的寄存器— FAULTMASK 和 BASEPRI—只有Cortex-M3, Cortex-M4, Cortex-M7 和 Cortex-M33支持;浮點寄存器組和FPSCR(浮點狀態(tài)和控制寄存器)寄存器,是Cortex-M4/M7/M33可選的浮點運算單元使用的。
圖 5: 編程模型
BASEPRI寄存器允許程序阻止指定優(yōu)先級或者低的優(yōu)先級中斷和異常。對ARMv7-M來說這是很重要的,因為Cortex-M3, Cortex-M4, Cortex-M7 和 Cortex-M33有大量的優(yōu)先級等級,而ARMv6-M 和 ARMv8-M Baseline只有有限的4個優(yōu)先等級。FAULTMASK通常用在復雜的錯誤處理上(查看章節(jié)3.4)
非特權級別的實現對ARMv6-M處理器是可選的,對ARMv7-M 和ARMv8-M處理器一直支持的。對Cortex-M0+處理器,它是可選的, Cortex-M0 and Cortex-M1不支持這個功能。這意味著在各種Cortex-M處理器的CONTROL 寄存器是稍微不同的。FPU的配置也會影響到CONTROL寄存器,如圖6所示。
圖 6: CONTROL 寄存器
另外一個編程模型之間的不同是PSR寄存器(程序狀態(tài)寄存器)的細節(jié)。所有的Cortex-M處理器,PSR寄存器都被再分成應用程序狀態(tài)寄存器(APSR),執(zhí)行程序狀態(tài)寄存器(EPSR)和中斷程序狀態(tài)寄存器(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處理器中“模式”和“狀態(tài)”的定義與Cortex-M中的也是不同的。Cortex-M只有兩個模式:線程模式(Thread)和管理者模式(Handler),并且Cortex-M處理器一直運行在Thumb狀態(tài)(不支持ARM指令)。
2.2 異常處理模型和嵌套向量中斷控制器NVIC
所有的Cortex-M處理器都包含了NVIC模塊,采用同樣的異常處理模型。如果一個異常中斷發(fā)生,它的優(yōu)先等級高于當前運行等級,并且沒有被任何的中斷屏蔽寄存器屏蔽,處理器會響應這個中斷/異常,把某些寄存器入棧到當前的堆棧上。這種堆棧機制下,中斷處理程序可以編寫為一個普通的C函數,許多小的中斷處理函數可以立即直接響應工作而不需要額外的堆棧處理花銷。
一些ARMv7-M/ARMv8-M Mainline系列的處理器使用的中斷和系統異常并不被ARMv6-M/ARMv8-M Baseline的產品支持,如圖8. 例如,Cortex-M0, M0+ 和M1的中斷數被限制在32個以下,沒有調試監(jiān)測異常,錯誤異常也只限于HardFault(錯誤處理細節(jié)請參看章節(jié)3.4)。相比之下,Cortex-M23, Cortex-M3, Cortex-M4 和Cortex-M7處理器可以支持到多達240個外圍設備中斷。Cortex-M33支持最多480個中斷。
另外一個區(qū)別是可以使用的優(yōu)先等級數量:
ARMv6-M 架構 - ARMv6-M支持2級固定的(NMI 和 HardFault)和4級可編程的(由每個優(yōu)先等級寄存器的兩個位表示)中斷/異常優(yōu)先級。這對大多數的微控制器應用來說足夠了。
ARMv7-M 架構 - ARMv7-M系列處理器的可編程優(yōu)先級等級數范圍,根據面積的限制,可以配置成8級(3位)到256級(8位)。ARMv7-M處理器還有一個叫做中斷優(yōu)先級分組的功能,可以把中斷優(yōu)先級寄存器再進一步分為組優(yōu)先級和子優(yōu)先級,這樣可以詳細地制定搶占式優(yōu)先級的行為。
ARMv8-M Baseline – 類似 ARMv6-M,M23也有2位的優(yōu)先級等級寄存器。借助可選的TrustZone安全擴展組件,安全軟件可以把非安全環(huán)境中的中斷的優(yōu)先等級轉換到優(yōu)先等級區(qū)間的下半區(qū),這就保證了安全環(huán)境中的某些中斷/異常總是比非安全環(huán)境中的優(yōu)先級要高。
ARMv8-M Mainline – 類似于 ARMv7-M。 可以支持8到256個中斷優(yōu)先等級和中斷優(yōu)先級分組。還支持ARMv8-M Baseline具有的優(yōu)先等級調整功能。
圖 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來實現動態(tài)改變異常處理函數入口點
· 重定位向量表到SRAM來實現更快的向量讀?。ㄈ绻鹒lash存儲器很慢)
· 重定位向量表到ROM不同位置(或者Flash),不同的程序運行階段可以有不同的異常處理程序
不同的Cortex-M處理器之間的NVIC編程模型也有額外的不同。差異點總結在表 5中:
表 5: NVIC 編程模型和特性差異
大部分情況下,對NVIC的中斷控制特性的操作都是通過CMSIS-CORE提供的APIs處理的,他們在微控制器廠商提供的設備驅動程序庫里。對Cortex-M3/M4/M7/M23/M33處理器,即使中斷被使能了,它的優(yōu)先級也可以被改變。ARMv6-M處理器不支持動態(tài)優(yōu)先等級調整,當你需要改變中斷優(yōu)先等級是,需要暫時的關掉這個中斷。
3.3操作系統支持特性
Cortex-M處理器架構在設計時就考慮到了操作系統的支持。針對操作系統的特性有:
影子堆棧指針
系統服務調用(SVC)和可掛起系統調用(PenSV)異常
SysTick – 24位遞減計時器,為操作系統的計時和任務管理產生周期性的異常中斷
Cortex-M0+/M3/M4/M7/M23/M33支持的非特權執(zhí)行和存儲保護單元(MPU)
系統服務調用(SVC)異常由SVC指令觸發(fā),他可以讓運行在非特權狀態(tài)的應用任務啟動特權級的操作系統服務??蓲炱鹣到y調用異常在操作系統中像上下文切換這樣的非關鍵操作的調度非常有幫助。
為了能把Cortex-M1放到很小的FPGA器件中,所有用來支持操作系統的特性對Cortex-M1都是可選的。對Cortex-M0, Cortex-M0+ 和Cortex-M23處理器,系統時鐘SysTick是可選的。
通常,所有的Cortex-M處理器都支持操作系統。執(zhí)行在Cortex-M0+, Cortex-M3, Cortex-M4, Cortex-M7, Cortex-M23 和 Cortex-M33的應用可以運行在非特權運行狀態(tài),并且可以同時利用可選的存儲器管理單元(MPU)以避免內存非法訪問。這可以增強系統的魯棒性。
3.4TrustZone安全擴展
近幾年來, 物聯網(IoT)成為了嵌入式系統開發(fā)者們的熱門話題。IoT系統產品變得更加復雜,上市時間的壓力也與日俱增。嵌入式系統產品需要更好的方案來保證系統的安全,但是同時又要方便軟件開發(fā)者開發(fā)。傳統的方案是通過把軟件分成特權和非特權兩部分解決的,特權級軟件利用MPU防止非特權的應用訪問包含安全敏感信息在內的的關鍵的系統資源。這種方案對一些IoT系統非常適合,但是在一些情況下,只有兩層劃分是不夠的。特別是那些包含很多復雜特權級別的軟件組件的系統,特權級的代碼的一個缺陷就可以導致黑客徹底的控制這個系統
ARMv8-M架構包含了一個叫做TrustZone的安全擴展,TrustZone導入了安全和非安全狀態(tài)的正交劃分。
普通應用是非安全態(tài)
軟件組件和安全相關的資源(例如,安全存儲,加密加速器,正隨機數發(fā)生器(TRNG))處在安全狀態(tài)。
圖 9: 安全狀態(tài)和非安全狀態(tài)的隔離
非安全狀態(tài)的軟件只能訪問非安全狀態(tài)的存儲空間和外圍設備,安全軟件可以訪問兩種狀態(tài)下的所有資源。
用這種方案,軟件開發(fā)者可以用以往的方式開發(fā)非安全環(huán)境下的應用程序。同時,他們可以借助芯片廠商提供的安全通訊軟件庫執(zhí)行安全物聯網連接。并且即使運行在非安全環(huán)境的特權級的程序有漏洞,TrustZone安全機制可以阻止黑客控制整個設備,限制了攻擊的影響,還可以實現系統遠程恢復。此外,ARMv8-M架構也引入了堆棧邊界檢查和增強的MPU設計,促使額外安全措施的采用。
安全架構定義也擴展到了系統級別,每個中斷都可以被設置為安全或者非安全屬性。中斷異常處理程序也會自動保存和恢復安全環(huán)境中的寄存器數據以防止安全信息泄露。所以,TrustZone安全擴展讓系統能夠支持實時系統的需求,為IoT應用提供了堅實的安全基礎,并且容易讓軟件開發(fā)在此技術上開發(fā)應用程序。
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處理器和其他架構的微控制器的一個區(qū)別是錯誤處理能力。當錯誤被檢測到時,一個錯誤異常處理程序被觸發(fā)去執(zhí)行恰當的處理。觸發(fā)錯誤的情況可能是:
未定義的指令(例如,Flash存儲器損壞)
訪問非法地址空間(例如,堆棧指針崩潰)或者MPU非法訪問
非法操作(例如,當處理器已經在優(yōu)先級高于SVC的中斷中試圖觸發(fā)SVC異常)
錯誤處理機制使嵌入式系統能夠更快的響應各種問題。否則,如果系統死機了,看門狗定時需要非常長的時間重啟系統。
ARMv6-M架構中,所有的錯誤事件都會觸發(fā)HardFault處理程序,它的優(yōu)先級是-1(優(yōu)先級比所有的可編程異常都高,但是僅低于非屏蔽中斷NMI)。 所有的錯誤事件都被認為是不可恢復的,通常我們在HardFault處理程序中僅運行錯誤報告然后進一步觸發(fā)自動復位。
ARMv8-M Baseline架構和ARMv6-M類似,只有一個錯誤異常(HardFault)。但是ARMv8-M Baseline的HardFault優(yōu)先級可以是-1或者當實現了TrustZone安全擴展時優(yōu)先級是-3.
ARMv7-M 和 ARMv8-M Mainline產品除了HardFault還有幾個可配置的錯誤異常:
· Memmanage(內存管理錯誤)
· 總線錯誤(總線返回錯誤的響應)
· 用法錯誤(未定義指令或者其他的非法操作)
· SecureFault(只用ARMv8-M Mainline產品支持,處理TrustZone安全擴展中的安全非法操作)
這些異常的優(yōu)先級可以編程改變,可以單獨的打開和關掉。如果需要,它們也可以利用FAULTMASK寄存器把它們的優(yōu)先級提高到和HardFault相同的級別。ARMv7-M 和 ARMv8-M Mainline產品還有幾個錯誤狀態(tài)寄存器可以提供關于觸發(fā)錯誤異常事件的線索和錯誤地址的寄存器,用來確定觸發(fā)這個錯誤異常的訪問地址,使調試更加容易。
ARMv7-M 和 ARMv8-M Mainline產品子規(guī)范中額外的錯誤處理程序提供了靈活的錯誤處理能力,錯誤狀態(tài)寄存器讓錯誤事件的定位和調試更加容易。很多商業(yè)開發(fā)套件中的調試器已經內嵌了使用錯誤狀態(tài)寄存器來診斷錯誤事件的功能。此外,錯誤處理程序可以在運行時做一些修復工作。
表 6: 錯誤處理特性比較總結