新聞中心

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

  先說(shuō)兩句廢話為和我以前一樣對(duì)操作系統(tǒng)(尤其是嵌入式操作系統(tǒng))迷惑的弟兄解釋些概念。因?yàn)榭偸怯腥嗽趩?wèn)是不是一定要用操作系統(tǒng),我的CPU能不能移植操作系統(tǒng),可以移植什么操作系統(tǒng),有了操作系統(tǒng)可不可以運(yùn)行某些程序。

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

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

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

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

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

  以上工作對(duì)于做過(guò)的人來(lái)說(shuō)比較簡(jiǎn)單,這里介紹一下幫助沒(méi)有使用或剛開(kāi)始使用這種開(kāi)發(fā)模式的弟兄們理清一下思路。

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

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

上一頁(yè) 1 2 下一頁(yè)

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

評(píng)論


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

關(guān)閉