TI中文支持网
TI专业的中文技术问题搜集分享网站

EDMA在进行Ping-pong传输的时候可以在不停止的情况下改变空闲par配置的数据长度嘛?

现在我有这么个应用,需要ping-pong不间断的传输两块数据,但是在传输一个块的时候,往另一个块里面填数据,有时候在空闲块填数据的时候还需要改变空闲块的b-cnt长度值,都是32位对其的,但是现在在实际的使用过程中发现这样子的话,有比较低的几率,一天基本上只出现一次,就是这个通道的中断没有了,数据也不搬运了,但是其它通道的EDMA还是正常的,所以我想请问大家在Ping-pong运行的过程中是不是可以改变空闲par长度配置,还是必须要停止通道传输再改变长度值?

Tony Tang:

出问题时,相应通道的EDMA参数是什么值,有没有什么线索,另外EMR里有没有置位?改长度与响应EDMA中断服务程序的前后关系是什么样子,会不会还没改完参数,EDMA已搬完link过来了?

bingliang chen:

回复 Tony Tang:

用示波器抓了一下EDMA的中断函数处理时间,都是在微秒级别的,这个mcbsp的发送Ping-pong是在5毫秒左右微调的,应该不会出现传输块跟修改块同一块的情况,还有你说的edma配置,出问题时我讲所有的全局寄存器和ping-pong这个chain都打印出来了,配置上跟好的时候是一致的。

现在还有另外一个问题,我还使用了串口的发送edma,大概60毫秒左右发送一次,用事件触发,edma的中断处理函数参考startware里面的例子的中断处理,但是很奇怪的是每隔几百次就会有一次在读取IPR时,只有mcbsp的发送IPR置位,然后按照startware里面的EDMA中断处理函数的处理,在清除对应的IPR之后会再次读取IPR寄存器,就是在这次读取的时候串口发送的IPR就置位了,这样子就出现了串口发送edma就会丢事件就是你说的event missed,然后我将edma的中断处理函数里面的读取IPR值修改为不是每次清除一个IPR就重新读取一次IPR,修改为就读取一次IPR,然后保存到局部变量,只进行第一个读取的IPR的清除和中断回调处理,这样子带来的结果是所有的EDMA中断都不触发了,然后我又改为关闭中断嵌套,每次在EDMA的中断处理函数里面就就只执行一个事件清除,因为在一个EDMA中断处理函数里面清除两个IPR的话必然会导致有一个事件是丢失了,请问这个问题该怎么解决?

也就是说我将EDMA的中断处理函数的实现改为只读取一次IPR的时候,就算这次读取有两个地方置位我都处理了,以后的EDMA也不产生中断了,必须要清理完第一次读取的IPR对应置位位置之后,再次读取IPR寄存器,保证读取结果全部为零,再退出EDMA中断处理函数才能保证下次EDMA中断还能正常产生,但是这样子就会出现上面说的几百次就会有一个事件丢失,因为一个事件触发了中断处理函数,但是中断处理函数却处理掉了两个事件。

Tony Tang:

回复 bingliang chen:

你说的串口都是指的McBSP吗。

从上面的IPR描述,还是EDMA的中断处理的问题,在EDMA章节里有说到EDMA的ISR里要确保IPR没有置位的才退出,你说的是DMA没响应还是中断不响应啊?

另外你说到中断嵌套,是在ARM端的还是DSP端的程序?

bingliang chen:

回复 Tony Tang:

这个是DSP端的程序,串口是uart,因为mcbsp.uart.mcasp的edma中断都是同一个中断处理函数,只是根据不同的通道进行不同的对应中断处理执行,每次处理完还要通过IPR寄存器确保OPR寄存器为零,但是这样会导致一个问题,就是中断太多,在一次进去中断处理函数的情况中清楚两次IPR,虽然不会丢中断,但是会进去edma错误处理的event miss,只能通过手动置位EVAL寄存器进行手动再触发中断,以免中断延时。这里我想请问一下,怎么写edma
中断处理函数能确保事件不丢失?

bingliang chen:

回复 Tony Tang:

确实是事件太频繁了。TI也提供了EVAL寄存器,在多个中断同时触发时可以进行补充。

赞(0)
未经允许不得转载:TI中文支持网 » EDMA在进行Ping-pong传输的时候可以在不停止的情况下改变空闲par配置的数据长度嘛?
分享到: 更多 (0)