Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Embedded 以44 kHz的速率将16位数据记录到SD卡_Embedded_Sd Card_Fat - Fatal编程技术网

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

Embedded 以44 kHz的速率将16位数据记录到SD卡,embedded,sd-card,fat,Embedded,Sd Card,Fat,我正在使用带有microSD卡的STM32F4微控制器。我通过DMA捕获模拟数据 我使用双缓冲区,一次采集1280(10*128-10 FFT)个样本。 当一个缓冲区已满时,我设置一个标志,然后每次查看128个样本,并对其进行FFT计算。所有这些都运转良好 数据正在以我想要的速率进行采样,FFT计算正如我所期望的那样。如果我让程序运行一秒钟,我看到它运行FFT大约343次(44000/128) 但问题是我想把这个FFT中的64个值保存到SD卡 我正在使用HCC fat文件系统库 FFT计算的每

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

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

数据正在以我想要的速率进行采样,FFT计算正如我所期望的那样。如果我让程序运行一秒钟,我看到它运行FFT大约343次(44000/128)

但问题是我想把这个FFT中的64个值保存到SD卡

  • 我正在使用HCC fat文件系统库
  • FFT计算的每个循环都将64个值复制到一个数组中
  • 在每10次计算之后,我将这个数组的内容写入文件并重新开始
  • 该数组存储640个浮点值(10*64)
这对于一秒钟的测试运行非常有效。我将22000个值存储到SD卡中

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

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

我应该如何组织数据缓冲以实现这一点?我想少写点东西可能会有帮助。排队有帮助吗?我将如何实现这一点,有人会举个例子吗


我发现clifford也有类似的问题,他使用的是一个队列。

在我的例子中,我通过尝试大量不同的卡来实现这一点——它们变化很大。如果我有足够的RAM来使用更长的缓冲区,那么它也会工作

如果您没有使用RTOS,队列缓冲选项可能对您不可用,或者至少实现起来非常简单

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


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

闪存对覆盖非常敏感。写入3kB,然后再写入3kB可能会被视为对前4KB的覆盖。在你的情况下,没有什么好的理由让你想写这么小的东西。我建议16 kB的写入(32帧/写入*64个样本/帧*4字节/样本)。您需要每秒写入5或6次,这应该符合任何旧SD卡的规格


现在,你很可能在写作时又得到了1280个样本;你必须在另一个线程上处理这个问题。应该没有问题,因为在不使用CPU的情况下写入应该会阻塞(这是一个低级别的闪存延迟)

问题的最可能原因可能是您通过库与卡接口的方式

SPI协议上的SD卡(我假设在这里使用)可以以512字节的扇区单元读写,一些SD命令可以流式传输(以更快地执行顺序扇区访问)。SD卡SPI协议的一个重要元素是各种延迟,您必须轮询SD卡是否可以启动操作(例如将数据写入扇区)

您应该阅读库的API,以了解其编写过程是如何工作的。您将需要执行一些常规操作,这些操作最终将轮询卡片,以了解书写过程是否可以继续。有些卡在准备好操作之前可能需要一定数量的访问,有些卡可能会使用超时进行状态转换。如果很少调用函数(例如2-3毫秒调用一次),而同时又预期卡准备就绪,则可能无法正常工作。无论它是否已经完成,你都必须不断地唠叨


仅根据自己使用SD接口的经验。

我也对此感兴趣。当我之前看过它时,在设置向扇区写入和从扇区读取时,似乎需要很长的设置时间。(我真的很难足够快地从SD卡上获取信息!)因为FAT不能保证您正在向相邻的扇区写入数据,似乎您必须初始化FAT文件代码中的每个扇区,而不仅仅是假设在写入前一个扇区后,您将写入下一个扇区。我假设如果您只是设置系统,以便在写入第一个扇区后,它可以将卡写入相邻扇区,直到卡满为止,你会没事的,因为没有那么长的设置时间告诉SD卡将要写入哪个扇区。这是脂肪的基本限制吗?您可能不会这么想,因为摄像头以高速率写入SD卡,并且使用FAT。感谢您的评论,但正如前面提到的,我使用的是HCC FAT文件系统库,该库负责扇区初始化。我已经联系过HCC,他们说该库能够每秒写入超过3MB的内容,这不是文件系统问题。因此,就目前的情况而言,我认为这个库能够做到这一点,我需要找到一个好的缓冲/队列系统来将数据写入sd卡。