Tag Archives: embedded software

Software Engineering for Embedded Systems – Mark Kraeling, Robert Oshana

說起寫程式,一般人會聯想到寫手機apps,架網站,電子遊戲,在PC或server跑的傳統應用程式。其實生常生浩中能接觸的程式,只佔總程式數量的小部份,有更多程式躲在我們看不見,摸不到的地方。從小至玩具,電庭電器,大至汽車,飛機,工業機械,無一不是依靠內嵌軟件(embedded software)去運作。一個手機軟件幾十萬行code已經很巨型,強如MS Office或Windows也不過數千萬行code,可是一台最新款汽車或飛機,輕易便過一兩億行code。

最近因工作需要開發embedded軟件,只好臨急抱佛腳看書惡補。這本Software Engineering For Embedded Systems是行內的天書,從最初的project planning,requirement,hardware integration開始,一路講到落手寫code的如何揀embedded OS, real-time system的特性,不同種類的optimization, multi-core, 到testing strategy,management, regulation standard都有講。全書一千二百頁,寫給行內人看,或用作大學課本,沒有一定的程式開發經驗,並理解CPU的結構,基本上完全看不明白。

Embedded軟件與其他一般軟件性質完全不同,最大分別是real-time和reliability的限制。舉例若寫個手機遊戲,某段code跑得慢,畫面甩了一兩個frame,不是什麼大不了的事情。甚至程式有bug,在某古怪的corner case下hang機,只要不太過離譜又fix得快,用家也不會過份苛責。可是embedded軟件就不同了,跑得慢或有bug可以死人。如汽車的ABS系統,軟件反應時間必需是幾毫秒以內,而且任何情況下都不能出錯。早幾年Toyato的控制油門軟件出了問題,儘管只是幾百萬份之一機會出錯,但只要有一宗幾乎死人,便要全線recall兼巨額罰款。

寫一般軟件的程式語言五花百門,寫embedded軟件則是清一色C/C++,佔超過九成市場。當軟件講求速度和predictability,又要直接去操控硬體位址,C這個古老的低階語言,基本上上是唯一選擇。全書最精彩的章節是講real time OS,講解interrupt service routine, context switch, thread priority,semaphore, mutex, mailbox等embedded軟件最基本的單元。之前我死啃threadx的document時看到一知半解,這本書便把那些慨念解釋得十分清楚明白。另外multi-core那一章也很好看,講解不同的memory架構,程式parallelize要注意的事項,與super computer軟件有不少相同之處。不過目前工作上還未用到,只是停留在認識理論層面。另外講軟件安全standard,如ISO 26262(汽車),DO-178C(飛機)等的章節,悶雖然有點悶,但那些standard中使用technical terms分類,也是必需要認識。軟件界近年流行Agile,書中也有一章講Agile和embedded軟件開發,不過我覺得傳統的project managment比較適合,embedded始終有太多外在因素的限制。

很多人說做IT寫軟件入行門檻底,技術更新速度快,很容易被後浪取代。Embedded軟件則接近傳統工程行業,很多知識大學只教皮毛,寫程式很講實戰經驗, embedded debug更是一門易學難精的藝術。C語言和CPU架構基本上過去十幾二十年沒有大轉變,在可見的將來亦不會有甚麼大轉變,工作環境相對穩定和較難取代。讀電腦科目的人,不妨考慮一下行embedded這條路。