嵌入式系統開發的難點:從韌體到量產
Posted in :
把程式寫進一台看不到螢幕的裝置裡,和寫一個網站是兩種工作。前者的程式要在很小的記憶體裡跑好幾年不重開,出貨之後可能沒有機會再改;後者出了問題重新部署一次就好。會找這個題目的人,有的是從軟體轉過來、想知道要補哪些觀念,有的是公司要做一款帶電子功能的產品、想理解流程與風險。這篇從嵌入式與一般軟體的根本差異談起,一路走到韌體架構選擇、資源取捨、除錯方式、連網後的安全性,以及打樣到量產這段最容易低估的路。
與一般軟體開發最根本的三個差異
第一是資源受限。可用的記憶體與運算能力往往只有桌上型環境的極小部分,很多在其他領域理所當然的寫法,例如隨手配置大量記憶體、把資料整批載入,在這裡都行不通。
第二是與硬體綁在一起。程式的正確性不只取決於邏輯,還取決於電路、時序與元件特性。同一段程式在不同批次的板子上表現不同,是常有的事。
第三是修改成本。產品送到使用者手上後,更新可能需要拆機或送回,甚至根本不可行。這使得測試的份量與設計的謹慎程度必須提高,因為錯誤不是重新上線就能解決。
開案之前要先確定的硬體條件
- 供電方式:接市電、用電池,還是靠太陽能之類的間歇來源,這會決定整個軟體的省電策略。
- 主控晶片的等級:能跑作業系統,還是只能跑裸機程式,兩者的開發方式差很多。
- 連線方式:有線、無線區域網路、行動網路或短距傳輸,各自的耗電與可靠度不同。
- 使用環境:溫度、濕度、粉塵、震動,以及是否需要防水,會反過來影響元件選擇。
- 使用壽命與維護方式:預期運作幾年、能不能現場更新、故障時如何診斷。
- 法規與認證需求:是否需要通過電磁相容或無線相關檢測,這會影響時程與板子的改版次數。
這些條件如果在寫程式之後才確定,通常代表要重來一次。硬體與韌體的規格必須一起定,而不是先做硬體再叫軟體配合。
韌體架構:從輪詢到即時作業系統
最單純的做法是一個主迴圈不斷檢查各項狀態,搭配中斷處理急事。這種架構容易理解、資源佔用小,適合功能單純的裝置;但當要同時處理的事情變多,各段程式的執行時間會互相排擠,反應時間變得難以預測。
下一步是導入即時作業系統,把工作切成多個任務,由排程器決定誰先執行,並用佇列與旗標協調彼此。好處是時序需求容易保證、程式結構清楚;代價是要多花記憶體、要處理任務之間共享資料的保護,除錯的難度也上升一個層級。
選擇的判斷點在於:有沒有必須在固定時間內完成的動作、同時要處理的獨立事件有幾件、團隊是否具備處理並行問題的經驗。功能單純卻硬套作業系統,只會增加不必要的複雜度。
記憶體與電力這兩個永遠不夠的資源
記憶體方面,實務上會盡量避免在執行期間動態配置,改用在編譯期就決定大小的緩衝區,因為長時間運作下的記憶體破碎是很難追查的故障來源。堆疊空間也要估算,中斷處理與巢狀呼叫都會吃掉它,溢位時的症狀常常是毫無規律的當機。
電力方面,最有效的省電手段不是把程式寫快,而是讓晶片盡量待在睡眠狀態,靠事件或計時器喚醒。因此設計時要反過來問:這個裝置一天真正需要醒來幾次、每次要做多久、有沒有辦法把幾件事合併在同一次喚醒完成。無線傳輸通常是耗電大戶,減少傳輸次數與傳輸量,效果往往勝過其他所有優化。
除錯的方式完全不同
沒有畫面、沒有記錄檔可以翻,是新手最不適應的地方。可用的手段包括透過序列埠輸出訊息、用除錯介面單步執行、用示波器或邏輯分析儀直接看訊號、以及在關鍵位置切換一支輸出腳位再用儀器觀察時間。
要注意的是,加上除錯輸出本身會改變時序,有些問題會因此消失,這在處理中斷與並行時很常見。偶發故障則要靠事前的準備:在裝置上保留一小塊不會因重開而清除的區域,記下重開的原因、最後執行到哪個階段、看門狗是否曾經觸發,這些紀錄在現場故障時往往是唯一線索。
連上網路之後多出來的責任
裝置一旦能連線,就等於暴露在外。基本要求包括:與伺服器之間的通訊要加密、要驗證對方身分而不是只驗證自己、每台裝置的憑證或金鑰要各自獨立,不能整批共用同一組。出廠預設密碼若整批相同,等於沒有防護。
更新機制也要在設計初期就做進去。遠端更新的難處在於中途斷電或訊號中斷時,裝置不能變成無法開機的狀態,因此常見做法是保留兩塊韌體區域,新版驗證成功才切換,失敗則回到舊版。更新檔本身也要驗證來源,避免被替換成不明韌體。
從打樣到量產這段路
工程樣品能動,不代表可以量產。中間至少還有幾關:不同批次元件的差異會讓邊界值變得敏感;產線需要能快速燒錄韌體並自動測試每一片板子;出廠時每台要寫入獨立的識別碼與校正參數。
因此韌體通常要準備一個產線測試模式,能自動檢查各個介面與感測元件並回報結果。這部分的工作量常被漏估,卻直接影響產能與良率。元件缺料時的替代方案也要事先想過,換一顆感測器往往意味著驅動程式要改寫。
常見問題
做應用軟體的工程師轉做嵌入式,要補什麼?
最需要補的是硬體側的基本觀念:看得懂規格書與時序圖、理解中斷與暫存器的運作、知道電源與訊號可能造成什麼影響。程式語言本身反而不是最大的門檻。實際的入門方式是拿一塊開發板,從點亮一個燈開始,逐步做到讀取感測器、進入睡眠再被喚醒,把整條路走過一次。
一定要用即時作業系統嗎?
不一定。如果裝置只做少數幾件事、彼此之間沒有嚴格的時間競爭,主迴圈搭配中斷就足夠,而且更省資源、更容易驗證。當同時要維持通訊、讀取感測、處理使用者操作,且各有時間要求時,才值得付出額外的複雜度。判斷依據是需求,不是流行。
產品出貨之後還能更新韌體嗎?
能不能取決於一開始有沒有規劃。若當初保留了更新機制與足夠的儲存空間,就可以透過網路或連接線更新;若沒有,通常只能回收或拆機處理。因此即使第一版不打算使用,也建議先把更新的能力留下來,這是成本很低但價值很高的保險。
開發板上正常,換成正式電路板就出問題,常見原因是什麼?
多半不是程式邏輯的問題。常見來源包括:電源的穩定度不同、佈線造成的干擾、上拉或下拉電阻的配置差異、晶振或時脈來源不同、以及開發板上原本就有而正式板沒有的保護元件。排查方式是先用儀器確認電源與關鍵訊號是否正常,再回頭看初始化設定,而不是一開始就懷疑程式。
嵌入式專案的時程為什麼特別難估?
因為軟體與硬體互為前提。板子改一版需要製作與等待的時間,而硬體問題往往要等韌體寫到某個程度才被發現,因此中途會出現數次來回。此外認證檢測、元件交期、產線測試治具都不完全在團隊掌握之內。比較實際的做法是把時程按板子的改版次數來規劃,並在每一版之間安排明確的驗證項目。
本文由京采數位科技整理。我們自 2005 年起提供官網設計、系統開發與 Google SEO 服務,實際案例可見成果與案例。
相關主題
下一步
如果你正在評估「嵌入式系統開發」相關的規劃,可以參考我們的系統開發需求討論,或直接與我們聯繫,我們會依你的產業與現況給出務實的建議。