Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2633761
  • 博文数量: 333
  • 博客积分: 4817
  • 博客等级: 上校
  • 技术积分: 4413
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-28 10:51
文章分类

全部博文(333)

文章存档

2017年(20)

2016年(57)

2015年(27)

2014年(20)

2013年(21)

2012年(164)

2011年(24)

分类: 嵌入式

2012-11-09 19:25:23

转:

问:

怎样给每个核分配不同的channel,然后设置不同的参数。然后多核同时传输数据“Channels and parameter RAM can be separated by software into regions, with each 

region assigned to a core.”这是多核里的一句话,现在就是不明白怎么样让EDMA分成多个channel!!!!


答:

1. 涅磐了就离成功不远了,这句话应该这么理解:首先EDMA的的channel对应到系统中就是一个能够触发EDMA传输的事件,当系统中该事件产生后,对 应的EDMA  channle controller就会收到这个事件的信号,此时EDMA控制器会根据配置来判断是不是要进行数据传输,如果产生的事件被使能了,那么EDMA控制器就 会把传输请求向后面的处理模块提交,这里就用到了parameter RAM(PaRAM),EDMA会根据PaRAM定义的源地址,目的地址,数据长度和传输方式进行传输。

2. 以上就是一个EDMA传输的基本过程,因为EDMA传输事件(channel)是多core共享的,如果一个EDMA传输事件只想某一个core来响应, 而其他core不去响应,就要用到region的概念。每个EDMA控制器可以分成8个region,如果要使用对应的region,那么就需要配置 DRAE和DRAEH寄存器,这两个寄存器每个bit代表一个EDMA 传输事件,如果置1,那么当系统中该事件产生时,对应region就会去响应这个EDMA传输事件,如果为0,那么即便系统中产生了该EDMA传输事件, 所使用的region也不会去响应这个事件,这样就能让多核将共享的EDMA传输事件按需分配。

3. 另外PaRAM是所有EDMA传输事件共享的,在6678中只有3个EDMA控制器,如果有多个core共享一个EDMA控制器,那么PaRAM也要共 享,所以要按照region分配的EDMA传输事件将PaRAM进行划分,保证不同EDMA传输事件不共享同一个PaRAM。


问:

我大概明白了,又还是有不明白的。可能跟原来没有DSP开发经验,也没有相关的DSP培训课程有关吧....对于DSP一头雾水。看了手册,把自己的程序改成这个样子(原来7个核都是用了region_global)现在一个核用一个region

如:

CSL_Edma3Obj edmaObj;
 CSL_Edma3ChannelObj  chObj;
 CSL_Edma3CmdIntr regionIntr;
 CSL_Edma3Context context;
 CSL_Edma3ChannelAttr chAttr;
 CSL_Status status;

 unsigned char channelNum = 0;
 unsigned char instNum = 1;

//initialize the edma3

        CSL_edma3Init(&context);

        hMoudle = CSL_edma3Open(&edmaObj,instNum,NULL,&status);

        chAttr.regionNum = CSL_EDMA3_REGION_0 ;

        chAttr.chaNum = channelNum;//channel number是0因为原来那个程序就是那样的,我也没敢动

        hChannel = CSL_edma3ChannelOpen(&chObj,instNum,&chAttr,&status);

        CSL_edma3HwChannelSetupQue(hChannel,CSL_EDMA3_QUE_0);

        CSL_edma3MapDMAChannelToParamBlock(hMoudle,channelNum,0);

        hParamPing = CSL_edma3GetParamHandle(hChannel,0,&status);

        regionIntr.region = CSL_EDMA3_REGION_0;

        regionIntr.intr = 0x1;

        regionIntr.intrh = 0x0;

        CSL_edma3HwControl(hMoudle,CSL_EDMA3_CMD_INTR_ENABLE,®ionIntr);

       myParamSetup.option = 0x00100008;//block move

  myParamSetup.srcAddr = (Uint32)(srcbuf+(DNUM-1)*64);

    myParamSetup.aCntbCnt = 0x00010040;

    myParamSetup.dstAddr = (Uint32)(dstbuf+(DNUM-1)*64);

  myParamSetup.srcDstBidx = 0x0;

  myParamSetup.linkBcntrld = 0x0000ffff;

  myParamSetup.srcDstCidx = 0x0;

  myParamSetup.cCnt = 0x00000001;

  CSL_edma3ParamSetup(hParamPing,&myParamSetup);

  CSL_edma3HwChannelControl(hChannel,CSL_EDMA3_CMD_CHANNEL_SET,NULL);

  regionIntr.region = CSL_EDMA3_REGION_0;

  regionIntr.intr = 0x0;

  regionIntr.intrh = 0x0;

  for(;FLAG_TAG!=1;){}

do

       {

     CSL_edma3GetHwStatus(hMoudle,CSL_EDMA3_QUERY_INTRPEND,®ionIntr);

       }

       while (!(regionIntr.intr & 0x1));

 CSL_edma3HwControl(hMoudle,CSL_EDMA3_CMD_INTRPEND_CLEAR,®ionIntr);

 CSL_edma3ChannelClose(hChannel);

 CSL_edma3Close(hMoudle);

 

现在的情况是EDMA不能搬数了...您知道是为什么吗,跟我改错了参数有关,那么如果我要不同的核用不同的region应该怎么改呢?(我的CSL的paraRAM的vector放在了各自核的L2SRAM里,应该不影响吧就是在.cmd的地方写的。)

 

谢谢了~真是大好人!!!!


答:

你是想多核同时操作EDMA吗?给你提几个建议

1。我觉得其实你的程序里红色的部分,也就是region,可改可不改,多核同时用global region操作不会有问题的,可以熟悉了以后再改。

2。多核同时操作,关键点是要使用不同的EMDA chanel 和EDMA PaRAM。所以你需要改的地方是这。

   chAttr.chaNum = corenumber;//  这里的 channelNum  可以改成corenumber 表示使用不同的chanel

      CSL_edma3MapDMAChannelToParamBlock(hMoudle,corenumber,corenumber);//这里把不同的chanel映射到不同的PaRAM

      hParamPing = CSL_edma3GetParamHandle(hChannel,corenumber,&status);//这里设置不同的PaRAM

    设置就这些,总之保证每个核使用不同的chanel和PaRAM就可以。传输的时候根据不同的通道设置一下ESR寄存器相应位手动触发EDMA同步事件 就可以了。

3. paraRAM使用的地址是固定的~  是一个全局地址 多核都可以操作的 我记得是EDMA0的  是0x02704000开始

  EDMA1的  是0x02724000开始.这个你分配的是没用的。



问:

我又小白了..."传输的时候根据不同的通道设置一下ESR寄存器相应位手动触发EDMA同步事件 就可以了。"弱弱的问一下怎么设置ESR相应位呢?

我知道手动触发是

regionIntr.region = CSL_EDMA3_REGION_0;

 regionIntr.intr = 0x0;

 regionIntr.intrh = 0x0;

需要设置哪个呢???

谢谢啦!!!!!超级感谢!!!!



答:

你说的这三个是设置中断使能的~

设置同步事件的语句是这个。

CSL_edma3HwChannelControl(hChannel,CSL_EDMA3_CMD_CHANNEL_SET,NULL);

有的问题你直接在文档里一搜就有答案了。比如XX寄存器是做什么用的。。

阅读(8294) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~