2021-12-04 10:28:18|已瀏覽:371次
嵌入式產(chǎn)品的可靠性自然與硬件密不可分,但在硬件確定、并且沒有第三方測試的前提下,使用防御性編程思想寫出的代碼,往往具有更高的穩(wěn)定性。防御性編程首先需要認(rèn)清C語言的種種缺陷和陷阱,C語言對于運行時的檢查十分弱小,需要程序員謹(jǐn)慎的考慮代碼,在必要的時候增加判斷;防御性編程的另一個核心思想是假設(shè)代碼運行在并不可靠的硬件上,外接干擾有可能會打亂程序執(zhí)行順序、更改RAM存儲數(shù)據(jù)等等。
1、具有形參的函數(shù),需判斷傳遞來的實參是否合法
程序員可能無意識的傳遞了錯誤參數(shù);外界的強干擾可能將傳遞的參數(shù)修改掉,或者使用隨機參數(shù)意外的調(diào)用函數(shù),因此在執(zhí)行函數(shù)主體前,需要先確定實參是否合法。
2、仔細(xì)檢查函數(shù)的返回值
對函數(shù)返回的錯誤碼,要進(jìn)行全面仔細(xì)處理,必要時做錯誤記錄。
3、防止指針越界
如果動態(tài)計算一個地址時,要保證被計算的地址是合理的并指向某個有意義的地方。特別對于指向一個結(jié)構(gòu)或數(shù)組的內(nèi)部的指針,當(dāng)指針增加或者改變后仍然指向同一個結(jié)構(gòu)或數(shù)組。
4、防止數(shù)組越界
數(shù)組越界的問題前文已經(jīng)講述的很多了,由于C不會對數(shù)組進(jìn)行有效的檢測,因此必須在應(yīng)用中顯式的檢測數(shù)組越界問題。
5、數(shù)學(xué)算數(shù)運算
5.1、除法運算,只檢測除數(shù)為零就可靠嗎?
除法運算前,檢查除數(shù)是否為零幾乎已經(jīng)成為共識,但是僅檢查除數(shù)是否為零就夠了嗎?
考慮兩個整數(shù)相除,對于一個signed long類型變量,它能表示的數(shù)值范圍為:-2147483648 ~+2147483647,如果讓-2147483648/ -1,那么結(jié)果應(yīng)該是+2147483648,但是這個結(jié)果已經(jīng)超出了signedlong所能表示的范圍了。所以,在這種情況下,除了要檢測除數(shù)是否為零外,還要檢測除法是否溢出。
5.2、檢測運算溢出
整數(shù)的加減乘運算都有可能發(fā)生溢出,在討論未定義行為時,給出過一個有符號整形加法溢出判斷代碼。
5.3、檢測移位
在討論未定義行為時,提到有符號數(shù)右移、移位的數(shù)量是負(fù)值或者大于操作數(shù)的位數(shù)都是未定義行為,也提到不對有符號數(shù)進(jìn)行位操作,但要檢測移位的數(shù)量是否大于操作數(shù)的位數(shù)。
6、如果有硬件看門狗,則使用它
在其它一切措施都失效的情況下,看門狗可能是最后的防線。它的原理特別簡單,但卻能大大提高設(shè)備的可靠性。如果設(shè)備有硬件看門狗,一定要為它編寫驅(qū)動程序。
7、關(guān)鍵數(shù)據(jù)儲存多個備份,取數(shù)據(jù)采用“表決法”
RAM中的數(shù)據(jù)在受到干擾情況下有可能被改變,對于系統(tǒng)關(guān)鍵數(shù)據(jù)應(yīng)該進(jìn)行保護。關(guān)鍵數(shù)據(jù)包括全局變量、靜態(tài)變量以及需要保護的數(shù)據(jù)區(qū)域。備份數(shù)據(jù)與原數(shù)據(jù)不應(yīng)該處于相鄰位置,因此不應(yīng)由編譯器默認(rèn)分配備份數(shù)據(jù)位置,而應(yīng)該由程序員指定區(qū)域存儲。
可以將RAM分為3個區(qū)域,第一個區(qū)域保存原碼,第二個區(qū)域保存反碼,第三個區(qū)域保存異或碼,區(qū)域之間預(yù)留一定量的“空白”RAM作為隔離?梢允褂镁幾g器的“分散加載”機制將變量分別存儲在這些區(qū)域。需要進(jìn)行讀取時,同時讀出3份數(shù)據(jù)并進(jìn)行表決,取至少有兩個相同的那個值。
8、對非易失性存儲器進(jìn)行備份存儲
非易失性存儲器包括但不限于Flash、EEPROM、鐵電。僅僅將寫入非易失性存儲器中的數(shù)據(jù)再讀出校驗是不夠的。強干擾情況下可能導(dǎo)致非易失性存儲器內(nèi)的數(shù)據(jù)錯誤,在寫非易失性存儲器的期間系統(tǒng)掉電將導(dǎo)致數(shù)據(jù)丟失,因干擾導(dǎo)致程序跑飛到寫非易失性存儲器函數(shù)中,將導(dǎo)致數(shù)據(jù)存儲紊亂。
一種可靠的辦法是將非易失性存儲器分成多個區(qū),每個數(shù)據(jù)都將按照不同的形式寫入到這些分區(qū)中,需要進(jìn)行讀取時,同時讀出多份數(shù)據(jù)并進(jìn)行表決,取相同數(shù)目較多的那個值。
9、軟件鎖
對于初始化序列或者有一定先后順序的函數(shù)調(diào)用,為了保證調(diào)用順序或者確保每個函數(shù)都被調(diào)用,我們可以使用環(huán)環(huán)相扣,實質(zhì)上這也是一種軟件鎖。此外對于一些安全關(guān)鍵代碼語句(是語句,而不是函數(shù)),可以給它們設(shè)置軟件鎖,只有持有特定鑰匙的,才可以訪問這些關(guān)鍵代碼。也可以通俗的理解為,關(guān)鍵安全代碼不能按照單一條件執(zhí)行,要額外的多設(shè)置一個標(biāo)志。
比如,向Flash寫一個數(shù)據(jù),我們會判斷數(shù)據(jù)是否合法、寫入的地址是否合法,計算要寫入的扇區(qū)。之后調(diào)用寫Flash子程序,在這個子程序中,判斷扇區(qū)地址是否合法、數(shù)據(jù)長度是否合法,之后就要將數(shù)據(jù)寫入Flash。
由于寫Flash語句是安全關(guān)鍵代碼,所以程序給這些語句上鎖:必須具有正確的鑰匙才可以寫Flash。這樣即使是程序跑飛到寫Flash子程序,也能大大降低誤寫的風(fēng)險。
本文由培訓(xùn)無憂網(wǎng)達(dá)內(nèi)教育課程顧問老師整理發(fā)布,更多課程信息可關(guān)注嵌入式開發(fā)培訓(xùn)或添加老師微信:15033336050
注:尊重原創(chuàng)文章,轉(zhuǎn)載請注明出處和鏈接 http://m.elsolbar.com/news-id-6215.html 違者必究!部分文章來源于網(wǎng)絡(luò)由培訓(xùn)無憂網(wǎng)編輯部人員整理發(fā)布,內(nèi)容真實性請自行核實或聯(lián)系我們,了解更多相關(guān)資訊請關(guān)注嵌入式開發(fā)頻道查看更多,了解相關(guān)專業(yè)課程信息您可在線咨詢也可免費申請試課。關(guān)注官方微信了解更多:150 3333 6050