移植
下面我們就來看下一個(gè)內(nèi)容叫做移植的基本步驟,也就是說我們要現(xiàn)有一個(gè)大體的思路,如果說我作為產(chǎn)品開發(fā)者,或者說是作為一個(gè)系統(tǒng)的整體架構(gòu)來說,我們拿到一款板子過后我們是如何一步一步把我們的系統(tǒng)用起來呢?它整個(gè)系統(tǒng)流程又是什么樣的,我們先要有個(gè)明確目標(biāo),第一個(gè)目標(biāo)是我們要保證PC也就是我們的開發(fā)機(jī)器跟目標(biāo)機(jī)也就是開發(fā)板或者說最終要做成產(chǎn)品的板子的硬件它們倆之間的連接方式。
因?yàn)槲覀冊谇度胧介_發(fā)中有一個(gè)很麻煩的事情就是開發(fā)板的能力跟PC的能力一般是不平等的,大家都知道PC的功能很強(qiáng)大也很貴而板子很便宜可能一個(gè)小系統(tǒng)一個(gè)路由器也就幾十塊錢,但是我們總不能在路由器上接個(gè)鍵盤接個(gè)鼠標(biāo)然后裝一個(gè)VC,在這里是不現(xiàn)實(shí)的,所以說我們一般的開發(fā)環(huán)境跟ARM講的內(nèi)容都是一樣的,都是在主機(jī)上開發(fā)最終把主機(jī)編譯好的內(nèi)容跟我們的目標(biāo)機(jī)進(jìn)行一個(gè)數(shù)據(jù)傳輸,所以這就涉及到一個(gè)非常重要的問題。
數(shù)據(jù)傳輸?shù)姆绞健R驗(yàn)槲覀償?shù)據(jù)無外乎就是高低電平這幾種,那么傳播有哪些傳播方式呢?

