摘 要 随着中国移动GPRS和中国联通CDMA1X网络的建成商用,GPRS/CDMA无线数据终端的应用范围越来越广。本文介绍了ATMEL公司基于ARM7TDMI核的微控制器AT91M40800的内部结构和扩展外围,并在此硬件平台上移植了μC/OSII嵌入式操作系统、Interniche网络协议栈和μC/FS文件系统,从而给出了一个完整的GPRS/CDMA无线数据终端的实现方案。
关键词 ARM处理器,μC/OSII嵌入式操作系统,μC/FS文件系统,Interniche网络协议栈
1 引 言
GPRS/CDMA无线数据网络系统由于其覆盖范围广,通信质量高,永远在线和按流量计费等优点,在无线上网、环境监控和数据采集等许多行业得到了广泛应用。作为系统重要组成部分的GPRS/CDMA无线数据终端,为了满足其成本低,体积小和移动灵活的要求,目前普遍使用的方案是在单片机系统上加载一些操作系统和网络协议栈来控制无线模块登录GPRS/CDMA网络,从而实现数据的传输。但由于目前的单片机大多仍是8位系统,处理速度较慢,且硬件资源有限,对操作系统和协议栈的支持能力不够强,因此实际运行起来效果并不理想。ARM处理器凭借其功能强,功耗低,性能高的优势迅速成为了各种控制应用领域的首选。本文通过采用ATMEL公司的AT91M40800处理器并外扩大容量存储器的方法来构建功能强大的硬件平台,并在此硬件平台上移植了μC/OSII嵌入式操作系统、网络协议栈和文件系统,从而大大提高了终端的可靠性,增强了系统的可扩展性和产品开发的可延续性。
2 硬件平台
GPRS/CDMA无线数据终端采用ATMEL公司的一款ARM7微控制器AT91M40800,其特点如下:
集成了ARM7TDMI处理器内核,高性能的32位RISC体系结构,具有高密度的16位指令集和嵌入式ICE(InCircuit Emulation);
8 KB片内SRAM;
完全可编程的外部总线接口(EBI),片选线多达8个,最大可寻址空间为64 MB,具有软件可编程的8位或16位外部数据总线;
8优先级、可单独屏蔽的向量中断控制器,具有4个外部中断,包括一个高优先级、低延迟的中断请求;
32个可编程I/O口;
3通道16位定时器/计数器;
2个UART;
可编程的看门狗定时器。
图1为GPRS/CDMA无线数据终端的结构框图。AT91M40800内部只集成了8 KB的SRAM,为了使μC/OSII操作系统、网络协议栈和文件系统能够正常移植运行,系统外扩了1 MB的FLASH和SRAM。使用的片选信号分别是NCS0和NCS1,处理器上电REMAP后分别映射到0x01000000和0x02000000的地址空间。为了满足系统存储数据和一些须修改的配置信息的需要,终端在外扩的FLASH里创建了μC/FS文件系统,文件系统和用户程序共用一片FLASH。用户程序固化在0x01000000~0x0107FFFF前512 KB的地址空间内;文件系统创建在0x01080000~0x010FFFFF后512 KB的地址空间内。
终端提供了RS232、RS485和RJ45 3种用户接口。由于AT91M40800内部集成了2个UART,因此只须外加一片RS232电平转换芯片和一片RS485收/发驱动芯片就能很容易地扩展出RS232和RS485用户接口。扩展RJ45以太网口时,系统使用了RTL8019AS以太网接口芯片。
RTL8019AS是Realtek公司高集成度的专用以太网接口芯片,支持EthernetII、IEEE802.3、10Base5、10Base2和10BaseT,支持UTP、AUI&BNC和PnP自动探测模式,并且内嵌16 KB SRAM用于收/发缓冲,降低了对主处理器的速度要求。它还支持8位、16位数据总线模式,有全双工的通信接口,是进行以太网通信的理想芯片。要实现这些功能,需要依据RTL8019用户手册的描述,对其进行正确的配置,编写出发送包、接收包函数以及外部中断处理程序;系统加载TCP/IP网络协议栈后通过调用这些函数即可实现网络数据的传送。
系统还通过TL16C550扩展了一个标准的9线串口以连接GPRS/CDMA无线猫。TLl6C550的主要功能是在接收外部器件或MODEM的数据时完成数据串行到并行的转换;在接收CPU的数据时,完成数据并行到串行的变换并进行串行发送。在任何工作状态下,CPU均可读取和通报器件的状态。TLl6C550的内部包含一个可编程的波特率发生器,波特率为16x内部输入时钟频率,此内部输入时钟频率由输入的参考基准振荡器分频(由波特率分频寄存器的值决定)得到。TLl6C550具有完全的MODEM控制能力,根据用户的需要可以设置成中断或查询方式。对TL16C550的操作比RTL8019更为简单,只需对其为数不多的寄存器操作,便可实现对器件的模式设置、收发处理和状态控制等。在此基础上通过封装一些收/发的函数即可完全实现和GPRS/CDMA无线猫的全双工通信。
终端上电初始化后,从文件系统中读出相应的配置信息,接着通过TL16C550向无线猫发送相应的AT指令;无线猫登陆网络成功后,系统通过加载PPP/TCP/UDP/IP等协议,同中心建立起SOCKET连接;然后在μC/OS-II实时操作系统下通过多个任务的调度,即可实现RS232/RS485/RJ45数据和中心站的相互通信。
3 μC/OSII嵌入式操作系统
μC/OSII是一种免费公开源代码,结构小巧,具有可剥夺实时内核的实时操作系统,其内核提供任务调度与管理、时间管理、任务间同步与通信,以及内存管理和中断服务等功能。μC/OSII是面向中小型嵌入式系统的,如果包含全部功能(信号量、消息邮箱、消息队列及相关函数),则编译后的内核仅有6~10 KB,可以广泛应用于从8位到64位单片机各种不同类型、不同规模的嵌入式系统。要使μC/OSII正常运行,处理器必须满足以下要求:
处理器的C编译器能产生可重入代码;
用C语言即可打开和关闭中断;
处理器支持中断,并且能产生定时中断(通常为10~100 Hz);
处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈;
处理器有将堆栈指针和其他CPU寄存器读出或存储到堆栈或内存中的指令。
AT91M40800完全可以满足这些要求,因此可将μC/OSII移植到上面运行。μC/OSII的移植比较简单,在完成对CPU的初始化以后,首先对时钟节拍进行设置(10~100 Hz)。只须对AT91M40800编写相应的定时器中断处理程序,在程序中调用操作系统的函数OSTimeTick(),并在其AIC(Advanced Interrupt Controller )中设置定时器的优先级别,将定时器中断处理程序的地址放到相应的中断向量表中。使定时器产生中断,必须在开始多任务调度后,即在第一个任务中使能定时器。其次,对μC/OS-II移植主要集中在includes.h、OS_CPU_A.S和OS_CPU_C.C等CPU相关文件的改动,上层任务调度部分无需任何修改。对于多任务操作系统,只需将复杂的应用分成简单的、相互联系的任务,再把各个不同优先级的任务交给操作系统去管理。
4 Interniche网络协议栈
为了使GPRS/CDMA模块能登录无线网络并与中心建立SOCKET连接,系统移植了Interniche公司源码开放的嵌入式TCP/IP/PPP协议栈。Interniche能使系统很容易在μC/OS-II操作系统的调度下为开发平台增加网络通信和网络管理等功能。由于它是专门为嵌入式系统而设计的,所以占用的系统资源很少。Interniche协议全部用标准C语言,除了可以运行在如μC/OSII、VRTX、CMX和Threadx等多种RTOS下,还可在无RTOS的环境下独立运行。常用的Interniche包括:
(1) 核心协议
NicheStackTM: InternicheTCP协议包含TCP、UDP、IP、TFTP、DHCP Client、ICMP、ARP、SLIP、BootTP以及DNS Client。
Niche ToolTM: 菜单驱动的协议调试和测试工具(包含在NicheStack和Nichelite中)。
NicheLiteTM: Interniche微型化的TCP/IP协议,全部代码在12 KB以内;它包含全部NichestackTM的所有协议和1个最小化的Socket API,易于移植到从8位到32位的CPU上。
可选择应用模块:PPP、PPPoE、Telnet(Server&Client)、FTP(Server&Client)、IP Multicast和NichePOP3等。它为TCP/IP上的附加模块增加了POP3 Email服务器收邮件功能。
(2) 管理和配置协议
WebportTM: 嵌入式Web服务器,让最终用户通过WWW浏览器配置和监控嵌入式设备,而避免编写专用的GUI界面。这些界面多数是与主机OS(如Win98)相关的,而且需要目标环境大量的资源,如文件系统。
Email Alerte: 为嵌入式系统增加预告和报警功能。它允许用户向本地或远程的Email地址发出预先设置好的信息(比如某个条件下的报警信息)。
Interniche协议栈同样具有良好可移植特性,它对系统的要求只有:
时钟,至少1 s“滴答”;
内存和操作系统;
至少具有一个网络接口设备(查询或中断驱动);
相配的编译器和调试器。
只须根据以太网控制器手册的描述,编写出发送包、接收包的函数,以及用于以太网控制器的外部中断处理程序即可完成对Interniche网络部分的移植。由于Interniche协议栈也是可以获得源码的,所以对于任何网络控制器都可通过不断的调试最终完成自己的驱动程序。此外,为了方便调试,使Niche ToolTM工作,还应完成对Interniche中向串口收/发字符putchar()和getch()的移植,这样就可以在PC端使用超级终端经过串口与终端设备上的Interniche基于命令行进行交互了。Interniche的各种协议簇可以根据需要由μC/OS-II调度的状态查询任务。
5 μC/FS文件系统
μC/FS是FAT型文件系统,它适用于所有存储介质,需要用户为这些储存介质提供基本的硬件访问函数。μC/FS在速度、多功能性和内存封装上都做了优化,支持FAT12、FAT16和FAT32文件系统,支持各种不同的设备驱动,从而允许用户在同一时间通过文件系统访问不同类型的硬件,通过设备驱动在同一时间访问不同的介质。μC/FS还支持操作系统,包括μC/OSII在内的多种操作系统都可以很方便地与μC/FS结合,这样用户即可在多线程环境下进行文件操作。
μC/FS根据其组织逻辑机构,可以分为4层,如图2所示。
① API层: μC/FS与用户应用程序之间的接口。它包含了一个与文件函数相关的ANSI C库,如FS_FOpen和FS_FWrite等。API层把这些调用传递给文件系统层。目前在μC/FS下只有FAT型文件系统可以获取, 但API层可以同时处理不同类型的文件系统层,所以在μC/FS下可以同时使用FAT和其他文件系统。
② 文件系统层: 把文件操作请求传递给逻辑块操作。通过这种传递,文件系统调用逻辑块操作来为设备指定相应的设备驱动。
③ 逻辑块层:主要功能是使对设备驱动的访问同步,并为文件系统层提供一个方便的接口。逻辑块层调用一个设备驱动来进行块操作。
④ 设备驱动: 设备驱动是处于系统底层的例程,用以访问存储硬件。设备驱动结构简单,易于与用户自己的存储设备进行整合。
μC/FS是为与所有类型的硬件协同工作而设计的,为了在μC/FS中使用某种特定的硬件,需要提供该硬件的设备驱动。当用户要使用自己的设备驱动时,需要通知μC/FS设备的名称以及采用的文件系统层的类型(目前只支持FAT)。用户可在FS_Conf.h文件中通过设置FS_DEVINFO来实现,FS_Conf.h文件用于初始化μC/FS的全局设备信息表。第一个参数是设备名称,在调用μC/FS API时会用到;第二个参数是指向文件系统层函数表的指针,目前只支持FAT;第三个参数是指向设备驱动函数表的指针。
如果要将μC/FS移植到用户系统的FLASH里,则只有几个文件须修改。一个是CONFIG目录下的fs_conf.h和fs_port.h文件,需要根据系统的具体情况(如文件系统的设备类型,以及是否使用操作系统等)修改。还有DEVICE目录下的flash_conf.h和flash_device.c这两个文件。flash_conf.h里需要设置用户的FLASH信息,如FLASH的类型、访问模式,以及FLASH的起始地址和长度等。flash_device.c需要根据用户FLASH手册做些修改,主要是在Flash command definitions部分,需要修改相应的操作命令宏,如擦除、编程命令字等。如果所有配置均正确,则可在目标系统上编译使用设备的应用程序。正常情况下,编译μC/FS的源代码不会出现任何编译警告,应用程序一经编译即可在目标系统的调试器下运行。如果μC/FS有问题而不能运行,则可先测试一下各项FLASH的底层驱动函数(如FLASH_WriteAdr、FLASH_WriteOff和FLASH_EraseSector等),看是否能直接对FLASH进行操作。如果FLASH的底层驱动函数没有问题,则可能是在调用μC/FS的API时,初始化或者传递的命令不正确,特别要检查一下FS_IoCtl的命令参数。
6 结束语
本文提出了一种基于ARM处理器和嵌入式操作系统的GPRS/CDMA无线数据终端的实现方案。首先给出了系统硬件的的原理结构框图,说明了系统中主要元器件的性能和使用方法;然后分别介绍了μC/OSII嵌入式操作系统、Interniche网络协议栈和μC/FS文件系统的结构、特性以及主要的移植步骤。目前笔者已完成了终端软硬件的调试工作,系统测试稳定可靠,可以广泛应用在水电气费管理(如远程抄表)、环保和电力监控等场合,具有广阔的使用前景。