两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

長(zhǎng)時(shí)間連續(xù)dma傳輸?shù)木彌_區(qū)管理的軟件實(shí)現(xiàn)方法

文檔序號(hào):6385426閱讀:282來(lái)源:國(guó)知局
專利名稱:長(zhǎng)時(shí)間連續(xù)dma傳輸?shù)木彌_區(qū)管理的軟件實(shí)現(xiàn)方法
技術(shù)領(lǐng)域
本發(fā)明屬于數(shù)據(jù)采集領(lǐng)域,特別涉及一種長(zhǎng)時(shí)間連續(xù)的DMA傳輸?shù)木彌_區(qū)管理的軟件實(shí)現(xiàn)方法。
背景技術(shù)
DMA (Direct Memory Access,直接內(nèi)存存取)是現(xiàn)代計(jì)算機(jī)的重要特色,被廣泛用于數(shù)據(jù)采集領(lǐng)域。DMA是一種硬件機(jī)制,它允許外圍設(shè)備和主內(nèi)存之間直接傳輸它們的I/O數(shù)據(jù),而不需要系統(tǒng)處理器的參與。使用DMA傳輸機(jī)制可以大大提高與設(shè)備通信的吞吐量。緩沖區(qū)是計(jì)算機(jī)內(nèi)存中用于存放采樣數(shù)據(jù)的臨時(shí)存儲(chǔ)區(qū),緩沖區(qū)從計(jì)算機(jī)內(nèi)存中分配出來(lái),對(duì)于連續(xù)的DMA傳輸過(guò)程中,儀器設(shè)備可能一直連續(xù)工作,需傳輸?shù)臄?shù)據(jù)量不斷增加,一次性開辟緩沖區(qū)是不可能滿足需求的。而且重復(fù)循環(huán)讀寫一塊緩沖區(qū),還有可能會(huì)因?yàn)樽x寫速率的不一致產(chǎn)生數(shù)據(jù)覆蓋的或使用效率不高的問(wèn)題。