如圖,所以我們?nèi)绻鳛橐粋€(gè)產(chǎn)品的研發(fā)者來說,你第一個(gè)需要考慮的就是我們是怎么連的。
那么給大家來列出了一下,目前來說,我們的PC跟我們的開發(fā)板的連接也就大概如上圖四種比較常用的方式。第一種就是我們最經(jīng)典90%的板子上,都支持的方式叫異部串行接口,也就是我們所說的串口。那么這個(gè)串口傳輸在我們之前學(xué)習(xí)ARM的時(shí)候也學(xué)習(xí)到過,其實(shí)別看它很簡單,其實(shí)它的功能很強(qiáng)大。它既可以輸入也可以輸出,所以說我們基本上完成了一個(gè)輸入輸出這樣數(shù)據(jù)出和進(jìn)的功能。
所以說串口是我們比較常用的一個(gè)接口。但是它還是有它的特點(diǎn)就是它的速度比較低,因?yàn)楸热缯f我們前面所配的速度是11520那這個(gè)其實(shí)是很低的,不是很高。因?yàn)樗?1520B比特也就是傳多少位多少個(gè)高低電平的字節(jié),所以說這個(gè)效率不是很高但是實(shí)用性比較強(qiáng)就幾個(gè)接口就可以。
我們舉個(gè)典型的例子就是家里的路由器,如果大家有興趣,就把家里的老路由器拆下來看一下路由器里面一般都有3個(gè)架子或4個(gè)架子,3個(gè)小插針或4個(gè)小插針無外乎就幾個(gè)電壓,一個(gè)是D一個(gè)是電源很多情況下,路由器都會引出這個(gè)東西。如果你的動手能力比較強(qiáng),你就去市場上買一個(gè)叫DB9的一個(gè)小頭子,拿個(gè)烙鐵把那里面的幾根線給焊上去。然后就跟PC一接,就可能會看到路由器的一些打印信息。所以說串口在我們嵌入式開發(fā)中算是一個(gè)非常經(jīng)典的跟PC之間通信的一個(gè)接口。
因?yàn)榇蠹铱梢韵胍幌?,這個(gè)串口既可以輸出我們可以把開發(fā)板上的信息往我們的平臺上去看。甚至來說,我們還可以通過串口把PC里面的東西傳到開發(fā)板中,所以他說輸入輸出都可以,這樣的話串口也算是一個(gè)比較萬能的接口,它唯一的缺陷就是速度太低,如果我們傳輸一些大數(shù)據(jù)比如說以后我們會看到的安卓中的一些東西,安卓中涉及到的其實(shí)跟我們所學(xué)的也是一樣,他比較麻煩的就是文件系統(tǒng)支柱,文件系統(tǒng)少的可能就要幾百兆,或者說壓縮過后就是幾十兆。那你可以想象一下,我們?nèi)绻?1520去傳,有的時(shí)候就要傳送一二十分鐘,這樣很影響開發(fā)效率的。
所以說用串口如果是小文件沒有關(guān)系,但大文件一般情況下用串口傳輸?shù)目赡苄圆淮?。如果說你的板子功能比較強(qiáng),傳的東西比較多,這種情況下用串口我們還是不建議。
那么現(xiàn)在我們就需要換一下,串口我們可以把它當(dāng)作后備資源。
然后我們就要使用如上圖所說的USB。隨著USB的發(fā)展,從USB1.0到2.0、3.0,它的速度越來越快。那么這個(gè)傳輸數(shù)據(jù)我們就不用擔(dān)心,它速度快是沒有問題的,但是現(xiàn)在唯一比較擔(dān)心的一個(gè)問題就是板子剛剛上電,就讓他用串口去工作,這個(gè)是不現(xiàn)實(shí)的。所以這種情況下,我們還涉及到在開發(fā)板要把串口的驅(qū)動做好。所以說這個(gè)時(shí)候我們還要考慮驅(qū)動的問題,到底支不支持如果不支持或者開發(fā)的周期比較長,那么串口就不把它作為目標(biāo)機(jī)和主機(jī)連接的主要方式了。以上就是我們的串口。
串口退而求其次就還有一種叫做網(wǎng)絡(luò)接口,這個(gè)網(wǎng)絡(luò)接口也是我們嵌入式開發(fā)中使用很普遍的一個(gè)接口。
如上圖因?yàn)檫@個(gè)TCP/IP這個(gè)協(xié)議已經(jīng)很成熟了。
因?yàn)槲覀兊腜C本身就是TCP/IP中很重要的一個(gè)端口,比如你可以作為服務(wù)器,也可以作為客戶端,然后我們的開發(fā)板也只需要跑一個(gè)服務(wù)器或者客戶端就可以跟PC以CS的模式進(jìn)行數(shù)據(jù)的傳輸和下載。所以說這個(gè)方式也是比較通用的而且說網(wǎng)卡的數(shù)據(jù)和速率都比較快最少最少都是十兆而且現(xiàn)在百兆網(wǎng)卡都是非常多的。這樣的話,傳輸速率肯定是比11520是快得多。
所以說在我們后期課程中,大家會看到我們通過網(wǎng)絡(luò)接口去下載數(shù)據(jù)的情況是比較多的。
驅(qū)動也是一樣的它也需要移植,但相對而言,它可能要比USB上要方便一點(diǎn),因?yàn)閁SB它涉及到速率,就是說它有些時(shí)序需要調(diào)整,可能會有一些麻煩,所以說對于TCP/IP中的網(wǎng)卡我們一般來說是優(yōu)于USB去選擇的。
最后一個(gè)叫做Debug Jtag調(diào)試接口,也就是說如果你是ARM CPU的話,那么ARM中還有一些相關(guān)Debug Jtag的ICE,也就是說它內(nèi)部會集成一些這樣的東西,然后可能你的廠商會提供這樣的調(diào)制接口。比如說ARM9就有,但是像A系列的開發(fā)板一般來說很少在市面上能夠買得到它的調(diào)制接口。也就是Debug Jtag調(diào)試接口。也不是說沒有,我們曾經(jīng)聯(lián)系A(chǔ)RM公司問過像Debug Jtag調(diào)試接口一臺就要一萬塊錢,所以這樣來說,如果你為了學(xué)習(xí)花一萬塊錢是得不償失的。所以這種情況除非真的是你們公司去開發(fā)跟ARM公司出芯片比較多才可能去買一臺Debug Jtag調(diào)試接口。
當(dāng)然Debug Jtag調(diào)試接口很方便,比上面三種都更好調(diào)試,調(diào)試效率也要高的多但是就是價(jià)格太高了,所以說我們個(gè)人學(xué)習(xí)已經(jīng)很多企業(yè)來說更多的還是用以上的三種。
以上就是我們移植的第一個(gè)步驟,就是關(guān)于我們主機(jī)和目標(biāo)機(jī)的連接方式。
交叉編譯器
有了上面那個(gè)連接方式下一個(gè)就是交叉編譯器了。
交叉編譯器,在我們后面就會講到所謂的交叉編譯器它其實(shí)就是我們很多情況下在開發(fā)項(xiàng)目中必備的一個(gè)工具。因?yàn)槲覀円话愕拈_發(fā)在PC,而PC很顯然大家知道它的架構(gòu)是在X86,但現(xiàn)在很顯然,我們X86的程序跟ARM程序肯定是不兼容的,這樣的話我們就需要一個(gè)交叉編譯器來進(jìn)行相應(yīng)的編譯開發(fā),也就是說我們開發(fā)的程序不能開發(fā)成X86,也就是說X86里面的二進(jìn)制程序下載到ARM開發(fā)板上ARM是不認(rèn)識的,這樣的話,程序是不能相通的,所以說以上就是我們需要安裝交叉編譯器的一個(gè)道理。

