史上最全嵌入式Linux學(xué)習(xí)路線圖

版本 日期 作者 說明
V1 2016.07.29 韋東山 第1版本,Android部分未寫
我是1999年上的大學(xué),物理專業(yè)。在大一時(shí),我們班里普遍彌漫著對(duì)未來的不安,不知道學(xué)習(xí)了物理后出去能做什么。你當(dāng)下的經(jīng)歷、當(dāng)下的學(xué)習(xí),在未來的一天肯定會(huì)影響到你。畢業(yè)后我們也各自找到了自己的職業(yè):出國深造轉(zhuǎn)行做金融、留校任教做科研、設(shè)計(jì)芯片、寫程序、創(chuàng)辦公司等等,這一切都離不開在校時(shí)學(xué)到的基礎(chǔ)技能(數(shù)學(xué)、IT、電子電路)、受過煅煉的自學(xué)能力。
所以,各位正在迷茫的在校生,各位正在嘗試轉(zhuǎn)行的程序員,未來一定有你的位置,是好是壞取決于你當(dāng)下的努力與積累。
我不能預(yù)言幾年后什么行業(yè)會(huì)熱門,也不能保證你照著本文學(xué)習(xí)可以發(fā)財(cái)。我只是一個(gè)有十幾年經(jīng)驗(yàn)的程序員,給對(duì)編程有興趣的你,提供一些建議。
1. 程序員的三大方向
程序員的方向,一般可以分為3類:專業(yè)領(lǐng)域、業(yè)務(wù)領(lǐng)域、操作系統(tǒng)領(lǐng)域。你了解它們后,按興趣選擇吧。
對(duì)于專業(yè)領(lǐng)域,我提供不了建議。
業(yè)務(wù),也就是應(yīng)用程序,它跟操作系統(tǒng)并不是截然分開的:
① 開發(fā)實(shí)體產(chǎn)品時(shí),應(yīng)用程序?qū)懙煤玫娜?,有時(shí)候需要操作系統(tǒng)的知識(shí),比如調(diào)度優(yōu)先級(jí)的設(shè)置、知道某些函數(shù)可能會(huì)令進(jìn)程休眠。
② 寫應(yīng)用程序的人進(jìn)階為系統(tǒng)工程師時(shí),他需要從上到下都了解,這時(shí)候就需要有操作系統(tǒng)領(lǐng)域的知識(shí)了,否則,你怎么設(shè)計(jì)整個(gè)系統(tǒng)的方案呢?
③ 做應(yīng)用程序的人,需要了解行業(yè)的需求,理解業(yè)務(wù)的邏輯。所以,當(dāng)領(lǐng)導(dǎo)的人,多是做應(yīng)用的。一旦鉆入了某個(gè)行業(yè),很難換行業(yè)。
④ 而操作系統(tǒng)領(lǐng)域,做好了這是通殺各行業(yè):他只負(fù)責(zé)底層系統(tǒng),在上面開發(fā)什么業(yè)務(wù)跟他沒關(guān)系。這行很多是技術(shù)宅,行業(yè)專家。
⑤ 操作系統(tǒng)和業(yè)務(wù)之間并沒有一個(gè)界線。有操作系統(tǒng)經(jīng)驗(yàn),再去做應(yīng)用,你會(huì)對(duì)系統(tǒng)知根知底,碰到問題時(shí)都有解決思路。有了業(yè)務(wù)經(jīng)驗(yàn),你再了解一下操作系統(tǒng),很快就可以組成一個(gè)團(tuán)隊(duì)自立門戶,至少做個(gè)CTO沒問題。
1.1 專業(yè)領(lǐng)域
它又可以分為下面2類。
1.1.1 學(xué)術(shù)研究
比如語音、圖像處理、人工智能,這類工作需要你有比較強(qiáng)的理論知識(shí),我傾向于認(rèn)為這類人是“科學(xué)家”,他們鉆研多年,很多時(shí)候是在做學(xué)術(shù)研究。
在嵌入式領(lǐng)域,需要把他們的成果用某種算法表達(dá)出來,針對(duì)某種芯片進(jìn)行優(yōu)化,這部分工作也許有專人來做。
1.1.2 工程實(shí)現(xiàn)
也有這樣一類人,他們懂得這些專業(yè)領(lǐng)域的概念,但是沒有深入鉆研??梢允褂酶黝愰_源資料實(shí)現(xiàn)某個(gè)目標(biāo),做出產(chǎn)品。比如圖像處理,他懂得用opencv里幾百個(gè)復(fù)雜函數(shù)來實(shí)現(xiàn)頭像識(shí)別。有時(shí)候還可以根據(jù)具體芯片來優(yōu)化這些函數(shù)。
“專業(yè)領(lǐng)域”不是我的菜,如果你要做這一塊,我想最好的入門方法是在學(xué)校學(xué)習(xí)研究生、博士課程。
1.2 業(yè)務(wù)領(lǐng)域
換句話說,就是應(yīng)用程序,這又可以分為下面2類。
1.2.1 界面顯示
做產(chǎn)品當(dāng)然需要好的界面,但是,不是說它不重要,是沒什么發(fā)展后勁。
現(xiàn)在的熱門詞是Android APP和IOS APP開發(fā)。你不要被Android、IOS兩個(gè)詞騙了,它們跟以前的VC、VB是同一路貨色,只是、僅僅是一套GUI控件的實(shí)現(xiàn)。
希望沒有冒犯到你,我有理由。
一個(gè)程序需要有GUI界面,但是程序的內(nèi)在邏輯才是核心。Android、IOS的開發(fā)工具給我們簡化了GUI的開發(fā),并提供了這些控件的交互機(jī)制,封裝并提供了一些服務(wù)(比如網(wǎng)絡(luò)傳輸)。
但是程序內(nèi)部的業(yè)務(wù)邏輯、對(duì)視頻圖像聲音的處理等等,這才是核心。
另外別忘了服務(wù)器那邊的后臺(tái)程序:怎樣更安全地保存數(shù)據(jù)、保護(hù)客戶的隱私,怎樣處理成千上萬上百萬的并發(fā)訪問,等等,這也是核心。
但是,從Android、IOS APP入門入行,這很快!如果你是大四,急于找到一份工作,那么花上1、2個(gè)月去學(xué)習(xí)Android或IOS,應(yīng)該容易找到工作,畢竟APP的需求永遠(yuǎn)是最大的,現(xiàn)在這兩門技術(shù)還算熱門。
在2011、2012年左右,Android程序員的起薪挺高,然后開始下滑。Android APP的入門基本只要1個(gè)月,所以懂的人也越來越多。
2013、2014年,IOS開發(fā)的工資明顯比Android高了,于是各類IOS培訓(xùn)也火曝起來。中華大地向來不缺速成人才,估計(jì)再過一陣子IOS工程師也是白菜價(jià)了。
會(huì)Android、IOS只是基本要求,不信去51job搜搜Android或IOS,職位要求里肯定其他要求。
1.2.2 業(yè)務(wù)邏輯
舉個(gè)簡單例子,做一個(gè)打卡軟件,你需要考慮這些東西:
① 正常流程是上班下班時(shí)都要打卡
② 有人忘記了怎么辦?作為異常記錄在案,推送給管理員
③ 請假時(shí)怎么處理?
④ 加班怎么處理?
對(duì)于更復(fù)雜的例子,視頻會(huì)議系統(tǒng)里,各個(gè)模塊怎么對(duì)接,各類協(xié)議怎么兼容,你不深入這個(gè)行業(yè),你根本搞不清楚。
應(yīng)用開發(fā)的職位永遠(yuǎn)是最多的,入門門檻也低。基本上只要你會(huì)C語言,面試時(shí)表現(xiàn)比較得體,一般公司都會(huì)給你機(jī)會(huì)。因?yàn)椋?/p>
① 你進(jìn)公司后,還需要重新培訓(xùn)你:熟悉它們的業(yè)務(wù)邏輯。
② 你要做的,基本也就是一個(gè)個(gè)模塊,框架都有人給你定好了,你去填代碼就可以了。
說點(diǎn)讓你高興的事:軟件公司里,做領(lǐng)導(dǎo)的基本都是寫應(yīng)用程序的(當(dāng)然還有做市場的)。寫應(yīng)用程序的人,對(duì)外可以研究市場接待客戶,對(duì)內(nèi)可以管理程序員完成開發(fā),不讓他做領(lǐng)導(dǎo)讓誰做?
如果你的志向是寫應(yīng)用程序,那么我建議你先練好基本功:數(shù)據(jù)結(jié)構(gòu)、算法是必備,然后憑興趣選擇數(shù)據(jù)庫、網(wǎng)絡(luò)編程等等進(jìn)行深入鉆研。
最后,選擇你看好的、感興趣的行業(yè)深耕個(gè)10年吧。做應(yīng)用開發(fā)的人選擇了某個(gè)行業(yè),后面是很難換行業(yè)的,選行很重要!
1.3 操作系統(tǒng)領(lǐng)域
UCOS太簡單,VxWorks太貴太專業(yè),Windows不玩嵌入式了,IOS不開源,所以對(duì)于操作系統(tǒng)領(lǐng)域我們也只能玩Linux了。
在嵌入式領(lǐng)域Linux一家獨(dú)大!
Android呢?Android跟QT一樣,都是一套GUI系統(tǒng)。只是Google的實(shí)力太強(qiáng)了,現(xiàn)在Android無處不在,所以很多時(shí)候Linux+Android成了標(biāo)配。注意,在這里我們關(guān)心的是Android的整個(gè)系統(tǒng)、里面的機(jī)制,而不是學(xué)習(xí)幾個(gè)API然后開發(fā)界面程序。
操作系統(tǒng)領(lǐng)域所包含的內(nèi)容,簡單地說,就是制作出一臺(tái)裝好系統(tǒng)的專用“電腦”,可以分為:
① 為產(chǎn)品規(guī)劃硬件:
按需求、性能、成本選擇主芯片,搭配周邊外設(shè),交由硬件開發(fā)人員設(shè)計(jì)。
② 給單板制作、安裝操作系統(tǒng)、編寫驅(qū)動(dòng)
③ 定制維護(hù)、升級(jí)等系統(tǒng)方案
④ 還可能要配置、安裝Android等GUI系統(tǒng):
⑤ 為應(yīng)用開發(fā)人員配置開發(fā)環(huán)境
⑥ 從系統(tǒng)角度解決疑難問題
這個(gè)領(lǐng)域,通常被稱為“底層系統(tǒng)”或是“驅(qū)動(dòng)開發(fā)”。
先解決2個(gè)常見誤區(qū):
① 這份工作是寫驅(qū)動(dòng)程序嗎?
看看上面羅列的6點(diǎn),應(yīng)該說,它包含驅(qū)動(dòng)開發(fā),但遠(yuǎn)遠(yuǎn)不只有驅(qū)動(dòng)開發(fā)。
② 我們還需要寫驅(qū)動(dòng)嗎?不是有原廠嗎?或者只需要改改就可以?
經(jīng)常有人說,芯片原廠都做好驅(qū)動(dòng)了,拿過來改改就可以了。如果,你的硬件跟原廠的公板完全一樣,原廠源碼毫無BUG,不想優(yōu)化性能、削減成本,不想做一些有特色的產(chǎn)品,那這話是正確的。
但是在這個(gè)不創(chuàng)新就是找死的年代,可能嗎?!原因有二:
① 即使只是修改代碼,能修改的前提是能理解;能理解的最好煅煉方法是從零寫出若干驅(qū)動(dòng)程序
② 很多時(shí)候,需要你深度定制系統(tǒng)。
以前做聯(lián)發(fā)科手機(jī)只需要改改界面就可以出貨了,現(xiàn)在山寨廠一批批倒下。大家都使用原廠的方案而不加修改時(shí),最后只能拼成本。
舉個(gè)例子,深圳有2家做交通攝像頭、監(jiān)控?cái)z像頭的廠家,他們曾經(jīng)找我做過4個(gè)項(xiàng)目:
① 改進(jìn)廠家給的SD卡驅(qū)動(dòng)性能,使用DMA。
② 換了Flash型號(hào)后,系統(tǒng)經(jīng)常出問題,需要修改驅(qū)動(dòng)BUG。
③ 觸摸屏點(diǎn)擊不準(zhǔn),找原因,后來發(fā)現(xiàn)是旁路電容導(dǎo)致的。
④ 裁減成本,把4片DDR換為2片DDR,需要改bootloader對(duì)DDR的初始化。
這些項(xiàng)目都很急,搞不定就無法出貨,這時(shí)候找原廠?除非你是中興華為等大客戶,否則誰理你?
我在中興公司上班時(shí),寫驅(qū)動(dòng)的時(shí)間其實(shí)是很少的,大部分時(shí)間是調(diào)試:系統(tǒng)調(diào)優(yōu),上幫APP工程師、下幫硬件工程師查找問題。
我們從廠家、網(wǎng)上得到的源碼,很多都是標(biāo)準(zhǔn)的,當(dāng)然可以直接用。但是在你的產(chǎn)品上也許優(yōu)化一下更好。比如我們可以把攝像頭驅(qū)動(dòng)和DMA驅(qū)動(dòng)揉合起來,讓攝像頭的數(shù)據(jù)直接通過DMA發(fā)到DSP去。
我們可以在軟件和硬件之間起橋梁作用,對(duì)于實(shí)體產(chǎn)品,有可能是軟件出問題也可能是硬件出問題,一般是底層系統(tǒng)工程師比較容易找出問題。
當(dāng)硬件、軟件應(yīng)用出現(xiàn)問題,他們解決不了時(shí),從底層軟件角度給他們出主意,給他們提供工具。
再比如方案選擇:芯片性能能否達(dá)標(biāo)、可用的BSP是否完善等等,這只能由負(fù)責(zé)整個(gè)方案的人來考慮,他必須懂底層。
在操作系統(tǒng)領(lǐng)域,對(duì)知識(shí)的要求很多:
① 懂硬件知識(shí)才能看懂電路圖
② 英文好會(huì)看芯片手冊
③ 有編寫、移植驅(qū)動(dòng)程序的能力
④ 對(duì)操作系統(tǒng)本身有一定的理解,才能解決各類疑難問題
⑤ 理解Android內(nèi)部機(jī)制
⑥ 懂匯編、C語言、C++、JAVA
它絕對(duì)是一個(gè)大坑,沒有興趣、沒有毅力的人慎選。
① 這行的入門,絕對(duì)需要半年以上,即使全天學(xué)習(xí)也要半年。
② 它的職位,絕對(duì)比APP的職位少
③ 并且你沒有1、2年經(jīng)驗(yàn),招你到公司后一開始你做的還是APP。
優(yōu)點(diǎn)就是:
① 學(xué)好后,行業(yè)通殺,想換行就換行;想自己做產(chǎn)品就自己做產(chǎn)品。
② 相比做應(yīng)用程序的人,不會(huì)被經(jīng)常變動(dòng)的需求搞得天天加班。
③ 門檻高,當(dāng)然薪水相對(duì)就高。
操作系統(tǒng)領(lǐng)域,我認(rèn)為適合于這些人:
① 硬件工程師想轉(zhuǎn)軟件工程師,從底層軟件入門會(huì)比較好
② 單片機(jī)工程師,想升級(jí)一下。會(huì)Linux底層的人肯定會(huì)單片機(jī),會(huì)單片機(jī)的人不一定會(huì)Linux。
③ 時(shí)間充足的學(xué)生:如果你正讀大二大三,那么花上半年學(xué)習(xí)嵌入式Linux底層多有益處。
④ 想掌握整個(gè)系統(tǒng)的人,比如你正在公司里寫APP,但是想升為系統(tǒng)工程師,那么底層不得不學(xué)。
⑤ 想自己創(chuàng)業(yè)做實(shí)體產(chǎn)品的工程師,你有錢的話什么技術(shù)都不用學(xué),但是如果沒錢又想做產(chǎn)品,那么Linux底層不得不學(xué)。
⑥ 做Linux APP的人,沒錯(cuò),他們也要學(xué)習(xí)。
這部分人不需要深入,了解個(gè)大概就可以:bootloader是用來啟動(dòng)內(nèi)核,Linux的文件系統(tǒng)(第1個(gè)程序是什么、做什么、各目錄干嘛用)、APP跟驅(qū)動(dòng)程序的調(diào)用關(guān)系、工具鏈,有這些概念就可以了
本文中,就把操作系統(tǒng)默認(rèn)為Linux,講講怎么學(xué)習(xí)嵌入式Linux+Android系統(tǒng)。
1.4 嵌入式Linux+Android系統(tǒng)包含哪些內(nèi)容
嵌入式Linux系統(tǒng)包含哪些東西?不要急,舉一個(gè)例子你就知道了。
① 電腦一開機(jī),那些界面是誰顯示的?
是BIOS,它做什么?一些自檢,然后從硬盤上讀入windows,并啟動(dòng)它。
類似的,這個(gè)BIOS對(duì)應(yīng)于嵌入式Linux里的bootloader。這個(gè)bootloader要去Flash上讀入Linux內(nèi)核,并啟動(dòng)它。
② 啟動(dòng)windows的目的是什么?
當(dāng)然運(yùn)行應(yīng)用程序以便上網(wǎng)、聊天什么的了。
這些上網(wǎng)程序、聊天程序在哪?
在C盤、D盤上。
所以,windows要先識(shí)別出C盤、D盤。在Linux下我們稱之為根文件系統(tǒng)。
③ windows能識(shí)別出C盤、D盤,那么肯定有讀寫硬盤的能力。
這個(gè)能力我們稱之為驅(qū)動(dòng)程序。當(dāng)然不僅僅是操作硬盤,還有網(wǎng)卡、USB等等其他硬件。
嵌入式Linux能從Flash上讀出并執(zhí)行應(yīng)用程序,肯定也得有Flash的驅(qū)動(dòng)程序啊,當(dāng)然也不僅僅是Flash。
簡單地說,嵌入式LINUX系統(tǒng)里含有bootloader、內(nèi)核、驅(qū)動(dòng)程序、根文件系統(tǒng)、應(yīng)用程序這5大塊。而應(yīng)用程序,我們又可以分為:C/C++、Android。
所以,嵌入式Linux+Android系統(tǒng)包含以下6部分內(nèi)容:
① bootloader
② Linux內(nèi)核
③ 驅(qū)動(dòng)程序
④ 使用C/C++編寫的應(yīng)用程序
⑤ Android系統(tǒng)本身
⑥ Android應(yīng)用程序
Android跟Linux的聯(lián)系實(shí)在太大了,它的應(yīng)用是如此廣泛,學(xué)習(xí)了Linux之后沒有理由停下來不學(xué)習(xí)Android。在大多數(shù)智能設(shè)備中,運(yùn)行的是Linux操作系統(tǒng);它上面要么安裝有Android,要么可以跟Android手機(jī)互聯(lián)?,F(xiàn)在,Linux+Android已成標(biāo)配。
2. 怎么學(xué)習(xí)嵌入式Linux操作系統(tǒng)
本文假設(shè)您是零基礎(chǔ),以實(shí)用為主,用最快的時(shí)間讓你入門;后面也會(huì)附上想深入學(xué)習(xí)時(shí)可以參考的資料。
在實(shí)際工作中,我們從事的是“操作系統(tǒng)”周邊的開發(fā),并不會(huì)太深入學(xué)習(xí)、修改操作系統(tǒng)本身。
① 操作系統(tǒng)具有進(jìn)程管理、存儲(chǔ)管理、文件管理和設(shè)備管理等功能,這些核心功能非常穩(wěn)定可靠,基本上不需要我們修改代碼。我們只需要針對(duì)自己的硬件完善驅(qū)動(dòng)程序
② 學(xué)習(xí)驅(qū)動(dòng)時(shí)必定會(huì)涉及其他知識(shí),比如存儲(chǔ)管理、進(jìn)程調(diào)度。當(dāng)你深入理解了驅(qū)動(dòng)程序后,也會(huì)加深對(duì)操作系統(tǒng)其他部分的理解
③ Linux內(nèi)核中大部分代碼都是設(shè)備驅(qū)動(dòng)程序,可以認(rèn)為Linux內(nèi)核由各類驅(qū)動(dòng)構(gòu)成
但是,要成為該領(lǐng)域的高手,一定要深入理解Linux操作系統(tǒng)本身,要去研讀它的源代碼。
在忙完工作,閑暇之余,可以看看這些書:
① 趙炯的《linux內(nèi)核完全注釋》,這本比較薄,推薦這本。他后來又出了《Linux 內(nèi)核完全剖析》,太厚了,搞不好看了后面就忘記前面了。
② 毛德操、胡希明的《LINUX核心源代碼情景分析》,此書分上下冊,巨厚無比。當(dāng)作字典看即可:想深入理解某方面的知識(shí),就去看某章節(jié)。
③ 其他好書還有很多,我沒怎么看,沒有更多建議
基于快速入門,上手工作的目的,您先不用看上面的書,先按本文學(xué)習(xí)。
2.1 入門路線圖
假設(shè)您是零基礎(chǔ),我們規(guī)劃了如下入門路線圖。前面的知識(shí),是后面知識(shí)的基礎(chǔ),建議按順序?qū)W習(xí)。每一部分,不一定需要學(xué)得很深入透徹,下面分章節(jié)描述。

