嵌入式Linux學習路線圖我是1999上的大學,專業是物理。大壹的時候,班裏普遍彌漫著對未來的焦慮,不知道學完物理出去能幹什麽。妳現在的經歷,現在的學習,壹定會影響妳以後的生活。畢業後也找到了自己的工作:出國深造轉行做金融,留校任教做科研,設計芯片,寫程序,開公司等。這些都離不開我們在學校學到的基本功(數學、IT、電子電路)和錘煉出來的自學能力。
所以,妳們是迷茫的學生,是想轉行的程序員。以後肯定有妳的位置。是好是壞取決於妳現在的努力和積累。
我無法預測幾年後什麽行業會流行,也不能保證妳學習這篇文章就能發財。我只是壹個有十幾年經驗的程序員,如果妳對編程感興趣,我想給妳壹些建議。
1.程序員的三個方向。程序員的方向壹般可以分為三類:專業領域、業務領域、操作系統領域。了解他們之後,根據自己的興趣選擇。
專業領域我給不了建議。
業務(即應用程序)並不完全獨立於操作系統:
(1)開發物理產品時,寫好應用的人有時需要操作系統的知識,比如設置調度優先級,知道某些功能可能會讓進程休眠。
(2)寫應用程序的人晉升為系統工程師,需要從上到下都知道,然後需要有操作系統領域的知識。不然怎麽設計整個系統?
3做應用的人需要了解行業的需求,了解業務的邏輯。所以做領導的人,多是應用型的。壹旦進入壹個行業,就很難再換行業了。
(4)在操作系統領域,這是在扼殺所有行業:他只負責底層系統,他在上面開發什麽業務與他無關。這壹行很多人都是技術專家。
⑤操作系統和業務沒有邊界。有操作系統的經驗,然後做應用,遇到問題就會知道系統的根源,有解決方案。有了業務經驗,可以重新學習操作系統,很快就可以組建團隊自立門戶,至少做CTO是沒問題的。
1.1的專業領域可以分為以下兩類。
1.1.1學術研究
比如語音,圖像處理,人工智能,這類工作需要妳有很強的理論知識。我傾向於認為這樣的人是“科學家”。他們學習多年,經常做學術研究。
在嵌入式領域,需要用某種算法來表達他們的成果,優化某些芯片。這部分工作可能會有人來做。
1.1.2工程實現
也有人了解這些專業領域的概念,但沒有深入鉆研。妳可以利用各種開源材料來達到某個目標,做出產品。比如圖像處理,他知道如何利用opencv中上百個復雜的函數實現頭像識別。有時這些功能可以根據具體的芯片進行優化。
“專業領域”不是我喜歡的。如果妳想做這個,我覺得最好的入門方式就是在校學習研究生和博士課程。
1.2業務領域,換句話說就是應用,可以分為以下兩類。
1.2.1界面顯示
當然妳需要壹個好的界面來做產品,但不是說不重要,是沒有發展潛力。
現在的熱詞是Android APP和IOS APP開發。不要被Android和IOS這兩個詞所迷惑。它們和之前的VC和VB壹樣,只是,只是壹套GUI控件。
我希望我沒有冒犯妳。我有我的理由。
壹個程序需要壹個GUI界面,但程序的內部邏輯才是核心。Android和IOS的開發工具為我們簡化了GUI的開發,提供了這些控件的交互機制,封裝並提供了壹些服務(比如網絡傳輸)。而是程序內部的業務邏輯,視頻圖像和聲音的處理等。,都是核心。另外,別忘了服務器端的後臺程序:如何更安全的保存數據,保護客戶隱私,如何處理百萬級並發訪問等等,這些也是核心。
但是,安卓和IOS的APP上手很快!如果妳是大四學生,急於找工作,花1或者2個月學習Android或者IOS,應該很容易找到工作。畢竟APP的需求永遠是最大的,現在這兩個技術還是比較熱的。2011和2012左右,安卓程序員的起薪還挺高的,後來開始下降。安卓APP基本入門時間只有1個月,所以知道的人越來越多。2013,2014,IOS開發的工資明顯比Android高,所以各種IOS培訓也暴露出來了。國內壹直不缺快節奏的人才,估計過段時間IOS工程師也是白菜價。
了解Android和IOS只是基本要求。不信的話,去51job搜索安卓或者IOS,其他要求會在職位需求中得到肯定。
1.2.2業務邏輯
舉個簡單的例子,要制作壹個穿孔卡軟件,妳需要考慮這些事情:
(1)正常流程是上班打卡。
②有人忘記了怎麽辦?記錄為異常,並將其推送給管理員。
(3)請假怎麽處理?
4加班怎麽處理?
再舉壹個比較復雜的例子,在視頻會議系統中,各種模塊如何連接,如何兼容各種協議,不深入行業妳根本想不通。
應用開發崗位永遠是最多的,入門門檻低。基本上只要妳會說C語言,在面試中表現得體,壹般公司都會給妳機會。因為:
進入公司後,妳需要接受再培訓:熟悉他們的業務邏輯。
2妳要做的基本上就是壹個模塊,框架已經給妳定好了。妳可以只填寫代碼。
說壹件讓妳開心的事:在軟件公司,領導基本都在寫應用(當然還有營銷)。寫應用的人可以對外研究市場,接待客戶,對內可以管理程序員完成開發。不讓他當領導誰能做?
如果妳的誌向是寫壹個應用,那麽我建議妳先練好基本功:數據結構和算法是必須的,然後根據自己的興趣選擇數據庫、網絡編程等進行深入學習。
最後,選擇自己感興趣的行業,深耕10年。做應用開發的人選擇了某個行業,以後很難換行業。選線很重要!
UCOS在1.3操作系統領域太簡單,VxWorks太貴太專業,Windows不玩嵌入式系統,IOS不開源,只能在操作系統領域玩Linux。
嵌入式領域Linux壹家獨大!
安卓呢?和QT壹樣,Android也是壹個GUI系統。只是谷歌的實力太強了,現在安卓無處不在,所以很多時候Linux+安卓成了標配。註意,這裏我們關心的是Android的整個系統和機制,而不是學習幾個API和開發接口程序。操作系統領域所包含的內容,簡單來說就是做壹臺有好系統的專用“電腦”,可以分為:
①為產品規劃硬件:
根據需求、性能、成本選擇主芯片,並與外圍設備匹配,由硬件開發商設計。
(2)制作並安裝操作系統,編寫單板驅動程序。
③定制維護、升級等系統方案。
④也可以配置安裝Android等GUI系統:
⑤為應用開發者配置開發環境。
⑥從系統角度解決難題。
這個領域通常被稱為“底層系統”或“驅動開發”。
先解決兩個常見的誤區:
這個工作是寫驅動嗎?
看上面列舉的六點,應該說包含了驅動開發,但遠遠不止驅動開發。
②我們還需要寫驅動嗎?沒有原廠嗎?還是只需要改?
經常有人說原廠芯片開的好,拿過來換就行了。如果妳的硬件和原板壹模壹樣,原始源代碼無BUG,妳不想優化性能,削減成本,做壹些有特色的產品,那麽這個說法是對的。
但是在這個創新或者死亡的時代,可能嗎?!有兩個原因:
(1)即使只修改代碼,可修改的前提是理解;最好的理解方式就是從頭開始寫幾個驅動。
②很多時候需要對系統進行深度定制。
以前聯發科手機只要換接口就能出貨,現在山寨廠壹批批倒了。當大家都不加修改的使用原方案,最後只能拼成本。
比如深圳有兩家生產交通攝像頭和監控攝像頭的廠家,他們讓我做了四個項目:
①提高廠商提供的SD卡的驅動性能,使用DMA。
②換了Flash型號後,系統經常出現問題,需要修改驅動BUG。
③觸摸屏點擊不正確,找到原因了。後來發現是旁路電容造成的。
(4)削減成本,4塊DDR換成2塊DDR,需要bootloader改變DDR的初始化。
這些項目非常緊急,如果我們不能處理它們,我們就不能發貨。這個時候為什麽不找原廠呢?除非妳是中興華為這樣的大客戶,不然誰管妳?
我在中興工作的時候,寫驅動的時間其實很少,大部分時間都在調試:系統調優,幫APP工程師和硬件工程師找問題。我們從廠商和網上得到的很多源代碼都是標準的,當然也可以直接使用。但是優化妳的產品可能會更好。比如我們可以把攝像頭驅動和DMA驅動結合起來,通過DMA把攝像頭的數據直接發給DSP。我們可以充當軟件和硬件之間的橋梁。對於實體產品來說,可能是軟件或者硬件有問題,壹般底層系統工程師更容易發現問題。
當軟硬件應用出現他們解決不了的問題時,從底層軟件的角度給他們建議,給他們提供工具。再比如方案選擇:芯片性能能否達標,可用的BSP是否完善等。,這只能由整個方案的負責人來考慮,他必須了解底層。
在操作系統領域,對知識有很多要求:
(1)了解硬件知識了解電路圖。
(2)英語好能看懂芯片說明書。
③編寫和移植驅動程序的能力。
④對操作系統本身有壹定的了解,可以解決各種疑難問題。
⑤了解Android的內部機制。
⑥懂匯編、C語言、C++和JAVA。
絕對是個大坑,沒有興趣和毅力的人要慎重選擇。
幹這行要半年以上才能入門,就算整天學習。
2它的地位肯定比不上APP。
而且妳沒有1或者2年的經驗。妳被公司錄用後,就開始做APP。
優點是:
1學好了,行業必殺,想包就包;想做自己的產品就做自己的產品。
②和做申請的人相比,不會被不斷變化的需求逼得天天加班。
門檻高,當然工資也比較高。
在操作系統領域,我認為適合這些人:
(1)硬件工程師想轉行做軟件工程師,從底層軟件入手會更好。
(2)單片機工程師,想升級。了解Linux底層的人壹定會了解單片機,但是了解單片機的人不壹定了解Linux。
③時間充裕的同學:如果妳是大二或大三的學生,花上半年時間學習底層嵌入式Linux是有好處的。
4想掌握整個系統的人,比如妳在公司寫壹個APP,但是想晉升為系統工程師,那麽底層就得學。
⑤想自己創業做實體產品的工程師,如果妳有錢,不需要學什麽技術,但是如果妳沒錢,想做產品,那麽Linux的底層就得學。
6做Linux APP的人,對,也要學。
這部分人不用深究,大概了解壹下就行了:bootloader是用來啟動內核的,Linux的文件系統(第1個程序是什麽,目錄是用來做什麽的),APP和驅動的調用關系,工具鏈,這些概念都夠了。
本文默認操作系統為Linux,討論如何學習嵌入式Linux+Android系統。
1.4嵌入式Linux+Android系統包含什麽?別急,舉個例子就好。
誰在電腦開機時顯示了那些界面?
是BIOS。它是做什麽的?有的自檢,然後從硬盤讀取windows並啟動。
同樣,這個BIOS對應於嵌入式Linux中的引導裝載程序。這個bootloader將刷新以讀取Linux內核並啟動它。
②啟動windows的目的是什麽?
當然是運行應用上網聊天了。
這些在線程序和聊天程序在哪裏?
在c盤和d盤上。
因此,windows必須首先識別驅動器C和驅動器D..我們稱之為Linux下的根文件系統。
(3) ③windows可以識別驅動器C和驅動器D,所以必須具備讀寫硬盤的能力。
這種能力叫做驅動力。當然不僅僅是硬盤,還有網卡,USB等硬件。嵌入式Linux可以從Flash中讀取和執行應用,必須有Flash的驅動,當然不僅僅是Flash。
簡單來說,嵌入式LINUX系統包含五大塊:bootloader、內核、驅動、根文件系統和應用程序。而應用,我們可以分為:C/C++,Android。
因此,嵌入式Linux+Android系統包括以下六個部分:
①引導加載程序
②Linux內核
③驅動程序
④用C/C++編寫的應用程序
⑤安卓系統本身
6.⑥安卓應用
Android和Linux的聯系如此之大,其應用如此廣泛,沒有理由在學習完Linux之後就停止學習Android。在大多數智能設備中,運行的是Linux操作系統;它要麽安裝了Android,要麽可以與Android手機互聯。現在,Linux+Android已經成為標配。
2.如何學習嵌入式Linux操作系統本文假設妳是零基礎,以實用為主,讓妳在最快的時間內入門;我也會附上壹些想深入學習時可以參考的資料。
在實際工作中,我們是圍繞“操作系統”進行開發的,不會對操作系統本身進行太深入的研究和修改。
①操作系統具有進程管理、存儲管理、文件管理、設備管理等功能,這些核心功能非常穩定可靠,基本上我們不需要修改代碼。我們只需要為我們自己的硬件完善驅動程序。
②學習驅動肯定會涉及到其他知識,比如倉儲管理、流程調度等。當妳深刻理解了驅動,妳也會加深對操作系統其他部分的理解。
③Linux內核中的代碼大部分是設備驅動,可以認為Linux內核是由各種驅動組成的。
但是,要成為這方面的高手,就必須深入了解Linux操作系統本身,研究其源代碼。
在繁忙的工作和閑暇之後,妳可以看看這些書:
①趙炯的linux內核全筆記,比較薄,推薦。後來又出了《Linux內核全解析》,太厚了。不喜歡就忘了前面。
(2)毛和胡的《LINUX核心源代碼的場景分析》,分上下兩卷,極其厚。就當字典看:如果妳想深入理解某件事,看壹章就行了。
還有很多其他的好書,但是我沒怎麽看過,也沒有更多的建議。
出於快速入門和入門的目的,不需要先看上面的書,先按照這篇文章學習。
2.1入門路線圖假設妳是零基礎,我們規劃了以下入門路線圖。前面的知識是後面知識的基礎,建議按順序學習。每個部分不壹定需要徹底研究,這將在下面的章節中描述。
2.2學習驅動前的基礎知識2.2.1 C語言
只要是理工科的,好像都會教C語言。我見過很多C語言考了90,100的人,壹上電腦就傻了。我懷疑他們曾經在計算機上寫過程序。
理論再好,如果不實踐就不能工作,那公司為什麽還要聘用妳呢?
另壹方面,從實踐中學習C語言,壹定要練,寫,寫!
當妳掌握了基本的語法,妳就可以在電腦上練習壹些C語言的練習了。
當妳寫了幾個C程序,就可以進入下壹階段的裸機開發了。
(1)不需要太深。
作為壹個快速的開始,只要妳能寫“妳好,世界!”,會寫冒泡排序,會做壹些基本的語法操作,暫時夠用了。
指針操作是重點,多練習;
不需要學習太多的數據結構知識,只需要掌握鏈表操作就可以了,其他的都不需要學,比如隊列,二叉樹。不需要學習任何函數用法,比如文件操作、多線程編程、網絡編程等。這些知識在寫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:更改目錄(更改目錄)
Cd目錄名?//輸入目錄cd..// cd“兩點”:返回上壹個目錄cd-// cd“短橫”:返回上壹個目錄。
②pwd:打印工作目錄(打印當前目錄,顯示當前工作目錄的絕對路徑)。
③mkdir:制作目錄(創建目錄)
Mkdir abc //創建文件夾abcmkdir -p a/b/c //創建文件夾A,然後在A下創建文件夾B,再在B下創建文件夾C。
④rm: Remove(刪除目錄或文件)
rm?文件//刪除文件rm -rf dir命名文件?//刪除名為dir的目錄。
⑤ls: List(列出目錄的內容)
⑥安裝:安裝
mount -t nfs -o nolock,vers = 2 192.168.1.123:/work/NFS _ root/mnt mount-t yaffs/dev/MTD block 3/mnt
⑦chown:更改所有者(更改文件的所有者,即所有者)
chown book:book /work -R?//對於/work目錄及其所有內容,所有者更改為book user,組更改為book。
⑧chmod:改變模式,下面這個例子很簡單粗暴。
chmod 777 /work -R?//對於/work目錄及其所有內容,權限改為可讀、可寫、可執行。
Linux下最常用的編輯命令,使用起來略復雜。請自行搜索用法。
要練習這些命令,可以進入Ubuntu桌面系統,打開終端,輸入那些命令;或者用SecureCRT、putty等工具遠程登錄Ubuntu後練習。
硬件知識
學習硬件知識的目的是理解原理圖、通信協議和芯片手冊。我不想設計原理圖,更不想設計電路板。
對於正統的方法,您應該像這樣學習:
(1)學習微機原理,了解壹臺計算機的組成和各部件的相互作用原理。
②學習數字電路,了解各種門電路的原理和用途,掌握壹些邏輯運算(與、或等。).
(3)模擬電路?我不需要學這個。至少我工作上不需要。現在我全忘了。
以我個人的經驗,這些課程是有用的,但是:
原理有用,但實戰性不強。
比如微機原理是基於x86系統的,和ARM板有很大區別,當然原理也是壹樣的。
直到接觸嵌入式編程,我才明白這些課程。
(2)每本書都那麽厚,有很多內容,學習時間太長,自學困難。
針對這些校園教材的不足,結合實際開發過程中要用到的知識點,我們推出了“學前_如何看示意圖”系列視頻:
學前班1第1段_ _妳怎麽看GPIO和原理圖的門電路。野型腮腺炎病毒
學前班1 Section 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第三節_ _示意圖等記憶界面怎麽看。野型腮腺炎病毒
學前班1第4.1節_怎麽看待原理圖分析S3C2410開發板。野型腮腺炎病毒
學前班1第4.2節_如何看原理圖分析S3C2440開發板?野型腮腺炎病毒
學前班1第4.3節_如何看原理圖分析S3C6410開發板?野型腮腺炎病毒
即使妳只有初中物理課的電路知識,也希望妳能通過這些視頻了解原理圖和壹些常用的通信協議。如果妳想掌握更多的硬件知識,這些視頻也可以作為壹個索引,讓妳知道自己缺什麽知識。
這些視頻中提到的硬件知識,會用到“裸板開發”系列視頻中,然後大家可以互相看看,加深了解。
2.2.4想學習Windows下的單片機開發嗎?
很多學校都開設了單片機課程。很多人是從51單片機和AVR單片機開始的。現在比較新的STM32單片機已經開始接觸嵌入式領域,使用Windows下的開發軟件,比如keil,MDK。
問題來了,要不要學習Windows下的單片機開發?
如果這是妳專業的必修課,那就去學吧。
②如果妳的專業和單片機密切相關,比如機械控制,那就去學吧。
(3)如果妳只是想入門單片機,然後學習更廣泛的嵌入式Linux,那就放棄學習Windows下的單片機吧!
原因如下:
①Windows下的單片機學習不夠深入。
Windows下有非常好的圖形界面單片機開發軟件,比如keil和MDK。
它們封裝了許多技術細節,例如:
妳只會寫主函數的代碼,卻不知道1代碼在通電後是如何執行的;
妳可以寫壹個中斷處理程序,但是妳不知道它是如何被調用的。
妳不知道程序是怎麽從Flash讀入內存的;
不知道內存是怎麽劃分和使用的。不知道棧在哪裏,堆在哪裏。
當妳想截程序減少Flash和內存的使用時,妳無從下手;
當您創建壹個新文件時,它會自動添加到項目中,但是您完全不知道其中的機制。
等等,等等,等等
②基於ARM+Linux的裸機學習可以讓妳學習的更深入,更適合後續的Linux學習。其實就是Linux下的單片機學習,只是壹切都比較原始:所有的代碼都需要自己寫;哪些文檔添加到項目中,需要自己管理。
在工作中,我們當然傾向於使用Windows下更方便的工具,但是在學習階段,我們要學習程序的精髓。
壹切從頭開始寫代碼,管理代碼,我們可以學到更多的知識:
妳需要知道芯片的上電和啟動過程,知道1代碼是如何工作的;
妳需要知道如何將程序從閃存讀入內存;
需要了解內存是如何規劃和使用的,比如棧在哪裏,堆在哪裏;
需要了解代碼重定位;
需要知道如何保護場景,跳轉到中斷入口,調用中斷程序,在中斷發生後還原場景;
妳就知道主函數不是我們寫的第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應用開發完全手冊》。後者可能是國內PC Linux環境下開發的關於ARM裸機程序的1書。如果我錯了,請原諒我讀書少。
對於裸機開發,我們提供兩個視頻:
①環境建設
第0課第1節_接口布線剛好碰到開發板。野型腮腺炎病毒
第0課,第2節_為新開發板編寫裸板程序。野型腮腺炎病毒
第0課第3節_接觸開發板後立即重新燃燒整個系統。野型腮腺炎病毒
第0課,第4節_使用開發板新增的vmwae和ubuntu.wmv。
第0課,第5節_打補丁,編譯使用剛接觸開發板的u-boot,構建sourceinsight項目。野型腮腺炎病毒
第0課第6節_打補丁,編譯使用u-boot,剛接觸開發板的內核,構建sourceinsight項目。野型腮腺炎病毒
第0課,第7節_制作開發板的根文件系統和引導驅動程序。野型腮腺炎病毒
第0課第8節_在TQ2440和MINI 2440上構建視頻系統。野型腮腺炎病毒
第0課第9節_win7不能用dnw燒錄的替代方法。野型腮腺炎病毒
.................
原始鏈接:網頁鏈接