基于ARM+uClinux的嵌入式系統(tǒng)的開發(fā)
按照我的開發(fā)過程想分以下幾部分逐一介紹。
1.開發(fā)平臺的選擇和論證
2.開發(fā)環(huán)境的建立
3.一般程序的開發(fā)
4.Linux程序向ARM+uClinux平臺的移植
5.剩下的問題
希望諸位多多補(bǔ)充自己的想法,以利于大家共同提高。
1. 開發(fā)平臺的選擇和論證
一個(gè)項(xiàng)目拿到手,如何選擇開發(fā)平臺(主要是指CPU和操作系統(tǒng)以及開發(fā)環(huán)境和工具)應(yīng)該說至關(guān)重要,有時(shí)這不光影響進(jìn)度,產(chǎn)品質(zhì)量,可維護(hù)性等一般問題,甚至涉及到方案的可實(shí)現(xiàn)性。本人結(jié)合自己的網(wǎng)絡(luò)監(jiān)控系統(tǒng)簡單歸納了一些對平臺的考慮,還請各位補(bǔ)充。
從系統(tǒng)功能實(shí)現(xiàn)考慮:
(1) 是否有片上外設(shè),專用指令或配套的軟件模塊直接實(shí)現(xiàn)系統(tǒng)功能要求。 感 覺這一條對很多人的決策影響很大
(2) 價(jià)格
這一點(diǎn)應(yīng)通過CPU提供的資源綜合考慮,它提供了多少有用的資源,多少沒用的資源(那可都是銀子呀?。?,還是那三個(gè)字,性價(jià)比,另一方面,是要抓主要矛盾,是不是有些特性是必須的,什么特性是用戶需求里的亮點(diǎn)(就靠這些亮點(diǎn)往上抬價(jià)),這時(shí)該花的就得花了。
(3) 功耗
本系統(tǒng)對CPU功耗要求不高,但對移動(dòng)設(shè)備,這一點(diǎn)可是致命,而且這一點(diǎn)不是僅針對CPU,所有幾乎器件都要勒緊褲腰帶運(yùn)行。
(4) 處理速度
這項(xiàng)不用多說,大家都明白重要性,但具體算起來可是一門學(xué)問,一方面是自己需要多快的速度,如果加上非實(shí)時(shí)操作系統(tǒng)這事就不好控制,余量還是大點(diǎn)穩(wěn)妥,另一方面,CPU指令周期多少,有沒有流水,有沒有并行,什么體系結(jié)構(gòu),有沒有專用指令(看人家DSP多牛,干這事一絕),對外部存儲器和外設(shè)的存取速度等等,哪一個(gè)慢了都叫瓶頸。
(5) 需要的硬件支持(如外部存儲器,雙電源等)
這算是雜項(xiàng),但會增加額外的價(jià)格,系統(tǒng)體積等,不容忽視。
從開發(fā)者的角度考慮:
(1) 是否有足夠的技術(shù)支持包括demo版及原理圖,demo程序,操作系統(tǒng)和BSP,測試開發(fā)工具等。
(2) 自身?xiàng)l件;包括對項(xiàng)目開發(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ū)動(dòng)程序 (uClinux提供串口和網(wǎng)絡(luò)控制器驅(qū)動(dòng))
b. 網(wǎng)絡(luò)協(xié)議棧支持(uClinux提供TCPIP,UDP等的協(xié)議棧)
c. 應(yīng)用層程序(如果算上可以從linux移植的程序來看,那就太多了,我就用到了一個(gè)現(xiàn)成的)
(2) 本應(yīng)用系統(tǒng)不是那種批量的東西,對價(jià)格要求不苛刻,而且這款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) 因?yàn)闀r(shí)間很緊(一個(gè)半月),所以支持越多越好。目前從開發(fā)商那里拿到了開發(fā)板,原理圖,uClinux,相應(yīng)驅(qū)動(dòng),bootloader,拿來就可以用了。軟件硬件并行開發(fā)。(bootloader和網(wǎng)絡(luò)控制器驅(qū)動(dòng)沒提供原碼,比較可惜:-(
(2) 當(dāng)時(shí)我對嵌入式系統(tǒng)的開發(fā)模式和ARM都是只有耳聞,linux接觸過一個(gè)月左右。現(xiàn)在想起來有些后怕。
(3) 網(wǎng)上的資源,非常多。
提供一些我常用的。
http://www.uclinux.org/uClinux的大本營。
http://www.ucdot.org/里面有些技術(shù)文章非常不錯(cuò)。
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ò)展性都不錯(cuò)。
(5) 目前該CPU使用還是比較普遍,現(xiàn)貨沒問題。
(6) 方案提供商的素質(zhì)嗎……..還算可以吧:-)
根據(jù)以上考慮和目前的開發(fā)情況,這套方案還是比較令人滿意。
今天先回家了,下回介紹具體開發(fā)步鄹吧。
2.開發(fā)環(huán)境的建立
先說兩句廢話為和我以前一樣對操作系統(tǒng)(尤其是嵌入式操作系統(tǒng))迷惑的弟兄解釋些概念。因?yàn)榭偸怯腥嗽趩柺遣皇且欢ㄒ貌僮飨到y(tǒng),我的CPU能不能移植操作系統(tǒng),可以移植什么操作系統(tǒng),有了操作系統(tǒng)可不可以運(yùn)行某些程序。
從我的個(gè)人經(jīng)歷來講,這其實(shí)就是許多硬件出身的弟兄對操作系統(tǒng)這個(gè)東西有神秘感(和我一年前一樣)。說白了,操作系統(tǒng)就是一段設(shè)計(jì)非常巧妙的程序,和你自己的程序從本質(zhì)講沒有區(qū)別,于是,以上問題轉(zhuǎn)為,我是不是一定要用這段程序,我的CPU能不能運(yùn)行這段程序,可以跑什么樣的程序。這個(gè)程序可以跑,調(diào)用這個(gè)程序接口的另一個(gè)程序能不能跑!
答案也就變得簡單,操作系統(tǒng)對任何一個(gè)CPU都不是必須的(對嵌入式系統(tǒng)更是如此),你可以自己編些程序在沒有操作系統(tǒng)的PC裸機(jī)上跑(BIOS就是這樣的),像玩C51一樣,(雖然奢侈的讓人有些心痛),或者移植UCOS到上面。另一方面,現(xiàn)代操作系統(tǒng)大多需要一些硬件的支持,(像保護(hù)模式的實(shí)現(xiàn)),反過來說,高端CPU中專門有針對支持操作系統(tǒng)的體系結(jié)構(gòu),這樣,許多操作系統(tǒng)的實(shí)現(xiàn)是挑剔硬件平臺的。其實(shí)其它程序也一樣,你編的程序使用的片上外設(shè)另一CPU上沒有,那這段程序就無法移植了。這就是話粗理不粗。書歸正傳,還是聊聊ARM+uClinux開發(fā)模式下開發(fā)環(huán)境的建立(其實(shí)下面說到的東西不僅限于這種硬件平臺和操作系統(tǒng))
很久以前就在介紹嵌入式系統(tǒng)開發(fā)的書上見過“交叉編譯環(huán)境”這詞,當(dāng)時(shí)覺得很玄,用了以后才知道,其實(shí)就是解決在誰的地盤上用誰的工具編誰的代碼問題。
編譯的最主要的工作就在將你的程序轉(zhuǎn)化成運(yùn)行該程序的CPU所能識別的機(jī)器代碼,不同的CPU有相應(yīng)的編譯器,另一方面。編譯器本身也是程序,當(dāng)然也要在某一個(gè)CPU平臺上運(yùn)行。于是交叉編譯的交叉點(diǎn)就在那個(gè)編譯器本身是CPU1上的一個(gè)程序,卻在為CPU2編譯代碼(整個(gè)一個(gè)吃里扒外?。_@么一想,以前用51和dsp的開發(fā)軟件(大部分都是IDE-集成開發(fā)環(huán)境)開發(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)上編譯,這就不算交叉編譯,但如果有條件這么作,程序的開發(fā)或者移植就方便多了,因?yàn)檎麄€(gè)開發(fā)過程又回到在自己PC機(jī)上編應(yīng)用程序的那種模式了,那就是在自己的地盤上用自己的編譯器編自己的應(yīng)用程序。
與不使用操作系統(tǒng)的開發(fā)模式不同(此處的操作系統(tǒng)尤其指提供了專門的接口函數(shù)庫的操作系統(tǒng),目前的UCOS就不算),在目標(biāo)板(就是實(shí)現(xiàn)系統(tǒng)的板子)使用操作系統(tǒng)的開發(fā)模式下,交叉編譯環(huán)境中還需要該對應(yīng)該操作系統(tǒng)的庫。比如uClinux提供的uClibc。此時(shí),開發(fā)用的主機(jī)上不光要有目標(biāo)板 CPU所需的編譯工具,還要有對應(yīng)操作系統(tǒng)的庫,又因?yàn)橐话銕煳募€要在開發(fā)機(jī)上拿目標(biāo)CPU的編譯器重新編譯一下,所以還要把操作系統(tǒng)的原碼也放到開發(fā)機(jī)上。(唉,跟目標(biāo)板沒什么關(guān)系,卻要幫它背這么多東西,真是上輩子欠它的!?。?br />
雖然操作系統(tǒng)的接口庫至關(guān)重要,但大家似乎已經(jīng)淡忘了它的存在。這些多是因?yàn)榇蠹乙呀?jīng)遠(yuǎn)離了刀耕火種的年代(需要告訴編譯器需要的include路徑,lib路徑,以及l(fā)ib的名稱),集成的編譯環(huán)境讓我們編譯鏈接的所有繁瑣工作化作對BUILD按鈕的瀟灑一擊。而且不論是windows環(huán)境,還是 linux環(huán)境,都有環(huán)境變量去記錄這些參數(shù)。。但嘗試將/usr/lib目錄改一個(gè)名字,你就會知道你不能無視他們的存在,因?yàn)椴僮飨到y(tǒng)的功能都是通過這些庫來交給應(yīng)用層程序使用的。當(dāng)然如果你的系統(tǒng)不依靠任何操作系統(tǒng),像最原始的那種完全自己實(shí)現(xiàn)所有代碼,就只需要一個(gè)編譯工具,少了這些羅嗦事。
以上的東西一般時(shí)候是沒有必要仔細(xì)研究,但交叉環(huán)境下開發(fā)或移植比較大的程序時(shí),你可能就需要了解編譯器,鏈接器等開發(fā)工具的幾乎所有重要參數(shù)。
我在開發(fā)時(shí),主機(jī)完全使用的是linux,如果有條件,建議大家這樣作,linux的使用沒有想象的復(fù)雜(雖然我現(xiàn)在身邊還要放一本關(guān)于linux使用的書籍),而且開發(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)上,建立基本的開發(fā)環(huán)境過程如下。
1) 安裝gnu開發(fā)工具鏈(是GNU開發(fā)的針對ARM CPU的一組編譯開發(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í)可以通過menuconfig來對內(nèi)核提供的功能進(jìn)行裁減
(3) 將庫(uClibc)解壓到相應(yīng)路徑下,用以上工具編譯一遍。
這樣最基本的環(huán)境就算搭建好了。
以上工作對于做過的人來說比較簡單,這里介紹一下幫助沒有使用或剛開始使用這種開發(fā)模式的弟兄們理清一下思路。
3.一般應(yīng)用程序的開發(fā)
因?yàn)槟繕?biāo)板上用uClinux,它提供的程序接口和linux下的基本一致,不一致的部分主要在于uClinux 不支持MMU(應(yīng)該說是uClinux是為不帶MMU的cpu定制的),最明顯的就是fork函數(shù)要用vfork函數(shù)替代,這也是編程時(shí),感覺最不爽的一點(diǎn)(沒辦法,誰讓咱們的CPU有生理缺陷)。另一個(gè)不易覺察的差異在于uClinux提供的庫uClibc是經(jīng)過裁減的。更適合于資源緊張的嵌入式系統(tǒng)(上回分解已經(jīng)說了,應(yīng)用程序很大一部分是在和庫函數(shù)打交道,而且大家最終是鏈在一起,所以庫函數(shù)大了,你的程序也小不了)。
于是基于這種開發(fā)模式的應(yīng)用程序開發(fā)變成了linux下的程序開發(fā)。而且在實(shí)際中一般是編好了程序先在主機(jī)上拿主機(jī)平臺上的編譯器編譯并且調(diào)試一下(linux下的編譯器就是gcc了),當(dāng)然前提是被調(diào)試的程序中需要的硬件條件主機(jī)具備,例如我的程序中有一段是針對串口的,于是先在主機(jī)編一個(gè)串口程序,調(diào)通以后拿目標(biāo)板的編譯器重新編譯一下(如果看了上一章“交叉編譯環(huán)境”,這里就不會暈了),下載到目標(biāo)板上運(yùn)行,一般來說就可以直接用了。
評論