NRF52832打印不出LOG的神秘原因

Nordic SDK中的LOG坑

背景

  • 上个月做新项目,拿到Nordic52832的15.3.0 SDK。在打印LOG这件事上着实蛋疼了好一阵。遇到几个问题,最疼的一个在此记录。

    几个问题,不是sdk_config.h中的宏没开,就是打开的工程中.h里有些宏压根没有,小问题,略…

状况

  • 想通过RTT打印出从通信模组返回的数据内容
  • 用了两种方式
    1. 一个大数组做缓存空间
    2. 一个指针申请缓存空间
  • 不管用什么方式,用完数据不是清空就是要释放的嘛,那好啦,如图所示
    把大数据清空释放指针
  • 当然,这些动作都是在调用NRF_LOG_INFO之后,使用完缓冲内的数据才做的,而最终恰恰是这些语句的原因,总之不管怎么用%s,它就是打不出LOG,一条空白,满脑疑问…
    问号打印LOG空白

猜测

  • 一开始遇到时不知道是这些清空语句的问题,所以就开始找啊找,试啊试。
    1. 接口的%s不能用?—— 不,__func__是可以用的
    2. 既然__func__可以打印,难道只有代码区的常量字符串才能打印?—— 试了下,不行
    3. %s不能直接打印数组?—— 嗯,有可能,那申请的空间怎么不行呢(业务代码中有能打印出其他动态申请空间里内容的情况)
    4. NRF_LOG_INFO不行NRF_LOG_WARNING、NRF_LOG_DEBUG可以?—— X,同样情况
    5. 接收到一个字符就打印一个字符吧 [捂脸](*/ω\*) —— 可行

暂时解决

  • 于是就出现比较尴尬的打印现象
    一个字符一打印
  • 这还只是很短的回应内容,遇到长的就要掐着侧栏的滚动条往上拉啊拉… 想理解内容还要自己拼凑起来 -_-|| ,不管怎样总算能看LOG,先调试完再说吧。╮(╯▽╰)╭

解开

  • 可算调试好提交了DEMO,回过头来修修补补bug,就注意到了LOG的问题,越看越不happy,现在有空了,跟它死磕。
  • 说起来找到原因也是个意外,根据第二个猜想,使用动态申请,我尝试把两个常量字符串strcat在一起strcpy到空间后是不能打印的,于是开始删删减减,当我进行了某一个操作之后编译下载发现居然可以打印!高兴坏了… 但当时注释得毫无头绪,还不知道是为啥。就一直往回撤销,终于当free()被恢复注释之后屏幕上出现了久违的LOG。
  • 我去,这已经是流程的最后一步了,竟然会影响一开头的打印LOG!百思不得其解…
    在这里插入图片描述

疑惑

  • 后来查到一些资料,说nRF的LOG其实不像其他MCU开发一样,一句printf就直接打印,而是先存入了一个RTT的RAM缓冲区,类似回调一样到main里再去打印的。经过查看NRF_LOG_INFO,我发现… …我并没有看懂 -_-|| , emmmmm… 一堆宏定义的跳转之后不知道在哪里把数据放到所谓的RAM中了。
  • 但是如果main里面没有调用到NRF_LOG_PROCESS的话确实是又打印不了的。 看来这SDK里大有文章啊,不过到此我也可以得出结论而不必深究了:Nordic官方SDK水很深,作为二次开发者来说要搞明白里面的门门道道得花大功夫,不过好在他们有健全的文档论坛等途径,还有众多开发者的经验之谈,作为初学者我这样的人群遇到二次开发问题还是比较能友好解决的(其实当时遇到问题还可以上Stack Overflow淘一淘解答的)
  • 关于还有一些sdk_config.h里涉及LOG的宏要开启的等等,这里有位前辈的文章1.4小节也指明了NRF_LOG打印的原理和机制,值得一看:点击空降。 如果说已经有研究过NRF_LOG_PROCESS、或知道为什么我开辟的缓冲区被释放而数据清空后打印不出来的小伙伴,可以留言谈谈看法,学无止境呀(*^▽^*)~~
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kx_Kevin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值