1. 程式人生 > >嵌入式Linux學習路線圖

嵌入式Linux學習路線圖

網站/論壇:www.100ask.org 淘 寶:100ask.taobao.com 郵 箱:[email protected] 微信公眾號:baiwenkeji 公司 微博:百問科技 個人 微博:韋東山

版本 日期 作者 說明
V1 2016.07.29 韋東山 第1版本,Android部分未寫

我是1999年上的大學,物理專業。在大一時,我們班裡普遍瀰漫著對未來的不安,不知道學習了物理後出去能做什麼。你當下的經歷、當下的學習,在未來的一天肯定會影響到你。畢業後我們也各自找到了自己的職業:出國深造轉行做金融、留校任教做科研、設計晶片、寫程式、創辦公司等等,這一切都離不開在校時學到的基礎技能(數學、IT、電子電路)、受過煅煉的自學能力。 所以,各位正在迷茫的在校生,各位正在嘗試轉行的程式設計師,未來一定有你的位置,是好是壞取決於你當下的努力與積累。

我不能預言幾年後什麼行業會熱門,也不能保證你照著本文學習可以發財。我只是一個有十幾年經驗的程式設計師,給對程式設計有興趣的你,提供一些建議。

1.程式設計師的三大方向

程式設計師的方向,一般可以分為3類:專業領域、業務領域、作業系統領域。你瞭解它們後,按興趣選擇吧。 對於專業領域,我提供不了建議。 業務,也就是應用程式,它跟作業系統並不是截然分開的: ①開發實體產品時,應用程式寫得好的人,有時候需要作業系統的知識,比如排程優先順序的設定、知道某些函式可能會令程序休眠。

②寫應用程式的人進階為系統工程師時,他需要從上到下都瞭解,這時候就需要有作業系統領域的知識了,否則,你怎麼設計整個系統的方案呢?

③做應用程式的人,需要了解行業的需求,理解業務的邏輯。所以,當領導的人,多是做應用的。一旦鑽入了某個行業,很難換行業。

④而作業系統領域,做好了這是通殺各行業:他只負責底層系統,在上面開發什麼業務跟他沒關係。這行很多是技術宅,行業專家。

⑤作業系統和業務之間並沒有一個界線。有作業系統經驗,再去做應用,你會對系統知根知底,碰到問題時都有解決思路。有了業務經驗,你再瞭解一下作業系統,很快就可以組成一個團隊自立門戶,至少做個CTO沒問題。

1.1 專業領域

它又可以分為下面2類。

1.1.1 學術研究

比如語音、影象處理、人工智慧,這類工作需要你有比較強的理論知識,我傾向於認為這類人是“科學家”,他們鑽研多年,很多時候是在做學術研究。 在嵌入式領域,需要把他們的成果用某種演算法表達出來,針對某種晶片進行優化,這部分工作也許有專人來做。

1.1.2 工程實現

也有這樣一類人,他們懂得這些專業領域的概念,但是沒有深入鑽研。可以使用各類開源資料實現某個目標,做出產品。比如影象處理,他懂得用opencv裡幾百個複雜函式來實現頭像識別。有時候還可以根據具體晶片來優化這些函式。

“專業領域”不是我的菜,如果你要做這一塊,我想最好的入門方法是在學校學習研究生、博士課程。

1.2 業務領域

換句話說,就是應用程式,這又可以分為下面2類。

1.2.1 介面顯示

做產品當然需要好的介面,但是,不是說它不重要,是沒什麼發展後勁。 現在的熱門詞是Android APP和IOS APP開發。你不要被Android、IOS兩個詞騙了,它們跟以前的VC、VB是同一路貨色,只是、僅僅是一套GUI控制元件的實現。

希望沒有冒犯到你,我有理由。

一個程式需要有GUI介面,但是程式的內在邏輯才是核心。Android、IOS的開發工具給我們簡化了GUI的開發,並提供了這些控制元件的互動機制,封裝並提供了一些服務(比如網路傳輸)。但是程式內部的業務邏輯、對視訊影象聲音的處理等等,這才是核心。另外別忘了伺服器那邊的後臺程式:怎樣更安全地儲存資料、保護客戶的隱私,怎樣處理成千上萬上百萬的併發訪問,等等,這也是核心。

但是,從Android、IOS APP入門入行,這很快!如果你是大四,急於找到一份工作,那麼花上1、2個月去學習Android或IOS,應該容易找到工作,畢竟APP的需求永遠是最大的,現在這兩門技術還算熱門。在2011、2012年左右,Android程式設計師的起薪挺高,然後開始下滑。Android APP的入門基本只要1個月,所以懂的人也越來越多。2013、2014年,IOS開發的工資明顯比Android高了,於是各類IOS培訓也火曝起來。中華大地向來不缺速成人才,估計再過一陣子IOS工程師也是白菜價了。

會Android、IOS只是基本要求,不信去51job搜搜Android或IOS,職位要求裡肯定其他要求。

1.2.2 業務邏輯

舉個簡單例子,做一個打卡軟體,你需要考慮這些東西: ①正常流程是上班下班時都要打卡 ②有人忘記了怎麼辦?作為異常記錄在案,推送給管理員 ③請假時怎麼處理? ④加班怎麼處理?

對於更復雜的例子,視訊會議系統裡,各個模組怎麼對接,各類協議怎麼相容,你不深入這個行業,你根本搞不清楚。

應用開發的職位永遠是最多的,入門門檻也低。基本上只要你會C語言,面試時表現比較得體,一般公司都會給你機會。因為: ①你進公司後,還需要重新培訓你:熟悉它們的業務邏輯。 ②你要做的,基本也就是一個個模組,框架都有人給你定好了,你去填程式碼就可以了。

說點讓你高興的事:軟體公司裡,做領導的基本都是寫應用程式的(當然還有做市場的)。寫應用程式的人,對外可以研究市場接待客戶,對內可以管理程式設計師完成開發,不讓他做領導讓誰做?

