我想在汽车上安装Pi,并用它来记录GPS数据。写入SD卡时,我可以遵循哪些策略(在程序中)以最大程度地减少由于电源中断而引起的问题?

到目前为止,我能想到的是:


存储数据并仅间歇写入
仅在车速不接近零时写入(即大约关闭点火开关)
写入一个我可以负担得起的临时文件,然后不时坚持坚持

我想知道是否有


文件系统模式在大多数情况下我都可以停留在突然关闭的情况下。
在编写更可靠的方法的同时可以使掉电恢复的方法

显然(我认为)一些数据丢失是不可避免的,但是如何将其最小化?

#1 楼

供应侧至少有两个选择:


现在,许多汽车都有不通过点火开关的附件插座...如果您的汽车有附件插座,请使用(但在不使用时请小心拔出电源!)这将为您提供可靠的电源(尽管在发动机起动时可能会下降)。
如果您设计自己的功率转换器,请添加足够大的储能电容器,以确保车辆关闭后电源保持足够长的时间...您还可以检测到车辆关闭(车辆电源低于阈值)到GPIO,以确保在电源关闭后不开始写入


#2 楼

Windows Embedded中有一个称为增强型写过滤器的概念。他们使用它来避免由于断电等损坏数据丢失。操作系统将其写入RAM覆盖层。断电时文件系统不会损坏,只有在需要时才可以将数据“提交”到内存中。

同样,在Linux操作系统上,有一种技术可以保持文件系统完好无损,只有在需要时才可以写入SD卡。该问题说明了如何构建只读文件系统,并且仅在需要时才可以保存更改。这意味着您将使用选项3:“写入临时文件并在必要时保留”。该问题还指向文章“如何构建只读文件系统”。也许,这可能是第一个开始的地方!

评论


有没有人尝试在PI上阅读本文?似乎需要大量调整

–GuySoft
13年6月28日在10:11

#3 楼

这完全取决于您准备释放的数据量。如果您无法承受任何损失,则需要找到一种方法将PI直接连接到电池(当然要有保险丝),以便在点火开关关闭时不会将其关闭。

然后,典型的汽车电池将具有约80 Ah的电流,并且PI会消耗500-1200 mA(取决于是A型还是B型),因此可能会耗尽您的汽车电池需要2到6天才能用完,所以我认为您不会接受这种方法。

如果仍然无法负担丢失数据的费用,则可以在某种程度上设计一些定制硬件控制来自PI的电源,并监视点火状态。如果点火开关关闭,则将数据刷新到SD卡,关闭操作系统,然后作为最后一步关闭电源。点火开关打开时也需要打开电源,以使PI再次启动。这都是可行的,但却是一个很大的项目。

但是,如果您发现在关机时丢失一些数据是可以接受的,那么我将设计一个守护程序,该守护程序定期将GPS数据保存到文件中。每次写入后执行fsync调用的方式(将数据刷新到SD卡)。如果您每隔几秒钟执行一次操作(并且还使用默认的日记记录ext4文件系统),则可能意味着您只会在每次断电时松散最后几秒钟。

请记住, Raspbian(至少是我的安装)在启动时未附带根文件系统的fsck。您必须执行以下操作才能在每次安装时启用它:

tune2fs -c 1 /dev/mmcblk0p2


还必须更改/ etc / fstab中的根文件系统的最后一行以包含a 1,例如:

/dev/mmcblk0p2  /               ext4    defaults,noatime,commit=120  0       1
                                                               Change this ^^^^^


如果不执行此操作,则根文件系统可能会不时无法启动,因此,如果您正在运行无头系统,并且在不执行受控关机的情况下关闭电源,则这是绝对必要的。

#4 楼

这看起来像是一个很好的补充,可以很好地为pi消毒汽车电气,并处理检测到汽车点火损失的信息,同时为pi提供电源,并向GPIO引脚发送信号以告知其安全关闭pi 。

很遗憾,目前似乎缺货,但您可以预订。

#5 楼

如果您必须经常处理掉电问题,那么仔细选择文件系统和启动方法(只读,日志,无人值守的fsck,快速恢复..)可能有助于确保系统可靠地启动。

应用程序端,使用某些数据库(sqlite?)应该保证重新打开时对数据的整体写入或不写入状态。

的确最好是尝试避免不得不关闭,除非必要。使用较小的控制器时,您通常会观察电源,如果电源出现故障,则有一个小窗口可以关闭设备,保存所有非易失性数据,并可能使处理器休眠或停止直到电源恢复。对于像PI这样的大型通用处理器,这可能需要相当长的时间。

因此,具有在线动力存储并在主电源下降时发出警告可能会有所帮助。如果出现故障,则可能需要区分暂时的功率损耗(不要书写,屏住呼吸)和可能的关机(保存和清理)。

在汽车中,您的+12 / 24 V,而PI使用+5 V,因此转换器内部或之前的电位(heh)。例如,您可以对另一个9-12 V大小合适的电池进行二极管或运算,然后在电压下降时接管转换器。考虑到相对较大的功耗,则需要以某种方式保持充电状态。您还可以为主电源线安装比较器或专用电压监控器,并在主电源断开时得到警报。 (我暂时不知道用什么方法可以快速发出PI信号。)

评论


似乎弹出了一个有关电源的问题:raspberrypi.stackexchange.com/questions/3778/…

– XTL
2012年11月30日7:25