在嵌入式應用中,有可能發生各種各樣的錯誤,系統必須能夠檢測到這些錯誤并作出適當的響應。RTOS通常內置了一些錯誤檢查功能,用于檢測錯誤并向應用提供響應錯誤的方法。
錯誤分類
開發和運行RTOS應用程序中的錯誤可以分為兩類。第一類錯誤與RTOS的配置相關,這些錯誤可以在應用程序編譯之前通過完整性檢查檢測到,稱之為配置檢查。
在使用RTOS時,通過修改配置值以滿足應用程序的需要。應用程序開發人員可以在其約束范圍修改這些值,約束限制包括硬件約束或實現約束。通過RTOS代碼中的#ifdef或#error這樣的預處理器指令可以實現配置檢查。預處理檢查在代碼編譯之前進行,檢查是否存在配置錯誤。
第二類錯誤是在應用程序運行時發生,稱為運行時錯誤。根據運行時錯誤發生的不同原因,有不同的錯誤檢測策略。本文關注第二類錯誤檢查。
運行時錯誤
運行時錯誤的原因包括傳遞給API函數的非法參數,如空指針而非有效的任務句柄,或超出給定范圍的值,可以錯誤通過API函數使用之前的參數檢查檢測。
內存損壞導致的非法或錯誤行為是另一類運行時錯誤,可以使用內存檢查算法如校驗和或奇偶校驗位檢測這些錯誤。如果只需要檢查幾個非常重要的值,可以在不同的內存地址中存儲這些值的備份(或按位翻轉的值),并在訪問該值時比較它們,這些值被稱為鏡像值。
RTOS堆棧
RTOS中的每個任務都有自己的堆棧,用于存儲本地變量、返回地址、函數參數、返回值及其上下文。因此,內核必須檢查每個堆棧是否駐留在自己內存地址,否則一個任務的堆棧內容可能被其他任務破壞。已使用堆棧的大小會隨著應用的執行不斷變化,例如函數調用深度的增加。由于物理內存空間有限,堆棧溢出可能導致內存損壞。為了防止這種錯誤,在存儲任務上下文之前,RTOS內核必須檢查堆棧的可用空間。
功能單元
RTOS應用程序中的每個任務都是一個獨立的功能單元,擁有獨立的內存空間。任務訪問與另一項任務相關聯內存也可能導致內存破壞,必須加以預防。可以使用內存保護單元為任務定義內存區域和訪問權限。如果一個任務訪問了未被授權的內存,MPU將生成一個異常,該異常將由應用程序處理。
錯誤處理
檢測到錯誤后,必須以某種方式通過應用程序處理,如何通知應用程序取決于錯誤類型以及錯誤的嚴重程度。在API函數中發出錯誤信號的一種方法是通過其返回值中的狀態碼。應用代碼應該檢查所有API函數的返回值。根據錯誤代碼,應用程序可以恢復某些錯誤。如果出現不可恢復錯誤,應用程序應將系統轉換到安全狀態。RTOS還可以調用應用定義的錯誤處理函數,在錯誤發生時實現相應處理,此方法通常用于不可恢復的錯誤,錯誤處理程序尾部是一個無限循環,該函數不會返回。
SAFERTOS中的錯誤檢查
功能安全操作系統SAFERTOS對所有傳遞給API函數的參數執行錯誤檢查。API函數返回類型為portBaseType的狀態碼,其中包含錯誤碼。通過檢查狀態碼可以確定調用是否成功。預定義錯誤代碼的列表參見文件projdefs.h。
SAFERTOS通過調用vApplicationErrorHook實現錯誤處理,該函數由應用定義,在檢測到錯誤而沒有返回錯誤碼時,內核將調用該函數。
SAFERTOS實現的一些錯誤檢查示例如下:
?檢查API函數參數是否包含有效句柄和值。
? SAFERTOS中的堆棧是預先分配的字節數組,包含正在使用的堆棧標記,防止其被多個任務訪問。
?任務控制塊包含有關堆棧限位信息,內核可以在存儲任務上下文前檢查可用的堆棧空間,防止堆棧溢出。
?使用鏡像值檢查重要的系統參數,如堆頂地址,堆棧限制,FPU使用標記和TCB中的MPU設置。滴答值和SVC處理程序地址也保存了其鏡像值。
?如果硬件包含MPU,SAFERTOS默認啟用該功能,使用它來管理多個任務可能訪問的內存區域。
麥克泰技術是SAFERTOS在中國的代理商,具有超過20年嵌入式實時操作系統的市場、服務和培訓經驗,關于SAFERTOS的更多信息,歡迎咨詢麥克泰。
-
嵌入式
+關注
關注
5086文章
19140瀏覽量
305863 -
RTOS
+關注
關注
22文章
815瀏覽量
119702 -
應用程序
+關注
關注
37文章
3277瀏覽量
57738
原文標題:RTOS中的錯誤檢查機制
文章出處:【微信號:麥克泰技術,微信公眾號:麥克泰技術】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論