文章目录
- 1 系统日志方案
- 1.1 背景
- 1.2 产品需求
- 1.3 实现方案
- 1.4 技术路径
- 2 从SD卡到Flash启动方案
- 3 提高程序执行效率 60%
- 4 调试手段
- 4.1 syslog日志
- 4.2 内存日志
- 5 状态机
1 系统日志方案
1.1 背景
为了更好对产品量产后,进行产品使用场景、生命周期、故障诊断、返厂维修进行大数据分析,我们需要针对自己的产品打造系统日志系统。
1.2 产品需求
根据不同的系统需求,定义系统日志需要记录的内容。
系统日志 | 日志说明 | 日志格式 | 分配空间 | 备注 |
系统运行总时间 | 全生命周期 | 小时+分钟 | – | 记录全生命周期产品工作时长,结合温度分析产品在不同场景下使用寿命 |
系统上电次数 | 全生命周期 | 次数 | – | 记录全生命周期产品上电次数 |
开关机事件 | 全生命周期 | 次数 | – | 记录事件发生的时间 |
关键器件温度 | 全生命周期 | 按温度档位记录 :[-40, 0), [0, 20), [20, 50),[50, 85] | – | 通过分析关键器件温度,分析温度对产品使用寿命的影响 |
外部操作指令统计 | 记录最近xx条即可 | – | – | 产品运行过程中,产生任何异常,都可以通过回溯指令,获取当时产品运行的状态 |
系统打印日志 | 启动后关键参数打印,开机LOGO,次数,时间 | – | – | 产品bug调试方便定位 |
1.3 实现方案
存储位置 | 优缺点 | 失效风险 | 解决方案 | 备注 |
DDR | 空间大、读写速度快 | 掉电丢失 | – | – |
Flash | 空间大、读写速度快、掉电不丢失、擦写寿命10w级别 | 写或擦除时掉电风险 | 硬件缓掉电,双备份存储,交叉写入 | – |
eeprom | 空间小、读写速度快、掉电不丢失、擦写寿命长百万级别 | 写时掉电风险 | 备份电池缓下电;采用ADC来检测掉电电压低于某个值时操作EEPROM;采用CMP+和CMP-来做比较电压中断,然后操作EEPROM. | – |
在没有硬件做辅助缓下电解决方案,从软件角度无法完全解决此掉电问题,采用flash交叉备份写入比较,可降低擦写时掉电风险值。
1.4 技术路径
1.zlog 日志自带年月日时分秒
2.syslog 系统自带日志系统 月日时分秒
3.内存日志,malloc开辟空间,sprintf写数据,客户端通过TCP获取。
2 从SD卡到Flash启动方案
3 提高程序执行效率 60%
Eclipse debug 编译程序,执行算法耗时90ms,经过 -O3 优化 执行算法耗时可降低到30ms,优化简直了。
File --> properties --> C/C++ build --> setting --> tools setting --> optimization --> O3
4 调试手段
系统日志与内存日志的时间效率比对
4.1 syslog日志
#include <syslog.h>
for(int i = 0; i <1000; i++){
syslog(LOG_USER|LOG_DEBUG, "syslog test:%d\n", i);
}
查看日志:cat /var/log/syslog
执行时间:524339us
4.2 内存日志
char buffer[4*1024*1024] = {};
for(int i = 0; i <1000; i++){
sprintf(buffer, "memlog test:%d\n", i);
}
执行时间:567us
执行效率有着数量级别的提升。
5 状态机
- 软件状态机模式定义
Init/ Factory/Engineer/OTA/SelfTest/Active/Error/ShutDown/Standby/FuSa Safety