在嵌入式應(yīng)用中,有可能發(fā)生各種各樣的錯誤,系統(tǒng)必須能夠檢測到這些錯誤并作出適當(dāng)?shù)捻憫?yīng)。RTOS通常內(nèi)置了一些錯誤檢查功能,用于檢測錯誤并向應(yīng)用提供響應(yīng)錯誤的方法。
錯誤分類
開發(fā)和運行RTOS應(yīng)用程序中的錯誤可以分為兩類。第一類錯誤與RTOS的配置相關(guān),這些錯誤可以在應(yīng)用程序編譯之前通過完整性檢查檢測到,稱之為配置檢查。
在使用RTOS時,通過修改配置值以滿足應(yīng)用程序的需要。應(yīng)用程序開發(fā)人員可以在其約束范圍修改這些值,約束限制包括硬件約束或?qū)崿F(xiàn)約束。通過RTOS代碼中的#ifdef或#error這樣的預(yù)處理器指令可以實現(xiàn)配置檢查。預(yù)處理檢查在代碼編譯之前進(jìn)行,檢查是否存在配置錯誤。
第二類錯誤是在應(yīng)用程序運行時發(fā)生,稱為運行時錯誤。根據(jù)運行時錯誤發(fā)生的不同原因,有不同的錯誤檢測策略。本文關(guān)注第二類錯誤檢查。
運行時錯誤
運行時錯誤的原因包括傳遞給API函數(shù)的非法參數(shù),如空指針而非有效的任務(wù)句柄,或超出給定范圍的值,可以錯誤通過API函數(shù)使用之前的參數(shù)檢查檢測。
內(nèi)存損壞導(dǎo)致的非法或錯誤行為是另一類運行時錯誤,可以使用內(nèi)存檢查算法如校驗和或奇偶校驗位檢測這些錯誤。如果只需要檢查幾個非常重要的值,可以在不同的內(nèi)存地址中存儲這些值的備份(或按位翻轉(zhuǎn)的值),并在訪問該值時比較它們,這些值被稱為鏡像值。
RTOS堆棧
RTOS中的每個任務(wù)都有自己的堆棧,用于存儲本地變量、返回地址、函數(shù)參數(shù)、返回值及其上下文。因此,內(nèi)核必須檢查每個堆棧是否駐留在自己內(nèi)存地址,否則一個任務(wù)的堆棧內(nèi)容可能被其他任務(wù)破壞。已使用堆棧的大小會隨著應(yīng)用的執(zhí)行不斷變化,例如函數(shù)調(diào)用深度的增加。由于物理內(nèi)存空間有限,堆棧溢出可能導(dǎo)致內(nèi)存損壞。為了防止這種錯誤,在存儲任務(wù)上下文之前,RTOS內(nèi)核必須檢查堆棧的可用空間。
功能單元
RTOS應(yīng)用程序中的每個任務(wù)都是一個獨立的功能單元,擁有獨立的內(nèi)存空間。任務(wù)訪問與另一項任務(wù)相關(guān)聯(lián)內(nèi)存也可能導(dǎo)致內(nèi)存破壞,必須加以預(yù)防。可以使用內(nèi)存保護(hù)單元為任務(wù)定義內(nèi)存區(qū)域和訪問權(quán)限。如果一個任務(wù)訪問了未被授權(quán)的內(nèi)存,MPU將生成一個異常,該異常將由應(yīng)用程序處理。
錯誤處理
檢測到錯誤后,必須以某種方式通過應(yīng)用程序處理,如何通知應(yīng)用程序取決于錯誤類型以及錯誤的嚴(yán)重程度。在API函數(shù)中發(fā)出錯誤信號的一種方法是通過其返回值中的狀態(tài)碼。應(yīng)用代碼應(yīng)該檢查所有API函數(shù)的返回值。根據(jù)錯誤代碼,應(yīng)用程序可以恢復(fù)某些錯誤。如果出現(xiàn)不可恢復(fù)錯誤,應(yīng)用程序應(yīng)將系統(tǒng)轉(zhuǎn)換到安全狀態(tài)。RTOS還可以調(diào)用應(yīng)用定義的錯誤處理函數(shù),在錯誤發(fā)生時實現(xiàn)相應(yīng)處理,此方法通常用于不可恢復(fù)的錯誤,錯誤處理程序尾部是一個無限循環(huán),該函數(shù)不會返回。
SAFERTOS中的錯誤檢查
功能安全操作系統(tǒng)SAFERTOS對所有傳遞給API函數(shù)的參數(shù)執(zhí)行錯誤檢查。API函數(shù)返回類型為portBaseType的狀態(tài)碼,其中包含錯誤碼。通過檢查狀態(tài)碼可以確定調(diào)用是否成功。預(yù)定義錯誤代碼的列表參見文件projdefs.h。
SAFERTOS通過調(diào)用vApplicationErrorHook實現(xiàn)錯誤處理,該函數(shù)由應(yīng)用定義,在檢測到錯誤而沒有返回錯誤碼時,內(nèi)核將調(diào)用該函數(shù)。
SAFERTOS實現(xiàn)的一些錯誤檢查示例如下:
?檢查API函數(shù)參數(shù)是否包含有效句柄和值。
? SAFERTOS中的堆棧是預(yù)先分配的字節(jié)數(shù)組,包含正在使用的堆棧標(biāo)記,防止其被多個任務(wù)訪問。
?任務(wù)控制塊包含有關(guān)堆棧限位信息,內(nèi)核可以在存儲任務(wù)上下文前檢查可用的堆棧空間,防止堆棧溢出。
?使用鏡像值檢查重要的系統(tǒng)參數(shù),如堆頂?shù)刂罚褩O拗疲現(xiàn)PU使用標(biāo)記和TCB中的MPU設(shè)置。滴答值和SVC處理程序地址也保存了其鏡像值。
?如果硬件包含MPU,SAFERTOS默認(rèn)啟用該功能,使用它來管理多個任務(wù)可能訪問的內(nèi)存區(qū)域。
麥克泰技術(shù)是SAFERTOS在中國的代理商,具有超過20年嵌入式實時操作系統(tǒng)的市場、服務(wù)和培訓(xùn)經(jīng)驗,關(guān)于SAFERTOS的更多信息,歡迎咨詢麥克泰。
-
嵌入式
+關(guān)注
關(guān)注
5141文章
19526瀏覽量
314861 -
RTOS
+關(guān)注
關(guān)注
24文章
840瀏覽量
120752 -
應(yīng)用程序
+關(guān)注
關(guān)注
38文章
3322瀏覽量
58719
原文標(biāo)題:RTOS中的錯誤檢查機(jī)制
文章出處:【微信號:麥克泰技術(shù),微信公眾號:麥克泰技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
Rust語言中錯誤處理的機(jī)制
RTOS的多任務(wù)機(jī)制應(yīng)用演示
如何檢查代碼中的潛在錯誤?
INtime RTOS內(nèi)部的關(guān)鍵處理機(jī)制是什么
漢明(Hamming)錯誤修正檢查碼
PCIe掃盲—PCIe錯誤檢測機(jī)制的詳細(xì)資料概述
Altium顯示DRC錯誤的檢查方法
Modbus協(xié)議的介紹和應(yīng)用及錯誤檢查方法的資料說明

PCIe錯誤報告的兩種機(jī)制詳解

哪些工具可以可以發(fā)現(xiàn)基于RTOS的程序錯誤?

如何處理RTOS錯誤和超時

使用專門的RTOS工具發(fā)現(xiàn)實時錯誤

如何使用數(shù)據(jù)包錯誤檢查來保護(hù)您的溫度讀數(shù)

RTOS消息隊列的應(yīng)用

如何驗證CAN控制器的錯誤響應(yīng)機(jī)制?

評論