成為正式的嵌入式主板開發(fā)工程師。這是一個困難的過程,需要開發(fā)人員維護和管理系統(tǒng)的每一個位和字節(jié)。開發(fā)高可靠性嵌入式系統(tǒng)的技術有很多,從規(guī)范完善的開發(fā)周期到嚴格的實施和系統(tǒng)檢查。今天諄勤智能給大家介紹7個易操作且可以長久使用的技巧,它們對于確保系統(tǒng)更加可靠地運行并捕獲異常行為大有幫助。
技巧一、用已知值填充ROM
軟件開發(fā)人員總是很樂觀的人,只要他們的代碼長期忠實運行,僅此而已。微控制器跳出應用程序空間并在意外的代碼空間中執(zhí)行似乎非常罕見。然而,發(fā)生這種情況的可能性不亞于緩存溢出或錯誤指針丟失引用。它確實發(fā)生了!這種情況發(fā)生后,系統(tǒng)行為會不確定,因為默認的內(nèi)存空間是0xFF,或者因為內(nèi)存區(qū)域通常是未寫的,所以里面的值可能只有上帝知道。
然而,相當完整的鏈接器或集成開發(fā)環(huán)境技能可以用來幫助識別這樣的事件并從中恢復系統(tǒng)。訣竅是使用填充命令用已知的位模式填充未使用的只讀存儲器。有許多不同的可能組合來填充未使用的內(nèi)存,但是如果您想構(gòu)建一個更可靠的系統(tǒng),最明顯的選擇是在這些位置放置ISR故障處理器。如果系統(tǒng)出現(xiàn)問題,處理器開始在程序空間之外執(zhí)行代碼,它將觸發(fā)ISR,并在決定糾正措施之前提供存儲處理器、寄存器和系統(tǒng)狀態(tài)的機會。
技巧二、檢查應用程序的CRC
對于嵌入式工程師來說,一個很大的好處就是我們的IDE和工具鏈可以自動生成應用或者內(nèi)存空間校驗和,從而根據(jù)這個校驗和來驗證應用是否完好。有趣的是,在許多情況下,校驗和僅在程序代碼加載到設備中時使用。
但是,如果內(nèi)存中保留了CRC或校驗和,那么在啟動時驗證應用程序是否仍然完好無損(甚至定期驗證長時間運行的系統(tǒng))是確保不會發(fā)生意外情況的絕佳方式?,F(xiàn)在,一個編程的應用程序改變的概率很小,但是考慮到每年交付的數(shù)十億個微控制器和可能的惡劣工作環(huán)境,應用程序崩潰的概率不是零。更可能的是,系統(tǒng)中的缺陷可能導致扇區(qū)中的閃存寫入或閃存擦除,從而破壞應用程序的完整性。
技巧三、在啟動時執(zhí)行RAM檢查
為了構(gòu)建一個更加可靠和堅固的系統(tǒng),保證系統(tǒng)硬件正常工作是非常重要的。畢竟硬件會出問題。幸運的是,軟件永遠不會失敗,軟件只會做代碼想讓它做的事,不管是對還是錯。通過在啟動時驗證內(nèi)存內(nèi)部或外部沒有問題,這是確保硬件按預期工作的好方法。
有許多不同的方法來執(zhí)行內(nèi)存檢查,但常見的方法是編寫一個已知的模式,然后等待一段時間再讀取它。結(jié)果應該是你讀的就是你寫的。事實是,在大多數(shù)情況下,內(nèi)存檢查通過了,這是我們想要的。然而,檢查失敗的可能性非常小,這為系統(tǒng)指出硬件問題提供了一個極好的機會。
技巧四、使用堆棧監(jiān)視器
對于很多嵌入式開發(fā)人員來說,棧似乎是一種神秘的力量。當奇怪的事情開始發(fā)生時,工程師們終于被難倒了,他們開始想,也許堆棧里發(fā)生了什么。結(jié)果就是盲目調(diào)整棧的大小和位置等等。但是錯誤往往是與棧無關的,但是你怎么能這么肯定呢?畢竟,有多少工程師實際執(zhí)行過最壞情況下的堆棧大小分析?
堆棧大小是在編譯時靜態(tài)分配的,但堆棧是動態(tài)使用的。隨著代碼的執(zhí)行,應用程序所需的變量、返回的地址和其他信息會持續(xù)存儲在堆棧中。這種機制導致堆棧在其分配的內(nèi)存中增長。但是,這種增長有時會超過編譯時確定的容量限制,導致堆棧破壞相鄰內(nèi)存區(qū)域中的數(shù)據(jù)。
絕對確保堆棧正常工作的一種方法是將堆棧監(jiān)視器作為系統(tǒng)“健康護理”代碼的一部分來實現(xiàn)(有多少工程師會這樣做?).堆棧監(jiān)視器在堆棧和“其他”存儲區(qū)之間創(chuàng)建一個緩沖區(qū),并用已知的位模式填充它。然后顯示器會不斷地監(jiān)控圖案是否有變化。如果位模式變了,說明棧長太大,會把系統(tǒng)推向黑暗地獄!此時,監(jiān)視器可以記錄事件的發(fā)生、系統(tǒng)狀態(tài)和任何其他有用的數(shù)據(jù),以便將來診斷問題。
大多數(shù)實時操作系統(tǒng)(RTOS)或?qū)崿F(xiàn)內(nèi)存保護單元(微處理器)的微控制器系統(tǒng)都提供堆棧監(jiān)視器??膳碌氖?,這些功能都是默認關閉的,或者經(jīng)常是開發(fā)人員故意關閉的。網(wǎng)上快速搜索發(fā)現(xiàn),很多人建議關閉實時操作系統(tǒng)中的堆棧監(jiān)控,以節(jié)省56字節(jié)的閃存空間,這是得不償失的!
技巧五、避免易失存儲器分配
不習慣在資源有限的環(huán)境中工作的工程師可能會嘗試使用他們的編程語言的功能,這允許他們使用易失性內(nèi)存分配。畢竟,這是計算器系統(tǒng)中經(jīng)常使用的一種技術,只有在必要時才會分配內(nèi)存。例如,在用C語言開發(fā)時,工程師可能傾向于使用malloc來分配堆上的空間。有一個操作將被執(zhí)行。一旦完成,free可以用來返回分配給堆使用的內(nèi)存。
在資源受限的系統(tǒng)中,這可能是一場災難!使用易失性內(nèi)存分配的一個問題是,錯誤或不適當?shù)募夹g可能會導致內(nèi)存泄漏或內(nèi)存碎片。如果出現(xiàn)這些問題,大多數(shù)嵌入式系統(tǒng)沒有資源或知識來監(jiān)控堆或正確處理它。當它們發(fā)生時,如果應用程序請求空間,但請求的空間不可用,會發(fā)生什么?
使用易失性內(nèi)存分配帶來的問題非常復雜,妥善處理這些問題可以說是一場噩夢!另一種方法是直接以靜態(tài)方式簡化內(nèi)存分配。例如,只需在程序中創(chuàng)建一個256字節(jié)大小的緩沖區(qū),而不是通過malloc請求一個這樣大小的內(nèi)存緩沖區(qū)。這種分配的內(nèi)存可以在應用程序的整個生命周期中得到維護,而不用擔心堆或內(nèi)存碎片。
技巧六、建立一個強大的看門狗系統(tǒng)
您經(jīng)常會發(fā)現(xiàn),最受歡迎的看門狗實現(xiàn)之一是啟用看門狗,但它也可以通過定期計時器清除;定時器的激活與程序中發(fā)生的任何情況完全隔離。使用看門狗的目的是幫助確保如果出現(xiàn)錯誤,看門狗不會被清除,即當工作暫停時,系統(tǒng)將被迫執(zhí)行硬件復位以進行恢復。使用獨立于系統(tǒng)活動的定時器可以保持看門狗清零,即使系統(tǒng)出現(xiàn)故障。
嵌入式開發(fā)人員需要仔細考慮和設計如何將應用任務集成到看門狗系統(tǒng)中。例如,可能有一種技術允許在某個時間段內(nèi)運行的每個任務表明它們可以成功完成任務。在這種情況下,看門狗不會被清零,而是被強制復位。有一些先進的技術,例如使用外部看門狗處理器,可以用來監(jiān)控主處理器的行為,反之亦然。對于一個可靠的系統(tǒng)來說,構(gòu)建一個強大的看門狗系統(tǒng)非常重要。
技巧七、使用MPU
以前在小而便宜的微控制器中很難找到內(nèi)存保護單元(MPU),但這種情況已經(jīng)開始改變?,F(xiàn)在從高端到低端的微控制器都有了MPU,而這些MPU為嵌入式軟件開發(fā)人員提供了極大提高固件健壯性的機會。
MPU已經(jīng)逐漸與操作系統(tǒng)耦合,從而建立一個處理分離的內(nèi)存空間,或者任務可以執(zhí)行其代碼而不用擔心被踩。如果真的發(fā)生了什么,不受控制的治療將被取消,并實施其他保護措施。請注意有這個組件的微控制器,如果有,請多利用這個功能。
以上嵌入式工控機主板開發(fā)教程可以幫助開發(fā)者獲得更好的嵌入式系統(tǒng)方式。這些技術都是設計人員開發(fā)可靠性更高的嵌入式系統(tǒng)的秘訣。
工業(yè)控制系統(tǒng)一直以來都是許多行業(yè)中不可或缺的一部分,而人工智能和機器視...
2023-11-06 查看內(nèi)容工控機作為工業(yè)自動化的核心設備,正迎接著產(chǎn)業(yè)升級的巨大需求。本文將從市...
2023-10-10 查看內(nèi)容物聯(lián)網(wǎng)技術的迅猛發(fā)展,工控機被賦予了更廣泛的應用場景和更高的智能化要求...
2023-09-05 查看內(nèi)容工控機在能源行業(yè)中發(fā)揮著重要的作用,推動能源生產(chǎn)、傳輸和管理的創(chuàng)新發(fā)展...
2023-08-11 查看內(nèi)容