新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > DSP中DMA操作的無(wú)阻塞請(qǐng)求實(shí)現(xiàn)

        DSP中DMA操作的無(wú)阻塞請(qǐng)求實(shí)現(xiàn)

        作者: 時(shí)間:2008-07-18 來(lái)源:網(wǎng)絡(luò) 收藏
        應(yīng)用中至關(guān)重要,本文給出了非阻塞的請(qǐng)求方法,針對(duì)TMS320C620x,了與CSL中DAT接口一致的驅(qū)動(dòng)模塊QDAT,并指出了E相關(guān)的高級(jí)特征。

        中,DMA控制器實(shí)際是一個(gè)外設(shè),與其他集成的串口、主機(jī)接口、片外內(nèi)存接口等都在系統(tǒng)外設(shè)總線上,也與其他外設(shè)一樣有一組相關(guān)的控制/狀態(tài)/數(shù)據(jù)寄存器,CPU可以訪問(wèn)。

        非常重要的一點(diǎn)是,DMA通道能夠用于內(nèi)存之間的數(shù)據(jù)傳送。這里內(nèi)存都是統(tǒng)一編址的,包括:片上內(nèi)存,程序和數(shù)據(jù)分立;接在EMIF上的片外內(nèi)存,如SDRAM;外設(shè)的寄存器也都是內(nèi)存映射的(memory-mapped),所以DMA通道也可以用于外設(shè)和內(nèi)存之間,進(jìn)行外設(shè)數(shù)據(jù)接收與發(fā)送。

        的處理模型中,所有數(shù)據(jù)應(yīng)位于片上供CPU處理,不鼓勵(lì)CPU直接訪問(wèn)片外數(shù)據(jù),因?yàn)镃PU訪問(wèn)片外資源的時(shí)間較長(zhǎng),周期數(shù)也不確定,對(duì)于實(shí)時(shí)性和確定性不利。片上內(nèi)存有時(shí)也能夠配置成為緩存(cache),緩存控制器會(huì)根據(jù)一定策略、使用DMA方式切換片外的數(shù)據(jù)進(jìn)出緩存,最終使得用戶(hù)能夠在片上訪問(wèn)數(shù)據(jù),這個(gè)過(guò)程對(duì)用戶(hù)是透明的。正因?yàn)榫彺娴臋C(jī)制是透明的,所以也是很難控制的。比如,一段調(diào)用頻率很高的代碼很可能被不常用的部分清出緩存,因?yàn)樗鼈冇成湎嗤S后又很快被調(diào)入,這樣會(huì)造成局部的效率降低。

        所以,如果能夠明確掌握程序流或數(shù)據(jù)流的運(yùn)轉(zhuǎn)特征,不使用緩存模式,用戶(hù)通過(guò)DMA進(jìn)行自定義的調(diào)度,可能提高效率。有的處理器不具備緩存控制器,不支持片上內(nèi)存作為緩存,如C6205的片上數(shù)據(jù)內(nèi)存就不能夠配置為緩存,所以主動(dòng)使用DMA移動(dòng)數(shù)據(jù)不可避免。

        DSP的DMA功能一般也都較為強(qiáng)大,TI C6000系列的DMA通道支持1D-1D、1D-2D、2D-1D以及常用的2D-2D數(shù)據(jù)傳送,對(duì)DMA的合理使用可能替代相當(dāng)?shù)木幊绦Ч缗判颉⒉蓸踊虿眉簟?

        TI的CSL(Chip Support Library,芯片支持庫(kù))對(duì)于使用DMA給出了很好的支持,有專(zhuān)門(mén)的DMA模塊,便于對(duì)DMA的各個(gè)寄存器進(jìn)行控制。還有一個(gè)DAT模塊,使用DMA進(jìn)行內(nèi)存數(shù)據(jù)傳送,函數(shù)DAT_copy()和DAT_fill()就像常用的內(nèi)存memcpy()、memset()一樣,只需要在API接口指出源地址、目的地址和長(zhǎng)度,或者其他的維數(shù)屬性等即可,不需要再去管具體的寄存器,非常方便。

        視頻處理實(shí)例分析


        DAT模塊易用,但因?yàn)槭窃贑SL中,所以只能將DMA控制器直接的功能表達(dá)出來(lái)。對(duì)于灰度圖像處理(先不考慮將算法處理后的結(jié)果傳回片外的情況),在下面的處理框架中,每次DMA執(zhí)行時(shí),CPU在前臺(tái)還可以做算法處理任務(wù)。
        ...
        task=DAT_copy(...);//啟動(dòng)頭一個(gè)DAT任務(wù)
        ...
        while(not_finished){

        DAT_wait(task); //本次task完成

        task=DAT_copy(...); //啟動(dòng)下一次的DMA

        pingpong_alg_process(...); //對(duì)本次傳送的數(shù)據(jù)處理

        }

        當(dāng)視頻為4:2:0 YUV圖像(planar模式)序列,需要處理某一區(qū)域時(shí),實(shí)際上是在相同時(shí)機(jī)處理Y、U、V三塊數(shù)據(jù),通常它們并不連續(xù),也就是說(shuō),將會(huì)同時(shí)使用三個(gè)DMA操作。

        這里可能可以同時(shí)啟動(dòng)多條DMA通道,但有一些限制:


        1. 有的處理器支持同時(shí)啟動(dòng)的DMA通道數(shù)有限,有些DSP有4條通道,但寄存器集只能完整地支持兩條;


        2. 由于共享總線和某些接口,同時(shí)工作的DMA通道數(shù)過(guò)多將可能增加訪問(wèn)沖突,降低系統(tǒng)性能;


        3. 有時(shí)多條通道又必須同時(shí)使用,比如系統(tǒng)視頻、音頻采集進(jìn)入的數(shù)據(jù)必須占用獨(dú)立的通道。


        所以,上面的任務(wù)能夠盡量使用一個(gè)DMA通道完成,不失一般性,DAT模塊的所有操作實(shí)際上是在一條打開(kāi)的通道上完成的。


        那么,對(duì)于YUV圖像,處理程序框架類(lèi)似上面,可能如下,
        ...

        taskY = DAT_copy(...);

        taskU = DAT_copy(...);

        taskV = DAT_copy(...);
        ...

        while(not_finished){

        DAT_wait(taskY);

        DAT_wait(taskU);

        DAT_wait(taskV);

        taskY = DAT_copy(...);

        taskU = DAT_copy(...);

        taskV = DAT_copy(...);

        YUV_pingpong_process(...);

        這時(shí)問(wèn)題出現(xiàn)了:C620x的DMA通道一次只能接受一個(gè)傳送請(qǐng)求,也就是說(shuō),每次請(qǐng)求必須等到該通道空閑時(shí)才可能真正提交上去,這樣taskY和taskU在后臺(tái)操作時(shí),前臺(tái)無(wú)法進(jìn)行taskU和taskV的啟動(dòng),即實(shí)際上前臺(tái)沒(méi)有什么處理任務(wù)可做,浪費(fèi)了效率。而這三個(gè)dat任務(wù)綁定在一起,啟動(dòng)時(shí)機(jī)很難拆開(kāi)。顯然,如果能夠允許DMA請(qǐng)求連續(xù)地提交,將提高效率。


        DMA通道請(qǐng)求非阻塞提交的方法


        把DMA通道看作一個(gè)單處理單元,每個(gè)DMA操作作為一個(gè)任務(wù),這就形成了一個(gè)單處理多任務(wù)的模型,任務(wù)調(diào)度就是FIFO。不妨定義:


        1. DMA通道請(qǐng)求上下文是一個(gè)數(shù)據(jù)結(jié)構(gòu),它包含啟動(dòng)一次DMA傳送所需要設(shè)定的寄存器參數(shù)集合,如源、目的、長(zhǎng)度、index寄存器(維數(shù))等等;


        2. DMA通道請(qǐng)求上下文隊(duì)列,一個(gè)DMA請(qǐng)求上下文的隊(duì)列用以緩存DMA請(qǐng)求;


        DMA通道的使用和請(qǐng)求非阻塞的提交應(yīng)有以下兩條原則:


        a. 應(yīng)用程序的使用DMA通道的方法:

        提交DMA通道請(qǐng)求(無(wú)阻塞),獲得此次任務(wù)的id;在需要使用某任務(wù)的目標(biāo)內(nèi)存時(shí),應(yīng)檢查該id任務(wù)狀態(tài)直到完成;如果完成,即可進(jìn)行相應(yīng)的處理。

        b. 無(wú)阻塞提交DMA通道請(qǐng)求的:標(biāo)志此次DMA傳送任務(wù)正在進(jìn)行;如果DMA通道空閑,設(shè)置寄存器啟動(dòng)DMA操作,標(biāo)志DMA通道正在工作;如果DMA通道正在工作,則將此次DMA請(qǐng)求插入上下文隊(duì)列。

        3. DMA中斷服務(wù)程序(注:DAT模塊不使用ISR,只是查詢(xún)對(duì)應(yīng)標(biāo)志,確定DMA傳送是否完成):標(biāo)志此次DMA傳送任務(wù)完成;如果DMA請(qǐng)求上下文隊(duì)列為空,標(biāo)志DMA通道空閑;如果DMA請(qǐng)求上下文隊(duì)列非空,則從隊(duì)列中取出頭一個(gè)DMA請(qǐng)求上下文,用以設(shè)置相應(yīng)的寄存器啟動(dòng)DMA操作。

        QDAT:一個(gè)非阻塞的DMA模塊

        在TI C620x DSP上,一個(gè)非阻塞的DMA模塊QDAT根據(jù)以上原理得以實(shí)現(xiàn)。

        QDAT的API與DAT模塊的基本一致,優(yōu)點(diǎn)是使用上述的YUV圖像處理應(yīng)用程序中,不會(huì)發(fā)生DMA請(qǐng)求阻塞;

        QDAT與DAT模塊功能相似,但屬于驅(qū)動(dòng)程序?qū)哟蔚膶?shí)現(xiàn),基于:CSL的DMA模塊;CSL的IRQ模塊;以及DSP/BIOS的QUE模塊。

        不過(guò)實(shí)現(xiàn)十分簡(jiǎn)便、輕盈。

        該模塊獨(dú)立于應(yīng)用和算法,已經(jīng)在基于TI C620x DSP上的多個(gè)項(xiàng)目中使用,效果十分理想,特別是因?yàn)镼DAT任務(wù)中的DMA操作經(jīng)過(guò)了串行化,也大大降低了在EMIF上訪問(wèn)內(nèi)存時(shí)的沖突。


        EMDA的先進(jìn)特征


        這些項(xiàng)目向新的TI DM642媒體處理器上移植時(shí),以上的操作將利用EDMA的先進(jìn)特征, 因?yàn)門(mén)I C6x1x 和 C64x DSP開(kāi)始使用EDMA,值得注意的是,EDMA通道控制器(EDMACC)有專(zhuān)門(mén)的PRAM(parameterRAM)來(lái)緩存DMA請(qǐng)求參數(shù),EDMA事件參數(shù)表中有標(biāo)志以及LINK address,用來(lái)指示本次DMA傳送結(jié)束后, 是否有新的DMA請(qǐng)求參數(shù)需要重載入操作寄存器; 如果有,LINK address所指就是新的參數(shù)在PRAM的位置。 顯然因?yàn)檫@樣的鏈表機(jī)制,使用該通道連續(xù)兩次傳送之間無(wú)需中斷處理程序(CPU)介入隊(duì)列管理,效率將提高。 對(duì)于頻繁的內(nèi)存數(shù)據(jù)傳送,如DAT操作一般使用QDMA, 它由CPU直接將傳送請(qǐng)求(TR)提交給傳送控制器(EDMATC),TC中有四個(gè)優(yōu)先級(jí)隊(duì)列,每個(gè)TR都將進(jìn)入其對(duì)應(yīng)(已指定)的一個(gè)隊(duì)列。 對(duì)于不同的請(qǐng)求源,隊(duì)列的長(zhǎng)度可編程,每個(gè)隊(duì)列最多可以接收7個(gè)QDMA請(qǐng)求。 如果隊(duì)列有空,TR就可以進(jìn)入;若滿(mǎn)了,CPU將會(huì)停止(stall)幾個(gè)EDMA周期等待TC的執(zhí)行,隊(duì)列隨即空出一個(gè)位置。

        總之,EDMA執(zhí)行機(jī)構(gòu)這種純硬件的隊(duì)列機(jī)制使得效率提升更加極大化, 減少了軟件對(duì)此的相關(guān)開(kāi)銷(xiāo)。

        欲獲取相關(guān)技術(shù)信息可以訪問(wèn)www.embeddedcore.com。


        評(píng)論


        相關(guān)推薦

        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 衢州市| 柳河县| 华安县| 靖江市| 鄱阳县| 云龙县| 松阳县| 荆州市| 吉木萨尔县| 阳泉市| 江源县| 嘉兴市| 宁乡县| 南岸区| 怀化市| 壤塘县| 理塘县| 西宁市| 永川市| 彭州市| 濉溪县| 宁安市| 黑山县| 弥勒县| 西平县| 突泉县| 石河子市| 余庆县| 绍兴县| 黄陵县| 临海市| 万盛区| 耿马| 东莞市| 安国市| 新田县| 道孚县| 尖扎县| 凤山市| 新绛县| 侯马市|