我正在研究嵌入式Linux系统,该系统安装了SDCARD(格式为FAT32)并每秒连续写入约500KB数据。
现在可以处理电源故障,我们设计了一块电池,可以提供约3秒的备用时间。
这使我们能够完成正常关机。
我们只有一个进程将数据写入SDCARD。因此,其他任何进程都将无法访问SDCARD。
在电源故障期间和关闭过程中 我们使用fflush和fsync,然后最后使用fclose写入数据所在的当前文件。
我们甚至通过探测硬件线路来验证示波器,该硬件线路是在关机过程中调用fflush和fsync时,数据事务已通过SDCARD激活。 即在此期间尝试将缓存数据写入SDCARD。 这使我相信fflush和fsync可以正确实现。
我唯一没有做的就是卸载SDCARD,因为它花费的时间更长。
但是仍然进行大约10次尝试,我们可以看到SDCARD根分区已损坏并且文件丢失。
为了适当的正常关机,必须卸载它。 我了解的是mount只创建此文件系统根目录的inode与其余文件系统的链接。 而umount仅删除链接。
在嵌入式Linux中关闭时,确保SDCARD保护的最佳方法是什么。
下面是当前在关闭过程中执行的代码。 是否需要umount呼叫。
if(fflush(file)<0)
printf("Failed fflush errno=%d",errno);
if(fsync(fileno(file))<0)
printf ("Failed fsync errno=%d",errno);
if(fclose(file)<0)
printf("Failed fclose errno=%d",errno);
file=NULL;
答案 0 :(得分:0)
您做得差不多,但是有一个陷阱:您的SD设备可能需要更多时间来刷新其内部缓冲区。
所需时间取决于精确的芯片组(当然还有品牌,型号等)。
为了正确地关闭系统,您需要有一块安全的备用电池:请考虑企业RAID卡上的备用电池为2到5分钟,并且制造商确切地知道每个硬件的详细信息。 / p>
很遗憾,在fsync()
之后,您必须等待更多时间。在类似的情况下,我们的RasperryPi设备使用备用电池可以防止损坏,可以使设备运行至少20秒钟(尽管在我们的情况下为10到15可以安全使用),以便于玩耍。