原创博客,欢迎光临
嵌入式是本职,AI 是兴趣,其它是无奈

小心你的日志打印:又遇到一次,一行日志打印引起的问题

#Telink BLE Mesh 应用开发

问题

基于 Telink mesh SDK 开发,需要控制 LED,SDK 中提供了一个 LED 管理的参考代码,按文档中的说明完成 LED 相关代码的添加后,测试时发现一个现象:控制 LED 灯闪烁 3 次,但实际仅闪烁 1 次后就停止了。

排查

为了验证 LED 相关代码的添加是否有问题,增加一个控制:控制 LED 灯常亮 3 秒后熄灭。经测试,没有问题。基本说明 LED 相关代码的添加是 OK 的。
再次对比文档说明和相关代码,没有发现问题。
于是在 LED 模块关键位置添加打印,烧录程序后继续测试,问题竟然消失了!
不会吧,前后除了添加 2 行日志打印,我并没有修改其它任何地方啊——又一个”聊斋”(诡异)故事出现了?
为了确认确实没有修改其它地方,只添加了日志打印,把新增的 2 行打印代码暂时屏蔽,重新编译烧录——问题又出现了。
由此可知,确实是日志打印影响了程序的表现。
然后也是通过分别屏蔽 2 个函数中 2 行日志的其中一行,确定是主循环里调用的 LED 处理函数 led_proc 里的日志影响的。

一个小小的日志打印,会导致程序表现完全不一样?为什么。
根据多年开发的一点小小的经验,基本可以判断:日志打印是通过串口实现的,串口输出是阻塞的,会占用主循环的时间(特别是本项目中,用的还是 GPIO 口模拟串口),主循里阻塞的操作,可能会影响时间相关的函数(LED 亮灭控制,就有时间控制)。
如何验证这个判断?把日志打印的代码,替换为延时函数,再测试一下,就可以判断。
于是我把日志打印的代码,替换为 sleep_ms(10),延时 10 ms,和日志打印的效果一样,问题不会出现。
又把日志打印的代码,替换为 sleep_ms(2),延时 2 ms,问题就出现了!

原因

if(clock_time_exceed(device_led.startTick, (device_led.onTime_ms-5)1000)) 中 -5 导致,改为 if(clock_time_exceed(device_led.startTick, (device_led.onTime_ms)1000)),就 OK 了。
具体原因通过 LED 相关代码分析,没有找到,如果要找到根本原因,要动用 Telink 的调试软件了。

总结

日志打印引起的问题,根本原因,一般都是有无日志输出时,程序延时的不同而导致的问题。

赞(0)
未经允许不得转载:程序员大狐狸 » 小心你的日志打印:又遇到一次,一行日志打印引起的问题

评论 抢沙发

登录

找回密码

注册