来源:公众号【鱼鹰谈单片机】,ID :emOsprey
大家好,我是鱼鹰。
不知道你是否遇到这样的情况,一直正常使用的 bin 文件,当下载到一个新板子后,或者将主控板安装到新的环境中,出现了反复重启。
一般出现这种情况,鱼鹰第一反应是外部环境导致的软件 bug,而追根究底还是软件问题。
其实像这种复现率很高的反复重启的问题,使用在线调试是非常容易定位的,并且也必须解决(不要认为常规情况下不存在这种硬件环境就不解决),否则后患无穷。
这里主要讨论哪些环境可能导致重启:
1、断言失败。某种情况下导致的断言失败,比如 EEPROM 里面保存参数异常,或者 eeprom 有问题,导致使用了默认参数,而默认参数处理有问题。
2、堆不足。比如一块大内存一般情况下,只会在开机申请一次,但由于某种条件,出现多次申请,如 mdns 服务多次进行回调处理时。
3、无法及时喂狗。比如外部中断(IO、串口)频繁进入,导致无法及时喂狗,或者某个 I2C 外设出现问题,导致死等外设数据等。
4、运行时序不正常。比如程序检测某些外设异常,想通过 CAN 上报数据,而此时 CAN 外设没有进行初始化,一些指针未准备好导致。而一般正常的板子外设是正常的,也就不会使用 CAN 上报数据,因此不会触发 bug。
5、栈溢出。软件检测外设时遇到异常情况,需要进入一个异常分支,而这个异常分支函数调用非常深(或局部变量大),导致消耗了太多的栈,最终引发了 hardfault 问题。
总之,这些问题归根结底还是软件的 bug,必须重视,只有将这些异常 bug 一步步修复,你的软件才能算是稳定的。任何一个你没有找到 root case 的 bug,都有可能在客户手中出现,从而导致更严重的问题。
你还遇到哪些重启问题,可以评论区聊聊。
297