2026/1/22 21:32:49
网站建设
项目流程
destoon 手机网站模板,网站建设价格方案,网站开发与软件开发,dw网站怎么做跳转当前log的突出问题#xff1a;
①log不方便定位到源程序所在位置
②log不分主次#xff0c;比较难生成想要的信息
1. 彩色log
1.1 编译器内置宏#xff1a;__FILE__,__LINE__
led1下直接打印出当前文件的行号和名字 led2复制粘贴过来#xff0c;改一下引脚 实验现象 哎…当前log的突出问题①log不方便定位到源程序所在位置②log不分主次比较难生成想要的信息1. 彩色log1.1 编译器内置宏__FILE__,__LINE__led1下直接打印出当前文件的行号和名字led2复制粘贴过来改一下引脚实验现象哎呀是混乱的忘加互斥锁了互斥锁https://blog.csdn.net/2301_76153977/article/details/155972306?spm1011.2124.3001.6209加上互斥加上互斥锁在创建任务中 动态创建互斥锁定义Mutex全局变量等待互斥锁。解开互斥锁实验现象成功加入了.c文件和行号解决了第一个问题快速定位log的源文件但是还没解决第二个问题快速找到重要log信息的位置1.2 让重要的关键字用不同的颜色或字体打印定义一个count0每次灯亮灭都会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打印神器EasyLogger2.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则 argc2argv[0] fllargv[1] 3。argv字符串数组存储每个参数。argv[0] 是命令名fllargv[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 2argv[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函数中不断打印实验现象按下fll12.5 测试一下EasyLogger标签和关键字过滤功能main程序中不断打印logznshell中实现两个过滤的标签名过滤的关键字新建两个文件app_task.c和.hsys.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实验现象