应对不可预测的电源的策略


15

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

到目前为止,我可以想到:

  • 存储数据并仅间歇写入
  • 仅在车速不接近零(即即将关闭点火)时写入
  • 写入一个我可以承受的临时文件,然后不时地坚持下去

我想知道是否有

  • 在大多数情况下,我可以停留在文件系统模式下,以免突然关闭
  • 在断电的同时实现断电恢复的方法

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

Answers:


3

供应方至少有两个选择:

  • 现在,许多汽车都具有不能通过点火开关切换的附件插座...如果您的汽车有一个,请使用该附件插座(但在不使用时请小心拔出插头!),这样可以为您提供可靠的电源(尽管在发动机运行期间可能会掉落)摇动)
  • 如果您正在设计自己的电源转换器,请添加一个足够大的储能电容器,以确保在车辆关闭后电源可以保持足够长的时间...您还可以检测到车辆关闭(车辆电源低于阈值)到GPIO,从而确保断电后不开始写入

2

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

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


有没有人尝试在PI上阅读本文?似乎需要大量改编
GuySoft

2

这完全取决于您准备释放的数据量。如果您无法承受任何损失,则需要找到一种方法将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中根文件系统的最后一行更改为包含1,如下所示:

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

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


1

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

不幸的是,目前似乎缺货,但您可以预订。


0

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

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

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

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

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


1
一个相关的问题,权力似乎已经弹出:raspberrypi.stackexchange.com/questions/3778/...
XTL
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.