嵌入式系統開發導論 (刊載於 Run! PC 8 月份)

jollen 發表於 September 30, 2006 12:00 PM

超熱門美食:嵌入式系統

什麼是「嵌入式系統」?這個熱到不行的題目倒底是什麼東西!嵌入式系統已經是全球科技業的共通話題了,就讓我們來簡單說明什麼叫「嵌入式系統」(Embedded Systems)吧。

美國工程師協會所定義的...嗯!看到這句話大家大概又要傻眼了,怎麼每個人解釋嵌入式系統都要搬出美國工程師協會的定義來交差呢!這真的是落伍啦。嵌入式系統不過是廣義還是狹義的定義,肯定都是包山包海的又臭又長。

我們這裡所要講的嵌入式系統目標是鎖定在熱門的「嵌入式作業系統平臺技術」(Embedded OS),所以如果我們再繼續縮小主題的話,沒錯!題目就只剩下 WinCE、Symbian 與 Linux 了!

如果以學習熱度來講的話,WinCE與 Embedded Linux 絕對是不「二」主題。所以我們要講的嵌入式系統就是Windows Mobile與Embedded Linux。本文將會明確鎖定幾個主題,並給予一個學習的方向,讓有志進入嵌入式系統領域的朋友能抓住主要的幾個主題。

功能導向的系統

言歸正傳,所謂的嵌入式系統簡而言之是一種「執行部份特定功能」的系統,實作上並不限定技術範疇,只要能將特定的功能(function)「嵌入」到目標裝置(target device)裡,包含這些功能的整體系統(或平臺)即是「嵌入式系統」。

一部目標裝置裡頭,可能會有數十個甚致數百、數千個嵌入式系統,每個「系統」均負責執行一項專責的功能。

由於目前的目標裝置都必須嵌入甚為複雜的功能,所以「嵌入式作業系統」成為嵌入式系統不可或缺的要素。例如,一支完全沒有生命力的「手機硬體」,在嵌入Windows Mobile與application後,就變成可以聽MP3、跟女朋友聊天、看MTV與使用各種功能的活力裝置了!有了完整的嵌入式系統技術,任何目標裝置都會因為嵌入式系統的注入,而產生生命,充滿活力!

目標裝置導向的系統

由於嵌入式系統是功能導向的系統,因此必須設計、選擇或購買正確(或適合)的目標裝置,才能開始實作並嵌入「嵌入式系統」。因此,嵌入式系統的技術是以功能與目標裝置為分類的一種技術。

例如,與PDA相關的目標裝置(即硬體)、與MP3撥放器相關的目標裝置、與3G手機相關的目標裝置等等;使用這些目標裝置所開發的特定功能系統,便是PDA的嵌入式系統、MP3音樂撥放的嵌入式系統、3G手機的嵌入式系統。

附帶值得一提的是,由於嵌入式系統的目標裝置,在硬體規格或架構上往往重疊性很大,所以很多SOC的廠商都會推出所謂的「公板」或「參考設計」(Reference Design),下游的開發者往往只要把公板做部份修改或小量的客製化,即可滿足自己的需求。

使用嵌入式作業系統

因為以功能為導向,因此當要嵌入的功能很複雜或非常多樣化時,使用嵌入式作業系統才能解決許多技術面的問題。有了嵌入式作業系統,「功能的實作」往往只是在「寫程式」,所以最終可以把嵌入式系統變成軟體開發的工作。

目標裝置 (Target Device) 的特性

嵌入式系統大多數都不使用標準的IBM PC硬體,而且有些嵌入式系統的目標裝置都是很特殊的。不過,我們可以將嵌入式系統目標裝置(target device)的主要硬體差異做一個說明。
我們透過與IBM PC的差異比較來做解釋。

嵌入式系統使用SOC(System-on-Chip)的處理器,這些SOC都是專為嵌入式系統或是手持行動裝置設計的,因此具備低功率、低耗電與面積小的特色。

在RAM方面,嵌入式系統的RAM大多在2MB到128MB之間,並且都是屬是SRAM/SDRAM的技術。很少使用IBM PC規格的DDR記憶體。