發(fā)明內(nèi)容
有鑒于此,本發(fā)明提出了一種長(zhǎng)時(shí)間連續(xù)DMA傳輸?shù)木彌_區(qū)管理方法,一次性開辟緩沖區(qū)大小,緩沖區(qū)的讀方和寫方循環(huán)且長(zhǎng)時(shí)間使用該緩沖區(qū),長(zhǎng)時(shí)間讀寫不會(huì)產(chǎn)生數(shù)據(jù)覆蓋或使用效率不高問(wèn)題,以滿足用戶長(zhǎng)時(shí)間DMA使用的需求。為了解決上述技術(shù)問(wèn)題,本發(fā)明是這樣實(shí)現(xiàn)的一種長(zhǎng)時(shí)間連續(xù)DMA傳輸?shù)木彌_區(qū)管理方法,包括如下步驟首先定義如下參數(shù)preDMA_sta為DMA傳輸過(guò)程中上一次寫到的數(shù)據(jù)量,初始值為O ;curDMA_sta為DMA傳輸過(guò)程中實(shí)際已寫的數(shù)據(jù)量,初始值為O ; curDMA_sta和preDMA_sta采用相同位數(shù)的無(wú)符號(hào)整形;DMAtemp為中間變量,初始值為O ;LsLoop為緩沖區(qū)被循環(huán)的次數(shù),初始值為O ;當(dāng)curDMA_sta溢出后,LsLoop被清零;Rtime為緩沖區(qū)被Size大小分塊讀的次數(shù),初始值為O;當(dāng)讀操作跨越了緩沖區(qū)的首尾時(shí),Rtime被清零;Max為curDMA_sta在不溢出情況下的最大值;Rtemp為中間變量,記錄數(shù)據(jù)類型溢出時(shí),緩沖區(qū)已被塊讀過(guò)的次數(shù),初始值為O ;Datatemp為中間變量,初始值為O,記錄讀操作跨越緩沖區(qū)首尾時(shí),從緩沖區(qū)首部讀取的數(shù)據(jù)量;flag2表示每次從緩沖區(qū)中讀數(shù)據(jù)的起始位置;flag4為緩沖區(qū)的初始地址;設(shè)定緩沖區(qū)的大小為L(zhǎng)Size,每次讀數(shù)據(jù)的個(gè)數(shù)為Size, Size<LSize ;讀緩沖區(qū)方處理流程包括如下步驟f 14 ;
步驟1、DMA傳輸開始后,讀緩沖區(qū)方查詢當(dāng)前緩沖區(qū)已寫數(shù)據(jù)量curDMA_sta ;該curDMA_sta從寫緩沖區(qū)方的硬件獲得;步驟2、判斷上次寫到的數(shù)據(jù)量preDMA_Sta是否大于實(shí)際已寫數(shù)據(jù)量curDMA_sta ;如果是,則執(zhí)行步驟3,否則,執(zhí)行步驟Γ8 ;步驟3、判定curDMA_Sta數(shù)據(jù)類型溢出,計(jì)算當(dāng)前緩沖區(qū)中未被讀取的數(shù)據(jù)量DMAtemp=Max+curDMA_sta-preDMA_sta ;并且更新 LsLoop=O, Rtemp=Rtime ;執(zhí)行步驟 9。步驟4、判定curDMA_Sta數(shù)據(jù)類型未溢出,計(jì)算當(dāng)前緩沖區(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ù)達(dá)到Size,則執(zhí)行步驟10 ;否則,返回步驟I ;步驟10、令 preDMA_sta=curDMA_sta,且令 Rtime 自加 I ;步驟11、計(jì)算下一次讀的起始地址flag2+Size是否大于LSize ;如果是,則執(zhí)行步驟12;否則,執(zhí)行步驟13;
步驟12、先從flag2開始讀Lsize-Datatemp-RtimeXSize個(gè)數(shù)據(jù),再?gòu)木彌_區(qū)初始地址 flag4 讀取 Size- (Lsize-Datatemp-RtimeX Size)個(gè)數(shù)據(jù),將 Datatemp 賦值為 Size- (Lsize-Datatemp-RtimeX Size);然后令 LsLoop 自加 I,更新 Rtime=O, flag2=flag4+[Size- (Lsize-Datatemp-RtimeX Size)],轉(zhuǎn)至步驟 14 ;第一次讀取時(shí),flag2=flag4 ;步驟13、從flag2開始讀Size個(gè)數(shù)據(jù),flag2自增Size ;轉(zhuǎn)至步驟14。步驟14、判斷DMA傳輸是否結(jié)束,如果是,則退出本流程,否則,返回步驟I繼續(xù)循環(huán);寫緩沖區(qū)方處理流程寫緩沖方從flag4開始不斷向緩沖區(qū)寫入數(shù)據(jù),并根據(jù)讀緩沖方發(fā)來(lái)的flag2的位置,確保寫緩沖位置不超過(guò)flag2。綜上,本發(fā)明提出了一種長(zhǎng)時(shí)間連續(xù)采集的DMA緩沖區(qū)管理方法。該方法的有益效果是,具有通用性,適用任意數(shù)據(jù)量的DMA傳輸應(yīng)用;具有靈活性,降低DMA傳輸應(yīng)用對(duì)計(jì)算機(jī)配置的依賴;緩沖區(qū)循環(huán)使用,可滿足用戶長(zhǎng)時(shí)間DMA使用的需求。此外,本發(fā)明還考慮到了溢出問(wèn)題,采用絕對(duì)位置計(jì)算讀寫位置,提高了整個(gè)連續(xù)傳輸過(guò)程的穩(wěn)定性。


