嵌入式系統(tǒng)移植步驟詳解

移植

下面我們就來看下一個內(nèi)容叫做移植的基本步驟,也就是說我們要現(xiàn)有一個大體的思路,如果說我作為產(chǎn)品開發(fā)者,或者說是作為一個系統(tǒng)的整體架構(gòu)來說,我們拿到一款板子過后我們是如何一步一步把我們的系統(tǒng)用起來呢?它整個系統(tǒng)流程又是什么樣的,我們先要有個明確目標,第一個目標是我們要保證PC也就是我們的開發(fā)機器跟目標機也就是開發(fā)板或者說最終要做成產(chǎn)品的板子的硬件它們倆之間的連接方式。

因為我們在嵌入式開發(fā)中有一個很麻煩的事情就是開發(fā)板的能力跟PC的能力一般是不平等的,大家都知道PC的功能很強大也很貴而板子很便宜可能一個小系統(tǒng)一個路由器也就幾十塊錢,但是我們總不能在路由器上接個鍵盤接個鼠標然后裝一個VC,在這里是不現(xiàn)實的,所以說我們一般的開發(fā)環(huán)境跟ARM講的內(nèi)容都是一樣的,都是在主機上開發(fā)最終把主機編譯好的內(nèi)容跟我們的目標機進行一個數(shù)據(jù)傳輸,所以這就涉及到一個非常重要的問題。

數(shù)據(jù)傳輸?shù)姆绞健R驗槲覀償?shù)據(jù)無外乎就是高低電平這幾種,那么傳播有哪些傳播方式呢?

如圖,所以我們?nèi)绻鳛橐粋€產(chǎn)品的研發(fā)者來說,你第一個需要考慮的就是我們是怎么連的。

那么給大家來列出了一下,目前來說,我們的PC跟我們的開發(fā)板的連接也就大概如上圖四種比較常用的方式。第一種就是我們最經(jīng)典90%的板子上,都支持的方式叫異部串行接口,也就是我們所說的串口。那么這個串口傳輸在我們之前學習ARM的時候也學習到過,其實別看它很簡單,其實它的功能很強大。它既可以輸入也可以輸出,所以說我們基本上完成了一個輸入輸出這樣數(shù)據(jù)出和進的功能。

所以說串口是我們比較常用的一個接口。但是它還是有它的特點就是它的速度比較低,因為比如說我們前面所配的速度是11520那這個其實是很低的,不是很高。因為他11520B比特也就是傳多少位多少個高低電平的字節(jié),所以說這個效率不是很高但是實用性比較強就幾個接口就可以。

我們舉個典型的例子就是家里的路由器,如果大家有興趣,就把家里的老路由器拆下來看一下路由器里面一般都有3個架子或4個架子,3個小插針或4個小插針無外乎就幾個電壓,一個是D一個是電源很多情況下,路由器都會引出這個東西。如果你的動手能力比較強,你就去市場上買一個叫DB9的一個小頭子,拿個烙鐵把那里面的幾根線給焊上去。然后就跟PC一接,就可能會看到路由器的一些打印信息。所以說串口在我們嵌入式開發(fā)中算是一個非常經(jīng)典的跟PC之間通信的一個接口。

因為大家可以想一下,這個串口既可以輸出我們可以把開發(fā)板上的信息往我們的平臺上去看。甚至來說,我們還可以通過串口把PC里面的東西傳到開發(fā)板中,所以他說輸入輸出都可以,這樣的話串口也算是一個比較萬能的接口,它唯一的缺陷就是速度太低,如果我們傳輸一些大數(shù)據(jù)比如說以后我們會看到的安卓中的一些東西,安卓中涉及到的其實跟我們所學的也是一樣,他比較麻煩的就是文件系統(tǒng)支柱,文件系統(tǒng)少的可能就要幾百兆,或者說壓縮過后就是幾十兆。那你可以想象一下,我們?nèi)绻?1520去傳,有的時候就要傳送一二十分鐘,這樣很影響開發(fā)效率的。

所以說用串口如果是小文件沒有關(guān)系,但大文件一般情況下用串口傳輸?shù)目赡苄圆淮?。如果說你的板子功能比較強,傳的東西比較多,這種情況下用串口我們還是不建議。

那么現(xiàn)在我們就需要換一下,串口我們可以把它當作后備資源。

然后我們就要使用如上圖所說的USB。隨著USB的發(fā)展,從USB1.0到2.0、3.0,它的速度越來越快。那么這個傳輸數(shù)據(jù)我們就不用擔心,它速度快是沒有問題的,但是現(xiàn)在唯一比較擔心的一個問題就是板子剛剛上電,就讓他用串口去工作,這個是不現(xiàn)實的。所以這種情況下,我們還涉及到在開發(fā)板要把串口的驅(qū)動做好。所以說這個時候我們還要考慮驅(qū)動的問題,到底支不支持如果不支持或者開發(fā)的周期比較長,那么串口就不把它作為目標機和主機連接的主要方式了。以上就是我們的串口。

