国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種PCIe設(shè)備與主機(jī)之間的多路有序數(shù)據(jù)傳輸方法與流程

      文檔序號(hào):11286204閱讀:679來源:國知局
      一種PCIe設(shè)備與主機(jī)之間的多路有序數(shù)據(jù)傳輸方法與流程

      本發(fā)明涉及數(shù)據(jù)通訊技術(shù)領(lǐng)域,具體而言,涉及一種pcie設(shè)備與主機(jī)之間的多路有序數(shù)據(jù)傳輸方法。



      背景技術(shù):

      pcie(pci-express)是最新的總線和接口標(biāo)準(zhǔn),越來越多的外置高速設(shè)備(如顯卡、視頻加速卡和千兆網(wǎng)卡)都使用pcie接口與主機(jī)通信。這些通過pcie接口與主機(jī)通信的外置高速設(shè)備被統(tǒng)稱為pcie設(shè)備。其中最為人熟知的就是顯卡(顯示接口卡)。顯卡與主機(jī)之間會(huì)以dma(directmemoryaccess)方式進(jìn)行大量連續(xù)數(shù)據(jù)的傳輸,并且隨著顯卡的性能越來越高,能夠同時(shí)處理的圖形圖像會(huì)更多,必然增加pcie接口帶寬的需求和增加大量有序數(shù)據(jù)的并發(fā)傳輸路數(shù)。除了顯卡之外,視頻加速卡當(dāng)前也被視頻網(wǎng)站大量地使用。當(dāng)前網(wǎng)絡(luò)上的視頻越來越多,大型的視頻網(wǎng)站也越來越多,例如youtube、優(yōu)酷等網(wǎng)站。每一分鐘在線觀看視頻的人數(shù)就達(dá)好幾億,為了進(jìn)一步加快視頻的解碼速度和壓縮速度,越來越多的網(wǎng)絡(luò)視頻提供商在服務(wù)器上增加視頻加速卡,以加快和并發(fā)上千路視頻的編解碼。當(dāng)前的視頻加速卡和顯卡一樣大多是使用pcie接口與服務(wù)器主機(jī)相聯(lián)。由于視頻加速卡需要并發(fā)多路甚至上千路視頻編解碼,為了視頻的正常解碼和編碼,要求同一路視頻的數(shù)據(jù)必須有序,同時(shí)還要求達(dá)到最大的解碼性能和最大的pcie帶寬使用率。一般的視頻加速卡解碼過程是,服務(wù)器主機(jī)將多路編碼流數(shù)據(jù)通過pcie以dma的方式發(fā)送到視頻加速卡,然后視頻加速卡將編碼流解碼之后獲得yuv(一種顏色編碼方法),并將多路yuv通過pcie以dma方式回傳到主機(jī)。傳輸過程中,yuv和碼流在同一路中必須有序,否則會(huì)導(dǎo)致碼流不能正常被解碼,yuv不能被后續(xù)的加工(聚類或者播放等)正常處理。一般的視頻加速卡編碼過程是,服務(wù)器將多路yuv通過pcie以dma方式傳送到視頻加速卡,然后視頻加速卡將yuv進(jìn)行編碼,并將編碼之后的碼流通過pcie以dma方式回傳到主機(jī)。傳輸過程中,yuv和碼流在同一路中必須有序,否則會(huì)導(dǎo)致碼流不能正常被解碼或者不能正常有序播放。無論是編碼數(shù)據(jù)還是yuv數(shù)據(jù)的傳輸過程都由dma控制器完成,dma控制器將主機(jī)dmabuffer中的數(shù)據(jù)拷貝到視頻加速卡上的dmabuffer,或者將視頻加速卡上的dmabuffer拷貝到主機(jī)的dmabuffer。

      由于dma過程中數(shù)據(jù)長度不一致所以會(huì)導(dǎo)致前面dma操作可能會(huì)晚于后面的dma操作,如果要保證有序,一般的做法是需要完成了前面的dma操作,才進(jìn)行后面的dma操作,這樣就能夠保證傳送有序,但是會(huì)導(dǎo)致剩余dma通道空閑。即使剩余的dma通道被其他路的數(shù)據(jù)使用,也需要將dma通道和對(duì)應(yīng)的數(shù)據(jù)傳輸路進(jìn)行捆綁。如果其他路的數(shù)據(jù)并沒有使用該dma通道就換另一路捆綁,為了讓所有dma通道能夠有效被利用,傳統(tǒng)的方式需要一個(gè)dma通道捆綁很多路數(shù)據(jù)傳輸甚至上千路數(shù)據(jù)傳輸,這樣會(huì)導(dǎo)致數(shù)據(jù)傳輸?shù)墓芾韽?fù)雜,占用更多的資源、空間和時(shí)間。



      技術(shù)實(shí)現(xiàn)要素:

      本發(fā)明提供一種pcie設(shè)備與主機(jī)之間的多路有序數(shù)據(jù)傳輸方法,用以降低pcie設(shè)備與主機(jī)之間數(shù)據(jù)傳輸管理的復(fù)雜度和多余的資源消耗。

      為了達(dá)到上述目的,本發(fā)明提供了一種pcie設(shè)備與主機(jī)之間的多路有序數(shù)據(jù)傳輸方法,該方法用于傳輸pcie設(shè)備與主機(jī)之間的多路有序數(shù)據(jù),其中,pcie設(shè)備和主機(jī)均設(shè)有源數(shù)據(jù)dmabuffer單元和目的數(shù)據(jù)dmabuffer單元,pcie設(shè)備的源數(shù)據(jù)dmabuffer單元包括多個(gè)用于緩存發(fā)送端欲發(fā)送的數(shù)據(jù)的dmabuffera1~an,pcie設(shè)備的目的數(shù)據(jù)dmabuffer單元包括多個(gè)用于緩存接收端接收到的數(shù)據(jù)的dmabufferb1~bn,主機(jī)的目的數(shù)據(jù)dmabuffer單元包括多個(gè)用于接收端接收到的數(shù)據(jù)的dmabuffera1′~an′,主機(jī)的源數(shù)據(jù)dmabuffer單元包括多個(gè)用于緩存發(fā)送端發(fā)送的數(shù)據(jù)的dmabufferb1′~bn′,其中,dmabuffera1~an與dmabuffera1′~an′依次對(duì)應(yīng)以構(gòu)成n個(gè)dmabuffer對(duì)“db1~dbn”,dmabufferb1~bn與dmabufferb1′~bn′依次對(duì)應(yīng)以構(gòu)成n個(gè)dmabuffer對(duì)“db1′~dbn′”,每個(gè)dmabuffer對(duì)均對(duì)應(yīng)設(shè)置有一同步管理單元,每一同步管理單元中均設(shè)有一緩存狀態(tài)指針p1和一緩存數(shù)據(jù)長度指針p2,每一同步管理單元中均具有本地dmabuffer地址存儲(chǔ)器以及遠(yuǎn)程dmabuffer地址存儲(chǔ)器,分別用于存儲(chǔ)對(duì)應(yīng)的發(fā)送端dmabuffer的地址和接收端dmabuffer的地址,pcie設(shè)備端設(shè)有指示db1~dbn狀態(tài)的指針freepointer1、usedpointer1和donepointer1,主機(jī)端設(shè)有指示db1′~dbn′狀態(tài)的指針freepointer2、usedpointer2和donepointer2,于一次數(shù)據(jù)傳輸過程中,dma操作端位于pcie設(shè)備端或主機(jī)端,當(dāng)由發(fā)送端向接收端傳輸p路數(shù)據(jù)n1~np時(shí),其中,每路數(shù)據(jù)均包括np1~npm共m個(gè)數(shù)據(jù)段,其中1≤p≤p且p為整數(shù),若pcie設(shè)備作為發(fā)送端,主機(jī)作為接收端,該方法包括以下步驟:

      s1:初始狀態(tài)下,dmabuffera1~an和dmabuffera1′~an′均為“free”狀態(tài),也即,對(duì)于db1~dbn,均有*p1=free,以及*p2為零,freepointer1、usedpointer1和donepointer1均指向db1;

      【數(shù)據(jù)發(fā)送步驟】

      s2:發(fā)送端根據(jù)freepointer1的指向獲取到db1的控制權(quán),freepointer1轉(zhuǎn)而指向db2;

      s3:發(fā)送端令db1的*p1=allocated;

      s4:發(fā)送端將數(shù)據(jù)n11拷貝至dmabuffera1中,并令db1的*p1=used,以及*p2=數(shù)據(jù)n11的長度;

      s5:發(fā)送端根據(jù)freepointer1的指向獲取到db2的控制權(quán),freepointer1轉(zhuǎn)而指向db3;

      s6:發(fā)送端令db2的*p1=allocated;

      s7:發(fā)送端將數(shù)據(jù)n21拷貝至dmabuffera2中,并令db2的*p1=used,以及*p2=數(shù)據(jù)n21的長度;

      s8:發(fā)送端按照上述步驟s5~s7對(duì)p路數(shù)據(jù)中的第一個(gè)數(shù)據(jù)段依次執(zhí)行上述操作,直至p路數(shù)據(jù)均執(zhí)行完上述步驟或?qū)τ赿b1~dbn均有*p1=used,之后發(fā)送端再對(duì)每一路數(shù)據(jù)中的第2個(gè)~第m個(gè)數(shù)據(jù)段依次進(jìn)行數(shù)據(jù)發(fā)送;

      【dma步驟】

      s9:dma操作端根據(jù)usedpointer1的指向獲取到db1的控制權(quán),usedpointer1轉(zhuǎn)而指向db2;

      s10:dma操作端令db1的*p1=dmaing;

      s11:dma操作端獲得空閑的dma通道并對(duì)db1進(jìn)行dma操作,以將數(shù)據(jù)n11從dmabuffera1拷貝至dmabuffera1′;

      s12:dma操作端令db1的*p1=done;

      s13:dma操作端根據(jù)usedpointer1的指向獲取到db2的控制權(quán),usedpointer1轉(zhuǎn)而指向db3;

      s14:dma操作端令db2的*p1=dmaing;

      s15:dma操作端獲得空閑的dma通道并對(duì)db2進(jìn)行dma操作,以將數(shù)據(jù)n21從dmabuffera2拷貝至dmabuffera2′;

      s16:dma操作端令db2的*p1=done;

      s17:dma操作端按照上述步驟s13~s16對(duì)p路數(shù)據(jù)中的第一個(gè)數(shù)據(jù)段依次執(zhí)行上述操作,直至p路數(shù)據(jù)均執(zhí)行完上述步驟或?qū)τ赿b1~dbn均有*p1=done,之后dma操作端再對(duì)每一路數(shù)據(jù)中的第2個(gè)~第m個(gè)數(shù)據(jù)段依次進(jìn)行dma操作;

      【數(shù)據(jù)接收步驟】

      s18:接收端根據(jù)donepointer1的指向獲取到db1的控制權(quán),donepointer1轉(zhuǎn)而指向db2;

      s19:接收端令db1的*p1=reading;

      s20:接收端將dmabuffera1′中的數(shù)據(jù)n11傳輸?shù)缴蠈討?yīng)用;

      s21:接收端令db1的*p1=free;

      s22:接收端根據(jù)donepointer1的指向獲取到db2的控制權(quán),donepointer1轉(zhuǎn)而指向db3;

      s23:接收端令db2的*p1=reading;

      s24:接收端將dmabuffera2′中的數(shù)據(jù)n12傳輸?shù)缴蠈討?yīng)用;

      s25:接收端令db2的*p1=free;

      s26:接收端按照上述步驟s22~s25對(duì)p路數(shù)據(jù)中的第一個(gè)數(shù)據(jù)段依次執(zhí)行上述操作,直至p路數(shù)據(jù)均執(zhí)行完上述步驟或?qū)τ赿b1~dbn均有*p1=free,之后接收端再對(duì)每一路數(shù)據(jù)中的第2個(gè)~第m個(gè)數(shù)據(jù)段依次進(jìn)行數(shù)據(jù)接收操作;

      上述數(shù)據(jù)發(fā)送步驟、dma步驟和數(shù)據(jù)接收步驟同時(shí)進(jìn)行,其中:

      發(fā)送端按照db1、db2……dbn-1、dbn、db1、db2的順序?qū)崟r(shí)循環(huán)檢測freepointer1指向的dmabuffer對(duì)的狀態(tài)是否為“free”,若為“free”則將當(dāng)前等待寫入的數(shù)據(jù)寫入其對(duì)應(yīng)的發(fā)送端的dmabuffer,之后將該dmabuffer對(duì)標(biāo)記為“used”狀態(tài),以表示此dmabuffer對(duì)中的數(shù)據(jù)能夠執(zhí)行dma步驟,其中,當(dāng)一路數(shù)據(jù)中尚有數(shù)據(jù)段未完成數(shù)據(jù)發(fā)送時(shí),當(dāng)前等待寫入的數(shù)據(jù)為該路數(shù)據(jù)中的下一個(gè)數(shù)據(jù)段,直至p路數(shù)據(jù)中的每一個(gè)數(shù)據(jù)段均完成數(shù)據(jù)發(fā)送步驟,

      dma操作端按照db1、db2……dbn-1、dbn、db1、db2的順序?qū)崟r(shí)檢測usedpointer1指向的dmabuffer對(duì)的狀態(tài)是否為“used”,若為“是”則執(zhí)行dma操作,以將發(fā)送端dmabuffer中的數(shù)據(jù)拷貝至接收端的dmabuffer中,執(zhí)行完dma操作則將該dmabuffer對(duì)標(biāo)記為“done”狀態(tài),以表示此dmabuffer對(duì)中的數(shù)據(jù)能夠執(zhí)行數(shù)據(jù)接收步驟,直至p路數(shù)據(jù)中的每一個(gè)數(shù)據(jù)段均完成dma步驟,

      接收端按照db1、db2……dbn-1、dbn、db1、db2的順序?qū)崟r(shí)檢測donepointer1指向的dmabuffer對(duì)的狀態(tài)是否為“done”,若為“done”則對(duì)該dmabuffer對(duì)進(jìn)行數(shù)據(jù)讀取操作,以將該dmabuffer對(duì)中的數(shù)據(jù)讀取至上層應(yīng)用,之后將該dmabuffer對(duì)標(biāo)記為“free”狀態(tài),以表示此dmabuffer對(duì)能夠執(zhí)行數(shù)據(jù)發(fā)送步驟,直至p路數(shù)據(jù)中的每一個(gè)數(shù)據(jù)段均完成數(shù)據(jù)接收步驟,

      于一次數(shù)據(jù)傳輸過程中,若pcie設(shè)備作為接收端,主機(jī)作為發(fā)送端時(shí),上述步驟中應(yīng)用到的dmabuffer對(duì)則為“db1′~dbn′并使用freepointer2、usedpointer2和donepointer2指示“db1′~dbn′的狀態(tài),其余步驟不變。

      在本發(fā)明的一實(shí)施例中,dma通道的個(gè)數(shù)為4個(gè)。

      在本發(fā)明的一實(shí)施例中,pcie設(shè)備至主機(jī)與主機(jī)至pcie設(shè)備兩個(gè)方向共享4個(gè)dma通道。

      本發(fā)明提供的pcie設(shè)備與主機(jī)之間的多路有序數(shù)據(jù)傳輸方法不僅不需要將dma通道與數(shù)據(jù)傳輸路捆綁,并且僅需要使用三個(gè)pointer(指針)即可對(duì)dmabuffer進(jìn)行管理,從而能夠保證同一路數(shù)據(jù)有序的被傳送到主機(jī)或者pcie設(shè)備,不僅降低了pcie設(shè)備與主機(jī)之間數(shù)據(jù)傳輸管理的復(fù)雜度和多余的資源消耗,而且還能夠完全發(fā)揮pcie的帶寬,使得實(shí)際傳輸帶寬接近pcie的理論峰值帶寬。

      附圖說明

      為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。

      圖1為pcie設(shè)備和主機(jī)中的組織架構(gòu)示意圖;

      圖2為同步管理單元的示意圖;

      圖3為p路數(shù)據(jù)的示意圖;

      圖4-1~圖4-4分別為步驟s3、s4、s6和s7的示意圖;

      圖4-5為p=4時(shí),步驟s8的示意圖;

      圖5-1、圖5-2、圖5-3和圖5-4分別為步驟s10、s12、s14和s16的示意圖;

      圖5-5為p=4時(shí),步驟s17的示意圖;

      圖6-1、圖6-2、圖6-3和圖6-4分別為步驟s19、s21、s23和s25的示意圖;

      圖6-5為p=4時(shí),步驟s26的示意圖;

      圖7為利用本發(fā)明對(duì)4路視頻數(shù)據(jù)進(jìn)行發(fā)送的示意圖。

      附圖標(biāo)記說明:1-源數(shù)據(jù)dmabuffer單元;2-目的數(shù)據(jù)dmabuffer單元。

      具體實(shí)施方式

      下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有付出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。

      本發(fā)明提供了一種pcie設(shè)備與主機(jī)之間的多路有序數(shù)據(jù)傳輸方法,該方法用于傳輸pcie設(shè)備與主機(jī)之間的多路有序數(shù)據(jù),為了實(shí)施該方法,pcie設(shè)備和主機(jī)需要具備相應(yīng)的組織架構(gòu),如圖1所示為pcie設(shè)備和主機(jī)中的組織架構(gòu)示意圖,其中,pcie設(shè)備和主機(jī)均設(shè)有源數(shù)據(jù)dmabuffer單元1和目的數(shù)據(jù)dmabuffer單元2,pcie設(shè)備的源數(shù)據(jù)dmabuffer單元包括多個(gè)用于緩存發(fā)送端欲發(fā)送的數(shù)據(jù)的dmabuffera1~an,pcie設(shè)備的目的數(shù)據(jù)dmabuffer單元包括多個(gè)用于緩存接收端接收到的數(shù)據(jù)的dmabufferb1~bn,主機(jī)的目的數(shù)據(jù)dmabuffer單元包括多個(gè)用于接收端接收到的數(shù)據(jù)的dmabuffera1′~an′,主機(jī)的源數(shù)據(jù)dmabuffer單元包括多個(gè)用于緩存發(fā)送端發(fā)送的數(shù)據(jù)的dmabufferb1′~bn′,其中,dmabuffera1~an與dmabuffera1′~an′依次對(duì)應(yīng)以構(gòu)成n個(gè)dmabuffer對(duì)“db1~dbn”,dmabufferb1~bn與dmabufferb1′~bn′依次對(duì)應(yīng)以構(gòu)成n個(gè)dmabuffer對(duì)“db1′~dbn′”,每個(gè)dmabuffer對(duì)均對(duì)應(yīng)設(shè)置有一同步管理單元,如圖2所示為同步管理單元的示意圖,每一同步管理單元中均設(shè)有一緩存狀態(tài)指針p1和一緩存數(shù)據(jù)長度指針p2,每一同步管理單元中均具有本地dmabuffer地址存儲(chǔ)器以及遠(yuǎn)程dmabuffer地址存儲(chǔ)器,分別用于存儲(chǔ)對(duì)應(yīng)的發(fā)送端dmabuffer的地址和接收端dmabuffer的地址,pcie設(shè)備端設(shè)有指示db1~dbn狀態(tài)的指針freepointer1、usedpointer1和donepointer1(圖中未示出),主機(jī)端設(shè)有指示db1′~dbn′狀態(tài)的指針freepointer2、usedpointer2和donepointer2(圖中未示出),于一次數(shù)據(jù)傳輸過程中,dma操作端位于pcie設(shè)備端或主機(jī)端,當(dāng)由發(fā)送端向接收端傳輸p路數(shù)據(jù)n1~np時(shí)(如圖3所示為p路數(shù)據(jù)的示意圖),其中,每路數(shù)據(jù)均包括np1~npm共m個(gè)數(shù)據(jù)段,其中1≤p≤p且p為整數(shù),若pcie設(shè)備作為發(fā)送端,主機(jī)作為接收端,該方法包括以下步驟:

      s1:初始狀態(tài)下,dmabuffera1~an和dmabuffera1′~an′均為“free”狀態(tài),也即,對(duì)于db1~dbn,均有*p1=free,以及*p2為零,freepointer1、usedpointer1和donepointer1均指向db1;

      【數(shù)據(jù)發(fā)送步驟】

      s2:發(fā)送端根據(jù)freepointer1的指向獲取到db1的控制權(quán),freepointer1轉(zhuǎn)而指向db2;

      s3:發(fā)送端令db1的*p1=allocated,如圖4-1所示;

      s4:發(fā)送端將數(shù)據(jù)n11拷貝至dmabuffera1中,并令db1的*p1=used,以及*p2=數(shù)據(jù)n11的長度,如圖4-2所示;

      s5:發(fā)送端根據(jù)freepointer1的指向獲取到db2的控制權(quán),freepointer1轉(zhuǎn)而指向db3;

      s6:發(fā)送端令db2的*p1=allocated,如圖4-3所示;

      s7:發(fā)送端將數(shù)據(jù)n21拷貝至dmabuffera2中,并令db2的*p1=used,以及*p2=數(shù)據(jù)n21的長度,如圖4-4所示;

      s8:發(fā)送端按照上述步驟s5~s7對(duì)p路數(shù)據(jù)中的第一個(gè)數(shù)據(jù)段依次執(zhí)行上述操作,直至p路數(shù)據(jù)均執(zhí)行完上述步驟或?qū)τ赿b1~dbn均有*p1=used,之后發(fā)送端再對(duì)每一路數(shù)據(jù)中的第2個(gè)~第m個(gè)數(shù)據(jù)段依次進(jìn)行數(shù)據(jù)發(fā)送;

      在本發(fā)明的一實(shí)施例中,當(dāng)p=4即共有n1~n4共4路數(shù)據(jù)時(shí),步驟s8如圖4-5所示,db1~db4均有*p1=used,freepointer1指向db5。

      【dma步驟】

      s9:dma操作端根據(jù)usedpointer1的指向獲取到db1的控制權(quán),usedpointer1轉(zhuǎn)而指向db2;

      s10:dma操作端令db1的*p1=dmaing,如圖5-1所示;

      s11:dma操作端獲得空閑的dma通道并對(duì)db1進(jìn)行dma操作,以將數(shù)據(jù)n11從dmabuffera1拷貝至dmabuffera1′;

      s12:dma操作端令db1的*p1=done,如圖5-2所示;

      s13:dma操作端根據(jù)usedpointer1的指向獲取到db2的控制權(quán),usedpointer1轉(zhuǎn)而指向db3;

      s14:dma操作端令db2的*p1=dmaing,如圖5-3所示;

      s15:dma操作端獲得空閑的dma通道并對(duì)db2進(jìn)行dma操作,以將數(shù)據(jù)n21從dmabuffera2拷貝至dmabuffera2′;

      s16:dma操作端令db2的*p1=done,如圖5-4所示;

      s17:dma操作端按照上述步驟s13~s16對(duì)p路數(shù)據(jù)中的第一個(gè)數(shù)據(jù)段依次執(zhí)行上述操作,直至p路數(shù)據(jù)均執(zhí)行完上述步驟或?qū)τ赿b1~dbn均有*p1=done,之后dma操作端再對(duì)每一路數(shù)據(jù)中的第2個(gè)~第m個(gè)數(shù)據(jù)段依次進(jìn)行dma操作;

      在本發(fā)明的一實(shí)施例中,當(dāng)p=4即共有n1~n4共4路數(shù)據(jù)時(shí),步驟s17如圖5-5所示,db1~db4均有*p1=done,freepointer1指向db5,實(shí)際上,dma操作端對(duì)p路數(shù)據(jù)中的第一個(gè)數(shù)據(jù)段進(jìn)行dma操作的同時(shí),發(fā)送端正在對(duì)p路數(shù)據(jù)中的第二個(gè)數(shù)據(jù)段進(jìn)行數(shù)據(jù)發(fā)送操作。

      dma操作需要選擇空閑的dma通道。一般通道數(shù)為4個(gè)左右,所以使用輪詢搜索方法就可以快速獲得空閑的通道。每當(dāng)dma通道被使用,就將其標(biāo)記為used狀態(tài),dma操作完成之后,該通道就被標(biāo)記位free狀態(tài)。只要dma通道處于free狀態(tài),無論哪個(gè)方向的數(shù)據(jù)傳輸都可以使用其進(jìn)行dma操作。在這種方式下,dma通道能夠?yàn)閮蓚€(gè)方向的dma操作分配空閑的dma通道,而且所有dma通道是共享,能夠?qū)崿F(xiàn)兩個(gè)傳輸方向的按需分配。

      【數(shù)據(jù)接收步驟】

      s18:接收端根據(jù)donepointer1的指向獲取到db1的控制權(quán),donepointer1轉(zhuǎn)而指向db2;

      s19:接收端令db1的*p1=reading,如圖6-1所示;

      s20:接收端將dmabuffera1′中的數(shù)據(jù)n11傳輸?shù)缴蠈討?yīng)用;

      s21:接收端令db1的*p1=free,如圖6-2所示;

      s22:接收端根據(jù)donepointer1的指向獲取到db2的控制權(quán),donepointer1轉(zhuǎn)而指向db3;

      s23:接收端令db2的*p1=reading,如圖6-3所示;

      s24:接收端將dmabuffera2′中的數(shù)據(jù)n12傳輸?shù)缴蠈討?yīng)用;

      s25:接收端令db2的*p1=free,如圖6-4所示;

      s26:接收端按照上述步驟s22~s25對(duì)p路數(shù)據(jù)中的第一個(gè)數(shù)據(jù)段依次執(zhí)行上述操作,直至p路數(shù)據(jù)均執(zhí)行完上述步驟或?qū)τ赿b1~dbn均有*p1=free,之后接收端再對(duì)每一路數(shù)據(jù)中的第2個(gè)~第m個(gè)數(shù)據(jù)段依次進(jìn)行數(shù)據(jù)接收操作;

      在本發(fā)明的一實(shí)施例中,當(dāng)p=4即共有n1~n4共4路數(shù)據(jù)時(shí),步驟s26如圖6-5所示,db1~db4均有*p1=free,freepointer1、usedpointer1和donepointer1均指向db5,實(shí)際上,接收端對(duì)p路數(shù)據(jù)中的第一個(gè)數(shù)據(jù)段進(jìn)行數(shù)據(jù)操作時(shí),dma操作端正在對(duì)p路數(shù)據(jù)中的第二個(gè)數(shù)據(jù)段進(jìn)行dma操作以及數(shù)據(jù)發(fā)送端正在對(duì)p路數(shù)據(jù)中的第三個(gè)數(shù)據(jù)段進(jìn)行數(shù)據(jù)發(fā)送操作。

      上述圖4-1~圖4-5、圖5-1~圖5-5、圖6-1~圖6-5均僅呈現(xiàn)了第一個(gè)數(shù)據(jù)段于各步驟中各個(gè)指針的變化以及dmabuffer的狀態(tài)變化,其他數(shù)據(jù)段未予顯示。

      上述數(shù)據(jù)發(fā)送步驟、dma步驟和數(shù)據(jù)接收步驟同時(shí)進(jìn)行,其中:

      發(fā)送端按照db1、db2……dbn-1、dbn、db1、db2的順序?qū)崟r(shí)循環(huán)檢測freepointer1指向的dmabuffer對(duì)的狀態(tài)是否為“free”,若為“free”則將當(dāng)前等待寫入的數(shù)據(jù)寫入其對(duì)應(yīng)的發(fā)送端的dmabuffer,之后將該dmabuffer對(duì)標(biāo)記為“used”狀態(tài),以表示此dmabuffer對(duì)中的數(shù)據(jù)能夠執(zhí)行dma步驟,其中,當(dāng)一路數(shù)據(jù)中尚有數(shù)據(jù)段未完成數(shù)據(jù)發(fā)送時(shí),當(dāng)前等待寫入的數(shù)據(jù)為該路數(shù)據(jù)中的下一個(gè)數(shù)據(jù)段,直至p路數(shù)據(jù)中的每一個(gè)數(shù)據(jù)段均完成數(shù)據(jù)發(fā)送步驟,例如,如圖3所示,當(dāng)?shù)谝宦窋?shù)據(jù)n1尚有數(shù)據(jù)段(例如最后一個(gè)數(shù)據(jù)段n1m)未完成發(fā)送時(shí),當(dāng)前等待寫入的數(shù)據(jù)即為數(shù)據(jù)段n1m。

      dma操作端按照db1、db2……dbn-1、dbn、db1、db2的順序?qū)崟r(shí)檢測usedpointer1指向的dmabuffer對(duì)的狀態(tài)是否為“used”,若為“是”則執(zhí)行dma操作,以將發(fā)送端dmabuffer中的數(shù)據(jù)拷貝至接收端的dmabuffer中,執(zhí)行完dma操作則將該dmabuffer對(duì)標(biāo)記為“done”狀態(tài),以表示此dmabuffer對(duì)中的數(shù)據(jù)能夠執(zhí)行數(shù)據(jù)接收步驟,直至p路數(shù)據(jù)中的每一個(gè)數(shù)據(jù)段均完成dma步驟,

      接收端按照db1、db2……dbn-1、dbn、db1、db2的順序?qū)崟r(shí)檢測donepointer1指向的dmabuffer對(duì)的狀態(tài)是否為“done”,若為“done”則對(duì)該dmabuffer對(duì)進(jìn)行數(shù)據(jù)讀取操作,以將該dmabuffer對(duì)中的數(shù)據(jù)讀取至上層應(yīng)用,之后將該dmabuffer對(duì)標(biāo)記為“free”狀態(tài),以表示此dmabuffer對(duì)能夠執(zhí)行數(shù)據(jù)發(fā)送步驟,直至p路數(shù)據(jù)中的每一個(gè)數(shù)據(jù)段均完成數(shù)據(jù)接收步驟。

      可見,本發(fā)明中的dmabuffer對(duì)的狀態(tài)只能按照free->allocated->used->dmaing->done->reading->free的順序變化,不能反向變化或跳變,本發(fā)明因此能夠維持主機(jī)和pcie設(shè)備對(duì)dmabuffer對(duì)的互斥訪問。free狀態(tài)表示當(dāng)前的dmabuffer對(duì)是空閑的,可以被使用。在獲得free狀態(tài)的dmabuffer對(duì)之后,發(fā)送端馬上將其設(shè)置為allocated狀態(tài),表示該dmabuffer對(duì)被占用。當(dāng)將被發(fā)送的數(shù)據(jù)拷貝到dmabuffer對(duì)的源dmabuffer之后,發(fā)送端將dmabuffer對(duì)的狀態(tài)設(shè)置為used狀態(tài),表示該dmabuffer對(duì)已經(jīng)可以進(jìn)行dma操作。當(dāng)dmabuffer對(duì)在進(jìn)行dma操作的過程中,dma控制器端(含有dma控制器的一端)將dmabuffer對(duì)設(shè)置為dmaing狀態(tài),表示正在進(jìn)行dma操作。當(dāng)dma操作完成之后,dma控制器端將dmabuffer對(duì)設(shè)置為done狀態(tài),表示可以上層應(yīng)用可以接收數(shù)據(jù)。當(dāng)接收端接收數(shù)據(jù)過程中,會(huì)將dmabuffer對(duì)的狀態(tài)設(shè)置reading狀態(tài),表示該dmabuffer對(duì)的數(shù)據(jù)正在被上層應(yīng)用接收。上層應(yīng)用完成數(shù)據(jù)接收之后,接收端將dmabuffer對(duì)的狀態(tài)設(shè)置為free狀態(tài),表示該dmabuffer對(duì)可以重新用于傳輸數(shù)據(jù)。

      于一次數(shù)據(jù)傳輸過程中,若pcie設(shè)備作為接收端,主機(jī)作為發(fā)送端時(shí),上述步驟中應(yīng)用到的dmabuffer對(duì)則為“db1′~dbn′并使用freepointer2、usedpointer2和donepointer2指示“db1′~dbn′的狀態(tài),其余步驟不變。

      在本發(fā)明的一實(shí)施例中,dma通道的個(gè)數(shù)例如可以為4個(gè),pcie設(shè)備至主機(jī)與主機(jī)至pcie設(shè)備兩個(gè)方向可以共享4個(gè)dma通道,以提高dma通道的利用率。

      圖7為利用本發(fā)明對(duì)4路視頻數(shù)據(jù)進(jìn)行發(fā)送的示意圖,如圖所示,數(shù)據(jù)a1、b1、c1和d1為第1路視頻數(shù)據(jù)中的數(shù)據(jù)段,數(shù)據(jù)a2、b2、c2和d2為第2路視頻數(shù)據(jù)中的數(shù)據(jù)段,數(shù)據(jù)a3、b3、c3和d3為第3路視頻數(shù)據(jù)中的數(shù)據(jù)段,數(shù)據(jù)a4、b4、c4和d4為第4路視頻數(shù)據(jù)中的數(shù)據(jù)段,如圖7下方的時(shí)間線所示,當(dāng)發(fā)送端對(duì)數(shù)據(jù)a1、a2、a3和a4完成數(shù)據(jù)發(fā)送操作并且數(shù)據(jù)a1、a2、a3和a4進(jìn)入dma操作時(shí),發(fā)送端就利用其余的處于free狀態(tài)的dmabuffer對(duì)每一路中的下一段數(shù)據(jù)b1、b2、b3和b4進(jìn)行數(shù)據(jù)發(fā)送操作;當(dāng)數(shù)據(jù)a1、a2、a3和a4進(jìn)行數(shù)據(jù)接收操作時(shí),數(shù)據(jù)b1、b2、b3和b4進(jìn)入dma操作,并且發(fā)送端利用其余的處于free狀態(tài)的dmabuffer對(duì)每一路中的下一段數(shù)據(jù)c1、c2、c3和c4進(jìn)入數(shù)據(jù)發(fā)送操作??梢姡景l(fā)明能夠使得發(fā)送端、dma端以及接收端均能夠不間斷的工作,發(fā)送端不間斷利用處于free狀態(tài)的dmabuffer對(duì)進(jìn)行數(shù)據(jù)發(fā)送,發(fā)送流程為:每一路數(shù)據(jù)中的第1個(gè)數(shù)據(jù)段→每一路數(shù)據(jù)中的第2個(gè)數(shù)據(jù)段→……→每一路數(shù)據(jù)中的最后一個(gè)數(shù)據(jù)段;dma操作端不間斷的利用空閑的dma通道對(duì)已完成數(shù)據(jù)發(fā)送的數(shù)據(jù)進(jìn)行dma操作;接收端不間斷的將已完成dma操作的數(shù)據(jù)傳輸?shù)缴蠈討?yīng)用。另外,由圖7可知,同時(shí)使用的dmabuffer對(duì)的數(shù)目為數(shù)據(jù)路數(shù)的三倍,因此,在設(shè)計(jì)dmabuffer對(duì)時(shí)應(yīng)盡量使得dmabuffer對(duì)的數(shù)目不低于數(shù)據(jù)路數(shù)的三倍,以免因需要等待空閑的dmabuffer對(duì)而降低數(shù)據(jù)傳輸速率。

      本發(fā)明提供的pcie設(shè)備與主機(jī)之間的多路有序數(shù)據(jù)傳輸方法不僅不需要將dma通道與數(shù)據(jù)傳輸路捆綁,并且僅需要使用三個(gè)pointer(指針)即可對(duì)dmabuffer進(jìn)行管理,從而能夠保證同一路數(shù)據(jù)有序的被傳送到主機(jī)或者pcie設(shè)備,不僅降低了pcie設(shè)備與主機(jī)之間數(shù)據(jù)傳輸管理的復(fù)雜度和多余的資源消耗,而且還能夠完全發(fā)揮pcie的帶寬,使得實(shí)際傳輸帶寬接近pcie的理論峰值帶寬。

      本領(lǐng)域普通技術(shù)人員可以理解:附圖只是一個(gè)實(shí)施例的示意圖,附圖中的模塊或流程并不一定是實(shí)施本發(fā)明所必須的。

      本領(lǐng)域普通技術(shù)人員可以理解:實(shí)施例中的裝置中的模塊可以按照實(shí)施例描述分布于實(shí)施例的裝置中,也可以進(jìn)行相應(yīng)變化位于不同于本實(shí)施例的一個(gè)或多個(gè)裝置中。上述實(shí)施例的模塊可以合并為一個(gè)模塊,也可以進(jìn)一步拆分成多個(gè)子模塊。

      最后應(yīng)說明的是:以上實(shí)施例僅用以說明本發(fā)明的技術(shù)方案,而非對(duì)其限制;盡管參照前述實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)的說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對(duì)前述實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對(duì)其中部分技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明實(shí)施例技術(shù)方案的精神和范圍。

      當(dāng)前第1頁1 2 
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1