如何快速排查IO异常输出问题

在嵌入式开发过程中,io 操作是不可避免的,很多时候 io 操作很正常,但有些时候可能因为某些原因导致异常输出,或者说不是你想要的输出(本来应该一直输出高电平,突然出现一个低电平)。
1、时间太久,不知道在哪里操作了这个 io。
2、程序异常篡改 io 输出。
3、维护别人的程序,代码太多,不知道哪些地方会修改这个 io。 针对这些情况,本篇笔记鱼鹰将讨论如何快速排查异常输出问题(软件问题,非单片机本身问题)。
一、全局搜索
一般来说,io 输出肯定有迹可查,比如我们可以全局搜索 gpiob 和 gpio_pin_0 之类的。
当然,我们也可以借助 si 之类的工具查看相关定义的使用情况。 总之,这个方法,比较笨,但对付一般的异常输出,问题不大。
二、断点神器
如果上述方法还是没法查出问题,那么只能请出我们的终极杀人王“火云邪神”,不,终极调试神器——断点出场了(关于该调试方法使用与介绍,可以查看历史笔记《打了多年的单片机调试断点到底应该怎么设置?| 颠覆认知》) 既然从源码很难分析这些问题,那就只能靠单片机本身提供的调试手段来查了。 比如,输出时,我们一般都会调用 gpiob->bsrr 之类的寄存器设置高电平或低电平,所以我们可以使用我们的调试神器跟踪这个寄存器的写入情况,比如我们可以通过设置如下窗口跟踪 gpiob->bsrr 写入情况:
(这里设置为 4 字节访问,是因为这里的寄存器是 32 位的)
当然,除了要查 bsrr,还有 brr、odr 等寄存器,还有别忘了,位绑定的地址操作。 总之,这些地址全部跟踪一遍,如果是软件问题,99% 都能查出来。 另外鱼鹰再教大家一个快速找到寄存器地址方法,比如在调试模式下,可以在命令行中输入下面这个,就能得到对应的地址,当然绑定地址只能通过变量中转一下了,或者直接看汇编代码也很快。 总之,找地址的方法很多,千万不要傻傻的自己手工算,不然怎么早点下班玩游戏啊。
而对于有些 io 的配置莫名的改变了,比如输入变输出,输出变输入,那还要跟踪 crl 、 crh 寄存器。 该方法从根本上跟踪指令,基本上所有代码都将无所遁形(除了 dma 的操作,不过一般人应该不会用 dma 去控制 io 吧),即使你的代码是指针或者其他骚操作,甚至是异常篡改 io 寄存器这种情况。
如何避免?
一般来说,上面两种方法基本上就可以排查问题了,但是有些情况很复杂,就需要根据情况选择适合自己的方法了,方法二绝对是神器级别的,一般问题不大。 所以现在讨论一下怎么尽量避免这个问题。 1、每个 io 操作尽量封装在单独一个函数中,或者使用一个枚举参数进行控制,比如一个枚举 out_pin_led,这样在全局搜索时,搜索这个函数或者枚举就可找出所有操作该 io 的位置,这也是鱼鹰为什么要实现这个 io 框架的原因之一(简单实用io输入输出框架)。绝对不建议直接操作库函数或者寄存器。2、使用 lckr (锁定)寄存器。很多道友可能听说或者见过这个寄存器,但在实际项目中很少使用。事实上这个寄存器很有用处,特别是你不确定这个 io 配置是否会被别人的代码修改的情况。如果很确定这个 io 从始至终只会有一个配置(输入或输出等),那么建议大家在配置完后使用该寄存器锁定对应的引脚,这样,你就不怕别人意外修改这个 io 的配置了(只要锁定了,就无法修改配置,除非重新上电)。之后你的关注点集中在 io 输出即可,而不必怀疑配置被修改的可能。当然,在锁定这个 io 之前的代码问题,可不敢保证。
原文标题:io 异常输出排查指南
文章出处:【微信公众号:strongerhuang】欢迎添加关注!文章转载请注明出处。


差分放大电路计算公式
华为的显示驱动专利解析
释放边缘工作负载整合的全部潜力
德州仪器第一季业绩净利润6.58亿美元同比增3771%
华为mate10和华为mate9对比评测,现在适合入手哪一款
如何快速排查IO异常输出问题
数字存储示波器的工作原理和关键指标
架构模式的基础知识
针对苹果M1 MacBook Air电池的Zoom应用程序进行了测试
2009南非国际汽配展/南非汽配展
IBM助力上海水利科技推进数字孪生水利工程建设
关于SPI传输过程 stm32 SPI配置
什么是驱动电机旋转变压器?驱动电机旋转变压器的优势
汇顶科技最新消息 澄清涨价消息 仅针对一小部分触控产品
华为怎样升级鸿蒙系统 华为nova6支持鸿蒙系统吗
宁德时代上游原材料资源布局解读
嵌入式人工智能技术将赐予设备端更高的智能
平头哥发布首个自研RISC-V AI平台
大数据的4v特征有哪些 大数据技术包括哪些技术
采用PLC和变频器结合实现变频恒压供水系统的设计