總領(lǐng)及學(xué)習指引 結合入門(mén)視頻介紹了開(kāi)發(fā)板組裝,Ubuntu 環(huán)境搭建,以及 Linux 常用命令等內容,為學(xué)習后面的內容打下基礎。 推薦學(xué)習步驟:入門(mén)視頻--->系統編程--->驅動(dòng)--->Qt 或 Android。 配套視頻資源:“ITOP-4412 開(kāi)發(fā)板視頻教程\01-迅為電子開(kāi)發(fā)板入門(mén)視頻”。 01 框架學(xué)習法 嵌入式系統的學(xué)習方法很多人都講過(guò),相信大家在網(wǎng)上或者其他渠道接觸過(guò)一些思路和方法,在這里講一下個(gè)人的體會(huì )。 首先來(lái)說(shuō),學(xué)習有沒(méi)有捷徑呢?一種說(shuō)法是可以速成,幾天就可以學(xué)會(huì ),我們認為這種速成的說(shuō)法太夸張了,那是不可能的。 有些人認為學(xué)習沒(méi)有捷徑,你必須經(jīng)過(guò)長(cháng)期的努力,所謂功到自然成。但是學(xué)習嵌入式技術(shù),如果說(shuō)沒(méi)有好的方法那也是不對的,學(xué)習一門(mén)新的知識體系肯定是要下工夫,但是也需要有好的指引,也就是捷徑,實(shí)際上這里是講的就是學(xué)習方法。 方法很重要,如果沒(méi)有方法,閉著(zhù)眼亂學(xué)亂撞,肯定是不行的。就像我們去找一個(gè)沒(méi)有去過(guò)的地方,自己跟著(zhù)感覺(jué)去找,找到的希望就很小,如果手頭有張地圖,并且還有指南針,那就要快很多;如果我們有導航,自然是更快更方便了。實(shí)際上,這就是方法的重要性。那么在這里,我們來(lái)介紹一種學(xué)習方法,這種方法也是迅為公司多年培訓和產(chǎn)品開(kāi)發(fā)經(jīng)驗所總結出來(lái)的。 大家可能會(huì )問(wèn)了,迅為也做過(guò)嵌入式培訓?實(shí)際上我們有很豐富的培訓經(jīng)驗。 我們覺(jué)得,‘框架學(xué)習法’是最適合初學(xué)者的一種方法,這里面包含了快速原型的思想; 也就是框架學(xué)習,快速原型。這里面的主導思想,即從一開(kāi)始就要看到嵌入式系統知識領(lǐng)域的全貌,然后逐漸深入! 比如說(shuō),我們想了解北京這座城市,如果在胡同里轉來(lái)轉去,可能幾年都搞不清楚這個(gè)城市是什么情況,如果我們先通過(guò)北京地圖學(xué)習一下,了解下天安門(mén)在什么地方,鳥(niǎo)巢在什么地方,香山八達嶺在哪里。再加上我們到這些地方去看一看,可能很快就掌握了這座城市的全貌。 在這里需要注意的是,即便是有了地圖,也需要有一些基礎,比如我們需要知道什么是天安門(mén),知道鳥(niǎo)巢的來(lái)歷,明白八達嶺是怎么回事,實(shí)際上這些就是基礎知識。也就是說(shuō)我們在學(xué)習系統框架之前要具備一定的基礎,否則這張地圖也是看不懂的。 學(xué)習嵌入式技術(shù)也是需要一定的基礎的,關(guān)于基礎方面,下一節會(huì )專(zhuān)門(mén)討論。接下來(lái)如果我們想進(jìn)一步的了解這座城市,就要去研究這座城市的歷史,甚至是中國的歷史。更細一步呢,還可以進(jìn)一步研究故宮本身的地圖。 這樣一環(huán)套一環(huán),經(jīng)過(guò)不斷的研究,逐漸就會(huì )掌握這座城市的地理、文化、政治經(jīng)濟等特點(diǎn)。 通過(guò)了解北京城這個(gè)簡(jiǎn)要的例子,運用框架學(xué)習法,在對不同層次的框架的學(xué)習過(guò)程中, 逐漸了解和掌握整個(gè)系統。 如果我們不注意方法,每天在胡同里面來(lái)回轉悠,肯定是事倍功半,很長(cháng)時(shí)間將不得要領(lǐng)。 02 嵌入式系統學(xué)習的框架 學(xué)習嵌入式也是這樣。必須掌握一定的方法,才能比較快速有效的學(xué)習。 這個(gè)方法就是框架學(xué)習法,如前所述,首先在了解這個(gè)基礎框架之前我們要有一定的基 礎,那么這個(gè)基礎就是單片機和 C 語(yǔ)言,不需要掌握的有多好,但一定要具備一定的 C 語(yǔ)言編程能力。像其他有些課程,比如計算機專(zhuān)業(yè)課程中的編譯原理、數據結構,計算機系統體系結構,這些知識實(shí)際上還不太需要,了解一下就可以了。 有了 C 語(yǔ)言編程基礎,并且學(xué)過(guò)單片機,這個(gè)時(shí)候就可以學(xué)習一下嵌入式 Linux 的基本框架了,很簡(jiǎn)單,那就是首先要搞清楚什么是 BootLoader、Linux 內核(kernel)、和文件系統,接下來(lái)簡(jiǎn)單介紹一下。 什么是 BootLoader 呢? 實(shí)際上它是個(gè)引導程序,也就是硬件復位以后第一個(gè)要執行的程序,它主要工作就是初始化操作系統運行的環(huán)境,比如說(shuō)內存、定時(shí)器、緩沖器等,當這個(gè)工作做完以后,再把操作系統的代碼加載到內存,然后操作系統就可以啟動(dòng)并執行,到此為止,bootloader 的任務(wù)就完成了。 那么有人問(wèn)了,沒(méi)有 bootloader 行不行呢,可以!但是因為操作系統本身一般是個(gè)通用的軟件,它要在不同的平臺上運行,比如 X86,ARM,POWERPC 等等,而不同的處理器的初始化操作是不同的,如果操作系統的軟硬要考慮在啟動(dòng)時(shí)候各種平臺的差異性,那就顯得過(guò)于復雜。除此之外,也有其他方面的原因,比如燒寫(xiě)系統的便捷性考慮等等,這里暫不做深入的探討。 常用的 bootloder 有很多種,比如 U-BOOT、REDBOOT、LILO 等等,我們開(kāi)發(fā)板用的是 Uboot。 什么是 Kernel 呢? Kernel 就是 Linux 的內核,也就是說(shuō) Linux 操作系統本身的代碼。那么 U-BOOT 啟動(dòng)到最后,就是把它加載到內存,并且跳轉到 Kernel 來(lái)執行。 什么是文件系統呢? 現在我們來(lái)介紹一下文件系統,這里需要了解一個(gè)事實(shí),就是說(shuō) Linux 啟動(dòng)到最后一定要掛載一個(gè)文件系統。這個(gè)是 Linux 的一個(gè)特點(diǎn),它不像其他操作系統,比如像 VxWorks,是不需要文件系統的,VxWORKS沒(méi)有文件系統也可以運行。 而且還需要了解一點(diǎn),像 QT 系統、Android、以及 Ubuntu 系統它們的底層都是 Linux 內核,不同的是它們的文件系統不一樣,也就是說(shuō),Android 系統相關(guān)的一些代碼,比如說(shuō)圖形界面系統、Android 的虛擬機, Android 的框架代碼都在 Linux 最后掛的文件系統里面。 如果大家理解了這點(diǎn),那么這幾個(gè)系統的基本架構也就清楚了。 搞清楚了這幾個(gè)概念,實(shí)際我們就了解了 Linux 系統最基本的框架,然后我們根據開(kāi)發(fā)板配套的資料,去學(xué)習如何編譯這幾個(gè)文件,因為像 Uboot、Kernel、文件系統,最后編譯生成出來(lái)分別是一個(gè)獨立的文件,就是說(shuō)會(huì )生成三個(gè)文件,最后我們要學(xué)會(huì )把這幾個(gè)文件燒寫(xiě)到板子上。學(xué)會(huì )了編譯和燒寫(xiě),接下來(lái)呢,我們在這個(gè)框架的基礎上,去學(xué)習如何做 Linux 上面的應用程序。什么是應用程序(APP)呢?它是運行在操作系統上面,通過(guò)調用操作系統的資源去工作,是最終的業(yè)務(wù)邏輯,比如我們 Windows 上面有很多的應用程序,像 QQ、暴風(fēng)影音、WORD、EXEL 等,各種各樣 APP有很多。 根據我們后期的視頻教程,大家應該很快就能學(xué)會(huì ),比如說(shuō)串口程序、網(wǎng)絡(luò )程序等等,這些都是應用程序,我們不需要做太多,學(xué)習幾個(gè)加深一下對框架的認識就可以了。再接下來(lái),我們就需要學(xué)習 Linux 驅動(dòng)方面的一些知識了,這也是在基礎框架里面的,驅動(dòng)程序可以看成是操作系統的一部分,它在底層專(zhuān)門(mén)和硬件打交道。那么大家稍微了解一下, 就會(huì )知道 Linux 的驅動(dòng)包括有三種:字符設備、塊設備以及網(wǎng)絡(luò )設備。 這個(gè)時(shí)候呢,大家要注意,只需要學(xué)習字符類(lèi)設備驅動(dòng),其他兩種先不要去花時(shí)間研究。一定要記住,最初學(xué)習嵌入式技術(shù)的時(shí)候不要去研究塊設備和網(wǎng)絡(luò )設備。也就是說(shuō),把字符類(lèi)設備搞明白就可以了。因為一般的公司開(kāi)發(fā)嵌入式的產(chǎn)品僅限于字符設備的開(kāi)發(fā),掌握字符設備的框架思想和開(kāi)發(fā)步驟就能夠勝任了。至于塊設備和網(wǎng)絡(luò )設備,直接用開(kāi)發(fā)板或者某個(gè)開(kāi)發(fā)平臺本身提供的驅動(dòng)就足夠了,這些是一線(xiàn)處理 器廠(chǎng)家做的事情,一般情況下不需要我們去完成,這些處理器研發(fā)的廠(chǎng)家在為處理器開(kāi)發(fā)配套 BSP 的時(shí)候才會(huì )涉及這些工作。 當然了,有的同學(xué)可能會(huì )說(shuō),某某公司就是在做塊設備驅動(dòng),我的意思是講,從嵌入式這個(gè)行業(yè)總體上來(lái)講,大多數公司都不需要那么做,很多技術(shù)往往是直接拿來(lái)用的。我們掌握了字符設備驅動(dòng)的開(kāi)發(fā)方法,已經(jīng)能夠應付大多數公司的開(kāi)發(fā)要求,對于一個(gè)還沒(méi)有入門(mén)的學(xué)生來(lái)講,一定要按照我說(shuō)的辦法來(lái)學(xué)習。 等將來(lái)熟練掌握基本技能以后,可以根據框架學(xué)習的方法,再去研究更深入的編程。這個(gè)時(shí)候,那些計算機專(zhuān)業(yè)的課程,比如數據結構、計算機系統體系結構、各種算法等等就可以派上用場(chǎng)了,自己的水平也會(huì )在學(xué)習的過(guò)程中再次升華。 學(xué)習字符類(lèi)設備驅動(dòng),請跟著(zhù)迅為的視頻去學(xué)習 LED 的驅動(dòng)編寫(xiě)方法,以及蜂鳴器、AD 轉換等這些跟 GPIO 相關(guān)的驅動(dòng)開(kāi)發(fā)技巧。 掌握了這些,可以講,我們已經(jīng)成為了一個(gè)比較合格的嵌入式驅動(dòng)工程師! 這個(gè)時(shí)候我進(jìn)一步介紹一下什么是快速原型,如果學(xué)過(guò)軟件工程的話(huà),那么大家會(huì )聽(tīng)說(shuō)過(guò)一種自頂向下的產(chǎn)品開(kāi)發(fā)方法,這個(gè)方法很有效,多數產(chǎn)品的開(kāi)發(fā)方法都是遵循這個(gè)思想,大概就是從最初的可行性分析,然后概要設計、詳細設計、編碼、測試等等。 除此之外呢,還有一種開(kāi)發(fā)方法就是‘快速原型’,這個(gè)是微軟采用的一種方法,簡(jiǎn)而言之呢,快速原型是個(gè)逐漸迭代的方法,就是說(shuō)讓產(chǎn)品盡快把雛形開(kāi)發(fā)出來(lái),然后逐漸清晰,一步步走向成熟。 在這里我們把快速原型法用到學(xué)習上,它原來(lái)是種開(kāi)發(fā)方法,我們這里借鑒過(guò)來(lái),借鑒到框架學(xué)習的思想上。 也就是說(shuō),我們掌握一定的基礎以后,就要去學(xué)習框架,當這個(gè)基礎框架清晰以后,再去學(xué)習更新更深入的框架知識,這樣一環(huán)套一環(huán),環(huán)環(huán)相扣,最終研究越來(lái)越深入,進(jìn)而成為這個(gè)行業(yè)的專(zhuān)家。 那么在嵌入式行業(yè)的工程師的職位其實(shí)也是這個(gè)樣子的,大家看一下: 基本數字電路 + C 語(yǔ)言 + 基礎框架知識 -----> 嵌入式驅動(dòng)工程師數據結構+編譯原理 ------> 高級嵌入式驅動(dòng)工程師計算機系統體系結構 + 操作系統(從抽象到具體)-------> 系統架構工程師 因為在第一個(gè)階段,你會(huì )發(fā)現,只要熟練掌握 C 語(yǔ)言,有良好的編程功底就夠了,在工作的時(shí)候很少涉及到編譯原理、數據結構這些方面的知識,那么很多其他專(zhuān)業(yè)的畢業(yè)生,甚至原來(lái)學(xué)機械設計的同學(xué)都可以成為嵌入式驅動(dòng)工程師。 實(shí)際也是這樣,在大多數嵌入式技術(shù)公司,尤其是應用產(chǎn)品開(kāi)發(fā)的公司,只要了解基本的 Linux 架構的知識,并且能夠編寫(xiě)字符類(lèi)的驅動(dòng)程序就夠了。因為像網(wǎng)絡(luò )設備驅動(dòng)以及塊設備驅動(dòng),基本都有個(gè) DEMO設計,只要參考這個(gè) DEMO 做就可以,根本不需要我們做什么,如果說(shuō)需要做的話(huà),那也是改一下 GPIO 的設置,修改一下中斷的引腳,僅此而已。 那么深入學(xué)習的話(huà),分析操作系統源碼的時(shí)候就會(huì )發(fā)現,數據結構的知識逐漸排上用場(chǎng), 尤其是在某些專(zhuān)業(yè)公司,負責某個(gè)專(zhuān)用領(lǐng)域的時(shí)候,工作中可能會(huì )改寫(xiě)操作系統的某部分代 碼,來(lái)適應他們自己硬件的各種情況,將會(huì )深入分析某方面的技術(shù),比如文件系統、網(wǎng)絡(luò )協(xié)議等,這個(gè)時(shí)候數據結構等方面知識就顯得很重要了。 有了基礎的原型以后,通過(guò)繼續學(xué)習新的知識,逐漸使自己的認識提高一個(gè)層次,更精深的了解嵌入式技術(shù),同時(shí)知識體系更加完備,可以做更高層次的工作了。 應用這樣的學(xué)習方法,在學(xué)習過(guò)程中,也會(huì )使學(xué)習過(guò)程始終有目標,而不會(huì )感覺(jué)枯燥,每天都會(huì )有成就感,從一開(kāi)始就能抓住嵌入式系統的脈絡(luò ),只要付諸努力,持久學(xué)習下去,就能成為嵌入式行業(yè)的專(zhuān)家。 最后我們總結下,要想比較快的掌握嵌入式技術(shù),要應用框架學(xué)習的方法,在一定的知識基礎上就開(kāi)始學(xué)習基礎的框架知識,這樣就很容易入門(mén),隨著(zhù)開(kāi)發(fā)經(jīng)驗的積累,再去學(xué)更深入的基礎知識,以及更深層次的框架知識。這樣相互迭代,直到能夠精通嵌入式技術(shù)。 這個(gè)方法也充分說(shuō)明計算機科學(xué)是門(mén)實(shí)驗科學(xué)。 那么在學(xué)習過(guò)程中,要注意,不用學(xué)習過(guò)多的基礎知識,也就是說(shuō)有了 C 語(yǔ)言和單片機的基礎就可以學(xué)習嵌入式的基本框架,然后就能夠成為一個(gè)合格的嵌入式工程師; 以后可以繼續深造,學(xué)習數據結構編譯原理操作系統等方面的知識,并深入學(xué)習算法,從而再去學(xué)習 Linux 更深層次的框架結構,使得整體水平得到進(jìn)一步的升華。 現在我們總結一下,把學(xué)習嵌入式技術(shù)的路線(xiàn)圖跟大家澄清一下,那就是: 單片機 + C 語(yǔ)言 -----> 學(xué)習基礎框架知識(包括 bootloader,Linux 內核、文件系統的編譯和燒寫(xiě) -----> 再去學(xué)習 Linux 上層應用的編程,以及字符設備的驅動(dòng),學(xué)完以后就會(huì )覺(jué)得入門(mén)了,能做一些事情了----->最后深入學(xué)習計算機系統結構、數據結構、操作系統原理等等一些知識,通過(guò)分析 Linux 系統源碼,直到熟練掌握嵌入式編程技術(shù)。 大家按照這個(gè)學(xué)習方法,基于 iTOP-4412 開(kāi)發(fā)板提供的資料和視頻,就一定能夠學(xué)好這門(mén)技術(shù)。 03 關(guān)于裸機程序和仿真 有些用戶(hù)希望通過(guò) ARM 開(kāi)發(fā)板來(lái)學(xué)裸機程序,其實(shí)我們不建議這樣做,在 ARM 上做一些裸機程序,不是不可以,而是沒(méi)有太多價(jià)值,因為裸機程序根本發(fā)揮不了 ARM 處理器的性能,只有運行了操作系統才能夠充分挖掘 ARM 處理器的優(yōu)勢,更能夠保證系統運行的安全和穩定性。 如果真的想學(xué)習裸機程序,單片機就夠了。從架構上來(lái)講,單片機和 ARM 是一樣的,都是 CPU,而且編程思想也沒(méi)有多少區別,只不過(guò) ARM 速度太快了,只有在上面跑操作系統, 并使用多任務(wù)的編程方法才能最大化的發(fā)揮 ARM 處理器的優(yōu)勢。 在實(shí)際產(chǎn)品開(kāi)發(fā)時(shí)也是這樣,幾乎沒(méi)有拿 ARM 跑裸機的方式來(lái)開(kāi)發(fā)產(chǎn)品的。如果用裸機方式來(lái)編程,推薦使用單片機,這樣整體成本也會(huì )小很多,事實(shí)上也是這樣的。 早期的時(shí)候,我們在 ARM 上也做過(guò)很多裸機程序,并且用仿真器來(lái)調試;很多人,尤其從單片機轉過(guò)來(lái)的工程師,都希望學(xué)習下這種技術(shù),因為他們感覺(jué)裸機程序更親切,而直接用操作系統覺(jué)得很不踏實(shí),不能夠完全掌握系統的運行情況;其實(shí)這種想法是不對的。我們必須在抽象的層次上來(lái)開(kāi)發(fā)產(chǎn)品,逐漸轉變觀(guān)念,不能說(shuō)開(kāi)發(fā)一款產(chǎn)品,就一定要對每個(gè)程序的細節都非常清楚,應該學(xué)會(huì )在操作系統這個(gè)抽象的 軟件上來(lái)開(kāi)發(fā)產(chǎn)品,這樣做才符合潮流,也是產(chǎn)品發(fā)展以及個(gè)人發(fā)展必須轉變的思路和觀(guān)念。 我們看到很多原來(lái)做單片機開(kāi)發(fā)的工程師,在轉型嵌入式產(chǎn)品開(kāi)發(fā)的時(shí)候面臨很多困難, 實(shí)際上觀(guān)念的轉變應該說(shuō)是最大的障礙,希望引起大家的注意。 04 基于 4412 開(kāi)發(fā)板的學(xué)習步驟 本節結合迅為的 iTOP-4412 開(kāi)發(fā)板來(lái)介紹一下嵌入式技術(shù)的學(xué)習步驟。 大家都知道,嵌入式技術(shù)的知識面非常廣,學(xué)起來(lái)往往不知道如何下手,我們通過(guò)這一小節給大家闡述一下嵌入式技術(shù)應該從哪里開(kāi)始學(xué)起,以及按照什么樣的步驟深入下去,最后順利入門(mén),成為一個(gè)合格的嵌入式工程師。 這節的教程很重要,希望通過(guò)這次的講解能起到提綱挈領(lǐng)的作用,讓大家能夠在大量的學(xué)習資料中有一個(gè)比較清晰的學(xué)習脈絡(luò )。 前面已經(jīng)介紹過(guò),嵌入式系統的學(xué)習方法,首先要掌握架構,那么什么是架構呢,這里再強調一遍,那就是要搞清楚幾個(gè)概念:弄明白什么是 BootLoadre 引導程序,什么是 Linux 操作系統內核 Kernel,什么是文件系統。這個(gè)很重要,如果搞不明白,直接去學(xué)其他的內容,學(xué)起來(lái)就比較迷糊,實(shí)際上是在走彎路,這里推薦大家首先要看一篇文章,也就是迅為用戶(hù) QQ 群的一個(gè)聊天記錄:《澄清幾個(gè)基本概念-迅為QQ 群聊天記錄》,這個(gè)文件在迅為 QQ 群的共享里有,在網(wǎng)盤(pán)里也有提供,大家可以去研讀一下。 相信大家看了這個(gè)對話(huà)以后,就應該明白 u-boot、Kernel 和文件系統這幾個(gè)文件的作用和意義。接下來(lái)大多數工作都是圍繞這幾個(gè)文件展開(kāi)的,比如編譯環(huán)境的搭建,源代碼的編譯和燒寫(xiě), 應用程序和驅動(dòng)程序的編程等等,就是說(shuō)這幾個(gè)文件是貫穿我們整個(gè)嵌入式學(xué)習的始終的。把這幾個(gè)文件搞明白了,后面的學(xué)習也就有了目標,所以說(shuō)搞明白這幾個(gè)文件的含義非常重要。 接下來(lái)需要我們做的是搭建編譯環(huán)境,在教程里建議大家安裝 64 位的 WIN7 系統,并且在 WIN7 或者 WIN10 系統上安裝虛擬機,然后在虛擬機上再安裝 ubuntu。這里需要說(shuō)明的是,大家在初學(xué)的時(shí)候要盡量按照教程里的方法一步步的來(lái),這樣學(xué)習的效率比較高,如果你使用 XP 系統或者 WIN8 系統不是說(shuō)不行,但是在安裝和編譯過(guò)程可能遇到很多別人沒(méi)有遇到的問(wèn)題,解決起來(lái)就比較麻煩,所以在可能的情況下一定要按照手冊的要求來(lái)做,尤其是初學(xué)者;當然大家熟練以后可以去做下創(chuàng )新,做不同的嘗試。 安裝編譯環(huán)境是個(gè)很費事的過(guò)程,雖然說(shuō)沒(méi)有太多的技術(shù)含量,但是在這個(gè)過(guò)程中也要客服很多困難,開(kāi)源系統就是這樣,時(shí)常會(huì )遇到一些這樣那樣的問(wèn)題,很多時(shí)候是不可預測的, 或許大家會(huì )覺(jué)得安裝系統是浪費時(shí)間很困惑,其實(shí)這個(gè)過(guò)程也是很重要的,中間要學(xué)習很多的知識,只要大家不怕折騰,這些過(guò)程當中的困難都是可以克服的,迅為公司為了讓大家少走彎路,已經(jīng)把安裝步驟做了很大程度的簡(jiǎn)化,比如已經(jīng)做好了虛擬機的 ubuntu 鏡像,直接拷貝進(jìn)去就可以使用了。 開(kāi)發(fā)環(huán)境搭建起來(lái)以后,這個(gè)時(shí)候可以學(xué)習一下對源碼進(jìn)行編譯,同時(shí)也可以學(xué)習一下燒寫(xiě),一步步按照教程去做就可以了。再次強調一下,所有這些工作都是圍繞我們前面所講的那三個(gè)文件進(jìn)行的,也就是 Uboot, Kernel 和文件系統。 系統的編譯和燒寫(xiě)都是依賴(lài)于這個(gè)開(kāi)發(fā)環(huán)境的,也就是必須在虛擬機上安裝好 ubuntu, 并且把源代碼從光盤(pán)中拷貝到 ubuntu 的環(huán)境下面,只要按照教程的提示往下做就可以了。 在熟練掌握系統的編譯和燒寫(xiě)以后,就可以進(jìn)一步開(kāi)始嵌入式開(kāi)發(fā)了,那么這個(gè)時(shí)候建議先學(xué)習一下Linux 應用程序的設計,也就是按照教程開(kāi)始逐步深入。 這個(gè)時(shí)候要按照網(wǎng)盤(pán)里的‘iTOP-4412 開(kāi)發(fā)板視頻教程及其相關(guān)’里的‘嵌入式 linux 視頻’進(jìn)行學(xué)習。大家在初學(xué)的時(shí)候,還是要按照這個(gè)實(shí)驗的順序來(lái)走一遍,這里強調兩個(gè)方面,來(lái)幫助大家理解: 一、第一個(gè)實(shí)驗也就是第 0 個(gè),是制作 linux 的最小系統,那么什么是最小系統呢,就是 Linux 運行的時(shí)候能跑的起來(lái)的最小系統,也就是說(shuō)我們在文件系統當中把圖形系統的內容從這個(gè)文件系統里面砍掉了;在很多設備里面,比如說(shuō)路由器,或者一些通訊類(lèi)或者控制類(lèi)的產(chǎn)品中是不需要圖形界面的,這樣我們就可以做一個(gè)簡(jiǎn)化的 Linux 文件系統,這時(shí)候最小系統的設計就排上用場(chǎng)了。 二、這些實(shí)驗都是通過(guò)燒寫(xiě)文件系統的方式來(lái)測試的,其實(shí)有一種比較簡(jiǎn)單和實(shí)用的方 法,那就是通過(guò)網(wǎng)絡(luò )文件系統來(lái)進(jìn)行(NFS),至于什么是 NFS,以及如何搭建,大家一定要學(xué)習一下,具體可以參考第 12個(gè)試驗,就是‘實(shí)驗 12’,因為將來(lái)我們調試應用程序或者驅動(dòng)都是要通過(guò)這個(gè)手段來(lái)進(jìn)行的,它是公認的比較好用的調試辦法。也就是說(shuō)我們這些實(shí)驗回過(guò)頭來(lái),都是可以通過(guò) NFS 來(lái)進(jìn)行調試的,這時(shí)候就不用每次燒寫(xiě),整個(gè)調試工作變得更容易,在實(shí)際的 Linux 調試中,多數是通過(guò)這種方式來(lái)進(jìn)行的。所以說(shuō)大家一定要學(xué)會(huì ) NFS 的調試方法。 學(xué)完 Linux 的應用程序設計,接著(zhù)應該學(xué)習一下 Linux 驅動(dòng)方面的編程了。Linux 驅動(dòng)程序全部掌握是非常困難的,但是要明確我們的目標是能利用 Linux 這個(gè)操作系統來(lái)開(kāi)發(fā)產(chǎn)品。 大家都知道,Linux 的驅動(dòng)分為網(wǎng)絡(luò )設備驅動(dòng)、塊設備驅動(dòng)以及字符類(lèi)設備驅動(dòng),如前面所述,我們只需要把字符類(lèi)設備的驅動(dòng)掌握好就可以了。 因為在開(kāi)發(fā)產(chǎn)品的時(shí)候,網(wǎng)絡(luò )設備以及塊設備驅動(dòng)在開(kāi)發(fā)套件里都是做好的,直接用就可以了,幾乎沒(méi)有人從頭去做,就算開(kāi)發(fā)不同的網(wǎng)絡(luò )接口驅動(dòng),也是直接把現成寫(xiě)好的驅動(dòng)拿來(lái)直接調試一下。所以說(shuō)塊設備和網(wǎng)絡(luò )設備不需要我們去太多關(guān)注,但是對于字符類(lèi)設備驅動(dòng)就需要我們仔細研究并且完全掌握了,那么最基本的字符類(lèi)驅動(dòng)就是針對 GPIO 的驅動(dòng)設計,這個(gè)是一定要掌握的。比如我們的產(chǎn)品增加一個(gè)步 進(jìn)電機,驅動(dòng)幾個(gè)開(kāi)關(guān)、繼電器、采集電流電壓模擬量、擴展并對外部 RAM 內存數據的讀取等等,都是基本的字符類(lèi)的驅動(dòng),至于 RFID、GPS 模塊、GPRS 模塊、CAN 總線(xiàn)等等實(shí)際都是利用 Linux 本身已經(jīng)做好的驅動(dòng),歸根到底是使用串口、I2C 以及 SPI 等來(lái)實(shí)現的,很多開(kāi)發(fā)并不需要我們做什么。對于網(wǎng)絡(luò )設備,只需要在上層做個(gè)應用程序,用 SOCKET 來(lái)實(shí)現數據通訊就可以了。 那么在學(xué)習這部分內容之前呢,建議大家讀一下另一個(gè)聊天記錄:‘Linux 驅動(dòng)初探_精英版 QQ 群聊天記錄.doc’,這個(gè)文檔會(huì )對大家理解驅動(dòng)的架構很有好處。 那么我們前面說(shuō)到了,應用程序的調試要通過(guò) NFS 來(lái)進(jìn)行,驅動(dòng)也是這樣的,而且要學(xué)會(huì )用模塊的方法來(lái)調試驅動(dòng)。 我們在 Android 的視頻中比較詳細的介紹了 Linux 的底層如何構建 LED 的驅動(dòng)程序。除此之外呢,我們會(huì )在補充文檔里面跟大家說(shuō)明如何使用模塊,也就是 module 的方法來(lái)調試驅動(dòng)程序。掌握這些方法是很重要的。也就是說(shuō)大家一定要掌握通過(guò) module 的方法動(dòng)態(tài)加載和卸載驅動(dòng)來(lái)調試驅動(dòng)程序。 當大家熟練學(xué)會(huì )了以上強調的 Linux 系統的開(kāi)發(fā)技術(shù),我想大家對 Linux 的體系有了基本的了解,這個(gè)時(shí)候其實(shí)已經(jīng)算是入門(mén)了,也就是說(shuō)可以嘗試去做一些產(chǎn)品,并不是說(shuō)我們對 Linux 的源碼分析一遍才能真正做事情,不是那樣的,我們的目標是做產(chǎn)品,學(xué)會(huì )利用 Linux 這個(gè)操作系統,開(kāi)發(fā)出目標產(chǎn)品! ![]() ![]() |