給嵌入式工程師的一封信,不怕你不會(huì )就怕你不學(xué)! 最近經(jīng)常有用人單位打來(lái)電話(huà),問(wèn)我這有沒(méi)有嵌入式Linux方面的開(kāi)發(fā)人員,他們說(shuō)他們單位急需要懂得在嵌入式Linux環(huán)境下的軟件開(kāi)發(fā)人員,我回答說(shuō),現在每年畢業(yè)的大學(xué)生那么多,還招不到合適的軟件開(kāi)發(fā)人員嗎?他跟我說(shuō),畢業(yè)大學(xué)生雖然多,但大部分都能力不夠,不能達到他們的工作的要求。 該公司HR的一句話(huà)說(shuō)出來(lái)我們現在的大學(xué)教學(xué)和大學(xué)生就業(yè)的現狀:一方面每年那么多大學(xué)生畢業(yè)找不到合適的工作,另一方面很多用人單位和企業(yè)又找不到合適的人才。造成這種現象最基本的原因是學(xué)校教育和社會(huì )需求的嚴重脫節。 造成很多嵌入式專(zhuān)業(yè)的學(xué)生在畢業(yè)后,還是很難達到用人單位的要求最主要的原因在于高校在嵌入式教學(xué)方面重理論和輕實(shí)踐,很多嵌入式專(zhuān)業(yè)的老師也沒(méi)有實(shí)際的工作經(jīng)驗,這樣培養出的學(xué)生可能讓他講起來(lái)頭頭是道,但是讓他去真正編寫(xiě),調試一個(gè)應用程序就傻眼了,不知道從何下手,因為他們在學(xué)校的學(xué)習可能從來(lái)就沒(méi)有老師帶著(zhù)他們實(shí)際調試過(guò)嵌入式程序,也沒(méi)有機會(huì )讓你去調試嵌入式應用程序,那些看起來(lái)非常不錯的嵌入式實(shí)驗箱大部分時(shí)間都躺在實(shí)驗室睡大覺(jué),只有在上實(shí)驗課的時(shí)候搬出來(lái)讓大家看兩眼,摸兩下,還沒(méi)有弄明白怎么回事,又要收到實(shí)驗室睡大覺(jué)去了。這樣的教學(xué)模式,如何能培養出一名合格的嵌入式工程師呢?出現企業(yè)找不到合適的人,大學(xué)畢業(yè)生找不到合適的工作也就不奇怪了。 嵌入式專(zhuān)業(yè)是一門(mén)實(shí)踐性非常強的學(xué)科,只有多動(dòng)手,多實(shí)踐,多編程,多調試,多看書(shū),多思考才能真正掌握好嵌入式開(kāi)發(fā)技術(shù)。 現在很多同學(xué)也意識到了學(xué)校培養模式和社會(huì )需求脫節問(wèn)題,有一部分同學(xué)也先行行動(dòng)起來(lái),開(kāi)始注重培養自己的實(shí)際動(dòng)手能力,培養自己實(shí)際分析問(wèn)題,解決問(wèn)題的問(wèn)題,培養自己在嵌入式專(zhuān)業(yè)實(shí)際編程和調試程序的能力。但是嵌入式專(zhuān)業(yè)不同于其他學(xué)科,嵌入式專(zhuān)業(yè)是一門(mén)綜合性非常強,涉及知識面非常廣的學(xué)科,對于初學(xué)者來(lái)說(shuō),面對那么多教程、課本,那么多知識點(diǎn),往往不知道從何處下手,不知道哪些是重點(diǎn),哪些不是重點(diǎn),這些知識點(diǎn)之間有什么關(guān)聯(lián),一臉的茫然,然后東一榔頭,西一棒子,折騰了幾個(gè)月甚至大半年后,還是找不著(zhù)學(xué)習嵌入式的方向,還徘徊在嵌入式開(kāi)發(fā)的大門(mén)之外。 那么,如何從零開(kāi)始學(xué)習嵌入式開(kāi)發(fā)技術(shù), 進(jìn)入嵌入式開(kāi)發(fā)大門(mén)呢,筆者根據自己的嵌入式學(xué)習經(jīng)歷和多年的嵌入式Linux教學(xué)經(jīng)驗,談?wù)勛约簩η度胧綄W(xué)習的一些想法和意見(jiàn),希望對大家有所幫助。 一、練好基本功 嵌入式系統專(zhuān)業(yè)是綜合了計算機硬件技術(shù),計算機軟件技術(shù)以及電子電路技術(shù)的一門(mén)綜合學(xué)科,所涉及的內涵和知識非常廣泛,包括:數字電路,模擬電路,計算機組成原理,單片機基礎,C語(yǔ)言基礎,操作系統,數據結構,編譯原理,計算機控制,計算機網(wǎng)絡(luò )等知識。 在真正學(xué)習嵌入式開(kāi)發(fā)之前,首先要打好基礎。其中最重要的是C語(yǔ)言基礎、數字電路、計算機組成原理三門(mén)課程。對于C語(yǔ)言,至少能單獨編寫(xiě)調試一個(gè)3 ~ 500行的程序,能夠了解C語(yǔ)言的基本語(yǔ)法規則,基本語(yǔ)句的使用,理解指針概念并能靈活使用各種指針。 計算機組成原理要能理解組成一個(gè)計算機系統的幾大部件,計算機系統的結構,理解系統總線(xiàn),理解處理器和計算機外部設備的關(guān)系,處理器和計算機外設是如何協(xié)調工作完成某一項功能的,計算機軟件和硬件是如何分工協(xié)作完成某一項任務(wù)的,理解軟件是通過(guò)寄存器來(lái)控制硬件的。 數字電路,模擬電路要了解其基本原理個(gè)概念,能看懂簡(jiǎn)單模擬、數字電路原理圖。理解數字電路中的寄存器,時(shí)序的概念,能看懂芯片手冊和時(shí)序圖。對于其他基礎課程,重點(diǎn)要理解其中的一些基本概念,如何使用等等。 對于電子,自動(dòng)化,通信,計算機類(lèi)專(zhuān)業(yè)的學(xué)生,在大二、大三開(kāi)設的專(zhuān)業(yè)基礎或專(zhuān)業(yè)課程中基本包含了以上的大部分課程。因為缺乏實(shí)踐,可能學(xué)得不是很深入,但是一些基本的概念和基本知識應該還是有所了解,針對一些薄弱環(huán)節,自己稍微加強學(xué)習一下,基本上已經(jīng)具備了學(xué)習嵌入式開(kāi)發(fā)的基礎。在嵌入式基本功學(xué)習階段,最重要的是C語(yǔ)言和單片機基礎,最好是能用C語(yǔ)言開(kāi)發(fā)一個(gè)小的單片機程序,例如用C語(yǔ)言實(shí)現單片機和PC的串口通信,用C語(yǔ)言控制LED等顯示,用C語(yǔ)言控制數碼管顯示等小程序。在這個(gè)期間需要的學(xué)習工具就是單片機51學(xué)習開(kāi)發(fā)板。 二、嵌入式Linux應用開(kāi)發(fā) 嵌入式開(kāi)發(fā)基礎知識學(xué)習完后,這時(shí)候你已經(jīng)有了一定的嵌入式開(kāi)發(fā)基礎了,可以進(jìn)行基于單片機的嵌入式系統設計了。單片機編程本身也是屬于嵌入式編程,但是在這里我們只是把單片機開(kāi)發(fā)當作嵌入式系統開(kāi)發(fā)的基礎,不把單片機開(kāi)發(fā)作為真正的嵌入式系統開(kāi)發(fā),在這里我們的嵌入式系統開(kāi)發(fā)是指在帶有操作系統的嵌入式平臺上的應用和驅動(dòng)開(kāi)發(fā),特別指在嵌入式Linux平臺上的開(kāi)發(fā)。 單片機開(kāi)發(fā)在很早以前是非常熱門(mén)的,現在在一些比較簡(jiǎn)單的系統上單片機也用的非常廣泛,隨著(zhù)硬件的成本不斷降低,在一些比較復雜的嵌入式設備一般都采用嵌入式Linux操作系統,在嵌入式Linux平臺上進(jìn)行開(kāi)發(fā),這樣可以極大的提高嵌入式開(kāi)發(fā)效率,提高系統的穩定性和可靠性,降低開(kāi)發(fā)成本。由于Linux是一個(gè)開(kāi)源的操作系統,你可以通過(guò)閱讀Linux內核來(lái)理解內核的實(shí)現機制,如果有需要,你甚至可以通過(guò)修改內核源碼來(lái)提高系統的性能;同時(shí),全球參與Linux開(kāi)發(fā)的隊伍非常龐大,網(wǎng)上有大量的嵌入式Linux開(kāi)發(fā)資料和源代碼,很多你需要實(shí)現的功能在網(wǎng)上基本都能找到相關(guān)源碼,參考一下別人寫(xiě)的源碼,這樣可以極大的提高自己的工作效率和技術(shù)能力,近幾年,隨著(zhù)參與Linux開(kāi)發(fā)的人越來(lái)越多,Linux系統的穩定性、實(shí)時(shí)性有了很大的提高,Linux系統無(wú)論在服務(wù)器上還是嵌入式設備平臺上都應用越來(lái)越廣泛,現在包括華為、中興、朗訊的各大通信巨頭都開(kāi)始把自己設備的底層平臺從vxworks操作系統遷移到Linux系統,可以說(shuō)嵌入式Linux是嵌入式技術(shù)發(fā)展一個(gè)方向,是嵌入式技術(shù)的一面旗幟;谝陨显,我的建議是學(xué)嵌入式開(kāi)發(fā),就學(xué)嵌入式Linux開(kāi)發(fā),相對于wince等其他的嵌入式平臺,你可以真正學(xué)到更多的東西,學(xué)到嵌入式技術(shù)的精髓,同時(shí)他又符合嵌入式產(chǎn)業(yè)發(fā)展的方向,不容易被日新月異的技術(shù)發(fā)展所淘汰。 有了嵌入式開(kāi)發(fā)的基礎,又知道了我們?yōu)槭裁匆獙W(xué)習嵌入式Linux開(kāi)發(fā),那我們就要開(kāi)始動(dòng)手開(kāi)始學(xué)習了,那如何開(kāi)始學(xué)習嵌入式Linux開(kāi)發(fā),從哪里開(kāi)始著(zhù)手呢? 很多同學(xué)這時(shí)候就開(kāi)始買(mǎi)Linux書(shū)籍,從圖書(shū)館借了一大堆關(guān)于Linux的書(shū):什么《Linux使用基礎教程》、《Linux源碼深度分析》、《Linux情景分析等》、 《Linux高級使用指南》等等。結果抱著(zhù)這些圖書(shū)看了10天半個(gè)月還是不知所云,當初學(xué)習的激情慢慢就消退了,最后不了了之,終究沒(méi)有進(jìn)入嵌入式開(kāi)發(fā)大門(mén)。究其原因,是因為沒(méi)有找到合適學(xué)習嵌入式開(kāi)發(fā)的方法,做任何事情都有方法可循,找對了學(xué)習方法往往就能事半功倍;否則就可能是事倍功半,甚至勞而無(wú)功。接下來(lái)我先分析一下同學(xué)們的幾種常見(jiàn)的嵌入式Linux學(xué)習誤區,然后提出一種比較合適的嵌入式Linux學(xué)習方法。 誤區一、全身投入學(xué)習桌面或服務(wù)器版本Linux系統 很多想學(xué)嵌入式Linux 的同學(xué)經(jīng)常問(wèn)我,我不會(huì )Linux系統,怎么學(xué)習嵌入式Linux開(kāi)發(fā),于是他們就花費了大量的精力和時(shí)間去研究學(xué)習桌面版本Linux系統的使用,什么redhat 、federo,、ubuntu等等都用過(guò),如何配置Linux,Linux的各種使用命令都背的滾瓜爛熟,Linux各種服務(wù)器的配置,還原備份各種操作非常熟悉,以為這樣就學(xué)會(huì )了嵌入式Linux開(kāi)發(fā)。其實(shí)這是一個(gè)學(xué)習嵌入式Linux開(kāi)發(fā)的誤區。 Linux桌面環(huán)境只是嵌入式Linux的一個(gè)開(kāi)發(fā)工具,開(kāi)發(fā)環(huán)境而已。我們的目標不是學(xué)習Linux服務(wù)器的配置和使用,Linux服務(wù)器的高級配置和使用那是另外一個(gè)領(lǐng)域,不屬于嵌入式Linux討論的范疇。我們進(jìn)行嵌入式Linux開(kāi)發(fā),只是把Linux桌面環(huán)境當作一個(gè)工具,在Linux桌面環(huán)境下運行嵌入式Linux開(kāi)發(fā)工具,例如gcc 編譯器,make工具來(lái)開(kāi)發(fā)我們的嵌入式Linux應用程序而已,對于嵌入式開(kāi)發(fā)工程師來(lái)說(shuō),沒(méi)有必要花費那么多的精力和時(shí)間去研究Linux桌面版和服務(wù)器的應用,只要能了解最基本的操作即可,F在的桌面Linux系統的圖形化界面做的也相當好,跟window具有相同的易用性能,例如ubuntu很多操作都可以在圖形界面下完成,就沒(méi)有必要去記每個(gè)Linux命令了。熟悉Linux桌面系統的使用和基本操作命令,安排1~2天時(shí)間學(xué)習基本就可以掌握了。 誤區二、直接閱讀Linux內核源代碼 很多想學(xué)Linux,在連Linux是什么東西,一點(diǎn)都還不會(huì )使用的情況下去就閱讀Linux內核源代碼,花了大量時(shí)間去閱讀《Linux源碼深度分析》、《Linux情景分析等》等書(shū)。這樣的結果很可能就是看的頭昏眼花,不知所云,最后只能放棄了。這也是同學(xué)們學(xué)習嵌入式linux的一個(gè)誤區,在有一定嵌入式Linux開(kāi)發(fā)基礎后,帶著(zhù)一定的目的去閱讀Linux源代碼,這樣可以極大的提高你的技術(shù)能力,但是你在沒(méi)有任何基礎,對Linux一點(diǎn)都不了解的情況下就去閱讀Linux內核源代碼,無(wú)異于以卵擊石,最后只能是撞個(gè)頭破血流。 以上分析了同學(xué)們學(xué)習嵌入式linux 開(kāi)發(fā)的2個(gè)誤區,那么如何正確的嵌入式linux開(kāi)發(fā)呢? 做任何事情都有一個(gè)循序漸進(jìn)的過(guò)程,學(xué)習嵌入式Linux也一樣。在有了一定的嵌入式開(kāi)發(fā)基礎后,學(xué)習嵌入式Linux開(kāi)發(fā)比較適合的切入點(diǎn)是從嵌入式Linux應用程序開(kāi)發(fā)開(kāi)始,即暫時(shí)先不去關(guān)心嵌入式硬件平臺,不去關(guān)心Linux的底層驅動(dòng),先把精力集中在現有的嵌入式Linux平臺上進(jìn)行嵌入式Linux應用程序設計開(kāi)發(fā)。學(xué)習嵌入式Linux開(kāi)發(fā)絕不是看看書(shū)就可以學(xué)好的,需要多實(shí)踐,編程調試。因為嵌入式開(kāi)發(fā)不同于普通的基于PC機或服務(wù)器的應用程序開(kāi)發(fā),嵌入式開(kāi)發(fā)的應用程序是要燒寫(xiě)到嵌入式板卡或開(kāi)發(fā)板上運行的,所以首先你要給自己購買(mǎi)一塊開(kāi)發(fā)板。 有了開(kāi)發(fā)板后,先后開(kāi)始學(xué)習嵌入式Linux開(kāi)發(fā)環(huán)境搭建、嵌入式Linux開(kāi)發(fā)模型、Linux內核移植和文件系統、嵌入式Linux應用程序移植、嵌入式Linux多進(jìn)程,多線(xiàn)程應用程序設計、嵌入式Linux網(wǎng)絡(luò )編程,如果對嵌入式數據庫或圖形軟件開(kāi)發(fā)有興趣的,可以進(jìn)一步學(xué)習嵌入式Linux數據庫開(kāi)發(fā)或基于QT的嵌入式Linux圖形應用軟件設計。每學(xué)一章節都要通過(guò)相關(guān)實(shí)驗來(lái)驗證你從書(shū)上學(xué)到的東西,同時(shí)提高自己編寫(xiě)代碼,調試程序的能力。這個(gè)過(guò)程根據不同學(xué)員的基礎不同,大概要花上1 ~ 2個(gè)月時(shí)間。學(xué)完這些課程后,你就有了在現有的嵌入式Linux平臺上進(jìn)行應用程式設計開(kāi)發(fā)的能力,到一些嵌入式軟件公司去,能夠勝任在現有的嵌入式Linux平臺上進(jìn)行上層的應用程序開(kāi)發(fā)工作。但是目前你還不能進(jìn)行嵌入式Linux系統和驅動(dòng)的開(kāi)發(fā),也就是說(shuō),你現在只能在一個(gè)已經(jīng)構建好的嵌入式Linux平臺上進(jìn)行應用程序開(kāi)發(fā),而自己還沒(méi)有能力根據實(shí)際需要去重新構建一個(gè)嵌入式Linux平臺。要讓自己有能力根據實(shí)際需要重新構建一個(gè)嵌入式Linux軟硬件平臺,這時(shí)候就需要進(jìn)行下一階段的學(xué)習了,即嵌入式Linux系統和驅動(dòng)開(kāi)發(fā)。 三、嵌入式Linux系統和驅動(dòng)開(kāi)發(fā) 有了嵌入式Linux平臺上開(kāi)發(fā)應用程序的基礎,你已經(jīng)對Linux的功能、Linux對應用程序提供的接口和系統調用有了一定的了解,知道如何利用Linux提供的功能來(lái)進(jìn)行應用程序開(kāi)發(fā),知道如何來(lái)使用設備驅動(dòng)來(lái)進(jìn)行應用程序設計,有了這些知識后,你就可以更深入的去學(xué)習Linux系統原理和基于Linux驅動(dòng)的開(kāi)發(fā),Linux內核的裁剪,文件系統構,bootloader等等底層的知識了。 想要更深入學(xué)習嵌入式Linux系統和驅動(dòng)開(kāi)發(fā),要學(xué)的內容非常多包括計算機軟件、硬件、操作系統知識。這時(shí)候你可以參照以下的學(xué)習思路,因為嵌入式Linux系統和驅動(dòng)的開(kāi)發(fā),和底層硬件聯(lián)系非常緊密,所以首先我們從學(xué)習了解嵌入式硬件開(kāi)始,包括:ARM體系架構、S3C2440微處理器接口設計、時(shí)鐘系統、LCD屏接口、存儲控制器及系統的存儲空間分配、NAND FLASH接口和NOR FLASH接口等。對嵌入式系統硬件有了一定的了解后,接下來(lái)就可以開(kāi)始學(xué)習bootloader了,理解bootloader的概念,功能,和原理,重點(diǎn)掌握U-BOOT的使用和移植。接下來(lái)就開(kāi)始學(xué)習嵌入式Linux內核機制,分析嵌入式Linux源碼組成、內核的模塊機制、內核進(jìn)程管理、內存管理機制、Linux的中斷系統、Linux內核的移植等。有了內核的基礎,就可以學(xué)習嵌入式Linux設備驅動(dòng)開(kāi)發(fā)了,重點(diǎn)掌握字符設備驅動(dòng)開(kāi)發(fā),LCD屏設備驅動(dòng)開(kāi)發(fā)、觸摸屏設備驅動(dòng)開(kāi)發(fā)、USB設備驅動(dòng)開(kāi)發(fā),網(wǎng)卡設備驅動(dòng)開(kāi)發(fā)。學(xué)完這些知識點(diǎn)并通過(guò)相關(guān)實(shí)驗驗證后,嵌入式Linux系統和驅動(dòng)的開(kāi)發(fā)就算掌握了差不多了,能夠勝任絕大部分基于Linux平臺的驅動(dòng)開(kāi)發(fā)工作了。學(xué)完這些知識點(diǎn),根據學(xué)員的不同情況,一般需要花三個(gè)月到半年時(shí)間。通過(guò)這一階段的學(xué)習,你在嵌入式Linux開(kāi)發(fā)領(lǐng)域已經(jīng)算是有了一定的功底,已經(jīng)不再被人稱(chēng)為菜鳥(niǎo)了,已經(jīng)進(jìn)入嵌入式Linux開(kāi)發(fā)高手行列了。 四、更上一層樓 深入理解了嵌入式內核和驅動(dòng)開(kāi)發(fā),這時(shí)候寫(xiě)個(gè)什么驅動(dòng)對你已經(jīng)沒(méi)有什么問(wèn)題了,開(kāi)發(fā)過(guò)程中一些基本問(wèn)題都難不倒你了。這時(shí)你可能想優(yōu)化一下系統的性能,比如實(shí)時(shí)性,提高系統的啟動(dòng)速度,或者優(yōu)化系統的內存管理機制,要達到修改內核核心機制的境界,你就需要去深入去研讀Linux內核源碼了,參考《Linux源碼深度分析》、《Linux情景分析等》等Linux源碼分析的書(shū)籍,深入理解Linux各部分的實(shí)現機制和原理,以及可能存在的問(wèn)題。你只有在深入理解現有代碼和實(shí)現機制的基礎上,才能提出更好的改進(jìn)方案。如果你能達到這個(gè)境界,那你已經(jīng)是高手中的高手,可以笑傲群雄了。 |