: : 效能達成 : :
A : 建議可以使用WinDriver最新版本去做開發,11.2版本已經太舊,無法得到適當支持。內存碎片在Windows操作系統中為已知問題,建議移動到一個分散 – 集中DMA,盡量預先分配 DMA存儲器,可以參考技術說明#3
http://www.jungo.com/st/support/tech_docs/td3.html
A : 如果您允許從內核插件中斷程序發生中斷,並同時從用戶模式停止作業,此情況有可能會發生當機(使用WD_IntDisable()或I InterruptEnable() / WDC_IntEnable() — which callWD_IntDisable())。由於中斷是有效的(已開啟的Kernel PlugIn),等待WD_IntDisable()返回時,此中斷無法產生,電腦會發生當機。
有種可能的解決方案,調用WD_IntDisable()/InterruptEnable()/WDC_IntEnable()作為一個核心操作,因此它停止中斷成功之前,Kernel PlugIn可使其中斷。
A : 您可以使用直接存取記憶體的方法,取代WD_Transfer(),通過相關記憶體範圍內的虛擬使用者模式映射,這是由WD_CardRegister() in:cardReg.Card.Item[i].I.Mem.dwUserDirectAddress回傳的結果(其中”i”是在WD_ITEMS的”item”陣列中,記憶體基本位址的目錄)。
請參考WinDriver User’s Manuals (Function Reference與Improving Performance章節,WD_CardRegister()的說明)以及技術手冊74和 17,技術文件17也包括其他WinDriver如何改善您的驅動效能。
A : 您可以使用WinDriver的WD_DebugAdd()函數(v5.0.3及以上的版本皆可),在Debug Monitor中,從您的Kernel PlugIn或user-mode的代碼印出debug的訊息,然後在Debug Monitor log中查看訊息。WD_DebugAdd()可以從任何user-mode或Kernel PlugIn被調用,包括KP_IntAtIrql()。您也可以選擇從WinDriver Debug Monitor發送debug訊息到kernel debugger,更多資訊請參考Technical Document 44。此外,您可以在您的Kernel PlugIn代碼中,添加調用到OS kernel,可以直接輸出到kernel debugger – 例如KdPrint() on Windows或printk() on Linux。
A : user-mode的中斷處理程序可以服務高達每秒10,000次的中斷(雖然我們無法保證一個具體的數字,因為這取決於很多因素)。25微秒的等待時間一般應該不會發生,但是它會不定時發生。使用WinDriver的Kernel PlugIn功能會確保此情況不會發生。然而,沒有任何方法可以防止一些寫得很差的設備驅動程序,產生長時間的中斷,這種引起問題的驅動程序應查明並升級或刪除。有關更多資訊,請參考Technical Document 48。
A : 請確認已經安裝WinDriver kernel module – windrvr6.o/.ko (或windrvr.o – 在v5.2.2以及之前的版本) – 因為當您安裝Kernel PlugIn module之前,Kernel PlugIn driver取決於其運作的WinDriver driver module。
有關更詳細的 Kernel PlugI安裝說明,請依據您WinDriver的版本去參考WinDriver User’s Manuals和 Technical Document 62.。
A : 使用WinDriver的Kernel PlugIn功能,您可以期望每秒處理超過10萬的中斷,而不會錯過其中任何一個。對於Kernel PlugIn的處理範例代碼,使用DriverWizard可以為您的設備生成代碼(在wizard生成代碼之前,PCI和PCMCIA設備,先定義數據去清理中斷),或是可以在WinDriver WinDriver Kernel PlugIn看到範例代碼 –KP_PCI (WinDriver/samples/pci_diag/kp_pci — v7.0.0+)或KPTEST(WinDriver/kerplug/kptest/kermode — v6.2.3-a)。在用戶模式下,您可以處理每秒約5,000-10,000的中斷,但因為Windows不是即時的作業系統,所以您在一段時間中可能會錯過部分中斷(雖然WinDriver會告訴您,當您錯過中斷,以及有多少中斷遺漏),有關WinDriver中斷延時說明,請參考Technical Document 48.
A : Kernel PlugIn可以建立附加的*.sys/.kext/.o/.ko kernel driver – 根據您的作業系統 – 去延伸您需要的WinDriver功能,您建立的Kernel PlugIn drive不是獨立的 – 它只能與user-mode driver一同運行。請注意,使用WinDriver的Kernel PlugIn功能時,根據作業系統和WinDriver版本,您必須安裝kernel module —windrvr6.sys/.dll/.o/.ko or WinDriver.kext。
A : 可以的,您可在user mode刪除中斷處理程序,亦可以在Kernel PlugIn和user mode各實現一些中斷處理。 KP_IntAtDpc()的返回值(當高優先的KP_IntIrql()例程返回TRUE)確定次數後,user mode的中斷處理程序將被執行。
A : WinDriver可以實現 malloc()和free(),作為kernel mode的內存分配(請參考Technical Document 34)。由於分配的內存已經被鎖定,您可以在Kernel PlugIn中斷例行程序中,使用此內存,也可以在user mode 和Kernel PlugIn應用中,分享內存緩衝區 – 其他更詳細資訊,請參考in Technical Document 41.
A : WinDriver試用版與正式版的功能並無差異,而Kernel PlugIn是WinDriver工具的一部份,因此試用版亦可使用
Q:如何利用WinDriver提升驅動程式的效能?
存取和處理中斷速度會遠遠超過在用戶模式下的狀態。
若您的設備是USB,請嘗試使用流(streaming)媒體數據傳遞,而不是簡單複製的塊(block)數據。此意味著內核會嘗試從設備中讀取更多的訊息,
用戶模式可以準備一個數據的緩衝區,以便立即接收訊息。
Streaming API:
Stream_open:初始化
stream_start:開始串流
stream_read :從緩衝區讀取
請注意,WinDriver無法實現USB/PCI的標準化驅動程式(例如:HID、影像),亦無法與作業系統的內核API做溝通,
因此不能在WinDriver的驅動程式中使用作業系統的功能
【舉例一】
使用者可以編寫驅動程式,實現跟設備的串口通信,但無法在系統中創建COM port(),因為此動作需要使用作業系統的API,WinDriver是不支援此應用。
【舉例二】
使用者可以編寫驅動程式,將訊息從USB攝影機讀取,接著以某種方式將其訊息顯示在螢幕上,但作業系統將無法辨別它是視 頻類的USB攝像頭驅動程式,而
若要定義該USB設備為HID設備,定義COM port將屬於核心模式的功能,因此 使用者無法使用WinDriver來做上述的應用。
Q: 由於我使用PC讀取PCI設備卡時,速度非常的慢,因此欲使用Brust來改善,請問WDC_ReadAddrBlock()是否支援作Brust的讀寫?
若不支援,我該如何增進我的存取效率?
從軟體方面來說,當使用WinDriver的API WD_Transfer(),是用一個指令移動一區塊的數據,對於移動64bit的數據時,我們使用64bit MMX指令,這是軟體部分 增進速率唯一的辦法,其餘都是部分都是硬體決定。欲增進速率的部分,建議您使用DMA,請參閱以下手冊。
http://www.jungo.com/st/support/documentation/windriver/11.0.0/wdpci_manual.mhtml/Advanced_Issues.html#advanced_issues_dma
Q:當我在使用 WinDriver的DMA來處理中斷訊號時會發現速率不夠高 ,因為每次在接收到中斷訊號時,WinDriver都會重啟DMA的功能,請問應該如何解決?
http://www.jungo.com/st/support/documentation/windriver/11.0.0/wdpci_manual.mhtml/WinDriver_Kernel_PlugIn.html
因為使用Kernel Plugin來處理您的中斷訊號時,整個中斷處理會在核心模式下處理完成,節省了轉移至用戶模式所需要的時間,請參考範例程式
<WD>\samples\pci_diag\kp_pci 。
Q : 請問利用WinDriver驅動程式開發工具是否會改變驅動程式的效能?
Q:WinDriver針對DMA Scatter Gather List的數量為何? 以及同時間裡命令搜尋的寬度為何?
因為Windows已經具備了相關的標準驅動程式。
Q:目前我需要 開發PCI介面 的驅動程式,並且能支援非常高速的中斷回應,請問WinDriver是否可以滿足此需求呢?
http://www.jungo.com/st/support/documentation/windriver/10.3.0/wdpci_manual.mhtml/WinDriver_Kernel_PlugIn.html