Nios 的用戶定義接口邏輯實(shí)例 有許多人問我使用 Nios 的用戶定義接口邏輯怎么用,想了幾天決定設(shè)計(jì)一個(gè)實(shí)例來說明。該例為一個(gè)使用 user to interface logic 設(shè)計(jì)的 PWM 實(shí)例,其中包括三個(gè)文件: plus32.v 是一個(gè)為 32bit nios 設(shè)計(jì)的 pwm 實(shí)例。 plus16.v 是一個(gè)為 16bit nios 設(shè)計(jì)的 pwm 實(shí)例。 test.s 是一個(gè)使用中斷調(diào)用 pwm 的匯編語言測(cè)試程序。以上模塊和程序均調(diào)試通過,并可穩(wěn)定工作。這里讓大家參考是使大家通過該例來真正理解 user to interface logic 設(shè)計(jì)方法,和nios 中通過匯編調(diào)用中斷的方法,所以超值喔。另外熱烈歡迎大家的指導(dǎo)。 注:在設(shè)計(jì) Nios 時(shí),將你調(diào)用的 user to interface logic 插件重命名為 plus_0,這樣我的 test.s 可不作任何改動(dòng),你就可用示波器通過 nios 的 plus 管腳觀察到一個(gè)要求的輸出。
上傳時(shí)間: 2013-11-15
上傳用戶:cc1915
MCS51系列單片機(jī)在工程數(shù)據(jù)采集中的應(yīng)用:隨著現(xiàn)代科學(xué)技術(shù)的發(fā)展,單片機(jī)已深入應(yīng)用到社會(huì)發(fā)展的各個(gè)領(lǐng)域,如家電制造業(yè)、工程數(shù)據(jù)采集、智能儀表等。因而各芯片制造廠商紛紛推出不同系列的單片機(jī),以滿足不同行業(yè)的實(shí)際需要。結(jié)合本人的實(shí)際工作,現(xiàn)介紹一種集智能儀表與數(shù)據(jù)采集相結(jié)合的終端設(shè)備,可廣泛應(yīng)用于自來水、煤氣管網(wǎng)等等的數(shù)據(jù)采集與遠(yuǎn)傳,實(shí)現(xiàn)自來水、煤氣等公司的集中監(jiān)控與調(diào)度。本設(shè)備的特點(diǎn)是結(jié)構(gòu)簡單、成本低、維護(hù)方便等特點(diǎn)。因而可以代替價(jià)格較高的PLC 在這方面的應(yīng)用。
標(biāo)簽: MCS 51 單片機(jī) 中的應(yīng)用
上傳時(shí)間: 2013-10-09
上傳用戶:lalalal
MSP430F413實(shí)現(xiàn)的智能遙控器設(shè)計(jì):MSP430F413 單片機(jī)是TI 公司最近推出的超低功耗混合信號(hào)16 位單片機(jī)系列中的一種。它采用16 位精簡指令系統(tǒng),125ns 指令周期,大部分的指令在一個(gè)指令周期內(nèi)完成,16 位寄存器和常數(shù)發(fā)生器,發(fā)揮了最高的代碼效率,而且片內(nèi)含有硬件乘法器,大大節(jié)省運(yùn)算的時(shí)間。該芯片采用低功耗設(shè)計(jì),具有五種低功耗模式,供電電壓范圍為1.8~3.6V,在工作模式下:2.2 伏工作電壓1MHz 工作頻率時(shí)電流為225uA;在待機(jī)模式電流為0.7uA;掉電模式(RAM 數(shù)據(jù)保持不變)電流為0.1uA。所以特別適用長期使用電池工作的場合。它采用數(shù)字控制振蕩器(DCO),使得從低功耗模式到喚醒模式的轉(zhuǎn)換時(shí)間小于6us。該芯片具有8KB+256B Flash Memory,256B RAM,采用串行在線編程方式,為用戶編譯程序和控制參數(shù)提供靈活的空間,內(nèi)部的安全保密熔絲可使程序不必非法復(fù)制。此外,MSP430F413 具有強(qiáng)大的中斷功能,48 個(gè)通用I/O 引腳,96 段LCD 驅(qū)動(dòng)器,一個(gè)16 位定時(shí)器,這樣提高了對(duì)外圍設(shè)備的開發(fā)能力。
上傳時(shí)間: 2013-11-08
上傳用戶:bruce5996
單片機(jī)鍵盤掃描之狀態(tài)機(jī)實(shí)現(xiàn):在編寫單片機(jī)程序的過程中,鍵盤作為一種人機(jī)接口的實(shí)現(xiàn)方式,是很常用的。而一般的實(shí)現(xiàn)方法大概有:1、外接鍵盤掃描芯片(例如8279,7279 等等),然后由該芯片來完成去抖、鍵值讀取、中斷請(qǐng)求等功能。然后單片機(jī)響應(yīng)中斷并讀取鍵值,有的時(shí)候也可以采用輪訓(xùn)的方式。2、如果按鍵數(shù)比較少,那么可以直接將按鍵接到單片機(jī)的IO 口,然后各按鍵取邏輯或再送到單片機(jī)的中斷管腳(對(duì)于51 體系),單片機(jī)響應(yīng)中斷后再去讀取IO 口的數(shù)據(jù)。如果單片機(jī)的中斷向量比較多(例如AVR 系列的單片機(jī),每個(gè)IO都可以作為中斷),那么也可以直接把各個(gè)按鍵接到各個(gè)具有中斷功能的IO 上面。在中斷處理程序中往往需要執(zhí)行這樣一個(gè)操作序列:延時(shí)一定時(shí)間來去抖,如果按鍵有效那么等待按鍵釋放。
標(biāo)簽: 單片機(jī) 鍵盤掃描 狀態(tài)
上傳時(shí)間: 2014-12-28
上傳用戶:zhang97080564
水位監(jiān)測(cè)報(bào)警系統(tǒng)分為兩部分:TLC4066IN電路和數(shù)碼管顯示電路。TLC4066電路通過水位升降來控制開關(guān),以輸入高電平信號(hào)來觸發(fā)4066芯片來控制二極管的亮與滅,以及控制聲音報(bào)警信號(hào)。數(shù)碼管顯示電路由異或門、或門和4511芯片組成。由從水位升降控制輸送信號(hào)到4066集成電路,再輸送到異或門和或門電路,再由其電路通過邏輯函數(shù)運(yùn)轉(zhuǎn),把不同的信號(hào)送到4511譯碼器,由譯碼器驅(qū)動(dòng)數(shù)碼管工作,使數(shù)碼管顯示出不同的水位值。關(guān)鍵字:數(shù)碼管顯示電路、4066電路
標(biāo)簽: 水位監(jiān)測(cè) 報(bào)警系統(tǒng)
上傳時(shí)間: 2013-11-14
上傳用戶:lo25643
含原理圖+電路圖+程序的波形發(fā)生器:在工作中,我們常常會(huì)用到波形發(fā)生器,它是使用頻度很高的電子儀器。現(xiàn)在的波形發(fā)生器都采用單片機(jī)來構(gòu)成。單片機(jī)波形發(fā)生器是以單片機(jī)核心,配相應(yīng)的外圍電路和功能軟件,能實(shí)現(xiàn)各種波形發(fā)生的應(yīng)用系統(tǒng),它由硬件部分和軟件部分組成,硬件是系統(tǒng)的基礎(chǔ),軟件則是在硬件的基礎(chǔ)上,對(duì)其合理的調(diào)配和使用,從而完成波形發(fā)生的任務(wù)。 波形發(fā)生器的技術(shù)指標(biāo):(1) 波形類型:方型、正弦波、三角波、鋸齒波;(2) 幅值電壓:1V、2V、3V、4V、5V;(3) 頻率值:10HZ、20HZ、50HZ、100HZ、200HZ、500HZ、1KHZ;(4) 輸出極性:雙極性操作設(shè)計(jì)1、 機(jī)器通電后,系統(tǒng)進(jìn)行初始化,LED在面板上顯示6個(gè)0,表示系統(tǒng)處于初始狀態(tài),等待用戶輸入設(shè)置命令,此時(shí),無任何波形信號(hào)輸出。2、 用戶按下“F”、“V”、“W”,可以分別進(jìn)入頻率,幅值波形設(shè)置,使系統(tǒng)進(jìn)入設(shè)置狀態(tài),相應(yīng)的數(shù)碼管顯示“一”,此時(shí),按其它鍵,無效;3、 在進(jìn)入某一設(shè)置狀態(tài)后,輸入0~9等數(shù)字鍵,(數(shù)字鍵僅在設(shè)置狀態(tài)時(shí),有效)為欲輸出的波形設(shè)置相應(yīng)參數(shù),LED將參數(shù)顯示在面板上;4、 如果在設(shè)置中,要改變已設(shè)定的參數(shù),可按下“CL”鍵,清除所有已設(shè)定參數(shù),系統(tǒng)恢復(fù)初始狀態(tài),LED顯示6個(gè)0,等待重新輸入命令;5、 當(dāng)必要的參數(shù)設(shè)定完畢后,所有參數(shù)顯示于LED上,用戶按下“EN”鍵,系統(tǒng)會(huì)將各波形參數(shù)傳遞到波形產(chǎn)生模塊中,以便控制波形發(fā)生,實(shí)現(xiàn)不同頻率,不同電壓幅值,不同類型波形的輸出;6、 用戶按下“EN”鍵后,波形發(fā)生器開始輸出滿足參數(shù)的波形信號(hào),面板上相應(yīng)類型的運(yùn)行指示燈閃爍,表示波形正在輸出,LED顯示波形類型編號(hào),頻率值、電壓幅值等波形參數(shù);7、 波形發(fā)生器在輸出信號(hào)時(shí),按下任意一個(gè)鍵,就停止波形信號(hào)輸出,等待重新設(shè)置參數(shù),設(shè)置過程如上所述,如果不改變參數(shù),可按下“EN”鍵,繼續(xù)輸出原波形信號(hào);8、 要停止波形發(fā)生器的使用,可按下復(fù)位按鈕,將系統(tǒng)復(fù)位,然后關(guān)閉電源。硬件組成部分通過綜合比較,決定選用獲得廣泛應(yīng)用,性能價(jià)格高的常用芯片來構(gòu)成硬件電路。單片機(jī)采用MCS-51系列的89C51(一塊),74LS244和74LS373(各一塊),反相驅(qū)動(dòng)器 ULN2803A(一塊),運(yùn)算放大器 LM324(一塊) 波形發(fā)生器的硬件電路由單片機(jī)、鍵盤顯示器接口電路、波形轉(zhuǎn)換(D/ A)電路和電源線路等四部分構(gòu)成。1.單片機(jī)電路功能:形成掃描碼,鍵值識(shí)別,鍵功能處理,完成參數(shù)設(shè)置;形成顯示段碼,向LED顯示接口電路輸出;產(chǎn)生定時(shí)中斷;形成波形的數(shù)字編碼,并輸出到D/A接口電路;如電路原理圖所示: 89C51的P0口和P2口作為擴(kuò)展I/O口,與8255、0832、74LS373相連接,可尋址片外的寄存器。單片機(jī)尋址外設(shè),采用存儲(chǔ)器映像方式,外部接口芯片與內(nèi)部存儲(chǔ)器統(tǒng)一編址,89C51提供16根地址線P0(分時(shí)復(fù)用)和P2,P2口提供高8位地址線,P0口提供低8位地址線。P0口同時(shí)還要負(fù)責(zé)與8255,0832的數(shù)據(jù)傳遞。P2.7是8255的片選信號(hào),P2.6是0832(1)的片選,P2.5是0832(2)的片選,低電平有效,P0.0、P0.1經(jīng)過74LS373鎖存后,送到8255的A1、A2作,片內(nèi)A口,B口,C口,控制口等寄存器的字選。89C51的P1口的低4位連接4只發(fā)光三極管,作為波形類型指示燈,表示正在輸出的波形是什么類型。單片機(jī)89C51內(nèi)部有兩個(gè)定時(shí)器/計(jì)數(shù)器,在波形發(fā)生器中使用T0作為中斷源。不同的頻率值對(duì)應(yīng)不同的定時(shí)初值,定時(shí)器的溢出信號(hào)作為中斷請(qǐng)求。控制定時(shí)器中斷的特殊功能寄存器設(shè)置如下:定時(shí)控制寄存器TCON=(00010000)工作方式選擇寄存器(TMOD)=(00000000)中斷允許控制寄存器(IE)=(10000010)2、鍵盤顯示器接口電路功能:驅(qū)動(dòng)6位數(shù)碼管動(dòng)態(tài)顯示; 提供響應(yīng)界面; 掃面鍵盤; 提供輸入按鍵。由并口芯片8255,鎖存器74LS273,74LS244,反向驅(qū)動(dòng)器ULN2803A,6位共陰極數(shù)碼管(LED)和4×4行列式鍵盤組成。8255的C口作為鍵盤的I/O接口,C口的低4位輸出到掃描碼,高4位作為輸入行狀態(tài),按鍵的分布如圖所示。8255的A口作為LED段碼輸出口,與74LS244相連接,B口作為LED的位選信號(hào)輸出口,與ULN2803A相連接。8255內(nèi)部的4個(gè)寄存器地址分配如下:控制口:7FFFH , A口:7FFFCH , B口:7FFDH , C口:7FFEH 3、D/A電路功能:將波形樣值的數(shù)字編碼轉(zhuǎn)換成模擬值;完成單極性向雙極性的波形輸出;構(gòu)成由兩片0832和一塊LM324運(yùn)放組成。0832(1)是參考電壓提供者,單片機(jī)向0832(1)內(nèi)的鎖存器送數(shù)字編碼,不同的編碼會(huì)產(chǎn)生不同的輸出值,在本發(fā)生器中,可輸出1V、2V、3V、4V、5V等五個(gè)模擬值,這些值作為0832(2)的參考電壓,使0832(2)輸出波形信號(hào)時(shí),其幅度是可調(diào)的。0832(2)用于產(chǎn)生各種波形信號(hào),單片機(jī)在波形產(chǎn)生程序的控制下,生成波形樣值編碼,并送到0832(2)中的鎖存器,經(jīng)過D/A轉(zhuǎn)換,得到波形的模擬樣值點(diǎn),假如N個(gè)點(diǎn)就構(gòu)成波形的一個(gè)周期,那么0832(2)輸出N個(gè)樣值點(diǎn)后,樣值點(diǎn)形成運(yùn)動(dòng)軌跡,就是波形信號(hào)的一個(gè)周期。重復(fù)輸出N個(gè)點(diǎn)后,由此成第二個(gè)周期,第三個(gè)周期……。這樣0832(2)就能連續(xù)的輸出周期變化的波形信號(hào)。運(yùn)放A1是直流放大器,運(yùn)放A2是單極性電壓放大器,運(yùn)放A3是雙極性驅(qū)動(dòng)放大器,使波形信號(hào)能帶得起負(fù)載。地址分配:0832(1):DFFFH ,0832(2):BFFFH4、電源電路:功能:為波形發(fā)生器提供直流能量;構(gòu)成由變壓器、整流硅堆,穩(wěn)壓塊7805組成。220V的交流電,經(jīng)過開關(guān),保險(xiǎn)管(1.5A/250V),到變壓器降壓,由220V降為10V,通過硅堆將交流電變成直流電,對(duì)于諧波,用4700μF的電解電容給予濾除。為保證直流電壓穩(wěn)定,使用7805進(jìn)行穩(wěn)壓。最后,+5V電源配送到各用電負(fù)載。
標(biāo)簽: 波形發(fā)生器 原理圖 電路圖 源程序
上傳時(shí)間: 2013-11-08
上傳用戶:685
匯編指令查詢器:數(shù)據(jù)傳送指令 MOV 格式: MOV OPRD1,OPRD2 功能: 本指令將一個(gè)源操作數(shù)送到目的操作數(shù)中,即OPRD1<--OPRD2. 說明: 1. OPRD1 為目的操作數(shù),可以是寄存器、存儲(chǔ)器、累加器. OPRD2 為源操作數(shù),可以是寄存器、存儲(chǔ)器、累加器和立即數(shù). 2. MOV 指令以分為以下四種情況: <1> 寄存器與寄存器之間的數(shù)據(jù)傳送指令 <2> 立即數(shù)到通用寄存器數(shù)據(jù)傳送指令 <3> 寄存器與存儲(chǔ)器之間的數(shù)據(jù)傳送指令 <4> 立即數(shù)到存儲(chǔ)器的數(shù)據(jù)傳送 3. 本指令不影響狀態(tài)標(biāo)志位
上傳時(shí)間: 2013-11-13
上傳用戶:腳趾頭
一種實(shí)用的微機(jī)自動(dòng)配料秤系統(tǒng):介紹一種由單片機(jī)構(gòu)成的配料秤。敘述了秤的傳感器、變送器、信號(hào)的變換、硬件原理、軟件流程以及和DCS 系統(tǒng)構(gòu)成的單回路調(diào)節(jié)系統(tǒng),此系統(tǒng)可廣泛地應(yīng)用于各行業(yè)的配料控制中。關(guān)鍵詞:配料秤 單片機(jī) 單回路調(diào)節(jié)系統(tǒng) DCS 系統(tǒng) Abstract :A proportioning weigher based on single chip computer is introduced. Sensors , transmitters , signal converting , principle of hardware ,software flowchart of proportioning weigher and single loop control system composed with DCS system are emphasized ,this system can be used in proportioning control of various trades extensively.Key Words :Proportioning Weigher ,Single Chip Computer ,Single Loop Control System ,Distributed Control System
上傳時(shí)間: 2013-10-12
上傳用戶:zwei41
5.1 中斷基本概念5.1.1 中斷基本概念定義:CPU暫停現(xiàn)行程序,轉(zhuǎn)而處理隨機(jī)到來的事件,待處理完后再回到被暫停的程序繼續(xù)執(zhí)行,這個(gè)過程就是中斷。中斷過程:中斷處理的隱操作:程序狀態(tài)及程序斷點(diǎn)地址的進(jìn)棧及出棧。 中斷系統(tǒng)其他功能: 支持多中斷源和多種中斷源。 支持中斷屏蔽處理。 支持中斷嵌套處理。 支持中斷優(yōu)先級(jí)修改。 支持中斷結(jié)束方式選擇。5.1.2 中斷類型1.外部硬件(如鍵盤、鼠標(biāo),串口,并口打印機(jī)等)中斷屬性:硬件、可屏蔽、向量。 中斷請(qǐng)求:多個(gè)中斷請(qǐng)求的排隊(duì)和判優(yōu)由中斷控制器完成,產(chǎn)生的有無中斷請(qǐng)求的信號(hào)送到CPU的INTR引腳。 中斷類型號(hào):通過數(shù)據(jù)總線送到CPU中。EFLAGS寄存器的IF位影響CPU對(duì)中斷請(qǐng)求的響應(yīng)。處理器在當(dāng)前指令執(zhí)行結(jié)束的時(shí)候啟動(dòng)中斷識(shí)別INTA總線周期。
標(biāo)簽: 中斷技術(shù)
上傳時(shí)間: 2013-11-09
上傳用戶:黃婷婷思密達(dá)
有兩種方式可以讓設(shè)備和應(yīng)用程序之間聯(lián)系:1. 通過為設(shè)備創(chuàng)建的一個(gè)符號(hào)鏈;2. 通過輸出到一個(gè)接口WDM驅(qū)動(dòng)程序建議使用輸出到一個(gè)接口而不推薦使用創(chuàng)建符號(hào)鏈的方法。這個(gè)接口保證PDO的安全,也保證安全地創(chuàng)建一個(gè)惟一的、獨(dú)立于語言的訪問設(shè)備的方法。一個(gè)應(yīng)用程序使用Win32APIs來調(diào)用設(shè)備。在某個(gè)Win32 APIs和設(shè)備對(duì)象的分發(fā)函數(shù)之間存在一個(gè)映射關(guān)系。獲得對(duì)設(shè)備對(duì)象訪問的第一步就是打開一個(gè)設(shè)備對(duì)象的句柄。 用符號(hào)鏈打開一個(gè)設(shè)備的句柄為了打開一個(gè)設(shè)備,應(yīng)用程序需要使用CreateFile。如果該設(shè)備有一個(gè)符號(hào)鏈出口,應(yīng)用程序可以用下面這個(gè)例子的形式打開句柄:hDevice = CreateFile("\\\\.\\OMNIPORT3", GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL ,NULL);文件路徑名的前綴“\\.\”告訴系統(tǒng)本調(diào)用希望打開一個(gè)設(shè)備。這個(gè)設(shè)備必須有一個(gè)符號(hào)鏈,以便應(yīng)用程序能夠打開它。有關(guān)細(xì)節(jié)查看有關(guān)Kdevice和CreateLink的內(nèi)容。在上述調(diào)用中第一個(gè)參數(shù)中前綴后的部分就是這個(gè)符號(hào)鏈的名字。注意:CreatFile中的第一個(gè)參數(shù)不是Windows 98/2000中驅(qū)動(dòng)程序(.sys文件)的路徑。是到設(shè)備對(duì)象的符號(hào)鏈。如果使用DriverWizard產(chǎn)生驅(qū)動(dòng)程序,它通常使用類KunitizedName來構(gòu)成設(shè)備的符號(hào)鏈。這意味著符號(hào)鏈名有一個(gè)附加的數(shù)字,通常是0。例如:如果鏈接名稱的主干是L“TestDevice”那么在CreateFile中的串就該是“\\\\.\\TestDevice0”。如果應(yīng)用程序需要被覆蓋的I/O,第六個(gè)參數(shù)(Flags)必須或上FILE_FLAG_OVERLAPPED。 使用一個(gè)輸出接口打開句柄用這種方式打開一個(gè)句柄會(huì)稍微麻煩一些。DriverWorks庫提供兩個(gè)助手類來使獲得對(duì)該接口的訪問容易一些,這兩個(gè)類是CDeviceInterface, 和 CdeviceInterfaceClass。CdeviceInterfaceClass類封裝了一個(gè)設(shè)備信息集,該信息集包含了特殊類中的所有設(shè)備接口信息。應(yīng)用程序能有用CdeviceInterfaceClass類的一個(gè)實(shí)例來獲得一個(gè)或更多的CdeviceInterface類的實(shí)例。CdeviceInterface類是一個(gè)單一設(shè)備接口的抽象。它的成員函數(shù)DevicePath()返回一個(gè)路徑名的指針,該指針可以在CreateFile中使用來打開設(shè)備。下面用一個(gè)小例子來顯示這些類最基本的使用方法:extern GUID TestGuid;HANDLE OpenByInterface( GUID* pClassGuid, DWORD instance, PDWORD pError){ CDeviceInterfaceClass DevClass(pClassGuid, pError); if (*pError != ERROR_SUCCESS) return INVALID_HANDLE_VALUE; CDeviceInterface DevInterface(&DevClass, instance, pError); if (*pError != ERROR_SUCCESS) return INVALID_HANDLE_VALUE; cout << "The device path is " << DevInterface.DevicePath() << endl; HANDLE hDev; hDev = CreateFile( DevInterface.DevicePath(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (hDev == INVALID_HANDLE_VALUE) *pError = GetLastError(); return hDev;} 在設(shè)備中執(zhí)行I/O操作一旦應(yīng)用程序獲得一個(gè)有效的設(shè)備句柄,它就能使用Win32 APIs來產(chǎn)生到設(shè)備對(duì)象的IRPs。下面的表顯示了這種對(duì)應(yīng)關(guān)系。Win32 API DRIVER_FUNCTION_xxxIRP_MJ_xxx KDevice subclass member function CreateFile CREATE Create ReadFile READ Read WriteFile WRITE Write DeviceIoControl DEVICE_CONTROL DeviceControl CloseHandle CLOSECLEANUP CloseCleanUp 需要解釋一下設(shè)備類成員的Close和CleanUp:CreateFile使內(nèi)核為設(shè)備創(chuàng)建一個(gè)新的文件對(duì)象。這使得多個(gè)句柄可以映射同一個(gè)文件對(duì)象。當(dāng)這個(gè)文件對(duì)象的最后一個(gè)用戶級(jí)句柄被撤銷后,I/O管理器調(diào)用CleanUp。當(dāng)沒有任何用戶級(jí)和核心級(jí)的對(duì)文件對(duì)象的訪問的時(shí)候,I/O管理器調(diào)用Close。如果被打開的設(shè)備不支持指定的功能,則調(diào)用相應(yīng)的Win32將引起錯(cuò)誤(無效功能)。以前為Windows95編寫的VxD的應(yīng)用程序代碼中可能會(huì)在打開設(shè)備的時(shí)候使用FILE_FLAG_DELETE_ON_CLOSE屬性。在Windows NT/2000中,建議不要使用這個(gè)屬性,因?yàn)樗鼘?dǎo)致沒有特權(quán)的用戶企圖打開這個(gè)設(shè)備,這是不可能成功的。I/O管理器將ReadFile和WriteFile的buff參數(shù)轉(zhuǎn)換成IRP域的方法依賴于設(shè)備對(duì)象的屬性。當(dāng)設(shè)備設(shè)置DO_DIRECT_IO標(biāo)志,I/O管理器將buff鎖住在存儲(chǔ)器中,并且創(chuàng)建了一個(gè)存儲(chǔ)在IRP中的MDL域。一個(gè)設(shè)備可以通過調(diào)用Kirp::Mdl來存取MDL。當(dāng)設(shè)備設(shè)置DO_BUFFERED_IO標(biāo)志,設(shè)備對(duì)象分別通過KIrp::BufferedReadDest或 KIrp::BufferedWriteSource為讀或?qū)懖僮鳙@得buff地址。當(dāng)設(shè)備不設(shè)置DO_BUFFERED_IO標(biāo)志也不設(shè)置DO_DIRECT_IO,內(nèi)核設(shè)置IRP 的UserBuffer域來對(duì)應(yīng)ReadFile或WriteFile中的buff參數(shù)。然而,存儲(chǔ)區(qū)并沒有被鎖住而且地址只對(duì)調(diào)用進(jìn)程有效。驅(qū)動(dòng)程序可以使用KIrp::UserBuffer來存取IRP域。對(duì)于DeviceIoControl調(diào)用,buffer參數(shù)的轉(zhuǎn)換依賴于特殊的I/O控制代碼,它不在設(shè)備對(duì)象的特性中。宏CTL_CODE(在winioctl.h中定義)用來構(gòu)造控制代碼。這個(gè)宏的其中一個(gè)參數(shù)指明緩沖方法是METHOD_BUFFERED, METHOD_IN_DIRECT, METHOD_OUT_DIRECT, 或METHOD_NEITHER。下面的表顯示了這些方法和與之對(duì)應(yīng)的能獲得輸入緩沖與輸出緩沖的KIrp中的成員函數(shù):Method Input Buffer Parameter Output Buffer Parameter METHOD_BUFFERED KIrp::IoctlBuffer KIrp::IoctlBuffer METHOD_IN_DIRECT KIrp::IoctlBuffer KIrp::Mdl METHOD_OUT_DIRECT KIrp::IoctlBuffer KIrp::Mdl METHOD_NEITHER KIrp::IoctlType3InputBuffer KIrp::UserBuffer 如果控制代碼指明METHOD_BUFFERED,系統(tǒng)分配一個(gè)單一的緩沖來作為輸入與輸出。驅(qū)動(dòng)程序必須在向輸出緩沖放數(shù)據(jù)之前拷貝輸入數(shù)據(jù)。驅(qū)動(dòng)程序通過調(diào)用KIrp::IoctlBuffer獲得緩沖地址。在完成時(shí),I/O管理器從系統(tǒng)緩沖拷貝數(shù)據(jù)到提供給Ring 3級(jí)調(diào)用者使用的緩沖中。驅(qū)動(dòng)程序必須在結(jié)束前存儲(chǔ)拷貝到IRP的Information成員中的數(shù)據(jù)個(gè)數(shù)。如果控制代碼不指明METHOD_IN_DIRECT或METHOD_OUT_DIRECT,則DeviceIoControl的參數(shù)呈現(xiàn)不同的含義。參數(shù)InputBuffer被拷貝到一個(gè)系統(tǒng)緩沖,這個(gè)緩沖驅(qū)動(dòng)程序可以通過調(diào)用KIrp::IoctlBuffer。參數(shù)OutputBuffer被映射到KMemory對(duì)象,驅(qū)動(dòng)程序?qū)@個(gè)對(duì)象的訪問通過調(diào)用KIrp::Mdl來實(shí)現(xiàn)。對(duì)于METHOD_OUT_DIRECT,調(diào)用者必須有對(duì)緩沖的寫訪問權(quán)限。注意,對(duì)METHOD_NEITHER,內(nèi)核只提供虛擬地址;它不會(huì)做映射來配置緩沖。虛擬地址只對(duì)調(diào)用進(jìn)程有效。這里是一個(gè)用METHOD_BUFFERED的例子:首先,使用宏CTL_CODE來定義一個(gè)IOCTL代碼:#define IOCTL_MYDEV_GET_FIRMWARE_REV \CTL_CODE (FILE_DEVICE_UNKNOWN,0,METHOD_BUFFERED,FILE_ANY_ACCESS)現(xiàn)在使用一個(gè)DeviceIoControl調(diào)用:BOOLEAN b;CHAR FirmwareRev[60];ULONG FirmwareRevSize;b = DeviceIoControl(hDevice, IOCTL_MYDEV_GET_VERSION_STRING, NULL, // no input 注意,這里放的是包含有執(zhí)行操作命令的字符串指針 0, FirmwareRev, //這里是output串指針,存放從驅(qū)動(dòng)程序中返回的字符串。sizeof(FirmwareRev),& FirmwareRevSize, NULL // not overlapped I/O );如果輸出緩沖足夠大,設(shè)備拷貝串到里面并將拷貝的資結(jié)束設(shè)置到FirmwareRevSize中。在驅(qū)動(dòng)程序中,代碼看起來如下所示:const char* FIRMWARE_REV = "FW 16.33 v5";NTSTATUS MyDevice::DeviceControl( KIrp I ){ ULONG fwLength=0; switch ( I.IoctlCode() ) { case IOCTL_MYDEV_GET_FIRMWARE_REV: fwLength = strlen(FIRMWARE_REV)+1; if (I.IoctlOutputBufferSize() >= fwLength) { strcpy((PCHAR)I.IoctlBuffer(),FIRMWARE_REV); I.Information() = fwLength; return I.Complete(STATUS_SUCCESS); } else { } case . . . } }
標(biāo)簽: 驅(qū)動(dòng)程序 應(yīng)用程序 接口
上傳時(shí)間: 2013-10-17
上傳用戶:gai928943
蟲蟲下載站版權(quán)所有 京ICP備2021023401號(hào)-1