我在 TI-RTOS 2.0.1.23上有一个 C6748系统、该系统已经可靠运行了一段时间-直到我将其更改为开始写入 SD 卡。
来自 ADC 的数据通过 UPP 到达、并由 UPP 的 DMA 存储到12ms 的数据包中。 数据包进入队列以由算法处理(通常等待时间很短、因为算法在高优先级任务中运行)。 算法生成12ms 输出数据包(在更高的采样频率下)、并将它们放入队列中、从此处 EDMA3通过 McASP 将它们输出到编解码器。 编解码器和 ADC 完全同步、因此输出数据包在队列中花费的时间在20-21ms (介于1到2个数据包之间)相当恒定。 系统运行数小时数天、输入和输出保持完全同步。 EDMA LLD 为 v2.12.0.20
然后、我从 BIOS PSP 3.0.1.0中添加了 MMCSD 驱动程序、并使用 mmcsd_sample 项目将测试模式写入 SD 卡。 它在低优先级任务中运行、以便不会干扰原始处理-或者我想这样做。 SNAG 就是这样-当通过一次对 BlkWrite()的调用将32KB 块写入 SD 卡时,从输出队列到编解码器的数据将逐渐丢失-每个数据包在队列中花费的时间更少,直到没有剩余的数据。 SD 的总数据速率约为300kb/s 如果我以相同的总数据速率编写4KB 块、则不会再察觉到损耗(虽然这并不意味着问题得到解决、但它可能不太可能发生或不太频繁)。
我一直在尝试弄清发生了什么、UPP 似乎正在丢失输入数据。 uPP DMA 每行采集192个 ADC 样本、每窗口采集36行、构成一个12ms 数据包。 我一直在使用 Timestamp_get32()监视窗口 ISR 的 UPP 结束之间的间隔、我看到这是:通常、间隔为12ms、典型变化为2us。 很少 ISR 延迟高达25us、但始终以下间隔短相同的时间、因此告诉我 系统已赶上。 但有时、两个连续间隔会延长、例如100us 和226us。 数字会有所不同、但总数始终接近336us、这是获取一条 DMA 数据线所需的时间。 以下 间隔 不 会更短、因此系统不会赶上进度。 每次发生这种情况时、输出队列中的数据保留量都会减少相同的数量、大约为336us。
在输出端、编解码器中断(EDMA 完全回调)之间的间隔是正常的。
因此、我想 EDMA3和 UPP DMA 之间存在冲突。 进入编解码器的数据一次只有2个字节(ACNT=2、BCNT=252、一个同步模式)、所以这是快速的并且不会发生冲突。 SD 卡中的数据是一个大块、因此我想确保它不会锁定其他活动。
编解码器使用 EDMA3实例0、队列0、并且 MMCSD 设置为使用实例0、队列1 (因此它们使用不同的传输控制器、而 MMCSD 使用较低优先级队列)。 我认为、突发大小是64字节的默认值-我没有更改它。
我已经调整了总线主控优先级、将 UPP 从4提高到0、并将 EDMA3_0_TC1从0降低到 7、但这没有什么不同。
我正在检查 UPP 上溢和下溢错误、但我从未看到任何错误。
我还可以尝试其他什么?
为什么、如果 UPP 缺少整行数据、它是否总是影响2个连续窗口? 这是否意味着 UPP 缺少 STARTA 脉冲?
非常感谢大家为我们提供的一些指导。
罗伊