四虎成人免费视频,国产一级a作爱视频免费观9看,色五月丁香亚洲,亚洲欧美性爱在线视频,1000部黄片免费观看一区,国产亚洲性生活视频播放,三级黄色在线视频网站

現(xiàn)在位置:范文先生網(wǎng)>理工論文>電子通信論文>采用VXD技術(shù)實(shí)現(xiàn)實(shí)的通信

采用VXD技術(shù)實(shí)現(xiàn)實(shí)的通信

時(shí)間:2023-02-21 00:14:28 電子通信論文 我要投稿
  • 相關(guān)推薦

采用VXD技術(shù)實(shí)現(xiàn)實(shí)的通信

  摘要:討論Windows虛擬設(shè)備驅(qū)動(dòng)(VXD)技術(shù),并采用此項(xiàng)技術(shù)示范性地做出應(yīng)用于PC串口實(shí)時(shí)通信的虛擬驅(qū)動(dòng)程序,找到一種可以在PC中實(shí)現(xiàn)實(shí)時(shí)通信的途徑。
  關(guān)鍵詞:VXD實(shí)時(shí)串口通信
  
  引言
  
  在微軟的視窗操作系統(tǒng)中,系統(tǒng)內(nèi)核掌管所有的應(yīng)用程序,通過(guò)獨(dú)特的任務(wù)調(diào)度算法實(shí)現(xiàn)CPU的分時(shí)多任務(wù)處理方式。多任務(wù)處理對(duì)大多數(shù)用戶可能是件好事,但是對(duì)那些想把實(shí)時(shí)通信建立在Windows操作系統(tǒng)上的特殊用戶來(lái)說(shuō),操作界面的圖形化并不比MS-DOS的單任務(wù)更具吸引力。在視窗操作系統(tǒng)里可以進(jìn)行實(shí)時(shí)通信和控制碼?答案是:VXD技術(shù)可以幫我們?cè)讷@取友好的人機(jī)界面的同時(shí)還擁有很強(qiáng)的實(shí)時(shí)性。
  
  1VXD技術(shù)解析
  
  VXD技術(shù)可追溯到Windows3.1,它的引入就是要讓操作系統(tǒng)實(shí)現(xiàn)多工以及硬件資源的共享。為了支持多個(gè)MS-DOS任務(wù)同時(shí)執(zhí)行,Windows98讓每個(gè)MS-DOS應(yīng)用程序在各自的虛擬機(jī)(VM)上運(yùn)行,各自互不相干;而所有的Widnows應(yīng)用程序卻都在一個(gè)虛擬機(jī)上運(yùn)行。圖1所示的結(jié)構(gòu)框圖很好地說(shuō)明了Windows98的整體架構(gòu)。
  
  圖1中,由眾多的VXD組成系統(tǒng)級(jí)代碼處于最底層。其中,處于中心地位的是一名為VMM32的VXD,它負(fù)責(zé)協(xié)調(diào)和管理所有的VXDs。其它VXDs則通過(guò)消息機(jī)制(這個(gè)消息機(jī)制由VMM32.VXD來(lái)維護(hù))彼此聯(lián)系。由所有VXDs開放出的服務(wù)接口(API)組成了一個(gè)服務(wù)網(wǎng),它們彼此通過(guò)合作的方式,提供Windows98的系統(tǒng)底層驅(qū)動(dòng)服務(wù)。
  
  從以上Windows98系統(tǒng)架構(gòu)可以看出,要想在視窗平臺(tái)下獲取很強(qiáng)的實(shí)時(shí)性,僅靠提升應(yīng)用程序線程優(yōu)先級(jí)的方法是不夠的。因?yàn)閃in32應(yīng)用程序代碼屬于Ring3級(jí),而VXD代碼則屬于Ring0級(jí);采用VXD撰寫的實(shí)時(shí)通信程序可以完全不受代碼限制,可以直接對(duì)硬件進(jìn)行操作。VXD的這個(gè)特點(diǎn)正是實(shí)時(shí)通信建立所必須的。
  
  設(shè)計(jì)實(shí)時(shí)通信的VXD前,先解釋以下幾個(gè)問(wèn)題:
  
 、賄MM32使用VPICD.VXD虛擬化每個(gè)硬件和軟件中斷。VMM32為每個(gè)虛擬機(jī)(VM)維護(hù)一個(gè)IDT結(jié)構(gòu),當(dāng)中斷發(fā)生時(shí),CPU先保護(hù)中斷現(xiàn)場(chǎng),然后經(jīng)由當(dāng)前VM的IDT把這個(gè)中斷引導(dǎo)至相應(yīng)的中斷處理程式。
  
  中斷的虛擬化,使我們有機(jī)會(huì)給每個(gè)中斷提供新的中斷處理函數(shù),并可以讓多個(gè)硬件共享同一個(gè)中斷號(hào)。VPICD.VXD為我們提供這些服務(wù)。
  
 、赩MM有兩個(gè)調(diào)度器,用以在多個(gè)線程和VMs之間實(shí)現(xiàn)搶占式多工。主調(diào)度器負(fù)責(zé)選定下一個(gè)將被執(zhí)行的線程。這個(gè)選擇可以是一個(gè),也可以是多個(gè)。然后,主調(diào)度器把選擇結(jié)果送給所謂的時(shí)間片調(diào)度器,并由后者完成各個(gè)應(yīng)用程序間的時(shí)間片分配。調(diào)度器也時(shí)應(yīng)用程序經(jīng)由呼叫Win32線程優(yōu)先調(diào)整API(如SetThreadPriority和SetPriorityClass等)做出回應(yīng)。當(dāng)中斷發(fā)生時(shí),VMM32自動(dòng)提升中斷處理函數(shù)所在VM之優(yōu)先級(jí),保證中斷處理函數(shù)能及時(shí)被執(zhí)行。
  
 、踁XD和Win32應(yīng)用程序可直接通信。Win32應(yīng)用程序可通過(guò)一個(gè)系統(tǒng)API(DevicelOControl(…))來(lái)呼叫位于底層的VXD為其服務(wù)。在呼叫VXD前,首先必須調(diào)用CreatFile(…)這個(gè)API加載該VXD(如果該VXD是一個(gè)靜態(tài)VXD,則不用加載)。所有的呼叫動(dòng)作其實(shí)都通過(guò)VMM32完成。VXD也可以通過(guò)消息方式和位于上層的Win32應(yīng)用程序通信。She11.VXD為所有希望以消息機(jī)制和Win32應(yīng)用程序通信的VXD提供了這一服務(wù)。
  
  以上是編寫一個(gè)串口通信驅(qū)動(dòng)需要的系統(tǒng)層面知識(shí)。對(duì)于Windows底層的了解。
  
  2用VXD實(shí)現(xiàn)一個(gè)實(shí)時(shí)串口通信驅(qū)動(dòng)
  
  接下來(lái)用VXD技術(shù)實(shí)現(xiàn)一個(gè)實(shí)時(shí)串行通信的驅(qū)動(dòng)。這個(gè)VXD是一個(gè)動(dòng)態(tài)(Dynamic)VXD,當(dāng)它的服務(wù)被呼叫時(shí),VMM32會(huì)動(dòng)態(tài)加載這個(gè)VXD。作者采用的工具是C+98DDK。當(dāng)然也可以使用其它的工具,如MASM6.11(或更高版本)、VtoolsD。用C搭配DDK完成VXD構(gòu)建的好處是,可以使用C語(yǔ)言完成絕大部分的程序,程序比較容易閱讀和維護(hù)。
  
  用C來(lái)實(shí)現(xiàn)一個(gè)VXD驅(qū)動(dòng),需要準(zhǔn)備如下條件:一個(gè).ASM的匯編語(yǔ)言接口文件(在其中定義VXD要處理的系統(tǒng)消息和輸出API),一個(gè).C的函數(shù)實(shí)現(xiàn)文件(在其中完成自己函數(shù)實(shí)體),一個(gè).DEF的定義文件(在其中定義VXD中各個(gè)段的別名并匯成一個(gè)DDB)和一個(gè).MAK檔(用來(lái)編譯并連接生成VXD,可有可無(wú))。在這里,僅給出用C實(shí)現(xiàn)的函數(shù)檔。至于其它的文件,可以從本文所列的參考書目或其它文獻(xiàn)中找到相關(guān)文檔的說(shuō)明。
  
  這個(gè)串口通信驅(qū)動(dòng)程序的功能是:實(shí)時(shí)送出一個(gè)Byte的數(shù)據(jù),實(shí)時(shí)接收一個(gè)Byte的數(shù)據(jù)。作為演示之用,并沒有加入其它代碼。該VXD驅(qū)動(dòng)主要由如下3個(gè)系統(tǒng)消息(由VMM32來(lái)維護(hù)和管理)處理函數(shù)組成,其代碼如下:
  
 。1)OnSysDynamic
  
  
  
  DeviceInit()函數(shù)
  
  BOOLOnSysDynamicDeviceInit()
  
  {//OnSysDynamicDeviceInit
  
  irqhandle=VPICD_Virtualize_IRQ((DWORD)(&irq4));
  
  if(irqhandle==0){
  
  returnFALSE;
  
  }
  
  returnTRUE;//OnSysDynamicDeviceInit
  
  }
  
  該函數(shù)用來(lái)完成VXD初始化所做的工作。在本例中,由于實(shí)時(shí)監(jiān)視串口中斷的需要,要給COM1的中斷安裝一個(gè)自定義的斷服務(wù)函數(shù)。98DDK已經(jīng)提供了這個(gè)函數(shù)的C語(yǔ)言版,其原型是HIRQstaticVPICD_Virtualize_IRQ(PVIDpvid),在vpicd.h中。該函數(shù)需要一個(gè)指針作為參數(shù)(指向名為VPICD_IRQ_Descriptor的結(jié)構(gòu)體),函數(shù)傳回一個(gè)指向該虛擬IRQ的句柄(該句柄在后來(lái)的VPICD服務(wù)中需要提供)。VPICD_IRQ_Descriptor結(jié)構(gòu)體的組成為:
  
  typedefstructVPICD_IRQ_Descriptor{
  
  USHORTVID_IRQ_Number;//IRQ號(hào)(0~15)
  
  USHORTVID_Options;//標(biāo)志位選項(xiàng)
  
  ULONGVID_Hw_Int_Proc;//硬件中斷服務(wù)程序的地址
  
  ULONGVID_Virt_Int_Proc;//虛擬中斷服務(wù)程序
  
  ULONGVID_Mask_Change_Proc//MaskChange調(diào)用例程
  
  ULONGVID_IRET_Proc;//IRET調(diào)用例程
  
  ULONGVID_IRET_Time_Out;//在Vm的進(jìn)程優(yōu)先級(jí)提升之前的最大等待時(shí)間
  
  ULONGVID_Hw_Int_Ref;//硬件中斷服務(wù)程序的數(shù)據(jù)存放地址
  
  }VID;
  
  其中只用到三位。在本例中需要聲明一個(gè)名為irq4的全局變量為VID結(jié)構(gòu),并付給如下初值:VIDirq4={4,0,hwproc,0,0,0,0,500,0},表示將要虛擬化IRQ4,改變其中斷處理函數(shù)為voidhwproc(void),該函數(shù)的原型如下:
  
  voidhwproc(void){
  
  _asm{
  
  movdx,0x3f8
  
  inal,dx
  
  movbyteptr[readin],al
  
  clc
  
  }
  
  return;
  
  }
  
  在這個(gè)中斷處理中,僅僅從COM1的數(shù)據(jù)寄存器(地址為3F8h)中讀取接收到的數(shù)值,并把該數(shù)值存放在一個(gè)類型為BYTE、名為readin的內(nèi)存中。
  
  (2)OnSysDynamicDeviceExit()函數(shù)
  
  BOOLOnSysDynamicDeviceExit()
  
  {
  
  VPICD_Force_Default_Behavior(irqhandle);
  
  //解除IRQ4虛擬化
  
  returnTRUE;
  
  }//OnSysDynamicDeviceExit
  
  該數(shù)提供了用于善后處理VXD在卸載時(shí)需要完成的事件。在本例中,和VXD初始化對(duì)應(yīng),需要解除對(duì)COM1的中斷IRQ4的虛擬化。作者也是用98DDK在vpicd.h中提供的外包函數(shù)voidstatic_inlineVPICD_Force_Default_Behavior(HIRQhirp)。該函數(shù)唯一需要的參數(shù)便是使用VPICD_Virtualize_IRQ函數(shù)傳回的IRQ句柄。
  
  (3)OnDeviceIoControl()函數(shù)
  
  DWORDOnDeviceIoControl(PDIOCPARAMETERSp){
  
  Switch(p->dwIoCon
  
  
  
  trolCode)
  
  {
  
  case1://端口寫功能
  
  if(!p->lpvOutBuffer||p->cbOutBuffer<1)
  
  {//輸出緩存的有效性檢查
  
  returnERROR_INVALID_PARAMETER;
  
  }
  
  if(serial_out((DWORD)(p->lpvInBuffer)))
  
  {//數(shù)據(jù)發(fā)送
  
  *(BYTE*)(p->lpvOutBuffer)=*(BYTE*)(p->lpvInBuffer);
  
  }
  
  else{
  
  *(BYTE*)(p->lpvOutBuffer)=0;
  
  }
  
  open_int();//打開com1中斷
  
  return0;
  
  case2://端口讀功能
  
  if(*(BYTE*)reading==0x00)
  
  {//數(shù)據(jù)讀入
  
  *(BYTE*)(p->lpvOutBuffer)=0x00;
  
  return0;
  
  }
  
  *(BTYE*)(p->lpvOutBuffer)=*(BYTE*)(readin);
  
  return0;
  
  }
  
  return0;
  
  }
  
  return0;
  
  }
  
  OnDeviceIoControl函數(shù)用來(lái)處理Win32應(yīng)用程序?qū)XD的呼叫。Win32應(yīng)用程序的呼叫會(huì)讓VMM32送給該VXD一個(gè)系統(tǒng)信息,并傳遞進(jìn)一個(gè)DIOCPARAMETERS結(jié)構(gòu)的指針。該結(jié)構(gòu)里包含Win32應(yīng)用程序呼叫時(shí)傳遞進(jìn)來(lái)的各個(gè)參數(shù)。這個(gè)結(jié)構(gòu)的組成如下:
  
  TypedefstunctDIOCParams{
  
  DWORDInternall;//指向客戶寄存器的指針
  
  DWORDVMHande;//該VM的句柄
  
  DWORDInternal2;//指向DDB結(jié)構(gòu)的指針
  
  DWORDdwIoConrolCode;//DeviceIoControl例程中呼叫的控制碼
  
  DWODlpvInBuffer;//DeviceIoControl例程呼叫所傳遞進(jìn)來(lái)的輸入緩沖區(qū)地址
  
  DWORDcbInBuffer;//輸入緩沖區(qū)的大小
  
  DWORDlpvOutBuffer;//DeviceIoControl例程呼叫所傳遞進(jìn)來(lái)的輸出緩沖區(qū)地址
  
  DWORDcbOutBuffer;//輸出緩沖區(qū)的大小
  
  DWORDlpcbBytesReturned;//拷貝到輸出緩沖區(qū)中的字節(jié)數(shù)(可以為NULL)
  
  DWORDlpOverlapped;//DeviceIoControl例程呼叫所傳遞進(jìn)來(lái)的重疊I/O塊結(jié)構(gòu)
  
  DWORDhDevice;//Ring3層呼叫應(yīng)用程序句柄
  
  DWORDtagProcess;//例程標(biāo)簽
  
  }
  
  DIOPARAMETERS;
  
  其中,dwIoControlCode指明了Win32應(yīng)用程序需要VXD提供的哪一項(xiàng)服務(wù)。在本例中采用一個(gè)switch-case語(yǔ)句作為服務(wù)入口,如下所示。其中服務(wù)1為讓串口送出一個(gè)字節(jié),服務(wù)2為讀取一個(gè)已經(jīng)由串口接收的字節(jié)。函數(shù)open_int()是用來(lái)初始化串口以便接收字節(jié)數(shù)據(jù);函數(shù)BOOLserial_out(DWORDpBuffer)是讓串口發(fā)出一個(gè)字節(jié)。它們的函數(shù)體分別如下:
  
  BOOLserial_
  
  
  
  out(DWORDpBuffer){
  
  if(pBuffer==NULL){
  
  returnFALSE;
  
  }
  
  _asm{
  
  pushfd
  
  cli
  
  pusheax
  
  pushedx
  
  movdx,0x3fb;設(shè)置COM1的波特率
  
  moval,0x83
  
  outdx,al
  
  movdx,0x3f8
  
  moval,12
  
  outdx,al
  
  movdx,0x3f9
  
  moval,0
  
  outdx,al
  
  movdx,0x3fb;設(shè)置COM1的線控項(xiàng)
  
  moval,3
  
  outdx,al
  
  movdx,0x3f9;CMM1關(guān)中斷
  
  moval,0
  
  outdx,al
  
  movdx,0x3fa;關(guān)閉com1的FIFO功能
  
  moval,0
  
  outdx,al
  
  movdx,0x3f8;字節(jié)發(fā)送
  
  moval,byteptr[pBuffer]
  
  outdx,al
  
  popedx
  
  popeax
  
  popfd
  
  sti
  
  }
  
  returnTRUE;
  
  }
  
  serial_out這個(gè)函數(shù)體的實(shí)現(xiàn)是用匯編語(yǔ)言實(shí)現(xiàn)的。因?yàn)樯婕暗胶芏嗟亩丝谔峁┮约癈PU的標(biāo)志(flag)和壓棧操作,因此考慮到用匯編語(yǔ)言編寫會(huì)簡(jiǎn)化代碼。因?yàn)榇舜趥鬏斨,用到了關(guān)閉中斷的指令(cli),所以,當(dāng)寫操作所要求完成的任務(wù)很多時(shí),此關(guān)中斷指令會(huì)讓程序的實(shí)時(shí)性很好地體現(xiàn)出來(lái),但cli指令有效時(shí)間過(guò)長(zhǎng)會(huì)導(dǎo)致系統(tǒng)問(wèn)題,所以還是要謹(jǐn)慎使用。
  
  Voidopen_int(void){
  
  _asm{
  
  movdx,0x3f9;COM1開中斷
  
  moval,0x05
  
  outdx,al
  
  }
  
  return;
  
  }
  
  open_int函數(shù)用來(lái)把PC串口的中斷設(shè)備按照需要設(shè)立起來(lái)。函數(shù)體很簡(jiǎn)單,僅改變了地址為3F9h的內(nèi)容,意為設(shè)置Rxdataready和Linestatus中斷位,以便讓CPU可以及時(shí)在COM1的中斷服務(wù)程序里讀取串口接收到的字節(jié)。
  
  以上涉及到串口輸入和輸出的函數(shù)體實(shí)現(xiàn)代碼中,用到了PC16550UART的資料。
  
  至此,一個(gè)可用于實(shí)時(shí)串口通信的VXD驅(qū)動(dòng)程序已經(jīng)完成。由于篇幅所限,不能將其它必要的文檔一同提出來(lái)討論。
  
  3Win32客戶測(cè)試程序
  
  有了上述VXD驅(qū)動(dòng)程序,還需要搭配一個(gè)Win32客戶程序來(lái)進(jìn)行測(cè)試。在網(wǎng)絡(luò)補(bǔ)充版中,給出一個(gè)筆者在VC6下編制的一個(gè)控制臺(tái)應(yīng)用程序片斷,以供參考。
  
  現(xiàn)在編制VXD驅(qū)動(dòng)還沒有一個(gè)集成開發(fā)環(huán)境(IDE)。本文的驅(qū)動(dòng)程序是用VC6.0自帶的編譯器編譯的。由于要編譯匯編文檔,所以還需要把一個(gè)MASM匯編器(要求6.0以上版本)及其相關(guān)文檔拷貝到VC6.0的vc98\u30446目錄下。
  
  
  
  
  4結(jié)論
  
  通過(guò)以上對(duì)VXD技術(shù)的簡(jiǎn)要分析以及一個(gè)用VXD實(shí)現(xiàn)的通信驅(qū)動(dòng)可以看出,在Windows操作系統(tǒng)中,采用VXD技術(shù),可以很好地克服由多工帶來(lái)的時(shí)延問(wèn)題,很好地解決了在Windows平臺(tái)下實(shí)時(shí)通信的問(wèn)題。
  
  
  
  
  
  

【采用VXD技術(shù)實(shí)現(xiàn)實(shí)的通信】相關(guān)文章:

SWIFT全球清算系統(tǒng)采用PKI技術(shù)08-05

高科技:郵政發(fā)展的保證——采用高技術(shù)促進(jìn)郵政通信發(fā)展探析08-06

采用多框架技術(shù)實(shí)現(xiàn)在線考場(chǎng)恢復(fù)系統(tǒng)08-06

采用虛擬儀器技術(shù)的油品含水量檢測(cè)系統(tǒng)08-06

通信技術(shù)專業(yè)就業(yè)前景08-20

光纖通信技術(shù)及運(yùn)用08-18

通信技術(shù)自我鑒定11-22

通信技術(shù)求職信04-08

通信技術(shù)個(gè)人簡(jiǎn)歷03-20