|
、嵌入式開發(fā)學(xué)習(xí)方法-框架學(xué)習(xí)法
嵌入式系統(tǒng)的學(xué)習(xí)方法很多人都講過(guò),相信大家在網(wǎng)上或者其他渠道接觸過(guò)一些思路和方法,在這里講一下個(gè)人的體會(huì)。
首先來(lái)說(shuō),學(xué)習(xí)有沒(méi)有捷徑呢?一種說(shuō)法是可以速成,幾天就可以學(xué)會(huì),我認(rèn)為速成的說(shuō)法太夸張了,那是不可能的事情。
有些人講學(xué)習(xí)沒(méi)有捷徑,你必須經(jīng)過(guò)長(zhǎng)期的努力,所謂功到自然成。但是學(xué)習(xí)嵌入式技術(shù),如果說(shuō)沒(méi)有好的方法那也是不對(duì)的,學(xué)習(xí)一門新的知識(shí)體系肯定是要下工夫,但是也需要有好的指引,也就是捷徑,實(shí)際上這里是講的就是學(xué)習(xí)方法。
方法很重要,如果沒(méi)有方法,閉著眼亂學(xué)亂撞,肯定是不行的。就像我們?nèi)フ乙粋(gè)沒(méi)有去過(guò)的地方,自己跟著感覺(jué)去找,找到的希望很小,如果手里面有張地圖,并且還有指南針,那就快很多;如果我們有導(dǎo)航,自然是更快更方便了。實(shí)際上,這就是方法的重要性。
那么在這里,我們來(lái)介紹一種學(xué)習(xí)方法,這種方法也是粵嵌公司多年培訓(xùn)和產(chǎn)品開發(fā)經(jīng)驗(yàn)所總結(jié)出來(lái)的。
大家可能會(huì)問(wèn)了,粵嵌也做過(guò)嵌入式培訓(xùn)?實(shí)際上我們有很豐富的培訓(xùn)經(jīng)驗(yàn)。
我們覺(jué)得,‘框架學(xué)習(xí)法’是最適合初學(xué)者采用的一種方法,這里面包含了快速原型的思想;也就是框架學(xué)習(xí),快速原型。那么這里面的主導(dǎo)思想呢,就是從一開始就要看到嵌入式系統(tǒng)知識(shí)領(lǐng)域的全貌,然后逐漸深入!
比如說(shuō),我們想了解北京這座城市,如果在胡同里轉(zhuǎn)來(lái)轉(zhuǎn)去,可能幾年都搞不清楚這個(gè)城市是什么情況,如果我們先通過(guò)北京地圖學(xué)習(xí)一下,了解下北航在什么地方,鳥巢在什么地方,香山八達(dá)嶺在哪里。再加上我們到這些地方去看一看,可能很快就掌握了這座城市的全貌。
在這里需要注意的是,即便是我們有了地圖,也需要有一些基礎(chǔ),比如我們要知道鳥巢的來(lái)歷,明白八達(dá)嶺是怎么回事,實(shí)際上這些就是基礎(chǔ)知識(shí)。也就是說(shuō)我們?cè)趯W(xué)習(xí)系統(tǒng)框架之前要具備一定的基礎(chǔ),否則這張地圖也是看不懂的。
學(xué)習(xí)嵌入式技術(shù)也是需要一定的基礎(chǔ)的,一會(huì)兒我們專門講需要什么樣的基礎(chǔ)。
接下來(lái)如果我們想進(jìn)一步的了解這座城市,就要去研究這座城市的歷史,甚至是中國(guó)的歷史。更細(xì)一步呢,還可以進(jìn)一步研究故宮本身的地圖。
那么這樣一環(huán)套一環(huán)。經(jīng)過(guò)不斷的研究,逐漸就會(huì)掌握這座城市的地理、文化、政治經(jīng)濟(jì)等特點(diǎn)。
通過(guò)了解北京城這個(gè)簡(jiǎn)要的例子,運(yùn)用框架學(xué)習(xí)法,在對(duì)不同層次的框架的學(xué)習(xí)過(guò)程中,逐漸了解和掌握整個(gè)系統(tǒng)。
如果我們不注意方法,每天在胡同里面來(lái)回轉(zhuǎn)悠,肯定是事倍功半,將在很長(zhǎng)時(shí)間不得要領(lǐng)。
2、嵌入式系統(tǒng)學(xué)習(xí)的框架
學(xué)習(xí)嵌入式也是這樣。必須掌握一定的方法,才能比較快速有效的學(xué)習(xí)。
那么這個(gè)方法就是框架學(xué)習(xí)法,剛才我們也講了,首先在了解這個(gè)基礎(chǔ)框架之前我們要有一定的基礎(chǔ),那么這個(gè)基礎(chǔ)呢就是單片機(jī)和C語(yǔ)言,不需要你掌握的有多好,但一定要具備一定的C語(yǔ)言編程能力。像其他有些課程,比如計(jì)算機(jī)專業(yè)的編譯原理、數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)系統(tǒng)體系結(jié)構(gòu),這些知識(shí)實(shí)際上還不太需要,了解一下就可以了。
有了C語(yǔ)言編程基礎(chǔ),并且學(xué)過(guò)單片機(jī),這個(gè)時(shí)候就可以學(xué)習(xí)一下嵌入式Linux的基本框架了,很簡(jiǎn)單,那就是要搞清楚bootloader、Kernel、和文件系統(tǒng),接下來(lái)簡(jiǎn)單介紹一下。
什么是BootLoader呢?
實(shí)際上它是個(gè)引導(dǎo)程序,也就是硬件復(fù)位以后第一個(gè)要執(zhí)行的程序,它主要工作就是初始化操作系統(tǒng)運(yùn)行的環(huán)境,比如說(shuō)內(nèi)存、定時(shí)器、緩沖器等,當(dāng)這個(gè)工作做完以后,再把操作系統(tǒng)的代碼加載到內(nèi)存,然后操作系統(tǒng)就可以啟動(dòng)并執(zhí)行,到此為止,bootloader的任務(wù)就完成了。
那么有人問(wèn)了,沒(méi)有bootloader行不行呢,可以的!但是呢,因?yàn)椴僮飨到y(tǒng)本身一般是個(gè)通用的軟件,它要在不同的平臺(tái)上運(yùn)行,比如X86,ARM,POWERPC等等,而不同的處理器的初始化操作是不同的,如果操作系統(tǒng)的軟硬要考慮在啟動(dòng)時(shí)候各種平臺(tái)的差異性,那就顯得過(guò)于復(fù)雜。除此之外,也有其他方面的原因,比如燒寫系統(tǒng)的便捷性考慮等等,這里暫不做深入的探討。
常用的bootloder有很多種,比如U-BOOT、REDBOOT、LILO等等,我們開發(fā)板用的是Uboot。
什么是Kernel呢?
Kernel就是Linux的內(nèi)核,也就是說(shuō)Linux操作系統(tǒng)本身的代碼。那么U-BOOT啟動(dòng)到最后,就是把它加載到內(nèi)存,并且跳轉(zhuǎn)到Kernel來(lái)執(zhí)行。
什么是文件系統(tǒng)呢?
現(xiàn)在我們來(lái)介紹一下文件系統(tǒng),這里需要了解一個(gè)事實(shí),就是說(shuō)Linux啟動(dòng)到最后一定要掛載一個(gè)文件系統(tǒng)。這個(gè)是Linux的一個(gè)特點(diǎn),它不像其他操作系統(tǒng),比如像VxWorks,是不需要文件系統(tǒng)的,VxWORKS沒(méi)有文件系統(tǒng)也可以運(yùn)行。 而且還需要了解一點(diǎn),像QT系統(tǒng)、Android、以及Ubuntu系統(tǒng)它們的底層都是Linux內(nèi)核,不同的是她們的文件系統(tǒng)不一樣,也就是說(shuō),Android系統(tǒng)相關(guān)的一些代碼,比如說(shuō)圖形界面系統(tǒng)、Android的虛擬機(jī),Android的框架代碼都在Linux最后掛的文件系統(tǒng)里面。 如果大家理解了這點(diǎn),那么這幾個(gè)系統(tǒng)的基本架構(gòu)也就清楚了。
搞清楚了這幾個(gè)概念,實(shí)際我們就了解了Linux系統(tǒng)最基本的框架,然后呢我們根據(jù)開發(fā)板配套的資料,去學(xué)習(xí)如何編譯這幾個(gè)文件,因?yàn)橄馯boot、Kernel、文件系統(tǒng),最后編譯生成出來(lái)分別是一個(gè)獨(dú)立的文件,就是說(shuō)會(huì)生成三個(gè)文件,最后我們要學(xué)會(huì)把這幾個(gè)文件燒寫到板子上。
學(xué)會(huì)了編譯和燒寫,接下來(lái)呢,我們?cè)谶@個(gè)框架的基礎(chǔ)上,去學(xué)習(xí)如何做Linux上面的應(yīng)用程序。
什么是應(yīng)用程序(APP)呢?這也是框架的內(nèi)容,它是跑在操作系統(tǒng)上面,通過(guò)調(diào)用操作系統(tǒng)的資源去工作,是最終的業(yè)務(wù)邏輯,比如我們Windows上面有很多的應(yīng)用程序,比如QQ、暴風(fēng)影音、WORD、EXEL等,各種各樣APP有很多。
根據(jù)我們后期的視頻教程,大家應(yīng)該很快就能學(xué)會(huì),比如說(shuō)串口程序、網(wǎng)絡(luò)程序等等,這些都是應(yīng)用程序,我們不需要做太多,學(xué)習(xí)幾個(gè)加深一下對(duì)框架的認(rèn)識(shí)就可以了。
再接下來(lái),我們就需要學(xué)習(xí)Linux驅(qū)動(dòng)方面的一些知識(shí)了,這也是在基礎(chǔ)框架里面的,驅(qū)動(dòng)程序可以看成是操作系統(tǒng)的一部分,它在底層專門和硬件打交道。那么大家稍微了解一下,就會(huì)知道Linux的驅(qū)動(dòng)包括有三種:字符設(shè)備、塊設(shè)備以及網(wǎng)絡(luò)設(shè)備。
這個(gè)時(shí)候呢,大家要注意,只需要學(xué)習(xí)字符類設(shè)備驅(qū)動(dòng),其他兩種先不要去管。一定要記住,最初學(xué)習(xí)嵌入式技術(shù)的時(shí)候不要去研究塊設(shè)備和網(wǎng)絡(luò)設(shè)備。也就是說(shuō),把字符類設(shè)備搞明白就可以了。因?yàn)橐话愕墓鹃_發(fā)嵌入式的產(chǎn)品僅限于字符設(shè)備的開發(fā),掌握字符設(shè)備的框架思想和開發(fā)步驟就能夠勝任了。至于塊設(shè)備和網(wǎng)絡(luò)設(shè)備,直接用開發(fā)板或者某個(gè)開發(fā)平臺(tái)本身提供的驅(qū)動(dòng)就足夠了,這些是一線處理器廠家做的事情,一般情況下不需要我們?nèi)ネ瓿桑@些處理器研發(fā)的廠家在為處理器開發(fā)配套BSP的時(shí)候才會(huì)涉及這些工作。
當(dāng)然了,有的同學(xué)可能會(huì)講,某某公司就是在做塊設(shè)備驅(qū)動(dòng),我的意思是講,從嵌入式這個(gè)行業(yè)總體上來(lái)講,大多數(shù)公司都不需要那么做,很多技術(shù)都是直接拿來(lái)用。我們掌握了字符設(shè)備驅(qū)動(dòng)的開發(fā)方法,已經(jīng)能夠應(yīng)付大多數(shù)公司的開發(fā)要求,對(duì)于一個(gè)還沒(méi)有入門的學(xué)生來(lái)講,一定要按照我說(shuō)的辦法來(lái)學(xué)習(xí)。
等將來(lái)熟練掌握基本技能以后,可以根據(jù)框架學(xué)習(xí)的方法,再去研究更深入的編程。這個(gè)時(shí)候,那些計(jì)算機(jī)專業(yè)的課程,比如數(shù)據(jù)結(jié)構(gòu)、計(jì)算機(jī)系統(tǒng)體系結(jié)構(gòu)、各種算法等等就可以派上用場(chǎng)了,自己的水平也會(huì)在學(xué)習(xí)的過(guò)程中再次升華。
學(xué)習(xí)字符類設(shè)備驅(qū)動(dòng),請(qǐng)跟著粵嵌的視頻去學(xué)習(xí)LED的驅(qū)動(dòng)編寫方法,以及蜂鳴器、AD轉(zhuǎn)換等這些跟GPIO相關(guān)的驅(qū)動(dòng)開發(fā)技巧。
掌握了這些,可以講,我們已經(jīng)成為了一個(gè)比較合格的嵌入式驅(qū)動(dòng)工程師!
這個(gè)時(shí)候我進(jìn)一步介紹一下什么是快速原型,如果學(xué)過(guò)軟件工程的話,那么大家會(huì)聽說(shuō)過(guò)一種自頂向下的產(chǎn)品開發(fā)方法,這個(gè)方法很有效,多數(shù)產(chǎn)品的開發(fā)方法都是遵循這個(gè)思想,大概就是從最初的可行性分析,然后概要設(shè)計(jì)、詳細(xì)設(shè)計(jì),編碼,測(cè)試等等。
除此之外呢,還有一種開發(fā)方法就是‘快速原型’,這個(gè)是微軟采用的一種方法,簡(jiǎn)而言之呢,快速原型是個(gè)逐漸迭代的方法,就是說(shuō)讓產(chǎn)品盡快把雛形開發(fā)出來(lái),然后逐漸清晰,一步步走向成熟。
在這里我們把快速原型法用到學(xué)習(xí)上,它原來(lái)是種開發(fā)方法,我們這里借鑒過(guò)來(lái),借鑒到框架學(xué)習(xí)的思想上。
也就是說(shuō),我們掌握一定的基礎(chǔ)以后,就要去學(xué)習(xí)框架,當(dāng)這個(gè)基礎(chǔ)框架清晰以后,再去學(xué)習(xí)更新更深入的框架知識(shí),這樣一環(huán)套一環(huán),環(huán)環(huán)相扣,最終研究越來(lái)越深入,進(jìn)而成為這個(gè)行業(yè)的專家。
那么在嵌入式行業(yè)的工程師的職位其實(shí)也是這個(gè)樣子的,大家看一下:
基本數(shù)字電路 + C語(yǔ)言 + 基礎(chǔ)框架知識(shí) -----> 嵌入式驅(qū)動(dòng)工程師
數(shù)組結(jié)構(gòu)+編譯原理 ------> 高級(jí)嵌入式驅(qū)動(dòng)工程師
計(jì)算機(jī)系統(tǒng)體系結(jié)構(gòu) + 操作系統(tǒng)(從抽象到具體)-------> 系統(tǒng)架構(gòu)工程師
因?yàn)樵诘谝粋(gè)階段,你會(huì)發(fā)現(xiàn),只要會(huì)C語(yǔ)言,有良好的編程功底就夠了,在工作的時(shí)候很少涉及到編譯原理、數(shù)據(jù)結(jié)構(gòu)這些方面的知識(shí),那么很多其他專業(yè)的畢業(yè)生,甚至原來(lái)學(xué)機(jī)械設(shè)計(jì)的同學(xué)都可以成為嵌入式驅(qū)動(dòng)工程師。
實(shí)際也是這樣,在大多數(shù)嵌入式技術(shù)公司,尤其是應(yīng)用產(chǎn)品開發(fā)的公司,只要了解基本的Linux架構(gòu)的知識(shí),并且能夠編寫字符類的驅(qū)動(dòng)程序就夠了。因?yàn)橄窬W(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)以及塊設(shè)備驅(qū)動(dòng),基本都有個(gè)DEMO設(shè)計(jì),只要參考這個(gè)DEMO做就可以,根本不需要我們做什么,如果說(shuō)需要做的話,那也是改一下GPIO的設(shè)置,修改一下中斷的引腳,僅此而已。
那么深入學(xué)習(xí)的話,分析操作系統(tǒng)源碼的時(shí)候就會(huì)發(fā)現(xiàn),數(shù)據(jù)結(jié)構(gòu)的知識(shí)逐漸排上用場(chǎng),尤其是在某些專業(yè)公司,負(fù)責(zé)某個(gè)專用領(lǐng)域的時(shí)候,這時(shí)候可能會(huì)改寫操作系統(tǒng)的某部分代碼,來(lái)適應(yīng)他們自己硬件的各種情況,將會(huì)深入分析某方面的技術(shù),比如文件系統(tǒng)、網(wǎng)絡(luò)協(xié)議等,這個(gè)時(shí)候數(shù)據(jù)結(jié)構(gòu)等方面知識(shí)就顯得很有用了。
有了基礎(chǔ)的原型以后,通過(guò)繼續(xù)學(xué)習(xí)新的知識(shí),逐漸使上一個(gè)層次,更精深的了解嵌入式技術(shù),同時(shí)知識(shí)體系更加完備,可以做更高層次的工作了。
應(yīng)用這樣的學(xué)習(xí)方法,在學(xué)習(xí)過(guò)程中,也會(huì)使學(xué)習(xí)過(guò)程始終有目標(biāo),而且不會(huì)感覺(jué)枯燥,每天都會(huì)有成就感,從一開始就能抓住嵌入式系統(tǒng)的脈絡(luò),只要付諸努力,持久學(xué)習(xí)下去,就能成為嵌入式行業(yè)的專家。
最后我們總結(jié)下,我們要想比較快的掌握嵌入式技術(shù),要應(yīng)用框架學(xué)習(xí)的方法,在一定的知識(shí)基礎(chǔ)上就開始學(xué)習(xí)基礎(chǔ)的框架知識(shí),這樣就很容易入門,隨著開發(fā)經(jīng)驗(yàn)的積累,再去學(xué)更深入的基礎(chǔ)知識(shí),以及更深層次的框架知識(shí)。這樣相互迭代,直到能夠精通嵌入式技術(shù)。
這個(gè)方法也充分說(shuō)明計(jì)算機(jī)科學(xué)是個(gè)實(shí)驗(yàn)科學(xué)。
那么在學(xué)習(xí)過(guò)程中,要注意,不用學(xué)習(xí)過(guò)多的基礎(chǔ),也就是說(shuō)有了C語(yǔ)言和單片機(jī)的基礎(chǔ)就可以學(xué)習(xí)嵌入式的基本框架,然后就能夠成為一個(gè)合格的嵌入式工程師; 以后可以繼續(xù)深造,學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)編譯原理操作系統(tǒng)等方面的知識(shí),深入學(xué)習(xí)算法,從而再去學(xué)習(xí)Linux更深層次的框架結(jié)構(gòu),使得整體水平得到進(jìn)一步的升華。
現(xiàn)在我們總結(jié)一下,把學(xué)習(xí)嵌入式技術(shù)的路線圖跟大家澄清一下,那就是:?jiǎn)纹瑱C(jī)+C語(yǔ)言----->學(xué)習(xí)基礎(chǔ)框架知識(shí)(包括bootloadre,Linux內(nèi)核、文件系統(tǒng)的編譯和燒寫----->再去學(xué)習(xí)Linux上層應(yīng)用的編程,以及字符設(shè)備的驅(qū)動(dòng),學(xué)完以后你就會(huì)覺(jué)得入門了,能做一些事情了-----> 再深入學(xué)習(xí)計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)、數(shù)據(jù)結(jié)構(gòu)、操作系統(tǒng)原理等等一些知識(shí),通過(guò)分析Linux系統(tǒng)源碼,直到熟練掌握嵌入式編程技術(shù)。
3、關(guān)于裸機(jī)程序和仿真
有些用戶希望通過(guò)ARM開發(fā)板來(lái)學(xué)裸機(jī)程序,其實(shí)我們不建議這樣做,在ARM上做一些裸機(jī)程序,不是不可以,而是沒(méi)有太多價(jià)值,因?yàn)槁銠C(jī)程序根本發(fā)揮不了ARM處理器的性能,只有運(yùn)行了操作系統(tǒng)才能夠充分挖掘ARM處理器的優(yōu)勢(shì),更能夠保證系統(tǒng)運(yùn)行的安全和穩(wěn)定性。
如果真的想學(xué)習(xí)裸機(jī)程序,單片機(jī)就夠了。從架構(gòu)上來(lái)講,單片機(jī)和ARM是一樣的,都是CPU,而且編程思想也沒(méi)有多少區(qū)別,只不過(guò)ARM速度太快了,只有在上面跑操作系統(tǒng),并使用多任務(wù)的編程方法才能最大化的發(fā)揮ARM處理器的優(yōu)勢(shì)。
在實(shí)際產(chǎn)品開發(fā)時(shí)也是這樣,幾乎沒(méi)有拿ARM跑裸機(jī)的方式來(lái)開發(fā)產(chǎn)品的。如果用裸機(jī)方式來(lái)編程,推薦使用單片機(jī),這樣整體成本也會(huì)小很多,事實(shí)上也是這樣的。
早期的時(shí)候,我們?cè)贏RM上也做過(guò)很多裸機(jī)程序,并且用仿真器來(lái)調(diào)試;很多人,尤其從單片機(jī)轉(zhuǎn)過(guò)來(lái)的人,都希望學(xué)習(xí)下這種技術(shù),因?yàn)樗麄兏杏X(jué)裸機(jī)程序更親切,而直接用操作系統(tǒng)覺(jué)得很不踏實(shí),不能夠完全掌握系統(tǒng)的運(yùn)行情況;其實(shí)呢這種想法是不對(duì)的。我們必須在抽象的層次上來(lái)開發(fā)產(chǎn)品,逐漸轉(zhuǎn)變觀念,不能說(shuō)開發(fā)一款產(chǎn)品,就一定要對(duì)每個(gè)程序的細(xì)節(jié)都非常清楚,應(yīng)該學(xué)會(huì)在操作系統(tǒng)這個(gè)抽象的軟件上來(lái)開發(fā)產(chǎn)品,這樣做才符合潮流,也是產(chǎn)品發(fā)展以及個(gè)人發(fā)展必須轉(zhuǎn)變的思路和觀念。
因?yàn)槲覀兛吹教嗟淖鰡纹瑱C(jī)開發(fā)的工程師很難能轉(zhuǎn)到嵌入式產(chǎn)品的開發(fā)當(dāng)中來(lái),恐怕觀念的轉(zhuǎn)變可以說(shuō)是最大的障礙,希望引起大家的注意。 |
|