2.2 學(xué)習(xí)驅(qū)動(dòng)程序之前的基礎(chǔ)知識(shí)
2.2.1 C語言
只要是理工科專業(yè)的,似乎都會(huì)教C語言。我見過很多C語言考試90、100分的,一上機(jī)就傻了,我懷疑他們都沒在電腦上寫過程序。
理論再好,沒有實(shí)踐不能干活的話,公司招你去干嘛?
反過來,實(shí)踐出真知,學(xué)習(xí)C語言,必須練練練、寫寫寫!
當(dāng)你掌握基本語法后,就可以在電腦上練習(xí)一些C語言習(xí)題了;
當(dāng)你寫過幾個(gè)C程序后,就可以進(jìn)入下一階段的裸機(jī)開發(fā)了。
① 不需要太深入
作為快速入門,只要你會(huì)編寫“Hello, world!”,會(huì)寫冒泡排序,會(huì)一些基礎(chǔ)的語法操作,暫時(shí)就夠了。
指針操作是重點(diǎn),多練習(xí);
不需要去學(xué)習(xí)過多的數(shù)據(jù)結(jié)構(gòu)知識(shí),只需要掌握鏈表操作,其他不用學(xué)習(xí),比如:隊(duì)列、二叉樹等等都不用學(xué);
不需要去學(xué)習(xí)任何的函數(shù)使用,比如文件操作、多線程編程、網(wǎng)絡(luò)編程等等;
這些知識(shí),在編寫Linux應(yīng)用程序時(shí)會(huì)用,但是在操作系統(tǒng)特別是驅(qū)動(dòng)學(xué)習(xí)時(shí),用不著!
永往直前吧,以后碰到不懂的C語言問題,我們再回過頭來學(xué)習(xí)。
在后續(xù)的“裸機(jī)開發(fā)”中,會(huì)讓你繼續(xù)練習(xí)C語言,那會(huì)更實(shí)戰(zhàn)化。
C語言是在寫代碼中精進(jìn)的。
② 可以在Visual Studio下學(xué)習(xí),也可以在Linux下學(xué)習(xí),后者需要掌握一些編譯命令
我們暫時(shí)沒有提供C語言的教程,找一本C語言書,網(wǎng)上找找免費(fèi)的C語言視頻(主要看怎么搭建環(huán)境),就可以自學(xué)了。
2.2.2 PC Linux基本操作:
對(duì)于PC Linux,我們推薦使用Ubuntu,在它上面安裝軟件非常簡便。
我們的工作模式通常是這樣:在Windows下閱讀、編寫代碼,然后把代碼上傳到PC Linux去編譯。
實(shí)際上,Ubuntu的桌面系統(tǒng)已經(jīng)很好用了,我們拿到各種智能機(jī)可以很快上手,相信Ubuntu的桌面系統(tǒng)也可以讓你很快上手。
為了提高工作效率,我們通常使用命令行來操作Ubuntu。
不用擔(dān)心,你前期只需要掌握這幾條命令就可以了,它們是如此簡單,我干脆列出它們:
① cd : Change Directory(改變目錄)
cd 目錄名 // 進(jìn)入某個(gè)目錄
cd .. // cd “兩個(gè)點(diǎn)”:返回上一級(jí)目錄
cd - // cd “短橫”:返回上一次所在目錄
② pwd : Print Work Directory(打印當(dāng)前目錄 顯示出當(dāng)前工作目錄的絕對(duì)路徑)
③ mkdir : Make Directory(創(chuàng)建目錄)
mkdir abc // 創(chuàng)建文件夾abc
mkdir -p a/b/c // 創(chuàng)建文件夾a,再a下創(chuàng)建文件夾b,再在b下創(chuàng)建文件夾c
④ rm : Remove(刪除目錄或文件)
rm file // 刪除名為file的文件
rm -rf dir // 刪除名為dir的目錄
⑤ ls : List(列出目錄內(nèi)容)
⑥ mount : 掛載
mount -t nfs -o nolock,vers=2 192.168.1.123:/work/nfs_root /mnt
mount -t yaffs /dev/mtdblock3 /mnt
⑦ chown : Change owner(改變文件的屬主,即擁有者)
chown book:book /work -R // 對(duì)/work目錄及其下所有內(nèi)容,屬主改為book用戶,組改為book
⑧ chmod : Change mode(改變權(quán)限),下面的例子很簡單粗暴
chmod 777 /work -R // 對(duì)/work目錄及其下所有內(nèi)容,權(quán)限改為可讀、可寫、可執(zhí)行
⑨ vi : Linux下最常用的編輯命令,使用稍微復(fù)雜,請自己搜索用法。
要練習(xí)這些命令,你可以進(jìn)入U(xiǎn)buntu桌面系統(tǒng)后,打開終端輸入那些命令;或是用SecureCRT、putty等工具遠(yuǎn)程登錄Ubuntu后練習(xí)。
2.2.3 硬件知識(shí)
我們學(xué)習(xí)硬件知識(shí)的目的在于能看懂原理圖,看懂通信協(xié)議,看懂芯片手冊;不求能設(shè)計(jì)原理圖,更不求能設(shè)計(jì)電路板。
對(duì)于正統(tǒng)的方法,你應(yīng)該這樣學(xué)習(xí):
① 學(xué)習(xí)《微機(jī)原理》,理解一個(gè)計(jì)算機(jī)的組成及各個(gè)部件的交互原理。
② 學(xué)習(xí)《數(shù)字電路》,理解各種門電路的原理及使用,還可以掌握一些邏輯運(yùn)算(與、或等)。
③ 《模擬電路》?好吧,這個(gè)不用學(xué),至少我在工作中基本用不到它,現(xiàn)在全忘光了。
就我個(gè)人經(jīng)驗(yàn)來說,這些課程是有用的,但是:
① 原理有用,實(shí)戰(zhàn)性不強(qiáng)。
比如《微機(jī)原理》是基于x86系統(tǒng),跟ARM板子有很大差別,當(dāng)然原理相通。
我是在接觸嵌入式編程后,才理解了這些課程。
② 每本書都那么厚,內(nèi)容都很多,學(xué)習(xí)時(shí)間過長,自學(xué)有難度。
針對(duì)這些校園教材的不足,并結(jié)合實(shí)際開發(fā)過程中要用到的知識(shí)點(diǎn),我們推出了《學(xué)前班_怎么看原理圖》的系列視頻:
學(xué)前班第1課第1節(jié)_怎么看原理圖之GPIO和門電路.wmv
學(xué)前班第1課第2.1節(jié)_怎么看原理圖之協(xié)議類接口之UART.wmv
學(xué)前班第1課第2.2節(jié)_怎么看原理圖之協(xié)議類接口之I2C.wmv
學(xué)前班第1課第2.3節(jié)_怎么看原理圖之協(xié)議類接口之SPI.wmv
學(xué)前班第1課第2.4節(jié)_怎么看原理圖之協(xié)議類接口之NAND Flash.wmv
學(xué)前班第1課第2.5節(jié)_怎么看原理圖之協(xié)議類接口之LCD.wmv
學(xué)前班第1課第3節(jié)_怎么看原理圖之內(nèi)存類接口.wmv
學(xué)前班第1課第4.1節(jié)_怎么看原理圖之分析S3C2410開發(fā)板.wmv
學(xué)前班第1課第4.2節(jié)_怎么看原理圖之分析S3C2440開發(fā)板.wmv
學(xué)前班第1課第4.3節(jié)_怎么看原理圖之分析S3C6410開發(fā)板.wmv
即使你只具備初中物理課的電路知識(shí),我也希望能通過這些視頻,讓你可以看懂原理圖,理解一些常見的通信協(xié)議;如果你想掌握更多的硬件知識(shí),這些視頻也可以起個(gè)索引作用,讓你知道缺乏什么知識(shí)。
這些視頻所講到的硬件知識(shí),將在《裸板開發(fā)》系列視頻中用到,到時(shí)可以相互對(duì)照著看,加深理解。
2.2.4 要不要專門學(xué)習(xí)Windows下的單片機(jī)開發(fā)
很多學(xué)校都開通了單片機(jī)的課程,很多人都是從51單片機(jī)、AVR單片機(jī),現(xiàn)在比較新的STM32單片機(jī)開始接觸嵌入式領(lǐng)域,并且使用Windows下的開發(fā)軟件,比如keil、MDK等。
問題來了,要不要專門學(xué)習(xí)Windows下的單片機(jī)開發(fā)?
① 如果這是你們專業(yè)的必修課,那就學(xué)吧
② 如果你的專業(yè)跟單片機(jī)密切相關(guān),比如機(jī)械控制等,那就學(xué)吧
③ 如果你只是想從單片機(jī)入門,然后學(xué)習(xí)更廣闊的嵌入式Linux,那么放棄在Windows下學(xué)習(xí)單片機(jī)吧!
理由如下:
① Windows下的單片機(jī)學(xué)習(xí),深度不夠
Windows下有很好的圖形界面單片機(jī)開發(fā)軟件,比如keil、MDK等。
它們封裝了很多技術(shù)細(xì)節(jié),比如:
你只會(huì)從main函數(shù)開始編寫代碼,卻不知道上電后第1條代碼是怎么執(zhí)行的;
你可以編寫中斷處理函數(shù),但是卻不知道它是怎么被調(diào)用的;
你不知道程序怎么從Flash上被讀入內(nèi)存;
也不知道內(nèi)存是怎么劃分使用的,不知道棧在哪、堆在哪;
當(dāng)你想裁剪程序降低對(duì)Flash、內(nèi)存的使用時(shí),你無從下手;
當(dāng)你新建一個(gè)文件時(shí),它被自動(dòng)加入到工程里,但是其中的機(jī)理你完全不懂;
等等等。
② 基于ARM+Linux裸機(jī)學(xué)習(xí),可以學(xué)得更深,并且更貼合后續(xù)的Linux學(xué)習(xí)。
實(shí)際上它就是Linux下的單片機(jī)學(xué)習(xí),只是一切更加原始:所有的代碼需要你自己來編寫;哪些文件加入工程,需要你自己來管理。
在工作中,我們當(dāng)然傾向于使用Windows下更便利的工具,但是在學(xué)習(xí)階段,我們更想學(xué)習(xí)到程序的本質(zhì)。
一切從零編寫代碼、管理代碼,可以讓我們學(xué)習(xí)到更多知識(shí):
你需要了解芯片的上電啟動(dòng)過程,知道第1條代碼如何運(yùn)行;
你需要掌握怎么把程序從Flash上讀入內(nèi)存;
需要理解內(nèi)存怎么規(guī)劃使用,比如棧在哪,堆在哪;
需要理解代碼重定位;
需要知道中斷發(fā)生后,軟硬件怎么保護(hù)現(xiàn)場、跳到中斷入口、調(diào)用中斷程序、恢復(fù)現(xiàn)場;
你會(huì)知道,main函數(shù)不是我們編寫的第1個(gè)函數(shù);
你會(huì)知道,芯片從上電開始,程序是怎么被搬運(yùn)執(zhí)行的;
你會(huì)知道,函數(shù)調(diào)用過程中,參數(shù)是如何傳遞的;
你會(huì)知道,中斷發(fā)生時(shí),每一個(gè)寄存器的值都要小心對(duì)待;
等等等。
你掌握了ARM+Linux的裸機(jī)開發(fā),再回去看Windows下的單片機(jī)開發(fā),會(huì)驚呼:怎么那么簡單!并且你會(huì)完全明白這些工具沒有向你展示的技術(shù)細(xì)節(jié)。
驅(qū)動(dòng)程序=Linux驅(qū)動(dòng)程序軟件框架+ARM開發(fā)板硬件操作,我們可以從簡單的裸機(jī)開發(fā)入手,先掌握硬件操作,并且還可以:
① 掌握如何在PC Linux下編譯程序、把程序燒錄到板子上并運(yùn)行它
② 為學(xué)習(xí)bootloader打基礎(chǔ):掌握了各種硬件操作后,后面一組合就是一個(gè)bootloader
2.2.5 為什么選擇ARM9 S3C2440開發(fā)板,而不是其他性能更好的?
有一個(gè)錯(cuò)誤的概念:S3C2440過時(shí)了、ARM9過時(shí)了。
這是不對(duì)的,如果你是軟件工程師,無論是ARM9、ARM11、A8還是A9,對(duì)我們來說是沒有差別的。
一款芯片,上面有CPU,還有眾多的片上設(shè)備(比如UART、USB、LCD控制器)。我們寫程序時(shí),并不涉及CPU,只是去操作那些片上設(shè)備。
所以:差別在于片上設(shè)備,不在于CPU核;差別在于寄存器操作不一樣。
因?yàn)槲覀儗戲?qū)動(dòng)并不涉及CPU的核心,只是操作CPU之外的設(shè)備,只是讀寫這些設(shè)備的寄存器。
之所以推薦S3C2440,是因?yàn)樗腖inux學(xué)習(xí)資料最豐富,并有配套的第1、2期視頻。
2.2.6 怎么學(xué)習(xí)ARM+Linux的裸機(jī)開發(fā)
學(xué)習(xí)裸機(jī)開發(fā)的目的有兩個(gè):
① 掌握裸機(jī)程序的結(jié)構(gòu),為后續(xù)的u-boot作準(zhǔn)備
② 練習(xí)硬件知識(shí),即:怎么看原理圖、芯片手冊,怎么寫代碼來操作硬件
后面的u-boot可以認(rèn)為是裸機(jī)程序的集合,我們在裸機(jī)開發(fā)中逐個(gè)掌握各個(gè)部件,再集合起來就可以得到一個(gè)u-boot了。
后續(xù)的驅(qū)動(dòng)開發(fā),也涉及硬件操作,你可以在裸機(jī)開發(fā)中學(xué)習(xí)硬件知識(shí)。
注意:如果你并不關(guān)心裸機(jī)的程序結(jié)構(gòu),不關(guān)心bootloader的實(shí)現(xiàn),這部分是可以先略過的。在后面的驅(qū)動(dòng)視頻中,我們也會(huì)重新講解所涉及的硬件知識(shí)。
推薦兩本書:杜春蕾的《ARM體系結(jié)構(gòu)與編程》,韋東山的《嵌入式Linux應(yīng)用開發(fā)完全手冊》。后者也許是國內(nèi)第1本涉及在PC Linux環(huán)境下開發(fā)的ARM裸機(jī)程序的書,如果我說錯(cuò)了,請?jiān)徫視x得少。
對(duì)于裸機(jī)開發(fā),我們提供有2部分視頻:
① 環(huán)境搭建
第0課第1節(jié)_剛接觸開發(fā)板之接口接線.wmv
第0課第2節(jié)_剛接觸開發(fā)板之燒寫裸板程序.wmv
第0課第3節(jié)_剛接觸開發(fā)板之重?zé)麄€(gè)系統(tǒng).wmv
第0課第4節(jié)_剛接觸開發(fā)板之使用vmwae和預(yù)先做好的ubuntu.wmv
第0課第5節(jié)_剛接觸開發(fā)板之u-boot打補(bǔ)丁編譯使用及建sourceinsight工程.wmv
第0課第6節(jié)_剛接觸開發(fā)板之內(nèi)核u-boot打補(bǔ)丁編譯使用及建sourceinsight工程.wmv
第0課第7節(jié)_剛接觸開發(fā)板之制作根文件系統(tǒng)及初試驅(qū)動(dòng).wmv
第0課第8節(jié)_在TQ2440,MINI2440上搭建視頻所用系統(tǒng).wmv
第0課第9節(jié)_win7下不能使用dnw燒寫的替代方法.wmv
② 裸機(jī)程序開發(fā)
第1課 環(huán)境搭建及工具、概念介紹.wmv
第2課 GPIO實(shí)驗(yàn).wmv
第3課 存儲(chǔ)管理器實(shí)驗(yàn).wmv
第4課 MMU實(shí)驗(yàn).wmv
第5課 NAND FLASH控制器.wmv
第6課 中斷控制器.wmv
第7課 系統(tǒng)時(shí)鐘和UART實(shí)驗(yàn).wmv
第8課 LCD實(shí)驗(yàn).wmv
要聲明的是:
錄制上述《裸機(jī)程序開發(fā)》視頻時(shí),本意是結(jié)合《嵌入式Linux應(yīng)用開發(fā)完全手冊》的《第2篇 ARM9嵌入式系統(tǒng)基礎(chǔ)實(shí)例篇》來講解,所以視頻里沒有完全從零編寫代碼,需要結(jié)合書本來學(xué)習(xí)。
① 書和視頻并不是完全配套的,不要照搬,其中的差異并不難解決。
《嵌入式Linux應(yīng)用開發(fā)完全手冊》發(fā)表于2008年,使用了很多款開發(fā)板,并且那時(shí)的開發(fā)板配置較低(Nand Flash是64M);
《裸機(jī)程序開發(fā)》視頻使用JZ2440開發(fā)板錄制。
② 書和視頻,適用于所有S3C2440開發(fā)板,包括mini2440、tq2440等
天下S3C2440配置都是相似的,基本也就是LED、按鍵所用引腳不同,LCD型號(hào)不同;你學(xué)習(xí)了書、視頻,如果連這些差異都搞不定的話,那就是你我的失敗了。
學(xué)習(xí)方法是這樣的:
① 先看《環(huán)境搭建》視頻來搭建開發(fā)環(huán)境
② 書(第2篇)和視頻(裸機(jī)程序開發(fā))結(jié)合,看完一章,練習(xí)一章
一定要編寫代碼,即使是照抄也要寫。
③ 如果對(duì)于ARM架構(gòu)相關(guān)的知識(shí),覺得模糊或是想了解得更深入,參考《ARM體系結(jié)構(gòu)與編程》
學(xué)習(xí)程度:
① 理解一個(gè)裸機(jī)程序的必要結(jié)構(gòu):異常向量、硬件初始化、代碼重定位、棧
② 知道如何操作GPIO、Flash、LCD、觸摸屏等硬件
③ 很多人覺得MMU難以理解,可以放過它
2.2.7 bootloader的學(xué)習(xí)
bootloader有很多種,vivi、u-boot等等,最常用的是u-boot。
u-boot功能強(qiáng)大、源碼比較多,對(duì)于編程經(jīng)驗(yàn)不豐富、閱讀代碼經(jīng)驗(yàn)不豐富的人,一開始可能會(huì)覺得難以掌握。
但是,u-boot的主要功能就是:啟動(dòng)內(nèi)核。它涉及:讀取內(nèi)核到內(nèi)存、設(shè)置啟動(dòng)參數(shù)、啟動(dòng)內(nèi)核。按照這個(gè)主線,我們嘗試自己從零編寫一個(gè)bootloader,這個(gè)程序相對(duì)簡單,可以讓我們快速理解u-boot主要功能的實(shí)現(xiàn)。
從零編寫bootloader的視頻有:
畢業(yè)班第1課第1.1節(jié)_自己寫bootloader之編寫第1階段.wmv
畢業(yè)班第1課第1.2節(jié)_自己寫bootloader之編寫第2階段.wmv
畢業(yè)班第1課第2節(jié)_自己寫bootloader之編譯測試.wmv
畢業(yè)班第1課第3節(jié)_自己寫bootloader之改進(jìn).wmv
分析u-boot 1.1.6的視頻有:
第9課第1節(jié) u-boot分析之編譯體驗(yàn).wmv
第9課第2節(jié) u-boot分析之Makefile結(jié)構(gòu)分析.wmv
第9課第3節(jié) u-boot分析之源碼第1階段.wmv
第9課第3節(jié) u-boot分析之源碼第2階段.wmv
第9課第4節(jié) u-boot分析之u-boot命令實(shí)現(xiàn).wmv
第9課第5節(jié) u-boot分析_uboot啟動(dòng)內(nèi)核.wmv
移植一個(gè)全新u-boot的視頻有:
畢業(yè)班第2課第1節(jié)_移植最新u-boot之初試.wmv
畢業(yè)班第2課第2.1節(jié)_移植最新u-boot之分析啟動(dòng)過程之概述.wmv
畢業(yè)班第2課第2.2節(jié)_移植最新u-boot之分析啟動(dòng)過程之內(nèi)存分布.wmv
畢業(yè)班第2課第2.3節(jié)_移植最新u-boot之分析啟動(dòng)過程之重定位.wmv
畢業(yè)班第2課第3.1節(jié)_移植最新u-boot之修改代碼之建新板_時(shí)鐘_SDRAM_UART.wmv
畢業(yè)班第2課第3.2節(jié)_移植最新u-boot之修改代碼支持NAND啟動(dòng).wmv
畢業(yè)班第2課第3.3節(jié)_移植最新u-boot之修改代碼支持NorFlash.wmv
畢業(yè)班第2課第3.4節(jié)_移植最新u-boot之修改代碼支持NandFlash.wmv
畢業(yè)班第2課第3.5節(jié)_移植最新u-boot之修改代碼支持DM9000網(wǎng)卡.wmv
畢業(yè)班第2課第4.1節(jié)_移植最新u-boot之裁剪和修改默認(rèn)參數(shù).wmv
畢業(yè)班第2課第4.2節(jié)_移植最新u-boot支持燒寫yaffs映象及制作補(bǔ)丁.wmv
《嵌入式Linux應(yīng)用開發(fā)完全手冊》上對(duì)u-boot的講解有如下章節(jié):
15.1 Bootloader簡介
15.1.1 Bootloader的概念
15.1.2 Bootloader的結(jié)構(gòu)和啟動(dòng)過程
15.1.3 常用Bootloader介紹
15.2 U-Boot分析與移植
15.2.1 U-Boot工程簡介
15.2.2 U-Boot源碼結(jié)構(gòu)
15.2.3 U-Boot的配置、編譯、連接過程
15.2.4 U-Boot的啟動(dòng)過程源碼分析
15.2.5 U-Boot的移植
15.2.6 U-Boot的常用命令
15.2.7 使用U-Boot來執(zhí)行程序
學(xué)習(xí)方法如下:
① 先學(xué)習(xí)《從零編寫bootloader的視頻》,這可以從最少的代碼理解bootloader的主要功能
② 再看書上對(duì)u-boot的講解,并結(jié)合《分析u-boot 1.1.6的視頻》來理解
③ 最后,有時(shí)間有興趣的話,看《移植一個(gè)全新u-boot的視頻》,這不是必須的。
學(xué)習(xí)程度:
① 理解u-boot的啟動(dòng)過程,特別是u-boot代碼重定位:怎么從Flash上把自己讀入內(nèi)存
② 理解u-boot的核心:命令
③ 知道bootloader如何給內(nèi)核傳遞參數(shù)
④ 知道bootloader是根據(jù)“bootcmd”指定的命令啟動(dòng)內(nèi)核
⑤ 作為入門:只求理解,不要求能移植u-boot
2.2.8 Linux內(nèi)核的學(xué)習(xí)
前面說過,內(nèi)核本身不是我們學(xué)習(xí)的重點(diǎn),但是了解一下內(nèi)核的啟動(dòng)過程,還是很有必要的:工作中有可能要修改內(nèi)核以適配硬件,掌握了啟動(dòng)過程才知道去修改哪些文件。
分析內(nèi)核的視頻有:
第10課第1節(jié) 內(nèi)核啟動(dòng)流程分析之編譯體驗(yàn).wmv
第10課第2節(jié) 內(nèi)核啟動(dòng)流程分析之配置.wmv
第10課第3節(jié) 內(nèi)核啟動(dòng)流程分析之Makefile.wmv
第10課第4節(jié) 內(nèi)核啟動(dòng)流程分析之內(nèi)核啟動(dòng).wmv
移植內(nèi)核的視頻有:
業(yè)班第3課第1節(jié)_移植3.4.2內(nèi)核之框架介紹及簡單修改.wmv
畢業(yè)班第3課第2節(jié)_移植3.4.2內(nèi)核之修改分區(qū)及制作根文件系統(tǒng).wmv
畢業(yè)班第3課第3節(jié)_移植3.4.2內(nèi)核之支持yaffs文件系統(tǒng).wmv
畢業(yè)班第3課第4節(jié)_移植3.4.2內(nèi)核之裁剪及ECC簡介及制作補(bǔ)丁.wmv
《嵌入式Linux應(yīng)用開發(fā)完全手冊》上對(duì)內(nèi)核的講解有如下章節(jié):
16.1 Linux版本及特點(diǎn)
16.2 Linux移植準(zhǔn)備
16.2.1 獲取內(nèi)核源碼
16.2.2 內(nèi)核源碼結(jié)構(gòu)及Makefile分析
16.2.3 內(nèi)核的Kconfig分析
16.2.4 Linux內(nèi)核配置選項(xiàng)
16.3 Linux內(nèi)核移植
16.3.1 Linux內(nèi)核啟動(dòng)過程概述
16.3.2 修改內(nèi)核以支持S3C2410/S3C2440開發(fā)板
16.3.3 修改MTD分區(qū)
16.3.4 移植YAFFS文件系統(tǒng)
16.3.5 編譯、燒寫、啟動(dòng)內(nèi)核
學(xué)習(xí)方法如下:
① 先看書,并結(jié)合《分析內(nèi)核的視頻》進(jìn)行理解
② 如果有興趣,再根據(jù)《移植內(nèi)核的視頻》自己掌握移植內(nèi)核,這不是必須的
學(xué)習(xí)程度:
① 知道機(jī)器ID的作用,根據(jù)機(jī)器ID找到單板對(duì)應(yīng)的文件
② 知道Makefile、Kconfig的作用,知道怎么簡單地配置內(nèi)核
③ 知道怎么修改分區(qū)
④ 作為入門:只求理解,不要求能移植
2.2.9 根文件系統(tǒng)
在驅(qū)動(dòng)程序開發(fā)階段,我們喜歡搭建一個(gè)最小根文件系統(tǒng)來調(diào)試驅(qū)動(dòng);
在開發(fā)應(yīng)用程序時(shí),也需要搭建文件系統(tǒng),把各種庫、配置文件放進(jìn)去;
在發(fā)布產(chǎn)品時(shí),你還需要修改配置文件,使得產(chǎn)品可以自動(dòng)運(yùn)行程序;
甚至你想實(shí)現(xiàn)插上U盤后自動(dòng)啟動(dòng)某個(gè)程序,這也要要修改配置文件;
這一切,都需要你理解根文件系統(tǒng)的構(gòu)成,理解內(nèi)核啟動(dòng)后是根據(jù)什么配置文件來啟動(dòng)哪些應(yīng)用程序。
分析根文件系統(tǒng)的視頻有:
第11課第1節(jié) 構(gòu)建根文件系統(tǒng)之啟動(dòng)第1個(gè)程序.wmv
第11課第2節(jié) 構(gòu)建根文件系統(tǒng)之init進(jìn)程分析.wmv
第11課第3節(jié) 構(gòu)建根文件系統(tǒng)之busybox.wmv
第11課第4節(jié) 構(gòu)建根文件系統(tǒng)之構(gòu)建根文件系統(tǒng).wmv
《嵌入式Linux應(yīng)用開發(fā)完全手冊》上對(duì)文件系統(tǒng)的講解有如下章節(jié):
17.1 Linux文件系統(tǒng)概述
17.1.1 Linux文件系統(tǒng)的特點(diǎn)
17.1.2 Linux根文件系統(tǒng)目錄結(jié)構(gòu)
17.1.3 Linux文件屬性介紹
17.2 移植Busybox
17.2.1 Busybox概述
17.2.2 init進(jìn)程介紹及用戶程序啟動(dòng)過程
17.2.3 編譯/安裝Busybox
17.3 使用glibc庫
17.3.1 glibc庫的組成
17.3.2 安裝glibc庫
17.4 構(gòu)建根文件系統(tǒng)
17.4.1 構(gòu)建etc目錄
17.4.2 構(gòu)建dev目錄
17.4.3 構(gòu)建其他目錄
17.4.4 制作/使用yaffs文件系統(tǒng)映象文件
17.4.5 制作/使用jffs2文件系統(tǒng)映象文件
學(xué)習(xí)方法:結(jié)合書和視頻學(xué)習(xí)。
學(xué)習(xí)程序:
① 理解配置文件的作用
② 知道根文件系統(tǒng)中l(wèi)ib里的文件來自哪里
③ 可以制作、燒寫文件系統(tǒng)映象文件
2.3 驅(qū)動(dòng)程序的學(xué)習(xí)
《嵌入式Linux應(yīng)用開發(fā)完全手冊》對(duì)驅(qū)動(dòng)程序的講解不多,我們推出的“韋東山Linux視頻第2期_驅(qū)動(dòng)現(xiàn)場編寫調(diào)試”,可以認(rèn)為完全脫離了書本。
所以,驅(qū)動(dòng)程序的學(xué)習(xí)完全按照視頻來就可以了。
第2期的視頻,對(duì)每一個(gè)驅(qū)動(dòng),先講解硬件原理,然后從零寫代碼,從簡單到復(fù)雜,逐漸完善它的功能。
我們不會(huì)羅列專業(yè)術(shù)語,會(huì)參考日常生活的例子,力爭用最形象的比喻讓你輕松入門,同時(shí)又會(huì)很深入。
注意:我們可以讓你入門時(shí)很輕松,但是要深入理解的話,這需要你跟著視頻練習(xí)代碼,這是個(gè)要慢慢思考的過程,不會(huì)輕松。
輕松的話,憑什么拿高工資?
再次申明:即使照抄也要寫代碼!很多人視頻看得很高興,但是寫代碼時(shí)就傻了。
2.3.1 經(jīng)典字符設(shè)備驅(qū)動(dòng)程序
視頻中以LED、按鍵驅(qū)動(dòng)為例,講解并練習(xí)開發(fā)過程中碰到的機(jī)制:查詢、休眠-喚醒、中斷、異步通知、poll、同步、互斥等等。
后續(xù)更復(fù)雜的驅(qū)動(dòng)程序,就是在這些機(jī)制的基礎(chǔ)上,根據(jù)硬件特性設(shè)計(jì)出精巧的軟件框架。
相關(guān)的視頻有(文件名中帶“_P”的屬于第2期加密視頻):
第12課第1節(jié) 字符設(shè)備驅(qū)動(dòng)程序之概念介紹.wmv
第12課第2.1節(jié) 字符設(shè)備驅(qū)動(dòng)程序之LED驅(qū)動(dòng)程序_編寫編譯.wmv
第12課第2.2節(jié) 字符設(shè)備驅(qū)動(dòng)程序之LED驅(qū)動(dòng)程序_測試改進(jìn).wmv
第12課第2.3節(jié) 字符設(shè)備驅(qū)動(dòng)程序之LED驅(qū)動(dòng)程序_操作LED.wmv
第12課第3節(jié) 字符設(shè)備驅(qū)動(dòng)程序之查詢方式的按鍵驅(qū)動(dòng)程序.wmv
第12課第4.1節(jié) 字符設(shè)備驅(qū)動(dòng)程序之中斷方式的按鍵驅(qū)動(dòng)_Linux異常處理結(jié)構(gòu).wmv
第12課第4.2節(jié) 字符設(shè)備驅(qū)動(dòng)程序之中斷方式的按鍵驅(qū)動(dòng)_Linux中斷處理結(jié)構(gòu).wmv
第12課第4.3節(jié) 字符設(shè)備驅(qū)動(dòng)程序之中斷方式的按鍵驅(qū)動(dòng)_編寫代碼.wmv
第12課第5節(jié) 字符設(shè)備驅(qū)動(dòng)程序之poll機(jī)制.wmv
第12課第6節(jié) 字符設(shè)備驅(qū)動(dòng)程序之異步通知.wmv
第12課第7節(jié) 字符設(shè)備驅(qū)動(dòng)程序之同步互斥阻塞.wmv
第12課第8節(jié) 字符設(shè)備驅(qū)動(dòng)程序之定時(shí)器防抖動(dòng)_P.wmv
第13課第1節(jié) 輸入子系統(tǒng)概念介紹_P.wmv
第13課第2節(jié) 輸入子系統(tǒng)第編寫驅(qū)動(dòng)程序_P.wmv
《嵌入式Linux應(yīng)用開發(fā)完全手冊》上對(duì)字符設(shè)備驅(qū)動(dòng)程序的講解有如下章節(jié):
第19章 字符設(shè)備驅(qū)動(dòng)程序
19.1 Linux驅(qū)動(dòng)程序開發(fā)概述
19.1.1 應(yīng)用程序、庫、內(nèi)核、驅(qū)動(dòng)程序的關(guān)系
19.1.2 Linux驅(qū)動(dòng)程序的分類和開發(fā)步驟
19.1.3 驅(qū)動(dòng)程序的加載和卸載
19.2 字符設(shè)備驅(qū)動(dòng)程序開發(fā)
19.2.1 字符設(shè)備驅(qū)動(dòng)程序中重要的數(shù)據(jù)結(jié)構(gòu)和函數(shù)
19.2.2 LED驅(qū)動(dòng)程序源碼分析
第20章 Linux異常處理體系結(jié)構(gòu)
20.1 Linux異常處理體系結(jié)構(gòu)概述
20.1.1 Linux異常處理的層次結(jié)構(gòu)
20.1.2 常見的異常
20.2 Linux中斷處理體系結(jié)構(gòu)
20.2.1 中斷處理體系結(jié)構(gòu)的初始化
20.2.2 用戶注冊中斷處理函數(shù)的過程
20.2.3 中斷的處理過程
20.2.4 卸載中斷處理函數(shù)
20.3 使用中斷的驅(qū)動(dòng)程序示例
20.3.1 按鍵驅(qū)動(dòng)程序源碼分析
20.3.2 測試程序情景分析
學(xué)習(xí)方法:
① 沿著數(shù)據(jù)流向,從應(yīng)用程序的對(duì)驅(qū)動(dòng)程序的使用進(jìn)行情景分析。
所謂情景分析,就是假設(shè)應(yīng)用程序發(fā)起某個(gè)操作,你去分析其中的運(yùn)作過程。比如應(yīng)程序調(diào)用open、read、ioctl等操作時(shí)涉及驅(qū)動(dòng)的哪些函數(shù)調(diào)用。
你要思考一個(gè)問題:一個(gè)應(yīng)用程序,怎么獲得按鍵信息,怎么去控制LED。把其中數(shù)據(jù)的流向弄清楚了,對(duì)字符驅(qū)動(dòng)程序也就基本理解了。
② 學(xué)習(xí)異常和中斷時(shí),可以結(jié)合書和視頻;對(duì)于驅(qū)動(dòng)程序中其他內(nèi)容的學(xué)習(xí),可以不看書。
2.3.2 工作中各類驅(qū)動(dòng)程序
我們的視頻中講解的驅(qū)動(dòng)程序非常多,目的有二:
① 在你工作中遇到同類驅(qū)動(dòng)時(shí)提供借鑒
② 供你學(xué)習(xí)、練習(xí),煅煉閱讀驅(qū)動(dòng)程序的“語感”,提升編寫程序的能力,增加調(diào)試經(jīng)驗(yàn)
我們還打算擴(kuò)充驅(qū)動(dòng)視頻,把它打造成“Linux驅(qū)動(dòng)程序大全”視頻,基本上都會(huì)采取從零現(xiàn)場編寫的方式。
也許有人說:在工作中我們基本上只是移植、修改驅(qū)動(dòng)而已,很少從頭編寫。這話沒錯(cuò),但是能修改的前提是理解;想更好地理解,最好的方法是從零寫一個(gè)出來。在學(xué)習(xí)階段,不要怕耗費(fèi)太多時(shí)間,從零開始編寫,慢慢完善它,在這過程中你既理解了這個(gè)驅(qū)動(dòng),也煅煉了能力,做到觸類旁通。
如果有時(shí)間,建議你學(xué)完這些所有的視頻,直到你自認(rèn)為:
① 給你一個(gè)新板,你可以很快實(shí)現(xiàn)相關(guān)驅(qū)動(dòng)
② 給你一個(gè)新硬件,你可以很快給它編寫/移植驅(qū)動(dòng)。
我們錄制的視頻很多,下面只羅列到“課”,不羅列到“節(jié)”。
第2期視頻:
第14課 驅(qū)動(dòng)程序分層分離概念_總線驅(qū)動(dòng)設(shè)備模型
第15課 LCD驅(qū)動(dòng)程序
第16課 觸摸屏驅(qū)動(dòng)程序
第17課 USB驅(qū)動(dòng)程序
第18課 塊設(shè)備驅(qū)動(dòng)程序
第19課 NAND FLASH驅(qū)動(dòng)程序
第20課 NOR FLASH驅(qū)動(dòng)程序
第21課 網(wǎng)卡驅(qū)動(dòng)程序
第22課 移植DM9000C驅(qū)動(dòng)程序
第23課 I2C設(shè)備裸板程序
第24課 I2C驅(qū)動(dòng)程序 (不看此課,看第32課,第32課講得更好)
第26課 聲卡驅(qū)動(dòng)程序 (不看此課,看第3期的ALSA驅(qū)動(dòng),那講得更好)
第27課 DMA驅(qū)動(dòng)程序
第28課 hotplug_uevent機(jī)制
第32課 3.4.2內(nèi)核下的I2C驅(qū)動(dòng)程序
第3期的驅(qū)動(dòng)視頻:
攝像頭驅(qū)動(dòng)_虛擬驅(qū)動(dòng)vivi
攝像頭驅(qū)動(dòng)_USB攝像頭
攝像頭驅(qū)動(dòng)_CMOS攝像頭
WIFI網(wǎng)卡驅(qū)動(dòng)程序移植
3G網(wǎng)卡驅(qū)動(dòng)程序移植
ALSA聲卡驅(qū)動(dòng)程序
學(xué)習(xí)方法:
① 再次強(qiáng)調(diào),不能光看不練:一定要寫程序,即使照抄也得寫
② 必學(xué):LCD、觸摸屏、NAND Flash、Nor Flash、hotplug_uevent機(jī)制
③ 學(xué)完之后,強(qiáng)烈建議換一個(gè)不同的開發(fā)板,嘗試在新板上寫驅(qū)動(dòng)程序。
按視頻學(xué)習(xí)會(huì)一切順利,很多問題你可能沒想到、沒想通,換一個(gè)新板會(huì)讓你真正掌握。
2.3.3 調(diào)試方法
有一種說法,程序是三分寫七分調(diào),我們從操作系統(tǒng)的角度提供了一些很有用的調(diào)試方法。
相關(guān)的視頻有:
第29課第1節(jié)_裸板調(diào)試之點(diǎn)燈法_P.wmv
第29課第2節(jié)_裸板調(diào)試之串口打印及棧初步分析_P.wmv
第29課第3.1節(jié)_裸板調(diào)試之JTAG原理_P.wmv
第29課第3.2節(jié)_裸板調(diào)試之JTAG調(diào)試體驗(yàn)_P.wmv
第29課第3.3節(jié)_裸板調(diào)試之JTAG調(diào)試命令行調(diào)試_P.wmv
第29課第3.4節(jié)_裸板調(diào)試之JTAG調(diào)試源碼級(jí)調(diào)試_P.wmv
第30課第1.1節(jié)_驅(qū)動(dòng)調(diào)試之printk的原理_P.wmv
第30課第1.2節(jié)_驅(qū)動(dòng)調(diào)試之printk的使用_P.wmv
第30課第1.3節(jié)_驅(qū)動(dòng)調(diào)試之打印到proc虛擬文件_P.wmv
第30課第2.1節(jié)_驅(qū)動(dòng)調(diào)試之段錯(cuò)誤分析_根據(jù)pc值確定出錯(cuò)的代碼位置_P.wmv
第30課第2.2節(jié)_驅(qū)動(dòng)調(diào)試之段錯(cuò)誤分析_根據(jù)棧信息確定函數(shù)調(diào)用過程_P.wmv
第30課第3節(jié)_驅(qū)動(dòng)調(diào)試之自制工具_(dá)寄存器編輯器_P.wmv
第30課第4節(jié)_驅(qū)動(dòng)調(diào)試之修改系統(tǒng)時(shí)鐘中斷定位系統(tǒng)僵死問題_P.wmv
第31課第1節(jié)_應(yīng)用調(diào)試之使用strace命令跟蹤系統(tǒng)調(diào)用_P.wmv
第31課第2節(jié)_應(yīng)用調(diào)試之使用gdb和gdbserver_P.wmv
第31課第3節(jié)_配置修改內(nèi)核打印用戶態(tài)段錯(cuò)誤信息_P.wmv
第31課第4.1節(jié)_應(yīng)用調(diào)試之自制系統(tǒng)調(diào)用_P.wmv
第31課第4.2節(jié)_應(yīng)用調(diào)試之使用自制的系統(tǒng)調(diào)用_P.wmv
第31課第5.1節(jié)_應(yīng)用調(diào)試之輸入模擬器之設(shè)計(jì)思路_P.wmv
第31課第5.2節(jié)_應(yīng)用調(diào)試之輸入模擬器之編寫保存功能_P.wmv
第31課第5.3節(jié)_應(yīng)用調(diào)試之輸入模擬器之編寫測試模擬功能_P.wmv
2.4 Linux應(yīng)用程序的學(xué)習(xí)
對(duì)于大多數(shù)人來說,第1個(gè)C程序是在Windows的Visual Studio C++(簡稱VC)上寫的,所以你們關(guān)心的也許是:嵌入式Linux應(yīng)用程序,跟VC應(yīng)用程序之間的區(qū)別:
① 編譯方法不同:
在VC上點(diǎn)點(diǎn)鼠標(biāo)即可編譯,對(duì)于嵌入式Linux應(yīng)用程序,我們需要“交叉編譯”:程序要在PC Linux上編譯,但是運(yùn)行時(shí)要放到單板上。
并且,它的編譯環(huán)境需要你自己搭建:解壓出工具鏈后設(shè)計(jì)PATH,還要自己構(gòu)造一套Makefile系統(tǒng)。
② 調(diào)試方法不同:
在VC上點(diǎn)點(diǎn)鼠標(biāo)就可以調(diào)試,對(duì)于嵌入式Linux應(yīng)用程序,你可以更喜歡用打印;或是在PC Linux上通過GDB觀察應(yīng)用程序在單板上的運(yùn)行狀況。
③ 可用的資源不同:
對(duì)于VC程序,你可以直接使用微軟公司提供的各種類庫;對(duì)于嵌入式Linux應(yīng)用程序,很多時(shí)候需要去尋找、下載、編譯、使用開源庫。
④ 功能不同:
VC程序運(yùn)行在PC上,一般是用來解決某些純軟件的問題,比如整理數(shù)據(jù)、修圖、聯(lián)網(wǎng)播放音樂之類。嵌入式Linux應(yīng)用程序一般都要操作若干種硬件,比如監(jiān)控設(shè)備中要操作攝像頭、存儲(chǔ)音視頻,無人機(jī)中要操作GPS、螺旋槳,POS機(jī)中要操作銀行卡等等。它跟單板上的硬件聯(lián)系很大,很多時(shí)候需要你懂點(diǎn)硬件知識(shí),至少是知道怎么通過驅(qū)動(dòng)程序來操作這些硬件。
上述4點(diǎn)的不同,花很少的時(shí)間就可以掌握。
如果你有志于開發(fā)應(yīng)用程序,那么一定要有算法、數(shù)據(jù)結(jié)構(gòu)、網(wǎng)絡(luò)編程等基礎(chǔ),然后再掌握一些設(shè)計(jì)模式,最后就是多參加一些實(shí)際項(xiàng)目的開發(fā)了。
基于我們提供的視頻,你可以這樣學(xué)習(xí):
① 先掌握第1期講解的根文件系統(tǒng):
在后續(xù)學(xué)習(xí)中你會(huì)經(jīng)常構(gòu)建根文件系統(tǒng),比如往里面添加庫、修改配置文件讓你的程序自動(dòng)運(yùn)行。
② 掌握怎么編譯、燒寫u-boot、內(nèi)核:
在實(shí)際工作中,一般來說不需要你去燒寫u-boot、內(nèi)核,但是在自學(xué)階段還是自己掌握吧,免得去麻煩別人。
按開發(fā)板手冊即可操作,你甚至不用管里面的原理。
③ 掌握Makefile:
可以看如下第3期視頻,以后編譯程序時(shí)只要執(zhí)行make命令即可:
第1課第4節(jié)_數(shù)碼相框_編寫通用的Makefile
④ 學(xué)習(xí)第1個(gè)項(xiàng)目:數(shù)碼相框
該項(xiàng)目不使用任何開源的GUI項(xiàng)目,完全是自己構(gòu)建一套GUI系統(tǒng),實(shí)現(xiàn)了文件瀏覽、文件顯示(文本和圖片)、圖片操作(放大、縮小、自動(dòng)播放)等功能;涉及網(wǎng)絡(luò)編程、多線程編程、開源庫使用等等。
雖然數(shù)碼相框作為一個(gè)產(chǎn)品已經(jīng)落伍了,但是該項(xiàng)目所涉及的技術(shù),特別是以面向?qū)ο蟮木幊趟枷朐O(shè)計(jì)出一個(gè)模塊化的、易擴(kuò)展的系統(tǒng),非常適合沒有大型項(xiàng)目開發(fā)經(jīng)驗(yàn)的人。很多同學(xué),都是根據(jù)該項(xiàng)目所教會(huì)的編程思想找到了心怡的工作。
第3期視頻取名為“項(xiàng)目開發(fā)”,而非“應(yīng)用開發(fā)”,它的第2、3個(gè)項(xiàng)目跟內(nèi)核、驅(qū)動(dòng)耦合很大。如果只關(guān)心應(yīng)用開發(fā),或是急于找一份工作,可以先看第1個(gè)項(xiàng)目。
第2個(gè)項(xiàng)目涉及攝像頭、ALSA聲卡、WIFI網(wǎng)卡、3G網(wǎng)卡,這些都是在實(shí)際工作過程中經(jīng)常用到的設(shè)備,比如我們后面補(bǔ)充的QQ物聯(lián)就用到攝像頭、聲卡、WIFI網(wǎng)卡。
第3個(gè)項(xiàng)目是電源管理,講解怎么講你的單板休眠以省電。