DSPTMS320C6713入门之旅四edma的理解和使用.docx

上传人:b****6 文档编号:4818278 上传时间:2022-12-09 格式:DOCX 页数:18 大小:654.49KB
下载 相关 举报
DSPTMS320C6713入门之旅四edma的理解和使用.docx_第1页
第1页 / 共18页
DSPTMS320C6713入门之旅四edma的理解和使用.docx_第2页
第2页 / 共18页
DSPTMS320C6713入门之旅四edma的理解和使用.docx_第3页
第3页 / 共18页
DSPTMS320C6713入门之旅四edma的理解和使用.docx_第4页
第4页 / 共18页
DSPTMS320C6713入门之旅四edma的理解和使用.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

DSPTMS320C6713入门之旅四edma的理解和使用.docx

《DSPTMS320C6713入门之旅四edma的理解和使用.docx》由会员分享,可在线阅读,更多相关《DSPTMS320C6713入门之旅四edma的理解和使用.docx(18页珍藏版)》请在冰豆网上搜索。

DSPTMS320C6713入门之旅四edma的理解和使用.docx

DSPTMS320C6713入门之旅四edma的理解和使用

DSP(TMS320C6713)入门之旅四、edma的理解和使用

EDMA的全称是:

EnhancedDirectMemoryAccess(增强型dma),增强型直接内存存取(EDMA)是数字信号处理器(DSP)中用于快速数据交换的重要技术,具有独立于CPU的后台批量数据传输的能力,能够满足实时图像处理中高速数据传输的要求。

以TI公司的TMS320C6713型DSP为例,介绍EDMA控制器的特点。

结合实例给出EDMA在数据实时传输中的具体控制和实现方法。

实验结果表明,通过灵活控制EDMA不仅能够提高数据的传输效率,而且能够充分发挥:

DSP的高速性能。

也就是在我们一般的dma的基础上做了一下加工以完成特定的功能。

比如我们dma传送数据一般是连续的一片数据块,但是我们想间隔着传送就不行了。

还有就是增强型的dma可以实现二维的传送和一个事件可以发起两次传送,这样就可以很好的服务我们的数据传送要求!

   如图EDMA结构图:

 

可以看到我们配置自己的edma之后,就等待传送事件的到来,当传送事件到来的时候edma的控制器就接受到一个触发信号,就进入传送过程。

传送的规则定义在edma的每一个通道的参数设置里面,我们可以通过控制传送的参数来达到我们要传送的数据的控制的目的!

传送参数表如图:

        第一个双字就是控制edma传送的规则,比如:

一维单元同步,一维帧同步,二维等等。

这些控制属性得在这个域里面对其进行说明。

第二个双字就是告诉edma要传送数据的源地址,第三个双字的帧的数目和单元的数目,第四个双字就是告诉edma要传送数据的目的地址。

第五个双字告诉edma下一次触发时地址的偏移量的量。

第六个双字就是当前的单元传送完成之后的单元数目的重载值和是否edma是否需要要链接到下一个edma(注意:

这儿是通道链接)

      我们先来理解几个概念:

      事件链接:

实质就是想一个事件触发之后引起两次edma的搬移,当然这两次搬移不是同一个edma通道,如果是同一个edma通道,相当于同样的数据搬移两次,这样不仅没有意义,还会占用内部总线带宽,印象片内数据的流动的速度。

那么TI设计的是将一个事件先链接到第一个通道,然后将第一个通道的完成中断事件链接到第二个edma通道。

相当于当一个事件触发之后,就触发第一个edma通道搬移数据,当第一个通道完成之后就发出一个事件触发第二个通道搬移数据,最后可以产生一个中断通知CPU。

这样一般用视频的FIFO同步。

注:

大家可能会用疑问,不是是要同时搬移两块吗,怎么不是同时的呢?

大家可以想想DSP内部一般就只有一条数据总线供edma使用。

那么在同一时刻只用一个数占用总线,如果我们有两个设备驱动总线数据,那么数据就不对了。

