可靠的軟件是指在指定的時(shí)間內(nèi),在指定的條件下持續(xù)執(zhí)行其所需功能的軟件類別。可靠的固件通常具有正確性、健壯性、容錯(cuò)性和一致的行為等特征。你可能會(huì)認(rèn)為可靠的軟件是你不想執(zhí)行系統(tǒng)重置來使其再次工作的軟件。比如飛行控制器、剎車系統(tǒng)、醫(yī)療設(shè)備等。這篇文章將探討開發(fā)可靠固件的三種通常被忽視的技術(shù)。
技巧1:使用內(nèi)置糾錯(cuò)碼(ECC)外設(shè)
大多數(shù)微控制器都有一個(gè)開發(fā)人員容易忽略的外設(shè),即ECC。ECC主要用于易出現(xiàn)位錯(cuò)誤的存儲(chǔ)器類型,如閃存或SRAM。許多ECC外設(shè)將連接到內(nèi)部和外部存儲(chǔ)器,例如通過QSPI連接的存儲(chǔ)器。
ECC向存儲(chǔ)的數(shù)據(jù)添加額外的位(奇偶校驗(yàn)位)。可以想象,這意味著要使用ECC,你將需要額外的內(nèi)存。如果你有ECC外設(shè),通常不必?fù)?dān)心CPU開銷,因?yàn)檫@些位是使用硬件加速算法計(jì)算的,幾乎不需要CPU干預(yù)。回讀數(shù)據(jù)時(shí),ECC邏輯會(huì)再次計(jì)算奇偶校驗(yàn)位,并將它們與存儲(chǔ)的奇偶校驗(yàn)位進(jìn)行比較。如果不匹配,則意味著數(shù)據(jù)中存在錯(cuò)誤。
ECC可以檢測兩種類型的錯(cuò)誤:單位錯(cuò)誤和多位錯(cuò)誤。當(dāng)檢測到一位錯(cuò)誤時(shí),可以自動(dòng)糾正。ECC邏輯會(huì)在CPU或其他外設(shè)使用數(shù)據(jù)之前自動(dòng)糾正數(shù)據(jù)。可以檢測到多位錯(cuò)誤,但無法糾正。在這種情況下,ECC邏輯可以向系統(tǒng)發(fā)出錯(cuò)誤情況信號(hào),然后系統(tǒng)可以采取適當(dāng)?shù)拇胧鐦?biāo)記錯(cuò)誤或啟動(dòng)系統(tǒng)重置。
開發(fā)人員經(jīng)常忽略ECC,因?yàn)椴渴鹪诘孛嫔系脑O(shè)備比在軌道上或更高海拔的設(shè)備發(fā)生比特翻轉(zhuǎn)和單粒子翻轉(zhuǎn)的概率更低。當(dāng)你在實(shí)驗(yàn)臺(tái)上沒有看到問題時(shí),很容易假設(shè)系統(tǒng)不會(huì)經(jīng)歷這些行為。ECC也不會(huì)出現(xiàn)在大多數(shù)配置軟件中,因?yàn)樗ǔMㄟ^對(duì)微控制器配置寄存器中的單個(gè)位進(jìn)行編程來啟用。設(shè)置通常保留默認(rèn)值。
在可靠性至關(guān)重要的應(yīng)用中,例如醫(yī)療、汽車或航天系統(tǒng)中,使用ECC可能是實(shí)現(xiàn)所需可靠性水平的整體策略的一部分。
技巧2:設(shè)計(jì)強(qiáng)大的看門狗解決方案
對(duì)于可靠的固件來說,看門狗是一種經(jīng)常被忽視的技術(shù)嗎?嗯,它被廣泛忽視了,因?yàn)樗菆F(tuán)隊(duì)經(jīng)常實(shí)施的最后一件事。最后一刻的實(shí)現(xiàn)通常考慮不周,可能無法滿足系統(tǒng)的需求。團(tuán)隊(duì)經(jīng)常在創(chuàng)建任務(wù)時(shí)打開內(nèi)部看門狗定時(shí)器,該任務(wù)會(huì)定期觸發(fā)定時(shí)器,并表示他們有看門狗解決方案。事實(shí)并非如此。
可靠的看門狗解決方案需要與正在開發(fā)的軟件緊密集成。它需要一個(gè)總體策略來跟蹤內(nèi)存、任務(wù)執(zhí)行、應(yīng)用程序代碼和驅(qū)動(dòng)程序。可靠系統(tǒng)中的看門狗會(huì)小心保護(hù)系統(tǒng)并查找問題。如果發(fā)現(xiàn)問題,它可能會(huì)重新啟動(dòng)系統(tǒng)或有問題的線程或進(jìn)程。有無數(shù)種方法可以根據(jù)所需的可靠性水平在系統(tǒng)中實(shí)現(xiàn)看門狗。
在某些系統(tǒng)中,看門狗可能是多層的。它可以利用內(nèi)部看門狗定時(shí)器、監(jiān)視軟件行為的線程和監(jiān)視整個(gè)系統(tǒng)的外部看門狗。這些系統(tǒng)的可靠性很高,但看門狗的復(fù)雜性也很高。最終目標(biāo)是設(shè)計(jì)一個(gè)看門狗,安全可靠地檢測問題并恢復(fù)系統(tǒng)。
技巧3:使用斷言
在C和C++中,斷言檢查程序中的條件或假設(shè),如果不滿足這些條件,就停止程序的執(zhí)行。斷言有助于調(diào)試并確保你的代碼按預(yù)期運(yùn)行。C和C++中有兩種類型的斷言:運(yùn)行時(shí)斷言和靜態(tài)斷言。
運(yùn)行時(shí)斷言是使用cassert(在C++中)或assert.h(在c++中)頭文件提供的assert宏實(shí)現(xiàn)的。assert宏將表達(dá)式作為參數(shù)。假設(shè)表達(dá)式被評(píng)估為假(即,不滿足條件)。在這種情況下,它會(huì)觸發(fā)一個(gè)斷言失敗,通常會(huì)導(dǎo)致程序陷入一個(gè)無限循環(huán),并給出失敗條件的詳細(xì)信息。
靜態(tài)斷言對(duì)于在編譯時(shí)捕捉潛在問題特別有用,而運(yùn)行時(shí)斷言用于運(yùn)行時(shí)調(diào)試和驗(yàn)證。如果你想編寫更可靠的軟件,使用這些斷言可以幫助你發(fā)現(xiàn)潛在的問題,否則可能會(huì)被忽視。
結(jié)論
編寫可靠的固件是許多嵌入式系統(tǒng)專業(yè)人員的一項(xiàng)重要技能。嵌入式系統(tǒng)通常被部署到現(xiàn)場,并期望在不被重置的情況下正確工作數(shù)周或數(shù)月。今天討論的技術(shù)對(duì)于開發(fā)可靠的軟件來說是必不可少的。如果使用得當(dāng),可以提高系統(tǒng)的可靠性。