embedded - 以 44 kHz 的速率将 16 位数据记录到 SD 卡

标签 embedded sd-card fat

我正在使用带有 microSD 卡的 STM32F4 微 Controller 。我正在通过 DMA 捕获模拟数据。

我使用双缓冲区,一次获取 1280 (10*128 - 10 FFT) 个样本。 当一个缓冲区已满时,我会设置一个标志,然后一次查看 128 个样本并对其运行 FFT 计算。所有这一切都运行良好。

数据按照我想要的速率进行采样,FFT 计算符合我的预期。如果我只让程序运行一秒钟,我会发现它运行 FFT 大约 343 次 (44000/128)。

但问题是我想将此 FFT 中的 64 个值保存到 SD 卡。

  • 我正在使用 HCC fat 文件系统库。
  • FFT 计算的每个循环我都会将 64 个值复制到一个数组中。
  • 每 10 次计算后,我都会将此数组的内容写入文件并重新开始。
  • 该数组存储 640 个 float_32 值 (10*64)。

这非常适合一秒钟的测试运行。我将 22,000 个值存储到 SD 卡中。

但是随着时间的增加,我开始丢失样本,因为 SD 卡写入的时间更长。我需要 SD 卡持续存储超过 87 kbit/s(4 字节 * 64 * 343 = 87808)的数据。我尝试增加 DMA 缓冲区样本大小,然后增加写入次数,但没有发现有帮助。

我使用的是 8G microSD 卡,class 4。我将 SD 卡格式化为默认 FAT32 分配单元大小 2048。

我应该如何组织数据缓冲才能实现这一点?我认为使用更少的写入可能会有所帮助。排队会有帮助吗?我将如何实现这个,有人能举个例子吗?

我看到克利福德有类似的问题,他正在使用队列, How can I use an SD card for logging 16-bit data at 48 ksamples/s?

最佳答案

就我而言,我通过尝试大量不同的卡来使其发挥作用 - 它们差异很大。如果我有足够的 RAM 可用于更长的缓冲区,那也可以。

如果您不使用 RTOS,则队列缓冲选项可能无法使用,或者至少实现起来并不简单。

使用 RTOS 队列,我建议您创建一个长度为 64*sizeof(float_32) 的消息队列,队列中的消息数量将由卡延迟量决定你需要处理;例如,长度为 343 将维持卡停顿 1 秒,并且需要 87Kb RAM。然后,应用程序将有一个高优先级线程执行 FFT 并将数据放入队列中,而低优先级线程则从队列中获取数据并将数据写入文件。

在启动写入之前,您可以通过在 DMA 缓冲区中积累多个消息 block 来进一步提高性能,并且仔细选择最佳 DMA 缓冲区长度可能会带来一些好处。

关于embedded - 以 44 kHz 的速率将 16 位数据记录到 SD 卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21550233/

相关文章:

macos - OSX Snow Leopard : Build boost 1. 47.0 for 32 和 64 位

android - 从 ROM 中获取设备驱动程序

c - 使为一个处理器编写的嵌入式 C 代码在另一个处理器上工作的条件是什么(当体系结构相同时)?

c - libqrencode 生成一些 android/ios 阅读器无法读取的二维码

android - 从 sd 卡创建一个 drawable 以在 android 中设置为背景

Python shutil.copy 在 FAT 文件系统 (Ubuntu) 上失败

c - float 及其对 8 位微 Controller 存储器的影响

c++ - 读取不同数据类型的二进制数据

Android:当 SD 卡真正安装且可读时的 Intent

使用 ARM 进行 C 编程 - 将结构输出和输入到文件