如果你的志向是寫應用程式,那麼我建議你先練好基本功:資料結構、演算法是必備,然後憑興趣選擇資料庫、網路程式設計等等進行深入鑽研。 最後,選擇你看好的、感興趣的行業深耕個10年吧。做應用開發的人選擇了某個行業,後面是很難換行業的,選行很重要!

1.3 作業系統領域

UCOS太簡單,VxWorks太貴太專業,Windows不玩嵌入式了,IOS不開源,所以對於作業系統領域我們也只能玩Linux了。

在嵌入式領域Linux一家獨大! Android呢?Android跟QT一樣,都是一套GUI系統。只是Google的實力太強了,現在Android無處不在,所以很多時候Linux+Android成了標配注意,在這裡我們關心的是Android的整個系統、裡面的機制,而不是學習幾個API然後開發介面程式。

作業系統領域所包含的內容,簡單地說,就是製作出一臺裝好系統的專用“電腦”,可以分為:

①為產品規劃硬體: 按需求、效能、成本選擇主晶片,搭配周邊外設,交由硬體開發人員設計。 ②給單板製作、安裝作業系統、編寫驅動 ③定製維護、升級等系統方案 ④還可能要配置、安裝Android等GUI系統: ⑤為應用開發人員配置開發環境 ⑥從系統角度解決疑難問題

這個領域,通常被稱為“底層系統”或是“驅動開發”。 先解決2個常見誤區: ①這份工作是寫驅動程式嗎? 看看上面羅列的6點,應該說,它包含驅動開發,但遠遠不只有驅動開發。

我們還需要寫驅動嗎?不是有原廠嗎?或者只需要改改就可以? 經常有人說,晶片原廠都做好驅動了,拿過來改改就可以了。如果,你的硬體跟原廠的公板完全一樣,原廠原始碼毫無BUG,不想優化效能、削減成本,不想做一些有特色的產品,那這話是正確的。

但是在這個不創新就是找死的年代,可能嗎?!原因有二: ①即使只是修改程式碼,能修改的前提是能理解;能理解的最好煅煉方法是從零寫出若干驅動程式

②很多時候,需要你深度定製系統。 以前做聯發科手機只需要改改介面就可以出貨了,現在山寨廠一批批倒下。大家都使用原廠的方案而不加修改時,最後只能拼成本。 舉個例子,深圳有2家做交通攝像頭、監控攝像頭的廠家,他們曾經找我做過4個專案: ①改進廠家給的SD卡驅動效能,使用DMA。 ②換了Flash型號後,系統經常出問題,需要修改驅動BUG。 ③觸控式螢幕點選不準,找原因,後來發現是旁路電容導致的。 ④裁減成本,把4片DDR換為2片DDR,需要改bootloader對DDR的初始化。 這些專案都很急,搞不定就無法出貨,這時候找原廠?除非你是中興華為等大客戶,否則誰理你?

我在中興公司上班時,寫驅動的時間其實是很少的,大部分時間是除錯:系統調優,上幫APP工程師、下幫硬體工程師查詢問題。我們從廠家、網上得到的原始碼,很多都是標準的,當然可以直接用。但是在你的產品上也許優化一下更好。比如我們可以把攝像頭驅動和DMA驅動揉合起來,讓攝像頭的資料直接通過DMA發到DSP去。我們可以在軟體和硬體之間起橋樑作用,對於實體產品,有可能是軟體出問題也可能是硬體出問題,一般是底層系統工程師比較容易找出問題。

當硬體、軟體應用出現問題,他們解決不了時,從底層軟體角度給他們出主意,給他們提供工具。再比如方案選擇:晶片效能能否達標、可用的BSP是否完善等等,這隻能由負責整個方案的人來考慮,他必須懂底層。

在作業系統領域,對知識的要求很多: ①懂硬體知識才能看懂電路圖 ②英文好會看晶片手冊 ③有編寫、移植驅動程式的能力 ④對作業系統本身有一定的理解,才能解決各類疑難問題 ⑤理解Android內部機制 ⑥懂彙編、C語言、C++、JAVA

它絕對是一個大坑,沒有興趣、沒有毅力的人慎選。 ①這行的入門,絕對需要半年以上,即使全天學習也要半年。 ②它的職位,絕對比APP的職位少 ③並且你沒有1、2年經驗,招你到公司後一開始你做的還是APP。

優點就是: ①學好後,行業通殺,想換行就換行;想自己做產品就自己做產品。 ②相比做應用程式的人,不會被經常變動的需求搞得天天加班。 ③門檻高,當然薪水相對就高。

作業系統領域,我認為適合於這些人: ①硬體工程師想轉軟體工程師,從底層軟體入門會比較好 ②微控制器工程師,想升級一下。會Linux底層的人肯定會微控制器,會微控制器的人不一定會Linux。 ③時間充足的學生:如果你正讀大二大三,那麼花上半年學習嵌入式Linux底層多有益處。 ④想掌握整個系統的人,比如你正在公司裡寫APP,但是想升為系統工程師,那麼底層不得不學。 ⑤想自己創業做實體產品的工程師,你有錢的話什麼技術都不用學,但是如果沒錢又想做產品,那麼Linux底層不得不學。 ⑥做Linux APP的人,沒錯,他們也要學習。 這部分人不需要深入,瞭解個大概就可以:bootloader是用來啟動核心,Linux的檔案系統(第1個程式是什麼、做什麼、各目錄幹嘛用)、APP跟驅動程式的呼叫關係、工具鏈,有這些概念就可以了

本文中,就把作業系統預設為Linux,講講怎麼學習嵌入式Linux+Android系統。

1.4 嵌入式Linux+Android系統包含哪些內容

