以文本方式查看主題 - 曙海教育集團(tuán)論壇 (http://www.rfoamep.cn/bbs/index.asp) -- VxWorks 應(yīng)用開(kāi)發(fā) (http://www.rfoamep.cn/bbs/list.asp?boardid=38) ---- 實(shí)時(shí)操作系統(tǒng)VxWorks下電子海圖系統(tǒng)打印功能的實(shí)現(xiàn) (http://www.rfoamep.cn/bbs/dispbbs.asp?boardid=38&id=1959) |
-- 作者:wangxinxin -- 發(fā)布時(shí)間:2010-12-1 11:34:46 -- 實(shí)時(shí)操作系統(tǒng)VxWorks下電子海圖系統(tǒng)打印功能的實(shí)現(xiàn) 1 前 言 電子海圖系統(tǒng)是一種把需要向航海人員顯示和解釋的各種各樣信息融成一體的實(shí)時(shí)導(dǎo)航系統(tǒng),是地理信息系統(tǒng)在艦船組合導(dǎo)航系統(tǒng)中的重要應(yīng)用,被認(rèn)為是繼雷達(dá)/ARPA之后在艦船導(dǎo)航方面又一項(xiàng)偉大的技術(shù)革命。與簡(jiǎn)單地用顏色顯示的紙海圖相比,電子海圖系統(tǒng)包括更多的使用簡(jiǎn)單、操作容易的地理和文字信息。作為一種自動(dòng)判定儀器,它能夠連續(xù)測(cè)定船舶相對(duì)于陸地、圖示物標(biāo)、導(dǎo)航標(biāo)志和不可見(jiàn)礙航物的位置,對(duì)海上航行、安全和商業(yè)都有重要意義。 VxWorks是一種嵌入式的實(shí)時(shí)操作系統(tǒng)。將應(yīng)用較為廣泛的電子海圖系統(tǒng)移植到VxWorks操作系統(tǒng)下的主要原因有兩個(gè):一是VxWorks系統(tǒng)的實(shí)時(shí)性,能夠很好的滿足導(dǎo)航系統(tǒng)實(shí)時(shí)性的要求;二是基于信息安全方面的考慮,海圖系統(tǒng)要求一種保密性好、沒(méi)有漏洞的操作系統(tǒng),使用VxWorks操作系統(tǒng),程序開(kāi)發(fā)者可以進(jìn)行最底層的程序開(kāi)發(fā),能夠完全控制系統(tǒng)的資源,確保海圖信息的安全。 2 電子海圖系統(tǒng)打印功能的總體設(shè)計(jì)思路 在VxWorks操作系統(tǒng)中,實(shí)現(xiàn)電子海圖信息打印功能設(shè)計(jì)的總體思路是:首先將打印內(nèi)容,包括圖像和報(bào)表,轉(zhuǎn)換成恰當(dāng)格式的圖像文件,如PostScript文件,而后對(duì)于沒(méi)有內(nèi)置PostScript語(yǔ)言解釋器的打印機(jī),需要將PostScript語(yǔ)言解釋成打印機(jī)可以識(shí)別的語(yǔ)言,最后把圖像文件輸送到打印機(jī)。 本文介紹基于內(nèi)置有PostScript語(yǔ)言解釋器的HP LaserJet 1200打印機(jī),在VxWorks操作系統(tǒng)下,完成電子海圖信息打印功能的實(shí)現(xiàn)過(guò)程。 3 打印驅(qū)動(dòng) 打印機(jī)驅(qū)動(dòng)程序中的各個(gè)函數(shù)的實(shí)現(xiàn): (1)基本的I/O函數(shù)的實(shí)現(xiàn) 根據(jù)打印機(jī)并口的特點(diǎn),驅(qū)動(dòng)程序中要實(shí)現(xiàn)的基本的I/O函數(shù)應(yīng)該是lptOpen(…)、lptRead(…)、lptWrite(…)和lptIoctl(…)。這4個(gè)基本函數(shù)的聲明分別是: 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結(jié)構(gòu)的定義為: 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是所有設(shè)備的頭結(jié)構(gòu),是由VxWorks系統(tǒng)定義的,定義為: 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)設(shè)備的硬件初始化函數(shù)xxDrv(…)的實(shí)現(xiàn) 該函數(shù)的聲明為: STATUS lptDrv(int channels, LPT_RESOURCE *pResource) 其中,參數(shù)channels 為打印并口的通道號(hào);參數(shù)pResource是指向結(jié)構(gòu)LPT_RESOURCE的指針,結(jié)構(gòu)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; 該函數(shù)lptDrv(int channels, LPT_RESOURCE *pResource)完成了打印機(jī)并口的初始化,其中調(diào)用函數(shù)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)設(shè)備的創(chuàng)建函數(shù)xxDevCreate(…)的實(shí)現(xiàn) 該函數(shù)的聲明為: STATUS lptDevCreate (char *name, int channel) 該函數(shù)將設(shè)備的創(chuàng)建標(biāo)志置為T(mén)RUE,然后調(diào)用函數(shù)iosDevAdd (&lptDev[annel],devHdr.name, lptDrvNum) 將創(chuàng)建的設(shè)備加入I/O系統(tǒng)中。 對(duì)于打印驅(qū)動(dòng)程序,重點(diǎn)在于函數(shù)lptWrite(…)的編寫(xiě),這個(gè)函數(shù)的實(shí)現(xiàn)可采用兩種方式。一種是中斷方式,即將控制寄存器中的允許中斷位置為1,這樣,打印機(jī)每打印輸出一個(gè)字符后,立即向主機(jī)發(fā)出中斷請(qǐng)求信號(hào),要求發(fā)送下一個(gè)字符;主機(jī)方面只要在中斷服務(wù)程序中實(shí)現(xiàn)數(shù)據(jù)傳輸即可,而不必循環(huán)查詢打印機(jī)的“忙”信號(hào)。另一種是查詢方式,用這種方式時(shí),主機(jī)不停地測(cè)試打印機(jī)的“忙”信號(hào),當(dāng)檢測(cè)到打印機(jī)不忙時(shí),便向其發(fā)送打印數(shù)據(jù),若打印忙,則主機(jī)必須等待,直到打印機(jī)不忙。 根據(jù)編寫(xiě)打印機(jī)驅(qū)動(dòng)程序的兩種方式,選用查詢方式,其流程如圖1。 4 PostScript文件的生成 6 漢字打印輸出的實(shí)現(xiàn) |