以文本方式查看主题 - 曙海教育集团论坛 (http://sun4.cn/bbs/index.asp) -- VxWorks 应用开发 (http://sun4.cn/bbs/list.asp?boardid=38) ---- 实时操作系统VxWorks下电子海图系统打印功能的实现 (http://sun4.cn/bbs/dispbbs.asp?boardid=38&id=1959) |
-- 作者:wangxinxin -- 发布时间:2010-12-1 11:34:46 -- 实时操作系统VxWorks下电子海图系统打印功能的实现 1 前 言 电子海图系统是一种把需要向航海人员显示和解释的各种各样信息融成一体的实时导航系统,是地理信息系统在舰船组合导航系统中的重要应用,被认为是继雷达/ARPA之后在舰船导航方面又一项伟大的技术革命。与简单地用颜色显示的纸海图相比,电子海图系统包括更多的使用简单、操作容易的地理和文字信息。作为一种自动判定仪器,它能够连续测定船舶相对于陆地、图示物标、导航标志和不可见碍航物的位置,对海上航行、安全和商业都有重要意义。 VxWorks是一种嵌入式的实时操作系统。将应用较为广泛的电子海图系统移植到VxWorks操作系统下的主要原因有两个:一是VxWorks系统的实时性,能够很好的满足导航系统实时性的要求;二是基于信息安全方面的考虑,海图系统要求一种保密性好、没有漏洞的操作系统,使用VxWorks操作系统,程序开发者可以进行最底层的程序开发,能够完全控制系统的资源,确保海图信息的安全。 2 电子海图系统打印功能的总体设计思路 在VxWorks操作系统中,实现电子海图信息打印功能设计的总体思路是:首先将打印内容,包括图像和报表,转换成恰当格式的图像文件,如PostScript文件,而后对于没有内置PostScript语言解释器的打印机,需要将PostScript语言解释成打印机可以识别的语言,最后把图像文件输送到打印机。 本文介绍基于内置有PostScript语言解释器的HP LaserJet 1200打印机,在VxWorks操作系统下,完成电子海图信息打印功能的实现过程。 3 打印驱动 打印机驱动程序中的各个函数的实现: (1)基本的I/O函数的实现 根据打印机并口的特点,驱动程序中要实现的基本的I/O函数应该是lptOpen(…)、lptRead(…)、lptWrite(…)和lptIoctl(…)。这4个基本函数的声明分别是: LOCAL int lptOpen(LPT_DEV*pDev,char*name,int mode); LOCAL int lptRead(LPT_DEV*pDev,char*pBuf,int size); LOCAL int lptWrite(LPT_DEV*pDev,char*pBuf,int size); LOCAL STATUS lptIoctl(LPT_DEV*pDev,int function,int arg); 其中LPT_DEV结构的定义为: typedef struct lptDev { DEV_HDR devHdr; BOOL created;/*TRUE if this device has been created*/ BOOL autofeed;/* TRUE if enable autofeed */ BOOL inservice;/* TRUE if interrupt in service */ USHORT data; /* data register */ USHORT stat; /* status register */ USHORT ctrl; /* control register */ int intCnt;/* interrupt count */ int retryCnt; /* retry count */ int busyWait; /* loop count for BUSY wait */ int strobeWait;/* loop count for STROBE wait */ int timeout; /* timeout second for syncSem */ int intLevel; /* interrupt level */ SEMAPHORE muteSem;/* mutex semaphore */ SEMAPHORE syncSem;/* sync semaphore */ } LPT_DEV DEV_HDR是所有设备的头结构,是由VxWorks系统定义的,定义为: typedef struct/* DEV_HDR device header for all device structures*/ { DL_NODE node; /* device linked list node */ short drvNum; /* driver number for this device */ char * name; /* device name */ } DEV_HDR (2)设备的硬件初始化函数xxDrv(…)的实现 该函数的声明为: STATUS lptDrv(int channels, LPT_RESOURCE *pResource) 其中,参数channels 为打印并口的通道号;参数pResource是指向结构LPT_RESOURCE的指针,结构LPT_RESOURCE的定义为: typedef struct lptResource /* LPT_RESOURCE */ { int ioBase;/* IO base address */ int intVector;/* interrupt vector */ int intLevel; /* interrupt level */ BOOL autofeed;/* TRUE if enable autofeed */ int busyWait; /* loop count for BUSY wait */ int strobeWait;/* loop count for STROBE wait */ int retryCnt; /* retry count */ int timeout; /* timeout second for syncSem */ }LPT_RESOURCE; 该函数lptDrv(int channels, LPT_RESOURCE *pResource)完成了打印机并口的初始化,其中调用函数intConnect(…)和iosDrvInstall(…)的具体形式为: (void)intConnect((VOIDFUNCPTR*)INUM_TO_IVEC(pResource->intVector), (VOIDFUNCPTR)lptIntr, (int)pDev); lptDrvNum = iosDrvInstall (lptOpen, (FUNCPTR) NULL, lptOpen, (FUNCPTR) NULL, lptRead, lptWrite, lptIoctl); (3)设备的创建函数xxDevCreate(…)的实现 该函数的声明为: STATUS lptDevCreate (char *name, int channel) 该函数将设备的创建标志置为TRUE,然后调用函数iosDevAdd (&lptDev[annel],devHdr.name, lptDrvNum) 将创建的设备加入I/O系统中。 对于打印驱动程序,重点在于函数lptWrite(…)的编写,这个函数的实现可采用两种方式。一种是中断方式,即将控制寄存器中的允许中断位置为1,这样,打印机每打印输出一个字符后,立即向主机发出中断请求信号,要求发送下一个字符;主机方面只要在中断服务程序中实现数据传输即可,而不必循环查询打印机的“忙”信号。另一种是查询方式,用这种方式时,主机不停地测试打印机的“忙”信号,当检测到打印机不忙时,便向其发送打印数据,若打印忙,则主机必须等待,直到打印机不忙。 根据编写打印机驱动程序的两种方式,选用查询方式,其流程如图1。 4 PostScript文件的生成 6 汉字打印输出的实现 |