Path: EDNTaiwan電子技術設計 >> 設計中心 >> IC/電路板/系統設計 >> 7大秘訣設計出可靠的嵌入式系統
IC/電路板/系統設計 Share print

7大秘訣設計出可靠的嵌入式系統

2015年03月02日  | Jacob Beningo

Share this page with your friends

7大秘訣設計出可靠的嵌入式系統


儘管是許多嵌入式工程師的希望和夢想,但可靠的代碼不是偶然發生的。它是一個艱辛的過程,需要開發者去維護和管理系統中的每一位元和位元組。當一個應用程式"成功"通過驗證時,通常會有一種如釋重負的感覺,但就只是因為軟體在條件皆受到控制的情況下的那一刻正確運行,並不意味著隔天或一年之後,它仍然可以正確運行。


建立可靠嵌入式系統的技術有許多種,這些技術包括從一個紀律嚴明的開發週期到嚴格執行和系統檢查。整個程式庫可以輕易地以與可靠軟體設計有關的書籍填滿。不過,有七個很容易實現且可以長久使用的技巧,可以確保系統的運行更可靠,並捕捉到意料之外的行為。


秘訣#1 -以已知的值填入ROM

軟體開發人員往往是一個很樂觀的一群,至少就對其微控制器隨著時間推移而仍能忠實地執行其代碼的期望是如此。對於微控制器跳出應用程式空間和執行意外的代碼空間這樣的想法,似乎是一種相當罕見的情況;然而,發生這種情況的機會只是一種衝區的溢出(buffer overflow),或一故障指示器的解參考作用(dereferencing)。它會發生,且確實會發生!該系統由結果所導致的行為是未定義的(undefined),因為記憶體會將所有的0xFF預設在空間中,又或者因為記憶體的區域通常是不可以被寫入的,該值會衰變(decay)成什麼,只有上帝知道。


有一個巧妙的連接器(linker)或IDE技巧,可用來確認系統正處於這樣的事件中,並 將系統恢復回來。該技巧是使用FILL指令,以已知的位元模式填補未使用的ROM。要填充未使用的記憶體,有很多不同的可能組合可以使用,但如果目的是要建立一個更為可靠的系統,不二之選就是在這個位置放一個ISR故障處理器。


如果出現錯誤,並且處理器開始在程式空間外執行代碼,則ISR則會啟動,為在決定一正確行動方案之前,提供了一個可以儲存處理器、暫存器、系統狀態的機會。


秘訣#2 - 檢查應用CRC

嵌入式工程師可利用的效益之一是,我們的IDE和工具鏈可自動地產生應用程式和記憶體空間核對和(checksum),應用程式可從其中驗證。有趣的事情是,在許多的這些情況下,只有在將程式代碼加載到設備時,才會用到核對和。


如果記憶體中保持CRC或核對和,則驗證該應用程式在啟動時依然是完整無損的(或甚至對長時間運行的系統定期驗證),是一種可以確保不會發生什麼意外的好方法。一個經過編程的應用程式會改變的機會,現在是很小了,但考慮到微控制器每年數十億顆的出貨量,及可能的惡劣工作環境,應用程式出錯的機會並不為零。更有可能的是,系統中的一個錯誤,可能使得某一個扇區(sector)發生快閃記憶體寫入或快閃記憶體擦除的情況,而使得應用程式出錯。


秘訣#3 -在啟動時執行RAM檢查

為了建立一個更可靠和更紮實的系統,重要的是要保證該系統的硬體可以正常運行。畢竟,硬體確實會故障。(幸運的是軟體永遠不會故障,它只是照著程式碼運行,無論是對還是錯。)在啟動時驗證RAM的內部或外部沒有問題,是確保硬體可以如預期般運作的一個好方法。


有許多不同的方法可用來執行RAM檢查,但通常是撰寫一個已知模式,讓它短暫停留,然後讀回。結果應該是,所讀到的應與所寫的相匹配。真相是,在大多數情況下,RAM檢查都會通過,而這正是我們所想要的。但如果萬一不過,這種檢查為系統提供了一個絕佳的機會,標示出有一個硬體問題。


Michael Barr在2000年寫了一個記憶體測試 C模組,當工程師在考慮RAM測試時,它可以節省工程師的時間。可在此處下載該模組。


秘訣#4 - 使用堆疊監視器

對許多的嵌入式開發者而言,堆疊似乎是一股相當神秘的力量。當奇怪的事情開始發生,工程師終於被難倒了,他們開始思考,也許堆疊中發生了什麼事。結果是盲目地調整堆疊的大小和位置。但該錯誤往往是與錯誤無關的,但怎能如此確定?畢竟,有多少工程師真的實際執行過最壞情況下的堆疊大小分析?


堆疊的大小在編譯時間被靜態地分配,但它卻是以一種動態的方式使用。由於代碼是執行的變數,轉回位址(return address)及應用程式需要的其他資訊則是儲存在堆疊中。這樣的動作將導致堆疊在其分配的記憶體內增長。然而,這種增長有時會超過編譯時的大小限制,這將使得堆疊會破壞記憶體區域內與其相鄰的任何東西。


一種可以絕對確定該堆疊是在運轉的方法是實現一個堆疊監視器(stack monitor),來作為系統健康和保健代碼的一部分(有多少工程師會這樣做?)。該堆疊監視器在堆疊和"其他"記憶體區域之間建立一個緩衝區,填進已知的位元模式。然後監視器會不斷地觀察該模式有任何改變。如果該位元模式有變化,則表示堆疊已經成大得太過份了,並且已在系統跌進黑暗深淵的邊緣!監視器隨後登錄此一事件、系統狀態和稍後可用於診斷問題的其它任何有用數據。


在大多數的RTOS系統或有記憶體保護單元(MPU)的微控制器系統中都有堆疊監視器。可怕的是,這些功能通常不是被預設為關閉,不然就是可以由開發者關閉,而他們也經常這樣做。在網路上快速搜尋一下可以發現,關閉RTOS中堆疊顯示器的建議,可以節省56位元組的快閃記憶體空間。


(未完,請參閱下頁更多內文及附圖)


1 • 2 Next Page Last Page


想要免費接收更多的技術設計資訊嗎?

馬上訂閱《電子技術設計》郵件速遞,透過郵箱輕鬆接收最新的設計理念和產品新聞。

為確保您的資訊安全,請輸入右方顯示的代碼.

啟動您的訂閱申請

我們已給您的註冊郵箱發送了確認信,請點擊信中的連結啟動您的訂閱申請。

這將有助於我們很好地保護您的個人隱私同時確保您能成功接收郵件。


添加新評論
遊客 (您目前以遊客身份發表,請 登入 | 註冊)
*驗證碼:

新聞 | 產品 | 設計實例