采用此方法必須十分精通Windows內(nèi)部體系結(jié)構(gòu)、MicrosoftMASM匯編語言和設(shè)備驅(qū)動程序結(jié)構(gòu)體系方法以及具有豐富的經(jīng)驗,否則會造成軟件極不穩(wěn)定甚至系統(tǒng)崩潰。這種方法在開發(fā)設(shè)備虛擬驅(qū)動程序時非常實用,但需要花費的時間和精力也比較多。(3)利用WinDriver實現(xiàn)的方法利用WinDriver也可以實現(xiàn)物理內(nèi)存的分配,用這中方法的好處有:WinDriver的函數(shù)以文件形式獨立出來,開發(fā)時只需將其文件加入模板接口API動態(tài)鏈接庫(DLL)源文件中
采用此方法必須十分精通Windows內(nèi)部體系結(jié)構(gòu)、Microsoft MASM匯編語言和設(shè)備驅(qū)動程序結(jié)構(gòu)體系方法以及具有豐富的經(jīng)驗,否則會造成軟件極不穩(wěn)定甚至系統(tǒng)崩潰。這種方法在開發(fā)設(shè)備虛擬驅(qū)動程序時非常實用,但需要花費的時間和精力也比較多。
(3)利用WinDriver實現(xiàn)的方法
利用WinDriver也可以實現(xiàn)物理
內(nèi)存的分配,用這中方法的好處有:
WinDriver的函數(shù)以文件形式獨立出來,開發(fā)時只需將其文件加入模板接口API 動態(tài)鏈接庫(DLL)源文件中即可,使用方便而且獨立性較強。
由于模板接口API DLL主要是利用WinDriver實現(xiàn)的,這樣使整個DLL有較強的統(tǒng)一性和穩(wěn)定性。
在整個DLL中,每個數(shù)據(jù)采集模板只有一個句柄,避免了有其他方法實現(xiàn)時的每個數(shù)據(jù)采集模板多句柄問題。
如上所訴,利用KRFTech’s公司開發(fā)的WinDriver是可以實現(xiàn)物理內(nèi)存分配的。WinDriver本來是硬件驅(qū)動程序開發(fā)工具,運用它很容易完成訪問I/O端口、存儲區(qū)域、處理中斷、執(zhí)行
DMA操作及訪問
PCI和自定義寄存器的工作。利用WinDriver 庫函數(shù)WD_DMALOCK()可以動態(tài)地分配一段物理內(nèi)存。這個函數(shù)的作用是:分配和鎖定物理內(nèi)存區(qū),并返回已分配內(nèi)存的物理地址。下面對此函數(shù)做一詳細(xì)介紹。
WD_DMALOCK(HANDLE
Hwd,WD_DMA *pDma)
這里用到WD_DMA結(jié)構(gòu),它的成員如下:
pUserAddr – 內(nèi)存的基地址
dwBytes – 內(nèi)存的大小
dwOptions – 內(nèi)存分配方式,常為 0。
=DMA_KERNEL_BUFFER_ALLOC 時,內(nèi)存地址是連續(xù)的,內(nèi) 存地址放在pUserAddr中
=DMA_LARGE_BUFFER 將分配大于1MB 的內(nèi)存
Page[] – 內(nèi)存地址數(shù)組
Page[i].pPhysicalAddr – 第i頁的物理地址
比如向上位機申請64KDWORD物理內(nèi)存,則:
{ WD_DMA Dma;
BZERO(Dma);
Dma.dwBytes = 262144;//64KDWORD
Dma.pUserAddr = NULL;
Dma.dwOptions= DMA_KERNEL_BUFFER_ALLOC;
WD_DMALock (hWD, &
amp;Dma);