引言
在之前的 STM32MCU TrustZone 開(kāi)發(fā)調(diào)試技巧的系列文章中,我們已經(jīng)介紹了 ARMCM33 內(nèi)核 Trust Zone 特性,STM32MCU 的系統(tǒng)級(jí) TrustZone 架構(gòu)設(shè)計(jì),TrustZone 環(huán)境下使用外設(shè)的注意事項(xiàng),以及 HardFault 的處理和調(diào)試等內(nèi)容。我們知道在某些較為復(fù)雜的應(yīng)用中,往往還會(huì)用到 RTOS,在這個(gè)系列的最后一篇,我們將主要討論 STM32MCU 應(yīng)用程序開(kāi)發(fā)中,在 TrustZone 環(huán)境下使用 RTOS 時(shí)的情況以及相關(guān)軟件開(kāi)發(fā)的一些注意事項(xiàng),供開(kāi)發(fā)者參考。
TrustZone 環(huán)境+RTOS 的軟件架構(gòu)
通常情況下,在 TrustZone 環(huán)境中,Secure 安全側(cè)的代碼主要負(fù)責(zé)處理一些關(guān)鍵數(shù)據(jù)的操作和關(guān)鍵外設(shè)的管理和控制,而更多的業(yè)務(wù)邏輯相關(guān)的應(yīng)用程序則會(huì)運(yùn)行在 TrustZone 的Non-Secure 非安全側(cè)。軟件的開(kāi)發(fā)模式也會(huì)由原來(lái)的單一應(yīng)用程序工程變?yōu)榘踩臃前踩珒蓚€(gè)工程的聯(lián)合開(kāi)發(fā)。系統(tǒng)復(fù)位后 CPU 總是從安全工程的 reset handler 開(kāi)始運(yùn)行,安全代碼完成初始化以及系統(tǒng)的安全配置之后,調(diào)用非安全代碼的 reset handler 切換到非安全狀態(tài),繼而開(kāi)始運(yùn)行非安全側(cè)代碼,非安全代碼執(zhí)行過(guò)程中可能會(huì)調(diào)用安全側(cè)代碼提供的一些API 函數(shù)。
TrustZone 環(huán)境中 NS 非安全側(cè)使用 RTOS 的注意事項(xiàng)
首先需要注意 RTOS 的版本,比較舊的版本可能還沒(méi)包含對(duì) ARM CM33 內(nèi)核以及TrustZone 的支持。如果應(yīng)用的項(xiàng)目是從某個(gè)過(guò)去的項(xiàng)目中遷移到 STM32MCU 的新產(chǎn)品,尤其使用了 TrustZone 的時(shí)候,建議檢查原始工程中的 RTOS 版本,確認(rèn)是否已經(jīng)包含對(duì)CM33 內(nèi)核以及 TrustZone 的支持。
其次,要注意在安全和非安全工程中添加正確的 RTOS 代碼。以 FreeRTOS 為例,它的portable 代碼有多個(gè)目錄,在 TrustZone 環(huán)境中應(yīng)當(dāng)使用 ARM_CM33 目錄下的文件。
小結(jié)
本文重點(diǎn)討論了基于 ARM CM33 內(nèi)核的 STM32MCU 支持 TrustZone 的環(huán)境下使用RTOS 的一些情況,并總結(jié)了 TrustZone 環(huán)境下使用 RTOS 的一些注意事項(xiàng)。某些 RTOS如果沒(méi)有對(duì) TrustZone 的非常完整的支持,使用起來(lái)可能會(huì)有些限制,這時(shí)候應(yīng)用程序可能需要注意。例如通過(guò)添加 mutex 避免多個(gè)線(xiàn)程同時(shí)調(diào)用 S API 等。當(dāng)然這里僅僅討論了 NS側(cè)使用 RTOS 的情況,也就是 S 安全側(cè)只是提供函數(shù)由非安全側(cè)調(diào)用,本身安全側(cè)沒(méi)有調(diào)度器沒(méi)有線(xiàn)程概念,如果安全側(cè)也包含了調(diào)度器(比如 TF-M)那么配合非安全側(cè)使用RTOS 可能會(huì)是另一種情況。
本文是 STM32MCU TrustZone 開(kāi)發(fā)技巧的系列文章的最后一篇,希望對(duì)開(kāi)發(fā)者有所幫助,也歡迎大家多提寶貴意見(jiàn)。