日韩欧美国产极速不卡一区,国产手机视频在线观看尤物,国产亚洲欧美日韩蜜芽一区,亚洲精品国产免费,亚洲二区三区无码中文,A大片亚洲AV无码一区二区三区,日韩国语国产无码123

您好,歡迎來到維庫電子市場網(wǎng) 登錄 | 免費(fèi)注冊

EDMA
閱讀�11985�(shí)間:2010-12-21 10:39:24

  EDMA控制器可以獨(dú)立于CPU處理L2 Cache/SRAM和C64x外設(shè)之間的數(shù)�(jù)傳輸,包括:Cache服務(wù)、非Cache存儲器存�、用戶編程的�(shù)�(jù)傳輸和主�(jī)(host)存取�。所謂“通道”并不是指物理傳輸通道(EDMA控制�、DMA總線�,而是指不同內(nèi)容(傳輸源地址、目的地址、傳輸數(shù)量、觸�(fā)方式等)的DMA傳輸。用戶在系統(tǒng)初始化時(shí)可事先設(shè)置好許多不同的DMA通道,以便實(shí)際運(yùn)行時(shí)可以一�(gè)接一�(gè)地�(jìn)行不同的DMA傳輸,而不必臨�(shí)再設(shè)置通道�

組成

  EDMA控制器由以下部分組成�

  事件和中斷處理寄存器

  事件編碼�

  參數(shù)RAM

  硬件地址�(chǎn)生器

  事件寄存器完成對EDMA事件的捕�、控�。若有多�(gè)事件同時(shí)�(fā)�,由事件編碼器對它們�(jìn)行處理(將同�(shí)�(fā)生的事件�(jìn)行排�(duì)��

  參數(shù)RAM存放與事件相�(guān)(各通道)的傳輸參數(shù);這些參數(shù)送入硬件地址�(fā)生器以產(chǎn)生對EMIF/外設(shè)的存取地址�

控制�(jī)�

  1 、事件與事件控制寄存�

  EDMA�64�(gè)通道.每1�(gè)通道都有1�(gè)事件與之�(guān)�(lián).由這些事件觸發(fā)相應(yīng)通道的傳��

  2� 傳輸參數(shù)與參�(shù)RAM

  EDMA控制器與DMA控制器在�(jié)�(gòu)上有所區(qū)�。C64x的.EDMA控制器是基于RAM�(jié)�(gòu)。參�(shù).RAM(Parameter RAM。PaRAM)的容量是2KB,總共可以存�85組EDMA傳輸控制參數(shù)。多組參�(shù)還可以彼此連接起來,從而實(shí)�(xiàn)某些�(fù)�(zé)�(shù)�(jù)流的傳輸.例如循�(huán)緩存和數(shù)�(jù)排序等。參�(shù)RAM中保存的�(nèi)容包括:

  64�(gè)EDMA通道對應(yīng)的入口傳輸參�(shù).每組參�(shù)包括6�(gè)��

  用于重加�,鏈接的傳輸參數(shù)�。每組參�(shù)包括24字節(jié)�

  8字節(jié)空余的RAM可以作為“草稿區(qū)�(scratchpad area)�

  一旦捕獲到某�(gè)事件.控制器將從PaRAM頂部�64組入口參�(shù)中讀取數(shù)�(jù)對應(yīng)的控制參�(shù)送往地址�(fā)生器硬件�

  �1給出1組EDMA傳輸參數(shù)的內(nèi)部結(jié)�(gòu),總�6�(gè)字.192bit??梢酝ㄟ^32bit的外�(shè)總線對EDMA的參�(shù).RAM�(jìn)行訪��

EDMA的參數(shù)存儲結(jié)構(gòu)

  可選參數(shù)(Option Parameter)�32bit,用戶可以根�(jù)情況選擇�(shè)置該參數(shù)�

  SRC/DST地址�32bit,用于存放EDMA訪問起始的源地址和目的地址,可以通過可選參數(shù)中的SUM/DUM位設(shè)定對SRC/DST地址的修改方��

  �(shù)�(jù)單元�(jì)�(shù)(Element Count)�16bit無符號數(shù).存放l幀(1一D傳輸)�1�(gè)陣列(2一D傳輸)中的�(shù)�(jù)單元�(shù)�

  幀/陣列�(jì)�(shù)(Frame/Array Count)�16bit無符號數(shù).存放的�1-D�(shù)�(jù)傳輸中的幀�(jì)�(shù),或�2一D�(shù)�(jù)傳輸中的陣列�(jì)�(shù)�

  �(shù)�(jù)單元,幀,陣列索�(Element/Frame/ArrayIndex)�16bit無符號數(shù),作為地址修改的索引�。數(shù)�(jù)單元索引只應(yīng)用于1-D傳輸,為下一�(shù)�(jù)單元的地址偏移�(2一D傳輸不允許數(shù)�(jù)單元間隔存放)。幀,陣列索引用于控制下一幀,陣列的地址索引�

  �(shù)�(jù)�(jì)�(shù)的重加載(Element Count Reload)�16bit無符號數(shù)。用于在每幀一�(gè)�(shù)�(jù)元素傳輸之后.重新加載傳輸計(jì)�(shù)�。這�(gè)參數(shù)只能用于1一D傳輸��

  鏈接地址(Link Address)�16bit。當(dāng)�(shè)定可選參�(shù)中的LINK=1�(shí),可以由鏈接地址確定�1�(gè)EDMA事件采用參數(shù)的裝�,重裝載地址,從而使多組EDMA傳輸參數(shù)形成EDMA傳輸��

傳輸操作

  EDMA�(jìn)行數(shù)�(jù)傳輸�(shí)�2種啟動方��1種是CPU啟動.另1種是由同步事件觸�(fā)。每1�(gè)通道的啟動是相互�(dú)立的�

  1 、CPU啟動EDMA/非同步的EDMA

  CPU可以通過寫事件置位寄存器(ESR)啟動1�(gè)EDMA通道。向ESR中某1位寫1�(shí),將�(qiáng)行觸�(fā)對應(yīng)的事件。此�(shí),與正常的事件響�(yīng)過程類似,EDMA的PaRAM中的傳輸參數(shù)被送入地址�(fā)生器.完成對EMIF、L2存儲器或外設(shè)的存取訪�。由CPU啟動的EDMA屬于非同步的�(shù)�(jù)傳輸。EER中的事件使能與否不會影響這種EDMA傳輸?shù)膯�?/FONT>

  2� 由事件觸�(fā)EDMA

  一旦事件編碼器捕獲�1�(gè)觸發(fā)事件并鎖存在ER寄存器中,將�(dǎo)致PaRAM中對�(yīng)的參�(shù)被送入地址�(fā)生器.�(jìn)而執(zhí)行有�(guān)的傳輸操�。盡管是由事件啟動傳輸操作,但是事件本身必須首先被CPU使能。EER寄存器負(fù)�(zé)控制事件的使�。觸�(fā)EDMA傳輸?shù)耐绞录梢栽从谕庠O(shè),外部器件的中斷或某�(gè)EDMA通道�(jié)�。與DMA的情況不�,與EDMA的每1�(gè)通道相關(guān)�(lián)的觸�(fā)事件是固定的。因�,如果假�(shè)EER中的EVT4=1,那么EXT_INT4引腳的外部中斷信號就會啟動EDMA通道4的傳�。所�,每�(gè)事件也就指定�1�(gè)特定的EDMA通道�

