嵌入式底層軟體開發學習系列之三開發與就業方向
本節首先按開發的層次劃分大類, 對於每一層將分析其主要工作內容。
本節的第2部分將從產品的領域來介紹嵌入式的熱門應用領域。
1. 開發層次
(1) 體系結構層(CPU層)
對於普通的嵌入式產品開發公司, 該層的主要工作目的是選擇哪種CPU(Arm, mips, 等) 或 Soc來滿足自己的產品需求(成本, 效能,和維護成本). 當晶片一旦選定,可以從晶片公司獲得BSP 包,因而只需少量工作人員從事整合與除錯工作即可。 其招聘要求一般是瞭解某種cpu體系結構, 如 "熟悉ARM體系結構;熟悉高通晶片".
對於晶片公司也分為分為兩類,一類是如Intel, ARM. 要負責新的晶片產品和功能開發, 因此配套的軟體工作包含新產品的驗證, 實現這些新功能對應的體系結構程式碼(如Linux kernel/Arch/ 目錄下的程式碼).一個簡單的例子就是增加cpu64位支援. 另一種較小規模晶片公司則通過購買Arm IP或採用開源cpu來定製自己的嵌入式處理器,當有自己的定義的特性或功能時,也許要修改OS體系結構相關程式碼; 但工作量與前一類比較起來較少。這類公司往往更加註重基礎能力,如:
a. Familiarity with one or more CPU instruction sets. 需要熟悉一種或多種CPU指令集
b.Detailed understanding of computer architecture. 需要較深入瞭解計算機體系結構
c. Familiarity with ARM architectures. 熟悉ARM體系結構
有些甚至要求軟體工程師瞭解 Verilog and RTL verification flows, 這樣才能更好的和硬體design工程師協同工作。
(2) 板級
光有了晶片,系統也是無法執行的。需要通過各種電子元器件晶片連線起來。 為此就涉及到電路板的設計與製作等, 但某些規模較小的公司可能需要既懂電路製作又懂軟體開發的工程師(但這樣的崗位往往軟體部分複雜度較低, 筆者認為更適合懂一些軟體開發的電子工程師),較大一些的公司會有專門的部分負責電路板設計 。 因此筆者認為作為嵌入式軟體工程師的基本要求是能讀懂原理圖, 能使用常見的示波器就可以了, 因為軟體工程師的精力應放在複雜的軟體系統上,
對於軟體人員而言,工作主要包含如下幾部分:
(1) Boot Loader的實現或定製, UBOOT是使用較廣的一種boot loader
(2) 協助硬體工程師除錯板級硬體, 如通過測試程式測試板上個模組是否能正常工作。 如測試手機各個模組(camera, flash, wifi)等模組是否能正常工作(需要設計測試程式與測試用例)。
當出現問題時需要具備定位是哪個模組有問題, 是由於電路板的問題, 還是晶片或驅動本身存在問題; 並與相關其他開發人員溝通。
(3) 驅動層
其主要任務是編寫與除錯驅動程式, 驅動層包含四個部分:
a. 驅動模型: 對於不同作業系統有不同的驅動框架結構,為此對於驅動的編寫者這是必須熟悉的。 對作業系統理解得越深刻,學習與掌握這一部分就越容易。某些簡單的嵌入式產品可能連作業系統都沒使用,這時驅動模型的設計就完全依賴與開發者了;好的設計有助於軟體重用與維護。
b. 硬體spec與datasheet, 這對於開發驅動是最為重要的,他是編寫程式碼與除錯的依據。 驅動程式碼本身往往由晶片公司給出示例實現或直接提供程式碼, 對一些做應用的公司而言只需要移植這些程式碼到不同作業系統和平臺就可以了, 發現問題可以從晶片公司獲得幫助, 因此對規範的掌握要求相對較低。 對於晶片公司的驅動開發者,則需完全理解規範(或直接參與spec指定)。
c. 驅動的驗證: 包含驗證軟體平臺的搭建, 測試程式的實現部署等工作。
另外, 對於某些嵌入式產品,光有驅動還是不夠的, 還需要演算法, 如掃地機器人。 本節第二部分將分析相關領域知識。
(4) 核心層
目前國內這方面相對落後(缺乏直接核心開發崗位),但相關工作還是有一些的,主要工作在:
a. 針對自身嵌入式特點: 優化核心引數, 或優化部分程式碼 (如linux bootup 提速, IO 優化等)
b. 某些公司擁有自己的(或深度定製的) 嵌入式系統, 需要維護與升級它們。
c. 參與開源作業系統核心的維護
下面是一個高階核心職位的要求:
深入理解Linux核心,精通記憶體、排程、網路、檔案系統、除錯調測等模組之一
有核心社群補丁提交經驗
(5) 硬體抽象層
不同廠商的硬體,有時介面各異, 硬體抽象層為系統層提供了訪問硬體的統一介面。 為此不同裝置(晶片)廠商針對自身硬體需要設計硬體抽象層到驅動層的介面(某些已經標準化的硬體,廠商不需要實現).
(6) 系統(框架)層
a. 開發Linux作業系統發行版, Linux 發行版本很多, 國內也有一些發行版本, 如中標麒麟。
b. 為增加自身應用,需要突破原有框架的限制或直接增強原有框架; Andorid的定製中會有一些這樣的崗位。
(7) 應用層: 該層不在本系列文章討論範圍之內
下面將從嵌入式領域的角度來分析
2.嵌入式領域
(1) 網路與通訊類
網絡卡, 路由器, 光纖通訊, wifi 4G 裝置等. 從事該領域需要比較深入瞭解計算機網路和通訊相關知識。
下面是一個WIFI晶片公司的招聘要求:
a. 熟悉WIFI相關協議標準和效能指標(802.11a/b/g/n/ac無線網路協議等) (需要掌握相關協議)
b. 具有WIFI(hostapd /wpa_supplicant)開發經驗 (需要掌握上層框架軟體的開發與除錯方法)
c.熟悉以下技術中的一種或多種:DHCP, HTTP, UDP, ETHERNET, VLAN, TCP/IP (熟悉常用的網路協議)
(2) 智慧感測器與人機互動裝置
滑鼠,鍵盤;觸控式螢幕,陀螺儀等等。 複雜的一些裝置需要數字訊號處理相關知識;
(3) 音視訊與影象處理類
一類為基本裝置:如音效卡,顯示卡(GPU), 編解碼器等;另一類 產品, 如安防監控類;
需要掌握多媒體相關知識(如多媒體編解碼, 計算機2D/3D圖形學), 瞭解openCV, OpenGL框架等。
(4) 儲存裝置類
Flash, 機械硬碟,固態硬碟, 磁碟陣列等。 對於儲存裝置, 快取的設計與使用十分重要, 其次就是檔案系統, 備份與容災相關知識。
(5) 匯流排與控制器類
各種匯流排控制器, 如USB Host controller(master), 比較簡單的有I2C, SPI等匯流排。
通過上面分析我們發現, 無論哪一領域學習基本規律是:
(1) 相關協議 (2) 目前已有的框架或軟體 (3) 最好對相關演算法有一定了解