我有一個(gè)問(wèn)題,可能比較幼稚,問(wèn)一下,我用CH365做了一個(gè)數(shù)據(jù)采集卡,我想問(wèn)的是,如何在軟件中進(jìn)入中斷呀,也就是PC中的中斷應(yīng)用程序如何去寫,什么時(shí)候才能去執(zhí)行,單片機(jī)中有相應(yīng)的中斷入口,可應(yīng)用程序呢?能否給出相應(yīng)的代碼? 還有,如果我想每次PC中讀入16位,要怎么設(shè)置呢?[Emot]5[/Emot]
CH365的動(dòng)態(tài)錠接庫(kù)DLL提供了偽中斷服務(wù),實(shí)際的中斷服務(wù)仍然是在驅(qū)動(dòng)程序庫(kù)完成的,只是在完成后 向DLL發(fā)了個(gè)通知,由DLL再調(diào)用偽中斷服務(wù)子程序。由于涉及到系統(tǒng)層與應(yīng)用層切換以及線程切換, 所以中斷頻率不能太高,如果太高,雖然驅(qū)動(dòng)程序能夠收到中斷,但是等到通知到應(yīng)用層,再調(diào)用客戶 的偽中斷服務(wù)程序,最慢可能需要10毫秒,從而在應(yīng)用層丟失中斷。如果產(chǎn)品的中斷頻率大于幾百次每 秒,那么建議自己寫驅(qū)動(dòng)程序或者改寫我們的驅(qū)動(dòng),在驅(qū)動(dòng)程序中實(shí)現(xiàn)中斷服務(wù)。 BOOL WINAPI CH365mSetIntRoutine( // 設(shè)定中斷服務(wù)程序 ULONG iIndex, // 指定CH365設(shè)備序號(hào) mPCH365_INT_ROUTINE iIntRoutine ); // 指定中斷服務(wù)程序,為NULL則取消中斷服務(wù),否則在中斷時(shí)調(diào)用該程序
iCommand2.mFunction = mFuncReadIoByte; //發(fā)送I/O口寫字命令,命令代碼,該命令在硬件中斷時(shí)由驅(qū)動(dòng)程序執(zhí)行 iCommand2.mAddress = &mIOBaseAddr2->mCh365IoTime; //讀硬件循環(huán)計(jì)數(shù)寄存器 iCommand2.mLength = 1; //數(shù)據(jù)長(zhǎng)度設(shè)定,操作數(shù)據(jù)長(zhǎng)度,以字節(jié)計(jì)算 CH365mWriteIntCommand(mIndex2,&iCommand2,2); //向命令緩沖區(qū)2內(nèi)寫數(shù)據(jù) CH365mSetIntRoutine(mIndex2,InterruptEvent2);
void CALLBACK InterruptEvent2(void) //設(shè)備1中斷通知消息 { mCount2++;//中斷次數(shù)記數(shù) PostMessage(mSaveDialogMain,WM_2INTNOTIFY,0,0); //發(fā)送設(shè)備1斷消息 }
"想每次PC中讀入16位,要怎么設(shè)置" 這句話是什么意思啊?
我也想問(wèn)這個(gè)問(wèn)題
每次中斷產(chǎn)生時(shí)我從PCI擴(kuò)展RAM里讀取一個(gè)512字節(jié)數(shù)據(jù)
能用沁恒提供的DLL里的中斷服務(wù)線程嗎 還是要自已編寫程序擴(kuò)展這個(gè)函數(shù)
還有我看源碼時(shí)有些糊涂,不清楚那個(gè)中斷服務(wù)線程具體做了什么操作
當(dāng)然可以用dll里面的函數(shù)了. 那個(gè)中斷線程里具體作了什么事情是您自己寫的.
能否在驅(qū)動(dòng)中斷處理函數(shù)里直接處里這個(gè)操作呢
當(dāng)然可以
我想用windows API函數(shù)CreatePipe 在驅(qū)動(dòng)程序里建立里管道,當(dāng)中斷產(chǎn)生里將數(shù)據(jù)發(fā)送到管道里,可是編譯報(bào)了很多錯(cuò)誤。 我想用問(wèn)下驅(qū)動(dòng)程序中可以使用Windows.h和Winbase.h這兩個(gè)頭文件嗎? 還有就是H365的動(dòng)態(tài)錠接庫(kù)DLL提供了偽中斷服務(wù)程序是由驅(qū)動(dòng)程序觸發(fā)的 還是由應(yīng)用程序?qū)佑|發(fā)的。 如果我想在H365的動(dòng)態(tài)錠接庫(kù)DLL里入口函數(shù)初始化CreatePipe 可以嗎?
象window.h等最基本的頭文件肯定是要用的. 至于第二個(gè)問(wèn)題,所有的硬件中斷都是由底層的程序向上傳遞給應(yīng)用層的, 第3個(gè)問(wèn)題不使用這個(gè)函數(shù).
那么在驅(qū)動(dòng)程序入口函數(shù)DriverEntry 里初始化CreatePipe 可以嗎
主要想利用Pipe做一個(gè)數(shù)據(jù)傳輸隊(duì)列,這樣可以我做的通信協(xié)議DLL里處理數(shù)據(jù),然后發(fā)給GUI。
這個(gè)方法可行嗎
YIN 你有什么好方法嗎?
我感覺(jué)你的程序沒(méi)有必要使用這個(gè)函數(shù)
我感覺(jué)你的程序沒(méi)有必要使用這個(gè)函數(shù)
哦 因?yàn)榭赡苡行?shù)據(jù)不能馬上被應(yīng)用層提走,我想建個(gè)數(shù)據(jù)傳輸?shù)年?duì)列,中斷后將數(shù)據(jù)存放在隊(duì)列里,防止數(shù)據(jù)丟失。還有就是利用windows信號(hào)機(jī)制在沒(méi)中斷時(shí)我可以掛起線程。
用windows消息函數(shù)行嗎?
可以.
謝謝了