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