#include<stdio.h> #include<windows.h> int xuanxiang; int studentcount; int banjihao[100]; int xueqihao[100][10]; char xm[100][100]; int xuehao[100][10]; int score[100][3]; int yuwen; int shuxue[000]; int yingyu[100]; int c[100]; int p; char x[1000][100]="",y[100][100]="";/*x學(xué)院 y專(zhuān)業(yè) z班級(jí)*/ int z[100]; main() { void input(); void inputsc(); void alter(); void scbybannji(); printf("--------學(xué)生成績(jī)管理-----\n"); printf("請(qǐng)按相應(yīng)數(shù)字鍵來(lái)實(shí)現(xiàn)相應(yīng)功能\n"); printf("1.錄入學(xué)生信息 2.錄入學(xué)生成績(jī) 3.修改學(xué)生成績(jī)\n"); printf("4.查詢(xún)學(xué)生成績(jī) 5.不及格科目及名單 6.按班級(jí)輸出學(xué)生成績(jī)單\n"); printf("請(qǐng)輸入你要實(shí)現(xiàn)的功能所對(duì)應(yīng)的數(shù)字:"); scanf("%d",&xuanxiang); system("cls"); getchar(); switch (xuanxiang) { case 1:input(); case 2:inputsc(); case 3:alter(); /*case 4:select score(); case 5:bujigekemujimingdan();*/ case 6:scbybanji; } } void input() { int i; printf("請(qǐng)輸入你的學(xué)院名稱(chēng):"); gets(x); printf("請(qǐng)輸入你的專(zhuān)業(yè)名稱(chēng):"); gets(y); printf("請(qǐng)輸入你的班級(jí)號(hào):"); scanf("%d",&z); printf("請(qǐng)輸入你們一個(gè)班有幾個(gè)人:"); scanf("%d",&p); system("cls"); for(i=0;i<p;i++) { printf("請(qǐng)輸入第%d個(gè)學(xué)生的學(xué)號(hào):",i+1); scanf("%d",xuehao[i]); getchar(); printf("請(qǐng)輸入第%d個(gè)學(xué)生的姓名:",i+1); gets(xm[i]); system("cls"); } printf("您已經(jīng)錄入完畢您的班級(jí)所有學(xué)生的信息!\n"); printf("您的班級(jí)為%s%s%s\n",x,y,z); /*alter(p);*/ } void inputsc() { int i; for(i=0;i<p;i++) { printf("\n"); printf("--------------------------------------------------------------------------------\n\n"); printf("\t\t\t\t錄入學(xué)生的成績(jī)\n\n\n"); printf("--------------------------------------------------------------------------------\n\n"); printf("\t\t\t\t%s\n",xm[i]); printf("\n"); printf("\t\t\t\t數(shù)學(xué):"); scanf("%d",&shuxue[i]); printf("\n"); getchar(); printf("\t\t\t\t英語(yǔ):"); scanf("%d",&yingyu[i]); printf("\n"); getchar(); printf("\t\t\t\tc語(yǔ)言:"); scanf("%d",&c[i]); system("cls"); } } void alter() { int i;/*循環(huán)變量*/ int m[10000];/*要查詢(xún)的學(xué)號(hào)*/ int b;/*修改后的成績(jī)*/ char kemu[20]=""; printf("請(qǐng)輸入你要修改的學(xué)生的學(xué)號(hào)"); scanf("%d",&m); for (i=0;i<p;i++) { if (m==xuehao[i]) { printf("%s的數(shù)學(xué)成績(jī)?yōu)?d,英語(yǔ)成績(jī)?yōu)?d,c語(yǔ)言成績(jī)?yōu)?d,xm[i],shuxue[i],yingyu[i],c[i]"); printf("請(qǐng)輸入你想修改的科目");} } gets(kemu); getchar(); if (kemu=="數(shù)學(xué)"); { scanf("%d",&b); shuxue[i]=b;} if (kemu=="英語(yǔ)"); { scanf("%d",&b); yingyu[i]=b;} if (kemu=="c語(yǔ)言"); { scanf("%d",&b); c[i]=b; } printf("%s的數(shù)學(xué)成績(jī)?yōu)?d,英語(yǔ)成績(jī)?yōu)?d,c語(yǔ)言成績(jī)?yōu)?d,xm[i],shuxue[i],yingyu[i],c[i]"); } void scbybannji() { int i; char zyname[20]; int bjnumber; printf("請(qǐng)輸入你的專(zhuān)業(yè)名稱(chēng)"); scanf("%s",&zyname); printf("請(qǐng)輸入你的班級(jí)號(hào)"); scanf("%d",&bjnumber); for (i=0;i<p;i++) { if (zyname==y[i]); if (bjnumber==z[i]); printf("專(zhuān)業(yè)名稱(chēng)%s班級(jí)號(hào)%d數(shù)學(xué)成績(jī)%d英語(yǔ)成績(jī)%dc語(yǔ)言成績(jī)%d,y[i],z[i],shuxue[i],yingyu[i],c[i]"); } }
標(biāo)簽: c語(yǔ)言
上傳時(shí)間: 2018-06-08
上傳用戶(hù):2369043090
復(fù)活節(jié)計(jì)算 int y, n, a, q, b, m, w, d, mm = 4; y = atoi(argv[1]); n = y-1900; a = fmod(n,19);
上傳時(shí)間: 2021-07-09
上傳用戶(hù):scfan2004
常用芯片DIP SOT SOIC QFP電阻電容二極管等3D模型庫(kù) 3D視圖封裝庫(kù) STEP后綴三維視圖(154個(gè)):050-9.STEP0805R.STEP1001-1.STEP1001-2.STEP1001-3.STEP1001-4.STEP1001-5.STEP1001-6.STEP1001-7.STEP1001-8.STEP103_1KV.STEP10X5JT.STEP1206R.STEP13PX2.STEP15PX2.STEP20P插針.STEP25V1000UF.STEP3296W.STEP35V2200UF.STEP3mmLED.STEP3mmLEDH.STEP3X3可調(diào)電阻.STEP400V0.1UF.STEP455.STEP630V0.1UF.STEP7805.STEP8P4R.STEPAXIAL-0.2-0.125W.STEPAXIAL-0.4-0.25W.STEPaxial-0.6-2W.STEPB-3528.STEPC-0805.STEPC06x18.STEPCAP-6032.STEPCH3.96 X2.STEPCH3.96-3P.STEPD-PAK.STEPDB25.STEPDC-30.STEPDIP14.STEPDIP16.STEPDIP6.STEPDIP8.STEPDO-214AA.STEPDO-214AB.STEPDO-214AC.STEPDO-41.STEPDO-41Z.STEPFMQ.STEPGNR14D.STEPH9700.STEPILI4981.STEPIN4007.STEPIN5408.STEPJP051-6P6C_02.STEPJQC-3F.STEPJS-1132-10.STEPJS-1132-11.STEPJS-1132-12.STEPJS-1132-13.STEPJS-1132-14.STEPJS-1132-15.STEPJS-1132-2.STEPJS-1132-3.STEPJS-1132-4.STEPJS-1132-5.STEPJS-1132-6.STEPJS-1132-7.STEPJS-1132-8.STEPJS-1132-9.STEPJS-1132R-2.STEPJS-1132R-3.STEPJS-1132R-4.STEPJS-1132R-5.STEPJS-1132R-6.STEPJS-1132R-7.STEPJS-1132R-8.STEPJZC-33F.STEPKBP210.STEPKE2108.STEPKF2510 X8.STEPKF301.STEPKF301x3.STEPKSD-9700.STEPLED5_BLUE.STEPLED5_GRE.STEPLED5_RED.STEPLED5_YEL.STEPLFCSP_WQ.STEPLQFP100.STEPLQFP48.STEPMC-146.STEPmolex-22-27-2021.STEPmolex-22-27-2031.STEPmolex-22-27-2041.STEPmolex-22-27-2051.STEPmolex-22-27-2061.STEPmolex-22-27-2071.STEPmolex-22-27-2081.STEPMSOP10.STEPMSOP8.STEPPA0630NOXOX-HA1.STEPPIN10.STEPPIN24.STEPPIN24A.STEPR 0805.STEPR0402.STEPR0603.STEPR0805.STEPR1206.STEPRA-15.STEPRA-20.STEPRS808.STEPSIP-3-3.96 22-27-2031.STEPSL-B.STEPSL-D.STEPSL-E.STEPSL-G.STEPSL-H.STEPSOD-123.STEPSOD-323.STEPSOD-523.STEPSOD-723.STEPSOD-80.STEPSOIC-8.STEPSOP-4.STEPSOP14.STEPSOP16.STEPSOP18.STEPSOT-89.STEPSOT223.STEPSOT23-3.STEPSOT23-5.STEPSSOP28.STEPTAJ-A.STEPTAJ-B.STEPTAJ-C.STEPTAJ-D.STEPTAJ-E.STEPTAJ-R.STEPTHB6064H.STEPTO-126.STEPTO-126X.STEPTO-220.STEPTO-247.STEPTO-252-3L.STEPTOSHIBA_11-4C1.STEPTSSOP-8.STEPTSSOP14-BOTTON.STEPTSSOP14.STEPTSSOP28.STEPUSB-A.STEPUSB-B.STEPWT.STEP
標(biāo)簽: 芯片 dip sot soic qfp 電阻 電容 二極管 封裝
上傳時(shí)間: 2021-11-21
上傳用戶(hù):XuVshu
1、本課題任務(wù)如下:設(shè)計(jì)一個(gè)具有特定功能的電子鐘。該電子鐘上電或按鍵復(fù)位后能自動(dòng)顯示系統(tǒng)提示符"P.",進(jìn)入時(shí)鐘準(zhǔn)備狀態(tài);第一次按電子鐘啟動(dòng)/調(diào)整鍵,電子鐘從0時(shí)0分0秒開(kāi)始運(yùn)行,進(jìn)入時(shí)鐘運(yùn)行狀態(tài);再次按電子鐘啟動(dòng)/調(diào)整鍵,則電子鐘進(jìn)入時(shí)鐘調(diào)整狀態(tài),此時(shí)可利用各調(diào)整鍵調(diào)整時(shí)間,調(diào)整結(jié)束后可按啟動(dòng)/調(diào)整鍵再次進(jìn)入時(shí)鐘運(yùn)行狀態(tài)。2、本課題要求如下:(1)在AT89S51的PO口和P2口外接由六個(gè)LED數(shù)碼管(LED5~LEDO)構(gòu)成的顯示器,用PO口作LED的段碼輸出口(PO.0~P0.7對(duì)應(yīng)于LED的a-dp),P2.5-P2.0作LED的位控輸出線(xiàn)(P2.5~P2.0對(duì)應(yīng)于LED5~LEDO),P1口外接四個(gè)按鍵A、B,C.D(對(duì)應(yīng)于P1.0~P1.3).(2)、利用六個(gè)LED顯示當(dāng)前時(shí)間。(3)、四個(gè)按鍵的功能:A鍵用于電子鐘啟動(dòng)/調(diào)整;B鍵用于調(diào)時(shí),范圍0-23,0為24點(diǎn),每按一次時(shí)加1;C鍵用于調(diào)分,范圍0-59,0為60分,每按一次分加1:D鍵用于調(diào)秒,范圍0-59,0為60秒,每按一次秒加1.(4)、單片機(jī)采用AT89S51,fasc-12MHz(5)、電子鐘供電電源電路的設(shè)計(jì)。
標(biāo)簽: 單片機(jī) LED數(shù)碼管顯示 數(shù)字鐘電子鐘
上傳時(shí)間: 2022-06-19
上傳用戶(hù):aben
FOC的控制核心——坐標(biāo)變換■坐標(biāo)系口一定子坐標(biāo)系(靜止)一A-B-C坐標(biāo)系(三相定子繞組、相差120度)一a-β坐標(biāo)系(直角坐標(biāo)系:a軸與A軸重合、β軸超前a軸90度)口一轉(zhuǎn)子坐標(biāo)系(旋轉(zhuǎn))-d-q坐標(biāo)系(d軸一轉(zhuǎn)子磁極的軸線(xiàn)、q軸超前d軸90度)口一定向坐標(biāo)系(旋轉(zhuǎn))M-T坐標(biāo)系(M軸固定在定向的磁鏈?zhǔn)噶可希琓軸超前M軸90度)轉(zhuǎn)子磁場(chǎng)定向控制一-M-T坐標(biāo)系與d-q坐標(biāo)系重合FOC的控制核心——SVPWM■空間矢量口根據(jù)功率管的開(kāi)關(guān)狀態(tài)(上管導(dǎo)通是“1",關(guān)閉是“0")定義了8個(gè)空間矢量。其中000和111是零矢量。■扇區(qū)口空間矢量構(gòu)成6個(gè)扇區(qū)口確定Vref位于哪個(gè)扇區(qū),才能知道用哪對(duì)相鄰的基本電壓空間矢量去合成Vref。■參考電壓矢量合成口利用基本電壓空間矢量的線(xiàn)性時(shí)間組合得到定子參考電壓Vref。■七段式SVPWM,由3段零矢量和4段相鄰的兩個(gè)非零矢量組成。3段零矢量分別位于PWM的開(kāi)始、中間和結(jié)尾。■非零電壓空間矢量能使電機(jī)磁通空間矢量產(chǎn)生運(yùn)動(dòng),而零電壓空間矢量使磁通空間矢量靜止
標(biāo)簽: foc
上傳時(shí)間: 2022-06-30
上傳用戶(hù):qdxqdxqdxqdx
VIP專(zhuān)區(qū)-嵌入式/單片機(jī)編程源碼精選合集系列(49)資源包含以下內(nèi)容:1. 凌陽(yáng)非接觸式紅外測(cè)溫傳感器的C51源程序。.2. 液晶模塊LCD2X8C驅(qū)動(dòng)程序.3. 含t h r e a d x,u c o s 的b s p.4. 液晶sed1335芯片.5. 8237可編程DMA控制器altera提供.6. xilinx嵌入式開(kāi)發(fā)源碼.7. ZLG的LPC2220讀取SD卡的源代碼.8. 三星44b0 usbpid驅(qū)動(dòng)程序.9. 三星44B0的一款BOOTLOADER.10. i2c_slave mode for pic.11. max7219驅(qū)動(dòng).12. max7219控制程序.13. 語(yǔ)音通用程序.14. adc通用程序.15. 通用語(yǔ)音資料.16. ATMEGA128....液晶顯示程序.17. 基于MSP430的單片機(jī)的TC35/MC35的無(wú)線(xiàn)通訊MODEM.18. Uc-Os ii的多任務(wù)操作系統(tǒng)全部原代碼(強(qiáng)烈推薦).19. nios開(kāi)發(fā)ucos源碼.20. MinOS嵌入式操作系統(tǒng),C/C++源代碼!基于KeilC51編譯器..21. 基于51單片機(jī)的濾波程序.22. IIC讀寫(xiě)程序.23. 無(wú)刷電機(jī)無(wú)位置傳感器dsp程序.24. c51液晶顯示程序,顯示模塊,可通用于基于HD44780內(nèi)控器的液晶顯示器..25. DP-51H下載仿真實(shí)驗(yàn)儀提供80C51與接口實(shí)例.ZLG7290例程*.26. DP-51H下載仿真實(shí)驗(yàn)儀提供80C51與接口實(shí)例.讀EEPROM并顯示例程*.27. 一個(gè)讀取PCI配置空間的TOOL (在DOS下OR WIN 98).28. AT89C52實(shí)時(shí)時(shí)鐘DS1302測(cè)試,帶Proteus文件.29. 用AT89C52演奏音樂(lè).30. 這個(gè)是安防用的控制鍵盤(pán)C源程序,采用KEIL C51開(kāi)發(fā).用于控制前端解碼器!.31. 這是一個(gè)用于視頻切換的控制程序,采用AT89C51芯片,KEIL 51開(kāi)發(fā).32. 自己近期寫(xiě)的一個(gè)串口通信的小程序.33. 這是基于藍(lán)海微芯LJD-SY-XA+單片機(jī)開(kāi)發(fā)系統(tǒng)的遠(yuǎn)程無(wú)線(xiàn)監(jiān)控系統(tǒng)的DA及AD采集和數(shù)碼顯示的部分.34. 基于51內(nèi)核的單片機(jī)的ucos-ii操作系統(tǒng)的移植的源代碼.35. 此代碼是實(shí)現(xiàn)將lwip協(xié)議移植于51單片機(jī)的測(cè)試程序.36. DOS下采用中斷接收數(shù)據(jù)的串口通訊的例子,很難找到的好東西!.37. lpc2292的can總線(xiàn)的簡(jiǎn)單收發(fā)程序 底層驅(qū)動(dòng)程序都有.38. 數(shù)字密碼鎖設(shè)計(jì)的源代碼,喜歡的朋友就下載..39. 一個(gè)使用STGapiBuffer編程的例子.40. 好東西 AVR study.
標(biāo)簽: 機(jī)械制造 工藝 夾具 工業(yè)
上傳時(shí)間: 2013-04-15
上傳用戶(hù):eeworm
簡(jiǎn)易負(fù)離子發(fā)生器負(fù)離子增加,對(duì)人有催眠、止汗、鎮(zhèn)痛、增進(jìn)食欲,使人精神爽快,消除疲勞的作用。圖1是負(fù)離子發(fā)生器電路圖。220V交流市電經(jīng)D1整流后向C3和C2充電,當(dāng)C2充電至氖泡導(dǎo)通并觸發(fā)SCR導(dǎo)通時(shí),C3經(jīng)SCR、B的L1放電,經(jīng)B感應(yīng)升壓后,由D2反向整流得8kV直流高壓使發(fā)生器M的分子電離而產(chǎn)生負(fù)離子。調(diào)整R3的阻值可以改變觸發(fā)頻率和輸出電壓。調(diào)整時(shí)必須注意安全,更換元件需撥下電源插頭
標(biāo)簽: 負(fù)離子發(fā)生器
上傳時(shí)間: 2013-10-29
上傳用戶(hù):731140412
有兩種方式可以讓設(shè)備和應(yīng)用程序之間聯(lián)系:1. 通過(guò)為設(shè)備創(chuàng)建的一個(gè)符號(hào)鏈;2. 通過(guò)輸出到一個(gè)接口WDM驅(qū)動(dòng)程序建議使用輸出到一個(gè)接口而不推薦使用創(chuàng)建符號(hào)鏈的方法。這個(gè)接口保證PDO的安全,也保證安全地創(chuàng)建一個(gè)惟一的、獨(dú)立于語(yǔ)言的訪(fǎng)問(wèn)設(shè)備的方法。一個(gè)應(yīng)用程序使用Win32APIs來(lái)調(diào)用設(shè)備。在某個(gè)Win32 APIs和設(shè)備對(duì)象的分發(fā)函數(shù)之間存在一個(gè)映射關(guān)系。獲得對(duì)設(shè)備對(duì)象訪(fǎng)問(wèn)的第一步就是打開(kāi)一個(gè)設(shè)備對(duì)象的句柄。 用符號(hào)鏈打開(kāi)一個(gè)設(shè)備的句柄為了打開(kāi)一個(gè)設(shè)備,應(yīng)用程序需要使用CreateFile。如果該設(shè)備有一個(gè)符號(hào)鏈出口,應(yīng)用程序可以用下面這個(gè)例子的形式打開(kāi)句柄:hDevice = CreateFile("\\\\.\\OMNIPORT3", GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL ,NULL);文件路徑名的前綴“\\.\”告訴系統(tǒng)本調(diào)用希望打開(kāi)一個(gè)設(shè)備。這個(gè)設(shè)備必須有一個(gè)符號(hào)鏈,以便應(yīng)用程序能夠打開(kāi)它。有關(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)程序,它通常使用類(lèi)KunitizedName來(lái)構(gòu)成設(shè)備的符號(hào)鏈。這意味著符號(hào)鏈名有一個(gè)附加的數(shù)字,通常是0。例如:如果鏈接名稱(chēng)的主干是L“TestDevice”那么在CreateFile中的串就該是“\\\\.\\TestDevice0”。如果應(yīng)用程序需要被覆蓋的I/O,第六個(gè)參數(shù)(Flags)必須或上FILE_FLAG_OVERLAPPED。 使用一個(gè)輸出接口打開(kāi)句柄用這種方式打開(kāi)一個(gè)句柄會(huì)稍微麻煩一些。DriverWorks庫(kù)提供兩個(gè)助手類(lèi)來(lái)使獲得對(duì)該接口的訪(fǎng)問(wèn)容易一些,這兩個(gè)類(lèi)是CDeviceInterface, 和 CdeviceInterfaceClass。CdeviceInterfaceClass類(lèi)封裝了一個(gè)設(shè)備信息集,該信息集包含了特殊類(lèi)中的所有設(shè)備接口信息。應(yīng)用程序能有用CdeviceInterfaceClass類(lèi)的一個(gè)實(shí)例來(lái)獲得一個(gè)或更多的CdeviceInterface類(lèi)的實(shí)例。CdeviceInterface類(lèi)是一個(gè)單一設(shè)備接口的抽象。它的成員函數(shù)DevicePath()返回一個(gè)路徑名的指針,該指針可以在CreateFile中使用來(lái)打開(kāi)設(shè)備。下面用一個(gè)小例子來(lái)顯示這些類(lèi)最基本的使用方法: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來(lái)產(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è)備類(lèi)成員的Close和CleanUp:CreateFile使內(nèi)核為設(shè)備創(chuàng)建一個(gè)新的文件對(duì)象。這使得多個(gè)句柄可以映射同一個(gè)文件對(duì)象。當(dāng)這個(gè)文件對(duì)象的最后一個(gè)用戶(hù)級(jí)句柄被撤銷(xiāo)后,I/O管理器調(diào)用CleanUp。當(dāng)沒(méi)有任何用戶(hù)級(jí)和核心級(jí)的對(duì)文件對(duì)象的訪(fǎng)問(wèn)的時(shí)候,I/O管理器調(diào)用Close。如果被打開(kāi)的設(shè)備不支持指定的功能,則調(diào)用相應(yīng)的Win32將引起錯(cuò)誤(無(wú)效功能)。以前為Windows95編寫(xiě)的VxD的應(yīng)用程序代碼中可能會(huì)在打開(kāi)設(shè)備的時(shí)候使用FILE_FLAG_DELETE_ON_CLOSE屬性。在Windows NT/2000中,建議不要使用這個(gè)屬性,因?yàn)樗鼘?dǎo)致沒(méi)有特權(quán)的用戶(hù)企圖打開(kāi)這個(gè)設(shè)備,這是不可能成功的。I/O管理器將ReadFile和WriteFile的buff參數(shù)轉(zhuǎn)換成IRP域的方法依賴(lài)于設(shè)備對(duì)象的屬性。當(dāng)設(shè)備設(shè)置DO_DIRECT_IO標(biāo)志,I/O管理器將buff鎖住在存儲(chǔ)器中,并且創(chuàng)建了一個(gè)存儲(chǔ)在IRP中的MDL域。一個(gè)設(shè)備可以通過(guò)調(diào)用Kirp::Mdl來(lái)存取MDL。當(dāng)設(shè)備設(shè)置DO_BUFFERED_IO標(biāo)志,設(shè)備對(duì)象分別通過(guò)KIrp::BufferedReadDest或 KIrp::BufferedWriteSource為讀或?qū)懖僮鳙@得buff地址。當(dāng)設(shè)備不設(shè)置DO_BUFFERED_IO標(biāo)志也不設(shè)置DO_DIRECT_IO,內(nèi)核設(shè)置IRP 的UserBuffer域來(lái)對(duì)應(yīng)ReadFile或WriteFile中的buff參數(shù)。然而,存儲(chǔ)區(qū)并沒(méi)有被鎖住而且地址只對(duì)調(diào)用進(jìn)程有效。驅(qū)動(dòng)程序可以使用KIrp::UserBuffer來(lái)存取IRP域。對(duì)于DeviceIoControl調(diào)用,buffer參數(shù)的轉(zhuǎn)換依賴(lài)于特殊的I/O控制代碼,它不在設(shè)備對(duì)象的特性中。宏CTL_CODE(在winioctl.h中定義)用來(lái)構(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è)單一的緩沖來(lái)作為輸入與輸出。驅(qū)動(dòng)程序必須在向輸出緩沖放數(shù)據(jù)之前拷貝輸入數(shù)據(jù)。驅(qū)動(dòng)程序通過(guò)調(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)程序可以通過(guò)調(diào)用KIrp::IoctlBuffer。參數(shù)OutputBuffer被映射到KMemory對(duì)象,驅(qū)動(dòng)程序?qū)@個(gè)對(duì)象的訪(fǎng)問(wèn)通過(guò)調(diào)用KIrp::Mdl來(lái)實(shí)現(xiàn)。對(duì)于METHOD_OUT_DIRECT,調(diào)用者必須有對(duì)緩沖的寫(xiě)訪(fǎng)問(wèn)權(quán)限。注意,對(duì)METHOD_NEITHER,內(nèi)核只提供虛擬地址;它不會(huì)做映射來(lái)配置緩沖。虛擬地址只對(duì)調(diào)用進(jìn)程有效。這里是一個(gè)用METHOD_BUFFERED的例子:首先,使用宏CTL_CODE來(lái)定義一個(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)程序中,代碼看起來(lái)如下所示: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
上傳用戶(hù):gai928943
CPU在處理某一事件時(shí),發(fā)生了另一事件請(qǐng)求CPU迅速去處理。CPU暫時(shí)中斷當(dāng)前的工作,轉(zhuǎn)去處理事件B。待CPU將事件B處理完畢后,再回到原來(lái)事件A被中斷的地方繼續(xù)處理事件A。這一處理過(guò)程稱(chēng)為中斷。介紹用匯編和C語(yǔ)言?xún)烧Z(yǔ)言的源程序,愿給大家?guī)?lái)幫助。 前面我已經(jīng)上傳了幾個(gè)程序,沒(méi)幾天卻失蹤了。但這次的不會(huì)失蹤,能保留上幾天。
標(biāo)簽: 匯編語(yǔ)言 C語(yǔ)言 外部中斷
上傳時(shí)間: 2014-12-31
上傳用戶(hù):dianxin61
當(dāng)一個(gè)VI A.vi在VI B.vi 中使用,就稱(chēng)A.vi為B.vi的子VI,B.vi為A.vi的主VI。子VI 相當(dāng)于文本編程語(yǔ)言中的子程序。 在主VI的程序框圖中雙擊子VI的圖標(biāo)時(shí),將出現(xiàn)該子VI 的前面板和程序框圖。在前面板窗口和程序框圖窗口的右上角可以看到該VI 的圖標(biāo)。該圖標(biāo)與將VI放置在程序框圖中時(shí)所顯示的圖標(biāo)相同。
標(biāo)簽:
上傳時(shí)間: 2013-10-31
上傳用戶(hù):jisujeke
蟲(chóng)蟲(chóng)下載站版權(quán)所有 京ICP備2021023401號(hào)-1