?

基于ARM的CC1100無線服務器的設計與實現

2013-07-13 06:43朱宇岳勇
電子設計工程 2013年4期
關鍵詞:驅動程序內核嵌入式

朱宇,岳勇

(西安科技大學 計算機科學與技術學院,陜西 西安 710054)

基于ARM的CC1100無線服務器的設計與實現

朱宇,岳勇

(西安科技大學 計算機科學與技術學院,陜西 西安 710054)

對CC1100無線模塊的高效使用和安全穩定性問題進行了深入研究,提出了構建基于ARM的CC1100無線服務器的解決方案。建立了服務器架構模型,采用了將CC1100模塊作為嵌入式Linux內核級模塊的高級策略,開發了CC1100模塊的底層內核驅動程序模塊,完整實現了服務器的業務邏輯功能,并提供了B/S模式和C/S模式兩種友好的上層用戶接口。實際應用結果表明,該方案有效地解決了CC1100模塊通信過程中的實時性和穩定性等問題,性能優越,用戶操作方便。

CC1100;服務器;ARM;Linux;嵌入式

隨著超大規模集成電路的不斷發展和半導體制作工藝的不斷提升,使得低功耗而又高性能的無線服務器得以實現。

三星公司的S3C2440芯片集成了ARM9處理器[1]。ARM(Advanced RISC Machines)處理器是微處理器行業的知名企業ARM公司設計的高性能、廉價、低功耗的RISC微處理器。其適用于嵌入控制、消費/教育類多媒體、DSP和移動式應用等多種領域。

CC1100是一款為低功耗無線應用而設計的低成本單片UHF收發器。電路主要設定為ISM (工業,科學和醫學)和SRD(短距離設備)頻率波段。CC1100為數據包處理、數據緩沖、突發數據傳輸、清晰信道評估、連接質量指示和電磁波激發提供廣泛的硬件支持[2]。

因此,文中采用三星公司的S3C2440開發板,搭載Linux嵌入式操作系統,完成對CC1100無線模塊的數據收發控制。

1 系統總體架構

系統總體架構如圖1所示。服務器是核心部分,它使用的是三星公司的ARM9處理器S3C2440,其上搭載了嵌入式Linux操作系統。服務器對外提供了兩個接口,分別是RJ45網卡接口[3]和CC1100無線模塊。服務器與多個節點之間通過CC1100無線模塊進行通信,通信按照一定的協議進行。用戶與服務器之間通過網卡接口進行通信。用戶可以使用B/S或C/S兩種模式連接到服務器以獲取數據,或者向服務器發送數據。

圖1 系統總體架構框圖Fig.1 Overall system architecture diagram

從系統總體架構框圖中不難看出,服務器需要完成兩方面的工作。第一,服務器需要完成對CC1100模塊的操作,控制數據的發送與接收。并按照Linux操作系統的要求編寫驅動程序,對上層操作系統框架提供接口。第二,服務器需要向用戶提供B/S和C/S兩種模式的服務接口,并完成自身的服務任務。

2 核心Linux驅動程序

服務器構建的首要任務是服務器需要完成對CC1100模塊的操作,控制數據的發送與接收,生成符合Linux框架要求的內核驅動程序,為完成服務器的業務邏輯功能提供基礎。

2.1 硬件接口映射

CC1100模塊的主要操作參數和64位傳輸/接收FIFO (先進先出堆棧)可通過SPI總線接口進行控制[4]。除了SPI接口引腳之外,還需要其他3個控制引腳。CC1100的所有引腳包括SI、SCLK、SO、GD2、CSN 和 GC0。 其中,GD2 用作中斷引腳,當CC1100接收到數據時,為處理器提供中斷事件。因此,需要從處理器S3C2440上分配6個引腳,配置為CC1100使用。

2.2 CC1100裸機通信

在編寫CC1100模塊的Linux驅動程序之前,需要完成一項非常重要的工作。這項工作就是編寫裸機程序,完成基本通信任務。

裸機程序的第一項任務是通過SPI總線協議完成CC1100模塊的初始化和基本配置參數設置,并按照CC1100的運行狀態圖控制CC1100無線模塊的運作流程。

裸機程序的第二項任務是實現基本的自定義通信協議。本通信協議的結構如圖2所示。其中,長度字段指地址和數據區長度總和,目的地址字段指本地硬件地址,源地址字段指遠端硬件地址,數據區字段指有效數據,CRC字段指對數據校驗。

圖2 CC1100無線模塊的通信協議Fig.2 CC1100 wireless module communication protocol

在實際開發過程中,對完成的裸機程序需要生成測試用例,確保當進一步完成后續工作時硬件上不出錯。

2.3 CC1100驅動程序編寫

