【乾貨分享】嵌入式學習路線公開!(書籍推薦+視訊推薦+練手專案)

嵌入式與Linux那些事發表於2021-10-21

哈嘍,大家好,我是仲一。最近有小夥伴在微信私信我,如何學習嵌入式。一直想寫一篇學習路線的文章,由於各種原因拖到了現在。趁著國慶節在家,終於肝完了這篇文章。

我個人是從STM32轉到驅動開發的,在研二的時候學習了韋東山老師的驅動開發的課程,轉到了驅動開發的方向。下面就如何學習嵌入式說下我個人的看法。

什麼是嵌入式?

嵌入式即嵌入式系統,IEEE(美國電氣和電子工程師協會)對其定義是用於控制、監視或者輔助操作機器和裝置的裝置,是一種專用的計算機系統

國內普遍認同的嵌入式系統定義是以應用為中心,以計算機技術為基礎,軟硬體可裁剪,適應應用系統對功能、可靠性、成本、體積、功耗等嚴格要求的專用計算機系統。

從應用物件上加以定義來說,嵌入式系統是軟體和硬體的綜合體,還可以涵蓋機械等附屬裝置。嵌入式系統作為裝置或裝置的一部分,它是一個控制程式儲存在ROM中的嵌入式處理器控制板

事實上,所有帶有數字介面的裝置,如手錶、微波爐、錄影機、汽車等,都使用嵌入式系統,有些嵌入式系統還包含作業系統,但大多數嵌入式系統都是由單個程式實現整個控制邏輯。

嵌入式方向

嵌入式工程師需要掌握的內容非常廣泛,主要包括嵌入式軟體、嵌入式硬體、以及相關行業、產品的專業知識。作為嵌入式初學者,我們不可能,也沒有那麼多精力把所有的知識到搞的很精通,我們要學會抓住重點,學會取捨,達到一通百通,事半功倍的學習效果
首先嵌入式技術主要分為嵌入式軟體和嵌入式硬體兩大方向。

嵌入式硬體方向

嵌入式硬體工程師主要工作職責是為產品設計硬體電路原理圖,設計硬體PCB板,選擇合適的元器件,焊接除錯硬體電路板,保證硬體電路板的可靠性、穩定性和抗干擾能力

因為現在積體電路發展迅速,大部分積體電路廠商都會提供參考電路,所以硬體電路原理圖的設計相對來說比較簡單,硬體工程師工作的含金量主要體現在產品的可靠性和穩定性設計、以及電磁相容設計,這才是硬體設計工程師的含金量所在

要成為一個資深的嵌入式工程師相當難,一方面要有非常紮實的理論知識,同時也要有相當的那種大型的、高頻CPU、多層PCB板的設計經驗

嵌入式硬體工程師要學的課程主要有類比電路設計、數位電路設計、電磁波理論等。熟悉常用的放大電路、濾波電路、電源電路設計和分析

嵌入式軟體方向

嵌入式軟體工程師的職責主要是根據產品的功能需求設計好軟體,讓硬體工作起來

嵌入式電子產品硬體部分,大部分都是相同的,核心的都是由CPU、RAM和FLASH 幾大部分組成,而軟體就千差萬別了。產品的具體功能都是由軟體來實現的,一般來講一個產品的實現,軟體設計的工作量是硬體設計的4 ~ 5倍

所以一般情況下,一個公司的軟體工程師數量是硬體硬體工程師的4~5倍,嵌入式軟體工程師需求比硬體工程師大很多,同時跟硬體工程師相比,嵌入式軟體工程師學起來相對容易些,所以這裡我重點和大家談一下嵌入式軟體工程的學習路線。

學習嵌入式需要那些內容?

C語言

C語言是嵌入式的重中之重,Linux作業系統就是用C實現的,包括安卓系統的底層也是C語言實現的,基礎不牢,地動山搖,一定要打好基礎。

C語言學習過程中重點要放在指標,結構體,檔案的處理,陣列等。在學習過程中,一定要多寫程式碼程式碼光看是看不會的

遇到錯誤不要怕麻煩,善於使用搜尋工具,百度,google,stack overflow。要知道,你遇到的問題別人肯定也會遇到過,一般在網上一搜就會有答案。

最後,要多除錯程式,熟悉除錯的過程。程式三分寫,七分調,沒有誰的程式是可以一遍寫對的。而且,多除錯程式也可以讓我們理解程式具體是如何執行的。

基本的硬體原理

嵌入式肯定要和硬體打交道的。如果做嵌入式的應用層的話,可能和硬體接觸的少一點。但是很多企業在面試的時候,也會問一些基本的硬體知識。

比如,我同學在面試聯發科的C++工程師的時候,就問到了他很多關於硬體的知識(中斷是什麼,輪詢是什麼,二者有什麼區別,一個基本嵌入式系統有什麼構成等),所以說硬體知識知道越多越好,就算做應用層,一些最基本的也要知道。

如果是打算做嵌入式底層的話,對於硬體知識的掌握要求就比較高了。比如,LCD是如何顯示的,IIC協議/SPI協議是什麼,如何收發資料,不同裝置對於IIC的速度有什麼要求,IIC協議上拉電阻一般是多少等等。只有明白了硬體原理,在看晶片手冊的時候才能明白如何去配置各個暫存器。

此外,常用的裝置儀器的使用能掌握就更好了,和硬體工程師扯皮的時候會用到。比如,萬用表,示波器,邏輯分析儀等。不會也沒關係,這部分不是必須的。

資料結構與演算法

