嵌入式系统-日志记录
概述
嵌入式设备的事件记录功能,可用于调试及分析设备故障。当设备发生故障后可通过故障日志尽可能还原故障现场,类似于飞机上的黑匣子
日志输出形式
一般的嵌入式系统,日志输出可以分为两种类型:
- 输出显示。通过串口,网络接口,显示接口等将数据直接显示。多用于设备调试
- 存储记录。通过内外部存储,SD 卡和网络服务器等形式,将故障数据存储于特定的介质中,后期通过解析工具将数据解析出分析故障
串口
串口日志即通过 printf 等接口进行串口打印,在此不过多赘述
存储
存储可以分为 2 种主要形式:
- 通用文件格式存储(如 fatfs 等)
- 私有数据格式存储(读写根据私有协议直接操作源数据)
事件分级
根据不同事件不同的重要性,需要对记录的事件进行分级,以实现有效的信息过滤和筛选。一般可按照如下分类:
- DEBUG:详细的调试信息
- INFO:一般信息,如系统启动等
- WARNING:潜在问题,但不影响系统正常运行
- ERROR:严重问题,可能 影响系统的正常工作
设计思路
本文主要介绍以 Flash 存储的形式记录日志
Flash 分区
为了实现高效的日志管理,可以将日志系统当作通用文件系统来进行管理,需要对 Flash 存储空间进行分区(具体空间大小自行划分)
- 头信息区(一般用于记录 Flash 或日志管理过程的重要参数,确保在设备断电过程中进行备份保存)
- 日志区(主要存储区,支持环写)
- 若 Flash 需要上电自检可以新增一片自检分区
数据格式
嵌入式设备资源有限,日志数据尽量以精简为主,一般仅包含关键信息
- 日期
- 时间
- 事件代码
- 事件等级
日期和时间:日期和时间可直接采用标准 UNIX 时间,即通过一个 4 字节时间戳来表示 1970年1月1日0时0分0秒起至当前时间的总秒数。若系统需要精确到毫秒级别的时间,可新增独立的本地 ms 计数,配合标准 UNIX 时间使用
事件代码:嵌入式设备在运行过程中会产生各式各样的事件,为精简数据量,减少日志记录对存储资源的损耗,可通过事件代码的形式进行记录。后期通过私有协议对日志进行解析
事件等级:同上不再赘述
日志管理逻辑
日志管理的基本逻辑为:
- 事件触发时写入日志
- 存储空间写满则清空存储空间
- 可通过工具下载并解析日志
索引
环写
上电初始化
应用接口
可优化功能
存储空间管理
评论




