This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

两路McBSP的数据输出存在相对位移的问题,猜测可能与EDMA event Queue有关?

Other Parts Discussed in Thread: SYSBIOS

目前采用的开发平台为L138,DSP端采用sysbios,ARM端采用Linux,异常现象出现在DSP端,DSP端需要同时使用McBSP0、McBSP1作为射频数据收发和McASP作为音频数据的收发,相关参数如下所示,这些接口的收发均采用EDMA3 PingPongBuffer方式,DMA数据搬移采用A-sync,信道控制器0,事件队列均配置为队列0。

端口 外设 帧同步 数据位宽 时钟 1ms产生DMA事件数
McBSP1_Tx DAC(4ch) 512kHz 25bits 512*25kHz 512
McBSP0_Tx TxPll 128kHz 25bits 128*25kHz 128
McBSP1_Rx RxPll 72kHz 32*2bits(I2S) 72*32*2kHz 72*2
McASP_Tx Codec 8kHz 16*2bits(I2S) 8*16*2kHz 8*2
McASP_Rx Codec 8kHz 16*2bits(I2S) 8*16*2kHz 8*2

上述端口主要有以下两个应用场景:

1、采集音频,处理后送入射频,McBSP1_Tx、McBSP0_Tx、McBSP1_Rx、McASP_Rx四个端口会同时开启;
2、射频接收,处理后送入音频播放,McBSP1_Rx、McASP_Tx两个端口会同时开启。

测试过程中发现如下现象:
1、在场景1中,同时开启McBSP0_Tx、McBSP1_Tx、McBSP1_Rx、McASP_Rx时,McBSP0_Tx、McBSP1_Tx两路输出的数据在长时间运行过程中会逐渐产生相对位移,且McBSP1_Tx相对慢于McBSP0_Tx(从DAC和TxPll的输出可以看出波形相对位移,正常情况下两路应该是同步输出的);
2、在现象1的基础上,关闭McBSP1_Rx后,同时运行McBSP0_Tx、McBSP1_Tx、McASP_Rx不会存在现象1所述的产生相对位移的问题;
3、在现象2的基础上,开启打印调试功能后,存在现象1所述的产生相对位移的问题。

针对该问题也进行了一系列的调试,例如:
1、以现象1为基础,观察到两路的FS是完全同步的,不存在时钟偏移问题,排除了McBSP0_Tx、McBSP1_Tx两路时钟的影响;因此,比较怀疑McBSP数据线送数过程存在delay。由于采用DMA送数方式,进一步分析EDMA的工作机制,考虑事件队列串行输出可能存在阻塞的问题,因此以现象1为基础,将McBSP1_Rx的事件队列安排在队列1(优先级较低),却不会产生现象1的问题,因此判断该问题可能与事件队列阻塞有关。但此时场景2下的McBSP1_Rx的接收似乎不再顺畅,音频播放卡顿,可能是该试验中降低所用事件队列优先级的原因。

2、以现象3为基础,在线仿真观察QxEy寄存器,发现事件队列一直被事件15(SPI0 Transmit)占据,排查后发现,arm端的打印调试功能会在log输出的过程中将log信息存储到flash,在这过程中使用到SPI0,关闭log存储功能后,现象3不再出现,这进一步验证了我们关于事件队列阻塞McBSP0_Tx、McBSP1_Tx数据输出的猜想。

3、为了进一步确认事件队列阻塞数据输出的猜想,我们以现象1为基础,同时开启log存储功能,在线查看了事件队列状态寄存器,发现QSTATn.WM寄存器为3,QSTATn.NUMVAL为0,QSTATn.THRXCD为0,考虑到事件队列长度为16,最多只用到3项,似乎不是之前以为的事件队列占用太多的问题,又或许,即便WM为3,还是会对McBSP数据线产生影响?

4、同时,为何调试过程1中将McBSP1_Rx转到事件队列1后在场景2下会不再顺畅?针对该问题,我们以现象1为基础,开启打印输出,但关闭log存储,并将McBSP1_Rx转到事件队列1进行在线调试,此时事件队列0仍然有较多的事件15(SPI0 Transmit),可能是arm端文件系统有写数据的任务需求,而事件队列1主要由事件4(McBSP1 Receive)占据,可见也确实是在接收,但从最终输出音频结果看却是卡顿的,此时音频McASP仍在队列0,所以应当不会是音频播放的问题,只能是放到队列1的McBSP接收的问题。

根据数据手册,事件队列的优先级不由QUEPRI决定,而是由SYSCFG.MSTPRI1决定,目前系统的EDMA3_0_TC0、EDMA3_0_TC1优先级都已经是最高的了,但两个队列之间的优先级会有多大影响?优先级的工作机制又是怎样的?

因此,结合上述现象和已有的调试过程,请各位帮忙分析测试过程中出现异常现象的根源在什么地方?是否是事件队列的阻塞问题?又是否与队列优先级有关?如果有关,那么队列优先级的工作机制又是如何?在该应用中如何合理安排?还有EDMA的吞吐量极限是多少?

  • 非常感谢你对问题的详尽的描述。

    如讨论,这个问题可能是underflow引起的。关于underflow的描述,请见下面截屏。

    从上面看你的系统对于EDMA及MCBSP,MCASP的应用还是蛮复杂的。一旦系统负荷过高,很容易引起underflow, overflow之类的问题。

    在产生这种问题时,就需要进行系统级的调整,从以下几个方面:

    #1. 如你所说MSTPRI的,用来调整各master之间的优先级。这里的主要作用是在EDMA与其它master之间的优先级调整。

    #2. EDMA队列,L138上的EDMA有两个队列,一方面两个队列有优先级。这个优先级体现在当两个队列中的事件访问同一个端口时,比如两个队列的当前EDMA都是访问 DDR的,那么就存在竞争了,优级级高的队列一的事件先得到响应。否则是可以同时进行的。

    #3. 事件与队列的分配原则:将短频快的事件与大块的EDMA传输分开到不同的队列,否则一量服务大块的传输,会占用过长的时间,从而导致短频快的事件受到实时性影响。

    #4. McBSP或MCASP本身的调整: 在L138, C6748上的McBSP,McASP接口有FIFO,利用FIFO可以减少EDMA事件的个数,从而减少冲突的概率。

    需要注意的是McASP, McBSP的FIFO是按32bit word访问的。比如配置的数据格式是16bit的,数据寄存器是从FIFO取一个32bit,只传低16bit,高16位忽略了。所以在代码的buffer与FIFO之间需要注意这一点。

    希望以上几点能有所帮助。 

  • 非常感谢您的回复,目前该问题已经解决。

    之前由于多个外设使用EDMA的事件队列0,造成一定程度的资源竞争,根据您的建议,McBSP开启FIFO后,该问题得到有效改善。

    目前,各个McBSP仍旧使用EDMA的事件队列0,SPI写Flash也依然开启,相之间均不会有影响,正如您所提到的,由于 McBSP的FIFO按32bit word,原16位的数组需要进行扩展到32位,系统的运算负荷略有提高,开启cache后也相应解决。