1 引言
在当今信息化时代背景下,多个设备互连的实时信息控制系统已十分常见,一般涉及主控系统与多个设备之间的信息通讯。其通讯方式一般有网络通讯、并口通讯、串口通讯、Can总线通讯、1553B总线通讯等。这些通讯方式各有其优缺点,应用场合也有着不同,其中串口通讯方式以可靠性高、抗干扰性强,且开发难度较低等特点,被广泛地应用于设备间的信息通讯中。嵌入式实时操作系统VxWorks以其高可靠性,微内核,可裁减性以及高效的实时任务调度、中断管理等优点,在航空、航天、军事、医疗、通信等领域已占据半壁江山,成为首屈一指的实时嵌入式操作系统。本文设计了一种基于VxWorks的多个PCI型串口通讯系统,讲述了其硬件配置,并针对PCI多串口驱动程序进行修改和设计,最后通过测试验证了系统的可靠性和实时性。
2 VxWorks系统及开发工具Tornado简介
VxWorks是由美国风河公司(Wind River Systems,Inc.)开发的一套具有微内核、高性能、可根据用户需要而进行裁剪和组合的实时操作系统,其开放式的结构和广泛的标准支持,使用户根据自身的要求就可以简单的设计出符合需要的操作系统。Tornado是VxWorks系统的开发工具,由三个高度集成的部分组成: Tornado工具,一整套强有力的交叉开发工具;VxWorks运行系统,是运行在目标机上的高性能、可裁剪的实时操作系统;连接目标机和宿主机的通信选项,包含以太网、串行线路、在线仿真等。另外Tornado 能够支持 Windows、Unix等流行的工作平台和PowerPC、X86、ARM等几乎所有的目标处理器,所提供的工具几乎可用于所有目标机。
3 串口通信基本原理
串口在嵌入式系统当中是一类非常典型和重要的数据通信接口, 其本质功能是作为 CPU和串行设备间的编码转换器。当数据从CPU经过串行端口发送出去时,字节数据转换为串行的位;在接收数据时,串行的位被转换为字节数据。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。
在VxWorks中,对串口通信软件的设计时, 当串口初始化完成后, 在使用之前利用open() 打开相应串口, 然后进行配置。配置完成后, 依据串口打开时的读写标志, 调用函数write()、read()对串口进行只读操作、只写操作或同时进行读写操作。为提高数据接收的实时性,可采用中断方式,利用 VxWorks 提供的select函数的事件触发机制,将读串口的任务阻塞使其一直等待数据,当有数据来到的时候该任务会立刻自动响应,提高系统的实时性。
4 环境配置
4.1 硬件搭建
VxWorks系统的开发采用主机-目标机模式,如图 1 所示。在本案例的开发环境中,主机是一套Pentium(R)的台式机,目标机是盛博科技公司基于PC104 Plus总线的核心模块PMP,该核心模块采用超低功耗Intel Pentium M处理器,板上自带2个串口、网络接口以及其它接口。串口扩展卡也是盛博科技公司基于PC104 Plus 总线的串口卡PMSP-8,该串口卡具有8个PCI扩展串口,串口工作方式可在RS-232/RS-422/RS-485/TTL进行选择。开发调试过程中,主机与目标机通过网络进行通信。主机运行VxWorks的开发软件Tornado2.2 ,目标机运行VxWorks5.5,目标机的启动方式设定为从CF 卡启动。
图1 开发环境示意图
4.2 驱动程序设计
本案例的驱动程序是基于X86架构下pcPentium系列的BSP包为基础,结合16550串口驱动对其中sysSerial.c、pc.h、configNum.h等文件进行修改,在保留原本默认配置2个串口的前提下,对新扩展的8个PCI型串口进行申明、赋值和初始化,使10个串口均能够正常进行通信。
5 程序示例
5.1 修改BSP中的sysSerial.c文件
修改BSP中的sysSerial.c文件的头文件调用,使其包含以下头文件。
#include <vxWorks.h>
#include "iv.h"
#include <intLib.h>
#include <config.h>
#include < sysLib.h>
#include <drv/sio/ns16552Sio.h>
#include <drv/pci/pciConfigLib.h>
5.2 修改BSP里pc.h文件中串口通道宏定义
原文件中只提供了板载串口com1和com2这2个通道,扩展的PMSP-8串口卡提供8个PCI扩展串口后,加上原有的2个主板板载串口,因此串口总数目应为10。因为新扩展的8个串口用到的是PCI资源,串口地址和中断会随着系统中PCI设备数量的变化而改变,只能在系统运行中实时读取并赋值。但在此处为了保持数组完整性,保证sysSerial.c中的devParas数组顺利编译通过,临时对新增8个串口的地址和中断进行定义。
#define N UART CHANNELS 10
#define com3_BASE_ADR 0xd000
#define com4_BASE_ADR 0xd008
#define com5_BASE_ADR 0xd010
#define com6_BASE_ADR 0xd018
#define com7_BASE_ADR 0xd200
#define com8_BASE_ADR 0xd208
#define com9_BASE_ADR 0xd210
#define com10_BASE_ADR 0xd218
#define com1_INT_LVL 0x04
#define com2_INT_LVL 0x03
#define com3_INT_LVL 0xb0
#define com4_INT_LVL 0xb0
#define com5_INT_LVL 0xb0
#define com6_INT_LVL 0xb0
#define com7_INT_LVL 0x05
#define com8_INT_LVL 0x05
#define com9_INT_LVL 0x05
#define com10_INT_LVL 0x05
5.3 修改sysSerialHwInit函数
原文件中已默认设置了2个串口,其地址和中断都是固定的。但新添加的8个串口,由于使用的是PCI资源,所以不能像com1和com2的方式来设置地址和中断。需将原函数中的循环for (i = 0; i < N_UART_CHANNELS; i++)去掉,按照16550驱动的格式逐个通道进行初始化。以COM2串口为例,具体代码如下:
sysIntDisablePIC (devParas[1].intLevel);
ns16550Chan[1].regs = (UINT8 *)devParas[1].baseAdrs;
ns16550Chan[1].level = devParas[1].vector;
ns16550Chan[1].ier = 0;
ns16550Chan[1].lcr = 0;
ns16550Chan[1].pad1 = 0;
ns16550Chan[1].channelMode = 0;
ns16550Chan[1].regDelta = devParas[1].regSpace;
ns16550Chan[1].baudRate = 9600;
ns16550Chan[1].xtal = 1843200;
ns16550DevInit (&ns16550Chan[1]);
/* setup modem control lines */
*(UCHAR *)UART_REG(MCR,1) = 0x8;
5.4 修改configNum.h文件
在configNum.h文件中添加PCI串口的中断向量宏定义,具体代码如下:
#define INT_NUM_COM1 (INT_NUM_IRQ0 + COM1_INT_LVL)
#define INT_NUM_COM2 (INT_NUM_IRQ0 + COM2_INT_LVL)
#define INT_NUM_COM3 (INT_NUM_IRQ0 + COM3_INT_LVL)
#define INT_NUM_COM4 (INT_NUM_IRQ0 + COM4_INT_LVL)
#define INT_NUM_COM5 (INT_NUM_IRQ0 + COM5_INT_LVL)
#define INT_NUM_COM6 (INT_NUM_IRQ0 + COM6_INT_LVL)
#define INT_NUM_COM7 (INT_NUM_IRQ0 + COM7_INT_LVL)
#define INT_NUM_COM8 (INT_NUM_IRQ0 + COM8_INT_LVL)
#define INT_NUM_COM9 (INT_NUM_IRQ0 + COM9_INT_LVL)
#define INT_NUM_COM10 (INT_NUM_IRQ0 + COM10_INT_LVL)
5.5 修改Makefile文件
修改makefile文件,使其编译时调用ns16550Sio.o,代码如下:
MACH_EXTRA = ns16550Sio.o
6 通信测试
将目标机上的串口逐一与主机串口进行连接,主机在Windows下运行 “串口调试助手”,并设置好相应的参数;目标机在VxWorks系统下运行“串口收发测试程序”,然后对目标机上的串口进行通信检查。即通过主机和目标机之间收发数据的方式,将收到的数据与发送数据进行比较,检测数据收发是否正确。本案例经多次验证,串口工作稳定,数据传输正确,通信正常,表明本文所述的PCI多串口卡通信实现方法有效,所开发的多串口系统稳定可靠。
7 结束语
本文设计了VxWorks嵌入式系统中扩展多个PCI串口通信的实现过程,在驱动程序设计中列出了部分关键代码,因篇幅限制,不能详尽的列出所有代码。以PMSP-8多串口扩展卡为例,采用驱动直接访问硬件的方法,较为简洁和高效地解决了串口数量有限的问题,满足了项目中对多串口数量需求,最终经过了测试和验证,为日后类似问题的解决提供了一些参考和经验。
参 考 文 献
[1] SysCentreModuleTM/PMP技术手册 V2. 3[Z]. 盛博科技,2012.
[2] SysExpanModuleTM/PMSP-8技术手册V1.0[Z]. 盛博科技,2012.
[3]王洋.VxWorks嵌入式实时操作系统设备驱动与BSP开发设计[M].北京:航空航天大学出版社,2012.4-12,47-58.
[4]陈智育,温彦军,陈琪. VxWorks程序开发实践[M]. 北京:人民邮电出版社,2004.169-176.