<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于ARM+uClinux的嵌入式系統(tǒng)的開發(fā)

          基于ARM+uClinux的嵌入式系統(tǒng)的開發(fā)

          作者: 時間:2016-12-02 來源:網(wǎng)絡(luò) 收藏
          前些日子基于arm+uClinux開發(fā)了一個網(wǎng)絡(luò)監(jiān)控系統(tǒng),眼看項目馬上要做完了,終于松了一口氣,于是整理了一些筆記和心得想和大家針對這種開發(fā)模式進(jìn)行一些探討,希望對各位有所幫助。
            按照我的開發(fā)過程想分以下幾部分逐一介紹。
              1.開發(fā)平臺的選擇和論證
              2.開發(fā)環(huán)境的建立
              3.一般程序的開發(fā)
              4.Linux程序向ARM+uClinux平臺的移植
              5.剩下的問題
            希望諸位多多補(bǔ)充自己的想法,以利于大家共同提高。


          1. 開發(fā)平臺的選擇和論證

            一個項目拿到手,如何選擇開發(fā)平臺(主要是指CPU和操作系統(tǒng)以及開發(fā)環(huán)境和工具)應(yīng)該說至關(guān)重要,有時這不光影響進(jìn)度,產(chǎn)品質(zhì)量,可維護(hù)性等一般問題,甚至涉及到方案的可實現(xiàn)性。本人結(jié)合自己的網(wǎng)絡(luò)監(jiān)控系統(tǒng)簡單歸納了一些對平臺的考慮,還請各位補(bǔ)充。

          從系統(tǒng)功能實現(xiàn)考慮:
            (1) 是否有片上外設(shè),專用指令或配套的軟件模塊直接實現(xiàn)系統(tǒng)功能要求。 感 覺這一條對很多人的決策影響很大
            (2) 價格
            這一點(diǎn)應(yīng)通過CPU提供的資源綜合考慮,它提供了多少有用的資源,多少沒用的資源(那可都是銀子呀!),還是那三個字,性價比,另一方面,是要抓主要矛盾,是不是有些特性是必須的,什么特性是用戶需求里的亮點(diǎn)(就靠這些亮點(diǎn)往上抬價),這時該花的就得花了。
            (3) 功耗
            本系統(tǒng)對CPU功耗要求不高,但對移動設(shè)備,這一點(diǎn)可是致命,而且這一點(diǎn)不是僅針對CPU,所有幾乎器件都要勒緊褲腰帶運(yùn)行。
            (4) 處理速度
            這項不用多說,大家都明白重要性,但具體算起來可是一門學(xué)問,一方面是自己需要多快的速度,如果加上非實時操作系統(tǒng)這事就不好控制,余量還是大點(diǎn)穩(wěn)妥,另一方面,CPU指令周期多少,有沒有流水,有沒有并行,什么體系結(jié)構(gòu),有沒有專用指令(看人家DSP多牛,干這事一絕),對外部存儲器和外設(shè)的存取速度等等,哪一個慢了都叫瓶頸。
            (5) 需要的硬件支持(如外部存儲器,雙電源等)
            這算是雜項,但會增加額外的價格,系統(tǒng)體積等,不容忽視。

          從開發(fā)者的角度考慮:
            (1) 是否有足夠的技術(shù)支持包括demo版及原理圖,demo程序,操作系統(tǒng)和BSP,測試開發(fā)工具等。
            (2) 自身條件;包括對項目開發(fā)周期的要求,開發(fā)人員對器件和開發(fā)模式的熟悉程度以及掌握的難易程度。
            (3) 可用資源是否豐富(書籍,網(wǎng)絡(luò)等)
             以上三點(diǎn)主要考慮迅速開發(fā)出穩(wěn)定的系統(tǒng)。
            (4) 系統(tǒng)的可繼承性,可移植性和可擴(kuò)展性。
            (5) 是否有現(xiàn)貨。
            (6) 方案提供商的素質(zhì)。(包括技術(shù)水平和服務(wù)意識)。

          根據(jù)以上考慮選擇了s3c4510b(ARM7TDMI)+uClinux開發(fā)模式

          (1) 以下是該平臺對我的系統(tǒng)的滿足情況:(和上面幾點(diǎn)對應(yīng))
          本監(jiān)控系統(tǒng)硬件部分主要要求以下部分:
            a.以太網(wǎng)接口 (s3c4510b自帶網(wǎng)絡(luò)控制器)
            b.串口 (自帶)
            c.與數(shù)據(jù)采集芯片的接口(8位數(shù)據(jù)線,小于8位地址總線)。(自帶)
          本系統(tǒng)軟件部分主要要求以下部分:
            a. 硬件接口驅(qū)動程序 (uClinux提供串口和網(wǎng)絡(luò)控制器驅(qū)動)
            b. 網(wǎng)絡(luò)協(xié)議棧支持(uClinux提供TCPIP,UDP等的協(xié)議棧)
            c. 應(yīng)用層程序(如果算上可以從linux移植的程序來看,那就太多了,我就用到了一個現(xiàn)成的)
          (2) 本應(yīng)用系統(tǒng)不是那種批量的東西,對價格要求不苛刻,而且這款CPU最便宜可以到55左右,可以接受。
          (3) 本應(yīng)用系統(tǒng)有固定電源,功耗要求不高。當(dāng)然,據(jù)說ARM在節(jié)省功耗上很有特點(diǎn)。
          (4) 本應(yīng)用系統(tǒng)速度方面要滿足兩方面:1。串口:115200bps 2。網(wǎng)絡(luò)速度 能到10Mbps就行,所以對系統(tǒng)速度要求也不高。這款A(yù)RM內(nèi)部可以到50M。
          (5) 系統(tǒng)對體積要求也不高,加片flash和RAM還是沒問題(到目前為止感覺我的系統(tǒng)真是無欲無求?。?br />
          從開發(fā)者的角度考慮:
            (1) 因為時間很緊(一個半月),所以支持越多越好。目前從開發(fā)商那里拿到了開發(fā)板,原理圖,uClinux,相應(yīng)驅(qū)動,bootloader,拿來就可以用了。軟件硬件并行開發(fā)。(bootloader和網(wǎng)絡(luò)控制器驅(qū)動沒提供原碼,比較可惜:-(

            (2) 當(dāng)時我對嵌入式系統(tǒng)的開發(fā)模式和ARM都是只有耳聞,linux接觸過一個月左右。現(xiàn)在想起來有些后怕。
            (3) 網(wǎng)上的資源,非常多。
          提供一些我常用的。

          http://www.uclinux.org/uClinux的大本營。
          http://www.ucdot.org/里面有些技術(shù)文章非常不錯。
          http://www.linuxdevices.com/
          http://www.linuxeden.com/這是國產(chǎn)的linux站點(diǎn)。
          uclinux-dev@uclinux.org這是uClinux的郵件列表,回答問題的都是大牛,非常有幫助,記住把你的郵件設(shè)置成純文本格式。 申請是在:
          http://mailman.uclinux.org/mailman/listinfo/uclinux-devweb方式。

            (4) 采用以上開發(fā)模式,軟件的可維護(hù)性,可移植性和可擴(kuò)展性都不錯。
            (5) 目前該CPU使用還是比較普遍,現(xiàn)貨沒問題。
            (6) 方案提供商的素質(zhì)嗎……..還算可以吧:-)

          根據(jù)以上考慮和目前的開發(fā)情況,這套方案還是比較令人滿意。

          今天先回家了,下回介紹具體開發(fā)步鄹吧。

          2.開發(fā)環(huán)境的建立

            先說兩句廢話為和我以前一樣對操作系統(tǒng)(尤其是嵌入式操作系統(tǒng))迷惑的弟兄解釋些概念。因為總是有人在問是不是一定要用操作系統(tǒng),我的CPU能不能移植操作系統(tǒng),可以移植什么操作系統(tǒng),有了操作系統(tǒng)可不可以運(yùn)行某些程序。

            從我的個人經(jīng)歷來講,這其實就是許多硬件出身的弟兄對操作系統(tǒng)這個東西有神秘感(和我一年前一樣)。說白了,操作系統(tǒng)就是一段設(shè)計非常巧妙的程序,和你自己的程序從本質(zhì)講沒有區(qū)別,于是,以上問題轉(zhuǎn)為,我是不是一定要用這段程序,我的CPU能不能運(yùn)行這段程序,可以跑什么樣的程序。這個程序可以跑,調(diào)用這個程序接口的另一個程序能不能跑!
            答案也就變得簡單,操作系統(tǒng)對任何一個CPU都不是必須的(對嵌入式系統(tǒng)更是如此),你可以自己編些程序在沒有操作系統(tǒng)的PC裸機(jī)上跑(BIOS就是這樣的),像玩C51一樣,(雖然奢侈的讓人有些心痛),或者移植UCOS到上面。另一方面,現(xiàn)代操作系統(tǒng)大多需要一些硬件的支持,(像保護(hù)模式的實現(xiàn)),反過來說,高端CPU中專門有針對支持操作系統(tǒng)的體系結(jié)構(gòu),這樣,許多操作系統(tǒng)的實現(xiàn)是挑剔硬件平臺的。其實其它程序也一樣,你編的程序使用的片上外設(shè)另一CPU上沒有,那這段程序就無法移植了。這就是話粗理不粗。書歸正傳,還是聊聊ARM+uClinux開發(fā)模式下開發(fā)環(huán)境的建立(其實下面說到的東西不僅限于這種硬件平臺和操作系統(tǒng))

            很久以前就在介紹嵌入式系統(tǒng)開發(fā)的書上見過“交叉編譯環(huán)境”這詞,當(dāng)時覺得很玄,用了以后才知道,其實就是解決在誰的地盤上用誰的工具編誰的代碼問題。
            編譯的最主要的工作就在將你的程序轉(zhuǎn)化成運(yùn)行該程序的CPU所能識別的機(jī)器代碼,不同的CPU有相應(yīng)的編譯器,另一方面。編譯器本身也是程序,當(dāng)然也要在某一個CPU平臺上運(yùn)行。于是交叉編譯的交叉點(diǎn)就在那個編譯器本身是CPU1上的一個程序,卻在為CPU2編譯代碼(整個一個吃里扒外?。_@么一想,以前用51和dsp的開發(fā)軟件(大部分都是IDE-集成開發(fā)環(huán)境)開發(fā)程序時,都算是交叉編譯啦。當(dāng)然,假如在你的ARM系統(tǒng)上,操作系統(tǒng)已經(jīng)正常運(yùn)行,并且你的資源足夠多,你可以把PC機(jī)上運(yùn)行的ARM編譯工具移植到ARM上,然后所有該系統(tǒng)的應(yīng)用程序都直接在ARM系統(tǒng)上編譯,這就不算交叉編譯,但如果有條件這么作,程序的開發(fā)或者移植就方便多了,因為整個開發(fā)過程又回到在自己PC機(jī)上編應(yīng)用程序的那種模式了,那就是在自己的地盤上用自己的編譯器編自己的應(yīng)用程序。

            與不使用操作系統(tǒng)的開發(fā)模式不同(此處的操作系統(tǒng)尤其指提供了專門的接口函數(shù)庫的操作系統(tǒng),目前的UCOS就不算),在目標(biāo)板(就是實現(xiàn)系統(tǒng)的板子)使用操作系統(tǒng)的開發(fā)模式下,交叉編譯環(huán)境中還需要該對應(yīng)該操作系統(tǒng)的庫。比如uClinux提供的uClibc。此時,開發(fā)用的主機(jī)上不光要有目標(biāo)板 CPU所需的編譯工具,還要有對應(yīng)操作系統(tǒng)的庫,又因為一般庫文件還要在開發(fā)機(jī)上拿目標(biāo)CPU的編譯器重新編譯一下,所以還要把操作系統(tǒng)的原碼也放到開發(fā)機(jī)上。(唉,跟目標(biāo)板沒什么關(guān)系,卻要幫它背這么多東西,真是上輩子欠它的?。。?。

            雖然操作系統(tǒng)的接口庫至關(guān)重要,但大家似乎已經(jīng)淡忘了它的存在。這些多是因為大家已經(jīng)遠(yuǎn)離了刀耕火種的年代(需要告訴編譯器需要的include路徑,lib路徑,以及l(fā)ib的名稱),集成的編譯環(huán)境讓我們編譯鏈接的所有繁瑣工作化作對BUILD按鈕的瀟灑一擊。而且不論是windows環(huán)境,還是 linux環(huán)境,都有環(huán)境變量去記錄這些參數(shù)。。但嘗試將/usr/lib目錄改一個名字,你就會知道你不能無視他們的存在,因為操作系統(tǒng)的功能都是通過這些庫來交給應(yīng)用層程序使用的。當(dāng)然如果你的系統(tǒng)不依靠任何操作系統(tǒng),像最原始的那種完全自己實現(xiàn)所有代碼,就只需要一個編譯工具,少了這些羅嗦事。
            以上的東西一般時候是沒有必要仔細(xì)研究,但交叉環(huán)境下開發(fā)或移植比較大的程序時,你可能就需要了解編譯器,鏈接器等開發(fā)工具的幾乎所有重要參數(shù)。

            我在開發(fā)時,主機(jī)完全使用的是linux,如果有條件,建議大家這樣作,linux的使用沒有想象的復(fù)雜(雖然我現(xiàn)在身邊還要放一本關(guān)于linux使用的書籍),而且開發(fā)程序可以先在主機(jī)上調(diào)通,然后用交叉編譯工具為目標(biāo)系統(tǒng)重新編譯一遍,可以這樣做是因為主機(jī)是linux,目標(biāo)系統(tǒng)跑 uClinux,兩個操作系統(tǒng)提供的應(yīng)用程序接口幾乎是一樣的,所以程序幾乎不用修改。
            在我的系統(tǒng)上,建立基本的開發(fā)環(huán)境過程如下。
            1) 安裝gnu開發(fā)工具鏈(是GNU開發(fā)的針對ARM CPU的一組編譯開發(fā)程序(是linux程序)。包括arm-elf-gcc,arm-elf-ld等
            (2) 將uClinux源代碼源代碼解壓到相應(yīng)路徑下,按照編譯內(nèi)核的步鄹編譯一遍(此時使用的編譯工具已經(jīng)是上面提到的ARM編譯工具了,因為它要在ARM CPU上運(yùn)行,另外,和編譯linux內(nèi)核一樣,此時可以通過menuconfig來對內(nèi)核提供的功能進(jìn)行裁減
            (3) 將庫(uClibc)解壓到相應(yīng)路徑下,用以上工具編譯一遍。
          這樣最基本的環(huán)境就算搭建好了。

            以上工作對于做過的人來說比較簡單,這里介紹一下幫助沒有使用或剛開始使用這種開發(fā)模式的弟兄們理清一下思路。

          3.一般應(yīng)用程序的開發(fā)

            因為目標(biāo)板上用uClinux,它提供的程序接口和linux下的基本一致,不一致的部分主要在于uClinux 不支持MMU(應(yīng)該說是uClinux是為不帶MMU的cpu定制的),最明顯的就是fork函數(shù)要用vfork函數(shù)替代,這也是編程時,感覺最不爽的一點(diǎn)(沒辦法,誰讓咱們的CPU有生理缺陷)。另一個不易覺察的差異在于uClinux提供的庫uClibc是經(jīng)過裁減的。更適合于資源緊張的嵌入式系統(tǒng)(上回分解已經(jīng)說了,應(yīng)用程序很大一部分是在和庫函數(shù)打交道,而且大家最終是鏈在一起,所以庫函數(shù)大了,你的程序也小不了)。
            于是基于這種開發(fā)模式的應(yīng)用程序開發(fā)變成了linux下的程序開發(fā)。而且在實際中一般是編好了程序先在主機(jī)上拿主機(jī)平臺上的編譯器編譯并且調(diào)試一下(linux下的編譯器就是gcc了),當(dāng)然前提是被調(diào)試的程序中需要的硬件條件主機(jī)具備,例如我的程序中有一段是針對串口的,于是先在主機(jī)編一個串口程序,調(diào)通以后拿目標(biāo)板的編譯器重新編譯一下(如果看了上一章“交叉編譯環(huán)境”,這里就不會暈了),下載到目標(biāo)板上運(yùn)行,一般來說就可以直接用了。

          上一頁 1 2 下一頁

          關(guān)鍵詞: ARMuClinux嵌入式系

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();