在儲存裝置方面,嵌入式系統採用NAND flash技術來存放系統程式。例如iPOD就有一部份產品使用NAND flash來存放MP3。使用NAND flash做為主要的儲存裝置是嵌入式系統的主要趨勢之一。
嵌入式系統主要透過序列埠輸出資訊;而個人電腦則是透過VGA顯示卡顯示圖形資料,嵌入式系統大多使用TFT-LCE做為圖形介面。

個人電腦當然是一般用途(general-purpose)的電腦,因此可以安裝許多有趣的應用軟體。嵌入式系統則是屬於特定用途(specific-purpose)的電腦,主要是針對特定功能所設計。

WinCE簡介

由於微軟的智慧型手機與台灣代工伙伴合作的成功,使得Windows Mobile成為大家耳熟能詳的嵌入式系統技術。那麼Windows Mobile與Windows CE到底是不是一樣的東西?

基本上,Windows Mobile與Windows CE是一樣的;Windows CE是微軟專為嵌入式系統所推出的embedded OS,Windows CE可應用於網路設備、Set-top-Box、工業控制器等嵌入式裝置。

Windows Mobile 5.0採用Windows CE 5.0的核心,是專為PocketPC與Smartphone所推出的產品。WinCE的開發環境可以相當低的花費取得,甚致可以取得免費版本;Windows Mobile的開發環境則是必須經由微軟授權後取得。

WinCE的產品開發門檻底、程式開發工具友善使用性佳、使用者介面豐富與完整的多媒體支援,使得WinCE在行動手持裝置的產品開發上具備相當的優勢。

以專為智慧型手機推出的Windows Mobile 5.0來說,除了使用性佳的操作介面與強大的多媒體撥放支援外,更可以執行Mobile Office套裝軟體(Word Mobile、PowerPoint Mobile Viewer等)、使用MSN與收發Email等。

Windows Mobile上能執行許多PC上常用的許多應用程式,例如:Mobile IE、Windows Media Player 10 Mobile 5,都是讓Windows Mobile智慧型手機更聰明好用的關鍵。在嵌入式軟體開發方面,Windows Mobile支援 .NET CF(Compact Framework);開發工具目前也整合成一套Visual Studio 2005,開發Windows Mobile的應用程式更加輕鬆愉快;需要資料庫應用的應用程式,也能使用SQL Mobile解決方案。

Embedded Linux簡介

Embedded Linux其實並不是一個作業系統,而是代表「應用Linux系統於embedded system」的名詞。因此用即是Embedding Linux來說明Embedded Linux技術是再恰當不過了。Embedded Linux的技術核心主軸是在研究「如何將Linux系統嵌入至嵌入式目標裝置裡」。

根據William E. Peisel 於Whitepaper: Embedding Linux一文對Embedded Linux的看法,Embedded Linux的定位為:「A software platform for embedded systems and devices」。

嵌入式Linux系統的技術主軸有二:(1) Linux kernel 與 (2) root filesystem。Root filesystem即是「小型的Linux系統」,root filesystem裡頭存放Linux的系統架構(filesystem hierarchy)、指令、工具、應用程式、shared libraries、驅動程式等。

Embedded Linux的root filesystem必須純手工打造(from zero / from scratch),因此熟悉Linux系統的操作、設定與管理是必要的基礎技能。

相較於WinCE友善的程式開發環境,Embedded Linux的開發環境則是比較不容易上手的。目前專門針對Embedded Linux的開發工具尚不成熟,因此我們都是在Linux的”PC”上使用Linux一般性的程式開發工具來進行嵌入式Linux的發展。

