news 2026/6/22 15:41:28

【RTOS】EasyLog的移植与使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【RTOS】EasyLog的移植与使用

当前log的突出问题:

①log不方便定位到源程序所在位置

②log不分主次,比较难生成想要的信息

1. 彩色log

1.1 编译器内置宏:__FILE__,__LINE__

led1下直接打印出当前文件的行号和名字

led2复制粘贴过来,改一下引脚

实验现象

哎呀是混乱的,忘加互斥锁了

互斥锁https://blog.csdn.net/2301_76153977/article/details/155972306?spm=1011.2124.3001.6209加上互斥加上互斥锁

在创建任务中 动态创建互斥锁

定义Mutex全局变量

等待互斥锁。解开互斥锁

实验现象:成功加入了.c文件和行号

解决了第一个问题:快速定位log的源文件

但是还没解决第二个问题:快速找到重要log信息的位置

1.2 让重要的关键字用不同的颜色或字体打印

定义一个count=0,每次灯亮灭都会count自增

自增的值大于10,变换颜色

另一个led也设置一下

编译

count有警报,是因为led1和led2使用了相同的count名称,我们把两个文件的count前都加一个static就好了(static:限制作用域,限制在当前文件中,别的文件看不见的

实验现象:

伟大的先驱们定的颜色转移协议:

printf(“\033[1;31;47mZNMCU.C.O.M hello ZNZB\033[0m")

俗称“基于ESC的屏幕控制”

1.3 彩色log实现

在创建任务中

独立执行体

实验现象:

2. 嵌入式log打印神器EasyLogger

2.1 测试一下EasyLogger的基本功能

点击进入EasyLogger

先看一下现象

2.2 测试一下EasyLogger分级打印功能

log的分级打印:普通信息错误警告

不同的函数用来打印不同级别的信息

把创建任务中的log_i改为log_e:

观察实验现象:

已经有条信息变成了红色

我们在第一章已经可以实现打印文件名和行号,本章呢除了这些,还能打印标签和时间戳

它来实现的此功能——

既然已经打印了文件名,还要标签干嘛?

一个项目可能包括多个.c文件,每个.c文件都会有相同的标签

2.3 测试一下EasyLogger的分级过滤功能(静态)

把它改为

创建任务中添加

相当于我们以d为分界线,观察过滤情况

实验现象:a e w i d显示出来了,d之后的v未显示,即v 被过滤掉了

我想过滤掉error呢?

修改

实验现象:果然e后的log都被过滤掉了

源代码中级别的设定如下,我们设置过滤的级别后,我们打印出来的内容是≤设置的级别

2.4 测试一下EasyLogger的分级过滤功能(动态)

更适用现场调试

打开znshell里的sys_cmd.c

在最后添加fll函数,用来动态log的过滤

fll函数什么意思?

一个 基于 ZNS Shell 的动态日志级别控制命令,核心作用是通过串口输入指令,快速修改 EasyLogger 的全局日志过滤级别,实现日志的动态过滤(只输出指定级别及以上的日志)。

1. 函数参数(int argc, char **argv)
这是 ZNS Shell 命令函数的固定参数格式:

  • argc:命令行输入的 参数总个数(包含命令名本身)。比如输入 fll 3,则 argc=2(argv[0] = "fll",argv[1] = "3")。
  • argv:字符串数组,存储每个参数。argv[0] 是命令名("fll"),argv[1] 是用户输入的日志级别(比如 "3")。

2. int level = 0;
定义整型变量 level,用于存储转换后的日志级别数值(默认初始化为 0)。
3. printf("fll set log filter level\r\n");
串口打印提示信息,告知用户当前正在执行 “设置日志过滤级别” 的操作(纯反馈,无实际功能)。
4. level = atoi(argv[1]);
核心转换步骤:
argv[1] 是用户输入的 字符串格式的级别(比如输入 fll 2,argv[1] 就是 "2")。
atoi() 函数:将字符串转为整数,让 EasyLogger 能识别(日志级别是整型枚举)。
5. printf("set level :%d\r\n", level);
串口打印确认信息,告知用户最终设置的级别数值(比如 set level :3),方便用户核对是否输入正确。
6. elog_set_filter_lvl(level);
最关键的 EasyLogger 接口调用:
功能:设置 全局日志过滤级别,只输出 ≥该级别 的日志(级别数值越小,过滤越严格)。
对应关系(EasyLogger 标准级别定义):

7. ZNS_CMD_EXPORT(fll, fll set log filter level);
ZNS Shell 的命令注册宏:
作用:将 fll 函数注册为 Shell 可识别的命令,让用户能在串口终端输入 fll 调用
参数 1:要注册的函数名(fll)。
参数 2:命令的描述信息(fll set log filter level),部分 Shell 支持 help 命令查看该描述。
函数使用场景
编译后,设备上电并通过串口连接终端(如 SecureCRT、Putty)。
在终端输入指令即可动态控制日志:
输入 fll 1 → 设置级别为 ERROR(只输出 ASSERT、ERROR 级日志,过滤其他)。
输入 fll 3 → 设置级别为 INFO(输出 ASSERT、ERROR、WARN、INFO 级日志)。
输入 fll 5 → 设置级别为 VERBOSE(输出所有级别日志,无过滤)。

最顶上添加头文件,atoi在stdlib.h里,elog_set_filter_lvl()在elog.h里

把这个改回来

main函数中不断打印

实验现象:

按下fll1

2.5 测试一下EasyLogger标签和关键字过滤功能

main程序中不断打印log

znshell中实现两个:

  1. 过滤的标签名
  2. 过滤的关键字

新建两个文件app_task.c和.h

sys.cmd.c中最后写一个函数,按照标签过滤

再写一个函数,按照关键字过滤

实验现象:

按下fllt APP

按下fllt MAIN

按下fllk is(只打印带有is关键字的)

3. EasyLogger的移植

别忘加了头文件cmsis_os.h,

编译一下试试,发现有错误

默认是异步方式,我们把所有的关于async的关掉

即把异步方式注释掉

实验现象:编译没有报错了,但是烧录后发现没有打印出来

三个工作方式

异步:不需要等待,把log_out放在另一个任务里,直接执行后续,log_out什么时候打印完就不是咱们关心的了

buffer:缓冲区填满后,统一打印出来,可以减少打印次数

同步:要死等log_out打印完才能执行下一步

异步方式关掉后,便在缓冲方式下工作:不立刻打印,当缓冲区占满,才会打印出来

实验现象:过了好久,突然全部打印出来

把缓冲方式的宏注释掉,关闭了缓冲方式,剩下的就是同步方式

有的平台需要\n,有的平台需要\r\n

实验现象:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/19 6:43:02

4.6 你的 Agent 安全吗?Prompt 注入、数据泄露攻击模式与防御策略

4.6 你的 Agent 安全吗?Prompt 注入、数据泄露攻击模式与防御策略 导语:在上一章,我们构建了一个“AI 防火墙”,学会了如何检测正在发生的攻击。然而,在安全领域,仅仅满足于“发现问题”是远远不够的。一个真正健壮的系统,需要构建**纵深防御(Defense in Depth)**体系…

作者头像 李华
网站建设 2026/6/20 22:33:24

5.4 模型评估与优化:科学评估微调效果

5.4 模型评估与优化:科学评估微调效果 导语:在上一章的“炼丹”实战中,我们成功地微调出了一个“AI 皮肤科医生”模型,并通过几个简单的对话,直观地感受到了它的变化。但这种“感觉”是主观的、不可靠的。要将“炼丹”从一门“玄学”变为一门“科学”,我们必须引入客观、…

作者头像 李华
网站建设 2026/6/21 21:53:01

基于单片机声光控灯系统设计

基于单片机的声光控灯系统设计 第一章 绪论 传统声光控灯多采用模拟电路设计,存在明显局限:光线检测精度低(易受环境干扰误触发)、声音识别范围窄(仅响应特定分贝噪音)、延时时间固定(无法适配不…

作者头像 李华
网站建设 2026/6/22 4:23:18

万亿市场!2025年大模型革命:技术演进、应用落地与学习路径全解析!

简介 2025年AI产业进入商业爆发期,大模型从技术竞赛转向价值导向,多模态融合、轻量化部署、高实用性优化成为主流趋势。算力产业链完善支撑产业基础,商业化落地聚焦垂直场景,具身智能与自动驾驶打开万亿市场。中国AI市场规模突破1…

作者头像 李华
网站建设 2026/6/21 11:26:29

Vue.js 组件全面学习指南

1 学习指南1.1 学习目标认知层级目标描述对应章节了解掌握组件化开发思想与核心价值2.1 组件化思想掌握组件注册、父子通信基础用法3.1-3.2、4.1-4.2熟练高级组件特性与复杂场景应用4.3-4.5、6.0应用独立完成中型项目组件拆分与实现5.0 实战案例1.2 前置知识掌握 Vue 基础语法&…

作者头像 李华
网站建设 2026/6/15 16:08:35

SchoolDash Alpha冲刺随笔3 - Day 5

SchoolDash Alpha冲刺随笔3 - Day 5 课程与作业信息 所属课程:软件工程实践 作业要求来源:第五次作业——Alpha冲刺 本篇目标:记录冲刺第5天进度 项目燃尽图(Burn-up Chart) 当前冲刺总Story Point:50 …

作者头像 李华