在我正在开发的Linux嵌入式应用程序中,需要记录一些不时发生的事件。这些记录保存在MTD闪存设备上,一旦写入就不需要更改它们或进行有效搜索,但需要读取访问权限才能将数据显示给用户。 一个很大的问题是,没有正确的关机顺序,电源可能随时消失。 这些事件发生的频率可能非常慢(几天/几周),但其中一些会立即发生。 为每个事件保存的数据是强类型的:日期,时间,几个短文本字符串和几个整数。

目前我继承了一个基于jffs2和SQLite的解决方案,这个解决方案远非最佳,因为DB文件有时会被破坏。当发生这种情况时,整个文件变得不可读,并且无法理解它是由jffs2中的错误引起的,还是在SQLite中,或者闪存扇区是坏的,还是在错误的时间切断了电源。

是否有一个库或文件系统/库的组合可以更好地帮助我解决这类问题?或者我应该只使用类似CSV格式的文本文件吗?

有帮助吗?

解决方案

我们正在使用普通的旧syslogd到NAND闪存上的YAFFS2分区,它似乎运行良好:当消息被发送到记录器并且在(<!> lt; 100ms)之后立即删除电源时,消息就在那里并且日志永远不会腐败。

这是基于观察,而不是我明确地知道,一切都将始终与设计保持一致。

其他提示

我不是嵌入式系统的专家,但我认为CSV可能是最好的。它基本上不会被破坏,或者如果它,那么你可以很容易地看到错误并手动修复它(换行或只删除一行)。我一直致力于从嵌入式系统接收数据,这些数据存在很多腐败问题(部分在系统上,部分在电话线传输过程中)。如果它是CSV类型格式将非常有用,因此我们可以找到错误并删除或修复它们,而不是破坏整个数据集。

如果您不需要在系统内进行搜索,则CSV可以完美运行。

有许多嵌入式文件系统(非胖兼容)专门为此目的而设计。我不能建议,因为从来没有使用过,但这里谷歌的东西。我相信你可以挖掘更多,希望这里有人可以提供更多信息,可能有基于GPL的东西。不同文件系统的比较是此处

两个csv /文本文件。每次系统重新启动时都会启动一对新对。将每个事件写入第一个文件,刷新要存储的文件,将记录写入第二个文件,然后再次刷新。

这样,如果你在第一次写入期间崩溃,第二个副本中的所有数据(直到写入)仍将存在。

确保flush是一个完整的文件系统刷新而不仅仅是clib缓冲区刷新。

也许还将文件放在不同的文件系统上。在您需要之前预留空间也可以帮助加快这一过程。

您可以使用哪些设施?最好的选择通常是登录到外部资源,,例如通过syslog,SNMP,原始套接字或串行端口。这可以保护您的日志免受设备本身的不愉快。

如果您需要在内部存储日志,我发现明文,人类可读的文件是嵌入式设备的最佳选择。 <!> quot; write / flush <!>“;循环很快,不需要任何工具来维护它们,您可以实时监控它们。如果文件大小有问题,您可以使用整数而不是格式化文本加时间戳,并且可以使用数字<!>“;事件ID <!>”;缩写每个日志(仅将特定于实例的数据保留为文本)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top