按照我的開發(fā)過程想分以下幾部分逐一介紹。
1.開發(fā)平臺的選擇和論證
2.開發(fā)環(huán)境的建立
3.一般程序的開發(fā)
4.Linux程序向ARM+uClinux平臺的移植
5.剩下的問題
希望諸位多多補充自己的想法,以利于大家共同提高。
1. 開發(fā)平臺的選擇和論證
一個項目拿到手,如何選擇開發(fā)平臺(主要是指CPU和操作系統(tǒng)以及開發(fā)環(huán)境和工具)應該說至關重要,有時這不光影響進度,產品質量,可維護性等一般問題,甚至涉及到方案的可實現(xiàn)性。本人結合自己的網絡監(jiān)控系統(tǒng)簡單歸納了一些對平臺的考慮,還請各位補充。
從系統(tǒng)功能實現(xiàn)考慮:
(1) 是否有片上外設,指令或配套的軟件模塊直接實現(xiàn)系統(tǒng)功能要求。 感 覺這一條對很多人的決策影響很大
(2) 價格
這一點應通過CPU提供的資源綜合考慮,它提供了多少有用的資源,多少沒用的資源(那可都是銀子呀?。€是那三個字,性價比,另一方面,是要抓主要矛盾,是不是有些特性是必須的,什么特性是用戶需求里的亮點(就靠這些亮點往上抬價),這時該花的就得花了。
(3) 功耗
本系統(tǒng)對CPU功耗要求不高,但對移動設備,這一點可是致命,而且這一點不是僅針對CPU,所有幾乎器件都要勒緊褲腰帶運行。
(4) 處理速度
這項不用多說,大家都明白重要性,但具體算起來可是一門學問,一方面是自己需要多快的速度,如果加上非實時操作系統(tǒng)這事就不好控制,余量還是大點穩(wěn)妥,另一方面,CPU指令周期多少,有沒有流水,有沒有并行,什么體系結構,有沒有指令(看人家DSP多牛,干這事*),對外部存儲器和外設的存取速度等等,哪一個慢了都叫瓶頸。
(5) 需要的硬件支持(如外部存儲器,雙電源等)
這算是雜項,但會增加額外的價格,系統(tǒng)體積等,不容忽視。
從的角度考慮:
(1) 是否有足夠的包括demo版及原理圖,demo程序,操作系統(tǒng)和BSP,測試開發(fā)工具等。
(2) 自身條件;包括對項目開發(fā)周期的要求,開發(fā)人員對器件和開發(fā)模式的熟悉程度以及掌握的難易程度。
(3) 可用資源是否豐富(書籍,網絡等)
以上三點主要考慮迅速開發(fā)出穩(wěn)定的系統(tǒng)。
(4) 系統(tǒng)的可繼承性,可移植性和可擴展性。
(5) 是否有現(xiàn)貨。
(6) 方案提供商的素質。(包括技術水平和服務意識)。
根據以上考慮選擇了s3c4510b(ARM7TDMI)+uClinux開發(fā)模式
(1) 以下是該平臺對我的系統(tǒng)的滿足情況:(和上面幾點對應)
本監(jiān)控系統(tǒng)硬件部分主要要求以下部分:
a.以太網接口 (s3c4510b自帶網絡控制器)
b.串口 (自帶)
c.與數(shù)據采集芯片的接口(8位數(shù)據線,小于8位地址總線)。(自帶)
本系統(tǒng)軟件部分主要要求以下部分:
a. 硬件接口驅動程序 (uClinux提供串口和網絡控制器驅動)
b. 網絡協(xié)議棧支持(uClinux提供TCPIP,UDP等的協(xié)議棧)
c. 應用層程序(如果算上可以從linux移植的程序來看,那就太多了,我就用到了一個現(xiàn)成的)
(2) 本應用系統(tǒng)不是那種批量的東西,對價格要求不苛刻,而且這款CPU*可以到55左右,可以接受。
(3) 本應用系統(tǒng)有固定電源,功耗要求不高。當然,據說ARM在節(jié)省功耗上很有特點。
(4) 本應用系統(tǒng)速度方面要滿足兩方面:1。串口:115200bps 2。網絡速度 能到10Mbps就行,所以對系統(tǒng)速度要求也不高。這款ARM內部可以到50M。
(5) 系統(tǒng)對體積要求也不高,加片flash和RAM還是沒問題(到目前為止感覺我的系統(tǒng)真是無欲無求?。?/p>
從的角度考慮:
(1) 因為時間很緊(一個半月),所以支持越多越好。目前從開發(fā)商那里拿到了開發(fā)板,原理圖,uClinux,相應驅動,bootloader,拿來就可以用了。軟件硬件并行開發(fā)。(bootloader和網絡控制器驅動沒提供原碼,比較可惜:-(
(2) 當時我對嵌入式系統(tǒng)的開發(fā)模式和ARM都是只有耳聞,linux接觸過一個月左右?,F(xiàn)在想起來有些后怕。
(3) 網上的資源,非常多。
提供一些我常用的。
/ uClinux的大本營。
/ 里面有些技術文章非常不錯。
/
/ 這是國產的linux站點。
uClinux-dev@ 這是uClinux的郵件列表,回答問題的都是大牛,非常有幫助,記住把你的郵件設置成純文本格式。 申請是在:
::URL::http://mailman./mailman/listinfo/uClinux-dev web方式。
(4) 采用以上開發(fā)模式,軟件的可維護性,可移植性和可擴展性都不錯。
(5) 目前該CPU使用還是比較普遍,現(xiàn)貨沒問題。
(6) 方案提供商的素質嗎……..還算可以吧:-)
根據以上考慮和目前的開發(fā)情況,這套方案還是比較令人滿意。
今天先回家了,下回介紹具體開發(fā)步鄹吧。
2.開發(fā)環(huán)境的建立。
先說兩句廢話為和我以前一樣對操作系統(tǒng)(尤其是嵌入式操作系統(tǒng))迷惑的弟兄解釋些概念。因為總是有人在問是不是一定要用操作系統(tǒng),我的CPU能不能移植操作系統(tǒng),可以移植什么操作系統(tǒng),有了操作系統(tǒng)可不可以運行某些程序。
從我的個人經歷來講,這其實就是許多硬件出身的弟兄對操作系統(tǒng)這個東西有神秘感(和我一年前一樣)。說白了,操作系統(tǒng)就是一段設計非常巧妙的程序,和你自己的程序從本質講沒有區(qū)別,于是,以上問題轉為,我是不是一定要用這段程序,我的CPU能不能運行這段程序,可以跑什么樣的程序。這個程序可以跑,調用這個程序接口的另一個程序能不能跑!
答案也就變得簡單,操作系統(tǒng)對任何一個CPU都不是必須的(對嵌入式系統(tǒng)更是如此),你可以自己編些程序在沒有操作系統(tǒng)的PC裸機上跑(BIOS就是這樣的),像玩C51一樣,(雖然的讓人有些心痛),或者移植UCOS到上面。另一方面,現(xiàn)代操作系統(tǒng)大多需要一些硬件的支持,(像保護模式的實現(xiàn)),反過來說,CPU中專門有針對支持操作系統(tǒng)的體系結構,這樣,許多操作系統(tǒng)的實現(xiàn)是挑剔硬件平臺的。其實其它程序也一樣,你編的程序使用的片上外設另一CPU上沒有,那這段程序就無法移植了。這就是話粗理不粗。書歸正傳,還是聊聊ARM+uClinux開發(fā)模式下開發(fā)環(huán)境的建立(其實下面說到的東西不于這種硬件平臺和操作系統(tǒng))
很久以前就在介紹嵌入式系統(tǒng)開發(fā)的書上見過“交叉編譯環(huán)境”這詞,當時覺得很玄,用了以后才知道,其實就是解決在誰的地盤上用誰的工具編誰的代碼問題。
編譯的zui主要的工作就在將你的程序轉化成運行該程序的CPU所能識別的機器代碼,不同的CPU有相應的編譯器,另一方面。編譯器本身也是程序,當然也要在某一個CPU平臺上運行。于是交叉編譯的交叉點就在那個編譯器本身是CPU1上的一個程序,卻在為CPU2編譯代碼(整個一個吃里扒外?。_@么一想,以前用51和dsp的開發(fā)軟件(大部分都是IDE-集成開發(fā)環(huán)境)開發(fā)程序時,都算是交叉編譯啦。當然,假如在你的ARM系統(tǒng)上,操作系統(tǒng)已經正常運行,并且你的資源足夠多,你可以把PC機上運行的ARM編譯工具移植到ARM上,然后所有該系統(tǒng)的應用程序都直接在ARM系統(tǒng)上編譯,這就不算交叉編譯,但如果有條件這么作,程序的開發(fā)或者移植就方便多了,因為整個開發(fā)過程又回到在自己PC機上編應用程序的那種模式了,那就是在自己的地盤上用自己的編譯器編自己的應用程序。
與不使用操作系統(tǒng)的開發(fā)模式不同(此處的操作系統(tǒng)尤其指提供了專門的接口函數(shù)庫的操作系統(tǒng),目前的UCOS就不算),在目標板(就是實現(xiàn)系統(tǒng)的板子)使用操作系統(tǒng)的開發(fā)模式下,交叉編譯環(huán)境中還需要該對應該操作系統(tǒng)的庫。比如uClinux提供的uClibc。此時,開發(fā)用的主機上不光要有目標板CPU所需的編譯工具,還要有對應操作系統(tǒng)的庫,又因為一般庫文件還要在開發(fā)機上拿目標CPU的編譯器重新編譯一下,所以還要把操作系統(tǒng)的原碼也放到開發(fā)機上。(唉,跟目標板沒什么關系,卻要幫它背這么多東西,真是上輩子欠它的?。。?。
雖然操作系統(tǒng)的接口庫至關重要,但大家似乎已經淡忘了它的存在。這些多是因為大家已經遠離了刀耕火種的年代(需要告訴編譯器需要的include路徑, lib路徑,以及l(fā)ib的名稱),集成的編譯環(huán)境讓我們編譯鏈接的所有繁瑣工作化作對BUILD按鈕的瀟灑一擊。而且不論是windows環(huán)境,還是 linux環(huán)境,都有環(huán)境變量去記錄這些參數(shù)。。但嘗試將/usr/lib目錄改一個名字,你就會知道你不能無視他們的存在,因為操作系統(tǒng)的功能都是通過這些庫來交給應用層程序使用的。當然如果你的系統(tǒng)不依靠任何操作系統(tǒng),像zui原始的那種*自己實現(xiàn)所有代碼,就只需要一個編譯工具,少了這些羅嗦事。
以上的東西一般時候是沒有必要仔細研究,但交叉環(huán)境下開發(fā)或移植比較大的程序時,你可能就需要了解編譯器,鏈接器等開發(fā)工具的幾乎所有重要參數(shù)。
我在開發(fā)時,主機*使用的是linux,如果有條件,建議大家這樣作,linux的使用沒有想象的復雜(雖然我現(xiàn)在身邊還要放一本關于linux使用的書籍),而且開發(fā)程序可以先在主機上調通,然后用交叉編譯工具為目標系統(tǒng)重新編譯一遍,可以這樣做是因為主機是linux,目標系統(tǒng)跑uClinux,兩個操作系統(tǒng)提供的應用程序接口幾乎是一樣的,所以程序幾乎不用修改。
在我的系統(tǒng)上,建立基本的開發(fā)環(huán)境過程如下。
(1) 安裝gnu開發(fā)工具鏈(是GNU開發(fā)的針對ARM CPU的一組編譯開發(fā)程序(是linux程序)。包括arm-elf-gcc,arm-elf-ld等
(2) 將uClinux源代碼源代碼解壓到相應路徑下,按照編譯內核的步鄹編譯一遍(此時使用的編譯工具已經是上面提到的ARM編譯工具了,因為它要在ARM CPU上運行,另外,和編譯linux內核一樣,此時可以通過menuconfig來對內核提供的功能進行裁減
(3) 將庫(uClibc)解壓到相應路徑下,用以上工具編譯一遍。
這樣zui基本的環(huán)境就算搭建好了。
以上工作對于做過的人來說比較簡單,這里介紹一下幫助沒有使用或剛開始使用這種開發(fā)模式的弟兄們理清一下思路。
3.應用程序的開發(fā)
因為目標板上用uClinux,它提供的程序接口和linux下的基本一致,不一致的部分主要在于uClinux不支持MMU(應該說是uClinux是為不帶MMU的cpu定制的),*的就是fork函數(shù)要用vfork函數(shù)替代,這也是編程時,感覺zui不爽的一點(沒辦法,誰讓咱們的CPU有生理缺陷)。另一個不易覺察的差異在于uClinux提供的庫uClibc是經過裁減的。更適合于資源緊張的嵌入式系統(tǒng)(上回分解已經說了,應用程序很大一部分是在和庫函數(shù)打交道,而且大家zui終是鏈在一起,所以庫函數(shù)大了,你的程序也小不了)。
于是基于這種開發(fā)模式的應用程序開發(fā)變成了linux下的程序開發(fā)。而且在實際中一般是編好了程序先在主機上拿主機平臺上的編譯器編譯并且調試一下(linux下的編譯器就是gcc了),當然前提是被調試的程序中需要的硬件條件主機具備,例如我的程序中有一段是針對串口的,于是先在主機編一個串口程序,調通以后拿目標板的編譯器重新編譯一下(如果看了上一章“交叉編譯環(huán)境”,這里就不會暈了),下載到目標板上運行,一般來說就可以直接用了。
以上也是為什么我認為開發(fā)嵌入式linux 程序主機應該選用 linux環(huán)境。對于以前沒用過linux的人來說(比如我),開發(fā)程序前應該花3,4天時間熟悉linux環(huán)境,尤其是它的編輯器,用慣集成編譯環(huán)境的人有時連編譯器和編輯器的概念都模糊了,所以一般是直接進入集成編譯環(huán)境,連寫帶編一氣呵成,殊不知有些集成編譯器提供的編輯器弱智的一塌胡涂,如果用熟了linux下的emacs,你就會發(fā)現(xiàn)他們之間的差距大概……要像我和蓋茨那么大吧。所以編程序時應該選一款的編輯器,linux下,我當然選 emacs,雖然剛看見它的感覺是外表丑陋,使用復雜。但只要多用多練,對提率很有幫助。(將你的程序用兩個編輯器完成,一半是用emacs的,一半是不用emacs的,看看效果:-)
對具體的linux編程我就不板門弄斧了,需要提個醒的是咱硬件出身的人作軟件應該養(yǎng)成良好的編程習慣,別讓作軟件的笑話咱。因為作了些網絡應用,所以介紹一些網絡編程時要用到的和書籍;
<>w.Richard.Stevens. 這可是linux網絡編程的圣經級的書籍
::URL::/a4/b7/ 適合于網絡編程的入門。
還有IBM中國上關于linux的教程和文章,都是翻譯過來的,有很多寫非常不錯。
其實類似的資源不計其數(shù),遇到問題時應該先到google上狂搜一圈。
重點想說些關于編譯器的東西,不了解它,在交叉編譯環(huán)境下編譯程序就寸步難行了,這無非是因為交叉編譯環(huán)境下目標板編譯器所處的寄人籬下的悲慘環(huán)境。想想在 linux下將myprogram.c編譯鏈接成應用程序myprogram,zui簡單的一句 gcc –o myprogram myprogram.c 就可以了。(其實在諸如VC下你也可以找到類似的命令,集成開發(fā)環(huán)境只不過替你來調用它了)。一切看起來天經地義。
但試著把/usr/include路徑改一個名字(比如改成stupid_include),再這樣編譯一下,會發(fā)現(xiàn)程序中被< >引用的頭文件(比如#Include)都找不到了。因為編譯器看見這樣的頭文件會到系統(tǒng)的路徑下尋找,而這個路徑是由環(huán)境變量保存的(linux和windows下都是這樣的)。針對以上情況,不將路徑名字改回去,但是給編譯器加一個參數(shù)如下:
gcc –I/usr/stupid_include –o myprogram myprogram.c 會發(fā)現(xiàn)錯誤信息沒了,一切又恢復了往日的寧靜,頓時明白,不用環(huán)境變量,通過參數(shù),同樣可以將這些信息告訴編譯器。返回來說說你的目標編譯器,雖然占用了人家的地盤,編譯器,頭文件,庫文件,一個都不少,但你要編一個程序編譯器照樣發(fā)暈,因為沒有環(huán)境變量告訴它自己需要的頭文件和庫文件在哪里??磥碇挥袃煞N辦法,一個是搶占了主機的環(huán)境變量改成自己的(整個兒一個土匪),或者在編譯時加上必要參數(shù)(還是這樣紳士一些),告訴編譯器需要的文件的位置。(除此之外,還有其他一些參數(shù)也是如此)。
從源程序到可執(zhí)行文件根據情況不同可能分好幾步,一般每一步可能都會有一個應用程序實現(xiàn),像gnu提供的arm開發(fā)工具鏈其實就是這么一組程序。提供從編譯到鏈接到格式轉化的全套服務。你可以用arm-elf-gcc命令一步到底直接產生可執(zhí)行文件(其實也是在自己的任務完成后調用下一個程序),也可以每一步加上自己的參數(shù),只作自己的事。
編譯器的主要參數(shù)的使用下次將程序的移植時再講。這里想說一下編譯器產生應用程序的幾個主要步鄹,講這個問題的原因還是很多人無法區(qū)分諸如編譯和鏈接,不用問,這一切還是IDE集成開發(fā)環(huán)境惹的禍。有人會說,IDE招你惹你了,你老貶它。其實不然,首先以上說的東西一般在IDE的project菜單下的 option或build option中找到,只是一般不用管罷了。另一個方面,IDE就像是傻瓜照相機,很多工作他都幫你完成了,使用簡單。但如果要做攝影師的話,你就少不了要對每一個細節(jié)都了解。其實編譯程序也是一樣。(你可以對優(yōu)化,警告級,宏定義等諸多選項進行自己的選擇)。以下是幾個主要步鄹:(以下有些我也不確認,如發(fā)現(xiàn)問題,請及時糾正。
(1) 預編譯。主要工作就是處理所有#開頭的,包括頭文件。以前搞不清頭文件和可執(zhí)行文件有沒有什么(因為總看見兩個文件名字取一樣的),現(xiàn)在知道,他們之間沒有任何。在預編譯結束后,頭文件的使命就結束了。在下一次介紹不同平臺程序移植時可以看到,預編譯有時非常有用。
(2) 編譯。編譯應該是zui主要的一步,就是將源文件生成CPU能識別的語言,一般是后綴為.o的目標文件,應該說,此時的文件就已經可以執(zhí)行了。當然這個時候外部函數(shù)等外部符號都沒有引入,對于被編譯程序來說,這些外部符號還只是留一個倩影,壓根兒不知它在不在。你可以在你的程序里調用一個不存在的函數(shù),甚至都不用聲明,在編譯階段,很多編譯器只是給個警告。只有在鏈接時才會報錯。(呵呵,夠弱智?。?br />(3) 鏈接:鏈接才是清帳的時候,以前在程序里用到的外部符號都要把真正的東西交出來。你可以需要連接在一起的目標文件,也可以告訴編譯器庫文件的名字和路徑(方法下次講)。編譯器會去找,需要注意的是,庫的需要注意順序。首先,如果不同的庫里有同名函數(shù),并且該函數(shù)被調用,那么在前面的就被鏈接進去了,這一點對于頭文件路徑的也適用,如果你自己的頭文件和系統(tǒng)頭文件相同,并且你的頭文件路徑在系統(tǒng)頭文件路徑前面,你的頭文件就會代替頭文件。庫文件是由相應的程序(linux下是ar命令)將需要被添加到庫里的目標文件(該文件是編譯階段生成的)組織起來生成檔案文件,同時可以建立一個檢索,檢索內容為所包含的目標文件中定義的符號。也就是說,庫文件并不是必須的,但它為經常使用的目標文件中的函數(shù)提供了快速的檢索機制。
以上就是主要的步鄹,當然除此之外,還有一些用于格式轉換的工具等。不一一介紹。知道編譯器的細節(jié)對于程序的開發(fā)和移植都是很有好處的。
程序開發(fā)過程中調試也是至關重要,因為可以先在主機上調試,所以可以使用linux下的gdb,(有點像dos 下的debug)。但是只是用到了皮毛,還有一個于宿主機模式的調試工具gdbserver,一直沒時間研究,希望用過的大俠多發(fā)些文章鋪路。
另外還會遇到如何作ramdisk,如何讓系統(tǒng)啟動自己的程序,這些都太linux了,沒接觸過linux的人會暈,為了大家的健康,就不講了,遇到問題可以給我,大家一起討論。
上一篇:鹽水噴霧試驗機卷柔詳細資料
免責聲明
- 凡本網注明"來源:智能制造網"的所有作品,版權均屬于智能制造網,轉載請必須注明智能制造網,http://www.towegas.com。違反者本網將追究相關法律責任。
- 企業(yè)發(fā)布的公司新聞、技術文章、資料下載等內容,如涉及侵權、違規(guī)遭投訴的,一律由發(fā)布企業(yè)自行承擔責任,本網有權刪除內容并追溯責任。
- 本網轉載并注明自其它來源的作品,目的在于傳遞更多信息,并不代表本網贊同其觀點或證實其內容的真實性,不承擔此類作品侵權行為的直接責任及連帶責任。其他媒體、網站或個人從本網轉載時,必須保留本網注明的作品來源,并自負版權等法律責任。
- 如涉及作品內容、版權等問題,請在作品發(fā)表之日起一周內與本網聯(lián)系,否則視為放棄相關權利。
ARCE2025亞洲機器人大會暨展覽會
展會城市:廣州市展會時間:2025-12-19