EDMA.docx
- 文档编号:30645003
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:13
- 大小:73.34KB
EDMA.docx
《EDMA.docx》由会员分享,可在线阅读,更多相关《EDMA.docx(13页珍藏版)》请在冰豆网上搜索。
EDMA
EDMA简介
增强型直接内存存取(EDMA),EnhancedDirectMemoryAccess,是数字信号处理器(DSP)中用于快速数据交换的重要技术,具有独立于CPU的后台批量数据传输的能力,能够满足实时图像处理中高速数据传输的要求。
由于我们采用的是TMS320C6x系列DSP芯片,所以采用EDMA3,EDMA3有64个通道,每个通道都有一个事件与之关联,每个事件相当于一个同步信号,由事件触发相应通道的数据传输。
在没有CPU参与的情况下,EDMA控制器可以在后台完成片内存储器和外设之间的数据搬移。
EDMA的组成
EDMA控制器由以下部分组成:
Ø事件和中断处理寄存器
Ø事件编码器
Ø参数RAM
Ø硬件地址产生器
事件寄存器完成对EDMA事件的捕获、控制。
若有多个事件同时发生,由事件编码器对它们进行处理(将同时发生的事件进行排队)。
参数RAM存放与事件相关(各通道)的传输参数;这些参数送入硬件地址发生器以产生对EMIF/外设的存取地址(即产生要传输数据的源地址)。
EDMA的控制机制
1、事件与事件控制寄存器
EDMA有64个通道.每1个通道都有1个事件与之关联.由这些事件触发相应通道的传输。
2、传输参数与参数RAM
EDMA控制器与DMA控制器在结构上有所区别。
C64x的EDMA控制器是基于RAM结构。
参数RAM(ParameterRAM。
PaRAM)的容量是2KB,总共可以存放85组EDMA传输控制参数。
多组参数还可以彼此连接起来,从而实现某些负责数据流的传输.例如循环缓存和数据排序等。
参数RAM中保存的内容包括:
Ø64个EDMA通道对应的入口传输参数.每组参数包括6个字;
Ø用于重加载、链接的传输参数组。
每组参数包括24字节;
Ø8字节空余的RAM可以作为“草稿区”(scratchpadarea)。
一旦捕获到某个事件.控制器将从PaRAM顶部的64组入口参数中读取数据对应的控制参数送往地址发生器硬件。
表1给出1组EDMA传输参数的内部结构,总共6个字.192bit。
可以通过32bit的外设总线对EDMA的参数RAM进行访问。
表1
可选参数(OptionParameter),32bit,用户可以根据情况选择设置该参数,主要用来控制edma传送的规则,比如:
一维单元同步,一维帧同步,二维等等。
这些控制属性得在这个域里面对其进行说明。
SRC/DST地址.32bit,用于存放EDMA访问起始的源地址和目的地址,可以通过可选参数中的SUM/DUM位设定对SRC/DST地址的修改方式。
数据元素数目(ElementCount),16bit无符号数.存放l帧(1一D传输)或1个数组2一D传输)中的数据元素数目。
帧/数组数目(Frame/ArrayCount),16bit无符号数.存放的是1-D数据传输中的帧数目,或是2一D数据传输中的数组数目。
数据元素/帧/数组索引(Element/Frame/ArrayIndex).16bit无符号数,作为地址修改的索引值。
数据元素索引只应用于1-D传输,为下一数据元素的地址偏移值(2-D传输不允许数据单元间隔存放)。
帧/数组索引用于控制下一帧/数组的地址索引,为下一帧/数组的地址偏移值。
数据计数的重加载(ElementCountReload),16bit无符号数。
用于在每帧最后一个数据元素传输之后.重新加载传输计数值。
这个参数只能用于1一D传输中。
链接地址(LinkAddress),16bit。
当设定可选参数中的LINK=1时,可以由链接地址确定下1个EDMA事件采用参数的装载/重装载地址,从而使多组EDMA传输参数形成EDMA传输链。
(注,参数说明:
要传递数据首先得确定一个传输规则,这是由可选参数来确定的,然后需要知道待传输的数据从哪儿来,即传输数据的源地址,同时还要知道传送数据的多少,即帧数/数组数和数据元素的数目,还要知道数据传到哪儿去,即目的地址,传完这一帧/一个数组和一个数据元素以后下一帧/一个数组和下一个数据元素的地址,这是通过对应的偏移地址来计算的,最后在传输完每一帧的最后一个数据元素以后要重新加载数据元素的计数值来计下一帧的数据元素的个数,同时在这组参数设定的传输完成以后还可以链接到下一个事件的参数,然后进行下一个事件对应的数据传输,这样将不同的传输参数组链接起来,形成一个参数链,为同一个通道服务。
这一链接是通过设定可选参数中的LINK=1由EDMA内部实现的)
EDMA数据传输类型:
EDMA有两种类型的数据传输:
1D和2D的(OPT.2DS和OPT.DDS标示源地址和目的地址的数据传输类型,即有4种组合方式);数据的维数表明了数据的组成方式:
①1D数据
数据组成是“块->帧->元素”;一个块中的每帧数据是独立处理(即可以理解亦为2D数据,但是第二维永远是1),每次处理是一个元素,因此一帧中的数据元素可以是在同一个内存地址、连续的地址或者是与同一帧中的前面的数据元素地址具有一定偏移(Offset,由ELEIDX通道参数指定)的某地址;不同帧之间的内存地址偏移由FRMIDX通道参数指定(两帧的第一个元素之间的偏移或者后一帧的第一个元素的地址与前一帧的最后一个元素地址的偏移,具体依赖于通道参数FS的设定);每帧的数据元素个数可以不同,由通道参数ELECNT指定,传完一帧数据后由ELERLD重新载入块中的下一帧的数据元素个数ELECNT;块中的帧的个数由通道参数FRMCNT指定;
1D数据传输有两种同步方式:
OPT.FS=0,元素同步方式;OPT.FS=1,帧同步方式;
元素同步时,一次同步事件引起一帧中的一个元素的传输,每传输一次ELECNT递减1;当同步事件触发时,ELECNT=1表明是一帧的最后一个数据元素,此时EDMA控制器除了完成最后这个元素的传输外,还需要重新载入ELECNT(通过ELERLD)并且FRMCNT递减1;ELEIDX表示元素之间的偏移,FRMIDX表示一帧的最后一个元素和下一帧的第一个元素之间的偏移;如果OPT.LINK=1时,传输完成中断产生(FRMCNT=0)就重新从PRAM中载入当前通道的其他参数;
帧同步时,一次同步事件引起一帧数据的传输,FRMIDX表示两帧的第一个元素之间的偏移;
②2D数据
数据组成为“块->数组->元素”,同一数组中的元素是连续存放的,因此ELEIDX无意义;数组中的元素索引表示2D的第一维,块中的数组索引表示2D的第二维;FRMIDX的值依赖于OPT.FS的设定;
数组同步OPT.FS=0:
表示一次同步事件传输一个数组,此时FRMIDX是数组首地址之间的偏移;每传完一个数组,FRMCNT递减1;当OPT.LINK=1并且FRMCNT递减至0时,从PRAM的中重新载入当前通道的其他参数;
块同步OPT.FS=1:
表示一次同步事件传输一个块;FRMIDX表示前一个数组的最后一个元素的地址与后一个数组的第一个元素的地址之间的偏移;如果OPT.LINK等于1,则当整块数据传完时,重新从PRAM中为当前通道载入新的参数;
EDMA的传输操作
EDMA进行数据传输时有2种启动方式,1种是CPU启动.另1种是由同步事件触发。
每1个通道的启动是相互独立的。
前一种是CPU主动启动EDMA的操作,后一种一般应用于需要由外部中断信号或定时器等触发EDMA启动
1、CPU启动EDMA/非同步的EDMA
CPU可以通过写事件置位寄存器(ESR)启动1个EDMA通道。
向ESR中某1位写1时,将强行触发对应的事件。
此时,与正常的事件响应过程类似,EDMA的PaRAM中的传输参数被送入地址发生器.完成对EMIF、L2存储器或外设的存取访问。
由CPU启动的EDMA属于非同步的数据传输。
EER(事件使能寄存器)中的事件使能与否不会影响这种EDMA传输的启动(因为通过CPU写ESR是强行触发事件,所以不需要使能)。
2、由事件触发EDMA
一旦事件编码器捕获到1个触发事件并锁存在ER寄存器中,将导致PaRAM中对应的参数被送入地址发生器.进而执行有关的传输操作。
尽管是由事件启动传输操作,但是事件本身必须首先被CPU使能。
EER寄存器负责控制事件的使能。
触发EDMA传输的同步事件可以源于外设,外部器件的中断或某个EDMA通道结束。
与DMA的情况不同,与EDMA的每1个通道相关联的触发事件是固定的。
因此,如果假设EER中的EVT4=1,那么EXT_INT4引脚的外部中断信号就会启动EDMA通道4的传输。
所以,每个事件也就指定了1个特定的EDMA通道。
EDMA程序
此例为对csl的直接调用。
实现功能:
打开并初始化EDMA_CHA_GPINT11通道,使用寄存器配置方式从src到dst数据表格的拷贝。
传输数据量:
16个16位单字。
myhedma=EDMA_open(EDMA_CHA_GPINT11,EDMA_OPEN_RESET);
//openedma.
EDMA_config(myhedma,&myconfig);
//configureedma.
EDMA_enableChannel(myhedma);
打开并配置edma。
因edma与dma不同,他基于事件触发,所以我们手工写edma事件置位寄存器让其工作。
如下
EDMA_setChannel(myhedma);
等待EVM642_wait(1000);
最后检验是否被正确搬移并关闭edma
for(I=0;I<=N-1;I++){
if(dst[I]!
=0xBEEFu)
{++err;}
EDMA_close(myhedma);
点击ccs的view菜单的watchwindow,打开watchwindow窗口,运行程序,在watch1下输入src及dst可以看到已正确拷贝。
TIMER程序
本程序从ASK_DEFAULT,
IRQ_IEMASK_DEFAULT
};
第一个为中断函数地址,Thisistheaddressoftheinterruptserviceroutinetobecalledwhentheinterrupthappens.ThisfunctionmustbeC-callableandmustNOTbedeclaredusingtheinterruptkeyword.
第二个为函数传递参数。
第3个为Cachecontrolmask:
决定DSP/BIOSdispatcher处理cache设置,可选模式具体见csl文档。
。
第4个Interruptenablemask。
决定处理中断时howinterruptsaremasked。
有三种选择
UseIRQ_IEMASK_ALLtomaskoutallinterruptsincludingself,屏蔽所有中断,useIRQ_IEMASK_SELFtomaskself(preventanISRfrompreemptingitself),orusethedefaultwhichisthesameasIRQ_IEMASK_SELF。
IRQ_setVecs(myIvtTable);
设置中断向量基地址
eventId=TIMER_getEventId(hTimer1);
获取timer1的irq事件id号。
IRQ_config(eventId,&myConfig);
配置该irq。
IRQ_enable(eventId);
IRQ_globalEnable();
使能中断。
该程序中的timer1在dsp/bios中的配置如上一程序。
interruptvoidmyIsr()
上面指定的中断函数。
注意前面应加上interrupt。
程序中为空,可以根据需要加上相关代码。
mian.c代码
#include
#include
#include
#include"Config1cfg.h"
#defineNVECTORS256
#pragmaDATA_SECTION(myIvtTable,".myvec")
intmyIvtTable[NVECTORS];
interruptvoidmyIsr();
IRQ_ConfigmyConfig={
myIsr,
0x00000000,
IRQ_CCMASK_DEFAULT,
IRQ_IEMASK_DEFAULT
};
main(){
Uint16eventId;
intold_intm;
old_intm=IRQ_globalDisable();
IRQ_setVecs(myIvtTable);
eventId=TIMER_getEventId(hTimer1);
IRQ_config(eventId,&myConfig);
IRQ_clear(eventId);
IRQ_enable(eventId);
IRQ_globalRestore(old_intm);
TIMER_start(hTimer1);
IRQ_globalEnable();
}
interruptvoidmyIsr()
{
}
Config1cfg.h代码
/*Do*not*directlymodifythisfile.Itwas*/
/*generatedbytheConfigurationTool;any*/
/*changesriskbeingoverwritten.*/
/*INPUTConfig1.cdb*/
#defineCHIP_DM6421
/*IncludeHeaderFiles*/
#include
#include
#include
#include
#include
#include
#ifdef__cplusplus
extern"C"{
#endif
externfarHST_ObjRTA_fromHost;
externfarHST_ObjRTA_toHost;
externfarSWI_ObjKNL_swi;
externfarSWI_ObjSWI0;
externfarTSK_ObjTSK_idle;
externfarLOG_ObjLOG_system;
externfarSTS_ObjIDL_busyObj;
externfarvoidCSL_cfgInit();
#ifdef__cplusplus
}
#endif/*extern"C"*/
Config1cfg_c.c代码
/*Do*not*directlymodifythisfile.Itwas*/
/*generatedbytheConfigurationTool;any*/
/*changesriskbeingoverwritten.*/
/*INPUTConfig1.cdb*/
/*IncludeHeaderFile*/
#include"Config1cfg.h"
#ifdef__cplusplus
#pragmaCODE_SECTION(".text:
CSL_cfgInit")
#else
#pragmaCODE_SECTION(CSL_cfgInit,".text:
CSL_cfgInit")
#endif
#ifdef__cplusplus
#pragmaFUNC_EXT_CALLED()
#else
#pragmaFUNC_EXT_CALLED(CSL_cfgInit)
#endif
/*ConfigStructures*/
/*Handles*/
/*
*========CSL_cfgInit()========
*/
voidCSL_cfgInit()
{
}
main.c代码
#include
#include
#defineN16
#pragmaDATA_SECTION(src,".damMem")
//PUTSRCINDMAMEMSECTION
#pragmaDATA_ALIGN(src,256)
//alignsrc
Uint16src[N]={
0xBEEFu,0xBEEFu,0xBEEFu,0xBEEFu,0xBEEFu,0xBEEFu,0xBEEFu,0xBEEFu,0xBEEFu,
0xBEEFu,0xBEEFu,0xBEEFu,0xBEEFu,0xBEEFu,0xBEEFu,0xBEEFu,};
#pragmaDATA_SECTION(dst,".dmaMem")
Uint16dst[N];
EDMA_Configmyconfig={
EDMA_OPT_RMK(
EDMA_OPT_PRI_LOW,//edmaprivilege
EDMA_OPT_ESIZE_16BIT,//
EDMA_OPT_2DS_NO,
EDMA_OPT_SUM_INC,
EDMA_OPT_2DD_NO,
EDMA_OPT_DUM_INC,
EDMA_OPT_TCINT_NO,
EDMA_OPT_TCC_OF(0),
EDMA_OPT_TCCM_OF(0),
EDMA_OPT_ATCINT_NO,
EDMA_OPT_ATCC_OF(0),
EDMA_OPT_PDTS_DEFAULT,
EDMA_OPT_PDTD_DEFAULT,
EDMA_OPT_LINK_NO,
EDMA_OPT_FS_YES
),
EDMA_SRC_OF(&src[0]),
EDMA_CNT_OF(N),
EDMA_DST_OF(&dst[0]),
EDMA_IDX_OF(0x00000002),
EDMA_RLD_OF(0x00000000)
};
//parameterofedma
voidtaskFunc(void);
//announceoftask
voidmain(){
CSL_init();
//ifyouwanttousecslmodules,csl_init()functionmustbecalledfirst.
taskFunc();
//starttaskfunc()
}
voidtaskFunc(void){
Uint16err=0;
//thenumberofwrongmember
Uint16I;
EDMA_Handlemyhedma;
//edmahandle
myhedma=EDMA_open(EDMA_CHA_GPINT11,EDMA_OPEN_RESET);
//openedma.
EDMA_config(myhedma,&myconfig);
//configureedma.
EDMA_enableChannel(myhedma);
EDMA_setChannel(myhedma);
//softtriggeranEDMAchannel
EVMDM642_wait(1000);
//wait
for(I=0;I<=N-1;I++){
if(dst[I]!
=0xBEEFu)
{++err;}
//judge
}
EDMA_close(myhedma);//closetheedma
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDMA