1. 程式人生 > >關於嵌入式如何學習(看了不後悔,給學技術的同行一條光明的路)

關於嵌入式如何學習(看了不後悔,給學技術的同行一條光明的路)

關於嵌入式如何學習,我相信有很多大牛回答得很專業,最近在知乎上看到一網名為----,~的網友對此進行了總結,我個人覺得非常好,還有其他兩位網友,畢竟我工作以來也還有好多東西沒有接觸,就有他說的那些中的部分內容,我們來看看他們說了什麼內容:

有一位大學生四年級的網友提出這樣的問題:

本人大四學生,專業為電氣類的,有C語言,微控制器,模電,數電的基礎,一直想從事嵌入式方面的工作(感興趣),但是以目前的水平,暫時還不能找到這方面的工作,所以一直在糾結是先找份本專業的工作做著,又或者是到培訓機構培訓,然後找份嵌入式方面的工作,希望大家能指點一二。另:嵌入式學習需要哪方面的基礎知識,培訓四個月的時間努力學習大概能達到什麼樣的水平。


以下為解答:

第一位:李brooks

著作權歸作者所有。 商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
作者:李brooks
連結:https://www.zhihu.com/question/22252234/answer/75026117
來源:知乎
不請自來。做電賽出身的程式猿一名,目前從事嵌入式Linux驅動開發。還有微控制器從51到意法Ti都做過,DSP只用過TI的,主要是在開關電源控制方面的應用。建議學習路線:
1 學習51微控制器,這個階段你只需要跟著郭天翔的視訊去學,只要求實現功能,不求甚解。但建議能夠提出問題,比如“為什麼往IO控制暫存器寫入特定值能點亮LED燈?”“IO口的電路結構是什麼樣子的?”“什麼是上拉下啦,灌電流拉電流?”,這一階段主要是熟悉微控制器的使用,並且在使用中思考發現問題,還能熟悉一些基本概念。
2 開始查資料看書,看類比電路數位電路等等,開始去弄明白1中所提出的問題。這時候問題主要集中在電路方面。
3 開始學習STM32,隨便買個板子,看原子的書跟著一步步去做。這時候你會遇到很多計算機方面的問題,這時候一邊學習教程,一邊學習:微機原理,編譯原理,作業系統。你要弄清楚ARM架構,弄明白CPU如何取指,譯碼,執行,知道地址匯流排,控制匯流排,資料匯流排如何工作。要弄明白你編譯各個階段產生的各個檔案是什麼,什麼是分散載入,什麼是重定位,什麼是程式碼段,什麼是資料段,等等。還要能弄明白CPU如何啟動,程式映象在記憶體中如何佈局。要知道中斷的原理,以及現場保護等等。最後你瞭解了各個知識點之後,轉向GCC開發STM32,這時候你如果知識掌握得不錯,你應該可以很快地學會編寫連結器指令碼並且明白每一條語句所代表的含義。
4 開始增強C語言,深入挖掘C語言的各個死角。最好可以做到當你寫下一條語句的時候知道編譯器會如何處理。還需要資料結構和軟體工程,建議最好還要學習一下設計模式。開始學習養成良好的程式碼風格,開始思考程式碼的結構。可以說設計模式如果能學好,在往後學習LINUX核心時大有裨益。你會發現LINUX的輸入子系統有點像職責鏈模式,會發現ASOC音訊系統有點像模板方法模式。私以為,如果能在兩個以上不同方面考察同一種程式設計思想,你會得到更加深刻的理解,更能領會其精華。
5 認真研讀OS方面的書,各個知識點都要弄明白,程序是什麼程式是什麼執行緒是什麼,競爭死鎖優先順序反轉,虛擬地址空間實體地址空間,使用者空間核心空間等等。開始學習ucos,這個沒什麼可說的,如果在2中能熟練掌握各種知識點,知道CPU如何中斷如何保護恢復現場,那麼讀ucos的原始碼時候,在原理上就不會有什麼疑惑。如果能在4中養成把握程式碼整體結構的能力並且學習好資料結構和基本的演算法,讀原始碼就沒有什麼障礙。一旦原理弄通了,原始碼也能讀懂,那麼吃透ucos就是順理成章的事情。
6 自己仿照ucos寫一個stm32上的實時os出來。
7 進軍LINUX。學習LINUX的基本使用,看趙炯那本核心剖析,啃LINUX核心設計與實現,把握總體的核心架構。之後可以學習驅動,看建議陳學鬆老師的書,弄明白基本的驅動架構和如何編寫簡單的驅動,認真對待,這裡強調一下裝置驅動模型。最後啃LINUX核心原始碼情景分析,上下兩冊用心讀,這裡著重強調一下核心中的VFS部分。之後就是看宋寶華老師的書,進一步學習驅動開發。最後。。。。。。。看核心原始碼看核心原始碼看核心原始碼。
8 其它的什麼SPI,IIC,什麼DMA,都只是技能問題,只要知識學的好,技能想咋點就咋點。
9 暫時沒想到其它的了。想到再說
著作權歸作者所有。
商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
作者:li crifan
連結:https://www.zhihu.com/question/22252234/answer/20769642
來源:知乎

