如何在S32K144中优雅地输出调试信息
文章目录
- 1.前言
- 2.功能
- 2.1 基础打印功能
- 2.2 增加颜色识别
- 2.3 增加log输出静默功能
- 2.4 增加低等级log输出屏蔽功能
- 2.5 增加查询log等级对应的字符串名称的功能
- 2.6 其他功能
- 3.源代码修改
- 3.1 <log.h>修改
- 3.2 <log.c>修改
- 4.测试
- 4.1 测试基础log输出功能
- 4.1.1 main函数编写
- 4.1.2 测试情况
- 4.2 测试颜色识别功能
- 4.2.1 代码修改
- 4.2.2 测试情况
- 4.3 测试log输出静默功能
- 4.3.1 main函数编写
- 4.3.2 测试情况
- 4.4 测试低等级log输出屏蔽功能
- 4.4.1 main函数编写
- 4.4.2 测试情况
- 4.5 测试查询log等级对应的字符串名称的功能
- 4.5.1 main函数编写
- 4.5.2 测试情况
- 5.例程分享
1.前言
前两天在CSDN上面刷到一些介绍开源项目log.c的文章,称赞log.c是一款轻量级日志库,使用简单。笔者怀着兴趣去log.c的github仓库学习了一下,地址如下:
GitHub - rxi/log.c: A simple logging library implemented in C99
从log.c的源码看,非常适合用在嵌入式Linux系统中,但是在MCU中却没法直接使用。因此,笔者对log.c的源码进行修改,使其能够用在MCU中,并保留原本log.c开源项目的大部分功能,下文称此项目为log.c for mcu。
2.功能
log.c for mcu主要实现的功能如下:
- 基础log输出功能
- 增加颜色识别
- 增加log输出静默功能
- 增加低等级log输出屏蔽功能
- 增加查询log等级对应的字符串名称的功能
2.1 基础打印功能
原本的log.c项目实现了六种log输出等级,如下所示,本质上都是对void log_log(int level, const char *file, int line, const char *fmt, ...)
的简单封装,log.c for mcu也要实现该功能。
#define log_trace(...) log_log(LOG_TRACE, __FILE__, __LINE__, __VA_ARGS__)
#define log_debug(...) log_log(LOG_DEBUG, __FILE__, __LINE__, __VA_ARGS__)
#define log_info(...) log_log(LOG_INFO, __FILE__, __LINE__, __VA_ARGS__)
#define log_warn(...) log_log(LOG_WARN, __FILE__, __LINE__, __VA_ARGS__)
#define log_error(...) log_log(LOG_ERROR, __FILE__, __LINE__, __VA_ARGS__)
#define log_fatal(...) log_log(LOG_FATAL, __FILE__, __LINE__, __VA_ARGS__)
其中,
__FILE__
代表log输出函数所在的文件__LINE__
代表log输出函数所在的行号__VA_ARGS__
传输log_trace(...)
等宏的括号内的字符串或者可变参数
2.2 增加颜色识别
log.c中增加宏定义LOG_USE_COLOR
即可实现几种log以不同颜色输出,显示效果如下:
受宏定义LOG_USE_COLOR
影响的主要代码如下:
#ifdef LOG_USE_COLOR
static const char *level_colors[] = {"\x1b[94m", "\x1b[36m", "\x1b[32m", "\x1b[33m", "\x1b[31m", "\x1b[35m"
};
#endifstatic void stdout_callback(log_Event *ev) {char buf[16];buf[strftime(buf, sizeof(buf), "%H:%M:%S", ev->time)] = '\0';
#ifdef LOG_USE_COLORfprintf(ev->udata, "%s %s%-5s\x1b[0m \x1b[90m%s:%d:\x1b[0m ",buf, level_colors[ev->level], level_strings[ev->level],ev->file, ev->line);
#elsefprintf(ev->udata, "%s %-5s %s:%d: ",buf, level_strings[ev->level], ev->file, ev->line);
#endifvfprintf(ev->udata, ev->fmt, ev->ap);fprintf(ev->udata, "\n");fflush(ev->udata);
}
这段代码使用的fprintf函数以及vfprintf函数在MCU中并不实用,在log.c for mcu中会修改成printf函数和vprintf函数。
需要注意的是,
"\x1b[94m"
这些配置打印信息显示不同颜色的方式,只有在putty这些终端工具才能产生效果,普通的串口工具如sscom不会产生效果。
2.3 增加log输出静默功能
log.c使用函数void log_set_quiet(bool enable)
进行静默使能,按如下方式调用即可关闭log输出功能。
log_set_quiet(true);
2.4 增加低等级log输出屏蔽功能
log.c使用函数void log_set_level(int level)
进行低等级log输出屏蔽,低于该函数设置的等级的log输出会被屏蔽。默认屏蔽等级设置为LOG_TRACE
,即最低的等级0,所以所有log函数都可以输出。
2.5 增加查询log等级对应的字符串名称的功能
log.c使用函数const char* log_level_string(int level)
返回log等级对应的字符串名称,可以方便的了解LOG_DEBUG
等字符串对应的log等级,和函数void log_set_level(int level)
配合使用。
2.6 其他功能
log.c还有三个功能函数,在MCU裸机中没有用武之地,所以就不移植了。
int log_add_callback(log_LogFn fn, void *udata, int level);
int log_add_fp(FILE *fp, int level);
void log_set_lock(log_LockFn fn, void *udata);
3.源代码修改
3.1 <log.h>修改
- 对结构体
log_Event
进行删减,剔除不需要用的成员;同时删除不需要用的typedef自定义的数据类型。
- 删除用不到的函数
3.2 <log.c>修改
- 删除不需要用的typedef自定义的数据类型,对结构体
L
进行删减。
- 修改函数
static void stdout_callback(log_Event *ev)
的内部实现,使其能够在MCU中运行使用。
- 修改函数
void log_log(int level, const char *file, int line, const char *fmt, ...)
的内部实现,和第2点是主要的修改点。
- 删除如下不需要使用的函数。
static void file_callback(log_Event *ev)
static void lock(void)
static void unlock(void)
void log_set_lock(log_LockFn fn, void *udata)
int log_add_callback(log_LogFn fn, void *udata, int level)
int log_add_fp(FILE *fp, int level)
static void init_event(log_Event *ev, void *udata)
4.测试
将上述章节描述的修改之后的log.c和log.h文件添加到实现串口标准打印输出的程序,同时在main函数中调用相关函数即可,最后基于S32K144EVB-Q100开发板进行测试。
关于实现串口标准打印输出的程序,可以参考如下文章的1.3.3章节。
基于S32K144平台实现两种软件定时器_Auto FAE进阶之路的博客-CSDN博客
4.1 测试基础log输出功能
4.1.1 main函数编写
基础功能的main函数编写如下:
4.1.2 测试情况
使用普通串口工具打印的信息如下:
4.2 测试颜色识别功能
4.2.1 代码修改
在<log.h>中增加如下宏定义:
#define LOG_USE_COLOR
4.2.2 测试情况
使用putty终端工具打印的信息如下:
4.3 测试log输出静默功能
因为正常情况下,MCU串口打印很少使用putty,所以后面的功能演示会取消颜色识别功能。
4.3.1 main函数编写
注释宏定义LOG_USE_COLOR
,并修改main函数如下:
4.3.2 测试情况
使用普通串口工具打印的信息如下:
4.4 测试低等级log输出屏蔽功能
4.4.1 main函数编写
main函数修改如下:
4.4.2 测试情况
使用普通串口工具打印的信息如下:
4.5 测试查询log等级对应的字符串名称的功能
4.5.1 main函数编写
main函数修改如下:
4.5.2 测试情况
使用普通串口工具打印的信息如下:
5.例程分享
相关例程已上传百度网盘,链接如下:
- 链接:https://pan.baidu.com/s/1aSYqoXwDROoX0gMfQvBHtQ
- 提取码:j3av
如果觉得文章对您有用,帮忙点个关注!!!
如何在S32K144中优雅地输出调试信息相关推荐
- android bionic log打印,如何让android的bionic中的linker输出调试信息
缺省情况下bionic的linker是不会输出调试信息的,因为Linker.c里一开始就写着: * Do NOT use malloc() and friends or pthread_*() cod ...
- 日志的log中如何输出变量_如何在kubernetes中优雅的输出日志
背景 我们经常需要在kubernetes中运行一些任务性质的Job或者Pod.在调试过程中,我们对日志有如下两个需求 需求一:日志输出到stdout.因为stdout的输出,可以非常方便的通过kube ...
- php语法中可以输出调试信息,怎么优雅的输出PHP调试信息
如何优雅的输出PHP调试信息 经常因为出现紧急bug而被老板骂的同事,为了更快的修复而直接利用线上的错误环境现场debug,并直接在页面上echo和dump.结果被老板发现了,又是一通臭骂.那么有没有 ...
- 在MFC,Win32程序中向控制台(Console)窗口输出调试信息
在MFC程序中输出调试信息的方法有两种,一种是使用TRACE宏,可以向Output窗口输出调试信息:另一种是用MessageBox,弹出消息框来输出调试信息,但会影响程序的运行. 其实有一种方法可以更 ...
- easyswoole数据库连接池_如何在 Swoole 中优雅的实现 MySQL 连接池
如何在 Swoole 中优雅的实现 MySQL 连接池 一.为什么需要连接池 ? 数据库连接池指的是程序和数据库之间保持一定数量的连接不断开, 并且各个请求的连接可以相互复用, 减少重复连接数据库带来 ...
- 如何在MyBatis中优雅的使用枚举
From: https://segmentfault.com/a/1190000010755321 问题 在编码过程中,经常会遇到用某个数值来表示某种状态.类型或者阶段的情况,比如有这样一个枚举: p ...
- 如何在vscode中优雅的编写C语言
如何在vscode中优雅的编写C语言 各位好,我认为vscode编辑器在windows环境下除了Pycharm外是最方便的IDE了,但在初学C语言时很少有人的第一个C语言软件使用的是vscode来编译 ...
- android jni 中实现 LOG 输出调试
android jni 中实现 LOG 输出调试 在jni 文件夹下 android.mk文件中 添加 LOCAL_LDLIBS += -L$(SYSTEM)/usr/lib -llog 在jni中添 ...
- python中如何不换行_如何在Python中不换行输出
如何在Python中不换行输出 发布时间:2020-09-22 15:04:14 来源:亿速云 阅读:161 作者:小新 小编给大家分享一下如何在Python中不换行输出,希望大家阅读完这篇文章后大所 ...
最新文章
- MySQL存储过程简介
- iperf3 测速跑不满的解决办法
- java 自定义注解获取_Java自定义注解
- Vue在插槽slot时报错:Component template should contain exactly one root element. If you are using v-ifen
- 被裁之后才明白:有一种抗风险能力,叫做会讲故事
- 《经济地理学》读书笔记
- MySQL免安装版 图文教程【5.7版本,纯净版win7安装】
- 用word写接口文档时的常规格式设置
- AXD 调试经验,使用及问题
- 工信部发布《2018中国区块链产业白皮书》:量子计算机将给密码体系带来重大安全威胁
- 基于LPC1114的闪烁小灯
- 某技术总监认为处女座码农要重用,并给出3点原因,你认同么?
- R7 4800U对比R5 4600U性能差距
- 一个高速交警的忠告(转)
- 计算机硬件检测数据恢复理论知识,计算机硬件检测维与数据恢复赛项规程.doc...
- 程序员避免面向监狱编程攻略大盘点
- ticklength
- 什么是云渲染?【谈谈云渲染和传统渲染农场的区别】
- WindowsAPI编程 简单的计算器
- 《卡尔琳记事本》,召唤师的故事,周更
热门文章
- highD变道起止点前后车辆数据获取
- fix feeds/telephony/net/freeswitch/Makefile
- 2022西式面点师(初级)考试题模拟考试题库及在线模拟考试
- 我国支付工具主要有哪几种
- Nagios配置飞信报
- 冒险岛封包拦截研究!
- C++学习笔记(STL篇)string vector迭代器 stack queue
- 形变(Deform)开关的本质
- php贪吃蛇游戏代码下载,JS实现的贪吃蛇游戏完整实例
- 云服务器 ECS,RDS,Redis,SLB服务器建站流程