在完成了CC1100模塊裸機程序之后,接下來的任務就是生成符合Linux框架要求的內核驅動程序[5]。首先,此處將CC1100模塊作為混合設備定義到Linux內核中[6],并生成設備/dev/cc1100。然后,按照Linux內核程序格式移植裸機程序,實現CC1100驅動程序。

移植部分的核心任務主要包括文件的寫入,文件的讀出,中斷操作、命令控制四部分。其中對寫操作加互斥鎖,以支持并發寫。對讀操作加互斥鎖[7],以支持并發讀,同時使用等待隊列cc1100_waitq與中斷操作交互協作,共同完成數據的讀出操作。另外,還提供了對各種地址支持,其中包括本地物理地址,遠端發送地址和接受端地址等。

2.3.1 寫操作部分

寫操作相對簡單,主要是處理CC1100的狀態變化和并發操作。CC1100的狀態變化遵循接收->空閑->發送的變化過程。首先,寫數據到FIFO,然后改變CC1100狀態到發送狀態,接著判斷數據發送是否完成,發送完成后,轉入接收狀態。并發操作是通過對寫操作加斥鎖來實現的,其消除同時寫所引發的異常問題。

2.3.2 讀操作部分

讀操作需要完成處理并發操作和配合中斷操作實現數據讀取兩方面的任務。并發操作由對讀操作加鎖實現斥鎖,消除同時讀的問題。實現上,CC1100使用中斷方式進行數據讀取,并按照一定的流程進行:首先,對讀操作加鎖并判斷CC1100是否完成了數據接收,如果已經接收到數據,則改變標志位并讀取數據,之后解鎖返回。如果尚未接收到數據則進行超時等待,若超時則解鎖返回;否則改變標志位并返回。另一方面,因為是大塊字節讀取,所以不需要考慮頻繁喚醒帶來的代價。

進一步考慮讀寫操作之間的互斥問題。如果在中斷處理過程中發生寫操作[8],由于CC1100此時處于接收狀態,則寫操作將被丟棄。如果寫操作中未關中斷[9]或者CC1100未改變到空閑和發送狀態時發生中斷,則可以順利完成數據接收,否則CC1100將中斷丟棄。因此,可以確保接收和發送之間的互斥操作,適應CC1100的半雙工收發性質。

2.3.3 中斷響應部分

中斷操作主要是注意狀態變化。CC1100的狀態變化遵循發送->空閑->發送的變化過程。首先中斷處理過程中接收數據到緩沖區,然后改變CC1100到空閑狀態,繼而轉入到接收狀態,最后是改變標志并喚醒讀取等待隊列cc1100_wait q。

2.3.4 控制部分

控制部件主要完成本地物理地址的讀寫,遠端地址的讀寫和接收到的地址。其中接收地址可以用于判斷當前數據包是否為廣播包。

3 構建服務器

服務器的最重要任務是依賴CC1100模塊的Linux內核驅動完成自身的服務任務,并向用戶提供B/S和C/S兩種模式的服務接口。

3.1 構建B/S服務器

B/S服務器系統架構圖如圖3所示。從圖3中不難看出B/S服務器包括Web服務器Boa、CC1100服務器和CC1100驅動模塊3大部分,其中CC1100服務器需要協調好與其他二者的交互,完成通信任務。

具體的交互過程如下:首先,架設好Web服務器,等待用戶訪問當前服務站點。當用戶訪問該站點并提交請求信息時,Web服務器將用戶提交的請求信息交給CGI(Common Gateway Interface,公共網關接口)處理程序。然后,CGI處理程序調用CC1100服務器提供的接口,將提取后的關鍵數據作為參數傳入到CC1100服務器中。接著CC1100服務器根據傳入的參數完成業務邏輯,并向下層的CC1100驅動模塊發送數據。CC1100驅動模塊完成數據發送后并接收數據。最后,CC1100服務器從CC1100驅動模塊中讀取數據,經過業務邏輯處理后,將數據處理結果返回到CGI處理程序。CGI處理程序把處理結果傳送給Web服務器。Web服務器把結果送回到用戶。

3.1.1 架設Web服務器

圖3 B/S服務器系統架構框圖Fig.3 B/S server system architecture diagram

在B/S服務器系統中,選用了適合嵌入式環境的Web服務器Boa。Boa服務器是一種非常小巧高效的單任務Web服務器,其運行于Unix或Linux系統下,支持CGI,適合于嵌入式系統,并具有極高的安全性。

使用時,只需對Boa服務器做簡單配置即可。首先,在嵌入式Linux系統的啟動配置文件/etc/init.d/rcS中添加/etc/rc.d/init.d/boad start,開機啟動Boa服務器。然后對Boa服務器自身進行簡單配置,包括端口號、用戶權限、組權限、虛擬根目錄、默認主頁和CGI處理程序路徑等。經過以上配置后Web服務器就架設完成了。