嵌入式Linux系統包含哪些東西?不要急,舉一個例子你就知道了。 ①電腦一開機,那些介面是誰顯示的? 是BIOS,它做什麼?一些自檢,然後從硬碟上讀入windows,並啟動它。 類似的,這個BIOS對應於嵌入式Linux裡的bootloader。這個bootloader要去Flash上讀入Linux核心,並啟動它。

②啟動windows的目的是什麼? 當然執行應用程式以便上網、聊天什麼的了。 這些上網程式、聊天程式在哪? 在C盤、D盤上。 所以,windows要先識別出C盤、D盤。在Linux下我們稱之為根檔案系統。 ③windows能識別出C盤、D盤,那麼肯定有讀寫硬碟的能力。

這個能力我們稱之為驅動程式。當然不僅僅是操作硬碟,還有網絡卡、USB等等其他硬體。嵌入式Linux能從Flash上讀出並執行應用程式,肯定也得有Flash的驅動程式啊,當然也不僅僅是Flash。

簡單地說,嵌入式LINUX系統裡含有bootloader、核心、驅動程式、根檔案系統、應用程式這5大塊。而應用程式,我們又可以分為:C/C++、Android。 所以,嵌入式Linux+Android系統包含以下6部分內容: ①bootloader ②Linux核心 ③驅動程式 ④使用C/C++編寫的應用程式 ⑤Android系統本身 ⑥Android應用程式

Android跟Linux的聯絡實在太大了,它的應用是如此廣泛,學習了Linux之後沒有理由停下來不學習Android。在大多數智慧裝置中,執行的是Linux作業系統;它上面要麼安裝有Android,要麼可以跟Android手機互聯。現在,Linux+Android已成標配。

2. 怎麼學習嵌入式Linux作業系統

本文假設您是零基礎,以實用為主,用最快的時間讓你入門;後面也會附上想深入學習時可以參考的資料。

在實際工作中,我們從事的是“作業系統”周邊的開發,並不會太深入學習、修改作業系統本身。 ①作業系統具有程序管理、儲存管理、檔案管理和裝置管理等功能,這些核心功能非常穩定可靠,基本上不需要我們修改程式碼。我們只需要針對自己的硬體完善驅動程式 ②學習驅動時必定會涉及其他知識,比如儲存管理、程序排程。當你深入理解了驅動程式後,也會加深對作業系統其他部分的理解 ③Linux核心中大部分程式碼都是裝置驅動程式,可以認為Linux核心由各類驅動構成

但是,要成為該領域的高手,一定要深入理解Linux作業系統本身,要去研讀它的原始碼。 在忙完工作,閒暇之餘,可以看看這些書: ①趙炯的《linux核心完全註釋》,這本比較薄,推薦這本。他後來又出了《Linux 核心完全剖析》,太厚了,搞不好看了後面就忘記前面了。 ②毛德操、胡希明的《LINUX核心原始碼情景分析》,此書分上下冊,巨厚無比。當作字典看即可:想深入理解某方面的知識,就去看某章節。 ③其他好書還有很多,我沒怎麼看,沒有更多建議

基於快速入門,上手工作的目的,您先不用看上面的書,先按本文學習。

2.1 入門路線圖

假設您是零基礎,我們規劃瞭如下入門路線圖。前面的知識,是後面知識的基礎,建議按順序學習。每一部分,不一定需要學得很深入透徹,下面分章節描述。 這裡寫圖片描述

2.2 學習驅動程式之前的基礎知識

2.2.1 C語言

只要是理工科專業的,似乎都會教C語言。我見過很多C語言考試90、100分的,一上機就傻了,我懷疑他們都沒在電腦上寫過程式。 理論再好,沒有實踐不能幹活的話,公司招你去幹嘛? 反過來,實踐出真知,學習C語言,必須練練練、寫寫寫! 當你掌握基本語法後,就可以在電腦上練習一些C語言習題了; 當你寫過幾個C程式後,就可以進入下一階段的裸機開發了。

不需要太深入 作為快速入門,只要你會編寫“Hello, world!”,會寫氣泡排序,會一些基礎的語法操作,暫時就夠了。

指標操作是重點,多練習; 不需要去學習過多的資料結構知識,只需要掌握連結串列操作,其他不用學習,比如:佇列、二叉樹等等都不用學;不需要去學習任何的函式使用,比如檔案操作、多執行緒程式設計、網路程式設計等等;這些知識,在編寫Linux應用程式時會用,但是在作業系統特別是驅動學習時,用不著!

永往直前吧,以後碰到不懂的C語言問題,我們再回過頭來學習。 在後續的“裸機開發”中,會讓你繼續練習C語言,那會更實戰化。 C語言是在寫程式碼中精進的。

②可以在Visual Studio下學習,也可以在Linux下學習,後者需要掌握一些編譯命令,我們暫時沒有提供C語言的教程,找一本C語言書,網上找找免費的C語言視訊(主要看怎麼搭建環境),就可以自學了。

2.2.2 PC Linux基本操作:

對於PC Linux,我們推薦使用Ubuntu,在它上面安裝軟體非常簡便。 我們的工作模式通常是這樣:在Windows下閱讀、編寫程式碼,然後把程式碼上傳到PC Linux去編譯。實際上,Ubuntu的桌面系統已經很好用了,我們拿到各種智慧機可以很快上手,相信Ubuntu的桌面系統也可以讓你很快上手。為了提高工作效率,我們通常使用命令列來操作Ubuntu。

不用擔心,你前期只需要掌握這幾條命令就可以了,它們是如此簡單,我乾脆列出它們: ①cd : Change Directory(改變目錄)

cd 目錄名          // 進入某個目錄
cd ..            // cd “兩個點”:返回上一級目錄
cd -             // cd “短橫”:返回上一次所在目錄
  • 1
  • 2
  • 3

②pwd : Print Work Directory(列印當前目錄 顯示出當前工作目錄的絕對路徑) ③mkdir : Make Directory(建立目錄)

