引 言
随着城市交通的迅速发展,机动车流量急剧增加,使得交通管理面临着新的挑战,由于某些驾驶员交通法律意识淡薄,为达目的闯红灯行驶,特别是在无交警值守的区域,问题更为严重。电子警察系统,就是将在交通路口抓拍到的违章照片传回控制中心,进行分析处理和保存,并作为违章证据处罚违规的司机。电子警察系统在实现警务工作网络化、现代化、智能化进程中有着重要作用。电子警察一般由三大部分组成,一是照片拍摄部分;在红灯信号期间,控制器控制数码相机拍摄违章车辆照片,并存储到相机存储卡上。二是照片传输部分;将数码相机存储卡中的相片传送回监控中心。三是照片处理部分;在控制中心,工作人员将照片进行统计处理。照片传输部分常用的方法有人工取图、基于PC的工控机传送两种。人工取图方式耗费大量人力,无法及时获取照片,无法实现自动化操作;基于PC的工控机传送方式,成本高,体积大,安装不方便。基于ARM的嵌入式系统的出现解决了以上两种传送方式中的存在的缺点。
本文主要研究介绍:(1)嵌入式系统的结构;(2)如何利用嵌入式操作系统和ARM处理器构建电子警察照片传输设备;(3)介绍此设备的实际应用。
嵌入式系统的结构
嵌入式系统是一个硬件和软件的集合体,由嵌入式微处理器、嵌入式操作系统以及承载操作系统的硬件平台组成。嵌入式系统软硬兼施,互利互惠,融为一体。
嵌入式操作系统
嵌入式操作系统是嵌入式系统的控制中心,主要用于对系统软硬件调度管理和人机界面加以控制。
嵌入式系统的引导程序
嵌入式系统中引导程序(Bootloader)的作用与PC的BIOS(Basic Input Output System)相似,通过引导程序可以完成对ARM板上的主要部件CPU、SDRAM、Flash、串口等进行初始化操作,并能完成下载文件,Flash擦写等操作。一个功能完善的引导程序相当于一个微型的操作系统。
操作系统内核运行之前,引导程序完成加载内核和一些辅助性的工作,然后跳转到内核代码的起始地址并执行。引导程序可以初始化硬件、建立内存空间映射,从而将系统的软硬件环境带到一个合适的状态,以便最终调用系统内核。简言之,Bootloader为操作系统提供硬件资源信息,并进一步加载、引导操作系统。
引导程序通常固化在FLASH或ROM中,基于ARM内核的CPU在复位时通常从地址0x00000000取第一条指令。因此,基于ARM的嵌入式系统通常都有某种类型的固态存储设备被映射到这个地址上。系统上电后首先执行Bootloader程序。如图1所示是一个装有Bootloader、内核参数、内核映像和根文件系统映像的固态存储设备空间分配结构图。
嵌入式系统的硬件系统
与PC硬件相比,嵌入式系统的硬件系统具有如下特点:
(1) 体积小,成本低,集成度高。嵌入式系统去除冗余,力争用最少的硬件资源完成目标功能。
(2) 功耗低,电磁兼容性好,能在恶劣的条件下工作,死机后能够快速重启。
(3) 面向特定的应用。
嵌入式系统的硬件平台在价格、功能、体积、能耗等方面都有严格限制。
通常,嵌入式系统硬件平台主要分为2大部分:一部分为系统主板,为基于ARM的最小系统,包括CPU、Flash、SDRAM、串口等最基本部分;另一部分为系统扩展,提供用于完成各种不同功能的硬件模块。如存储设备,闪存(Flash Memory);通信设备以太网卡,USB控制器等。
嵌入式系统中的软件
嵌入式系统软件包括与硬件相关的底层软件、操作系统、图形界面、通信协议、数据库系统和应用软件等。嵌入式系统的软件部分具有以下特点:
(1) 软件代码要求高质量、高效率和高可靠性。在嵌入式系统中,软件的运行空间有限,内存空间十分宝贵,在程序设计时需要时刻考虑软件的运行效率。由于嵌入式设备的工作环境多变,因此嵌入式软件设计需要有质量高、可靠性高的代码作为保障。
(2) 嵌入式软件开发与硬件紧密联系。嵌入式软件的开发是针对特定的硬件平台进行的,它牵扯到硬件驱动方面的一些软硬件结合部分。
(3) 软件要求固化。为了提高执行速度和系统的可靠性,大多数嵌入式系统软件需要固化到系统板的Flash或ROM中。
此外,嵌入式系统软件还需要具有异常处理,快速复位的特点。在实时系统中,软性必须具有对实时多任务很强的支持能力,快速响应并将执行时间减少到最低限度。
系统功能与设计
系统功能
本着既能满足电子警察照片采集传输的实际需要,又尽量节约资源的原则,本系统提供如下功能:
(1) 上位机服务器。向终端发出数据和命令;接收终端上传的照片并进行保存处理。可实现人工操作、自动定时操作、单终端控制、所有终端控制功能。
(2) 采集照片。终端设备从数码相机中将照片采集到本地存储器中,以保证在照片传输过程中不影响数码相机正常工作。
(3) 照片传送。通过网络将照片传送至上位机服务器,实现传输智能化。
(4) 网络检测。终端设备能够检测网络通断,保证数据传输正确。
(5) 在线更新。通过上位机可以对终端设备进行参数修改,软件升级。
系统设计
此系统设计主要是为了满足数码相机中的照片能够安全、及时的传送到控制中心。因此系统采用C/S(客户端/服务器)模式设计,由控制中心的服务器发送命令控制终端设备进行取图传图操作。系统设计框图如图2所示。
终端设备CPU选用Samsung公司的基于ARM7TDMI核的16/32bit、低功耗、高性价比RISC控制器S3C44B0;操作系统选用网络功能强大、可靠性好、便于移植裁剪、针对无MMU(内存管理单元)控制器的开源操作系统uClinux。
终端设备硬件设计
终端设备硬件设计本着接口标准化、功能模块化、扩展性好、可靠性高的原则,划分为CPU模块和外设模块。
(1) CPU模块:包括S3C44B0、SDRAM、NOR Flash等系统运行的基本要素,组成嵌入式系统的最小系统。
(2) 外设模块:网络接口、USB HOST接口、RS232通讯接口、NAND Flash。
S3C44B0芯片本身集成了一些通用的外围器件,如UART则直接利用控制器的资源。片内2个UART分别作为操作系统控制台及与相机控制板的通讯接口。将海量存储器NAND Flash、USB控制器SL811、网络芯片RTL8019分别映射于处理器的Bank1、Bank2、Bank4地址空间上,实现外部模块与CPU模块的无缝连接。其中NANDS3C44B0芯片本身集成了一些通用的外围器件,如UART则直接利用控制器的资源。片内2个UART分别作为操作系统控制台及与相机控制板的通讯接口。将海量存储器NAND Flash、USB控制器SL811、网络芯片RTL8019分别映射于处理器的Bank1、Bank2、Bank4地址空间上,实现外部模块与CPU模块的无缝连接。其中NAND Flash使用复杂的I/O口来串行地存取数据,8个引脚用来传送控制、地址和数据信息。各个厂商的方法可能不一样。因此在0x00200000-0x00400000空间中完全可以使用64M×8Bit的NAND Flash存储器。终端设备的硬件框图如图3所示。
终端设备的核心板尺寸为:120mm×80mm,体积小巧,接口标准且安装方便。既可以独立使用,又可以作为模块嵌入到其他系统中。
终端设备软件设计
终端设备软件设计遵循的原则是:软件结构化、系统可裁剪定制、驱动标准化、应用程序模块化。软件设计的主要工作是引导程序Uboot移植,操作系统uClinux移植,驱动程序设计,常用API函数封装,多任务多进程的分解与设计,基于Socket的网络编程等。图4 所示为终端设备的软件结构化设计。
在驱动层比较关键的是NOR Flash存储器驱动设计与Kodak Dx6340数码相机USB驱动程序的设计。NOR Flash驱动为实现在线更新功能实现最底层的支持,保证Bootloader、Kernel、Root filesystem在存储器中准确存放。值得注意是NOR Flash的擦写有严格的时序,根据CPU主频不同在擦写过程中加入适当的延时函数能保证Flash正常工作。由于柯达相机的存储卡在Linux下不能当作大容量存储设备(Mass Storage Device)进行操作,换言之不能当作移动存储在uClinux系统下挂载,因此在进行设备驱动程序设计时应选择USB设备类驱动,通过厂商标识(Manufacture ID)及产品标识(Product ID)在系统中注册匹配,进而完成驱动功能,数据传输过程中采用批量传输方式。
在应用层,基于Socket的网络编程支持TCP/IP协议有较好的通用性,能应用于RJ45接口的各种网络环境。照片数据传输遵守PTP协议(PIMA 15740:2000),便于移植。由于应用程序采用模块化设计,终端与服务器通信采用一个进程,终端获取图片使用一个进程因此进程间通信显的尤为重要。首先,采用信号作为主要的通信手段;其次,采用共享内存方式。由于在uClinux内存采用实地址操作,没有内存管理机制,因此在软件设计时笔者采用共享内存的思想在系统未用的内存区域开辟出一块空间作为共享内存,从而完成进程间通信。
表1 批量传送图片测试
下面简要介绍Kodak DX6340数码相机USB驱动程序设计:
(1) 驱动程序的注册:
本程序中数码相机驱动以USB字符型设备来实现,USB设备驱动第一步要做的是通过usb_driver结构向uClinux内核注册自己,告诉系统它所支持的设备类型及操作类型。
static struct usb_driver dx6340_driver = {
name: "dx6340", // 驱动程序名称
id_table: dx6340_table, // 此结构用于保存设备的厂商ID和产品ID
probe: dx6340_probe, // 用于USB设备探测枚举例程
disconnect: dx6340_disconnect, // 用于设备的卸载
fops: &dx6340_fops, // 驱动程序的操作类型
minor: USB_DX6340_MINOR, // 设备的次设备号
};
结构成员fops指向一个file_operations结构。这个结构提供基本的I/O操作接口函数open、close、read、write的实现,对中断的处理、内存映射及对I/O通道的控制函数ioctl的实现。通过这个结构,实现了系统调用和驱动程序的关联。在应用程序中发出文件操作的相关命令时,内核根据这些指针调用相应的函数,从而完成驱动与内核间的通信。
static struct file_operations dx6340_fops = {
owner: THIS_MODULE, // fops所属范围
read: dx6340_read, // 相机的读操作
write: dx6340_write, // 相机的写操作
open: dx6340_open, // 打开相机设备
release: dx6340_release, // 关闭相机设备
};
在数据读写read、write函数中使用批量传输方式,调用函数usb_bulk_msg (struct usb_device *usb_dev, unsigned int pipe, void *data, int len, int *actual_length, int timeout)。
(2) 驱动程序的在系统中的调用
接下来的工作是将设备驱动程序嵌入内核。通常有两种方式,一种是静态编译进内核,另一种是编译成模块。后者能够动态进行加载,利于调试。当系统使用该设备驱动时,调用驱动初始化函数int __init dx6340_init(void){
if (usb_register (&dx6340_driver) < 0)
return -1;
info(DRIVER_VERSION ":" DRIVER_DESC);
return 0;
}
与之对应,当系统注销该设备驱动时,则调用驱动注销函数void __exit dx6340_cleanup(void){
usb_deregister (&dx6340_driver);
}
实验研究
为了测试该终端设备的工作性能,设计场景进行了现场实验:
(1) 批量传送测试
(2) 网络断开测试
当终端设备连接到服务器后,将终端设备网线拔掉,模拟网络故障。在网络断开后30秒,终端设备检测到网络故障,进入重连程序,接好网线后,终端顺利连接到服务器,并正常工作。
(3) 异常测试
a.模拟串口通信异常实验。将设备与相机控制板连线断开,设备终端向控制板发送命令尝试3次,若无响应则发送信息至服务器,需要人工查看控制板/相机状况。
b.续传测试。在设备终端向服务器发送图片过程中,将服务器关闭。这时终端设备进入重连程序,等待与服务器重新连接后,从发生中断时那张照片开始继续向服务器发送图片。
(4) 定时取图测试
上位机定时操作,实现无人职守自动取图。
通过实验表明,该设备具有良好的稳定性,能够适应不同的网络环境,可以应付不同的异常情况,有较好的通用性。
结 语
本文中设计的电子警察终端设备满足用户设计要求,经现场实际运行,证明了所设计的系统可靠、稳定。所提出的照片采集传输方案已用于电子警察实际系统中,并实现无人职守自动定时取图,服务器获取照片信息准确无误。对于停电或网络问题造成的异常,设备可以及时进行处理,很好的验证了本方案的可行性和实用性。