這部分是程式設計師的必修課。在各大廠的秋招春招中,筆試面試都是必考的。常見的資料結構如連結串列,二叉樹,堆,佇列,常見排序演算法及其改進(快排,歸併,冒泡,插入)等都是要掌握的。如果是為了找工作,這部分內容有很多是要能達到手寫的目的。(相關內容見我整理的嵌入式軟體工程師筆試面試指南

雖然嵌入式對於資料結構與演算法的要求不像傳統網際網路那麼高,而且,這些資料結構在以後的工作中不一定可以用到,但是一些基本的我們還是要知道的。

像Linux核心中就用到了很多的連結串列,二叉樹等。掌握這部分內容對於我們以後跳槽,深入研究作業系統都有很大的幫助

計算機基礎

這部分直接決定了我們以後是否能走的更遠,像作業系統的基本概念,計算機組成原理的內容都是需要我們去了解的。比如自旋鎖,訊號量,阻塞與非阻塞等。

學習任何技術一定要學到這門技術的邊界,對於嵌入式來講,它的邊界就是彙編。組合語言不要求會寫,但是一定要能看懂(其實就是Arm指令集)。在很多情況下,看反彙編檔案對於bug的除錯會更方便

學習路線推薦

入門:51+STM32

主要學習內容

中斷、定時器、串列埠、NAND FLASH、網路控制器、LCD屏、觸控式螢幕等的工作原理。

學習資源推薦

視訊:野火,正點原子

書籍:野火,正點原子

學習建議

如果你以後的方向是驅動開發,這部分學習的話重點放在硬體知識的理解。買個開發板,學習下他們的例程是如何寫的,常用嵌入式外圍裝置的硬體工作原理,以及如何使用C語言來程式設計、控制這些硬體。把基本的外設都學習一遍,不求都會寫,但是硬體原理一定要搞清楚

進階:ARM-A+Linux

這部分主要分為兩個方向:Linux應用開發,Linux驅動開發。下面我會對這兩個方向分別進行說明。

有了之前的微控制器基礎,上手Linux開發就會快一點。可以買個ARM-A核心的開發板,ARM-A和stm32很多地方都是相通的,理解起來不難,二者最大的差別在於開發環境,很多新手入門Linux開發在搭建環境時就被勸退了。學習ARM-A前可以先看下 《ARM體系結構與程式設計》,再去看韋老師視訊的話會理解快一點,視訊中講到的難理解的這裡基本都有。

推薦一個 github倉庫,上面放了上百本經典的嵌入式,計算機書籍,可以star一下,下次找書直接在上面搜尋就可以了

github 書籍寶藏倉庫

github訪問不了可以訪問這個:gitee 書籍寶藏倉庫

應用開發

主要學習內容

Linux系統呼叫概念,多程式,多執行緒實現多工開發,多工的同步互斥開發:互斥鎖、訊號量,網路資料通訊過程,TCP/IP協議,Socket程式設計、TCP網路程式設計、UDP網路程式設計,QT程式設計。

學習資源推薦

書籍:《Unix環境高階程式設計》,《Unix網路程式設計》,《Qt Creator快速入門》

視訊:這部分視訊沒看過,可以在嗶哩嗶哩搜尋下,找播放量高的就可以。

驅動開發

主要學習內容

Bootloader的工作流程、UBOOT的編譯、裁剪與移植、Linux核心的編譯、裁剪與移植,根檔案系統的構建、BootLoader、核心和根檔案系統的燒寫。

重點驅動框架如:字元裝置驅動、塊裝置驅動、LCD裝置驅動、觸控式螢幕裝置驅動,匯流排裝置驅動模型,輸入子系統模型等。

學習資源推薦

書籍:《Linux裝置驅動開發詳解》《Linux裝置驅動程式》

視訊:強烈推薦韋東山老師!!

學習建議

對照視訊一點一點學習的過程中,剛開始第一遍看的話會有很多地方不明白,不要緊。如果在查閱了一些資料後還是不明白,可以先往後放放,不用深究。核心的許多東西一旦深究起來,越陷越深。

作為初學者,學習驅動開發主要學習驅動的框架(比如,輸入子系統模型常用的一個函式input_attach_handler()這個函式,剛開始我們只需要知道他是用來匹配dev裝置和驅動軟體就可以,暫時可以不用知道這個函式內部是如何實現的)。有一定基礎之後,可以再去深究其中的某個點,思考他們為什麼這麼寫。

大神:各類複雜驅動

一般自學能到第二個階段就已經相當不錯了。複雜驅動部分一般是在工作中學習的。像Android驅動,音視訊驅動,usb驅動,wifi,藍芽協議,核心開發等都是比較深入一點的東西了,隨便拿出一塊內容,深入鑽研下都可以成為這個領域的專家。

學習資源推薦

書籍:這部分方向很多,我自己對很多方向也不瞭解。分享幾本不錯的核心書籍,《Linux核心設計與實現》《深入理解LINUX核心》《深入Linux核心架構》

視訊:嗶哩嗶哩搜尋【Linux核心精講】

總結

  1. 在學習的過程中,我們應該抓住不變的東西,考慮下這些不變的內容是否對我們以後掌握變化的東西有幫助

  2. 不管是學習任何技術,一定要學到這門技術的邊界。對於嵌入式開發來講,彙編,這就是軟體的邊界

  3. 經常會在往上看到有人討論,嵌入式有35歲危機嗎?不能說沒有,只能說壓力相比於網際網路可能會小點。

  4. 嵌入式相對於網際網路來講,技術的更新迭代沒有那麼快。如果能在嵌入式某個領域深入研究,建立起技術的護城河,或許職業生涯會長一點。

  5. 聰明,好奇,協作,忠誠,隨遇而安。

推薦一個 github倉庫,上面放了上百本經典的嵌入式,計算機書籍,可以star一下,下次找書直接在上面搜尋就可以了

github 書籍寶藏倉庫

github訪問不了可以訪問這個:gitee 書籍寶藏倉庫

練手專案推薦分享GitHub上一些嵌入式相關的高星開源專案

相關文章