嵌入式軟件開(kāi)發(fā)可以買(mǎi)相應(yīng)的開(kāi)發(fā)板,開(kāi)發(fā)板帶的資料越詳細(xì)越好,開(kāi)發(fā)板里驅(qū)動(dòng)已經(jīng)做好,bsp包也有了,自己做的工作只是按照需求做一小部分修改。
干貨滿滿,從學(xué)習(xí)路線+學(xué)習(xí)書(shū)籍+練手項(xiàng)目都總結(jié)好了!
大家好,我是仲一,作為一個(gè)去年拿下oppo,小米等十余家大廠offer的學(xué)長(zhǎng)回答下。最近有公眾號(hào)粉絲經(jīng)常問(wèn)我,如何學(xué)習(xí)嵌入式。粉絲有要求,咱們必需安排上。
不得不說(shuō),上班了是真的忙,每天只能抽下班回 來(lái)的一個(gè)多小時(shí)寫(xiě)文章。這篇8000字的文章足足寫(xiě)了11天,修改了十幾次。終于在十月中旬終于肝完了這篇文章。下面開(kāi)始本文的內(nèi)容,干貨滿滿!
我個(gè)人是從STM32轉(zhuǎn)到驅(qū)動(dòng)開(kāi)發(fā)的,在研二的時(shí)候?qū)W習(xí)了韋東山老師的驅(qū)動(dòng)開(kāi)發(fā)的課程,轉(zhuǎn)到了驅(qū)動(dòng)開(kāi)發(fā)的方向。下面就如何學(xué)習(xí)嵌入式說(shuō)下我個(gè)人的看法。
嵌入式工程師需要掌握的內(nèi)容非常廣泛,主要包括嵌入式軟件、嵌入式硬件、以及相關(guān)行業(yè)、產(chǎn)品的專(zhuān)業(yè)知識(shí)。作為嵌入式初學(xué)者,我們不可能,也沒(méi)有那么多精力把所有的知識(shí)到搞的很精通,我們要學(xué)會(huì)抓住重點(diǎn),學(xué)會(huì)取舍,達(dá)到一通百通,事半功倍的學(xué)習(xí)效果。 首先嵌入式技術(shù)主要分為嵌入式軟件和嵌入式硬件兩大方向。
嵌入式硬件工程師主要工作職責(zé)是為產(chǎn)品設(shè)計(jì)硬件電路原理圖,設(shè)計(jì)硬件PCB板,選擇合適的元器件,焊接調(diào)試硬件電路板,保證硬件電路板的可靠性、穩(wěn)定性和抗干擾能力。
因?yàn)楝F(xiàn)在集成電路發(fā)展迅速,大部分集成電路廠商都會(huì)提供參考電路,所以硬件電路原理圖的設(shè)計(jì)相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,硬件工程師工作的含金量主要體現(xiàn)在產(chǎn)品的可靠性和穩(wěn)定性設(shè)計(jì)、以及電磁兼容設(shè)計(jì),這才是硬件設(shè)計(jì)工程師的含金量所在。
要成為一個(gè)資深的嵌入式工程師相當(dāng)難,一方面要有非常扎實(shí)的理論知識(shí),同時(shí)也要有相當(dāng)?shù)哪欠N大型的、高頻CPU、多層PCB板的設(shè)計(jì)經(jīng)驗(yàn)。
嵌入式硬件工程師要學(xué)的課程主要有模擬電路設(shè)計(jì)、數(shù)字電路設(shè)計(jì)、電磁波理論等。熟悉常用的放大電路、濾波電路、電源電路設(shè)計(jì)和分析。
嵌入式軟件工程師的職責(zé)主要是根據(jù)產(chǎn)品的功能需求設(shè)計(jì)好軟件,讓硬件工作起來(lái)。
嵌入式電子產(chǎn)品硬件部分,大部分都是相同的,核心的都是由CPU、RAM和FLASH 幾大部分組成,而軟件就千差萬(wàn)別了。產(chǎn)品的具體功能都是由軟件來(lái)實(shí)現(xiàn)的,一般來(lái)講一個(gè)產(chǎn)品的實(shí)現(xiàn),軟件設(shè)計(jì)的工作量是硬件設(shè)計(jì)的4 ~ 5倍。
所以一般情況下,一個(gè)公司的軟件工程師數(shù)量是硬件硬件工程師的4~5倍,嵌入式軟件工程師需求比硬件工程師大很多,同時(shí)跟硬件工程師相比,嵌入式軟件工程師學(xué)起來(lái)相對(duì)容易些,所以這里我重點(diǎn)和大家談一下嵌入式軟件工程的學(xué)習(xí)路線。
C語(yǔ)言是嵌入式的重中之重,Linux操作系統(tǒng)就是用C實(shí)現(xiàn)的,包括安卓系統(tǒng)的底層也是C語(yǔ)言實(shí)現(xiàn)的,基礎(chǔ)不牢,地動(dòng)山搖,一定要打好基礎(chǔ)。
C語(yǔ)言學(xué)習(xí)過(guò)程中重點(diǎn)要放在指針,結(jié)構(gòu)體,文件的處理,數(shù)組等。在學(xué)習(xí)過(guò)程中,一定要多寫(xiě)代碼,代碼光看是看不會(huì)的。
遇到錯(cuò)誤不要怕麻煩,善于使用搜索工具,百度,google,stack overflow。要知道,你遇到的問(wèn)題別人肯定也會(huì)遇到過(guò),一般在網(wǎng)上一搜就會(huì)有答案。
最后,要多調(diào)試程序,熟悉調(diào)試的過(guò)程。程序三分寫(xiě),七分調(diào),沒(méi)有誰(shuí)的程序是可以一遍寫(xiě)對(duì)的。而且,多調(diào)試程序也可以讓我們理解程序具體是如何執(zhí)行的。
嵌入式肯定要和硬件打交道的。如果做嵌入式的應(yīng)用層的話,可能和硬件接觸的少一點(diǎn)。但是很多企業(yè)在面試的時(shí)候,也會(huì)問(wèn)一些基本的硬件知識(shí)。
比如,我同學(xué)在面試聯(lián)發(fā)科的C++工程師的時(shí)候,就問(wèn)到了他很多關(guān)于硬件的知識(shí)(中斷是什么,輪詢(xún)是什么,二者有什么區(qū)別,一個(gè)基本嵌入式系統(tǒng)有什么構(gòu)成等),所以說(shuō)硬件知識(shí)知道越多越好,就算做應(yīng)用層,一些最基本的也要知道。
如果是打算做嵌入式底層的話,對(duì)于硬件知識(shí)的掌握要求就比較高了。比如,LCD是如何顯示的,IIC協(xié)議/SPI協(xié)議是什么,如何收發(fā)數(shù)據(jù),不同設(shè)備對(duì)于IIC的速度有什么要求,IIC協(xié)議上拉電阻一般是多少等等。只有明白了硬件原理,在看芯片手冊(cè)的時(shí)候才能明白如何去配置各個(gè)寄存器。
此外,常用的設(shè)備儀器的使用能掌握就更好了,和硬件工程師扯皮的時(shí)候會(huì)用到。比如,萬(wàn)用表,示波器,邏輯分析儀等。不會(huì)也沒(méi)關(guān)系,這部分不是必須的。
這部分是程序員的必修課。在各大廠的秋招春招中,筆試面試都是必考的。常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)如鏈表,二叉樹(shù),堆,隊(duì)列,常見(jiàn)排序算法及其改進(jìn)(快排,歸并,冒泡,插入)等都是要掌握的。如果是為了找工作,這部分內(nèi)容有很多是要能達(dá)到手寫(xiě)的目的。(相關(guān)內(nèi)容見(jiàn)我整理的嵌入式軟件工程師筆試面試指南 )
雖然嵌入式對(duì)于數(shù)據(jù)結(jié)構(gòu)與算法的要求不像傳統(tǒng)互聯(lián)網(wǎng)那么高,而且,這些數(shù)據(jù)結(jié)構(gòu)在以后的工作中不一定可以用到,但是一些基本的我們還是要知道的。
像Linux內(nèi)核中就用到了很多的鏈表,二叉樹(shù)等。掌握這部分內(nèi)容對(duì)于我們以后跳槽,深入研究操作系統(tǒng)都有很大的幫助。
這部分直接決定了我們以后是否能走的更遠(yuǎn),像操作系統(tǒng)的基本概念,計(jì)算機(jī)組成原理的內(nèi)容都是需要我們?nèi)チ私獾摹1热缱孕i,信號(hào)量,阻塞與非阻塞等。
學(xué)習(xí)任何技術(shù)一定要學(xué)到這門(mén)技術(shù)的邊界,對(duì)于嵌入式來(lái)講,它的邊界就是匯編。匯編語(yǔ)言不要求會(huì)寫(xiě),但是一定要能看懂(其實(shí)就是Arm指令集)。在很多情況下,看反匯編文件對(duì)于bug的調(diào)試會(huì)更方便。
主要學(xué)習(xí)內(nèi)容
中斷、定時(shí)器、串口、NAND FLASH、網(wǎng)絡(luò)控制器、LCD屏、觸摸屏等的工作原理。
學(xué)習(xí)資源推薦
視頻:野火,正點(diǎn)原子
書(shū)籍:野火,正點(diǎn)原子
學(xué)習(xí)建議
如果你以后的方向是驅(qū)動(dòng)開(kāi)發(fā),這部分學(xué)習(xí)的話重點(diǎn)放在硬件知識(shí)的理解。買(mǎi)個(gè)開(kāi)發(fā)板,學(xué)習(xí)下他們的例程是如何寫(xiě)的,常用嵌入式外圍設(shè)備的硬件工作原理,以及如何使用C語(yǔ)言來(lái)編程、控制這些硬件。把基本的外設(shè)都學(xué)習(xí)一遍,不求都會(huì)寫(xiě),但是硬件原理一定要搞清楚。
這部分主要分為兩個(gè)方向:Linux應(yīng)用開(kāi)發(fā),Linux驅(qū)動(dòng)開(kāi)發(fā)。下面我會(huì)對(duì)這兩個(gè)方向分別進(jìn)行說(shuō)明。
有了之前的單片機(jī)基礎(chǔ),上手Linux開(kāi)發(fā)就會(huì)快一點(diǎn)??梢再I(mǎi)個(gè)ARM-A內(nèi)核的開(kāi)發(fā)板,ARM-A和stm32很多地方都是相通的,理解起來(lái)不難,二者最大的差別在于開(kāi)發(fā)環(huán)境,很多新手入門(mén)Linux開(kāi)發(fā)在搭建環(huán)境時(shí)就被勸退了。學(xué)習(xí)ARM-A前可以先看下 《ARM體系結(jié)構(gòu)與編程》,再去看韋老師視頻的話會(huì)理解快一點(diǎn),視頻中講到的難理解的這里基本都有。
推薦一個(gè) github倉(cāng)庫(kù),上面放了上百本經(jīng)典的嵌入式,計(jì)算機(jī)書(shū)籍,可以star一下,下次找書(shū)直接在上面搜索就可以了: github 書(shū)籍寶藏倉(cāng)庫(kù) github訪問(wèn)不了可以訪問(wèn)這個(gè):gitee 書(shū)籍寶藏倉(cāng)庫(kù)
主要學(xué)習(xí)內(nèi)容
Linux系統(tǒng)調(diào)用概念,多進(jìn)程,多線程實(shí)現(xiàn)多任務(wù)開(kāi)發(fā),多任務(wù)的同步互斥開(kāi)發(fā):互斥鎖、信號(hào)量,網(wǎng)絡(luò)數(shù)據(jù)通信過(guò)程,TCP/IP協(xié)議,Socket編程、TCP網(wǎng)絡(luò)編程、UDP網(wǎng)絡(luò)編程,QT編程。
學(xué)習(xí)資源推薦
書(shū)籍:《Unix環(huán)境高級(jí)編程》,《Unix網(wǎng)絡(luò)編程》,《Qt Creator快速入門(mén)》
視頻:這部分視頻沒(méi)看過(guò),可以在嗶哩嗶哩搜索下,找播放量高的就可以。
主要學(xué)習(xí)內(nèi)容
Bootloader的工作流程、UBOOT的編譯、裁剪與移植、Linux內(nèi)核的編譯、裁剪與移植,根文件系統(tǒng)的構(gòu)建、BootLoader、內(nèi)核和根文件系統(tǒng)的燒寫(xiě)。
重點(diǎn)驅(qū)動(dòng)框架如:字符設(shè)備驅(qū)動(dòng)、塊設(shè)備驅(qū)動(dòng)、LCD設(shè)備驅(qū)動(dòng)、觸摸屏設(shè)備驅(qū)動(dòng),總線設(shè)備驅(qū)動(dòng)模型,輸入子系統(tǒng)模型等。
學(xué)習(xí)資源推薦
書(shū)籍:《Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》《Linux設(shè)備驅(qū)動(dòng)程序》
視頻:強(qiáng)烈推薦韋東山老師?。?/p>
學(xué)習(xí)建議
對(duì)照視頻一點(diǎn)一點(diǎn)學(xué)習(xí)的過(guò)程中,剛開(kāi)始第一遍看的話會(huì)有很多地方不明白,不要緊。如果在查閱了一些資料后還是不明白,可以先往后放放,不用深究。內(nèi)核的許多東西一旦深究起來(lái),越陷越深。
作為初學(xué)者,學(xué)習(xí)驅(qū)動(dòng)開(kāi)發(fā)主要學(xué)習(xí)驅(qū)動(dòng)的框架(比如,輸入子系統(tǒng)模型常用的一個(gè)函數(shù)input_attach_handler()這個(gè)函數(shù),剛開(kāi)始我們只需要知道他是用來(lái)匹配dev設(shè)備和驅(qū)動(dòng)軟件就可以,暫時(shí)可以不用知道這個(gè)函數(shù)內(nèi)部是如何實(shí)現(xiàn)的)。有一定基礎(chǔ)之后,可以再去深究其中的某個(gè)點(diǎn),思考他們?yōu)槭裁催@么寫(xiě)。
一般自學(xué)能到第二個(gè)階段就已經(jīng)相當(dāng)不錯(cuò)了。復(fù)雜驅(qū)動(dòng)部分一般是在工作中學(xué)習(xí)的。像Android驅(qū)動(dòng),音視頻驅(qū)動(dòng),usb驅(qū)動(dòng),wifi,藍(lán)牙協(xié)議,內(nèi)核開(kāi)發(fā)等都是比較深入一點(diǎn)的東西了,隨便拿出一塊內(nèi)容,深入鉆研下都可以成為這個(gè)領(lǐng)域的專(zhuān)家。
學(xué)習(xí)資源推薦
書(shū)籍:這部分方向很多,我自己對(duì)很多方向也不了解。分享幾本不錯(cuò)的內(nèi)核書(shū)籍,《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》《深入理解LINUX內(nèi)核》《深入Linux內(nèi)核架構(gòu)》
視頻:?jiǎn)袅▎袅ㄋ阉鳌綥inux內(nèi)核精講】
推薦一個(gè) github倉(cāng)庫(kù),上面放了上百本經(jīng)典的嵌入式,計(jì)算機(jī)書(shū)籍,可以star一下,下次找書(shū)直接在上面搜索就可以了: github 書(shū)籍寶藏倉(cāng)庫(kù) github訪問(wèn)不了可以訪問(wèn)這個(gè):gitee 書(shū)籍寶藏倉(cāng)庫(kù)
練手項(xiàng)目推薦這篇文章:
分享GitHub上一些嵌入式相關(guān)的高星開(kāi)源項(xiàng)目筆試面試推薦我寫(xiě)的免費(fèi)知乎專(zhuān)欄:
嵌入式軟件工程師筆試面試指南碼字不易,如果覺(jué)得本篇文章對(duì)你有幫助,可以點(diǎn)個(gè)免費(fèi)的贊支持作者 @仲一
隨著信息時(shí)代的深入發(fā)展,嵌入式應(yīng)用只會(huì)越來(lái)越廣,從日常生活到工業(yè)控制,可以說(shuō)無(wú)處不在??梢哉f(shuō)一睜眼就能看見(jiàn)嵌入式應(yīng)用,墻上的電子鐘,空調(diào),甚至LED燈,廚房里就更不用說(shuō)了,像微波爐,熱水器等。其它的再如地上跑的汽車(chē)火車(chē)電動(dòng)車(chē),天上飛的飛機(jī),哪個(gè)都離開(kāi)開(kāi)嵌入式應(yīng)用。這一切都表明嵌入式已經(jīng)深入到人們的日常生活。
因此,學(xué)嵌入式的前景是非常光明的,可以各在所有的工業(yè)門(mén)類(lèi)里都可以找到嵌入式崗位,這是一頂非?;A(chǔ)性的工作。但是同時(shí)也可以是非常前沿的工作,像華為的5G,也屬于嵌入式系統(tǒng),還有CPU等,哪個(gè)都離不開(kāi)嵌入式軟件開(kāi)發(fā)。
得看你是想從事學(xué)術(shù)還是技術(shù)了,其實(shí)都需要有扎實(shí)的技術(shù)功底,考研之后學(xué)歷高一點(diǎn),可以從事嵌入式開(kāi)發(fā)學(xué)術(shù)研究了,比如出書(shū)、鉆研行業(yè)發(fā)展等。平臺(tái)高一點(diǎn)自然發(fā)展前景就廣闊一點(diǎn)了。
說(shuō)說(shuō)我用過(guò)的吧。
51和STM32之類(lèi)的單片機(jī)一直用的KEIL。飛思卡爾的用的是codewarrior,現(xiàn)在被恩智浦收購(gòu)了,恩智浦又出了S32。編譯代碼的我一般接觸的就是這些比較多。還有就是ARM軟件eclipse , GDB Server , Jlink軟件。編寫(xiě)代碼我喜歡用VIM,看代碼之類(lèi)的有souceinsight等等。具體薪資還是得看個(gè)人修為,有的達(dá)不到該薪資水平,有的早已超過(guò)該薪資水平):
非211、985院校應(yīng)屆畢業(yè)生平均月薪:8K;
是211、985院校應(yīng)屆畢業(yè)生平均月薪:12K;
一年工作經(jīng)驗(yàn)者月薪:10K-15K;
二年工作經(jīng)驗(yàn)者月薪:12K-18K;
三至五年工作經(jīng)驗(yàn)者月薪:20K-30K;
什么證書(shū)都不需要,現(xiàn)在看重的是你的學(xué)歷和工作經(jīng)驗(yàn),做過(guò)什么項(xiàng)目,沒(méi)有那么多的要求,只要你有能力就行,就是要?jiǎng)邮帜芰?qiáng),能做出產(chǎn)品
說(shuō)說(shuō)我用過(guò)的吧。
51和STM32之類(lèi)的單片機(jī)一直用的KEIL。
飛思卡爾的用的是codewarrior,現(xiàn)在被恩智浦收購(gòu)了,恩智浦又出了S32。編譯代碼的我一般接觸的就是這些比較多。還有就是ARM軟件eclipse , GDB Server , Jlink軟件。
編寫(xiě)代碼我喜歡用VIM,看代碼之類(lèi)的有souceinsight等等。
1、嵌入式軟件開(kāi)發(fā)指的是針對(duì)單片機(jī)、ARM、FPGA的編程,沒(méi)有window或linux操作系統(tǒng),即使有,也是功能較為簡(jiǎn)單的操作系統(tǒng),比如ucos??傊度胧杰浖_(kāi)發(fā)和硬件關(guān)系比較緊密,一般需要編寫(xiě)硬件驅(qū)動(dòng)。
2、軟件開(kāi)發(fā)一般指在已經(jīng)安裝了像window或linux的電路板上編寫(xiě)應(yīng)用,軟件開(kāi)發(fā)不直接編寫(xiě)硬件驅(qū)動(dòng),因?yàn)轵?qū)動(dòng)已經(jīng)被操作系統(tǒng)實(shí)現(xiàn)了,軟件開(kāi)發(fā)注重邏輯功能的實(shí)現(xiàn),比如要實(shí)現(xiàn)拍照,只需調(diào)用攝像頭驅(qū)動(dòng)即可。
c#和JAVA方向B/S系統(tǒng)開(kāi)發(fā),這個(gè)是發(fā)展趨勢(shì),就是web應(yīng)用系統(tǒng)開(kāi)發(fā),SAP國(guó)際erp巨頭,他們的項(xiàng)目是C/S的系統(tǒng),最近和他們公司在競(jìng)爭(zhēng)招標(biāo)。以上的都是應(yīng)用軟件開(kāi)發(fā)方向的而嵌入式的開(kāi)發(fā)一般和工控設(shè)備打交道比較多,需求沒(méi)有應(yīng)用軟件開(kāi)發(fā)的人多