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

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

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

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






案例頻道