概述

嵌入式设备的事件记录功能,可用于调试及分析设备故障。当设备发生故障后可通过故障日志尽可能还原故障现场,类似于飞机上的黑匣子

日志输出形式

一般的嵌入式系统,日志输出可以分为两种类型:

  1. 输出显示。通过串口,网络接口,显示接口等将数据直接显示。多用于设备调试
  2. 存储记录。通过内外部存储,SD 卡和网络服务器等形式,将故障数据存储于特定的介质中,后期通过解析工具将数据解析出分析故障

串口

串口日志即通过 printf 等接口进行串口打印,在此不过多赘述

存储

存储可以分为 2 种主要形式:

  1. 通用文件格式存储(如 fatfs 等)
  2. 私有数据格式存储(读写根据私有协议直接操作源数据)

事件分级

根据不同事件不同的重要性,需要对记录的事件进行分级,以实现有效的信息过滤和筛选。一般可按照如下分类:

  1. DEBUG:详细的调试信息
  2. INFO:一般信息,如系统启动等
  3. WARNING:潜在问题,但不影响系统正常运行
  4. ERROR:严重问题,可能 影响系统的正常工作

设计思路

本文主要介绍以 Flash 存储的形式记录日志

Flash 分区

为了实现高效的日志管理,可以将日志系统当作通用文件系统来进行管理,需要对 Flash 存储空间进行分区(具体空间大小自行划分)

  1. 头信息区(一般用于记录 Flash 或日志管理过程的重要参数,确保在设备断电过程中进行备份保存)
  2. 日志区(主要存储区,支持环写)
  3. 若 Flash 需要上电自检可以新增一片自检分区

数据格式

嵌入式设备资源有限,日志数据尽量以精简为主,一般仅包含关键信息

  1. 日期
  2. 时间
  3. 事件代码
  4. 事件等级

日期和时间:日期和时间可直接采用标准 UNIX 时间,即通过一个 4 字节时间戳来表示 1970年1月1日0时0分0秒起至当前时间的总秒数。若系统需要精确到毫秒级别的时间,可新增独立的本地 ms 计数,配合标准 UNIX 时间使用
事件代码:嵌入式设备在运行过程中会产生各式各样的事件,为精简数据量,减少日志记录对存储资源的损耗,可通过事件代码的形式进行记录。后期通过私有协议对日志进行解析
事件等级:同上不再赘述

日志管理逻辑

日志管理的基本逻辑为:

  1. 事件触发时写入日志
  2. 存储空间写满则清空存储空间
  3. 可通过工具下载并解析日志

索引

环写

上电初始化

应用接口

可优化功能

存储空间管理