Filesystems 如何使用SD卡以48 k采样/秒的速度记录16位数据? 背景

Filesystems 如何使用SD卡以48 k采样/秒的速度记录16位数据? 背景,filesystems,embedded,sd-card,fat,Filesystems,Embedded,Sd Card,Fat,我的电路板集成了一个带on的微控制器,并以48k采样/秒的速度采集模拟数据。我正在使用Keil实时库RTX内核 我有一个高优先级任务,通过DMA以40个样本(40 x 16位)的块捕获模拟数据;数据通过长度为128的队列(构成约107ms的样本缓冲)传递给第二个低优先级任务,该任务将样本块整理成2560字节的缓冲区(这是512字节SD扇区大小和40个样本块大小的倍数)。当此缓冲区已满(32块或约27毫秒)时,数据将写入文件系统 观察 通过检测代码,我可以看到每32个块,数据就被写入,写入大约需要

我的电路板集成了一个带on的微控制器,并以48k采样/秒的速度采集模拟数据。我正在使用Keil实时库RTX内核

我有一个高优先级任务,通过DMA以40个样本(40 x 16位)的块捕获模拟数据;数据通过长度为128的队列(构成约107ms的样本缓冲)传递给第二个低优先级任务,该任务将样本块整理成2560字节的缓冲区(这是512字节SD扇区大小和40个样本块大小的倍数)。当此缓冲区已满(32块或约27毫秒)时,数据将写入文件系统

观察 通过检测代码,我可以看到每32个块,数据就被写入,写入大约需要6毫秒。这种情况一直持续到(在FAT16上)文件大小达到1MB,此时写入操作需要440ms,此时队列已满,日志记录被中止。如果将卡格式化为,则“长写入”事件之前的文件大小为4MB

发生这种情况的文件大小在FAT16和FAT32之间发生变化,这一事实向我表明,这不是卡的限制,而是文件系统在1MB或4MB边界上所做的需要额外时间的事情

我的任务似乎也被及时安排,并且ELM代码中的时间仅消耗在1MB(FAT32为4)边界上

问题 有什么解释或解决办法吗?这是一个肥胖的问题,或者更确切地说是ELM的FatFs代码特有的问题

我考虑过使用多个文件,但根据我的经验,FAT不能很好地处理单个目录中的大量文件,这也会失败。完全不使用文件系统并将数据写入原始卡是可能的,但理想情况下,我希望在有标准驱动程序且无特殊软件的PC上读取数据

我突然想到尝试编译器优化以缩短写入时间;这似乎产生了影响,但写入时间似乎变化更大。在-O2时,我得到了一个8MB的文件,但结果不一致。我现在不确定文件大小与失败点之间是否存在直接关联;我见过它在没有特定边界的不同文件长度上以这种方式失败。可能是卡的性能问题

我进一步检测了代码并应用了分而治之的方法。这一观察结果可能会使这个问题变得过时,而之前的所有观察结果都是错误的或误导的

最后,我将其缩小到了一个实例,即多扇区写入(CMD25),在这个实例中,卡的“等待就绪”轮询在5个扇区中的前三个扇区中偶尔需要174ms。等待就绪的超时时间设置为500ms,因此它很乐意等待这么长时间。在一般情况下(每个扇区140毫秒),迭代使用CMD24(单扇区写入)比偶尔使用慢得多


因此,这似乎毕竟是这张牌的一种行为。我将尝试一系列的SD卡和MMC卡。

第一件要尝试的事情可能很简单:将队列深度增加到640。这将为您提供535ms的缓冲,并且至少可以在这个特定的文件系统事件中生存下来

第二个问题是ELM FATF的配置。默认情况下,许多嵌入式文件系统对缓冲区的使用非常吝啬。我见过一个为所有操作使用一个512字节的块缓冲区,并为某些文件系统事务爬网。我们给了它几千字节,事情就快了好几个数量级

当然,以上两项都取决于您是否有更多可用RAM

第三种选择是预先分配一个大文件,然后在数据收集过程中覆盖数据。这将消除大量昂贵的集群分配和FAT操作

<> p>由于编译器优化影响了这一点,还必须考虑它是多线程问题的可能性。是否有其他正在运行的线程会干扰低优先级的读卡器线程?您还应该尝试将缓冲区更改为样本大小和闪存块大小的倍数以外的值,以防遇到某种系统共振。

您(或阅读此问题的任何其他人)可以尝试以下FAT库:


在带有10Mbit/s SPI总线的40 MIPS微芯片上,它可以在我尝试过的任何卡上以230 Ksps(16位)的速度进行采样。

+1。关于这个话题,我没有任何线索,但有一个有趣且写得很好的问题:-)对于仍然感兴趣的人来说,我最终找到了一个具有足够低延迟的超越2GB SD卡,以便成功地传输数据。因此,答案是获得正确的卡-它们并非都是平等创建的。是的,增加队列深度将是一个解决方案-如果我有足够的RAM允许的话!该部件有64Kb的RAM,因为640x40x16位队列将为51Kb,并且它不是唯一运行的部件。对于这个问题,我已经将它增加到128,我真的需要它低很多;在发生此扩展写入之前,8个队列就足够了。已尝试选项3-无效。将查看选项2并报告。谢谢。您确定#3是以不需要重新分配集群的方式完成的吗?换句话说,您是否打开了“修改”而不是“写入”的文件?打开“写入”将使其归零,并重新开始群集分配。选项2:每个文件使用扇区缓冲区或共享扇区缓冲区。我使用的是前者,但在任何情况下都只能打开一个文件。在这种情况下,我将研究另一个FAT文件系统实现。这将是一个真正的系统瓶颈。对于#3,是的,文件总是打开进行更新(这就是为什么我错误地认为它总是1Mb的原因-这只是“高潮”标记。我有