串口退而求其次就還有一種叫做網(wǎng)絡(luò)接口,這個網(wǎng)絡(luò)接口也是我們嵌入式開發(fā)中使用很普遍的一個接口。

如上圖因為這個TCP/IP這個協(xié)議已經(jīng)很成熟了。

因為我們的PC本身就是TCP/IP中很重要的一個端口,比如你可以作為服務(wù)器,也可以作為客戶端,然后我們的開發(fā)板也只需要跑一個服務(wù)器或者客戶端就可以跟PC以CS的模式進行數(shù)據(jù)的傳輸和下載。所以說這個方式也是比較通用的而且說網(wǎng)卡的數(shù)據(jù)和速率都比較快最少最少都是十兆而且現(xiàn)在百兆網(wǎng)卡都是非常多的。這樣的話,傳輸速率肯定是比11520是快得多。

所以說在我們后期課程中,大家會看到我們通過網(wǎng)絡(luò)接口去下載數(shù)據(jù)的情況是比較多的。

驅(qū)動也是一樣的它也需要移植,但相對而言,它可能要比USB上要方便一點,因為USB它涉及到速率,就是說它有些時序需要調(diào)整,可能會有一些麻煩,所以說對于TCP/IP中的網(wǎng)卡我們一般來說是優(yōu)于USB去選擇的。

最后一個叫做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)試接口一臺就要一萬塊錢,所以這樣來說,如果你為了學習花一萬塊錢是得不償失的。所以這種情況除非真的是你們公司去開發(fā)跟ARM公司出芯片比較多才可能去買一臺Debug Jtag調(diào)試接口。

當然Debug Jtag調(diào)試接口很方便,比上面三種都更好調(diào)試,調(diào)試效率也要高的多但是就是價格太高了,所以說我們個人學習已經(jīng)很多企業(yè)來說更多的還是用以上的三種。

以上就是我們移植的第一個步驟,就是關(guān)于我們主機和目標機的連接方式。

交叉編譯器

有了上面那個連接方式下一個就是交叉編譯器了。

交叉編譯器,在我們后面就會講到所謂的交叉編譯器它其實就是我們很多情況下在開發(fā)項目中必備的一個工具。因為我們一般的開發(fā)在PC,而PC很顯然大家知道它的架構(gòu)是在X86,但現(xiàn)在很顯然,我們X86的程序跟ARM程序肯定是不兼容的,這樣的話我們就需要一個交叉編譯器來進行相應(yīng)的編譯開發(fā),也就是說我們開發(fā)的程序不能開發(fā)成X86,也就是說X86里面的二進制程序下載到ARM開發(fā)板上ARM是不認識的,這樣的話,程序是不能相通的,所以說以上就是我們需要安裝交叉編譯器的一個道理。

如圖,安裝交叉編譯器也有兩種方法,一般情況下是第一種就是芯片廠商已經(jīng)給好的因為你買的芯片一般都有。第二種就是我們自己手動的去編譯,自己動手編譯交叉工具鏈,手動編譯如果大家想做可以做但是它非常耗時間甚至來說遇到的問題可能會特別特別多,他有很多不兼容的問題這個他是需要一定的功底去調(diào)試非常麻煩,所以不推薦新手去做,甚至很多公司都不會自己貿(mào)然用編譯器去做產(chǎn)品開發(fā)。

但是如果有興趣的同學可以下去搜索一本書“The GNU Toolchain for ARM Target HOWTO”這其實也是一本官方手冊,它會告訴你如何去做一個相關(guān)的工具鏈。當然這個工具念在制作的時候,他的方法比較單一,思路也比較單一,那唯一不好,就是他的版本之前依賴關(guān)系比較大,你可能會需要一些手動的去修改這些要做的比較多,所以對于編譯原理你要知道的很清楚去找到問題所在點去編,所以相對而言比較耗時甚至編不通過很麻煩,所以這個部分一般情況下不建議使用。

更多時候我們用的是芯片廠商提供好的,那么芯片廠商提供的芯片,一般情況下有這么幾種前綴名。