所以edma事件同步就是先让第一个通道搬移完成触发第二个通道搬移。

     通道链接:

实质就是由于edma搬移的数据块就只有那么大,那么当想搬移很多很多的时候怎么办呢?

当然可以在完成中断中重新设置edma参数,这样当事件到来时,就可以重新开始搬移了。

其实也可以用edma的通道链接这个属性,当这个通道的参数设置的完成时,通过链接到自己或者别人这样就不用重新设置来达到事件到来时搬移数据的目的。

通道链接的时候一般下一个通道的事件触发器是同一个,这样就不会丢失事件。

这种属性一般应用于大量数据从一个固定地址到另一个固定地址!

还要就是一个提高处理速度的乒乓结构的数据的搬移。

    乒乓结构:

在做一些设计的时候,一般要考虑两种因素:

速度和面积。

速度当然是指我们要求的处理数据的速度,面积就是存储数据的要用的内存大小(成本问题)。

在这两者之间权衡我们的算法。

在这儿讲的乒乓结构就是用面积换取速度的一种做法!

我们用两块内存和两个edma通道(相互链接,同一个事件触发),第一块取名为乒,第二块取名为乓。

当一个事件到来的时候触发我们的乒通道搬移数据到乒的内存块,等待一系列事件完之后,乒通道完成就连接到乓通道。

这时就是产生一个中断告诉cpu第一个块数据已经准备好在乒内存块了,让其进行数据算法处理。

与此同时乓通道也在搬移数据到乓内存块,完成之后通知cpu,链接到乒通道······这样形成一个循环。

就好像生活中打乒乓一样!

如图:

      四种数据搬移方式:

      一维单元同步搬移(1D-to-1D):

设置一个edma通道为一维数据单元同步搬移时,当一个事件到来触发时一次edma搬移数据的大小就是一个单元。

那么edma数据块搬移完成之后总体大小为:

ESIZE*FRMCNT*ELERLD,当下一个事件到来时,下一个源地址和目的地址的偏移由opt中sum,dum控制。

例如:

ESIZE=00b,SUM=01b,DUM=01b,FRMCNT=02h,ELERLD=04h,这样搬移的数据总量为2*4=8字节。

     一维帧同步搬移(1D-to-1D):

设置一个edma通道为一维数据帧同步搬移时,当一个事件到来触发时一次edma搬移数据的大小就是一帧,也就是一帧中所有单元数据总和。

那么edma数据块搬移完成之后总体大小为:

ESIZE*FRMCNT*ELERLD,当下一个事件到来时,下一个源地址和目的地址的偏移由opt中sum,dum控制。

例如:

ESIZE=00b,SUM=01b,DUM=01b,FRMCNT=02h,ELERLD=04h,这样搬移的数据总量为2*4=8字节。

      二维数组同步搬移(2D-to-2D):

设置一个edma通道为一维数据帧同步搬移时,当一个事件到来触发时一次edma搬移数据的大小就是一个数组,也就是一帧中所有单元数据总和。

那么edma数据块搬移完成之后总体大小为:

ESIZE*FRMCNT*ELERLD,当下一个事件到来时,下一个源地址和目的地址的偏移由opt中sum,dum控制。

例如:

ESIZE=00b,SUM=01b,DUM=01b,FRMCNT=02h,ELECNT=04h,这样搬移的数据总量为2*4=8字节。

     二维数组同步搬移(2D-to-2D):

设置一个edma通道为一维数据帧同步搬移时,当一个事件到来触发时一次edma搬移数据的大小就是一个整个数据块,也就是一个edma通道中所有数据总和。

那么edma数据块搬移完成之后总体大小为:

ESIZE*FRMCNT*ELERLD,当下一个事件到来时,下一个源地址和目的地址的偏移由opt中sum,dum控制。

例如:

ESIZE=00b,SUM=01b,DUM=01b,FRMCNT=02h,ELECNT=04h,这样搬移的数据总量为2*4=8字节。

