附件为McBSP的EDMA简单例程,希望对初学者有所帮助。
1:
您好,可以发一个EDMA把一块256个字的数据块从外部存储器(0xA0000000)搬移到内部L2 SRAM(0x00002000)中的程序给我吗?谢谢啦,我的邮箱2399775147@qq.com
Tony Tang:
回复 1:
自己参考下面链接学着做吧: http://processors.wiki.ti.com/index.php/Programming_EDMA_without_EDMA3LLD_package
EP_Liu:
楼主你好,我在OMAP-L138上开发程序碰到一个问题,我用Mcasp + EDMA的组合,通常情况下Mcasp会触发2个事件,分别为AREVT0(Mcasp Receive Event)和AXEVT0(Mcasp Transmit Event),这2个事件会将EDMA3 Channel Controller 0里的通道0和通道1对应的事件寄存器里的bit位置1,从而触发配置好的edma3数据搬运。也就是说,如果采用事件触发edma的机制,对应的事件只能调动对应的通道控制器,在本例中就是mcasp只能触发edma3 cc 0来搬数,有没有办法让mcasp触发的事件为edma3 cc 1所用?因为现在太多太多的事件都默认的触发edma3 cc0,从而导致edma3 cc0压力比较大,资源抢占得很厉害,在我的实现里面,这确实引发了一些问题,楼主对这一块应该很熟悉了,能否给点建议?本菜不胜感激。
Tony Tang:
回复 EP_Liu:
不能在两个CC之间映射事件。
CC0有两个TC,你可以通过DMAQNUM寄存器将事件在两个TC之间做一个合理分配。
EP_Liu:
回复 Tony Tang:
感谢楼主的回复,对于DMAQNUM寄存器,我也有一个奇怪的发现:按文档的说法,分配到队列0的事件,会在tc0上发起数据传输,分配到队列1的事件,会在tc1上发起数据传输,我占用了3条edma通道,并且都分配到队列0上,因而并未将tc1模块power up,此时发现其中一条通道的大块数据传输会导致另外两条通道的EDMA事件不能被及时响应(技术文档中说是饿死)。此后,我仅仅将tc1模块power up,并未将通道和队列重新映射,也就是所有通道还是映射到tc0上,但是问题得到了解决,这三个通道事件之间的冲突没有了,都能得到及时的响应,这说明了一个问题,队列和tc模块之间的对应关系并不是绝对固死的,而是由传输控制器在进行合理的调度,最大限度的利用资源,请问楼主关于传输控制器的设计,是不是我这里理解的这样?如果不对,希望楼主能指正,以免在以后的开发中走弯路,谢谢。
Tony Tang:
回复 EP_Liu:
你说的这种悦应该不可能,TC1没有用到,使不使能不应该影响到TC0的传输,是不是程序中其它地方也有修改啊。
EP_Liu:
回复 Tony Tang:
刚才刻意改了下代码,进行对比测试,发现TC1没有使能的确没有影响到TC0的传输。可能以前修改代码时,有些细节没注意导致得到了错误的认识和结论,非常感谢楼主的指导。~
Tony Tang:
回复 EP_Liu:
顺便提一下,如果buffer是放在DDR上,DDR的PBBPR寄存器的设置会有一定的影响,建议设为0x20或以下。
EP_Liu:
回复 Tony Tang:
谢谢提醒,请问一下楼主,这个寄存器会造成什么影响?可否简单地说下?以前从来没有注意过ddr的这个配置寄存器。
Tony Tang:
回复 EP_Liu:
防“饿死”,系统中通常有多个master访问DDR,按优先级排队,当访问频繁时,低优先级的master可能永远得不到服务,通过这个寄存器的设置的值,每经过这个值的传输数后,低优先级的Master的事件优先级+1,这样一来,低优先级的事件逐渐会变成最高优先级,从而得到服务。