Embedded Linux的開發工具,主要以GCC和glibc為核心。GCC(http://www.gnu.org/software/gcc/gcc.html)是GNU Compiler Collection的縮寫,也就是許多編譯器的收集,目前支援的程式語言有:C、C++、Objective-C、Fortran 、Java、Ada。GLIBC是GNU的C標準程式庫,GLIBC提供system call的界面函數與標準的C函數。GLIBC也符合許多標準與規格,讓使用GLIBC的程式可以更容易移植到其它UNIX平臺。

目前應用Embedded Linux技術的產品,大多偏向「非手持型」的嵌入式系統,例如:網路設備、Set-top-box、工業控制器等。

Linux kernel

Linux 是一個作業系統核心的實作,Linux kernel 加上其它必要的系統工具 (utilities) 與其它專案程式碼的 Linux 作業系統則稱為 Linux system,一般認為標準的稱呼為 GNU/Linux (system),這是因為 Linux system 使用的系統工具大多是 GNU 的程式碼。

目前仍在使用本的kernel版本可分為4大分支:

1. Kernel 2.0.x:已經停止發展的早期版本。
2. Kernel 2.2.x:已經停止發展的早期版本。
3. Kernel 2.4.x:重要的版本分支,目前仍廣為使用中,因此仍然持續有驅動程式與處理器架構相關程式碼的更新。
4. Kernel 2.6.x:重要的Linux kernel里程碑,許多新技術、新觀念、驅動程式支援與作業系統架構都在此版本實作,是目前更新最頻繁的版本分支。

目前(2005年)的最新kernel版本為2.6.x系列,由於kernel的開發者很早就已經轉移重心至2.6系列,因此2.4系列的版本分支也將漸漸停止發展。許多2.4版本裡的重大bug也只在2.6系列版本做修正。

2.4 系列的 kernel 仍普遍使用於嵌入式系統中,但缺點是驅動程式的支援較不足;2.6 系列的 kernel 是目前最流行的分支,這個系列的 kernel 加入許多新技術的實作,當然也包含對嵌入式系統的支援,並且具備較完整的驅動程式。

Embedded Linux的重要規格標準

Embedded Linux是基於Linux系統的特殊應用,當然也要符合眾多標準才行。LSB與FHS標準是重要的二大標準,跟隨標準不但可以提供系統間的相容性,也可以提供我們一個Linux系統的建構依據。

由 FSG (Free Standards Group) 所主持的 LSB (Linux Standard Base) 專案即是在制定 GNU/Linux 的標準。根據LSB標準所發展的GNU/Linux系統,才能提供應用程式最小的可執行環境,並且可在依循LSB標準的Linux distributions上執行無誤。例如,我們可以在符合LSB標準的Red Hat Linux上發展應用程式,只要自行發展的Embedded Linux系統符合LSB標準所訂定的規範,應用程式就可以順利移植到Embedded Linux上執行。

LSB 標準也提供我們發展 Embedded Linux 的依據,雖然 Embedded Linux 系統是最小化的 Linux,但因為 Embedded Linux 是嵌入式系統的軟體平臺,所以我們不能任意精簡 Linux 系統,在精簡的過程中仍要保留最基本的作業系統環境,而 LSB 的標準正是在制定這些基本的需求。

LSB Specification共分成二大類型:

1. Generic Specification(LSB-generic):定義不會經常改變與各處理器同通之一般標準。
2. Architecture Specifications(LSB-arch):定義不同處理器架構之標準。

完整的 LSB 規格文件為 gLSB 配合特定的 archLSB 文件,若我們以 IA32 之電腦架構為主,應選擇參考 LSB Common 與 LSB IA32 二份文件。

LSB - http://www.linuxbase.org/spec
如何進行LSB 3.0的認證測試:http://www.opengroup.org/lsb/cert/docs/LSB_Certification_Guide.html

FHS 全名為 Filesystem Hierarchy Standard,是一份定義檔案與目錄標準的文件,FHS 的標準定義了目錄與檔案的擺放位置,而 UNIX-like 的系統則是根據這個標準來管理整個檔案結構。因此,不管是系統廠商、Linux/UNIX distribution 發展者、應用程式作者、套件管理者、系統維護人員都應該要依照 FHS 的標準來管理 UNIX 系統的目錄與檔案。

豐富的Free Software資源

Embedded Linux的特色是大量使用Free Software的資源,「任何你想要的軟體,幾乎都能在網路上找到自由軟體」已經成為Embedded Linux技術的重要支柱。自由軟體資源包山包海,舉凡應用程式、系統工具、網路工具、程式庫、圖形介面、小型瀏覽器、程式發展工具等等都能找得到。

因此學習Embedded Linux有一個很重要的階段就是「玩Linux!」,了解Linux的世界有什麼軟體可以用,對於將來發展Embedded Linux有絕對的幫助。甚致更進一步去學習別人寫程式的技巧,都能累積Embedded Linux的功力。

-- 作者/陳俊宏 (jollen)
原文刊載於 Run! PC 雜誌 8 月號
歡迎任意轉貼引用.但請務必註明出處

Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue

您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw