|
文接上篇《系统压力测试出现的问题,怎么办》
答案揭晓之前,请容作者聊个闲篇,讲讲一个叫做科学方法的东西,看下怎么运用科学方法解决问题。
当我们发现I2S DMA不工作时,并且发现了I2S帧错误,会有一个假说,I2S帧错误导致DMA异常。假说是对一个问题作出的试探性解答,对一组观察结果提出的解释。作为工程师,我们不会假设超自然的力量作为DMA不工作的原因,但很多时,我们把一个很像结论的假说用脑补的方式作为问题的结论,而不进行实验验证。
回归正题,上次讲到我们尝试通过I2S0 FIFO Overflow中断重启DMA1来解决问题,然而在重启DMA1后,FIFO Overflow反复发生,意味着DMA1没有能将数据从FIFO中搬移到内存。
DMA1通过AHB总线从FLEXCOM FIFO读取数据写入SRAM的流程如下图所示,从FIFO读取数据用到AHB SLAVE PORT P13,写入SRAM用到了SRAM不同地址块的AHB SLAVE PORT。当个通路不通的时候,DMA1就无法将数据从P13读到,或者写入相应的SRAM区域。
在这条路径上,有以下怀疑点,P13上,CM33在和HiFi4 DSP通信中会存在轮询MU状态寄存器的情况。另外,CM33和DMA1存在同时访问某SRAM端口的可能性。当CM33频繁对AHB SLAVE 端口进行访问时,会影响DMA1对相同AHB SLAVE端口的访问,从而影响DMA1路径的延迟(Latency)。
基于以上怀疑,作者建议提高DMA1的AHB总线优先级。AHB matrix priority (SYSCTL0_AHBMATRIXPRIOR)
AHB矩阵仲裁各个AHB 总线主设备,当这些AHB主设备同时访问矩阵的从端口时,仲裁器可以调度各个总线主设备访问。每一个AHB主设备对应一个ID号和一个4bits的优先级值,默认的优先级设置各个MASTER 都是0(最高)。如果将除了DMA1以外的其他AHB 总线主设备的优先级设置为1,而DMA1的优先级保持为0,就保证了DMA1能够优先的访问AHB从设备端口。
经过新的优先级设置,系统稳定性问题解决。
除了调整AHB主机优先级的“大招”,如果我们能尽量避免AHB访问冲突,既可以提高系统的运行效率又可以增强系统稳定性,下面是避免AHB总线冲突的一些经验。
1.SRAM通常根据地址范围不同,使用不同的AHB SLAVE PORT。除了各个AHB Master共享内存以外,每个AHB Master尽量不共享同一个AHB Port, 以避免多个AHB Master同时访问相同的AHB Slave端口。
当多个AHB主机共享同一AHB Port内存时,避免使用循环轮询内存变量。
2.避免长时间轮询状态寄存器等待状态转移,当状态转移需要较长时间,中断是一个更有效的方式。 |
|