如圖,就說在安裝過后,都會有一些前綴名,我先簡單的說一下它的意義。最常用的是這一種叫做“arm-none-linux-gnueabi-”他的意思是第一例就是說目標題結(jié)構(gòu)也就是說,這個工具目的是做什么的,比如說最典型的gcc什么都沒寫他默認就是編譯X86,如果我這里有ARM說明他這個編譯器編譯的是ARM,記住這個編譯器他其實是個集合,我只列出了前綴也就說他這個地方實際上隱含了一個概念叫g(shù)cc,也就是說相當于用了圖上加黑的那個工具,只是說,我們現(xiàn)在更多的時候是用的一個前綴,我們后面還會講到很多工具集,所以我們記這個前綴而不記后面的這個命令,前綴的第一個單詞就是你最終生成的編譯器和生成的體系結(jié)構(gòu),第二個就是廠商名一般如果你是開源的話就是none,比如說你是三星的話那就是ARM_sanxin,一般都是none。然后第三個linux也就是我們這個程序默認編譯出來的功能是針對linux操作系統(tǒng)去用的,也就是這個好處在于這個編譯器它的內(nèi)部有一些標準C庫而這個C庫是跟linux的接口相關(guān)的,也就是這個軟件編譯出來的可執(zhí)行程序不能在windows下運行的。 這樣的話這個工具鏈就專門針對于Linux操作系統(tǒng)運行。而且是ARM下的Linux操作系統(tǒng)而不是Windows,然后后面的那個詞gun大家都知道是開源的,而eabi指的是我們嵌入式的標準接口,它主要針對的是嵌入式精簡的一些相關(guān)庫所以說是eabi,還有一個是oabi是老的,我們現(xiàn)在基本上都是用的eabi的系統(tǒng),主要由ARM的優(yōu)化選項來決定的,這個我們到時候看到ARM優(yōu)化的那一章內(nèi)容可以去學習一下。

一般情況下“arm-none-linux-gnueabi-”這個名字太長了我們也不想去記所以就干脆把它簡稱為“arm-linux-”所以有些時候你經(jīng)常會看到有些編譯器中都做了一個小技巧,把“arm-linux-”和“arm-none-linux-gnueabi-”做了一個快捷方式,就是軟鏈接,把兩個名字關(guān)聯(lián)起來,也就是輸入其中一個名字就相當于在輸入另一個名字。所以這一組就是比較常用的形式。

后面還可能會接觸一些,比如“arm-none-eabi-”就是沒有Linux的,沒有Linux這款編輯器一般代表不能在有操作系統(tǒng)的ARM上運行,因為它不支持操作系統(tǒng),所以這就是一款比較新的,而下面這個“rm-elf-”是非常老的,也是針對于無操作系統(tǒng)或者可能有操作系統(tǒng)也支持,只是這個是非常老的,很少能見到。主要見到的是前兩種。

以上就是我們安裝的工具鏈,其實工具鏈一般來說找廠商要就可以或者說你實在要不到也沒關(guān)系,比如說下載安卓后其實它自動就把編譯器給編譯出來了,你可以直接把它拷出來用也可以。或者說你可以去找一個公司,這個公司現(xiàn)在已經(jīng)被收購了,但是大家可以注意去查叫做“codesourcery”雖然它已經(jīng)被收購,但是它其實也是提供交叉編譯器的工具,大家如果有興趣也可以去網(wǎng)上搜一下,然后去注冊一下那個收購公司的賬號下下來也可以。但是一般來說,用我們光盤已經(jīng)配置好的編譯器也問題不大。

其上就是我們說的第二個部分安裝交叉編譯器。

目標機傳輸通道

第三個部分:搭建主機,目標機傳輸通道。我們就要想辦法確定連接方法后就要準備搭建傳輸通道的一些所具備的服務(wù)和客戶。比如說我們用網(wǎng)絡(luò),最顯然就涉及到服務(wù)配置。

如圖,有服務(wù)器有客戶端,這樣來說網(wǎng)絡(luò)就可以成功傳輸數(shù)據(jù)。所以說一般情況下在嵌入式中我們用的比較多的服務(wù)就兩個,在Linux下一個叫TFTP一個叫NFS,TFTP顧名思義就是FTP的一個簡版,它是基于UDP傳輸?shù)?,相當于它的協(xié)議比較簡單。而NFS它的全名叫做網(wǎng)絡(luò)文件系統(tǒng),這個網(wǎng)絡(luò)文件系統(tǒng)主要是Linux和Linux之間做掛載用的,那么這個用處應(yīng)該是非常大,比如說我們在后面學文件系統(tǒng)的調(diào)試的時候,我們很多時候都會用NFS作為我們調(diào)試的一個基本應(yīng)用工具,所以這也是我們在搭建開發(fā)環(huán)境中的第三步。

燒寫測試

最后,都準備好后,剩下就是一件事情也是最難的一件事情,就是把我們之前那三個子系統(tǒng)的功能全部做好,假如我們已經(jīng)有這樣的功能我們就把它們相應(yīng)的編譯出來,編譯后剩下的最后一步就是燒寫測試,最后把它整個集成放到工廠然后就開始集成化生產(chǎn)。

以上,就是基本的移植步驟,而具體編譯三大系統(tǒng)就是我們后面的課程需要掌握的內(nèi)容,最后我們在每一個內(nèi)容中都涉及到怎么去燒寫它。


原文鏈接:http://www.maiziedu.com/wiki/embed/step/


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容