程序

  此例為對csl的直接調(diào)��

  �(shí)�(xiàn)功能:打開并初始化EDMA_CHA_GPINT11通道,使用寄存器配置方式從src到dst�(shù)�(jù)表格的拷��

  傳輸�(shù)�(jù)量:16�(gè)16位單��

  myhedma=EDMA_open(EDMA_CHA_GPINT11,EDMA_OPEN_RESET);

  //open edma .

  EDMA_config(myhedma,&myconfig);

  //configure edma.

  EDMA_enableChannel(myhedma);

  打開并配置edma�

  因edma與dma不同,他基于事件觸發(fā),所以我們手工寫edma事件置位寄存器讓其工�。如�

  EDMA_setChannel(myhedma);

  等待EVMDM642_wait(1000);

  檢驗(yàn)是否被正確搬移并�(guān)閉edma

  for(I=0;I<=N-1;I++){

  if(dst[I]!=0xBEEFu)

  {++err;}

  EDMA_close(myhedma);

  �(diǎn)擊ccs的view菜單的watch window,打開watch window窗口,運(yùn)行程�,在watch1下輸入src及dst可以看到已正確拷貝�

  TIMER程序

  本程序從dsp/bios圖形配置工具中靜�(tài)�(shè)置timer。首先在dsp/bios中右擊TIMER Configuration Manager,創(chuàng)建一timer配置

  然后在下的tmer resource manager下選擇timer1,(timer0已被dspbios使用,不可再使用)右擊,選屬��

  Open Timer Device

  Handle hTimer1

  Enable pre-Initialization

  pre-Initialize timerCfg0

  到此,即配置好timer1.在程序中打開timer1,首先對中斷�(jìn)行必要的處理,然后打開timer1工作。在由dspbios自動生成的文件Config1cfg_c.c中可以看到相�(yīng)的代�

  TIMER_Config timerCfg0 = {

  0x00000305, /* Control Register (CTL) */

  0x00000080, /* Period Register (PRD) */

  0x00000000 /* Counter Register (CNT) */

  };

  void CSL_cfgInit()

  {

  hTimer1 = TIMER_open(TIMER_DEV1, TIMER_OPEN_RESET);

  TIMER_config(hTimer1, &timerCfg0);

  }

  void timer_isr(void)為中斷處理函�(shù),每�(yùn)行一�,timer_int_cnt自加1.�(yùn)行程�,打斷點(diǎn),在watch window可以看到timer_int_cnt一直在增加,直�20�

  IRQ模塊

  IRQ模塊為cpu提供一�(gè)用于管理外設(shè)中斷的控制接�。其配置參數(shù)如下�

  IRQ_Config myConfig = {

  myIsr,

  0x00000000,

  IRQ_CCMASK_DEFAULT,

  IRQ_IEMASK_DEFAULT

  };

  �(gè)為中斷函�(shù)地址,This is the address of the interrupt service routine to be called when the interrupt happens. This function must be C-callable and must NOT be declared using the interrupt keyword.

  第二�(gè)為函�(shù)傳遞參數(shù)。第3�(gè)為Cache control mask: 決定DSP/BIOS dispatcher處理cache �(shè)�,可選模式具體見csl文檔�

  。第4�(gè)Interrupt enable mask。決定處理中斷時(shí)how interrupts are masked。有三種選擇

  Use IRQ_IEMASK_ALL to mask out all interrupts including self,屏蔽所有中斷,use IRQ_IEMASK_SELF to mask self (prevent an ISR from preempting itself), or use the default which is the same as IRQ_IEMASK_SELF�

  IRQ_setVecs(myIvtTable);

  �(shè)置中斷向量基地址

  eventId=TIMER_getEventId(hTimer1);

  獲取timer1的irq 事件id號�

  IRQ_config(eventId,&myConfig);

  配置該irq�

  IRQ_enable(eventId);

  IRQ_globalEnable();

  使能中斷�

  該程序中的timer1在dsp/bios中的配置如上一程序�

  interrupt void myIsr()

  上面指定的中斷函�(shù)。注意前面應(yīng)加上interrupt。程序中為空,可以根�(jù)需要加上相�(guān)代碼�

  mian.c代碼

  #include <csl.h>

  #include <csl_irq.h>

  #include <csl_timer.h>

  #include "Config1cfg.h"

  #define NVECTORS 256

  #pragma DATA_SECTION(myIvtTable,".myvec")

  int myIvtTable[NVECTORS];

  interrupt void myIsr();

  IRQ_Config myConfig = {

  myIsr,

  0x00000000,

  IRQ_CCMASK_DEFAULT,

  IRQ_IEMASK_DEFAULT

  };

  main(){

  Uint16 eventId;

  int old_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();

  }

  interrupt void myIsr()

  {

  }

  Config1cfg.h代碼

  /* Do *not* directly modify this file. It was */

  /* generated by the Configuration Tool; any */

  /* changes risk being overwritten. */

  /* INPUT Config1.cdb */

  #define CHIP_DM642 1

  /* Include Header Files */

  #include <std.h>

  #include <hst.h>

  #include <swi.h>

  #include <tsk.h>

  #include <log.h>

  #include <sts.h>

  #ifdef __cplusplus

  extern "C" {

  #endif

  extern far HST_Obj RTA_fromHost;

  extern far HST_Obj RTA_toHost;

  extern far SWI_Obj KNL_swi;

  extern far SWI_Obj SWI0;

  extern far TSK_Obj TSK_idle;

  extern far LOG_Obj LOG_system;

  extern far STS_Obj IDL_busyObj;

  extern far void CSL_cfgInit();

  #ifdef __cplusplus

  }

  #endif /* extern "C" */

  Config1cfg_c.c代碼

  /* Do *not* directly modify this file. It was */

  /* generated by the Configuration Tool; any */

  /* changes risk being overwritten. */

  /* INPUT Config1.cdb */

  /* Include Header File */

  #include "Config1cfg.h"

  #ifdef __cplusplus

  #pragma CODE_SECTION(".text:CSL_cfgInit")

  #else

  #pragma CODE_SECTION(CSL_cfgInit,".text:CSL_cfgInit")

  #endif

  #ifdef __cplusplus

  #pragma FUNC_EXT_CALLED()

  #else

  #pragma FUNC_EXT_CALLED(CSL_cfgInit)

  #endif

  /* Config Structures */

  /* Handles */

  /*

  * ======== CSL_cfgInit() ========

  */

  void CSL_cfgInit()

  {

  }

  main.c代碼

  #include <csl.h>

  #include <csl_edma.h>

  #define N 16

  #pragma DATA_SECTION(src,".damMem")

  //PUT SRC IN DMAMEM SECTION

  #pragma DATA_ALIGN(src,256)

  //align src

  Uint16 src[N]={

  0xBEEFu,0xBEEFu,0xBEEFu,0xBEEFu,0xBEEFu,0xBEEFu,0xBEEFu,0xBEEFu,0xBEEFu,

  0xBEEFu,0xBEEFu,0xBEEFu,0xBEEFu,0xBEEFu,0xBEEFu,0xBEEFu,};

  #pragma DATA_SECTION(dst,".dmaMem")

  Uint16 dst[N];

  EDMA_Config myconfig={

  EDMA_OPT_RMK(

  EDMA_OPT_PRI_LOW,//edma privilege

  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)

  };

  //parameter of edma

  void taskFunc(void);

  //announce of task

  void main(){

  CSL_init();

  //if you want to use csl modules ,csl_init() function must be called first.

  taskFunc();

  //start taskfunc()

  }

  void taskFunc(void){

  Uint16 err=0;

  //the number of wrong member

  Uint16 I;

  EDMA_Handle myhedma;

  //edma handle

  myhedma=EDMA_open(EDMA_CHA_GPINT11,EDMA_OPEN_RESET);

  //open edma .

  EDMA_config(myhedma,&myconfig);

  //configure edma.

  EDMA_enableChannel(myhedma);

  EDMA_setChannel(myhedma);

  //soft trigger an EDMA channel

  EVMDM642_wait(1000);

  //wait

  for(I=0;I<=N-1;I++){

  if(dst[I]!=0xBEEFu)

  {++err;}

  //judge

  }

  EDMA_close(myhedma);//close the edma

  }