TI论坛
直播中

宋瑞雪

7年用户 287经验值
私信 关注
[问答]

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

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

回帖(3)

宋瑞雪

2019-8-22 13:26:12
用示波器抓了一下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中断还能正常产生,但是这样子就会出现上面说的几百次就会有一个事件丢失,因为一个事件触发了中断处理函数,但是中断处理函数却处理掉了两个事件。
举报

宋瑞雪

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

李波

2019-8-22 14:04:03
你的处理上并没有问题。
原因来自于中断事件太频繁,能不能加长buffer来延长中断的间隔呢?
                                                                         http://processors.wiki.ti.com/index.php/Main_Page
Think Over Before Asking.
http://www.catb.org/~esr/faqs/smart-questions.html#goal
举报

更多回帖

发帖
×
20
完善资料,
赚取积分