
韓冷(1977-)
男,碩士研究生,研究方向?yàn)榫W(wǎng)絡(luò)控制技術(shù)。
1 引言
過(guò)去的十年中,嵌入式系統(tǒng)的開(kāi)發(fā)發(fā)生了很大的變化。以前嵌入式設(shè)備往往是一個(gè)孤立的、資源有限的系統(tǒng),它們追求的是在有限的價(jià)格上滿足一定的功能性要求。通常它們采用那些功能并不強(qiáng)大的CPU。而今天人們對(duì)嵌入式設(shè)備在智能化和互連性上提出了要求,這使得嵌入式設(shè)備不再是孤立的,它們要通過(guò)互聯(lián)網(wǎng)、無(wú)線或是其他的方式實(shí)現(xiàn)相互連 接,同時(shí)它們也是軟件生態(tài)系統(tǒng)(software ecosystem)的一部分。嵌入式設(shè)備今天變成了稱(chēng)之為“等同PC”的系統(tǒng)。它們必須運(yùn)行很多相同的應(yīng)用程序,它們需要采用相同的方式實(shí)現(xiàn)互連或是在某些情況下增強(qiáng)互連性。
而近年來(lái)在國(guó)內(nèi),支持802.11b的無(wú)線網(wǎng)絡(luò)已經(jīng)日漸普及,無(wú)線網(wǎng)卡價(jià)格大幅跌落,給廣大的無(wú)線電子產(chǎn)品設(shè)計(jì)者提供了更多的選擇,極大豐富了設(shè)計(jì)和開(kāi)發(fā)者的想象空間,逐漸設(shè)計(jì)出具有無(wú)線網(wǎng)絡(luò)數(shù)據(jù)共享、無(wú)線數(shù)據(jù)采集、無(wú)線告警等功能的最具競(jìng)爭(zhēng)力的“后PC時(shí)代”產(chǎn)品。
與此同時(shí),配備一個(gè)優(yōu)秀的圖形用戶界面,使產(chǎn)品和用戶能進(jìn)行友善可靠的交互也已成為開(kāi)發(fā)工作中非常緊迫的要求。本系統(tǒng)中使用的MiniGUI就是嵌入式Linux系統(tǒng)下一個(gè)輕量級(jí)的圖形用戶界面支持系統(tǒng),目前已比較成熟,并已被用到很多項(xiàng)目的實(shí)際開(kāi)發(fā)中。
2 無(wú)線終端的硬件系統(tǒng)設(shè)計(jì)
無(wú)線終端設(shè)備的硬件模塊如圖1所示。
• PowerPC與Flash,RAM組成最小運(yùn)行系統(tǒng),提供無(wú)線終端設(shè)備軟件運(yùn)行的環(huán)境。PowerPC還提供一個(gè)以太網(wǎng)端口和一個(gè)RS-232串行口,用于程序的調(diào)試、修改、編譯及燒寫(xiě)。
• MPC823系列處理器是迄今為止摩托羅拉推出的PowerQUICC家族中,被廣泛使用的通訊處理器。它是嵌入式處理器內(nèi)核(embedded PowerPC core)和通訊處理器模塊(CPM)的雙處理器的結(jié)構(gòu),片內(nèi)的數(shù)據(jù)和指令cache,I/O腳的數(shù)目,一個(gè)實(shí)時(shí)時(shí)鐘,低功耗特性和一個(gè)增強(qiáng)的存儲(chǔ)控制器,性能遠(yuǎn)勝于68360 QUICC。

圖1 無(wú)線終端的硬件模塊
3 軟件系統(tǒng)框架結(jié)構(gòu)
用戶應(yīng)用程序是最上層的開(kāi)發(fā),其交互界面直接通過(guò)MiniGUI圖形系統(tǒng)的API接口函數(shù)實(shí)現(xiàn)。MiniGUI交叉編譯安裝后一般以庫(kù)的形式存放在操作系統(tǒng)/powerpc-linux/local/lib文件目錄下。
該嵌入式系統(tǒng)的框架結(jié)構(gòu)如圖2所示。