如圖,安裝交叉編譯器也有兩種方法,一般情況下是第一種就是芯片廠商已經(jīng)給好的因?yàn)槟阗I的芯片一般都有。第二種就是我們自己手動的去編譯,自己動手編譯交叉工具鏈,手動編譯如果大家想做可以做但是它非常耗時(shí)間甚至來說遇到的問題可能會特別特別多,他有很多不兼容的問題這個(gè)他是需要一定的功底去調(diào)試非常麻煩,所以不推薦新手去做,甚至很多公司都不會自己貿(mào)然用編譯器去做產(chǎn)品開發(fā)。
但是如果有興趣的同學(xué)可以下去搜索一本書“The GNU Toolchain for ARM Target HOWTO”這其實(shí)也是一本官方手冊,它會告訴你如何去做一個(gè)相關(guān)的工具鏈。當(dāng)然這個(gè)工具念在制作的時(shí)候,他的方法比較單一,思路也比較單一,那唯一不好,就是他的版本之前依賴關(guān)系比較大,你可能會需要一些手動的去修改這些要做的比較多,所以對于編譯原理你要知道的很清楚去找到問題所在點(diǎn)去編,所以相對而言比較耗時(shí)甚至編不通過很麻煩,所以這個(gè)部分一般情況下不建議使用。
更多時(shí)候我們用的是芯片廠商提供好的,那么芯片廠商提供的芯片,一般情況下有這么幾種前綴名。