圖1為DMA傳輸緩沖區(qū)讀寫示意圖。圖2為本發(fā)明緩沖區(qū)讀操作流程圖。
具體實(shí)施例方式本發(fā)明為實(shí)現(xiàn)上述目的,采用如下技術(shù)方案本發(fā)明有三個(gè)技術(shù)點(diǎn)
1、連續(xù)傳輸過(guò)程中緩沖區(qū)大小的確定由于DMA數(shù)據(jù)傳輸過(guò)程中,若寫緩沖區(qū)的速度很快,緩沖區(qū)開辟不夠大,則容易造成寫緩沖區(qū)方中用于存儲(chǔ)數(shù)據(jù)的FIFO溢出,使寫緩沖區(qū)方儀器工作異常;若緩沖區(qū)開辟過(guò)大,在內(nèi)存和硬盤之間產(chǎn)生過(guò)量的讀寫操作時(shí),會(huì)對(duì)系統(tǒng)性能造成影響。為了保證寫緩沖區(qū)方FIFO中存儲(chǔ)的數(shù)據(jù)能夠在溢出前被傳輸?shù)紻MA緩沖區(qū)內(nèi),本發(fā)明以寫緩沖區(qū)方完成一次數(shù)據(jù)采集和處理操作周期Tl為基礎(chǔ),將該時(shí)間乘以10,將10XT1假定為寫緩沖區(qū)方向緩沖區(qū)進(jìn)行寫操作的周期的上限,則開辟的緩沖區(qū)大小為10XTl,單位為系統(tǒng)數(shù)據(jù)位寬。例如系統(tǒng)讀寫數(shù)據(jù)位寬為32位字節(jié),則這里單位為32位字節(jié)。通過(guò)合理的緩沖區(qū)大小,在不同的寫緩沖區(qū)速率的情況下,能保證向緩沖區(qū)內(nèi)讀數(shù)據(jù)速度比寫速度快,而且不造成內(nèi)存空間的浪費(fèi)。2、保證緩沖區(qū)循環(huán)使用對(duì)于長(zhǎng)時(shí)間連續(xù)運(yùn)行的DMA傳輸,需要實(shí)現(xiàn)緩沖區(qū)的循環(huán)使用,即不斷的寫、讀同一塊緩沖區(qū)。若寫和讀之間沒(méi)有約束,有可能寫的速度過(guò)快,還沒(méi)有來(lái)得及把緩沖區(qū)中的數(shù)據(jù)讀走,寫就將先前的寫數(shù)據(jù)覆蓋了 ;若讀的過(guò)快,緩沖區(qū)中寫數(shù)據(jù)未來(lái)得及更新,讀走的可能是以往的數(shù)據(jù);同時(shí),在緩沖區(qū)循環(huán)使用時(shí),若讀、寫完設(shè)定大小的緩沖區(qū)后,不能重新讀、寫緩沖區(qū),也會(huì)造成錯(cuò)誤。這三種情況下,數(shù)據(jù)傳輸?shù)慕Y(jié)果都是不可靠的。因此應(yīng)當(dāng)制定合理的緩沖區(qū)循環(huán)使用的方法,以確保長(zhǎng)時(shí)間連續(xù)的DMA傳輸?shù)恼_性、可靠性。參見圖1,設(shè)計(jì)的方法如下設(shè)定緩沖區(qū)的大小為L(zhǎng)Size,每次讀數(shù)據(jù)的個(gè)數(shù)為Size, Size<LSize,并在緩沖區(qū)中設(shè)置3個(gè)標(biāo)志位flagl、flag2、flag4,其中,flagl表示寫數(shù)據(jù)的當(dāng)前位置,flag2表示讀數(shù)據(jù)的當(dāng)前位置,flag4表示緩沖區(qū)的開始位置。為了提高緩沖區(qū)利用率,寫緩沖區(qū)方和讀緩沖區(qū)方均根據(jù)上述標(biāo)識(shí)位進(jìn)行讀寫操作寫緩沖區(qū)方從flag4開始持續(xù)寫緩沖區(qū);在寫過(guò)程中,flagl不斷變化,但不能超過(guò)flag2,否則將覆蓋未讀數(shù)據(jù)。讀緩沖區(qū)方每Size個(gè)數(shù)據(jù)塊讀緩沖區(qū)一次。在讀過(guò)程中,讀緩沖區(qū)方定期查詢緩沖區(qū)內(nèi)當(dāng)前可讀的數(shù)據(jù)量,當(dāng)根據(jù)flagl和flag2之間的差距判定緩沖區(qū)內(nèi)未讀數(shù)據(jù)已經(jīng)達(dá)到Size,則讀緩沖區(qū)方便可從緩沖區(qū)中連續(xù)讀取Size個(gè)數(shù)據(jù)。在寫緩沖區(qū)過(guò)程中,當(dāng)達(dá)到緩沖區(qū)的最大地址時(shí),將調(diào)過(guò)頭來(lái)從初始地址flag4重新寫緩沖區(qū),在讀緩沖區(qū)過(guò)程中,讀數(shù)據(jù)地址達(dá)到最大地址時(shí),也會(huì)調(diào)過(guò)頭來(lái)從初始地址flag4開始讀,依次反復(fù)實(shí)現(xiàn)連續(xù)的DMA傳輸,緩沖區(qū)實(shí)現(xiàn)循環(huán)利用。3、保證長(zhǎng)時(shí)間連續(xù)傳輸能夠保證在循環(huán)過(guò)程中flagl、flag2的位置相應(yīng)位置關(guān)系可靠是非常重要的。但是這三個(gè)量均在緩沖區(qū)中的相對(duì)位置量,容易產(chǎn)生計(jì)算失誤。因此如果能采用絕對(duì)位置去實(shí)時(shí)更新相對(duì)位置,將會(huì)提高整個(gè)連續(xù)傳輸過(guò)程的穩(wěn)定性。在這2個(gè)位置中,flag2可以從flag4開始起算,每讀一次增加Size,但是flagl的更新需要依賴實(shí)際向緩沖區(qū)寫了多少數(shù),也就是DMA傳輸過(guò)程中已寫的數(shù)據(jù)量curDMA_sta,該數(shù)據(jù)量可以由寫緩沖區(qū)方的硬件告知的,每次通過(guò)這個(gè)數(shù)判定flagl的真實(shí)位置。但是,在記錄數(shù)據(jù)量的過(guò)程中,由于定義數(shù)據(jù)量的數(shù)據(jù)類型可能是16位整形,也可能是32位整形,由于長(zhǎng)時(shí)間傳輸,數(shù)據(jù)量很大(可能趨向正無(wú)窮),因此需要記錄的數(shù)據(jù)量達(dá)到溢出邊沿時(shí),需重新記錄。curDMA_sta也就會(huì)出現(xiàn)同樣的問(wèn)題,假設(shè)curDMA_sta為32位無(wú)符號(hào)整形,最大可記錄4294967296個(gè)數(shù),當(dāng)傳輸?shù)臄?shù)據(jù)個(gè)數(shù)超過(guò)4294967296時(shí),就會(huì)溢出。此時(shí),當(dāng)判斷curDMA_sta達(dá)到4294967296時(shí),需要重零開始記錄數(shù)據(jù),此時(shí)根據(jù)curDMA_sta確flagl的位置時(shí),需要特殊考慮。基于上述3點(diǎn),下面針對(duì)讀緩沖區(qū)方和寫緩沖區(qū)方的具體流程進(jìn)行描述。首先定義如下參數(shù)preDMA_sta為DMA傳輸過(guò)程中上一次寫到的數(shù)據(jù)量,初始值為O ;curDMA_sta為DMA傳輸過(guò)程中實(shí)際已寫的數(shù)據(jù)量,初始值為O ; curDMA_sta和preDMA_sta采用相同位數(shù)的無(wú)符號(hào)整形,本實(shí)施例中,被定義為32位無(wú)符號(hào)整型;DMAtemp為中間變量,初始值為O ;LsLoop為緩沖區(qū)被循環(huán)的次數(shù),初始值為O ;當(dāng)curDMA_sta溢出后,LsLoop應(yīng)當(dāng)
被清零;Rtime為緩沖區(qū)被Size大小分塊讀的次數(shù),初始值為O;當(dāng)讀操作跨越了緩沖區(qū)的首尾時(shí),Rtime被清零;4294967295為curDMA_sta被定義為32位無(wú)符號(hào)整型的最大值;Rtemp為中間變量,記錄數(shù)據(jù)類型溢出時(shí),緩沖區(qū)已被塊讀過(guò)的次數(shù),初始值為O。Datatemp為中間變量,初始值為O,記錄讀操作跨越緩沖區(qū)首尾時(shí),從緩沖區(qū)首部讀取的數(shù)據(jù)量。讀緩沖區(qū)方處理流程,參見圖2 :步驟1、DMA傳輸開始后,讀緩沖區(qū)方查詢當(dāng)前緩沖區(qū)已寫數(shù)據(jù)量curDMA_sta。curDMA_sta從寫緩沖區(qū)方的硬件獲得,是一個(gè)準(zhǔn)確的數(shù)據(jù)。步驟2、判斷上次寫到的數(shù)據(jù)量preDMA_Sta是否大于實(shí)際已寫數(shù)據(jù)量curDMA_sta ;如果是,則執(zhí)行步驟3,否則,執(zhí)行步驟4 8。上次寫到的數(shù)據(jù)量preDMA_sta是在每次讀操作時(shí)被更新的,由于DMA讀寫操作是同時(shí)的,而且很快,因此所述更新是將curDMA_sta的值賦給preDMA_sta。因此,在正常情況下,preDMA_sta=curDMA_sta,但是當(dāng)curDMA_sta溢出時(shí),而preDMA_sta還未被更新時(shí),就會(huì)出現(xiàn)preDMA_sta較大的情況,此時(shí)由于curDMA_sta的溢出,將導(dǎo)致后續(xù)計(jì)算上需要特殊處理,因此這里分情況討論。當(dāng)preDMA_sta被再次賦予curDMA_sta的值后,preDMA_sta又會(huì)恢復(fù)與curDMA_sta相等了。步驟3、判定curDMA_sta數(shù)據(jù)類型溢出,計(jì)算當(dāng)前緩沖區(qū)中未被讀取的數(shù)據(jù)量DMAtemp=4294967295+curDMA_sta-preDMA_sta ;并且更新 LsLoop=O, Rtemp=Rtime ;執(zhí)行步驟9。從本步驟可以看出,該分支中DMAtemp記載的是緩沖區(qū)中未被讀取的數(shù)據(jù)量,不是一個(gè)數(shù)據(jù)所在位置的相對(duì)量,而是未被讀取數(shù)據(jù)的絕對(duì)量,不考慮其位置。Rtemp記載的是數(shù)據(jù)溢出時(shí)Rtime的值。步驟4、判定curDMA_Sta數(shù)據(jù)類型未溢出,計(jì)算當(dāng)前緩沖區(qū)中已寫的數(shù)據(jù)量DMAtemp=curDMA_sta,執(zhí)行步驟 5 ;本步驟中DMAtemp的含義與步驟3不同,其記載的是溢出之前,共寫入了多少數(shù)據(jù),是一個(gè)絕對(duì)量,其包含了已讀和未讀的數(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表明了幾種情況①?gòu)牟襟E5直接到步驟9,在緩沖區(qū)的循環(huán)讀取過(guò)程中,還未出現(xiàn)溢出,此時(shí)保持Rtemp=O,進(jìn)入步驟9 ;②從步驟5經(jīng)歷步驟6、7到步驟9,在緩沖區(qū)的循環(huán)讀取過(guò)程中,剛剛出現(xiàn)了溢出,而且上一次讀取操作跨越了緩沖區(qū)首尾,因此Rtemp應(yīng)該被更新為0,進(jìn)入步驟9 ;③從步驟5經(jīng)歷步驟6、8到步驟9,在緩沖區(qū)的循環(huán)讀取過(guò)程中,剛剛出現(xiàn)了溢出,而且上一次讀取操作還未從緩沖區(qū)尾部循環(huán)到緩沖區(qū)首部,因此Rtemp值應(yīng)保持為溢出時(shí)的Rtime值,進(jìn)入步驟9 ;步驟9、判斷是否滿足(DMAtemp-LsizeXLsLoop) ^ (Rtime-Rtemp+1) XSize,如果是,則確定緩沖區(qū)中的數(shù)據(jù)達(dá)到Size,則執(zhí)行步驟10 ;否則,返回步驟1,以等待寫數(shù)據(jù)量的增加。 本步驟的判斷公式適用于curDMA_sta溢出和未溢出兩種情況當(dāng)curDMA_sta 溢出時(shí),(DMAtemp-LsizeXLsLoop)中的 LsLoop 被清零,因此其計(jì)算的是未被讀取的數(shù)據(jù)量;而(Rtime-Rtemp+1) X Size中的Rtime=Rtemp,則(Rtime-Rtemp+1) XSize=Size,因此其計(jì)算出的是一個(gè)Size的量,那么本步驟是判斷當(dāng)前未被讀取的數(shù)據(jù)量是否達(dá)到Size。當(dāng)curDMA_sta未溢出時(shí),不等式左側(cè)(DMAtemp-Lsize X LsLoop)計(jì)算的是寫數(shù)據(jù)實(shí)際到達(dá)緩沖區(qū)哪個(gè)位置,不等式右側(cè)計(jì)算的是之前讀取到的最后位置加上一個(gè)Size。那么本步驟也是判斷當(dāng)前未被讀取的數(shù)據(jù)量是否達(dá)到Size。步驟10、令 preDMA_sta=curDMA_sta,且令 Rtime 自加 I。Rtime 的值是從 O 開始的,因此在真正讀之前將Rtime加I。步驟11、計(jì)算下一次讀的起始地址flag2+Size是否大于LSize ;如果是,則說(shuō)明當(dāng)前待讀數(shù)據(jù)塊跨越了緩沖區(qū)的首尾,屬于圖1 (d)的情況,執(zhí)行步驟12 ;否則,執(zhí)行步驟13。步驟12、先從flag2開始讀Lsize-Datatemp-RtimeXSize個(gè)數(shù)據(jù),再?gòu)木彌_區(qū)初始地址 flag4 讀取 Size- (Lsize-Datatemp-RtimeX Size)個(gè)數(shù)據(jù),將 Datatemp 賦值為 Size-(Lsize-Datatemp-RtimeXSize),從而實(shí)現(xiàn)了整個(gè)數(shù)據(jù)塊的讀?。蝗缓罅頛sLoop自加I,更新 Rtime=O, flag2=flag4+[Size- (Lsize-Datatemp-RtimeXSize)],轉(zhuǎn)至步驟 14 ;第一次讀取時(shí),flag2=flag4。步驟13、從flag2開始讀Size個(gè)數(shù)據(jù),flag2自增Size ;轉(zhuǎn)至步驟14。步驟14、判斷DMA傳輸是否結(jié)束,如果是,則退出本流程,否則,返回步驟I。寫緩沖區(qū)方處理流程寫緩沖方不斷向緩沖區(qū)寫入數(shù)據(jù),并根據(jù)讀緩沖方發(fā)來(lái)的flag2的位置,確保寫緩沖位置不超過(guò)flag2。綜上所述,以上僅為本發(fā)明的較佳實(shí)施例而已,并非用于限定本發(fā)明的保護(hù)范圍。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種長(zhǎng)時(shí)間連續(xù)DMA傳輸?shù)木彌_區(qū)管理方法,其特征在于,包括 首先定義如下參數(shù) preDMA_sta為DMA傳輸過(guò)程中上一次寫到的數(shù)據(jù)量,初始值為O ;curDMA_sta為DMA傳輸過(guò)程中實(shí)際已寫的數(shù)據(jù)量,初始值為O ;curDMA_sta和preDMA_sta采用相同位數(shù)的無(wú)符號(hào)整形; DMAtemp為中間變量,初始值為O ; LsLoop為緩沖區(qū)被循環(huán)的次數(shù),初始值為O ;當(dāng)curDMA_sta溢出后,LsLoop被清零;Rtime為緩沖區(qū)被Size大小分塊讀的次數(shù),初始值為O ;當(dāng)讀操作跨越了緩沖區(qū)的首尾時(shí),Rtime被清零; Max為curDMA_sta在不溢出情況下的最大值; Rtemp為中間變量,記錄數(shù)據(jù)類型溢出時(shí),緩沖區(qū)已被塊讀過(guò)的次數(shù),初始值為O ;Datatemp為中間變量,初始值為0,記錄讀操作跨越緩沖區(qū)首尾時(shí),從緩沖區(qū)首部讀取的數(shù)據(jù)量; flag2表示每次從緩沖區(qū)中讀數(shù)據(jù)的起始位置; flag4為緩沖區(qū)的初始地址; 設(shè)定緩沖區(qū)的大小為L(zhǎng)Size,每次讀數(shù)據(jù)的個(gè)數(shù)為Size, Size<LSize ; 讀緩沖區(qū)方處理流程包括如下步驟廣14 ; 步驟1、0祖?zhèn)鬏旈_始后,讀緩沖區(qū)方查詢當(dāng)前緩沖區(qū)已寫數(shù)據(jù)量(311^)祖_^&;該curDMA_sta從寫緩沖區(qū)方的硬件獲得; 步驟2、判斷上次寫到的數(shù)據(jù)量preDMA_Sta是否大于實(shí)際已寫數(shù)據(jù)量CurDMA_Sta ;如果是,則執(zhí)行步驟3,否則,執(zhí)行步驟Γ8 ; 步驟3、判定curDMA_sta數(shù)據(jù)類型溢出,計(jì)算當(dāng)前緩沖區(qū)中未被讀取的數(shù)據(jù)量DMAtemp=Max+curDMA_sta-preDMA_sta ;并且更新 LsLoop=O, Rtemp=Rtime ;執(zhí)行步驟 9。
步驟4、判定curDMA_Sta數(shù)據(jù)類型未溢出,計(jì)算當(dāng)前緩沖區(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ù)達(dá)到Size,則執(zhí)行步驟10 ;否則,返回步驟I ; 步驟 10、令 preDMA_sta=curDMA_sta,且令 Rtime 自加 I ; 步驟11、計(jì)算下一次讀的起始地址flag2+Size是否大于LSize ;如果是,則執(zhí)行步驟12;否則,執(zhí)行步驟13; 步驟12、先從flag2開始讀Lsize-Datatemp-RtimeXSize個(gè)數(shù)據(jù),再?gòu)木彌_區(qū)初始地址 flag4 讀取 Size- (Lsize-Datatemp-Rtime X Size)個(gè)數(shù)據(jù),將 Datatemp 賦值為 Size-(Lsize-Datatemp-RtimeX Size);然后令 LsLoop 自加 I,更新 Rtime=O, flag2=flag4+[Size-(Lsize-Datatemp-RtimeX Size)],轉(zhuǎn)至步驟 14 ;第一次讀取時(shí),flag2=flag4 ; 步驟13、從flag2開始讀Size個(gè)數(shù)據(jù),flag2自增Size ;轉(zhuǎn)至步驟14。步驟14、判斷DMA傳輸是否結(jié)束,如果是,則退出本流程,否則,返回步驟I繼續(xù)循環(huán); 寫緩沖區(qū)方處理流程 寫緩沖方從flag4開始不斷向緩沖區(qū)寫入數(shù)據(jù),并根據(jù)讀緩沖方發(fā)來(lái)的flag2的位置,確保寫緩沖位置不超過(guò)flag2。
2.如權(quán)利要求1所述的方法,其特征在于,該方法進(jìn)一步包括確定連續(xù)傳輸過(guò)程中緩沖區(qū)的大小為以寫緩沖區(qū)方完成一次數(shù)據(jù)采集和處理操作周期T1為基礎(chǔ),開辟的緩沖區(qū)大小為10 X T1,單位為系統(tǒng)的數(shù)據(jù)位寬。
全文摘要
本發(fā)明公開了一種長(zhǎng)時(shí)間連續(xù)DMA傳輸?shù)木彌_區(qū)管理方法,該方法支持緩沖區(qū)的讀方和寫方循環(huán)且長(zhǎng)時(shí)間使用該緩沖區(qū),不會(huì)產(chǎn)生數(shù)據(jù)覆蓋或使用效率不高問(wèn)題。將以寫緩沖區(qū)方完成一次數(shù)據(jù)采集和處理操作周期T1為基礎(chǔ),開辟的緩沖區(qū)大小為10×T1;定義緩沖區(qū)的3個(gè)標(biāo)志位,flag1為寫數(shù)據(jù)的當(dāng)前位置,flag2為讀數(shù)據(jù)的當(dāng)前位置,flag4為緩沖區(qū)的開始位置。寫緩沖區(qū)方從flag4開始持續(xù)寫緩沖區(qū),寫位置不能超過(guò)flag2;在讀過(guò)程中,讀緩沖區(qū)方定期查詢緩沖區(qū)內(nèi)當(dāng)前可讀的數(shù)據(jù)量,當(dāng)根據(jù)flag1和flag2之間的差距判定緩沖區(qū)內(nèi)未讀數(shù)據(jù)已經(jīng)達(dá)到Size,便從緩沖區(qū)中連續(xù)讀取Size個(gè)數(shù)據(jù)。
文檔編號(hào)G06F9/44GK103064679SQ201210572379
公開日2013年4月24日 申請(qǐng)日期2012年12月25日 優(yōu)先權(quán)日2012年12月25日
發(fā)明者張偉楠, 許崴稚, 鄒璞, 儲(chǔ)艷麗, 楊立杰, 史雄偉 申請(qǐng)人:北京航天測(cè)控技術(shù)有限公司
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
依兰县| 监利县| 分宜县| 衢州市| 叙永县| 安宁市| 航空| 台南市| 惠州市| 岐山县| 尼勒克县| 灵宝市| 龙山县| 哈尔滨市| 宁德市| 建阳市| 马关县| 方城县| 兴义市| 军事| 平原县| 凤凰县| 德钦县| 黑龙江省| 富民县| 谢通门县| 阳信县| 浦城县| 天镇县| 东宁县| 泰州市| 唐河县| 七台河市| 姜堰市| 堆龙德庆县| 秦皇岛市| 乐业县| 孟村| 盱眙县| 玉龙| 威信县|