摘要: vxworks嵌入式操作系统具有高效的实时任务管理与调度、任务的同步与通信、内存管理、i/o管理、时钟管理等机制。两个485口在通信速率、工作模式、控制方式上有较大差别且系统死线要求严格。详细介绍了vxworks下双485口串行通信系统bsp、驱动程序和应用程序的开发过程。基于vxworks构建的嵌入式串行通信系统实时性好,效率高,可根据硬件进行优化配置;利用vxworks的i/o系统将驱动程序作为内核过程,设备作为特殊文件处理,解决了工作方式不同的两个485口的驱动程序开发和接口统一问题。
关键词: 通信系统; 嵌入式串行通信
引言
vxworks是美国windriver公司专门为嵌入式微处理器设计的一种高模块化、高性能的实时多任务操作系统,具有很好的安全性、可靠性及系统灵活性[1-2]。该系统要求两个485端口波特率分别为460.8 kb和614.4 kb;工作方式分别为程序查询式和中断驱动式;写作论文握手方式和通信控制方式也完全不具有相对的独立性和“并发性”,而且各个任务根据不同的“紧迫感”应具有不同的优先级。根据以上多方面的要求和特点,基于优先级抢占式的多任务实时操作系统vxworks是该系统的首选[3]。本文以研制某型训练装备为背景,详细介绍了基于vxworks的双485口通信系统设计方法和过程。
1 串口通信基本原理串口通信作为最常用的通信方式,用途非常广泛,驱动易于编写,被绝大多数操作系统默认支持。wWw.133229.coM其基本功能是实现和串行设备间的编码转换发送数据时,字节数据经cpu通过通用异步接收发送器(简称uart)转换为串行位,从串行端口发送出去;接收数据时,串行位通过uart被转换为字节数据,并放入缓冲区,由cpu读取。通过对uart的内部寄存器的控制实现字节数据和位数据的转换和通信。通信时,uart按初始化设置,把起始位、校验位和停止位加到来自cpu的8位数据上,然后按设置的波特率把这个二进制位串发送到串行通信线上,如图1所示;同样,uart能自动从通信线上接收串行数据,并取出有效的数据位,然后转换成数据字符存入接收数据寄存器。
2 串行通信软件设计该软件以windriver的tornadoii集成开发环境为平台进行开发。包括bsp开发、驱动程序开发、应用程序开发等步骤。2.1 bsp开发bsp(board support packet,板级支持包)是介于底层硬件和上层软件之间的底层软件开发包。它来源于嵌入式操作系统与硬件无关的设计思想[2,4]。操作系统被设计运行在虚拟的硬件平台上,对于具体的硬件平台,与硬件相关的代码都被封装在bsp中。它主要功能为屏蔽硬件,提供操作系统的驱动及硬件驱动。它的主要功能包括:系统引导时,初始化目标机硬件;提供目标系统上的驱动程序,如定时器、串口等[2,6]。开发bsp,主要以目标板cpu的bsp文件为模板,建立工程并修改相关源文件。bsp文件在vx-works/target/config/all和vxworks/target/config/bsp-name文件夹里。其中,all文件夹里的文件是所有bsp的通用文件,bspname文件夹的文件是用户自己定制的bsp文件。该系统采用pentium cpu,因此以vxworks/target/config/pcpentium文件夹里的文件为模板进行修改,开发过程如下。系统配置在config/all目录包含的文件中完成。需要配置的头文件有target/config/all/configall.h和arget/config/pcpentium/config.h;需要配置的模块文件有target/config/all/usrconfig. c和target/src/config目录下的初始化模块。配置头文件主要利用定义(#define)和去除定义(#undef)实现。configall.h是全局配置头文件,包括所有目标系统公用的配置参数默认定义,一般不修改此文件,而在config.h中重新定义。以配置引导程序为例:该系统开发过程中使用串口(此串口为目标机开发板上的串口)调试vxworks映像,端口1作为wdb代理通信通道,不设目标机控制台通#define n-uart-channels 2这样,宿主机和目标机通过一根串口线连接,vxworks映像文件从目标机软盘上加载,宿主机通过串口来调试目标机上的vxworks。在config.h中修改如下内容,同时在makefile里配置rom起始地址(rom-base-adrs)、代码段入口(rom-text-adrs)、rom大小(rom-size)、vxworks映像加载地址(ram-low-adrs)和bootrom加载地址(ram-high-adrs)。该系统对模块文件usrconfig.c和target/src/config目录下的初始化模块无需作修改[2]。
2.2 串口驱动程序开发vxworks操作系统有两种方式实现驱动。1)把设备驱动程序作为独立任务实现,直接在顶层任务中实现硬件操作,完成特有专用的驱动程序。2) vxworks的i/o系统将设备程序作为内核过程实现。这种方式便于实现i/o子系统的层次模型,便于文件系统一起把设备作为特殊文件处理,提供统一的管理、统一的界面和统一的使用方法,并把设备、文件及网络通信组织成为一致的更高层次的抽象,为用户提供统一的系统服务和用户接口。采用这种驱动方式,向上将tty设备安装到标准的i/o系统中,上层应用通过标准的i/o接口完成对硬件设备的操作,向下提供对实际硬件设备的底层设备驱动程序[7-8。串口1、串口2均采用82c52芯片作为uart。根据上位机的工作方式,端口1采用硬件握手中断驱动方式,有5根信号线:2根数据传输线(txd、rxd),2根握手线(cts、rts)和1根地线。端口2采用软件握手查询工作方式,有3根信号线:2根数据传输线(txd、rxd)和1根地线。各端口的默认字长均为8位、停止位2位、奇偶校验位1位、端口1默认波特率为614.4 kbps,端口2默认波特率为460.8 kbps。首先构造设备描述符结构体,设备描述符保存了与设备相关联的数据,它必须以设备头(dev-hdr)结构为开头。由于2个端口的工作方式完全不同,且无法预测数据传输的先后顺序和传输时机,2个端口的数据接收函数必须分开编写,其中uartrecquery()函数用于端口2的查询工作方式;uartrecdata()函数用于端口1的中断握手方式,其优先级高于uartrecquery()函数。但数据发送函数可以合并,因为对于单处理器而言,是不可能实现真正的多任务并行处理的,即使编写成两个并行任务,也是在处理器的控制下,按时间片轮转执行的。这样不仅不能提高执行效率,反而会因为任务上下文切换造成一定的资源浪费,影响系统实时性。这种情况,更适合采用面向过程的方法对程序进行设计和优化。下面对其进行说明:调用后,其首先检测输入参数是否合法,而后根据端口号选择工作方式(中断或查询),作相应操作,开始发送数据,每发送一个字节检测并等待tbre(发送缓冲寄存器空)信号变为有效,再发送下一字节,数据全部发送完毕后函数返回。其工作流程如驱动程序开发完成后,在usrconfig.c文件的usrroot()函数里,调用api函数iosdrvinstall()对以上驱动程序分别进行安装,再初始化设备描述符,并用iosdevadd()将设备增加到设备列表中,最后将设备置为中断模式。以上操作完成后即可用标准i/o函数操作两个不同的串口设备
2.3 串口通信应用程序设计数据通信按帧进行,帧分为命令帧和应答帧。帧格式为命令帧:命令码长度参数串异或应答帧:应答码长度参数串异或 对于多字节参数,按高字节在前,低字节在后的次序发送。数据采用二进制16位有符号整数数据格式。其中,最高位为符号位,数据为二进制格式。数据传输时,上位机首先发送一个命令帧,包含数据包个数、最后一个数据包的字节数,除最后一个数据包外,每包大小为16 kb。模拟器收到后,回复应答帧并将收到的数据包个数、最后一个数据包的字节数一同发回校验,对帧长度校验无误后开始发送数据。由于传输数据量较大,一般校验方法进行内容误判率高,不能纠错,大多数情况下需要重新发送,非常费时。循环冗余校验法(crc)由于实现简单,检错能力强,并能纠错,可以较好地解决这个问题。该系统采用crc16进行校验[9]。3 结论串行通信以其网络连接方便、抗干扰性能好、传输距离远等优点,在嵌入式系统得到广泛应用。本文以某训练装备研制为背景,详细介绍了vxworks嵌入式操作系统下串行通信系统软件的开发过程。利用了vxworks的i/o系统将设备程序作为内核过程,设备作为特殊文件处理,解决了不同工作方式下,两个485口的驱动程序开发和接口统一的问题。目前,该系统已交付使用。运行实践证明该通信系统软件设计思路正确,设计方法得当。对于其他嵌入式串行通信系统设计也具有一定的参考价值。
参考文献:
[1] li qing[美].嵌入式系统的实时概念[m].王安生,译.北京:北京航空航天大学出版社,2004.
[2] 王学龙.嵌入式vxworks系统开发与应用[m].北京:人民邮电出版社,2003.
[3] 陈坤,陈志勇,黎湘.vxworks实时操作系统在相控阵雷达系统中的应用[j].电光与控制,2005,12(4):51-53.
[4] vxworks programmer’s guide[m].wind river system inc.,1999.
[5] 周启平,张杨.vxworks程序员速查手册[m].北京:机械工业出版社, 2005.
[6] 拉布罗斯[美].嵌入式系统构件[m].北京:机械工业出版社,2002.
[7] 张军.基于vxworks实时操作系统的串口通信程序设计与实现[j].微计算机信息,2006,22(2-2):98-100.
[8] 张爱卿,唐普英,汪康洪.vxworks中基于rs485总线的串口通信协议及实现[j].微计算机信息,2006,22(6-2):80-82.
[9] 罗国庆.vxworks与嵌入式软件开发[m].北京:机械工业出版社,2003.