朱宇,岳勇
(西安科技大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,陜西 西安 710054)
基于ARM的CC1100無(wú)線服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)
朱宇,岳勇
(西安科技大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,陜西 西安 710054)
對(duì)CC1100無(wú)線模塊的高效使用和安全穩(wěn)定性問(wèn)題進(jìn)行了深入研究,提出了構(gòu)建基于ARM的CC1100無(wú)線服務(wù)器的解決方案。建立了服務(wù)器架構(gòu)模型,采用了將CC1100模塊作為嵌入式Linux內(nèi)核級(jí)模塊的高級(jí)策略,開(kāi)發(fā)了CC1100模塊的底層內(nèi)核驅(qū)動(dòng)程序模塊,完整實(shí)現(xiàn)了服務(wù)器的業(yè)務(wù)邏輯功能,并提供了B/S模式和C/S模式兩種友好的上層用戶接口。實(shí)際應(yīng)用結(jié)果表明,該方案有效地解決了CC1100模塊通信過(guò)程中的實(shí)時(shí)性和穩(wěn)定性等問(wèn)題,性能優(yōu)越,用戶操作方便。
CC1100;服務(wù)器;ARM;Linux;嵌入式
隨著超大規(guī)模集成電路的不斷發(fā)展和半導(dǎo)體制作工藝的不斷提升,使得低功耗而又高性能的無(wú)線服務(wù)器得以實(shí)現(xiàn)。
三星公司的S3C2440芯片集成了ARM9處理器[1]。ARM(Advanced RISC Machines)處理器是微處理器行業(yè)的知名企業(yè)ARM公司設(shè)計(jì)的高性能、廉價(jià)、低功耗的RISC微處理器。其適用于嵌入控制、消費(fèi)/教育類多媒體、DSP和移動(dòng)式應(yīng)用等多種領(lǐng)域。
CC1100是一款為低功耗無(wú)線應(yīng)用而設(shè)計(jì)的低成本單片UHF收發(fā)器。電路主要設(shè)定為ISM (工業(yè),科學(xué)和醫(yī)學(xué))和SRD(短距離設(shè)備)頻率波段。CC1100為數(shù)據(jù)包處理、數(shù)據(jù)緩沖、突發(fā)數(shù)據(jù)傳輸、清晰信道評(píng)估、連接質(zhì)量指示和電磁波激發(fā)提供廣泛的硬件支持[2]。
因此,文中采用三星公司的S3C2440開(kāi)發(fā)板,搭載Linux嵌入式操作系統(tǒng),完成對(duì)CC1100無(wú)線模塊的數(shù)據(jù)收發(fā)控制。
系統(tǒng)總體架構(gòu)如圖1所示。服務(wù)器是核心部分,它使用的是三星公司的ARM9處理器S3C2440,其上搭載了嵌入式Linux操作系統(tǒng)。服務(wù)器對(duì)外提供了兩個(gè)接口,分別是RJ45網(wǎng)卡接口[3]和CC1100無(wú)線模塊。服務(wù)器與多個(gè)節(jié)點(diǎn)之間通過(guò)CC1100無(wú)線模塊進(jìn)行通信,通信按照一定的協(xié)議進(jìn)行。用戶與服務(wù)器之間通過(guò)網(wǎng)卡接口進(jìn)行通信。用戶可以使用B/S或C/S兩種模式連接到服務(wù)器以獲取數(shù)據(jù),或者向服務(wù)器發(fā)送數(shù)據(jù)。
圖1 系統(tǒng)總體架構(gòu)框圖Fig.1 Overall system architecture diagram
從系統(tǒng)總體架構(gòu)框圖中不難看出,服務(wù)器需要完成兩方面的工作。第一,服務(wù)器需要完成對(duì)CC1100模塊的操作,控制數(shù)據(jù)的發(fā)送與接收。并按照Linux操作系統(tǒng)的要求編寫(xiě)驅(qū)動(dòng)程序,對(duì)上層操作系統(tǒng)框架提供接口。第二,服務(wù)器需要向用戶提供B/S和C/S兩種模式的服務(wù)接口,并完成自身的服務(wù)任務(wù)。
服務(wù)器構(gòu)建的首要任務(wù)是服務(wù)器需要完成對(duì)CC1100模塊的操作,控制數(shù)據(jù)的發(fā)送與接收,生成符合Linux框架要求的內(nèi)核驅(qū)動(dòng)程序,為完成服務(wù)器的業(yè)務(wù)邏輯功能提供基礎(chǔ)。
CC1100模塊的主要操作參數(shù)和64位傳輸/接收FIFO (先進(jìn)先出堆棧)可通過(guò)SPI總線接口進(jìn)行控制[4]。除了SPI接口引腳之外,還需要其他3個(gè)控制引腳。CC1100的所有引腳包括SI、SCLK、SO、GD2、CSN 和 GC0。 其中,GD2 用作中斷引腳,當(dāng)CC1100接收到數(shù)據(jù)時(shí),為處理器提供中斷事件。因此,需要從處理器S3C2440上分配6個(gè)引腳,配置為CC1100使用。
在編寫(xiě)CC1100模塊的Linux驅(qū)動(dòng)程序之前,需要完成一項(xiàng)非常重要的工作。這項(xiàng)工作就是編寫(xiě)裸機(jī)程序,完成基本通信任務(wù)。
裸機(jī)程序的第一項(xiàng)任務(wù)是通過(guò)SPI總線協(xié)議完成CC1100模塊的初始化和基本配置參數(shù)設(shè)置,并按照CC1100的運(yùn)行狀態(tài)圖控制CC1100無(wú)線模塊的運(yùn)作流程。
裸機(jī)程序的第二項(xiàng)任務(wù)是實(shí)現(xiàn)基本的自定義通信協(xié)議。本通信協(xié)議的結(jié)構(gòu)如圖2所示。其中,長(zhǎng)度字段指地址和數(shù)據(jù)區(qū)長(zhǎng)度總和,目的地址字段指本地硬件地址,源地址字段指遠(yuǎn)端硬件地址,數(shù)據(jù)區(qū)字段指有效數(shù)據(jù),CRC字段指對(duì)數(shù)據(jù)校驗(yàn)。
圖2 CC1100無(wú)線模塊的通信協(xié)議Fig.2 CC1100 wireless module communication protocol
在實(shí)際開(kāi)發(fā)過(guò)程中,對(duì)完成的裸機(jī)程序需要生成測(cè)試用例,確保當(dāng)進(jìn)一步完成后續(xù)工作時(shí)硬件上不出錯(cuò)。
在完成了CC1100模塊裸機(jī)程序之后,接下來(lái)的任務(wù)就是生成符合Linux框架要求的內(nèi)核驅(qū)動(dòng)程序[5]。首先,此處將CC1100模塊作為混合設(shè)備定義到Linux內(nèi)核中[6],并生成設(shè)備/dev/cc1100。然后,按照Linux內(nèi)核程序格式移植裸機(jī)程序,實(shí)現(xiàn)CC1100驅(qū)動(dòng)程序。
移植部分的核心任務(wù)主要包括文件的寫(xiě)入,文件的讀出,中斷操作、命令控制四部分。其中對(duì)寫(xiě)操作加互斥鎖,以支持并發(fā)寫(xiě)。對(duì)讀操作加互斥鎖[7],以支持并發(fā)讀,同時(shí)使用等待隊(duì)列cc1100_waitq與中斷操作交互協(xié)作,共同完成數(shù)據(jù)的讀出操作。另外,還提供了對(duì)各種地址支持,其中包括本地物理地址,遠(yuǎn)端發(fā)送地址和接受端地址等。
2.3.1 寫(xiě)操作部分
寫(xiě)操作相對(duì)簡(jiǎn)單,主要是處理CC1100的狀態(tài)變化和并發(fā)操作。CC1100的狀態(tài)變化遵循接收->空閑->發(fā)送的變化過(guò)程。首先,寫(xiě)數(shù)據(jù)到FIFO,然后改變CC1100狀態(tài)到發(fā)送狀態(tài),接著判斷數(shù)據(jù)發(fā)送是否完成,發(fā)送完成后,轉(zhuǎn)入接收狀態(tài)。并發(fā)操作是通過(guò)對(duì)寫(xiě)操作加斥鎖來(lái)實(shí)現(xiàn)的,其消除同時(shí)寫(xiě)所引發(fā)的異常問(wèn)題。
2.3.2 讀操作部分
讀操作需要完成處理并發(fā)操作和配合中斷操作實(shí)現(xiàn)數(shù)據(jù)讀取兩方面的任務(wù)。并發(fā)操作由對(duì)讀操作加鎖實(shí)現(xiàn)斥鎖,消除同時(shí)讀的問(wèn)題。實(shí)現(xiàn)上,CC1100使用中斷方式進(jìn)行數(shù)據(jù)讀取,并按照一定的流程進(jìn)行:首先,對(duì)讀操作加鎖并判斷CC1100是否完成了數(shù)據(jù)接收,如果已經(jīng)接收到數(shù)據(jù),則改變標(biāo)志位并讀取數(shù)據(jù),之后解鎖返回。如果尚未接收到數(shù)據(jù)則進(jìn)行超時(shí)等待,若超時(shí)則解鎖返回;否則改變標(biāo)志位并返回。另一方面,因?yàn)槭谴髩K字節(jié)讀取,所以不需要考慮頻繁喚醒帶來(lái)的代價(jià)。
進(jìn)一步考慮讀寫(xiě)操作之間的互斥問(wèn)題。如果在中斷處理過(guò)程中發(fā)生寫(xiě)操作[8],由于CC1100此時(shí)處于接收狀態(tài),則寫(xiě)操作將被丟棄。如果寫(xiě)操作中未關(guān)中斷[9]或者CC1100未改變到空閑和發(fā)送狀態(tài)時(shí)發(fā)生中斷,則可以順利完成數(shù)據(jù)接收,否則CC1100將中斷丟棄。因此,可以確保接收和發(fā)送之間的互斥操作,適應(yīng)CC1100的半雙工收發(fā)性質(zhì)。
2.3.3 中斷響應(yīng)部分
中斷操作主要是注意狀態(tài)變化。CC1100的狀態(tài)變化遵循發(fā)送->空閑->發(fā)送的變化過(guò)程。首先中斷處理過(guò)程中接收數(shù)據(jù)到緩沖區(qū),然后改變CC1100到空閑狀態(tài),繼而轉(zhuǎn)入到接收狀態(tài),最后是改變標(biāo)志并喚醒讀取等待隊(duì)列cc1100_wait q。
2.3.4 控制部分
控制部件主要完成本地物理地址的讀寫(xiě),遠(yuǎn)端地址的讀寫(xiě)和接收到的地址。其中接收地址可以用于判斷當(dāng)前數(shù)據(jù)包是否為廣播包。
服務(wù)器的最重要任務(wù)是依賴CC1100模塊的Linux內(nèi)核驅(qū)動(dòng)完成自身的服務(wù)任務(wù),并向用戶提供B/S和C/S兩種模式的服務(wù)接口。
B/S服務(wù)器系統(tǒng)架構(gòu)圖如圖3所示。從圖3中不難看出B/S服務(wù)器包括Web服務(wù)器Boa、CC1100服務(wù)器和CC1100驅(qū)動(dòng)模塊3大部分,其中CC1100服務(wù)器需要協(xié)調(diào)好與其他二者的交互,完成通信任務(wù)。
具體的交互過(guò)程如下:首先,架設(shè)好Web服務(wù)器,等待用戶訪問(wèn)當(dāng)前服務(wù)站點(diǎn)。當(dāng)用戶訪問(wèn)該站點(diǎn)并提交請(qǐng)求信息時(shí),Web服務(wù)器將用戶提交的請(qǐng)求信息交給CGI(Common Gateway Interface,公共網(wǎng)關(guān)接口)處理程序。然后,CGI處理程序調(diào)用CC1100服務(wù)器提供的接口,將提取后的關(guān)鍵數(shù)據(jù)作為參數(shù)傳入到CC1100服務(wù)器中。接著CC1100服務(wù)器根據(jù)傳入的參數(shù)完成業(yè)務(wù)邏輯,并向下層的CC1100驅(qū)動(dòng)模塊發(fā)送數(shù)據(jù)。CC1100驅(qū)動(dòng)模塊完成數(shù)據(jù)發(fā)送后并接收數(shù)據(jù)。最后,CC1100服務(wù)器從CC1100驅(qū)動(dòng)模塊中讀取數(shù)據(jù),經(jīng)過(guò)業(yè)務(wù)邏輯處理后,將數(shù)據(jù)處理結(jié)果返回到CGI處理程序。CGI處理程序把處理結(jié)果傳送給Web服務(wù)器。Web服務(wù)器把結(jié)果送回到用戶。
3.1.1 架設(shè)Web服務(wù)器
圖3 B/S服務(wù)器系統(tǒng)架構(gòu)框圖Fig.3 B/S server system architecture diagram
在B/S服務(wù)器系統(tǒng)中,選用了適合嵌入式環(huán)境的Web服務(wù)器Boa。Boa服務(wù)器是一種非常小巧高效的單任務(wù)Web服務(wù)器,其運(yùn)行于Unix或Linux系統(tǒng)下,支持CGI,適合于嵌入式系統(tǒng),并具有極高的安全性。
使用時(shí),只需對(duì)Boa服務(wù)器做簡(jiǎn)單配置即可。首先,在嵌入式Linux系統(tǒng)的啟動(dòng)配置文件/etc/init.d/rcS中添加/etc/rc.d/init.d/boad start,開(kāi)機(jī)啟動(dòng)Boa服務(wù)器。然后對(duì)Boa服務(wù)器自身進(jìn)行簡(jiǎn)單配置,包括端口號(hào)、用戶權(quán)限、組權(quán)限、虛擬根目錄、默認(rèn)主頁(yè)和CGI處理程序路徑等。經(jīng)過(guò)以上配置后Web服務(wù)器就架設(shè)完成了。
3.1.2 服務(wù)器業(yè)務(wù)流程
CC1100服務(wù)器的任務(wù)包括CGI交互業(yè)務(wù)和CC1100驅(qū)動(dòng)模塊交互業(yè)務(wù)兩個(gè)方面。
CC1100服務(wù)器與CGI交互的業(yè)務(wù)是通過(guò)管道來(lái)實(shí)現(xiàn)的。CC1100服務(wù)器建立了兩個(gè)管道cc1100_pipe_input和cc1100_pipe_output。CGI處理程序向管道cc1100_pipe_input一端寫(xiě)入數(shù)據(jù),CC1100服務(wù)器從管道cc1100_pipe_input另一端讀取數(shù)據(jù);CC1100服務(wù)器向管道cc1100_pipe_output一端寫(xiě)入數(shù)據(jù),CGI處理程序從管道cc1100_pipe_output另一端讀取數(shù)據(jù)。
CC1100服務(wù)器與CC1100驅(qū)動(dòng)模塊交互的業(yè)務(wù)是通過(guò)監(jiān)聽(tīng)線程來(lái)實(shí)現(xiàn)的。CC1100服務(wù)器建立了兩個(gè)線程,輸入處理線程和輸出處理線程。當(dāng)輸入處理線程監(jiān)聽(tīng)cc1100_pipe_input
中有數(shù)據(jù)時(shí),將數(shù)據(jù)讀出,經(jīng)過(guò)業(yè)務(wù)邏輯處理后,發(fā)送給CC1100驅(qū)動(dòng)模塊。而輸出處理線程一直監(jiān)聽(tīng)CC1100驅(qū)動(dòng)模塊是否接收到數(shù)據(jù),當(dāng)CC1100驅(qū)動(dòng)模塊接收到數(shù)據(jù)時(shí),輸出處理線程讀取數(shù)據(jù),經(jīng)過(guò)業(yè)務(wù)邏輯處理后,發(fā)送到cc1100_pipe_output即可。
3.1.3 啟動(dòng)CC1100服務(wù)器
作為系統(tǒng)后臺(tái)服務(wù)程序,CC1100服務(wù)器應(yīng)具備開(kāi)機(jī)啟動(dòng)功能。只需在嵌入式Linux系統(tǒng)的啟動(dòng)配置文件/etc/init.d/rcS中添加/etc/rc.d/init.d/cc1100server start,即可開(kāi)機(jī)啟動(dòng)CC1100服務(wù)器。
C/S服務(wù)器系統(tǒng)架構(gòu)圖如圖4所示。從圖4中不難看出C/S服務(wù)器包括CC1100服務(wù)器和CC1100驅(qū)動(dòng)模塊兩大部分。其中CC1100服務(wù)器負(fù)責(zé)監(jiān)聽(tīng)用戶請(qǐng)求,并完成與CC1100驅(qū)動(dòng)模塊的通信任務(wù)。
其交互過(guò)程與B/S服務(wù)器架構(gòu)基本類似,具體的交互過(guò)程如下:首先,CC1100服務(wù)器使用Socket監(jiān)聽(tīng)用戶請(qǐng)求,當(dāng)有用戶連接到服務(wù)器時(shí),CC1100服務(wù)器根據(jù)傳入的數(shù)據(jù)完成業(yè)務(wù)邏輯,并向下層的CC1100驅(qū)動(dòng)模塊發(fā)送數(shù)據(jù)。然后,CC1100驅(qū)動(dòng)模塊完成數(shù)據(jù)發(fā)送后并接收數(shù)據(jù)。最后,CC1100服務(wù)器從CC1100驅(qū)動(dòng)模塊中讀取數(shù)據(jù),經(jīng)過(guò)業(yè)務(wù)邏輯處理后,返回到用戶。
圖4 C/S服務(wù)器系統(tǒng)架構(gòu)框圖Fig.4 C/S server system architecture diagram
文中從實(shí)際應(yīng)用的角度出發(fā),設(shè)計(jì)并實(shí)現(xiàn)了CC1100無(wú)線服務(wù)器。該服務(wù)器充分利用了嵌入式Linux系統(tǒng)的優(yōu)越性能,從內(nèi)核級(jí)驅(qū)動(dòng)了CC1100模塊,并在應(yīng)用層為用戶提供了B/S和C/S兩種接口。實(shí)際運(yùn)行結(jié)果表明,本文所設(shè)計(jì)的CC1100服務(wù)器完全能夠滿足CC1100模塊的通信任務(wù),較為完善的解決了CC1100模塊接收和發(fā)送數(shù)據(jù)沖突的問(wèn)題,同時(shí)其友好的人機(jī)交互接口在用戶操作方面也顯現(xiàn)了極大的優(yōu)勢(shì)。
[1]孫天澤,袁文菊.嵌入式設(shè)計(jì)及Linux驅(qū)動(dòng)開(kāi)發(fā)指南:基于ARM9處理器[M].3版.北京:電子工業(yè)出版社,2009.
[2]李文仲,段朝玉.CC1110/CC2510無(wú)線單片機(jī)和無(wú)線自組織網(wǎng)絡(luò)入門(mén)與實(shí)戰(zhàn)[M].北京:北京航空航天大學(xué)出版社,2008.
[3]楊水清,張劍,施云飛,等.ARM嵌入式Linux系統(tǒng)開(kāi)發(fā)技術(shù)詳解[M].北京:電子工業(yè)出版社,2008.
[4]黃智偉,鄧月明,王彥.ARM9嵌入式系統(tǒng)設(shè)計(jì)基礎(chǔ)教程[M].北京:北京航空航天大學(xué)出版社,2008.
[5]潘巨龍,黃寧,姚伏天,等.ARM9嵌入式Linux系統(tǒng)構(gòu)建與應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2006.
[6]Corbet J,Rubimie A,Kroab-Hartman G.Linux設(shè)備驅(qū)動(dòng)程序[M].北京:中國(guó)電力出版社,2006.
[7]Rodriguez C S,F(xiàn)ischer G,SmolskiS.Linux內(nèi)核編程[M].北京:人民郵電出版社,2011.
[8]徐英慧.ARM9嵌入式系統(tǒng)設(shè)計(jì):基于S3C2410與Linux[M].北京:北京航空航天大學(xué)出版社,2010.
[9]王洪輝.嵌入式系統(tǒng)Linux內(nèi)核開(kāi)發(fā)實(shí)戰(zhàn)指南:ARM平臺(tái)[M].北京:電子工業(yè)出版社社,2009.
Design and realization of CC1100 wireless server based on ARM
ZHU Yu,YUE Yong
(School of Computer Science and Technology, Xi'an University of Science and Technology, Xi’an 710054, China)
ARM-based CC1100 wireless server solution was put forward,after depth study of the full use of the CC1100 wireless and its stability issues.A server architecture model was established,with the advanced strategy which used the CC1100 module as embedded Linux kernel-level modules.This server developed the underlying kernel driver module for CC1100 module.We completely implemented the server business logic functions and provided the two user interfaces of B/S and C/S.The practical application results show that the solution effectively solves the real-time and stability during the CC1100 module communication,which is superior performance and easy to operate.
CC1100; server; ARM; Linux; embedded
TP319;TP316.89;TP332
A
1674-6236(2013)04-0187-03
2012-10-09稿件編號(hào)201210037
朱 宇(1955—),男,遼寧鐵嶺人,副教授。研究方向:嵌入式系統(tǒng)、計(jì)算機(jī)監(jiān)測(cè)與控制和計(jì)算機(jī)網(wǎng)絡(luò)。