良许Linux教程网 干货合集 IO 异常输出排查指南

IO 异常输出排查指南

在嵌入式开发过程中,无法避免进行IO操作。通常情况下,IO操作是正常的,但有时由于各种原因可能会导致异常输出,或者输出不符合预期(例如本应一直输出高电平,突然出现低电平)。

1、由于时间较长,可能无法确切知道在哪个地方对该IO进行了操作。
2、程序异常可能会篡改IO输出。
3、当维护他人编写的程序时,由于代码量较大,难以确定哪些部分会修改该IO。

针对以上情况,本文将探讨如何快速排查异常输出问题(软件问题,而非单片机本身的问题)。

一、全局搜索

一般来说,IO输出肯定留下了一些蛛丝马迹,例如我们可以全局搜索GPIOB和GPIO_Pin_0等关键词。image-20231114214207527
当然,我们也可以借助 SI 之类的工具查看相关定义的使用情况。

总之,这个方法,比较笨,但对付一般的异常输出,问题不大。

二、断点神器

如果上述方法还是没法查出问题,那么只能请出我们的终极杀人王“火云邪神”,不,终极调试神器——断点出场了(关于该调试方法使用与介绍,可以查看历史笔记《打了多年的单片机调试断点到底应该怎么设置?| 颠覆认知》)

既然从源码很难分析这些问题,那就只能靠单片机本身提供的调试手段来查了。

比如,输出时,我们一般都会调用 GPIOB->BSRR 之类的寄存器设置高电平或低电平,所以我们可以使用我们的调试神器跟踪这个寄存器的写入情况,比如我们可以通过设置如下窗口跟踪 GPIOB->BSRR 写入情况:
image-20231114214210580
(这里设置为 4 字节访问,是因为这里的寄存器是 32 位的)
image-20231114214214120
当然,除了要查 BSRR,还有 BRR、ODR 等寄存器,还有别忘了,位绑定的地址操作

总之,这些地址全部跟踪一遍,如果是软件问题,99% 都能查出来。

另外鱼鹰再教大家一个快速找到寄存器地址方法,比如在调试模式下,可以在命令行中输入下面这个,就能得到对应的地址,当然绑定地址只能通过变量中转一下了,或者直接看汇编代码也很快。

总之,找地址的方法很多,千万不要傻傻的自己手工算,不然怎么早点下班玩游戏啊。
image-20231114214218145
而对于有些 IO 的配置莫名的改变了,比如输入变输出,输出变输入,那还要跟踪 CRL 、 CRH 寄存器。

该方法从根本上跟踪指令,基本上所有代码都将无所遁形(除了 DMA 的操作,不过一般人应该不会用 DMA 去控制 IO 吧),即使你的代码是指针或者其他骚操作,甚至是异常篡改 IO 寄存器这种情况。

如何避免?

一般来说,上面两种方法基本上就可以排查问题了,但是有些情况很复杂,就需要根据情况选择适合自己的方法了,方法二绝对是神器级别的,一般问题不大。

所以现在讨论一下怎么尽量避免这个问题。

1、每个 IO 操作尽量封装在单独一个函数中,或者使用一个枚举参数进行控制,比如一个枚举 OUT_PIN_LED,这样在全局搜索时,搜索这个函数或者枚举就可找出所有操作该 IO 的位置,这也是鱼鹰为什么要实现这个 IO 框架的原因之一(简单实用IO输入输出框架)。绝对不建议直接操作库函数或者寄存器。

2、使用 LCKR (锁定)寄存器。很多道友可能听说或者见过这个寄存器,但在实际项目中很少使用。事实上这个寄存器很有用处,特别是你不确定这个 IO 配置是否会被别人的代码修改的情况。如果很确定这个 IO 从始至终只会有一个配置(输入或输出等),那么建议大家在配置完后使用该寄存器锁定对应的引脚,这样,你就不怕别人意外修改这个 IO 的配置了(只要锁定了,就无法修改配置,除非重新上电)。之后你的关注点集中在 IO 输出即可,而不必怀疑配置被修改的可能。当然,在锁定这个 IO 之前的代码问题,可不敢保证。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部