專利名稱:長時間連續(xù)dma傳輸?shù)木彌_區(qū)管理的軟件實現(xiàn)方法
技術領域:
本發(fā)明屬于數(shù)據(jù)采集領域,特別涉及一種長時間連續(xù)的DMA傳輸?shù)木彌_區(qū)管理的軟件實現(xiàn)方法。
背景技術:
DMA (Direct Memory Access,直接內(nèi)存存取)是現(xiàn)代計算機的重要特色,被廣泛用于數(shù)據(jù)采集領域。DMA是一種硬件機制,它允許外圍設備和主內(nèi)存之間直接傳輸它們的I/O數(shù)據(jù),而不需要系統(tǒng)處理器的參與。使用DMA傳輸機制可以大大提高與設備通信的吞吐量。緩沖區(qū)是計算機內(nèi)存中用于存放采樣數(shù)據(jù)的臨時存儲區(qū),緩沖區(qū)從計算機內(nèi)存中分配出來,對于連續(xù)的DMA傳輸過程中,儀器設備可能一直連續(xù)工作,需傳輸?shù)臄?shù)據(jù)量不斷增加,一次性開辟緩沖區(qū)是不可能滿足需求的。而且重復循環(huán)讀寫一塊緩沖區(qū),還有可能會因為讀寫速率的不一致產(chǎn)生數(shù)據(jù)覆蓋的或使用效率不高的問題。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明提出了一種長時間連續(xù)DMA傳輸?shù)木彌_區(qū)管理方法,一次性開辟緩沖區(qū)大小,緩沖區(qū)的讀方和寫方循環(huán)且長時間使用該緩沖區(qū),長時間讀寫不會產(chǎn)生數(shù)據(jù)覆蓋或使用效率不高問題,以滿足用戶長時間DMA使用的需求。為了解決上述技術問題,本發(fā)明是這樣實現(xiàn)的一種長時間連續(xù)DMA傳輸?shù)木彌_區(qū)管理方法,包括如下步驟首先定義如下參數(shù)preDMA_sta為DMA傳輸過程中上一次寫到的數(shù)據(jù)量,初始值為O ;curDMA_sta為DMA傳輸過程中實際已寫的數(shù)據(jù)量,初始值為O ; curDMA_sta和preDMA_sta采用相同位數(shù)的無符號整形;DMAtemp為中間變量,初始值為O ;LsLoop為緩沖區(qū)被循環(huán)的次數(shù),初始值為O ;當curDMA_sta溢出后,LsLoop被清零;Rtime為緩沖區(qū)被Size大小分塊讀的次數(shù),初始值為O;當讀操作跨越了緩沖區(qū)的首尾時,Rtime被清零;Max為curDMA_sta在不溢出情況下的最大值;Rtemp為中間變量,記錄數(shù)據(jù)類型溢出時,緩沖區(qū)已被塊讀過的次數(shù),初始值為O ;Datatemp為中間變量,初始值為O,記錄讀操作跨越緩沖區(qū)首尾時,從緩沖區(qū)首部讀取的數(shù)據(jù)量;flag2表示每次從緩沖區(qū)中讀數(shù)據(jù)的起始位置;flag4為緩沖區(qū)的初始地址;設定緩沖區(qū)的大小為LSize,每次讀數(shù)據(jù)的個數(shù)為Size, Size<LSize ;讀緩沖區(qū)方處理流程包括如下步驟f 14 ;
步驟1、DMA傳輸開始后,讀緩沖區(qū)方查詢當前緩沖區(qū)已寫數(shù)據(jù)量curDMA_sta ;該curDMA_sta從寫緩沖區(qū)方的硬件獲得;步驟2、判斷上次寫到的數(shù)據(jù)量preDMA_Sta是否大于實際已寫數(shù)據(jù)量curDMA_sta ;如果是,則執(zhí)行步驟3,否則,執(zhí)行步驟Γ8 ;步驟3、判定curDMA_Sta數(shù)據(jù)類型溢出,計算當前緩沖區(qū)中未被讀取的數(shù)據(jù)量DMAtemp=Max+curDMA_sta-preDMA_sta ;并且更新 LsLoop=O, Rtemp=Rtime ;執(zhí)行步驟 9。步驟4、判定curDMA_Sta數(shù)據(jù)類型未溢出,計算當前緩沖區(qū)中已寫的數(shù)據(jù)量DMAtemp=curDMA_sta,執(zhí)行步驟 5 ;步驟5、判斷是否Rtemp=O,如果是,則執(zhí)行步驟9,否則執(zhí)行步驟6 ;步驟6、判斷是否Rtime=O,如果是,則執(zhí)行步驟7,否則執(zhí)行步驟8 ;步驟7、令Rtemp=O,轉(zhuǎn)入步驟9 ;步驟8、令Rtemp值不變,轉(zhuǎn)入步驟9 ;步驟9、判斷是否滿足(DMAtemp-LsizeXLsLoop) ^ (Rtime-Rtemp+1) XSize,如果是,則確定緩沖區(qū)中的數(shù)據(jù)達到Size,則執(zhí)行步驟10 ;否則,返回步驟I ;步驟10、令 preDMA_sta=curDMA_sta,且令 Rtime 自加 I ;步驟11、計算下一次讀的起始地址flag2+Size是否大于LSize ;如果是,則執(zhí)行步驟12;否則,執(zhí)行步驟13;
步驟12、先從flag2開始讀Lsize-Datatemp-RtimeXSize個數(shù)據(jù),再從緩沖區(qū)初始地址 flag4 讀取 Size- (Lsize-Datatemp-RtimeX Size)個數(shù)據(jù),將 Datatemp 賦值為 Size- (Lsize-Datatemp-RtimeX Size);然后令 LsLoop 自加 I,更新 Rtime=O, flag2=flag4+[Size- (Lsize-Datatemp-RtimeX Size)],轉(zhuǎn)至步驟 14 ;第一次讀取時,flag2=flag4 ;步驟13、從flag2開始讀Size個數(shù)據(jù),flag2自增Size ;轉(zhuǎn)至步驟14。步驟14、判斷DMA傳輸是否結束,如果是,則退出本流程,否則,返回步驟I繼續(xù)循環(huán);寫緩沖區(qū)方處理流程寫緩沖方從flag4開始不斷向緩沖區(qū)寫入數(shù)據(jù),并根據(jù)讀緩沖方發(fā)來的flag2的位置,確保寫緩沖位置不超過flag2。綜上,本發(fā)明提出了一種長時間連續(xù)采集的DMA緩沖區(qū)管理方法。該方法的有益效果是,具有通用性,適用任意數(shù)據(jù)量的DMA傳輸應用;具有靈活性,降低DMA傳輸應用對計算機配置的依賴;緩沖區(qū)循環(huán)使用,可滿足用戶長時間DMA使用的需求。此外,本發(fā)明還考慮到了溢出問題,采用絕對位置計算讀寫位置,提高了整個連續(xù)傳輸過程的穩(wěn)定性。
圖1為DMA傳輸緩沖區(qū)讀寫示意圖。圖2為本發(fā)明緩沖區(qū)讀操作流程圖。
具體實施例方式本發(fā)明為實現(xiàn)上述目的,采用如下技術方案本發(fā)明有三個技術點
1、連續(xù)傳輸過程中緩沖區(qū)大小的確定由于DMA數(shù)據(jù)傳輸過程中,若寫緩沖區(qū)的速度很快,緩沖區(qū)開辟不夠大,則容易造成寫緩沖區(qū)方中用于存儲數(shù)據(jù)的FIFO溢出,使寫緩沖區(qū)方儀器工作異常;若緩沖區(qū)開辟過大,在內(nèi)存和硬盤之間產(chǎn)生過量的讀寫操作時,會對系統(tǒng)性能造成影響。為了保證寫緩沖區(qū)方FIFO中存儲的數(shù)據(jù)能夠在溢出前被傳輸?shù)紻MA緩沖區(qū)內(nèi),本發(fā)明以寫緩沖區(qū)方完成一次數(shù)據(jù)采集和處理操作周期Tl為基礎,將該時間乘以10,將10XT1假定為寫緩沖區(qū)方向緩沖區(qū)進行寫操作的周期的上限,則開辟的緩沖區(qū)大小為10XTl,單位為系統(tǒng)數(shù)據(jù)位寬。例如系統(tǒng)讀寫數(shù)據(jù)位寬為32位字節(jié),則這里單位為32位字節(jié)。通過合理的緩沖區(qū)大小,在不同的寫緩沖區(qū)速率的情況下,能保證向緩沖區(qū)內(nèi)讀數(shù)據(jù)速度比寫速度快,而且不造成內(nèi)存空間的浪費。2、保證緩沖區(qū)循環(huán)使用對于長時間連續(xù)運行的DMA傳輸,需要實現(xiàn)緩沖區(qū)的循環(huán)使用,即不斷的寫、讀同一塊緩沖區(qū)。若寫和讀之間沒有約束,有可能寫的速度過快,還沒有來得及把緩沖區(qū)中的數(shù)據(jù)讀走,寫就將先前的寫數(shù)據(jù)覆蓋了 ;若讀的過快,緩沖區(qū)中寫數(shù)據(jù)未來得及更新,讀走的可能是以往的數(shù)據(jù);同時,在緩沖區(qū)循環(huán)使用時,若讀、寫完設定大小的緩沖區(qū)后,不能重新讀、寫緩沖區(qū),也會造成錯誤。這三種情況下,數(shù)據(jù)傳輸?shù)慕Y果都是不可靠的。因此應當制定合理的緩沖區(qū)循環(huán)使用的方法,以確保長時間連續(xù)的DMA傳輸?shù)恼_性、可靠性。參見圖1,設計的方法如下設定緩沖區(qū)的大小為LSize,每次讀數(shù)據(jù)的個數(shù)為Size, Size<LSize,并在緩沖區(qū)中設置3個標志位flagl、flag2、flag4,其中,flagl表示寫數(shù)據(jù)的當前位置,flag2表示讀數(shù)據(jù)的當前位置,flag4表示緩沖區(qū)的開始位置。為了提高緩沖區(qū)利用率,寫緩沖區(qū)方和讀緩沖區(qū)方均根據(jù)上述標識位進行讀寫操作寫緩沖區(qū)方從flag4開始持續(xù)寫緩沖區(qū);在寫過程中,flagl不斷變化,但不能超過flag2,否則將覆蓋未讀數(shù)據(jù)。讀緩沖區(qū)方每Size個數(shù)據(jù)塊讀緩沖區(qū)一次。在讀過程中,讀緩沖區(qū)方定期查詢緩沖區(qū)內(nèi)當前可讀的數(shù)據(jù)量,當根據(jù)flagl和flag2之間的差距判定緩沖區(qū)內(nèi)未讀數(shù)據(jù)已經(jīng)達到Size,則讀緩沖區(qū)方便可從緩沖區(qū)中連續(xù)讀取Size個數(shù)據(jù)。在寫緩沖區(qū)過程中,當達到緩沖區(qū)的最大地址時,將調(diào)過頭來從初始地址flag4重新寫緩沖區(qū),在讀緩沖區(qū)過程中,讀數(shù)據(jù)地址達到最大地址時,也會調(diào)過頭來從初始地址flag4開始讀,依次反復實現(xiàn)連續(xù)的DMA傳輸,緩沖區(qū)實現(xiàn)循環(huán)利用。3、保證長時間連續(xù)傳輸能夠保證在循環(huán)過程中flagl、flag2的位置相應位置關系可靠是非常重要的。但是這三個量均在緩沖區(qū)中的相對位置量,容易產(chǎn)生計算失誤。因此如果能采用絕對位置去實時更新相對位置,將會提高整個連續(xù)傳輸過程的穩(wěn)定性。在這2個位置中,flag2可以從flag4開始起算,每讀一次增加Size,但是flagl的更新需要依賴實際向緩沖區(qū)寫了多少數(shù),也就是DMA傳輸過程中已寫的數(shù)據(jù)量curDMA_sta,該數(shù)據(jù)量可以由寫緩沖區(qū)方的硬件告知的,每次通過這個數(shù)判定flagl的真實位置。但是,在記錄數(shù)據(jù)量的過程中,由于定義數(shù)據(jù)量的數(shù)據(jù)類型可能是16位整形,也可能是32位整形,由于長時間傳輸,數(shù)據(jù)量很大(可能趨向正無窮),因此需要記錄的數(shù)據(jù)量達到溢出邊沿時,需重新記錄。curDMA_sta也就會出現(xiàn)同樣的問題,假設curDMA_sta為32位無符號整形,最大可記錄4294967296個數(shù),當傳輸?shù)臄?shù)據(jù)個數(shù)超過4294967296時,就會溢出。此時,當判斷curDMA_sta達到4294967296時,需要重零開始記錄數(shù)據(jù),此時根據(jù)curDMA_sta確flagl的位置時,需要特殊考慮。基于上述3點,下面針對讀緩沖區(qū)方和寫緩沖區(qū)方的具體流程進行描述。首先定義如下參數(shù)preDMA_sta為DMA傳輸過程中上一次寫到的數(shù)據(jù)量,初始值為O ;curDMA_sta為DMA傳輸過程中實際已寫的數(shù)據(jù)量,初始值為O ; curDMA_sta和preDMA_sta采用相同位數(shù)的無符號整形,本實施例中,被定義為32位無符號整型;DMAtemp為中間變量,初始值為O ;LsLoop為緩沖區(qū)被循環(huán)的次數(shù),初始值為O ;當curDMA_sta溢出后,LsLoop應當
被清零;Rtime為緩沖區(qū)被Size大小分塊讀的次數(shù),初始值為O;當讀操作跨越了緩沖區(qū)的首尾時,Rtime被清零;4294967295為curDMA_sta被定義為32位無符號整型的最大值;Rtemp為中間變量,記錄數(shù)據(jù)類型溢出時,緩沖區(qū)已被塊讀過的次數(shù),初始值為O。Datatemp為中間變量,初始值為O,記錄讀操作跨越緩沖區(qū)首尾時,從緩沖區(qū)首部讀取的數(shù)據(jù)量。讀緩沖區(qū)方處理流程,參見圖2 :步驟1、DMA傳輸開始后,讀緩沖區(qū)方查詢當前緩沖區(qū)已寫數(shù)據(jù)量curDMA_sta。curDMA_sta從寫緩沖區(qū)方的硬件獲得,是一個準確的數(shù)據(jù)。步驟2、判斷上次寫到的數(shù)據(jù)量preDMA_Sta是否大于實際已寫數(shù)據(jù)量curDMA_sta ;如果是,則執(zhí)行步驟3,否則,執(zhí)行步驟4 8。上次寫到的數(shù)據(jù)量preDMA_sta是在每次讀操作時被更新的,由于DMA讀寫操作是同時的,而且很快,因此所述更新是將curDMA_sta的值賦給preDMA_sta。因此,在正常情況下,preDMA_sta=curDMA_sta,但是當curDMA_sta溢出時,而preDMA_sta還未被更新時,就會出現(xiàn)preDMA_sta較大的情況,此時由于curDMA_sta的溢出,將導致后續(xù)計算上需要特殊處理,因此這里分情況討論。當preDMA_sta被再次賦予curDMA_sta的值后,preDMA_sta又會恢復與curDMA_sta相等了。步驟3、判定curDMA_sta數(shù)據(jù)類型溢出,計算當前緩沖區(qū)中未被讀取的數(shù)據(jù)量DMAtemp=4294967295+curDMA_sta-preDMA_sta ;并且更新 LsLoop=O, Rtemp=Rtime ;執(zhí)行步驟9。從本步驟可以看出,該分支中DMAtemp記載的是緩沖區(qū)中未被讀取的數(shù)據(jù)量,不是一個數(shù)據(jù)所在位置的相對量,而是未被讀取數(shù)據(jù)的絕對量,不考慮其位置。Rtemp記載的是數(shù)據(jù)溢出時Rtime的值。步驟4、判定curDMA_Sta數(shù)據(jù)類型未溢出,計算當前緩沖區(qū)中已寫的數(shù)據(jù)量DMAtemp=curDMA_sta,執(zhí)行步驟 5 ;本步驟中DMAtemp的含義與步驟3不同,其記載的是溢出之前,共寫入了多少數(shù)據(jù),是一個絕對量,其包含了已讀和未讀的數(shù)據(jù)部分。
步驟5、判斷是否Rtemp=O,如果是,則執(zhí)行步驟9,否則執(zhí)行步驟6。步驟6、判斷是否Rtime=O,如果是,則執(zhí)行步驟7,否則執(zhí)行步驟8。步驟7、令Rtemp=O,轉(zhuǎn)入步驟9。步驟8、令Rtemp值不變,轉(zhuǎn)入步驟9。以上步驟5 8表明了幾種情況①從步驟5直接到步驟9,在緩沖區(qū)的循環(huán)讀取過程中,還未出現(xiàn)溢出,此時保持Rtemp=O,進入步驟9 ;②從步驟5經(jīng)歷步驟6、7到步驟9,在緩沖區(qū)的循環(huán)讀取過程中,剛剛出現(xiàn)了溢出,而且上一次讀取操作跨越了緩沖區(qū)首尾,因此Rtemp應該被更新為0,進入步驟9 ;③從步驟5經(jīng)歷步驟6、8到步驟9,在緩沖區(qū)的循環(huán)讀取過程中,剛剛出現(xiàn)了溢出,而且上一次讀取操作還未從緩沖區(qū)尾部循環(huán)到緩沖區(qū)首部,因此Rtemp值應保持為溢出時的Rtime值,進入步驟9 ;步驟9、判斷是否滿足(DMAtemp-LsizeXLsLoop) ^ (Rtime-Rtemp+1) XSize,如果是,則確定緩沖區(qū)中的數(shù)據(jù)達到Size,則執(zhí)行步驟10 ;否則,返回步驟1,以等待寫數(shù)據(jù)量的增加。 本步驟的判斷公式適用于curDMA_sta溢出和未溢出兩種情況當curDMA_sta 溢出時,(DMAtemp-LsizeXLsLoop)中的 LsLoop 被清零,因此其計算的是未被讀取的數(shù)據(jù)量;而(Rtime-Rtemp+1) X Size中的Rtime=Rtemp,則(Rtime-Rtemp+1) XSize=Size,因此其計算出的是一個Size的量,那么本步驟是判斷當前未被讀取的數(shù)據(jù)量是否達到Size。當curDMA_sta未溢出時,不等式左側(cè)(DMAtemp-Lsize X LsLoop)計算的是寫數(shù)據(jù)實際到達緩沖區(qū)哪個位置,不等式右側(cè)計算的是之前讀取到的最后位置加上一個Size。那么本步驟也是判斷當前未被讀取的數(shù)據(jù)量是否達到Size。步驟10、令 preDMA_sta=curDMA_sta,且令 Rtime 自加 I。Rtime 的值是從 O 開始的,因此在真正讀之前將Rtime加I。步驟11、計算下一次讀的起始地址flag2+Size是否大于LSize ;如果是,則說明當前待讀數(shù)據(jù)塊跨越了緩沖區(qū)的首尾,屬于圖1 (d)的情況,執(zhí)行步驟12 ;否則,執(zhí)行步驟13。步驟12、先從flag2開始讀Lsize-Datatemp-RtimeXSize個數(shù)據(jù),再從緩沖區(qū)初始地址 flag4 讀取 Size- (Lsize-Datatemp-RtimeX Size)個數(shù)據(jù),將 Datatemp 賦值為 Size-(Lsize-Datatemp-RtimeXSize),從而實現(xiàn)了整個數(shù)據(jù)塊的讀?。蝗缓罅頛sLoop自加I,更新 Rtime=O, flag2=flag4+[Size- (Lsize-Datatemp-RtimeXSize)],轉(zhuǎn)至步驟 14 ;第一次讀取時,flag2=flag4。步驟13、從flag2開始讀Size個數(shù)據(jù),flag2自增Size ;轉(zhuǎn)至步驟14。步驟14、判斷DMA傳輸是否結束,如果是,則退出本流程,否則,返回步驟I。寫緩沖區(qū)方處理流程寫緩沖方不斷向緩沖區(qū)寫入數(shù)據(jù),并根據(jù)讀緩沖方發(fā)來的flag2的位置,確保寫緩沖位置不超過flag2。綜上所述,以上僅為本發(fā)明的較佳實施例而已,并非用于限定本發(fā)明的保護范圍。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進等,均應包含在本發(fā)明的保護范圍之內(nèi)。
權利要求
1.一種長時間連續(xù)DMA傳輸?shù)木彌_區(qū)管理方法,其特征在于,包括 首先定義如下參數(shù) preDMA_sta為DMA傳輸過程中上一次寫到的數(shù)據(jù)量,初始值為O ;curDMA_sta為DMA傳輸過程中實際已寫的數(shù)據(jù)量,初始值為O ;curDMA_sta和preDMA_sta采用相同位數(shù)的無符號整形; DMAtemp為中間變量,初始值為O ; LsLoop為緩沖區(qū)被循環(huán)的次數(shù),初始值為O ;當curDMA_sta溢出后,LsLoop被清零;Rtime為緩沖區(qū)被Size大小分塊讀的次數(shù),初始值為O ;當讀操作跨越了緩沖區(qū)的首尾時,Rtime被清零; Max為curDMA_sta在不溢出情況下的最大值; Rtemp為中間變量,記錄數(shù)據(jù)類型溢出時,緩沖區(qū)已被塊讀過的次數(shù),初始值為O ;Datatemp為中間變量,初始值為0,記錄讀操作跨越緩沖區(qū)首尾時,從緩沖區(qū)首部讀取的數(shù)據(jù)量; flag2表示每次從緩沖區(qū)中讀數(shù)據(jù)的起始位置; flag4為緩沖區(qū)的初始地址; 設定緩沖區(qū)的大小為LSize,每次讀數(shù)據(jù)的個數(shù)為Size, Size<LSize ; 讀緩沖區(qū)方處理流程包括如下步驟廣14 ; 步驟1、0祖?zhèn)鬏旈_始后,讀緩沖區(qū)方查詢當前緩沖區(qū)已寫數(shù)據(jù)量(311^)祖_^&;該curDMA_sta從寫緩沖區(qū)方的硬件獲得; 步驟2、判斷上次寫到的數(shù)據(jù)量preDMA_Sta是否大于實際已寫數(shù)據(jù)量CurDMA_Sta ;如果是,則執(zhí)行步驟3,否則,執(zhí)行步驟Γ8 ; 步驟3、判定curDMA_sta數(shù)據(jù)類型溢出,計算當前緩沖區(qū)中未被讀取的數(shù)據(jù)量DMAtemp=Max+curDMA_sta-preDMA_sta ;并且更新 LsLoop=O, Rtemp=Rtime ;執(zhí)行步驟 9。
步驟4、判定curDMA_Sta數(shù)據(jù)類型未溢出,計算當前緩沖區(qū)中已寫的數(shù)據(jù)量DMAtemp=curDMA_sta,執(zhí)行步驟 5 ; 步驟5、判斷是否Rtemp=O,如果是,則執(zhí)行步驟9,否則執(zhí)行步驟6 ; 步驟6、判斷是否Rtime=O,如果是,則執(zhí)行步驟7,否則執(zhí)行步驟8 ; 步驟7、令Rtemp=O,轉(zhuǎn)入步驟9 ; 步驟8、令Rtemp值不變,轉(zhuǎn)入步驟9 ; 步驟 9、判斷是否滿足(DMAtemp-Lsize X LsLoop) ^ (Rtime-Rtemp+1) X Size,如果是,則確定緩沖區(qū)中的數(shù)據(jù)達到Size,則執(zhí)行步驟10 ;否則,返回步驟I ; 步驟 10、令 preDMA_sta=curDMA_sta,且令 Rtime 自加 I ; 步驟11、計算下一次讀的起始地址flag2+Size是否大于LSize ;如果是,則執(zhí)行步驟12;否則,執(zhí)行步驟13; 步驟12、先從flag2開始讀Lsize-Datatemp-RtimeXSize個數(shù)據(jù),再從緩沖區(qū)初始地址 flag4 讀取 Size- (Lsize-Datatemp-Rtime X Size)個數(shù)據(jù),將 Datatemp 賦值為 Size-(Lsize-Datatemp-RtimeX Size);然后令 LsLoop 自加 I,更新 Rtime=O, flag2=flag4+[Size-(Lsize-Datatemp-RtimeX Size)],轉(zhuǎn)至步驟 14 ;第一次讀取時,flag2=flag4 ; 步驟13、從flag2開始讀Size個數(shù)據(jù),flag2自增Size ;轉(zhuǎn)至步驟14。步驟14、判斷DMA傳輸是否結束,如果是,則退出本流程,否則,返回步驟I繼續(xù)循環(huán); 寫緩沖區(qū)方處理流程 寫緩沖方從flag4開始不斷向緩沖區(qū)寫入數(shù)據(jù),并根據(jù)讀緩沖方發(fā)來的flag2的位置,確保寫緩沖位置不超過flag2。
2.如權利要求1所述的方法,其特征在于,該方法進一步包括確定連續(xù)傳輸過程中緩沖區(qū)的大小為以寫緩沖區(qū)方完成一次數(shù)據(jù)采集和處理操作周期T1為基礎,開辟的緩沖區(qū)大小為10 X T1,單位為系統(tǒng)的數(shù)據(jù)位寬。
全文摘要
本發(fā)明公開了一種長時間連續(xù)DMA傳輸?shù)木彌_區(qū)管理方法,該方法支持緩沖區(qū)的讀方和寫方循環(huán)且長時間使用該緩沖區(qū),不會產(chǎn)生數(shù)據(jù)覆蓋或使用效率不高問題。將以寫緩沖區(qū)方完成一次數(shù)據(jù)采集和處理操作周期T1為基礎,開辟的緩沖區(qū)大小為10×T1;定義緩沖區(qū)的3個標志位,flag1為寫數(shù)據(jù)的當前位置,flag2為讀數(shù)據(jù)的當前位置,flag4為緩沖區(qū)的開始位置。寫緩沖區(qū)方從flag4開始持續(xù)寫緩沖區(qū),寫位置不能超過flag2;在讀過程中,讀緩沖區(qū)方定期查詢緩沖區(qū)內(nèi)當前可讀的數(shù)據(jù)量,當根據(jù)flag1和flag2之間的差距判定緩沖區(qū)內(nèi)未讀數(shù)據(jù)已經(jīng)達到Size,便從緩沖區(qū)中連續(xù)讀取Size個數(shù)據(jù)。
文檔編號G06F9/44GK103064679SQ201210572379
公開日2013年4月24日 申請日期2012年12月25日 優(yōu)先權日2012年12月25日
發(fā)明者張偉楠, 許崴稚, 鄒璞, 儲艷麗, 楊立杰, 史雄偉 申請人:北京航天測控技術有限公司