代码之家  ›  专栏  ›  技术社区  ›  yun

USB音频缓冲区欠载

  •  1
  • yun  · 技术社区  · 7 年前

    我在实现中使用了双缓冲:

    (2) USB端有40个缓冲区(基本上是40ms的数据)。当缓冲区的状态为“已填充”时,可以发送。USB回调在成功的USB传输后完成,并发送下一个填充的缓冲区。

    在我的实现中,在USB开始传输实际数据之前,我至少填充了3/4的缓冲区(30个缓冲区)(因此在前30毫秒,它只是“静默”数据)。基本上,当我的编解码器/dma缓冲区尚未完全填满,而下一个要读取的缓冲区为“空”时,就会出现缓冲区不足的情况。我觉得最简单的解决方案是增加缓冲区(显然,40个缓冲区还不够;大约11kb的数据,因为40*294字节=11760字节),但是我无法增加它,因为我的微控制器已经用完了可用内存。

    现在我有什么办法来解决这个问题?我有/可用剩余内存的可用缓冲区限制是否有解决方法?或者是添加SRAM以获得足够可用缓冲区的唯一方法。

    谢谢

    编辑

    编辑2 :我正在运行带有隐式同步端点的异步;主机每帧读取一次。对不起,这也不清楚。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Martin    7 年前

    无论如何,正因为如此,三个以上的缓冲区没有多大用处(两个也需要仔细考虑)。您不需要更多缓冲区。但是,缓冲区应该比计算出的每帧标称采样数稍长,并且端点描述符应该包含此扩展长度。

    总是 打开并仅在USB帧开始时(或与USB SOF同步的任何其他事件)切换缓冲区。 当USB主机想要从您的端点读取数据时,您的设备必须返回当前读取缓冲区中实际存在的样本数。不多不少。

    因此,不存在跑输的机会。当之前读取的缓冲区未完全填满时,您只需向主机发送较少数量的样本,主机的任务是以任何合适的方式处理时钟漂移和重新采样。你 另一方面,担心超支。若SOF频率和ADC的采样率相比太低,你们可以在SOF到来之前填满整个缓冲区,最终并没有地方进行下一个采样。简单的解决方法是使您的缓冲区比计算的标称速率至少长几个样本。那么你应该是安全的,否则其他地方的东西可能已经坏得多了。

    您可能担心的最后一个问题是,当SOF正常运行时,主机不会向您的端点发送读取请求。好的,在这种情况下,覆盖旧的缓冲区不会造成太大的伤害,因为主机此时显然对数据不感兴趣,而缓冲东西——从而增加延迟——可能弊大于利。