mkdir abc         // 建立資料夾abc
mkdir -p a/b/c    // 建立資料夾a,再a下建立資料夾b,再在b下建立資料夾c
  • 1
  • 2

④rm : Remove(刪除目錄或檔案)

rm  file     // 刪除名為file的檔案
rm -rf dir   // 刪除名為dir的目錄
  • 1
  • 2

⑤ls : List(列出目錄內容) ⑥mount : 掛載

mount -t nfs -o nolock,vers=2 192.168.1.123:/work/nfs_root /mnt
mount -t yaffs /dev/mtdblock3 /mnt
  • 1
  • 2

⑦chown : Change owner(改變檔案的屬主,即擁有者)

chown book:book /work -R  //對/work目錄及其下所有內容,屬主改為book使用者,組改為book
  • 1

⑧chmod : Change mode(改變許可權),下面的例子很簡單粗暴

chmod 777 /work -R  // 對/work目錄及其下所有內容,許可權改為可讀、可寫、可執行
  • 1

⑨vi : Linux下最常用的編輯命令,使用稍微複雜,請自己搜尋用法。

要練習這些命令,你可以進入Ubuntu桌面系統後,開啟終端輸入那些命令;或是用SecureCRT、putty等工具遠端登入Ubuntu後練習。

2.2.3 硬體知識

我們學習硬體知識的目的在於能看懂原理圖,看懂通訊協議,看懂晶片手冊;不求能設計原理圖,更不求能設計電路板。 對於正統的方法,你應該這樣學習: ①學習《微機原理》,理解一個計算機的組成及各個部件的互動原理。 ②學習《數位電路》,理解各種閘電路的原理及使用,還可以掌握一些邏輯運算(與、或等)。 ③《類比電路》?好吧,這個不用學,至少我在工作中基本用不到它,現在全忘光了。

就我個人經驗來說,這些課程是有用的,但是: ①原理有用,實戰性不強。 比如《微機原理》是基於x86系統,跟ARM板子有很大差別,當然原理相通。 我是在接觸嵌入式程式設計後,才理解了這些課程。 ②每本書都那麼厚,內容都很多,學習時間過長,自學有難度。

針對這些校園教材的不足,並結合實際開發過程中要用到的知識點,我們推出了《學前班_怎麼看原理圖》的系列視訊:

學前班第1課第1節___怎麼看原理圖之GPIO和閘電路.wmv
學前班第1課第2.1節_怎麼看原理圖之協議類介面之UART.wmv
學前班第1課第2.2節_怎麼看原理圖之協議類介面之I2C.wmv
學前班第1課第2.3節_怎麼看原理圖之協議類介面之SPI.wmv
學前班第1課第2.4節_怎麼看原理圖之協議類介面之NAND Flash.wmv
學前班第1課第2.5節_怎麼看原理圖之協議類介面之LCD.wmv
學前班第1課第3節___怎麼看原理圖之記憶體類介面.wmv
學前班第1課第4.1節_怎麼看原理圖之分析S3C2410開發板.wmv
學前班第1課第4.2節_怎麼看原理圖之分析S3C2440開發板.wmv
學前班第1課第4.3節_怎麼看原理圖之分析S3C6410開發板.wmv
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

即使你只具備初中物理課的電路知識,我也希望能通過這些視訊,讓你可以看懂原理圖,理解一些常見的通訊協議;如果你想掌握更多的硬體知識,這些視訊也可以起個索引作用,讓你知道缺乏什麼知識。

這些視訊所講到的硬體知識,將在《裸板開發》系列視訊中用到,到時可以相互對照著看,加深理解。

2.2.4 要不要專門學習Windows下的微控制器開發 很多學校都開通了微控制器的課程,很多人都是從51微控制器、AVR微控制器,現在比較新的STM32微控制器開始接觸嵌入式領域,並且使用Windows下的開發軟體,比如keil、MDK等。 問題來了,要不要專門學習Windows下的微控制器開發? ①如果這是你們專業的必修課,那就學吧 ②如果你的專業跟微控制器密切相關,比如機械控制等,那就學吧 ③如果你只是想從微控制器入門,然後學習更廣闊的嵌入式Linux,那麼放棄在Windows下學習微控制器吧!

理由如下: ①Windows下的微控制器學習,深度不夠 Windows下有很好的圖形介面微控制器開發軟體,比如keil、MDK等。 它們封裝了很多技術細節,比如: 你只會從main函式開始編寫程式碼,卻不知道上電後第1條程式碼是怎麼執行的; 你可以編寫中斷處理函式,但是卻不知道它是怎麼被呼叫的; 你不知道程式怎麼從Flash上被讀入記憶體; 也不知道記憶體是怎麼劃分使用的,不知道棧在哪、堆在哪; 當你想裁剪程式降低對Flash、記憶體的使用時,你無從下手; 當你新建一個檔案時,它被自動加入到工程裡,但是其中的機理你完全不懂; 等等等。

②基於ARM+Linux裸機學習,可以學得更深,並且更貼合後續的Linux學習。實際上它就是Linux下的微控制器學習,只是一切更加原始:所有的程式碼需要你自己來編寫;哪些檔案加入工程,需要你自己來管理。 在工作中,我們當然傾向於使用Windows下更便利的工具,但是在學習階段,我們更想學習到程式的本質。

一切從零編寫程式碼、管理程式碼,可以讓我們學習到更多知識: 你需要了解晶片的上電啟動過程,知道第1條程式碼如何執行; 你需要掌握怎麼把程式從Flash上讀入記憶體; 需要理解記憶體怎麼規劃使用,比如棧在哪,堆在哪; 需要理解程式碼重定位; 需要知道中斷髮生後,軟硬體怎麼保護現場、跳到中斷入口、呼叫中斷程式、恢復現場; 你會知道,main函式不是我們編寫的第1個函式; 你會知道,晶片從上電開始,程式是怎麼被搬運執行的; 你會知道,函式呼叫過程中,引數是如何傳遞的; 你會知道,中斷髮生時,每一個暫存器的值都要小心對待; 等等等。

