嵌入式底層軟件開發學習系列之四基本技能篇

嵌入式開發技能的學習是一個不斷積累的過程,這與在學校階段的課程學習有較大的區別; 按照軟件工程的說法, 它是一個迭代的過程。 其原因在於不同的知識相互影響, 而隨着知識的學習,代碼閱讀與編寫技能的提高,對同一技能或知識的理解水平與層次也就不同了。 下面按照迭代的思想,將幾個技能的學習步驟總結如下:

a. CPU體系結構 b.操作系統與內核 c.驅動與固件開發 ; 並推薦一些相應的書籍。 這裏假設讀者已經閱讀過嵌入式底層軟件開發與就業方向一文中的相關知識了。


(1) 第一階段

a. 可以學習一門彙編語言, 並掌握彙編程序的基本調試方法,瞭解相關指令集。

b. 學習一門操作系統的系統API編程, 如果需要的話也可以學習相應的GUI設計方法。 如進程與線程控制與同步(通訊),內存分配,(MFC,QT,JDK), socket編程等等。結合操作系統基本知識思考操作系統是如何通過這些API提供服務的.

c. 驅動基本模型(可以是純軟件的虛擬驅動); 以及一些簡單的硬件設備驅動, 如GPIO, UART, II2C 等。

d. Makefile,AutoConfig等工具的基本使用


(2) 第二階段

a. 從0開始如何構建Linux系統; 主要學習內核的編譯, GCC, GLIB編譯等 ;並能構建一個簡單的Linux 系統。 通過該學習能瞭解操作系統的基本構成

b. 閱讀一個簡單操作系統源碼,如minix, 或Linux0.11的源代碼(能力較強者可以嘗試編寫一個簡單系統內核).  對於x86 或arm而言,有大量的書籍或文章來介紹體系結構層的實現,通過這些資料應該能理解體系結構層的工作;同時還要學習較複雜Makefile如何編寫; 學習中斷控制器, timer  等的實現; 學習多任務如何切換等。

c.  學習其它開發板自帶的驅動(x68則可以學習鼠標 鍵盤等驅動)


(3) 第三階段

a. 學習系統總線及相關驅動, 如USB (USB 驅動分爲三層Device, Framework, Host), 可以採用從上往下的學習方法, 該階段要培養的重點就是如何閱讀規範,初學時可以結合現有驅動的代碼,並在規範中查找相關實現並體會。 對於驅動中的軟件部分則結合驅動模型進行體會。 如果學習camera, 或sound驅動, 可以結合相關的系統層編程接口(v412, alsa)來進行(Android的學習者可以學習Native Framework層到驅動才的實現)。

b. 學習<<深入理解Linux內核>> 或<<深入解析Windows操作系統>>來學習操作系統內核。

c. 瞭解鏈接其的工作原理(如可執行程序和動態鏈接庫是如何工作的)

d.  對於體系結構而言,如何閱讀cpu 的Arch


(4) 第四階段

a. 學習Linux Kernel源碼(可結合<<Linux內核源碼情景分析>>) ,Windows源碼可參考WRK (Windows Research Kernel)。 

   學習目標是: (1) 瞭解其設計思想與設計方法(如內核如何管理物理內存與虛擬內存,如何設計頁緩存)

                             (2) 打通某個流程, 如用戶的ReadFile是如何從用戶層一直調用到IO 驅動的。

b. 學習驅動如果僅僅侷限於驅動本身是不夠的, 需要向上下兩個層次做些擴展:

     上層是系統層或軟件框架層(協議層) (如學習wifi驅動,需要了解wpa_supplicant項目, 和wifi協議)

     下層則是需要體會硬件和軟件是如何分工的,可以嘗試去理解硬件實現的功能的工作流程。 

這樣,我們能幫助我們設計各種層次的測試用例來測試驅動和硬件. 同時能開拓視野。

c. 學習已有的同類產品的解決方案, 它的系統層,驅動層如何實現。


(5) 第五階段

a. 思考如何在實際項目中使我們的代碼最優, 如系統的引導速度,IO速度等。可以從內核和驅動和系統三個層面思考如何優化(如在目前產品的限定下,如何優化(定製)內核和驅動)

b. 當需要一些功能時, 如何借鑑內核或其它優秀開源項目中的算法或思想或直接代碼重用。

c. 思考如何劃分軟硬件的功能使我們的系統最優


下面是一些推薦的優秀圖書:

(1) 驅動:<<windows驅動開發技術詳解>> <<Linux設備驅動程序>>

(2) 內核 <<Linux內核情景分析>> (<<windows內核情景分析>> 採用react os)<<深入理解Linux內核>> 

(3) 系統:  <<Linux From scratch>> <<深度探索Linux操作系統 系統構建和原理解析>>  << 深入理解Android>>  <深入解析Windows操作系統>> <<程序員的自我修養>> 

                <<unix環境高級編程>> 

(4) 體系結構: <<Arm體系結構域編程>>  << x86/x64體系探索及編程>>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章