3.1.2 服務器業務流程

CC1100服務器的任務包括CGI交互業務和CC1100驅動模塊交互業務兩個方面。

CC1100服務器與CGI交互的業務是通過管道來實現的。CC1100服務器建立了兩個管道cc1100_pipe_input和cc1100_pipe_output。CGI處理程序向管道cc1100_pipe_input一端寫入數據,CC1100服務器從管道cc1100_pipe_input另一端讀取數據;CC1100服務器向管道cc1100_pipe_output一端寫入數據,CGI處理程序從管道cc1100_pipe_output另一端讀取數據。

CC1100服務器與CC1100驅動模塊交互的業務是通過監聽線程來實現的。CC1100服務器建立了兩個線程,輸入處理線程和輸出處理線程。當輸入處理線程監聽cc1100_pipe_input

中有數據時,將數據讀出,經過業務邏輯處理后,發送給CC1100驅動模塊。而輸出處理線程一直監聽CC1100驅動模塊是否接收到數據,當CC1100驅動模塊接收到數據時,輸出處理線程讀取數據,經過業務邏輯處理后,發送到cc1100_pipe_output即可。

3.1.3 啟動CC1100服務器

作為系統后臺服務程序,CC1100服務器應具備開機啟動功能。只需在嵌入式Linux系統的啟動配置文件/etc/init.d/rcS中添加/etc/rc.d/init.d/cc1100server start,即可開機啟動CC1100服務器。

3.2 構建C/S服務器

C/S服務器系統架構圖如圖4所示。從圖4中不難看出C/S服務器包括CC1100服務器和CC1100驅動模塊兩大部分。其中CC1100服務器負責監聽用戶請求,并完成與CC1100驅動模塊的通信任務。

其交互過程與B/S服務器架構基本類似,具體的交互過程如下:首先,CC1100服務器使用Socket監聽用戶請求,當有用戶連接到服務器時,CC1100服務器根據傳入的數據完成業務邏輯,并向下層的CC1100驅動模塊發送數據。然后,CC1100驅動模塊完成數據發送后并接收數據。最后,CC1100服務器從CC1100驅動模塊中讀取數據,經過業務邏輯處理后,返回到用戶。

圖4 C/S服務器系統架構框圖Fig.4 C/S server system architecture diagram

4 結束語

文中從實際應用的角度出發,設計并實現了CC1100無線服務器。該服務器充分利用了嵌入式Linux系統的優越性能,從內核級驅動了CC1100模塊,并在應用層為用戶提供了B/S和C/S兩種接口。實際運行結果表明,本文所設計的CC1100服務器完全能夠滿足CC1100模塊的通信任務,較為完善的解決了CC1100模塊接收和發送數據沖突的問題,同時其友好的人機交互接口在用戶操作方面也顯現了極大的優勢。

[1]孫天澤,袁文菊.嵌入式設計及Linux驅動開發指南:基于ARM9處理器[M].3版.北京:電子工業出版社,2009.

[2]李文仲,段朝玉.CC1110/CC2510無線單片機和無線自組織網絡入門與實戰[M].北京:北京航空航天大學出版社,2008.

[3]楊水清,張劍,施云飛,等.ARM嵌入式Linux系統開發技術詳解[M].北京:電子工業出版社,2008.

[4]黃智偉,鄧月明,王彥.ARM9嵌入式系統設計基礎教程[M].北京:北京航空航天大學出版社,2008.

[5]潘巨龍,黃寧,姚伏天,等.ARM9嵌入式Linux系統構建與應用[M].北京:北京航空航天大學出版社,2006.

[6]Corbet J,Rubimie A,Kroab-Hartman G.Linux設備驅動程序[M].北京:中國電力出版社,2006.

[7]Rodriguez C S,Fischer G,SmolskiS.Linux內核編程[M].北京:人民郵電出版社,2011.

[8]徐英慧.ARM9嵌入式系統設計:基于S3C2410與Linux[M].北京:北京航空航天大學出版社,2010.

[9]王洪輝.嵌入式系統Linux內核開發實戰指南:ARM平臺[M].北京:電子工業出版社社,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稿件編號201210037

朱 宇(1955—),男,遼寧鐵嶺人,副教授。研究方向:嵌入式系統、計算機監測與控制和計算機網絡。

猜你喜歡
驅動程序內核嵌入式
強化『高新』內核 打造農業『硅谷』
基于嵌入式Linux內核的自恢復設計
Linux內核mmap保護機制研究
計算機硬件設備驅動程序分析
搭建基于Qt的嵌入式開發平臺
嵌入式軟PLC在電鍍生產流程控制系統中的應用
提升影視文化軟實力的人文內核審視
倍福 CX8091嵌入式控制器
基于MPC8280的CPU單元與內部總線驅動程序設計
妙用鼠標驅動
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合