你掌握了ARM+Linux的裸機開發,再回去看Windows下的微控制器開發,會驚呼:怎麼那麼簡單!並且你會完全明白這些工具沒有向你展示的技術細節。

驅動程式=Linux驅動程式軟體框架+ARM開發板硬體操作,我們可以從簡單的裸機開發入手,先掌握硬體操作,並且還可以: ①掌握如何在PC Linux下編譯程式、把程式燒錄到板子上並執行它 ②為學習bootloader打基礎:掌握了各種硬體操作後,後面一組合就是一個bootloader

2.2.5 為什麼選擇ARM9 S3C2440開發板,而不是其他效能更好的?

有一個錯誤的概念:S3C2440過時了、ARM9過時了。 這是不對的,如果你是軟體工程師,無論是ARM9、ARM11、A8還是A9,對我們來說是沒有差別的。 一款晶片,上面有CPU,還有眾多的片上裝置(比如UART、USB、LCD控制器)。我們寫程式時,並不涉及CPU,只是去操作那些片上裝置。 所以:差別在於片上裝置,不在於CPU核;差別在於暫存器操作不一樣。 因為我們寫驅動並不涉及CPU的核心,只是操作CPU之外的裝置,只是讀寫這些裝置的暫存器。 之所以推薦S3C2440,是因為它的Linux學習資料最豐富,並有配套的第1、2期視訊。

2.2.6 怎麼學習ARM+Linux的裸機開發

學習裸機開發的目的有兩個: ①掌握裸機程式的結構,為後續的u-boot作準備 ②練習硬體知識,即:怎麼看原理圖、晶片手冊,怎麼寫程式碼來操作硬體

後面的u-boot可以認為是裸機程式的集合,我們在裸機開發中逐個掌握各個部件,再集合起來就可以得到一個u-boot了。 後續的驅動開發,也涉及硬體操作,你可以在裸機開發中學習硬體知識。

注意:如果你並不關心裸機的程式結構,不關心bootloader的實現,這部分是可以先略過的。在後面的驅動視訊中,我們也會重新講解所涉及的硬體知識。

推薦兩本書:杜春蕾的《ARM體系結構與程式設計》,韋東山的《嵌入式Linux應用開發完全手冊》。後者也許是國內第1本涉及在PC Linux環境下開發的ARM裸機程式的書,如果我說錯了,請原諒我書讀得少。

對於裸機開發,我們提供有2部分視訊:

①環境搭建
第0課第1節_剛接觸開發板之介面接線.wmv0課第2節_剛接觸開發板之燒寫裸板程式.wmv0課第3節_剛接觸開發板之重燒整個系統.wmv0課第4節_剛接觸開發板之使用vmwae和預先做好的ubuntu.wmv0課第5節_剛接觸開發板之u-boot打補丁編譯使用及建sourceinsight工程.wmv0課第6節_剛接觸開發板之核心u-boot打補丁編譯使用及建sourceinsight工程.wmv0課第7節_剛接觸開發板之製作根檔案系統及初試驅動.wmv0課第8節_在TQ2440,MINI2440上搭建視訊所用系統.wmv0課第9節_win7下不能使用dnw燒寫的替代方法.wmv

②裸機程式開發
第1課 環境搭建及工具、概念介紹.wmv2課 GPIO實驗.wmv3課 儲存管理器實驗.wmv4課 MMU實驗.wmv5課 NAND FLASH控制器.wmv6課 中斷控制器.wmv7課 系統時鐘和UART實驗.wmv8課 LCD實驗.wmv
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

要宣告的是: 錄製上述《裸機程式開發》視訊時,本意是結合《嵌入式Linux應用開發完全手冊》的《第2篇 ARM9嵌入式系統基礎例項篇》來講解,所以視訊裡沒有完全從零編寫程式碼,需要結合書本來學習。 ①書和視訊並不是完全配套的,不要照搬,其中的差異並不難解決。 《嵌入式Linux應用開發完全手冊》發表於2008年,使用了很多款開發板,並且那時的開發板配置較低(Nand Flash是64M);《裸機程式開發》視訊使用JZ2440開發板錄製。

②書和視訊,適用於所有S3C2440開發板,包括mini2440、tq2440等 天下S3C2440配置都是相似的,基本也就是LED、按鍵所用引腳不同,LCD型號不同;你學習了書、視訊,如果連這些差異都搞不定的話,那就是你我的失敗了。

學習方法是這樣的: ①先看《環境搭建》視訊來搭建開發環境 ②書(第2篇)和視訊(裸機程式開發)結合,看完一章,練習一章 一定要編寫程式碼,即使是照抄也要寫。 ③如果對於ARM架構相關的知識,覺得模糊或是想了解得更深入,參考《ARM體系結構與程式設計》

學習程度: ①理解一個裸機程式的必要結構:異常向量、硬體初始化、程式碼重定位、棧 ②知道如何操作GPIO、Flash、LCD、觸控式螢幕等硬體 ③很多人覺得MMU難以理解,可以放過它

2.2.7 bootloader的學習

bootloader有很多種,vivi、u-boot等等,最常用的是u-boot。 u-boot功能強大、原始碼比較多,對於程式設計經驗不豐富、閱讀程式碼經驗不豐富的人,一開始可能會覺得難以掌握。 但是,u-boot的主要功能就是:啟動核心。它涉及:讀取核心到記憶體、設定啟動引數、啟動核心。按照這個主線,我們嘗試自己從零編寫一個bootloader,這個程式相對簡單,可以讓我們快速理解u-boot主要功能的實現。

