Microchip
直播中

韩志保

7年用户 184经验值
私信 关注
[问答]

在将数据记录到SD卡时应该使用缓冲区吗?

你好,我用PIC24FJ128GA202读取传感器数据,并将其记录到MICROSD卡上。我需要大约每8秒采样1次,持续几周到几个月,并且设备是电池供电的。目前,我正打开文件,写入数据,关闭文件,然后等待5秒钟,重复。我想知道,在我的例子中,是否应该有一个缓冲区来收集许多样本并同时写入它们。这里的目标是减少SD卡的磨损,减少功耗,我想知道这些节省是否足够好,值得关注。首先,我读到sd卡有大约10万次写入,所以如果我以每8秒一个样本进行写入,我会在9.25天内耗尽一张卡?这是正确的,穿SD卡是一件值得担心的事情吗?我的microSD卡有100mA最大写入电流和350uA睡眠电流。最后,也许最重要的是,我应该如何创建缓冲区?一个好的解决方案是在主程序中只在数组已满时写入一个字符串数组,还是有更好的方法做到这一点。而且,当我试图制作一个大的2D数组时,当我尝试1000或更多的缓冲区大小时,我得到了表示结构太大的错误。2D阵列的最大尺寸是多少?谢谢

回帖(5)

李天竹

2020-4-27 06:57:45
如果发生了一些事情,例如卡或电池被删除,你将丢失所有缓冲数据。因此,由你来决定数据丢失是否比磨损更重要。由于你只写少量的数据,主要是一次一个块,你没有磨损整个卡与一个写。大多数现代卡都会使磨损变平。在它中存储二进制数据可能更容易。然后在保存到卡之前进行转换。6秒就足够了,所以你可以在数组填充后立即开始编写。你应该有足够的时间写下一段数据。
举报

丘素莉

2020-4-27 07:13:37
嗨,你还没有说明你的数据样本有多大。大多数文件系统都使用扇区缓冲器。这是没有数据被传送到媒体(磁盘或闪存)直到一个扇区被填充。直到发生这种情况,数据才会留在内存中。一些与集群缓冲区一起工作。你的文件系统是否有一个S?通常,一个F I l e C l o s e,然后F I e O p e n提交任何缓冲区,但是很耗时。我使用的文件系统实现了一个4K扇区缓冲区,所以1000字节的缓冲区不添加任何内容。并且实际上与存储扇区的操作不同步。你的SD卡最有可能是512E扇区。
举报

朱虹

2020-4-27 07:33:23
感谢到目前为止的回复,这个建议很有帮助。我只是想确保,大约100000次写入是针对每个扇区,对吧,不是针对整个磁盘。数据表上说,我的4GB磁盘上大约有770万个扇区,所以在良好的磨损水平下,总共大约有100000*7700000次写入?为了回答T Yorky,我的传感器数据是6字节,我首先将其转换为三个整数,然后将包含时间戳的字符串和转换为字符的读数写到SD卡上。这总计每次写大约40个字符串-每8秒或任何采样间隔结束。我用于文件系统的库(Micro.Libraries for Application)确实具有刷新功能,但我想知道,如果我不关闭或刷新文件,SD卡会自动进入睡眠模式吗?不关闭文件和延迟刷新而不是缓冲区实现为字符串数组有什么好处?注意:我还有很多程序内存——使用大约45kB的128kBEDIT:还有一个大概的估计,通过缓冲写可以节省多少能量?除了不需要经常打开/关闭文件之外,我看不出有什么区别,但是刷新文件的能量应该大致相同,对吧?由于我只在8秒左右打开/关闭,而且我认为打开/关闭不需要那么长时间,因此我认为节能很小,这个推理是否正确?但是,TBH我不确定打开或关闭需要多长时间。
举报

丘素莉

2020-4-27 07:46:46
100000个是基于扇区的。磨损矫直是一个复杂的课题。我永远不会声称理解它!一些算法是简单地在多个Flash写入之后交换位址的XOR或XOR。一些设备只在一系列较低的块上实现磨损平衡,这些块由于FAT而倾向于遭受大量的写入。所以它可能不是简单的乘法,所以在填充扇区之前,512/40给出13个样本。每隔100秒左右需要一个扇区写入。请注意,当扇区被填充时。通常执行两次写入。一个用于数据和一个更新FAT。大多数文件系统在文件关闭之前不更新目录项。一个刷新确保了一个更新的“邮票”,它把所有的东西排列起来,目录。在此之前,数据有丢失的风险。SD卡太便宜了。为什么要担心?注意,在4K扇区,你的应用程序每13分钟更新一次。我会说不要使用你的程序Flash。这将在SD卡之前磨损!!!!规则写入确实消耗能量。如果使用框外文件系统,在这方面您有有限的灵活性。对于只有8K或16K RAM的设备,您的缓冲能力有限。T Yorky
举报

更多回帖

发帖
×
20
完善资料,
赚取积分