以文本方式查看主題 - 曙海教育集團論壇 (http://www.hufushizhe.com/bbs/index.asp) -- VxWorks 應用開發 (http://www.hufushizhe.com/bbs/list.asp?boardid=38) ---- 實時操作系統VxWorks下電子海圖系統打印功能的實現 (http://www.hufushizhe.com/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 漢字打印輸出的實現 |