從零編寫bootloader的視訊有:
畢業班第1課第1.1節_自己寫bootloader之編寫第1階段.wmv
畢業班第1課第1.2節_自己寫bootloader之編寫第2階段.wmv
畢業班第1課第2節_自己寫bootloader之編譯測試.wmv
畢業班第1課第3節_自己寫bootloader之改進.wmv


分析u-boot 1.1.6的視訊有:
第9課第1節 u-boot分析之編譯體驗.wmv9課第2節 u-boot分析之Makefile結構分析.wmv9課第3節 u-boot分析之原始碼第1階段.wmv9課第3節 u-boot分析之原始碼第2階段.wmv9課第4節 u-boot分析之u-boot命令實現.wmv9課第5節 u-boot分析_uboot啟動核心.wmv

移植一個全新u-boot的視訊有:
畢業班第2課第1節_移植最新u-boot之初試.wmv
畢業班第2課第2.1節_移植最新u-boot之分析啟動過程之概述.wmv
畢業班第2課第2.2節_移植最新u-boot之分析啟動過程之記憶體分佈.wmv
畢業班第2課第2.3節_移植最新u-boot之分析啟動過程之重定位.wmv
畢業班第2課第3.1節_移植最新u-boot之修改程式碼之建新板_時鐘_SDRAM_UART.wmv
畢業班第2課第3.2節_移植最新u-boot之修改程式碼支援NAND啟動.wmv
畢業班第2課第3.3節_移植最新u-boot之修改程式碼支援NorFlash.wmv
畢業班第2課第3.4節_移植最新u-boot之修改程式碼支援NandFlash.wmv
畢業班第2課第3.5節_移植最新u-boot之修改程式碼支援DM9000網絡卡.wmv
畢業班第2課第4.1節_移植最新u-boot之裁剪和修改預設引數.wmv
畢業班第2課第4.2節_移植最新u-boot支援燒寫yaffs映象及製作補丁.wmv
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

《嵌入式Linux應用開發完全手冊》上對u-boot的講解有如下章節:

15.1    Bootloader簡介
15.1.1  Bootloader的概念
15.1.2  Bootloader的結構和啟動過程
15.1.3  常用Bootloader介紹
15.2    U-Boot分析與移植
15.2.1  U-Boot工程簡介
15.2.2  U-Boot原始碼結構
15.2.3  U-Boot的配置、編譯、連線過程
15.2.4  U-Boot的啟動過程原始碼分析
15.2.5  U-Boot的移植
15.2.6  U-Boot的常用命令
15.2.7  使用U-Boot來執行程式
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

學習方法如下: ①先學習《從零編寫bootloader的視訊》,這可以從最少的程式碼理解bootloader的主要功能 ②再看書上對u-boot的講解,並結合《分析u-boot 1.1.6的視訊》來理解 ③最後,有時間有興趣的話,看《移植一個全新u-boot的視訊》,這不是必須的。

學習程度: ①理解u-boot的啟動過程,特別是u-boot程式碼重定位:怎麼從Flash上把自己讀入記憶體 ②理解u-boot的核心:命令 ③知道bootloader如何給核心傳遞引數 ④知道bootloader是根據“bootcmd”指定的命令啟動核心 ⑤作為入門:只求理解,不要求能移植u-boot

2.2.8 Linux核心的學習

前面說過,核心本身不是我們學習的重點,但是瞭解一下核心的啟動過程,還是很有必要的:工作中有可能要修改核心以適配硬體,掌握了啟動過程才知道去修改哪些檔案。

分析核心的視訊有:
第10課第1節 核心啟動流程分析之編譯體驗.wmv10課第2節 核心啟動流程分析之配置.wmv10課第3節 核心啟動流程分析之Makefile.wmv10課第4節 核心啟動流程分析之核心啟動.wmv

移植核心的視訊有:
業班第3課第1節_移植3.4.2核心之框架介紹及簡單修改.wmv
畢業班第3課第2節_移植3.4.2核心之修改分割槽及製作根檔案系統.wmv
畢業班第3課第3節_移植3.4.2核心之支援yaffs檔案系統.wmv
畢業班第3課第4節_移植3.4.2核心之裁剪及ECC簡介及製作補丁.wmv
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

《嵌入式Linux應用開發完全手冊》上對核心的講解有如下章節:

16.1    Linux版本及特點
16.2    Linux移植準備
16.2.1  獲取核心原始碼
16.2.2  核心原始碼結構及Makefile分析
16.2.3  核心的Kconfig分析
16.2.4  Linux核心配置選項
16.3    Linux核心移植
16.3.1  Linux核心啟動過程概述
16.3.2  修改核心以支援S3C2410/S3C2440開發板
16.3.3  修改MTD分割槽
16.3.4  移植YAFFS檔案系統
16.3.5  編譯、燒寫、啟動核心
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

學習方法如下: ①先看書,並結合《分析核心的視訊》進行理解 ②如果有興趣,再根據《移植核心的視訊》自己掌握移植核心,這不是必須的

學習程度: ①知道機器ID的作用,根據機器ID找到單板對應的檔案 ②知道Makefile、Kconfig的作用,知道怎麼簡單地配置核心 ③知道怎麼修改分割槽 ④作為入門:只求理解,不要求能移植

2.2.9 根檔案系統

在驅動程式開發階段,我們喜歡搭建一個最小根檔案系統來除錯驅動; 在開發應用程式時,也需要搭建檔案系統,把各種庫、配置檔案放進去; 在釋出產品時,你還需要修改配置檔案,使得產品可以自動執行程式; 甚至你想實現插上U盤後自動啟動某個程式,這也要要修改配置檔案; 這一切,都需要你理解根檔案系統的構成,理解核心啟動後是根據什麼配置檔案來啟動哪些應用程式。

