內容提要
引言
1. 系列MCU的MPU模塊功能介紹
1.1 系列MCU的MPU模塊管理的邏輯總線 ID和Slave分配
1.2 系列MCU的MPU功能特性
2. MPU模塊寄存器介紹
2.1 控制與錯誤狀態寄存器(CESR)
2.2 錯誤地址寄存器(EAR0 - EAR4)
2.3 錯誤詳細詳細寄存器(EDR0 - EDR4)
2.5 區域描述符配置字寄存器的復位值與MPU的默認配置
3. 系列MCU MPU模塊的功能詳解
3.1 命中認定(Hit )
3.2 權限違規認定( )
4. 系列MCU的MPU的SDK使用和配置注意事項
4. 1 S32K SDK中的MPU配置組件介紹
4. 2 S32K SDK中的MPU配置組件使用Tips和MPU配置注意事項
總結
引言
隨著嵌入式系統功能的增加和日益復雜,基于MCU的嵌入式系統也越來越多的使用實時操作系統(RTOS)來管理多任務。這些系統必須提供一種機制來保證正在運行的任務不破壞其他任務的操作。即要防止系統資源和其他一些任務不受非法訪問。嵌入式系統有專門的硬件來檢測和限制系統資源的訪問。從而,保證系統資源的所有權,任務需要遵守一組由操作環境定義的、由硬件維護的規則,在硬件級上授予監視和控制資源程序的特殊權限。受保護系統主動防止一個任務使用其他任務的資源。因此使用硬件主動監視系統比協調加強的軟件方案,能夠提供更好的保護。
MPU-- Unit,內存保護單元正是使用ARM M系列內核的MCU中常備的有效保護系統資源硬件的一種,用于提供了內存區域保護功能。
本文就以NXP的系列汽車級MCU的MPU為例,給大家講講典型的MPU的工作原理和配置方法以及具體工程實踐中MPU配置的注意事項。
1. 系列MCU的MPU模塊功能介紹
在系列MCU中,作為MCU的安全機制之一,MPU模塊并未使用ARM官方版本僅支持對CPU內核存儲器訪問權限管理的MPU IP,而是使用的NXP公司自己的系統MPU IP,以控制/保護總線矩陣對存儲器映射地址區域的訪問權限。 其能夠提供總線互聯矩陣級別的存儲器保護功能, 可以對每個 (CPU內核、調試器接口、DMA和ENET)都可以配置其對每個保護存儲器(作為 slave)區域的不同訪問權限。
系列MCU的功能框圖:
系列MCU的功能框圖:
1.1 系列MCU的MPU模塊管理的邏輯總線 ID和Slave分配
系列MCU的MPU模塊管理的邏輯總線 ID分配如下表,其中只有CPU Core和控制器有PID( ID),并具有所有的訪問類型權限:
系列MCU的MPU模塊管理的邏輯總線Slave端口分配如下表(其中系列MCU其內核為CM4F,對SRAM的訪問占用3個Slave端口,其中內核Code bus和 bus對SRAM的訪問雖然未經過總線矩陣,但依然受MPU模塊監測和管理,另外還有一個總線矩陣slave端口分配給僅有的QSPI模塊AHB方式讀取數據訪問;而系列MCU只有兩個slave端口用于Flash和SRAM訪問):
1.2 系列MCU的MPU功能特性
系列MCU的MPU具有如下功能特性:
在單個區域描述符字中可定義兩個訪問控制權限
2. MPU模塊寄存器介紹
系列MCU的MPU模塊由若干成對的訪問評估宏( Macro)和區域描述符( )的二維連接矩陣組成,其簡化的功能框圖如下:
系列MCU的MPU模塊通過區域描述進行配置,各part 具有的區域描述數量如下表(其中有16個區域描述符和5個slave端口--增加QSPI訪問端口):
Tips:由于CESR寄存器的復位值最低位(VLD--MPU全局使能)為1,所以每次MCU復位后,默認MPU模塊是使能的;
所有MPU區域描述符的配置都通過寄存器實現,下面,我就為大家詳細介紹一下MPU模塊的配置寄存器。
2.1 控制與錯誤狀態寄存器(CESR)
該寄存器的最高5位--~4為寫1清零(W1C)的錯誤狀態寄存器,對應與MPU模塊管理的5個 總線矩陣的slave端口是否存在訪問錯誤;
NSP和NRGD為只讀位,用于標識該MCU的MPU模塊能夠管理的Salve端口數量和擁有的區域描述符數量應用程序并行配置錯誤,具體part 不同;
其最低位--VLD,為MPU全局使能控制位,若VLD=0,MPU關閉,運行所有的總線矩陣訪問,復位后該位為1,所以默認MPU時使能的:
2.2 錯誤地址寄存器(EAR0 - EAR4)
當MPU模塊檢查到當前訪問Slave端口n時發生了訪問違規錯誤時應用程序并行配置錯誤,則將其訪問目的地址捕獲保存在相應的錯誤地址寄存器(EARn)中,并將CESR[]置1,該寄存器為只讀寄存器, 若發生了多次錯誤,其僅保存最后一次錯誤發生時的訪問地址:
2.3 錯誤詳細詳細寄存器(EDR0 - EDR4)
該只讀寄存器組提供了訪問Slave端口n時,發生訪問錯誤的具體細節信息,主要包括:
EACD[15:0]:每一個bit位對于一個區域描述符是否存在訪問錯誤:
EPID:記錄引起錯誤的處理ID(PID);
EMN:記錄引起錯誤的 ID;
EATTR:記錄錯誤屬性()。 CPU內核User/模式下的指令()訪問/數據(Data)訪問;
ERW:記錄錯誤訪問類型--讀(0) or 寫(1);
2.4 區域描述符配置字寄存器( -
RDx)
其中配置字0寄存器()定義該區域描述符定義的訪問規則適用的存儲器映射起始地址,而配置字1寄存器()定義該區域描述符定義的訪問規則適用的存儲器映射結束地址:
①配置字0寄存器()定義
②配置字1寄存器()定義
③配置字2寄存器()定義
其中定義了具體區域描述符約束地址空間總線 4~7的讀寫是否允許(M4RE~M7RE,置1允許讀;M4WE~M7WE,置1允許寫;)、 0~3在模式下的訪問控制(M0SM~M3SM)和在User模式下的訪問控制(M0UM~M3UM)以及~1的處理識別號(PID)檢查是否使能(M0PE~M1PE):
④配置字3寄存器()定義
該寄存器定義該區域描述符是否使能MPU對總線進行PID檢查(PID指定命中所需的處理ID,[7:0]--其每個位對應一個總線, 置1時屏蔽該總線的PID檢查)以及該區域描述符是否正確可用(VLD);
2.5 區域描述符配置字寄存器的復位值與MPU的默認配置
從系列MCU的參考手冊--S32K-RM.pdf中,可用查到,MPU的區域描述配置字寄存器復位值如下:
區域描述符
配置寄存器
復位值
意義
0
區域起始地址為
區域結束地址為
允許所有總線 在和User模式下對Slave的訪問權限和PID檢查
使能該區域描述符,即該訪問規則有效
n=1~15()/ 1~7()
區域起始地址為
區域結束地址為(無意義,地位保留1對齊作用)
禁止一切訪問
該描述符無效
如上一小節介紹,其包含32/64個32-bit寄存器,4個寄存器為一組分為8/16組,分別配置一個區域描述符--也就是一條總線與slave的訪問規則。每一個區域描述符可用單獨使能(通過配置字3寄存器的正確位([VLD])),除此之外,還有一個全局使能控制位(CESR[LVD])。
由于復位后CESR[LVD]=1,所以系列MCU的MPU默認是全局使能的,而區域描述符0也是使能,所以MCU復位后MPU的默認配置是允許所有總線 在和User模式下對Slave的訪問權限和PID檢查。
3. 系列MCU MPU模塊的功能詳解
MPU模塊的訪問權限控制邏輯主要由其訪問宏模塊( macro)完成,其功能框圖如下:
每一次總線訪問都將與所有有效的MPU區域描述描述符規則進行邏輯判斷,這個邏輯判斷過程是并行同時進行的,每一次邏輯判斷包括命中認定和權限違規認定兩步:
3.1 命中認定(Hit )
[]指定起始地址,[]指定結束地址,[VLD]是正確位;如果當前總線訪問的地址addr[31:5]滿足以下邏輯運算時,稱作區域命中():
= ((addr[31:5] >= []) & (addr[31:5] 選擇 即可打開其幫助手冊:
4. 2 S32K SDK中的MPU配置組件使用Tips和MPU配置注意事項
以下結合具體的應用工程實踐,給出了幾個S32K SDK中的MPU配置組件使用Tips和MPU配置注意事項,希望對大家有所幫助:
①如果在User --> 已經勾選了 (默認勾選),則在調用MPU初始化函數(()/)后,該區域描述符訪問規則即有效,否則還需要調用MPU的區域使能函數(()/)將其使能才起作用;
②在SDK中,其默認是按照參考手冊復位值使能了區域描述符0的,即~的整個4G地址映射空間都是運行允許總線的所以類型訪問的,最重要的是在SDK配置中, 0的使能控制,起始地址和結束地址以及 (/g0)配置都是不能修改的:
按照MPU的區域描述符訪問規則檢查的疊加()特性,必須將其配置為不允許所有類型訪問,然后再設置單獨的區域地址進行不同的訪問權限配置才可以起作用,否則,所有通過其他配置的區域描述符規則都將不起作用:
③在配置的fig選擇時,不能將應用程序代碼運行的地址空間(Flash/RAM)配置禁止讀(r)和執行(x)--即"---"/"-w-"/"-wx"/"rw-"否則使能MPU配置之后,CPU將復位,因為其無法繼續執行代碼也不能進行取中斷向量進入CPU內核異常;
④MPU屬性系統級的安全模塊,其為提供外設模塊級的中斷處理機制,一旦出現區域描述符訪問違規,將觸發CPU內核系統異常,具體到系列MCU中,將進入ARM M0+/M4F的硬件錯誤異常()。在其中在調用獲取訪問錯誤詳細信息API--()讀取MPU中相關的錯地址和狀態信息寄存器值,如下為,我做的一個測試代碼,禁止CPU內核對~的4KB SRAM寫(w)訪問權限,然后再向其中的全局變量寫入值時發生了如下異常,進入到()中:
通過配置區域描述符1控制~的4KB SRAM選擇作為其 right配置:
而在配置中設置CPU內核的訪問權限為只讀("r--"),禁止寫操作:
⑤默認的S32DS 系列MCU的應用工程的CPU內核異常處理函數(ISR)與其他未處理的外設中斷都使用相同的默認ISR函數--,其中為一個跳轉匯編指令(b--)實現的死循環:
.align 1
.
.weak
.type , %
:
b
.size , . -
Tips:在應用工程的啟動匯編文件--.S中異常的處理函數--定義如下:
然后再通過.set匯編原語實現匯編宏到的映射:
/* Macro to .
* will be weak and just dead loops. They can be
* by other */
.macro
.weak \
.set \,
.endm
/* */
為了識別異常,用戶需要定義自己的異常處理函數,由于在啟動匯編文件中使用了.weak匯編原語來定義,所以允許用戶重載().
因此,添加用戶自定義的方法十分簡單--在任意.c文件中重新定義即可:
總結
本文詳細介紹了系列MCU的MPU模塊工作原理和配置方法,通過區域描述符配置的方法實現對特定地址映射區域系統資源(比如RAM和NVM存儲器以及外設控制與配置寄存器的讀寫和可執行代碼許可)的訪問權限控制,從而保證多任務系統軟件的安全高效工作。
好消息:以后本公眾號的所有原創文章,公眾號發布后只要滿足以下3個條件之一(單篇):
1)打賞總金額超過;