系統級單晶片(SoC)以數百萬邏輯閘來取代傳統面板上的大部份元件,這是由於超積體電路(VLSI)的微米或奈米技術已經足夠實現一般SoC的功能,同時能節省電能和成本,這也促使資訊家電、消費性電子、網路通訊市場的不斷蓬勃發展。
在過去十年前的商業思維裡,計算平台非UNIX工作站,就是個人電腦,鮮少人會想到計算平台可以縮小到只有手掌一樣大。不過,這裡所說的計算平台至少包含軟體作業系統、儲存裝置、中央處理器、輸出入通訊埠、顯示裝置、人機介面,傳統的袖珍型計算機是使用8051 CPU,沒有軟體作業系統,所以其功能是無法和SoC比擬的。
硬體變軟體
這麼多的功能全由SoC負責管控,所以面板體積可以縮小、電能和成本可以降低。不過,這其中的關鍵是硬體的工作都轉化成軟體的工作了。為何會如此?因為為了保持設計上的彈性(這一點是SoC與ASIC最大的不同),SoC裡面有許多暫存器(registers),這些暫存器所儲存的資料實際上就是硬體線路的描述,程式設計者透過這些暫存器就可以設定(configure)SoC的功能。
這些暫存器提供的設定項目包羅萬象,譬如:有支援乙太網路的SoC內部暫存器組中會有設定MAC接收和傳送控制器的暫存器、紀錄MAC接收和傳送狀態的暫存器、決定訊框(frame)位址和大小的暫存器、設定預設位址過濾封包的暫存器......等。這種轉變,對硬體廠商而言似乎是一大福音,不過,SoC所帶來的軟體開發成本卻是硬體廠商始料未及的。
孰是韌體?孰是軟體?
就技術面而言,使用SoC所開發出來的新產品一般都統稱為嵌入式系統,因為這些新產品都需要嵌入式作業系統(embedded system)。在傳統的觀念裡,所謂軟體是指含ISO第三層(網路層)以上的軟體堆疊(stack),而韌體是指ISO第二層(資料鏈結層)。
過去的硬體工程師大多數會自己設計簡單的組合語言和C語言,用來驗證電路設計的正確性。在那個時代裡,軟體作業系統是很昂貴的、很神秘的。他們最常使用的CPU是8051、8088......等之類的8-bit微控制器,他們直接使用微控制器的指令集來寫程式,這些程式叫韌體(firmware),其所設計出來的功能都很簡單。迄今,雖然16-bit、32-bit的微控制器或微處理器已經很流行,但是因為成本考量,8-bit微控制器仍然是體溫計、玩具、袖珍型計算機、家電....等產品的控制核心。
多年之後,仍然有人沿習傳統,將嵌入式作業系統稱作韌體,而單獨將ISO第七層(應用層)叫作軟體。這是因為Windows作業系統的關係,用戶只能藉用VC++、VB或其它應用軟體開發用戶的應用程式,由於微軟至今仍然不公開他的Windows原始程式碼,所以用戶只能觸及應用層。就因為Windows作業系統的魅力無法擋,許多人只懂得要學VC++、VB或其它應用軟體來開發應用程式,結果大多數人都成為「軟體工程師」。
但是遇到目前的經濟蕭條,很多企業紛紛削減了資訊設備的採購與投資,首當其衝的就是中高階電腦設備和應用軟體的需求量銳減,而嵌入式系統卻起而代之。大多數軟體工程師現在都陷入必須轉型的困境,但是要向何處轉型呢?除了放棄程式設計的生涯以外,轉往嵌入式系統成為「韌體工程師」,似乎成為唯一的一條路。
韌體的重要性
俗稱的軟體和韌體最大的不同在於:韌體與硬體關係密切(hardware dependent),但是軟體與硬體無關(hardware independent)。軟體之所以與硬體無關是因為韌體是它們兩者之間的橋樑,所以韌體工程師是很珍貴的,他必須既懂硬體還要懂各種低階程式語言,包含C、C++、組合語言、Java......等。甚至他還要協助硬體工程師偵測電路,所以他也要懂得如何使用示波器、邏輯分析儀、電表來測量訊號。有時,當利用FPGA開發SoC時,韌體工程師甚至要了解如何利用IC設計軟體在暫存器轉換層(RTL)去整合C語言、組合語言、Verilog語言。除此之外,為了找出通訊協定堆疊(protocol stack)程式的錯誤,他還必須熟悉各種通訊協定標準。但是這種萬能的人才目前實在很稀少。
如何轉型成韌體工程師?
許多軟體工程師出身自資料庫應用、網頁設計、商用應用、工業控制、人機介面......等,他們已經專精於某些特定應用技術或軟體,有些人懂FoxPro、VB,有些人懂PHP、.NET,有些人懂8051組合語言,可是他們大多數都不精通C語言。要知道目前大多數的嵌入式系統是採用SoC的組合語言、C語言設計的。所以,他們必須重新溫習C語言,並學習SoC的組合語言才行。
因為大多數軟體工程師都具有一定程度的程式設計的經驗,所以要重新溫習C語言並不是難事。不過,溫習的重點應該放在與硬體、韌體相關的部份:
1. Volatile修飾詞與SoC的暫存器息息相關,所以必須瞭解。
2. 一般軟體工程師對佇列(queue)和鏈結串列(linked lists)的設計很陌生,因為他們所使用的應用軟體已經幫他們設計好了,他們只要懂得如何使用應用函式(API)就行了。但是,嵌入式作業系統裡面的佇列和鏈結串列是以C程式的原始碼呈現的,所以必須瞭解它們的邏輯,才能應用得當。
3. 指標(pointer)、結構(structure)、陣列(array)是C語言裡面最常使用的工具,一般軟體工程師雖然瞭解但都不夠熟練,所以必須加強。
目前SoC的IP核心有許多品牌,例如:ARM、MIPS、x86、PowerPC、SH、M-Core.........等,所以要視目標產品是選用何種SoC和IP核心,再來決定要學習哪一種SoC組合語言。而SoC暫存器的設定大都是透過C語言完成的,所以也要研讀SoC的技術手冊和它的樣版程式。
結語
在人力銀行的網站上,有成千上萬的軟體工程師在找工作,想轉換跑道。但是,同時在人力銀行網站上,有經驗的韌體工程師在謀職者卻不超過一百人。聯發科和威盛的DVD晶片專利之訴訟,爭執點就在韌體上。物以稀為貴,韌體工程師的身價勢必會不斷攀高的。目前的一般軟體工程師只要有勇氣、信心、熱情,想要轉換成韌體工程師不應該是難事才對。
(作者為電子產業資深研發工程師,現為誠君工作室負責人:su2b08@saturn.seed.net.tw)