如圖,就說在安裝過后,都會有一些前綴名,我先簡單的說一下它的意義。最常用的是這一種叫做“arm-none-linux-gnueabi-”他的意思是第一例就是說目標(biāo)題結(jié)構(gòu)也就是說,這個(gè)工具目的是做什么的,比如說最典型的gcc什么都沒寫他默認(rèn)就是編譯X86,如果我這里有ARM說明他這個(gè)編譯器編譯的是ARM,記住這個(gè)編譯器他其實(shí)是個(gè)集合,我只列出了前綴也就說他這個(gè)地方實(shí)際上隱含了一個(gè)概念叫g(shù)cc,也就是說相當(dāng)于用了圖上加黑的那個(gè)工具,只是說,我們現(xiàn)在更多的時(shí)候是用的一個(gè)前綴,我們后面還會講到很多工具集,所以我們記這個(gè)前綴而不記后面的這個(gè)命令,前綴的第一個(gè)單詞就是你最終生成的編譯器和生成的體系結(jié)構(gòu),第二個(gè)就是廠商名一般如果你是開源的話就是none,比如說你是三星的話那就是ARM_sanxin,一般都是none。然后第三個(gè)linux也就是我們這個(gè)程序默認(rèn)編譯出來的功能是針對linux操作系統(tǒng)去用的,也就是這個(gè)好處在于這個(gè)編譯器它的內(nèi)部有一些標(biāo)準(zhǔn)C庫而這個(gè)C庫是跟linux的接口相關(guān)的,也就是這個(gè)軟件編譯出來的可執(zhí)行程序不能在windows下運(yùn)行的。 這樣的話這個(gè)工具鏈就專門針對于Linux操作系統(tǒng)運(yùn)行。而且是ARM下的Linux操作系統(tǒng)而不是Windows,然后后面的那個(gè)詞gun大家都知道是開源的,而eabi指的是我們嵌入式的標(biāo)準(zhǔn)接口,它主要針對的是嵌入式精簡的一些相關(guān)庫所以說是eabi,還有一個(gè)是oabi是老的,我們現(xiàn)在基本上都是用的eabi的系統(tǒng),主要由ARM的優(yōu)化選項(xiàng)來決定的,這個(gè)我們到時(shí)候看到ARM優(yōu)化的那一章內(nèi)容可以去學(xué)習(xí)一下。
一般情況下“arm-none-linux-gnueabi-”這個(gè)名字太長了我們也不想去記所以就干脆把它簡稱為“arm-linux-”所以有些時(shí)候你經(jīng)常會看到有些編譯器中都做了一個(gè)小技巧,把“arm-linux-”和“arm-none-linux-gnueabi-”做了一個(gè)快捷方式,就是軟鏈接,把兩個(gè)名字關(guān)聯(lián)起來,也就是輸入其中一個(gè)名字就相當(dāng)于在輸入另一個(gè)名字。所以這一組就是比較常用的形式。
后面還可能會接觸一些,比如“arm-none-eabi-”就是沒有Linux的,沒有Linux這款編輯器一般代表不能在有操作系統(tǒng)的ARM上運(yùn)行,因?yàn)樗恢С植僮飨到y(tǒng),所以這就是一款比較新的,而下面這個(gè)“rm-elf-”是非常老的,也是針對于無操作系統(tǒng)或者可能有操作系統(tǒng)也支持,只是這個(gè)是非常老的,很少能見到。主要見到的是前兩種。
以上就是我們安裝的工具鏈,其實(shí)工具鏈一般來說找廠商要就可以或者說你實(shí)在要不到也沒關(guān)系,比如說下載安卓后其實(shí)它自動就把編譯器給編譯出來了,你可以直接把它拷出來用也可以?;蛘哒f你可以去找一個(gè)公司,這個(gè)公司現(xiàn)在已經(jīng)被收購了,但是大家可以注意去查叫做“codesourcery”雖然它已經(jīng)被收購,但是它其實(shí)也是提供交叉編譯器的工具,大家如果有興趣也可以去網(wǎng)上搜一下,然后去注冊一下那個(gè)收購公司的賬號下下來也可以。但是一般來說,用我們光盤已經(jīng)配置好的編譯器也問題不大。
其上就是我們說的第二個(gè)部分安裝交叉編譯器。
目標(biāo)機(jī)傳輸通道
第三個(gè)部分:搭建主機(jī),目標(biāo)機(jī)傳輸通道。我們就要想辦法確定連接方法后就要準(zhǔn)備搭建傳輸通道的一些所具備的服務(wù)和客戶。比如說我們用網(wǎng)絡(luò),最顯然就涉及到服務(wù)配置。

如圖,有服務(wù)器有客戶端,這樣來說網(wǎng)絡(luò)就可以成功傳輸數(shù)據(jù)。所以說一般情況下在嵌入式中我們用的比較多的服務(wù)就兩個(gè),在Linux下一個(gè)叫TFTP一個(gè)叫NFS,TFTP顧名思義就是FTP的一個(gè)簡版,它是基于UDP傳輸?shù)?,相?dāng)于它的協(xié)議比較簡單。而NFS它的全名叫做網(wǎng)絡(luò)文件系統(tǒng),這個(gè)網(wǎng)絡(luò)文件系統(tǒng)主要是Linux和Linux之間做掛載用的,那么這個(gè)用處應(yīng)該是非常大,比如說我們在后面學(xué)文件系統(tǒng)的調(diào)試的時(shí)候,我們很多時(shí)候都會用NFS作為我們調(diào)試的一個(gè)基本應(yīng)用工具,所以這也是我們在搭建開發(fā)環(huán)境中的第三步。
燒寫測試
最后,都準(zhǔn)備好后,剩下就是一件事情也是最難的一件事情,就是把我們之前那三個(gè)子系統(tǒng)的功能全部做好,假如我們已經(jīng)有這樣的功能我們就把它們相應(yīng)的編譯出來,編譯后剩下的最后一步就是燒寫測試,最后把它整個(gè)集成放到工廠然后就開始集成化生產(chǎn)。
以上,就是基本的移植步驟,而具體編譯三大系統(tǒng)就是我們后面的課程需要掌握的內(nèi)容,最后我們在每一個(gè)內(nèi)容中都涉及到怎么去燒寫它。
原文鏈接:http://www.maiziedu.com/wiki/embed/step/