如何保护SD卡免于意外的电源故障?


18

我正在使用Microchip MDDFS库将数据存储到SD卡的设备上工作。记录器将以每分钟1个条目(56字节)的最大速率记录数据。问题在于设备可能随时会断电,可能在写序列的中间。我想知道什么是保护我的数据免遭损坏的最佳方法。我发现,如果在断电时打开文件,则上次关闭文件后写入文件的所有数据都会丢失。我不知道如果在写入序列中途断电,是否同样适用。

由于写入过程并不经常发生,因此每次记录数据时,我都可以打开文件,写入数据然后关闭文件。这种方法会随着时间的推移损坏SD卡吗?

另一种方法是保持文件打开,但是每写入10或50次后,我可以关闭文件,然后重新打开它。

我还可以将数据缓冲在内存中,然后偶尔刷新数据(大约在一KB后)。

我的最后一个想法是,在电路中,我可以添加一个大电容器,以在断开电源后足够长的时间为我的pic / sd卡供电,以快速关闭文件。这种方法的问题在于,关闭文件和/或保存数据所花费的时间非常不一致。据我了解,这次的时间很大程度上取决于文件所在的Flash页面中的当前位置。

无论如何,你们会建议什么?


2
如果您切换到具有最小文件系统的原始NAND闪存,则可以钻取当前阻碍您进行小写操作的许多抽象层,并有可能在数据可用时立即进行部分块写操作。您还可以防止最终用户在将来使用具有不同性能细节(甚至边缘灰色市场)的卡来代替。
克里斯·斯特拉顿

Answers:


16

当您将数据写入文件时,可能会发生一些事情。我将描述为了确保数据安全(不一定是库调用)所需发生的顺序。

写入并添加到文件末尾时(正常写入模式),您将文件的最后一块读入内存,用写入数据进行修改,然后将整个块写回到SD卡。如果该块已满,则必须在文件分配表(FAT)中找到一个新块。找到新块后,必须更新FAT,这是一个读-修改-写周期。如果处理完文件,则需要更新根目录中的文件属性(例如文件长度),这将导致另一个读取-修改-写入循环。

减少您的写入时间

  • 写入扇区时,请确保该文件已经保存了您的数据。如果从大文件开始,然后覆盖数据而不是附加数据,则SD卡扇区写入完成后,数据将是安全的。您可以通过这种方式消除一到两个读-修改-写周期。我的启动代码将以扇区为单位将0写入文件,直到SD卡已满,然后倒回到文件的开头。

  • 调整数据条目的大小,以使整数个条目适合一个扇区。我会将您的条目增加到64个字节。尽管这效率较低,但是它将阻止您需要读取-修改-写入两个扇区。

  • 创建FSwrite函数的变体,使您可以写入整个扇区。如果将整个扇区保留在SRAM中,则您的周期将从“读取-修改-写入”变为“修改-写入”

尽可能长时间打开PIC和SD的电源

  • 大电容器是好的。470uF应该给您足够的功率来完成一个写周期。

  • 确保您的电源不会从备用电容器中吸收电源!如有必要,添加一个二极管。

知道您何时没电

  • 较大的电源帽将使您有10毫秒或更长时间用SD卡包起来,但是请不要碰运气。使用微控制器上的管脚查看电源是否仍然良好,如果电源没电,则不要开始写操作。

谢谢(你的)信息。非常有帮助。我会看看我能用它做什么...
PICyourBrain 2010年

您认为将全零写入4GB卡需要多长时间?好像很久了。另外,您是否可以共享任何代码示例来修改fswrite函数以允许对整个扇区进行整体写入?
PICyourBrain,2011年

另外,如果您将全零写入文件。您如何跟踪实际数据的结尾在哪里?您是否只读取开头的所有数据并找到零字符串?
PICyourBrain,2011年

1
如果您使用的是FAT16,我相信您只能使用2GB。我相信SD / MMC卡具有“擦除块”功能,该功能似乎未在MDDFS库中实现。我为SD卡项目使用了专有的代码库,因此无法共享任何代码示例。为了找到最后一个数据,您需要进行读取,直到在数据记录中找到全0。如果您的数据记录可以全为0,建议您添加一些非零数据或某种定界符。
W5VO 2011年

6

SD卡(或MMC,CompactFlash等)尚未提及的一个问题是,尽管SD卡在主机上看起来像是一个512字节扇区的简单集合,可以按任意顺序进行读写,但闪存设备通常将528字节的页存储为32KB的组(如果不更大的话),唯一支持的操作是写入空白页或擦除整个组。为了解决此限制,SD卡上的控制器将保留一个表,该表将允许将任何逻辑扇区映射到任何物理页面。当请求写入一个扇区时,控制器将在芯片上的某处找到一个空白页,并使用该扇区的新地址更新映射。如果空白页或其他各种时间供不应求,

这样做的意义在于,写入特定逻辑扇区的操作可能需要对来自许多逻辑扇区的数据进行改组。如果在此过程中出现问题,可能会导致任意扇区的损坏,而不仅仅是卡被要求写入的扇区。良好的SD卡控制器应设计为以如下方式执行数据混排操作:如果在数据混排期间断电,则它将能够确定操作的哪些部分已经完成,哪些尚未完成,以及因此能够正确完成操作。不幸的是,我不知道如何分辨在折扣店里买到的5美元的SD卡在这方面有什么好处。

可以肯定的是,即使从确保被报告为已完成的每个写操作实际上可以在断电的情况下(即确保是否所有工作都可以进行写操作)的角度来看,SD卡也绝对完美。表示已完成,已完成足够的工作,以至在重新加电后卡即可完成操作),这并不意味着主机操作系统如果执行了部分但并非全部要写入的数据,就不会遇到麻烦。但是,请务必牢记,如果SD卡无法维持其“讨价还价”的目的,那么在主机端软件上就无法采取任何措施来防止由于电源故障而导致数据丢失。


这是一个非常有见地的评论。
fred basset 2014年

5

我还建议每当需要读取SD数据时,都使用某种校验和来验证SD上的数据是否正确


3

也许Sparkfun的超级电容器可以解决这个问题。


2
它可以容纳PIC的存储器,但最大额定电流为10uA。我认为您无法用这么大的电流写入SD卡。
W5VO 2010年

1
这个概念虽然很好。快速搜索发现,伊利诺伊州电容器(illinoiscapacitor.com)具有高达8 F的超级电容器,并且能够支持高达4 A的电流。添加其中一个或一个电池,将使微型计算机有机会完成写入并关闭电源如果主电源出现故障,则很好。
Photon

3

由于写入过程并不经常发生,因此每次记录数据时,我都可以打开文件,写入数据然后关闭文件。这种方法会随着时间的推移损坏SD卡吗?

与任何工程问题一样,您需要在此处进行权衡。

根本没有数据丢失至关重要吗? 然后我会做以上。与丢失卡相比,丢失数据造成的损失更大。您可能需要进行各种压力测试,以确定在卡损坏之前可以执行该操作多少次。如果您对卡变得不可用之前花费的时间感到满意,并且在更换卡之前这似乎是可以接受的时间长度,那么我会选择这种方法。


1

如果只想存储数据,则不需要文件系统。通过选择块地址,将直接在SPI上完成写操作。这样可以最大程度地减少写入时间,并避免数据损坏的风险。

即使在断电且没有运气的情况下,您也只会丢失一项(在某些系统上可以接受)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.