【问题标题】:Circular buffer in virtual memory on esp32?esp32上虚拟内存中的循环缓冲区?
【发布时间】:2021-11-09 02:11:23
【问题描述】:

This article 描述了使用 mmap 将两个虚拟内存范围配置到同一个底层缓冲区,以避免用于管理循环缓冲区的内存复制。

esp32 硬件能支持这个吗?我想使用 i2c dma 技术将麦克风音频数据直接读取到循环缓冲区中,并将该缓冲区的窗口范围移交给 tensorflow,以便在 esp32 上进行分析,而无需任何可避免的内存副本。

This reddit 线程讨论它,但我不知道足够解释答案。这些 api 调用可以映射到内存吗?是否有替代机制来实现我的效率目标?

【问题讨论】:

  • 你看过所谓的“Bipartite Buffer”吗?它以循环方式实现,但分配适合 DMA 的连续区域。

标签: rust embedded esp32


【解决方案1】:

没有。 ESP32 没有虚拟内存——至少没有 RAM。

reddit 线程讨论了如何从内部 32 位地址空间中的特定地址获取 Flash 的一部分。我想这可以被认为是一种虚拟内存形式,但它非常有限——你只能为 Flash 做它,而且只能在 64 KiB 块中。

【讨论】:

  • 谢谢。是否有任何其他巧妙的技术可以〜处理音频的最后几秒〜每半秒,而不是必须将内存复制到连续的缓冲区?
  • 我想与复制相比,让 DMA 以某种方式写入副本并不是最糟糕的事情。将采样率加倍然后去隔行到两个缓冲区?将单个通道连接到两个通道和缓冲区?
  • 我想您可以实现一个缓冲区池,其中传入的样本保留一个缓冲区,写入其中,将其发送到您的处理管道,然后在处理完样本后将缓冲区释放回池中?
  • 对我来说,关键的挑战是处理重叠的窗口,这样我们就不需要通过寻找信号的最小长度来延迟结果,或者担心跨越两个连续缓冲区的合法信号丢失.一个无限长的缓冲区可以解决这个问题,但是……浪费。循环缓冲区仅在当前窗口换行之前有效 - 需要一个副本才能将单个连续缓冲区发送到仅接受单个连续缓冲区的典型 api。内存中相邻缓冲区的免费副本可以始终包含一个连续区域,而无需 cpu memcopying。
  • 您正在使用简单、直接的内存访问和寻址。也许您只能在数据包含在循环缓冲区中而不是其他情况下进行复制。在任何情况下,我都怀疑任何潜在的解决方案都会通过您输入来实现,因为系统不会提供现成的解决方案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 2016-06-11
  • 1970-01-01
相关资源
最近更新 更多