嵌入式日志应用程序设计建议
Embedded logging application program design suggestions
谁能就如何解决这个设计问题提出建议:
我有一个生成事件的嵌入式系统(各种各样,为此我们只抽象事件,它们是可以序列化的数据结构)。
这些事件通常通过互联网连接直接发送到服务器。当互联网连接不可用时,还需要将事件备份到文件中。然后在连接再次可用时按生成顺序发送到服务器。一个额外的好处是在日志文件中维护事件的历史记录(最多这么多天,所以文件大小是有限的)。
我必须使用的工具是 arm cortex M4 micro,SD 卡上的 FatFS (http://elm-chan.org/fsw/ff/00index_e.html),FreeRTOS,gcc。所有设置和工作。
我之前完成的一个系统管理了一个指向事件的头指针和尾指针,该指针指向一块 EEPROM,其作用类似于 FIFO 队列。我不确定如何使用文件系统最好地实现类似的事情。
因此,问题主要在于如何使用文件系统执行此操作。
感谢任何建议,提前致谢
编辑:每天最多可以有 10000 个事件。设备最多可以离线 10 天。事件包含少量数据,例如时间戳和状态值或位置。文件系统包含的存储空间远远超过最大缓冲历史记录所需的存储空间。例如,10MB 可以存储 10 天,而 SD 卡至少有 1 Gb。
阿什莉
每天登录一个日志文件,
当您恢复连接时,另一个任务会传输日志行(首先是最旧的文件)。
让服务器拒绝重复的日志行。
它使您的小型机器的代码更容易。
传输者只是在文件传输完成后删除文件。
拒绝让您的连接检查任务传输 "files"。
我有一个正在维护的系统可以做到这一点,但文件传输很麻烦。
一个更大的系统 rsyslog 支持开箱即用的磁盘缓冲,但我认为您没有足够的 OS 资源来 运行 freertos 中的 rsyslog。
我最后解决这个问题的方法是用一个文件作为随机存取存储器。我在磁盘上实现了一个 queue ,就好像它在任何其他随机存取存储器中一样。我使用的 FatFS 文件系统支持分配连续块和改进此功能的快速搜索功能。
该文件具有 header 和 CRC 错误检查以帮助防止损坏。在启动时,文件被打开并加载 header。否则看起来它只不过是一个基于链表的 queue。
我将其作为基础 class 和两个派生的 class 实现。派生的 classes 只对它们的存储做 read/write。一个用于磁盘存储,另一个用于在 RAM 中存储(用于测试)。有了这个,我可以简单地 queue 和 dequeue 应用程序中的项目,而调用者不知道他们要去哪里或来自哪里。
这项工作表现出色,考虑到小型嵌入式平台,性能也很合理(~2ms queue/dequeue 平均值,包括 SD 卡访问和 header 存储)。任务 queue 记录项目,另一个任务删除它们并将它们打包,以便在互联网连接可用时发送到服务器。
谁能就如何解决这个设计问题提出建议:
我有一个生成事件的嵌入式系统(各种各样,为此我们只抽象事件,它们是可以序列化的数据结构)。
这些事件通常通过互联网连接直接发送到服务器。当互联网连接不可用时,还需要将事件备份到文件中。然后在连接再次可用时按生成顺序发送到服务器。一个额外的好处是在日志文件中维护事件的历史记录(最多这么多天,所以文件大小是有限的)。
我必须使用的工具是 arm cortex M4 micro,SD 卡上的 FatFS (http://elm-chan.org/fsw/ff/00index_e.html),FreeRTOS,gcc。所有设置和工作。
我之前完成的一个系统管理了一个指向事件的头指针和尾指针,该指针指向一块 EEPROM,其作用类似于 FIFO 队列。我不确定如何使用文件系统最好地实现类似的事情。
因此,问题主要在于如何使用文件系统执行此操作。
感谢任何建议,提前致谢
编辑:每天最多可以有 10000 个事件。设备最多可以离线 10 天。事件包含少量数据,例如时间戳和状态值或位置。文件系统包含的存储空间远远超过最大缓冲历史记录所需的存储空间。例如,10MB 可以存储 10 天,而 SD 卡至少有 1 Gb。
阿什莉
每天登录一个日志文件, 当您恢复连接时,另一个任务会传输日志行(首先是最旧的文件)。
让服务器拒绝重复的日志行。 它使您的小型机器的代码更容易。 传输者只是在文件传输完成后删除文件。
拒绝让您的连接检查任务传输 "files"。
我有一个正在维护的系统可以做到这一点,但文件传输很麻烦。
一个更大的系统 rsyslog 支持开箱即用的磁盘缓冲,但我认为您没有足够的 OS 资源来 运行 freertos 中的 rsyslog。
我最后解决这个问题的方法是用一个文件作为随机存取存储器。我在磁盘上实现了一个 queue ,就好像它在任何其他随机存取存储器中一样。我使用的 FatFS 文件系统支持分配连续块和改进此功能的快速搜索功能。
该文件具有 header 和 CRC 错误检查以帮助防止损坏。在启动时,文件被打开并加载 header。否则看起来它只不过是一个基于链表的 queue。
我将其作为基础 class 和两个派生的 class 实现。派生的 classes 只对它们的存储做 read/write。一个用于磁盘存储,另一个用于在 RAM 中存储(用于测试)。有了这个,我可以简单地 queue 和 dequeue 应用程序中的项目,而调用者不知道他们要去哪里或来自哪里。
这项工作表现出色,考虑到小型嵌入式平台,性能也很合理(~2ms queue/dequeue 平均值,包括 SD 卡访问和 header 存储)。任务 queue 记录项目,另一个任务删除它们并将它们打包,以便在互联网连接可用时发送到服务器。