VxWorks操作系统是美国Wind River公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),良好的持续发展能力、高性能的内核以及友好的用户开发环境,使其在嵌入式实时操作系统领域居于领先地位,广泛应用于现代的各种嵌入式计算机系统中,比如军事指挥系统、武器控制系统或工业控制系统中。而在这些系统中,往往不是单个计算机的控制,而是多个计算机以及其他设备组成通信网络共同完成控制作用,因此,对于每一个嵌入式计算机除了连接必需的外设之外,还需要考虑计算机之间的通信。计算机间常用的通信方式是利用串行口来实现的。本文在VxWorks多串口通信的实现过程中未采用常见的标准VxWorks虚拟设备ttyDrv驱动方式,而是在用户的驱动程序中直接对硬件进行初始化,以中断方式进行串口通信。
1、环境及配置
VxWorks嵌入式开发采用图1所示的主机一目标机方式。
其他硬件与本文关系不大,这里主要介绍串口卡,该卡是DIAMOND SYSTEM公司生产的EMERALD-MM-8型8串口扩展卡(以下简称EMM8),是基于2片ST16C554芯片的8串口集成板卡,每一路串口均可单独配置成符合RS-232C/RS-422A/RS-485协议规范,最高速率可达115.2kb/s。通用异步收发器(UART)ST16C554用来扩展4路串口通道。每路通道各有一组16B的收发FIFO和移位寄存器,用来缓冲数据和串并转换。每个通道有12个8b内部寄存器,用来存放收发数据以及配置该串口的工作模式,需要在初始化时对各寄存器进行设置。本文根据工程的要求,将卡上的硬件跳线设好,如:各串口使用RS-232C协议,按照datasheet进行硬件跳线。其中J9的配置较为重要,如图2所示。
D、C、B、A 四位表示base address,从data sheet中查表可知其跳线情况,以本项目为例,base address为0x300,则D、C、B、A分别为out、out、in、in,为1100。
2、3、4…15为该卡可用的中断号,要使用哪个中断就必须将其跳为in。本项目由于中断资源不足,只能用一个中断号即7号中断,因此只将7设为in。
CK为频段范围跳线,对ST16C554来说必须为in。
另外,EMM8在系统启动时会从板上的EEPROM 中读取各个端口的基本配置信息,主要是端口映射地址及分配的中断号,这些信息可以在启动后编程修改,但一般是固定的,因此只要在EEPROM 中配置一次并保存即可。
2、多串口驱动开发
2.1 I/O系统与串口设备驱动层次结构
I/O系统与串口设备驱动层次如图3所示。
图3中最底层就是要编写的驱动程序。在这里主要完成对具体硬件的各种操作,以及与上层的接口。硬件驱动层上面是ttyDrv和tyLib。这一层比较特殊,是Vxworks专门为串口设备准备的一个虚拟驱动库,它把跟具体硬件无关的操作集成在了这一层中。这样用户只编写与硬件有关的驱动和跟这一层的接口函数即可。从总的结构讲,这2层都属于设备驱动的范畴。再上一层是I/O系统层,Vxworks的I/O系统向上提供了7个基本的I/O接口,供应用程序调用;向下提供与各种设备驱动程序的接口。I/O系统把应用程序跟驱动程序有机地连接起来。最顶层就是用户根据应用需要编写的应用程序。ttyDrv是一个虚拟设备驱动,用于处理I/O系统与底层实际设备驱动程序(可以是用户设计的驱动程序)之间的通信。使用ttyDrv控制串口是比较常见的串口驱动实现方式,实际上,直接对硬件进行初始化,以中断方式进行串口通信也是可行的方式,且更加靠近底层,可以更自由、高效的控制串口。