在嵌入式系統(tǒng)中應(yīng)用Linux深入探究
摘要:系統(tǒng)不僅能夠運(yùn)行于PC平臺(tái);然而在嵌入式系統(tǒng)中仍然可以大放光芒。本文描述了嵌入式系統(tǒng)的特色,和如何在嵌入式系統(tǒng)中應(yīng)用。
計(jì)算機(jī)用于嵌入式控制設(shè)備領(lǐng)域的歷史和計(jì)算機(jī)本身的歷史一樣久遠(yuǎn)。最初的用于控制機(jī)電式電話交換器的通訊設(shè)備中“固態(tài)控制程序”就是嵌入式程序?!坝?jì)算機(jī)系統(tǒng)”在當(dāng)時(shí)并不普遍;所以固態(tài)程序存放在內(nèi)存中控制相應(yīng)的設(shè)備。在那種時(shí)代,運(yùn)行控制程序是很先進(jìn)的思想,而且當(dāng)時(shí)也只能如此而已。
那時(shí)的計(jì)算機(jī)是專為特定的用戶設(shè)計(jì),特殊的應(yīng)用程序指令、I/O設(shè)備和主要的計(jì)算設(shè)備集成在一起。微處理器的產(chǎn)生改變了這種局面,價(jià)格低廉、結(jié)構(gòu)小巧的CPU和外設(shè)連接在總線上形成了比較大的系統(tǒng)。這種硬件架構(gòu)很穩(wěn)定,于是在這個(gè)基礎(chǔ)上,這建立起了通用的軟件開(kāi)發(fā)環(huán)境和編程模式,且簡(jiǎn)化了編程,。
軟件也在隨著硬件的發(fā)展而發(fā)展;開(kāi)始只有簡(jiǎn)單的工具用于編程和調(diào)試,而且每一個(gè)軟件都必須從頭編寫(xiě)。程序大都采用宏匯編語(yǔ)言,匯編程序還不很完善,調(diào)試是一件很麻煩的事。因此一直到70年代的中期,模塊化編寫(xiě)程序和標(biāo)準(zhǔn)化的運(yùn)行庫(kù)才逐漸流行起來(lái)。 在70年代的后期,出現(xiàn)了嵌入式系統(tǒng)的操作系統(tǒng)。它們采用匯編語(yǔ)言編寫(xiě),而且只能運(yùn)行在相應(yīng)的特殊處理器上;處理器過(guò)時(shí),則這個(gè)操作系統(tǒng)就沒(méi)有用處了,對(duì)新的處理器必須重新編寫(xiě)操作系統(tǒng)的所有代碼。C語(yǔ)言出現(xiàn)以來(lái),采用C語(yǔ)言操作系統(tǒng)更有效率了,操作系統(tǒng)的編寫(xiě)有了很大的改觀。C語(yǔ)言有很好的穩(wěn)定性和可移植性,所以今天的許多操作系統(tǒng)都使用C來(lái)編寫(xiě)。 于是在80年代末,出現(xiàn)了好幾個(gè)商業(yè)的嵌入式操作系統(tǒng)。而且它們已經(jīng)演化成為今天的主流嵌入式操作系統(tǒng)。比如很有名的、使用者眾多的操作系統(tǒng):Vxwork、pSOS、Neculeus和Windowss CE。
不過(guò)很多的嵌入式系統(tǒng)還沒(méi)有使用操作系統(tǒng),它們僅僅包含一些控制流程而已。在嵌入式系統(tǒng)相對(duì)簡(jiǎn)單的情況下,這些控制流足以應(yīng)付。但是,當(dāng)嵌入式系統(tǒng)的功能復(fù)雜后,簡(jiǎn)單控制邏輯就不夠用了,這時(shí)你必須使用操作系統(tǒng)。如果不使用操作系統(tǒng)將會(huì)使得控制系統(tǒng)邏輯結(jié)構(gòu)復(fù)雜混亂,很容易出錯(cuò)。再者,有些嵌入式系統(tǒng)需要接入網(wǎng)絡(luò)系統(tǒng),比如賓館的門(mén)鎖控制已經(jīng)需要接入網(wǎng)絡(luò),因此就更需要嵌入式的操作系統(tǒng)來(lái)支持應(yīng)用軟件。
除了商業(yè)化的操作系統(tǒng)外,還有的有版權(quán)要求的非商業(yè)化嵌入式操作系統(tǒng)可以使用。然而今天的Linux系統(tǒng)有著嵌入式操作系統(tǒng)需要的很多特色、突出的優(yōu)勢(shì):適應(yīng)于多種CPU和多種硬件平臺(tái),性能穩(wěn)定,裁剪性很好,開(kāi)發(fā)和使用都很容易。因此,我們決定在嵌入式系統(tǒng)中使用Linux操作系統(tǒng)。
1.它具有很好的工具,可以跨越ICE等屏障
原來(lái)開(kāi)發(fā)嵌入式系統(tǒng)的關(guān)鍵是需要一套好用的開(kāi)發(fā)和調(diào)試工具;而且在開(kāi)發(fā)所不同階段還需要不同的工具。就比如工匠,只有好的工具才能夠使工作完成得又好又快。
傳統(tǒng)的開(kāi)發(fā)調(diào)試工具就是ICE-在線仿真器;它取代目標(biāo)板的微處理器,給目標(biāo)程序提供仿真環(huán)境,同時(shí)可以連接監(jiān)視器;允許開(kāi)發(fā)者調(diào)試和監(jiān)視程序的運(yùn)行。盡管這種運(yùn)行方式會(huì)引起一些奇怪的問(wèn)題,但是它總能夠讓你明了程序在目標(biāo)板的工作狀態(tài),免除了對(duì)底層的軟硬件接口的猜測(cè)。但是,這種設(shè)備價(jià)格非常貴。過(guò)去,甚至在整個(gè)開(kāi)發(fā)期內(nèi),開(kāi)發(fā)嵌入式系統(tǒng)主要依靠這些調(diào)試工具。 可是,我們發(fā)現(xiàn),一旦軟硬件能夠正常支持串口的運(yùn)行時(shí),我們可以使用的調(diào)試辦法。的嵌入式系統(tǒng)采用相當(dāng)成熟的微處理器。因此很容易使得串口工作。串口連接成功,可以進(jìn)行很多的開(kāi)發(fā)調(diào)試。所以我們不用ICE也可以很好地開(kāi)始開(kāi)發(fā)和調(diào)試工作了,同時(shí)還降低開(kāi)發(fā)費(fèi)用。
Linux利用GNU項(xiàng)目的C編譯器來(lái)編譯程序,使用gdb源程序級(jí)調(diào)試器來(lái)調(diào)試程序。它們提供了合適的手段來(lái)使你能夠開(kāi)發(fā)嵌入式的Linux系統(tǒng)。為了開(kāi)發(fā)基于Linux的嵌入式系統(tǒng),可以按以下方法進(jìn)行:
向串口輸出提示字符串,例如“ word ”或“Waston, here I you!”等, 然后通過(guò)串口,指揮gdb開(kāi)始工作。以這種方式和另外一臺(tái)運(yùn)行g(shù)db程序的Linux主機(jī)系統(tǒng)“交談”,通過(guò)串口,你可以很方便地讓gdb調(diào)試目標(biāo)程序。通過(guò)串口和gdb通訊,可以進(jìn)行C源程序級(jí)的調(diào)試。甚至你還可以以串口把的程序下裝到RAM或存儲(chǔ)器。通過(guò)串口,使用gdb可以使得軟硬件的初始化代碼繼續(xù)運(yùn)行到核心全部啟動(dòng)。
一旦核心在運(yùn)行了,你就可以使用其他的更好的調(diào)試工具,象Kgdb等,如果連接了網(wǎng)絡(luò),你也可以讓網(wǎng)絡(luò)工作起來(lái)。同時(shí)你就可以用GUI的xgdb來(lái)調(diào)試應(yīng)用程序。
2.滿足實(shí)時(shí)性時(shí)要求
細(xì)細(xì)分析起來(lái),大多數(shù)系統(tǒng)并不需要嚴(yán)格的實(shí)時(shí)性。而嵌入式系統(tǒng)也經(jīng)常被誤解為就是實(shí)時(shí)性系統(tǒng)。其實(shí),多數(shù)嵌入式系統(tǒng)并不需要實(shí)時(shí)性,而且實(shí)時(shí)性本身是個(gè)相對(duì)的概念絕對(duì)的實(shí)時(shí)性是指對(duì)需要的服務(wù)以限定的方式和在限間內(nèi)提供,比如在微秒級(jí)內(nèi)響應(yīng)。 這種硬實(shí)時(shí)性功能只是針對(duì)特殊的設(shè)備而言 ,例如數(shù)字信號(hào)處理等。而這些要求使用特殊的硬件 如、DMA 和其他特殊設(shè)計(jì)的硬件 也可以滿足 。
有些設(shè)計(jì)者不能夠準(zhǔn)確地分析出系統(tǒng)真正實(shí)時(shí)需求,很多情況下對(duì)實(shí)時(shí)的需求在1-5 毫秒內(nèi)響應(yīng) 就可以;大部分情況下,軟實(shí)時(shí)響應(yīng)足以滿足要求:WINDOWSS 的98Crashed_Yet 在98% 的時(shí)間內(nèi)可 以在4 每秒內(nèi)響應(yīng) ,如果時(shí)間是20 秒,則總會(huì)響應(yīng)。那些軟實(shí)時(shí)性容易滿足。需要考慮的因素包括:上下文轉(zhuǎn)換時(shí)間、中斷延遲、任務(wù)的優(yōu)先級(jí)和任務(wù)調(diào)度方式。上下文轉(zhuǎn)換時(shí)間曾經(jīng)是實(shí)時(shí)性分析的重點(diǎn),但是因?yàn)镃PU速度大幅度提高,它不再是關(guān)鍵問(wèn)題。
現(xiàn)在,嚴(yán)格要求的實(shí)時(shí)性任務(wù)的決定因素是中斷例程本身和內(nèi)核中的其他驅(qū)動(dòng)程序有關(guān);而響應(yīng)延 遲時(shí)間主要受中斷的優(yōu)先級(jí)和其他進(jìn)程會(huì)暫時(shí)地關(guān)閉中斷響應(yīng)的影響。因此管理和驅(qū)動(dòng)中斷的機(jī)制必須 保證實(shí)時(shí)要求。
對(duì)于 x86處理器,實(shí)時(shí)擴(kuò)充可以在Linux 系統(tǒng)中很容易進(jìn)行,RT-Linux 就是很好的例子。它主要是把Linux 的任務(wù)作為自己的一個(gè)任務(wù),因此實(shí)時(shí)性要 求很高的任務(wù)不受非實(shí)時(shí)的Linux 的干擾,可以得到滿足。另外還提供了實(shí)時(shí)任務(wù)和Linux 的基本核 心和其他任務(wù)間的接口,這些接口是不需要很強(qiáng)的實(shí)時(shí)性。這種架構(gòu)為其他的嵌入式系統(tǒng)提供了一個(gè)參 考。關(guān)鍵因素就是實(shí)時(shí)性的代碼和非實(shí)時(shí)代碼分開(kāi)設(shè)計(jì),而且實(shí)時(shí)應(yīng)用程序的處理方式和其他程序的處 理方式差不多。
3. 適合嵌入式系統(tǒng)的Linux
有一種觀點(diǎn)認(rèn)為 :用戶不必直接干預(yù)機(jī)器的運(yùn)行,即沒(méi)有用戶接口的應(yīng)用系統(tǒng)是嵌入式系統(tǒng)。其他的比如 系統(tǒng)應(yīng)該是嵌入式系統(tǒng),但是它需要人為控制 。連接網(wǎng)絡(luò)需要監(jiān)視和控制網(wǎng)絡(luò)系統(tǒng)運(yùn)行的系統(tǒng) ,仍 然是嵌入式系統(tǒng);因此應(yīng)該根據(jù)系統(tǒng)的主要目的和功能來(lái)判定是否是嵌入式系統(tǒng)。
最小的嵌入式Linux 系統(tǒng)必須包括以下主要的要素:
1.啟動(dòng)程序 ;
2.融合了內(nèi)存管理、進(jìn)程管理和時(shí)間分批服務(wù)的核心;
3.初始化程序。
為了達(dá)到要求,而且為了保持最小系統(tǒng),需要添加以下要素:
硬件的驅(qū)動(dòng)程序;
必須的應(yīng)用程序。
根據(jù)其他需要, 你可能增加以下功能:
1. 文件管理系統(tǒng)( 在ROM 或RAM中);
2. TCP/IP 通訊協(xié)議;
3. 磁盤(pán)。
4.選擇合適的硬件平臺(tái)選擇硬件平臺(tái)是一件很麻煩的事,受很多因素影響,比如公司的指導(dǎo)原則、個(gè)人偏見(jiàn)、過(guò)去產(chǎn)品的影響和消息不靈通等。費(fèi)用是考慮的主要因素。提醒你考慮價(jià)格時(shí)不要只注 意CPU 的價(jià)錢(qián),要對(duì)整個(gè)系統(tǒng)進(jìn)行考慮。但是如果你是系統(tǒng)設(shè)計(jì)師,你必須把軟件的實(shí)時(shí)性和硬件結(jié)合起來(lái)考慮。首先考慮需要多快的CPU,然后把選擇三倍化的結(jié)果;因?yàn)樵趯?shí)際中應(yīng)用程序會(huì)使用一些cache( 緩 沖),所以理論上速度很快的CPU的實(shí)際速度會(huì)降低。其次考慮選擇多快的BUS( 總線); 如果可以包括其他的總線,比如PCI,就加上它。因?yàn)橛袝r(shí)即使使用DMA方式傳輸,也會(huì)使快速CPU 變得象蝸牛一般。選用集成外設(shè)的CPU比較好,而且還可選用現(xiàn)成的外設(shè)驅(qū)動(dòng)程序 ,大大減少調(diào)試工作,實(shí)際上有些芯片集成的功能并不是我們所需要的,所以也不要認(rèn)為凡是集成的都是好東西。
5.壓縮制作 Linux 系統(tǒng)對(duì)Linux 的通常感覺(jué)是大,似乎不適合于嵌入式系統(tǒng)。事實(shí)并非如此。 因?yàn)榈湫偷陌l(fā)行Linux 集成了很多桌面PC 機(jī)需要而嵌入式系統(tǒng)并不需要的功能。首先 ,我們可以把 核心(kernel) 從其他任務(wù)中分離出來(lái)。標(biāo)準(zhǔn)的Linux 核心總是貯留在內(nèi)存中;當(dāng)需要應(yīng)用程序時(shí), 它把需要的程序從磁盤(pán)調(diào)入內(nèi)存運(yùn)行。程序運(yùn)行完畢,內(nèi)存清空,卸載程序。在嵌入式系統(tǒng)中 ,經(jīng)常 沒(méi)有磁盤(pán) 。 目前有兩種辦法來(lái)處理沒(méi)有磁盤(pán)的情況。對(duì)于比較簡(jiǎn)單的系統(tǒng),核心(kernel)和應(yīng)用 程序同時(shí)貯留在內(nèi)存 ,當(dāng)系統(tǒng)啟動(dòng)時(shí),就啟動(dòng)應(yīng)用程序。這種方式和以前的嵌入式系統(tǒng)一樣工作。Linux 系統(tǒng)也支持這種方式。 第二種方式是,考慮到Linux 有l(wèi)oad ( 裝 載)和unload( 卸 載)程序的能力,嵌入式系統(tǒng)也可以使用這一特點(diǎn),來(lái)節(jié)約內(nèi)存。假如有一個(gè)典型的嵌入式系統(tǒng):包 括8 到16 M 的 和8 到16 M 的RAM ;可以在 上建立文件系統(tǒng),使用 的驅(qū)動(dòng)程序來(lái)驅(qū)動(dòng)Flash 上文件系統(tǒng)工作。 另外,也可以使用Flash Didsk, 其中有 一個(gè)例子是M- 的OnChip, 它可以支持達(dá)160 M 的Flash 。 把使用的應(yīng)用程序文 件存放在Flash 文件系統(tǒng)上, 根據(jù)需要調(diào)入程序。