基于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单元与内部总线驱动程序设计
妙用鼠标驱动