实例源代码,使用timer1作为事件触发源,通过1D-1D单元同步来实现乒乓结构:

/*

 * Copyright2003byTexasInstrumentsIncorporated.

 * Allrightsreserved.PropertyofTexasInstrumentsIncorporated.

 * Restrictedrightstouse,duplicateordisclosethiscodeare

 * grantedthroughcontract.

 * 

 */

/*

 *———main_edma1.c———

 *ThisprogramusesthetimerstotriggerEDMAevents.Theseeventsinturn

 *triggerlinkedEDMAparametertablestofillapingpongbufferstructure.

 *Setabreakpointon‘processbuff’function.Thenopentwomemorywindows.

 *Usepingastheaddressforonememorywindowandpongfortheother.Then

 *runtheapplication.You’llnotethattheprogrambouncesbetweentheping

 *andpongbuffersfillingeachwithavaluethatcomesfromthesource. 

 *(Note:

ThisexamplerunswithCACHEenable).

 */

#include

#include

#include

#include

#include

#include

/*—————————————————————————-*/

/*PickwhichEDMAtransfercompletioninterruptwewanttouse*/

#defineTCCINTNUM  10

/*definetheconstants*/

#defineBUFF_SZ     256             /*ping-pongbuffersizesin#ofints */

#defineFCPU        150000000       /*CPUclockfrequency                 */

#defineSRATE       8000            /*datasamplerate(simulatedw/timer */

#defineTPRD        (FCPU/(4*SRATE))/*timerperiod                        */

#defineTRANSFER_CNT20              /*Transfercount*/

/*Createthebuffers.Wewanttoalignthebufferstobecachefriendly*/

/*byaligningthemonanL2cachelineboundary.                       */

#pragmaDATA_SECTION(ping,“.buffers”);

#pragmaDATA_SECTION(pong,“.buffers”);

#pragmaDATA_SECTION(outbuff,“.buffers”);

#pragmaDATA_ALIGN(ping,128);

#pragmaDATA_ALIGN(pong,128);

#pragmaDATA_ALIGN(outbuff,128);

intping[BUFF_SZ];

intpong[BUFF_SZ];

intoutbuff[BUFF_SZ];

/*Thesetwovariablesserveasthedatasourcesforthisexample.*/

/*Alsowanttoaligntheseonacachelineboundarysincethey   */

/*sourcesofEDMAtransfers.                                     */

#pragmaDATA_SECTION(ping_data,“.buffers”);

#pragmaDATA_SECTION(pong_data,“.buffers”);

#pragmaDATA_ALIGN(ping_data,128);

#pragmaDATA_ALIGN(pong_data,128);

staticintping_data;

staticintpong_data;

/*globalvariableusedtotracktheping-pong’ing*/

staticintpingpong=0;

volatileinttransferCount=0;

externfarvoidvectors();

voidsetupInterrupts(void);

voidstopEdma(void);/*functionusedtostopEDMA*/

/*————————————————————————-*/

/*declaretheCSLobjects*/

TIMER_HandlehTimer;  /*Handleforthetimerdevice                */

EDMA_HandlehEdma;    /*HandlefortheEDMAchannel                */

EDMA_HandlehEdmaPing;/*HandleforthepingEDMAreloadparameters */

EDMA_HandlehEdmaPong;/*HandleforthepongEDMAreloadparameters */

EDMA_ConfigcfgEdma;  /*EDMAconfigurationstructure               */

/*CreatetheEDMAconfigurationstructureforpingtransfers*/