現已整理出教程,詳見:
1.先看:

搞懂嵌入式軟體方面的知識。
2.如果打算做驅動方面的開發,那麼再去看:

3.如果是和Linux有關的嵌入式,則再去看:

4.如果和Linux驅動有關,再去看:


========================================
目前對於嵌入式培訓的質量,不是很清楚。但是根據個人的瞭解,貌似質量高的不多。
所以,鑑於你的基礎,推薦你:
先找自己專業的工作,有了相對穩定的生存的基礎了。然後再抽時間,自己學習嵌入式。

關於自學嵌入式的話,需要具備哪些基礎,如何循序漸進的學習嵌入式等方面的問題,說實話,很難幾句說清楚。但是,我會盡量說的讓你能看懂:

【如何學習嵌入式】
基於此,我也是正在,一點點的完善我要寫的,關於如何學習嵌入式的教程。
主體思路,和目前已經寫了的部分的內容,如下:

1.說清楚整體嵌入式行業的概況,應用領域,舉例說明。
2.然後通過一些典型的你所能接觸到的產品,去說明嵌入式行業領域的產業鏈。
3.然後你才能搞清楚,你作為嵌入式軟體開發者,所處的位置。
4.然後你才知道,你需要做大概哪些方面的軟體工作,以及和其他產業鏈和合作人員的關係。
5.搞清楚所處大環境的位置,才是去如何搞嵌入式軟體開發。
相關內容:
嵌入式開發之嵌入式背景知識

【整理】嵌入式軟體知識體系概述

6.才是介紹需要大概哪方面的基礎知識
相關內容:
【整理】類比解釋:嵌入式開發需要掌握哪些知識

7.然後才是,對於典型的一些嵌入式軟體開發,是如何搭建開發環境,如何一點點開發。
相關參考:
(1)之前遇到的一本,解釋的大而全的,嵌入式開發方面的書籍:
Embedded.Systems.Architecture_免費高速下載
此書算是說的不錯了,不過是英文的。如果英文還行,建議多看看,即使看不全懂,也可以看看其大概框架,以便對於嵌入式開發有個概念。
(2)
嵌入式開發之基本概念和開發邏輯
(3)
【問題解答】用一個嵌入式開發板去實現資料採集的基本思路和邏輯

8.然後才是解釋具體的某個領域開發的真正的邏輯和流程,比如嵌入式linux驅動如何寫,等等。
相關參考:
(1)
嵌入式開發系列教程
(2)之前給別人推薦的這本書:
Linux裝置驅動開發詳解

總之:
目前:上述的部分的帖子,部分的推薦書籍,你湊合先看吧。
以後:關於嵌入式開發方面的,從邏輯概念到實際動手操作,以後我會抽空去完善出全套的教程的,去詳細解釋的方方面面的事情的。到時候,再看我的教程,就會很清楚了。

【其他一些嵌入式相關的內容】
1.解釋了一些嵌入式領域內常會遇到的基本概念:
【整理】嵌入式領域的名詞概念解釋
2.總結了些經驗:
【整理】嵌入式開發經驗和心得總結
3.上次給另外一個人回答了類似的問題,你也可以參考參考:
關於嵌入式驅動的學習?

【最後】
我一直正在陸陸續續的寫嵌入式方面的內容,如果寫好了,都會發布到我自己的個人網站上面對應的嵌入式分類中的:
Embedded | 在路上
換句話說,如果感興趣,可以時不時的去看看,可能就會看到我更新的一些,關於嵌入式方面的帖子。
其中,可能有些是嵌入式領域教程方面的介紹的內容,有些可能是具體某個嵌入式知識點方面的內容。你撿你感興趣的看,即可。
花了一張圖,厚著臉皮貼一把,以後我會將各個技能樹的學習順序與參考學習資料整理一下:

關於博主本人建議:

本人也是出自於嵌入式培訓而才順利找到工作的,但是在沒培訓之前還沒知道過這麼多,因為大學知識畢竟有限,而且我本人還是普通大專學生,讀的是電子資訊工程,見識短淺,當時只是知道幾種微控制器和ARM,沒有紮實的專業知識,但是就是藉著培訓這個平臺長了見識才能順利走上嵌入式開發這條路,後來自己工作後不斷的補充新知識,還是有所長進。培訓有利有弊,當然,你有能力你可以自學成才,別浪費大學幾年的時間,做嵌入式的,英語必須是要好的,C語言,資料結構,作業系統等理論知識都要具備。自制力差的,選擇培訓也不錯,但是要能堅持,畢竟4個月的學習等於你需要掌握大學將近好幾年的東西,不易啊,而且學費也不便宜,一般都要15000以上,因為這四個月是純粹的學習技術核心知識,而不是跟大學一樣有許多空閒時間和其它非技術相關的知識的學習。所以,且學且珍惜,如果本文能為各位初學者帶來幫助,請感謝知乎三位大牛。大笑