采用WDM的精確定時器及其在冗余技術(shù)中的應(yīng)用
3 軟件設(shè)計
3. 1 WDM 模式驅(qū)動程序
在Window s XP 操作系統(tǒng)中, 運行于用戶模式的應(yīng)用程序訪問硬件資源是通過Win32 API 調(diào)用內(nèi)核模式的驅(qū)動程序?qū)崿F(xiàn)的。這種內(nèi)核模式的驅(qū)動程序就是WDM(Window s Driver Model) 驅(qū)動程序, 它是微軟在Window s XP 操作系統(tǒng)中提出的新的驅(qū)動程序模式, 支持即插即用、電源管理和I/ O 管理等功能。圖2 是Window s XP 的系統(tǒng)結(jié)構(gòu)。
如圖2 所示設(shè)備驅(qū)動程序是操作系統(tǒng)的一個組成部分, 它由I/ O 管理器( I/ O Manager ) 管理和調(diào)動。
I/ O管理器每收到一個來自用戶應(yīng)用程序的請求就創(chuàng)建一個I/ O 請求包( IRP) 的數(shù)據(jù)結(jié)構(gòu), 并將其作為參數(shù)傳遞給驅(qū)動程序。驅(qū)動程序通過識別IRP 中的物理設(shè)備對象( PDO) 來區(qū)別是發(fā)送給哪一個設(shè)備。IRP 結(jié)構(gòu)中存放請求的類型、用戶緩沖區(qū)的首地址、用戶請求數(shù)據(jù)的長度等信息。驅(qū)動程序處理完這個請求后, 在該結(jié)構(gòu)中填入處理結(jié)果的有關(guān)信息, 調(diào)用IoCompleteRequest 將其返回給I/ O 管理器, 用戶應(yīng)用程序的請求隨即返回。訪問硬件時, 驅(qū)動程序通過調(diào)用硬件抽象層的函數(shù)實現(xiàn)。
圖2 Windows XP 系統(tǒng)結(jié)構(gòu)
WDM 的開發(fā)可采用DDK, DriverWorks 等開發(fā)工具。以下重點描述在此WDM 驅(qū)動實例中采用定時查詢實現(xiàn)CAN 總線冗余功能。
3. 2 驅(qū)動冗余設(shè)計
本設(shè)計中, CAN 通路采用2 路冗余, 使得當(dāng)一個CAN 總線接口出現(xiàn)故障時, 可以很方便地切換到另一個CAN 總線接口。
故障檢測在定時器中實現(xiàn)。在DriverWorks 中有兩種定時器對象, 即附屬于設(shè)備對象的1 Hz 定時器和KTimedCallback 類定義的定時器, WDM 定時方法是通過它們實現(xiàn)的。KT imedCal lback 是KTimer 的派生類, KTimer 封裝了系統(tǒng)定時器, 構(gòu)成分發(fā)對象定時器類, 可用于同步目的。KT imedCal lback 類包含了系統(tǒng)延時過程調(diào)用( DPC) 對象, 當(dāng)定時器超時后系統(tǒng)就調(diào)用DPC。KTimedCallback 的成員函數(shù)主要是Set 和SetPeriodic, Set 用于設(shè)置一次有效定時器參數(shù), SetPeriodie 設(shè)置周期性定時器參數(shù), Set 和SetPeriodic 在設(shè)置定時參數(shù)時同時啟動定時器并建立與回調(diào)函數(shù)的關(guān)聯(lián),定時器超時后調(diào)用回調(diào)函數(shù)。
具體的切換工作放在DPC 中完成。DPC 為推遲過程調(diào)用, 一些操作不適合在ISR 中處理需放入限制較少的DPC 中, 如通知事件置標(biāo)記等等。DPC 是一個通用機制, 但通常都用在中斷處理中。在最普通的情況下, ISR 決定當(dāng)前請求的完成并請求一個DPC。之后,內(nèi)核在DISPATCH_LEVEL 級上調(diào)用這個DPC 例程。
評論