動態(tài)采集程序涉及到驅(qū)動程序中部分概念的分析
發(fā)布時間:2008/11/13 0:00:00 訪問次數(shù):825
。1)緩沖區(qū)。在驅(qū)動程序進行a/d或d/a轉(zhuǎn)換時,有3個相關(guān)的概念需要分清楚:采集板上的fifo,計算機內(nèi)存中的內(nèi)部緩沖區(qū)和用戶緩沖區(qū)。
fifo為采集板卡上自帶的,πfo緩沖區(qū)可以達(dá)到更高的采集頻率,如pci1710使用4kb的fifo緩沖區(qū)后,最高采樣頻率可達(dá)到100khz。但是有些型號的采集板不帶fifo緩沖區(qū)。
內(nèi)部緩沖區(qū)和用戶緩沖區(qū)是數(shù)據(jù)采集程序動態(tài)分配給驅(qū)動程序使用的兩塊內(nèi)存區(qū)域。內(nèi)部緩沖區(qū)主要由驅(qū)動程序使用,驅(qū)動程序從板卡fifo中或寄存器將數(shù)據(jù)通過中斷方式或dma方式傳輸?shù)絻?nèi)部緩沖區(qū)。在例程中該buffer指針一般用hbuf命名。
如果是非循環(huán)采集,采樣完設(shè)置好的數(shù)據(jù)個數(shù)后采集停止,驅(qū)動停止往內(nèi)部緩沖區(qū)存放數(shù)據(jù)。如果循環(huán)采集,內(nèi)部緩沖區(qū)會循環(huán)使用,用戶需要在bufferchange事件用drvfaltransfer及時將數(shù)據(jù)取走,以免被新到的數(shù)據(jù)覆蓋?梢苑诺接脩艟彌_區(qū)中,或者進行存到硬盤的其他數(shù)據(jù)操作。
用戶緩沖區(qū)是用戶自己用來存放數(shù)據(jù)的地方,例程中開辟的大小和內(nèi)部緩沖區(qū)一致,這只是示例。實際應(yīng)用當(dāng)中,用戶可以根據(jù)需要開辟用戶緩沖區(qū)的大小。例如開辟一個較大的用戶緩沖區(qū),在循環(huán)采集中將每次采集的數(shù)據(jù)依次存放其中。采集結(jié)束后統(tǒng)一處理。在例程中該buffer指針一般用huserbuf命名,兩者還有一個區(qū)別在于,內(nèi)部緩沖區(qū)中存放的是rawdata(原始數(shù)據(jù)),用戶緩沖區(qū)中存放的可以是原始數(shù)據(jù)也可以是float data電壓值。通過pt-faltransfer,datatype參數(shù)來確定轉(zhuǎn)換時是原始數(shù)據(jù)還是電壓值。關(guān)于原始數(shù)據(jù)和電壓值的區(qū)別后面會有介紹。
中斷觸發(fā)方式的a/d轉(zhuǎn)換中這3種緩沖區(qū)的使用如圖所示。
(2)內(nèi)部緩沖區(qū)的使用方式。驅(qū)動程序在操作內(nèi)部緩沖區(qū)時是將內(nèi)部緩沖區(qū)分為上下兩半緩沖區(qū)來分別操作。通過這樣來保證高速連續(xù)采集時,數(shù)據(jù)不會丟失。在采集時驅(qū)動程序從板卡fifo或寄存器中將數(shù)據(jù)傳輸?shù)絻?nèi)部緩沖區(qū)中,當(dāng)內(nèi)部緩沖區(qū)半滿時驅(qū)動程序發(fā)出buffer-change事件。用戶通過執(zhí)行drv_falcheck函數(shù)返回的halfready來判斷是上半部分還是下半部分緩沖滿了,然后執(zhí)行drv_faltransfer來將相應(yīng)的緩沖中的數(shù)據(jù)取走。
在不了解數(shù)據(jù)采集的dma觸發(fā)方式時,很容易把在中斷觸發(fā)方式下,調(diào)用drv_fai-intscanstart函數(shù)的同時使用fifo和內(nèi)部緩沖區(qū)的方式認(rèn)為是雙緩沖區(qū)工作方式,進而對ptfalcheck結(jié)構(gòu)的activebuf域產(chǎn)生誤解。實際上,雙緩沖區(qū)是指同時使用a、b兩個內(nèi)部緩沖區(qū)。這是pcl1800卡在dma觸發(fā)方式下的特殊工作方式,由drv_faldualdmastart函數(shù)啟動。只有pcl1800卡支持雙緩沖方式。在中斷觸發(fā)方式下不能同時使用雙緩沖區(qū)的工作方式。所以我們一般使用pt_faltransfer,activebuf=0即單緩沖模式。
。3)設(shè)計fifo的目的。為了防止在高速數(shù)據(jù)采集時丟失數(shù)據(jù),特別是在像windows這樣的多任務(wù)操作系統(tǒng)下。通常板卡完成a/d轉(zhuǎn)換后,將數(shù)據(jù)寫人到數(shù)據(jù)輸出寄存器中,接著使用dma或中斷服務(wù)功能將數(shù)據(jù)傳輸?shù)絚pu/內(nèi)存。如果沒有fifo功能,每次硬件完成a/d轉(zhuǎn)換后,會改寫保存在數(shù)據(jù)寄存器中的值,如果上次a/d的數(shù)據(jù)在新數(shù)據(jù)到來之前被傳輸?shù)絚pu,那么這個數(shù)據(jù)就丟失了。如果使用∏fo功能,新數(shù)據(jù)僅僅被添加到fifo緩沖區(qū)的第二個位置上,而不會覆蓋原先的數(shù)據(jù)。隨后的數(shù)據(jù)會依次排列到緩沖區(qū)中。當(dāng)你想從∏fo緩沖區(qū)中搬移數(shù)據(jù)時僅僅需要從數(shù)據(jù)寄存器中讀取一個數(shù)據(jù)即可,這樣將會把最初的數(shù)據(jù)取出,fifo中下一個位置的數(shù)據(jù)會取代數(shù)據(jù)寄存器中的值,你可以在任何時候傳輸來自fifo緩沖區(qū)中的數(shù)據(jù),當(dāng)你在傳輸舊的數(shù)據(jù)時,硬件會將最新的數(shù)據(jù)保存在fifo中,從而防止數(shù)據(jù)丟失。你也可以在fifo半滿或全滿時,一次性地傳輸數(shù)據(jù)。由于這樣減少了cpu的時間,因此非常適合于大量的高速數(shù)據(jù)傳輸。
。4)循環(huán)(cycle0)和非循環(huán)(no_cycle)。循環(huán)和非循環(huán)是指內(nèi)部緩沖區(qū)的使用方式。
非循環(huán)方式下,內(nèi)部緩沖區(qū)作為一個整體使用。在非循環(huán)方式下執(zhí)行一次drv fai_int-scanstart/drv_fallntstart函數(shù)只能進行有限次(次數(shù)就是通過參數(shù)count設(shè)置的采樣個數(shù))的a/d轉(zhuǎn)換,drv_faltntscanstart函數(shù)執(zhí)行過程中將所有數(shù)據(jù)都放到內(nèi)部緩沖區(qū);a/d轉(zhuǎn)換結(jié)束后,在ads_evt_terminated事仵的處理函數(shù)中再用drv_faltransfer函數(shù)將數(shù)據(jù)傳送到用戶緩沖區(qū)中。
循環(huán)方式下,內(nèi)部緩沖區(qū)分為兩個半?yún)^(qū)使用。執(zhí)行一次drv_fallntscanstart/drv_faiintstart函數(shù)可以進行無限次的a/d轉(zhuǎn)換,直到調(diào)用drv fai_stop函數(shù)。這種方式下有限的內(nèi)部緩沖區(qū)不可能容納無限多的采集數(shù)據(jù)。因此,將內(nèi)部緩沖區(qū)分成前后對等的兩個半?yún)^(qū)。當(dāng)前半?yún)^(qū)填滿后產(chǎn)生一個ads_evt_bufchange事件,采集程序中的事件檢查循環(huán)捕獲這個事件,調(diào)用drv_fai_transfer函數(shù)把數(shù)據(jù)傳送到用戶緩沖區(qū);與此同時drv_fallntscanstart/drvfallntstart函數(shù)將新轉(zhuǎn)換的數(shù)據(jù)放到內(nèi)部緩沖區(qū)的后半部分。當(dāng)后半?yún)^(qū)填滿后再產(chǎn)生一個ads_evt_bufchange事仵,并用drv
(1)緩沖區(qū)。在驅(qū)動程序進行a/d或d/a轉(zhuǎn)換時,有3個相關(guān)的概念需要分清楚:采集板上的fifo,計算機內(nèi)存中的內(nèi)部緩沖區(qū)和用戶緩沖區(qū)。
fifo為采集板卡上自帶的,πfo緩沖區(qū)可以達(dá)到更高的采集頻率,如pci1710使用4kb的fifo緩沖區(qū)后,最高采樣頻率可達(dá)到100khz。但是有些型號的采集板不帶fifo緩沖區(qū)。
內(nèi)部緩沖區(qū)和用戶緩沖區(qū)是數(shù)據(jù)采集程序動態(tài)分配給驅(qū)動程序使用的兩塊內(nèi)存區(qū)域。內(nèi)部緩沖區(qū)主要由驅(qū)動程序使用,驅(qū)動程序從板卡fifo中或寄存器將數(shù)據(jù)通過中斷方式或dma方式傳輸?shù)絻?nèi)部緩沖區(qū)。在例程中該buffer指針一般用hbuf命名。
如果是非循環(huán)采集,采樣完設(shè)置好的數(shù)據(jù)個數(shù)后采集停止,驅(qū)動停止往內(nèi)部緩沖區(qū)存放數(shù)據(jù)。如果循環(huán)采集,內(nèi)部緩沖區(qū)會循環(huán)使用,用戶需要在bufferchange事件用drvfaltransfer及時將數(shù)據(jù)取走,以免被新到的數(shù)據(jù)覆蓋?梢苑诺接脩艟彌_區(qū)中,或者進行存到硬盤的其他數(shù)據(jù)操作。
用戶緩沖區(qū)是用戶自己用來存放數(shù)據(jù)的地方,例程中開辟的大小和內(nèi)部緩沖區(qū)一致,這只是示例。實際應(yīng)用當(dāng)中,用戶可以根據(jù)需要開辟用戶緩沖區(qū)的大小。例如開辟一個較大的用戶緩沖區(qū),在循環(huán)采集中將每次采集的數(shù)據(jù)依次存放其中。采集結(jié)束后統(tǒng)一處理。在例程中該buffer指針一般用huserbuf命名,兩者還有一個區(qū)別在于,內(nèi)部緩沖區(qū)中存放的是rawdata(原始數(shù)據(jù)),用戶緩沖區(qū)中存放的可以是原始數(shù)據(jù)也可以是float data電壓值。通過pt-faltransfer,datatype參數(shù)來確定轉(zhuǎn)換時是原始數(shù)據(jù)還是電壓值。關(guān)于原始數(shù)據(jù)和電壓值的區(qū)別后面會有介紹。
中斷觸發(fā)方式的a/d轉(zhuǎn)換中這3種緩沖區(qū)的使用如圖所示。
(2)內(nèi)部緩沖區(qū)的使用方式。驅(qū)動程序在操作內(nèi)部緩沖區(qū)時是將內(nèi)部緩沖區(qū)分為上下兩半緩沖區(qū)來分別操作。通過這樣來保證高速連續(xù)采集時,數(shù)據(jù)不會丟失。在采集時驅(qū)動程序從板卡fifo或寄存器中將數(shù)據(jù)傳輸?shù)絻?nèi)部緩沖區(qū)中,當(dāng)內(nèi)部緩沖區(qū)半滿時驅(qū)動程序發(fā)出buffer-change事件。用戶通過執(zhí)行drv_falcheck函數(shù)返回的halfready來判斷是上半部分還是下半部分緩沖滿了,然后執(zhí)行drv_faltransfer來將相應(yīng)的緩沖中的數(shù)據(jù)取走。
在不了解數(shù)據(jù)采集的dma觸發(fā)方式時,很容易把在中斷觸發(fā)方式下,調(diào)用drv_fai-intscanstart函數(shù)的同時使用fifo和內(nèi)部緩沖區(qū)的方式認(rèn)為是雙緩沖區(qū)工作方式,進而對ptfalcheck結(jié)構(gòu)的activebuf域產(chǎn)生誤解。實際上,雙緩沖區(qū)是指同時使用a、b兩個內(nèi)部緩沖區(qū)。這是pcl1800卡在dma觸發(fā)方式下的特殊工作方式,由drv_faldualdmastart函數(shù)啟動。只有pcl1800卡支持雙緩沖方式。在中斷觸發(fā)方式下不能同時使用雙緩沖區(qū)的工作方式。所以我們一般使用pt_faltransfer,activebuf=0即單緩沖模式。
。3)設(shè)計fifo的目的。為了防止在高速數(shù)據(jù)采集時丟失數(shù)據(jù),特別是在像windows這樣的多任務(wù)操作系統(tǒng)下。通常板卡完成a/d轉(zhuǎn)換后,將數(shù)據(jù)寫人到數(shù)據(jù)輸出寄存器中,接著使用dma或中斷服務(wù)功能將數(shù)據(jù)傳輸?shù)絚pu/內(nèi)存。如果沒有fifo功能,每次硬件完成a/d轉(zhuǎn)換后,會改寫保存在數(shù)據(jù)寄存器中的值,如果上次a/d的數(shù)據(jù)在新數(shù)據(jù)到來之前被傳輸?shù)絚pu,那么這個數(shù)據(jù)就丟失了。如果使用∏fo功能,新數(shù)據(jù)僅僅被添加到fifo緩沖區(qū)的第二個位置上,而不會覆蓋原先的數(shù)據(jù)。隨后的數(shù)據(jù)會依次排列到緩沖區(qū)中。當(dāng)你想從∏fo緩沖區(qū)中搬移數(shù)據(jù)時僅僅需要從數(shù)據(jù)寄存器中讀取一個數(shù)據(jù)即可,這樣將會把最初的數(shù)據(jù)取出,fifo中下一個位置的數(shù)據(jù)會取代數(shù)據(jù)寄存器中的值,你可以在任何時候傳輸來自fifo緩沖區(qū)中的數(shù)據(jù),當(dāng)你在傳輸舊的數(shù)據(jù)時,硬件會將最新的數(shù)據(jù)保存在fifo中,從而防止數(shù)據(jù)丟失。你也可以在fifo半滿或全滿時,一次性地傳輸數(shù)據(jù)。由于這樣減少了cpu的時間,因此非常適合于大量的高速數(shù)據(jù)傳輸。
。4)循環(huán)(cycle0)和非循環(huán)(no_cycle)。循環(huán)和非循環(huán)是指內(nèi)部緩沖區(qū)的使用方式。
非循環(huán)方式下,內(nèi)部緩沖區(qū)作為一個整體使用。在非循環(huán)方式下執(zhí)行一次drv fai_int-scanstart/drv_fallntstart函數(shù)只能進行有限次(次數(shù)就是通過參數(shù)count設(shè)置的采樣個數(shù))的a/d轉(zhuǎn)換,drv_faltntscanstart函數(shù)執(zhí)行過程中將所有數(shù)據(jù)都放到內(nèi)部緩沖區(qū);a/d轉(zhuǎn)換結(jié)束后,在ads_evt_terminated事仵的處理函數(shù)中再用drv_faltransfer函數(shù)將數(shù)據(jù)傳送到用戶緩沖區(qū)中。
循環(huán)方式下,內(nèi)部緩沖區(qū)分為兩個半?yún)^(qū)使用。執(zhí)行一次drv_fallntscanstart/drv_faiintstart函數(shù)可以進行無限次的a/d轉(zhuǎn)換,直到調(diào)用drv fai_stop函數(shù)。這種方式下有限的內(nèi)部緩沖區(qū)不可能容納無限多的采集數(shù)據(jù)。因此,將內(nèi)部緩沖區(qū)分成前后對等的兩個半?yún)^(qū)。當(dāng)前半?yún)^(qū)填滿后產(chǎn)生一個ads_evt_bufchange事件,采集程序中的事件檢查循環(huán)捕獲這個事件,調(diào)用drv_fai_transfer函數(shù)把數(shù)據(jù)傳送到用戶緩沖區(qū);與此同時drv_fallntscanstart/drvfallntstart函數(shù)將新轉(zhuǎn)換的數(shù)據(jù)放到內(nèi)部緩沖區(qū)的后半部分。當(dāng)后半?yún)^(qū)填滿后再產(chǎn)生一個ads_evt_bufchange事仵,并用drv
熱門點擊
- 計算機串行通信分類
- 8253可編程計數(shù)/定時器編程要點
- 數(shù)據(jù)采集板卡的編程使用
- 數(shù)字信號數(shù)據(jù)的傳輸方式
- 動態(tài)采集程序涉及到驅(qū)動程序中部分概念的分析
- Samplify推出SAM1600 ADC與
- 8253功能及其結(jié)構(gòu)框圖
- A/D轉(zhuǎn)換模塊
- ADC有限字長效應(yīng)
- ADC數(shù)據(jù)轉(zhuǎn)換
推薦技術(shù)資料
- DS2202型示波器試用
- 說起數(shù)字示波器,普源算是國內(nèi)的老牌子了,F(xiàn)QP8N60... [詳細(xì)]
- MOSFET 電感單片降壓開關(guān)模式變換器優(yōu)勢
- SiC MOSFET 和 IG
- 新型 電隔離無芯線性霍爾效應(yīng)電
- 業(yè)界超小絕對位置編碼器技術(shù)參數(shù)設(shè)計
- 高帶寬、更高分辨率磁角度傳感技術(shù)應(yīng)用探究
- MagAlpha 角度位置傳感
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究