EDMA_ConfigcfgEdmaPing={ 

 EDMA_OPT_RMK(         /*MakingOptionsparameterregister–EDMA_OPT   */

 

  EDMA_OPT_PRI_LOW,   /*PrioritylevelsforEDMAevents:

-

                            EDMA_OPT_PRI_LOW –LowpriorityEDMAtransfer

                            EDMA_OPT_PRI_HIGH–HighpriorityEDMAtransfer*/

  

  EDMA_OPT_ESIZE_32BIT,/*Elementsize:

-

                            EDMA_OPT_ESIZE_32BIT–32bitword

                            EDMA_OPT_ESIZE_16BIT–16bitword

                            EDMA_OPT_ESIZE_8BIT - 8bitword             */

  

  EDMA_OPT_2DS_NO,    /*Sourcedimension:

-

                            EDMA_OPT_2DS_NO –1-dimensionalsource   

                            EDMA_OPT_2DS_YES–2-dimensionalsource        */ 

  

  EDMA_OPT_SUM_NONE,  /*Sourceaddressupdatemode:

-          

                            EDMA_OPT_SUM_NONE–Fixedaddressmode

                            EDMA_OPT_SUM_INC –Incrementaddressmode

                            EDMA_OPT_SUM_DEC –Decrementaddressmode

                            EDMA_OPT_SUM_IDX –Addressmodifiedbyelement

                                                indexorframeIndex       */

   EDMA_OPT_2DD_NO,    /*Destinationdimension:

                            EDMA_OPT_2DD_NO  –1-dimensionalsource           

                            EDMA_OPT_2DD_YES –2-dimensionalsource       */

  

   EDMA_OPT_DUM_INC,   /*Destinationaddressupdatemode:

-                      

                            EDMA_OPT_DUM_NONE–Fixedaddressmode           

                            EDMA_OPT_DUM_INC –Incrementaddressmode       

                            EDMA_OPT_DUM_DEC –Decrementaddressmode       

                            EDMA_OPT_DUM_IDX –Addressmodifiedbyelement  

                                                indexorframeIndex       */

   

   EDMA_OPT_TCINT_YES, /*Transfercompleteinterrupt:

-

                            EDMA_OPT_TCINT_NO –Indicationdisabled     

                            EDMA_OPT_TCINT_YES–Indicationenabled        */ 

   

   EDMA_OPT_TCC_OF(TCCINTNUM),/*Transfercompletecode                    */

   

   EDMA_OPT_LINK_YES,  /*Linkingofeventparameters

                            EDMA_OPT_LINK_NO  - Disabled

                            EDMA_OPT_LINK_YES - Enabled                  */   

   

   EDMA_OPT_FS_NO      /*Framesynchronization

                            EDMA_OPT_FS_NO –Channeliselement/array

                                               synchronized

                            EDMA_OPT_FS_YES- Channelisframesynchronized*/

 ),

 EDMA_SRC_OF(&ping_data),/*Sourceaddressregister

                              &ping_data   –sourceaddress               */

 

 EDMA_CNT_OF(BUFF_SZ),  /*Transfercountparameter

                               BUFF_SZ     –buffersizesin#ofints    */     

 

 EDMA_DST_OF(ping),     /*Destinationaddressparameter

                                ping–destinationaddress                 */

 

 EDMA_IDX_OF(0×00000004),/*Indexparameter                                */

 

 EDMA_RLD_OF(0×00000000)/*Countreload/linkparameter                    */

};                        

 

/*CreatetheEDMAconfigurationstructureforpongtransfers*/

EDMA_ConfigcfgEdmaPong={

 EDMA_OPT_RMK(      /*MakingOptionsparameterregister–EDMA_OPT       */

   EDMA_OPT_PRI_LOW,/*PrioritylevelsforEDMAevents:

-

                            EDMA_OPT_PRI_LOW –LowpriorityEDMAtransfer

                            EDMA_OPT_PRI_HIGH–HighpriorityEDMAtransfer*/

                            

   EDMA_OPT_ESIZE_32BIT,/*Elementsize:

-

                            EDMA_OPT_ESIZE_32BIT–32bitword

                            EDMA_OPT_ESIZE_16BIT–16bitword

                            EDMA_OPT_ESIZE_8BIT - 8bitword             */

   

   EDMA_OPT_2DS_NO,    /*Sourcedimensi

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1