分析根檔案系統的視訊有:
第11課第1節 構建根檔案系統之啟動第1個程式.wmv11課第2節 構建根檔案系統之init程序分析.wmv11課第3節 構建根檔案系統之busybox.wmv11課第4節 構建根檔案系統之構建根檔案系統.wmv
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

《嵌入式Linux應用開發完全手冊》上對檔案系統的講解有如下章節:

17.1    Linux檔案系統概述 
17.1.1  Linux檔案系統的特點    
17.1.2  Linux根檔案系統目錄結構  
17.1.3  Linux檔案屬性介紹 
17.2    移植Busybox   
17.2.1  Busybox概述   
17.2.2  init程序介紹及使用者程式啟動過程   
17.2.3  編譯/安裝Busybox    
17.3    使用glibc庫    
17.3.1  glibc庫的組成   
17.3.2  安裝glibc庫    
17.4    構建根檔案系統 
17.4.1  構建etc目錄 
17.4.2  構建dev目錄 
17.4.3  構建其他目錄  
17.4.4  製作/使用yaffs檔案系統映象檔案  
17.4.5  製作/使用jffs2檔案系統映象檔案
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

學習方法:結合書和視訊學習。 學習程度: ①理解配置檔案的作用 ②知道根檔案系統中lib裡的檔案來自哪裡 ③可以製作、燒寫檔案系統映象檔案

2.3 驅動程式的學習

《嵌入式Linux應用開發完全手冊》對驅動程式的講解不多,我們推出的“韋東山Linux視訊第2期_驅動現場編寫除錯”,可以認為完全脫離了書本。 所以,驅動程式的學習完全按照視訊來就可以了。 第2期的視訊,對每一個驅動,先講解硬體原理,然後從零寫程式碼,從簡單到複雜,逐漸完善它的功能。

我們不會羅列專業術語,會參考日常生活的例子,力爭用最形象的比喻讓你輕鬆入門,同時又會很深入。 注意:我們可以讓你入門時很輕鬆,但是要深入理解的話,這需要你跟著視訊練習程式碼,這是個要慢慢思考的過程,不會輕鬆。 輕鬆的話,憑什麼拿高工資? 再次申明:即使照抄也要寫程式碼!很多人視訊看得很高興,但是寫程式碼時就傻了。

2.3.1 經典字元裝置驅動程式

視訊中以LED、按鍵驅動為例,講解並練習開發過程中碰到的機制:查詢、休眠-喚醒、中斷、非同步通知、poll、同步、互斥等等。 後續更復雜的驅動程式,就是在這些機制的基礎上,根據硬體特性設計出精巧的軟體框架。 相關的視訊有(檔名中帶“_P”的屬於第2期加密視訊):

12課第1節   字元裝置驅動程式之概念介紹.wmv12課第2.1節 字元裝置驅動程式之LED驅動程式_編寫編譯.wmv12課第2.2節 字元裝置驅動程式之LED驅動程式_測試改進.wmv12課第2.3節 字元裝置驅動程式之LED驅動程式_操作LED.wmv12課第3節   字元裝置驅動程式之查詢方式的按鍵驅動程式.wmv12課第4.1節 字元裝置驅動程式之中斷方式的按鍵驅動_Linux異常處理結構.wmv12課第4.2節 字元裝置驅動程式之中斷方式的按鍵驅動_Linux中斷處理結構.wmv12課第4.3節 字元裝置驅動程式之中斷方式的按鍵驅動_編寫程式碼.wmv12課第5節   字元裝置驅動程式之poll機制.wmv12課第6節   字元裝置驅動程式之非同步通知.wmv12課第7節   字元裝置驅動程式之同步互斥阻塞.wmv12課第8節   字元裝置驅動程式之定時器防抖動_P.wmv13課第1節   輸入子系統概念介紹_P.wmv13課第2節   輸入子系統第編寫驅動程式_P.wmv
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

《嵌入式Linux應用開發完全手冊》上對字元裝置驅動程式的講解有如下章節:

第19章  字元裝置驅動程式
19.1    Linux驅動程式開發概述
19.1.1  應用程式、庫、核心、驅動程式的關係
19.1.2  Linux驅動程式的分類和開發步驟
19.1.3  驅動程式的載入和解除安裝
19.2    字元裝置驅動程式開發
19.2.1  字元裝置驅動程式中重要的資料結構和函式
19.2.2  LED驅動程式原始碼分析
第20章   Linux異常處理體系結構
20.1    Linux異常處理體系結構概述
20.1.1  Linux異常處理的層次結構
20.1.2  常見的異常
20.2    Linux中斷處理體系結構
20.2.1  中斷處理體系結構的初始化
20.2.2  使用者註冊中斷處理函式的過程
20.2.3  中斷的處理過程
20.2.4  解除安裝中斷處理函式
20.3    使用中斷的驅動程式示例
20.3.1  按鍵驅動程式原始碼分析
20.3.2  測試程式情景分析
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

學習方法: ①沿著資料流向,從應用程式的對驅動程式的使用進行情景分析。 所謂情景分析,就是假設應用程式發起某個操作,你去分析其中的運作過程。比如應程式呼叫open、read、ioctl等操作時涉及驅動的哪些函式呼叫。 你要思考一個問題:一個應用程式,怎麼獲得按鍵資訊,怎麼去控制LED。把其中資料的流向弄清楚了,對字元驅動程式也就基本理解了。 ②學習異常和中斷時,可以結合書和視訊;對於驅動程式中其他內容的學習,可以不看書。

2.3.2 工作中各類驅動程式

我們的視訊中講解的驅動程式非常多,目的有二: ①在你工作中遇到同類驅動時提供借鑑 ②供你學習、練習,煅煉閱讀驅動程式的“語感”,提升編寫程式的能力,增加除錯經驗。 我們還打算擴充驅動視訊,把它打造成“Linux驅動程式大全”視訊,基本上都會採取從零現場編寫的方式。 也許有人說:在工作中我們基本上只是移植、修改驅動而已,很少從頭編寫。這話沒錯,但是能修改的前提是理解;想更好地理解,最好的方法是從零寫一個出來。在學習階段,不要怕耗費太多時間,從零開始編寫,慢慢完善它,在這過程中你既理解了這個驅動,也煅煉了能力,做到觸類旁通