圖2 無(wú)線終端設(shè)備的軟件模塊
4 Linux設(shè)備驅(qū)動(dòng)
系統(tǒng)調(diào)用是操作系統(tǒng)內(nèi)核和應(yīng)用之間的接口,設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口。Linux設(shè)備驅(qū)動(dòng)程序?yàn)閼?yīng)用程序屏蔽了硬件的細(xì)節(jié),在應(yīng)用程序看來(lái),Linux硬件設(shè)備只是一個(gè)設(shè)備文件,應(yīng)用程序可以像操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作。設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,它完成以下的功能:
• 對(duì)設(shè)備初始化和釋放;
• 把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù);
• 讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序請(qǐng)求的數(shù)據(jù);
• 檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤。
Linux系統(tǒng)的設(shè)備分為三種:字符設(shè)備(Char Device)、塊設(shè)備(Block Device)和網(wǎng)絡(luò)設(shè)備(Network Device)。字符設(shè)備是指存取時(shí)沒(méi)有緩存,只能順序訪問(wèn)的設(shè)備。塊設(shè)備的讀/寫(xiě)都有緩存來(lái)支持,并且塊設(shè)備必須能夠隨機(jī)存取,字符設(shè)備則沒(méi)有這個(gè)要求。典型的字符設(shè)備包括鼠標(biāo)、鍵盤(pán)、串行口等。塊設(shè)備主要包括硬盤(pán)、軟盤(pán)設(shè)備、CDROM等。文件系統(tǒng)必須安裝在塊設(shè)備上。塊設(shè)備主要是針對(duì)磁盤(pán)等慢速設(shè)備設(shè)計(jì)的,以免耗費(fèi)過(guò)多的CPU時(shí)間來(lái)等待。
網(wǎng)絡(luò)設(shè)備在Linux里做專(zhuān)門(mén)的處理。Linux的網(wǎng)絡(luò)系統(tǒng)主要是基于BSD Unix的Socket機(jī)制。在系統(tǒng)和驅(qū)動(dòng)程序之間定義有專(zhuān)門(mén)的數(shù)據(jù)結(jié)構(gòu)(sk_buff)進(jìn)行數(shù)據(jù)的傳遞。系統(tǒng)里支持對(duì)發(fā)送資料和接收資料的緩存,提供流量控制機(jī)制,提供對(duì)多協(xié)議的支持。
Linux給每個(gè)設(shè)備都分配一個(gè)主設(shè)備號(hào)(Major Number)和次設(shè)備號(hào)(Minor Number)。主設(shè)備號(hào)一般用來(lái)定義這個(gè)設(shè)備的類(lèi)型。次設(shè)備號(hào)是一個(gè)8位的數(shù)字,它是指定一個(gè)特定的設(shè)備(主設(shè)備號(hào)指定設(shè)備的類(lèi)型)。Linux具有設(shè)備無(wú)關(guān)性,它把每個(gè)設(shè)備都抽象為文件系統(tǒng)的一個(gè)文件。Linux為每個(gè)設(shè)備在/dev目錄下建立一個(gè)文件。
4.1 無(wú)線網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)編程
Linux中的網(wǎng)絡(luò)設(shè)備又被稱(chēng)為網(wǎng)絡(luò)接口,作為其中的三類(lèi)設(shè)備之一,它有其非常特殊的地方。網(wǎng)絡(luò)接口在Linux的文件系統(tǒng)中不存在一個(gè)對(duì)應(yīng)的文件,而是在核心中用一個(gè)net_device數(shù)據(jù)結(jié)構(gòu)表示的。Linux網(wǎng)絡(luò)驅(qū)動(dòng)程序的體系結(jié)構(gòu)如圖3所示。可以劃分為四層,從上到下分別為協(xié)議接口層,網(wǎng)絡(luò)設(shè)備接口層,再就是提供實(shí)際功能的設(shè)備驅(qū)動(dòng)功能層,以及網(wǎng)絡(luò)設(shè)備和網(wǎng)絡(luò)媒介層。在設(shè)計(jì)網(wǎng)絡(luò)驅(qū)動(dòng)程序時(shí),最主要的工作就是完成設(shè)備驅(qū)動(dòng)功能層,使其滿足自己所需的功能。

圖3 網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)結(jié)構(gòu)
在Linux中所有網(wǎng)絡(luò)設(shè)備都抽象為一個(gè)接口,這個(gè)接口提供了對(duì)所有網(wǎng)絡(luò)設(shè)備的操作集合。由數(shù)據(jù)結(jié)構(gòu)struct net_device來(lái)表示網(wǎng)絡(luò)設(shè)備在內(nèi)核中的運(yùn)行情況,即網(wǎng)絡(luò)設(shè)備接口。它既包括純軟件網(wǎng)絡(luò)設(shè)備接口,如環(huán)路(Loopback),也包括硬件網(wǎng)絡(luò)設(shè)備接口,如無(wú)線網(wǎng)卡。而由以dev_base為頭指針的設(shè)備鏈表來(lái)集體管理所有網(wǎng)絡(luò)設(shè)備,該設(shè)備鏈表中的每個(gè)元素代表一個(gè)網(wǎng)絡(luò)設(shè)備接口。數(shù)據(jù)結(jié)構(gòu)net_device中有很多供系統(tǒng)訪問(wèn)和協(xié)議層調(diào)用的設(shè)備方法,包括初始化,打開(kāi)和關(guān)閉網(wǎng)絡(luò)設(shè)備的open和stop函數(shù),處理數(shù)據(jù)包發(fā)送的hard_start_xmit函數(shù),以及中斷處理函數(shù)等。
由于采用PCMCIA接口的無(wú)線網(wǎng)卡,首先是向內(nèi)核注冊(cè)該P(yáng)CMCIA設(shè)備(register_pccard_driver),然后driver_info_t數(shù)據(jù)結(jié)構(gòu)中的attach函數(shù)指針?biāo)赶虻膫蓽y(cè)函數(shù)來(lái)初始化該P(yáng)CMCIA設(shè)備,并且同時(shí)注冊(cè)和初始化該網(wǎng)絡(luò)設(shè)備。
4.2 字符設(shè)備驅(qū)動(dòng)






案例頻道