如果有時間,建議你學完這些所有的視訊,直到你自認為: ① 給你一個新板,你可以很快實現相關驅動 ② 給你一個新硬體,你可以很快給它編寫/移植驅動。

我們錄製的視訊很多,下面只羅列到“課”,不羅列到“節”。

2期視訊:
第14課 驅動程式分層分離概念_匯流排驅動裝置模型
第15課 LCD驅動程式
第16課 觸控式螢幕驅動程式
第17課 USB驅動程式
第18課 塊裝置驅動程式
第19NAND FLASH驅動程式
第20NOR FLASH驅動程式
第21課 網絡卡驅動程式
第22課 移植DM9000C驅動程式
第23課 I2C裝置裸板程式
第24課 I2C驅動程式    (不看此課,看第32課,第32課講得更好)
第26課 音效卡驅動程式    (不看此課,看第3期的ALSA驅動,那講得更好)
第27課 DMA驅動程式
第28課 hotplug_uevent機制
第323.4.2核心下的I2C驅動程式
第3期的驅動視訊:
攝像頭驅動_虛擬驅動vivi
攝像頭驅動_USB攝像頭
攝像頭驅動_CMOS攝像頭
WIFI網絡卡驅動程式移植
3G網絡卡驅動程式移植
ALSA音效卡驅動程式
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

學習方法: ①再次強調,不能光看不練:一定要寫程式,即使照抄也得寫 ②必學:LCD、觸控式螢幕、NAND Flash、Nor Flash、hotplug_uevent機制 ③學完之後,強烈建議換一個不同的開發板,嘗試在新板上寫驅動程式。 按視訊學習會一切順利,很多問題你可能沒想到、沒想通,換一個新板會讓你真正掌握。

2.3.3 除錯方法

有一種說法,程式是三分寫七分調,我們從作業系統的角度提供了一些很有用的除錯方法。 相關的視訊有:

29課第1節_裸板除錯之點燈法_P.wmv29課第2節_裸板除錯之串列埠列印及棧初步分析_P.wmv29課第3.1節_裸板除錯之JTAG原理_P.wmv29課第3.2節_裸板除錯之JTAG除錯體驗_P.wmv29課第3.3節_裸板除錯之JTAG除錯命令列除錯_P.wmv29課第3.4節_裸板除錯之JTAG除錯原始碼級除錯_P.wmv30課第1.1節_驅動除錯之printk的原理_P.wmv30課第1.2節_驅動除錯之printk的使用_P.wmv30課第1.3節_驅動除錯之列印到proc虛擬檔案_P.wmv30課第2.1節_驅動除錯之段錯誤分析_根據pc值確定出錯的程式碼位置_P.wmv30課第2.2節_驅動除錯之段錯誤分析_根據棧資訊確定函式呼叫過程_P.wmv30課第3節_驅動除錯之自制工具_暫存器編輯器_P.wmv30課第4節_驅動除錯之修改系統時鐘中斷定位系統僵死問題_P.wmv31課第1節_應用除錯之使用strace命令跟蹤系統呼叫_P.wmv31課第2節_應用除錯之使用gdb和gdbserver_P.wmv31課第3節_配置修改核心列印使用者態段錯誤資訊_P.wmv31課第4.1節_應用除錯之自制系統呼叫_P.wmv31課第4.2節_應用除錯之使用自制的系統呼叫_P.wmv31課第5.1節_應用除錯之輸入模擬器之設計思路_P.wmv31課第5.2節_應用除錯之輸入模擬器之編寫儲存功能_P.wmv31課第5.3節_應用除錯之輸入模擬器之編寫測試模擬功能_P.wmv
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

2.4 Linux應用程式的學習

對於大多數人來說,第1個C程式是在Windows的Visual Studio C++(簡稱VC)上寫的,所以你們關心的也許是:嵌入式Linux應用程式,跟VC應用程式之間的區別: ①編譯方法不同: 在VC上點點滑鼠即可編譯,對於嵌入式Linux應用程式,我們需要“交叉編譯”:程式要在PC Linux上編譯,但是執行時要放到單板上。 並且,它的編譯環境需要你自己搭建:解壓出工具鏈後設計PATH,還要自己構造一套Makefile系統。

②除錯方法不同: 在VC上點點滑鼠就可以除錯,對於嵌入式Linux應用程式,你可以更喜歡用列印;或是在PC Linux上通過GDB觀察應用程式在單板上的執行狀況。

③可用的資源不同: 對於VC程式,你可以直接使用微軟公司提供的各種類庫;對於嵌入式Linux應用程式,很多時候需要去尋找、下載、編譯、使用開源庫。

④功能不同: VC程式執行在PC上,一般是用來解決某些純軟體的問題,比如整理資料、修圖、聯網播放音樂之類。嵌入式Linux應用程式一般都要操作若干種硬體,比如監控裝置中要操作攝像頭、儲存音視訊,無人機中要操作GPS、螺旋槳,POS機中要操作銀行卡等等。它跟單板上的硬體聯絡很大,很多時候需要你懂點硬體知識,至少是知道怎麼通過驅動程式來操作這些硬體。 上述4點的不同,花很少的時間就可以掌握。

如果你有志於開發應用程式,那麼一定要有演算法、資料結構、網路程式設計等基礎,然後再掌握一些設計模式,最後就是多參加一些實際專案的開發了。

基於我們提供的視訊,你可以這樣學習: ①先掌握第1期講解的根檔案系統: 在後續學習中你會經常構建根檔案系統,比如往裡面新增庫、修改配置檔案讓