下面,跟着我一起看看大家在工作中遇到的bug和解决技巧吧!
mzb2012:
最近做了想项目用的STC顶配单片机,前期做了样品没啥问题,后来小批200个分到各个代理商手里,其他家都没反应有问题,唯独一家吐槽各种无动作,死机。于是拾掇各种装备前往事发地,去了各种排除,外部电源干扰,变频器干扰,布线干扰,问题仍未得到解决。仍旧是,开机一段时间后,除了中断函数内的可以执行,其余全白费, 都不工作。
在烧录之前测试好的程序,依然死机。情急之下拨通了芯片厂家的电话,他们说你可以试试关闭看门狗,看看能否可以自己重启。对着手册,发现了个bug,未打开看门狗,却在主循环里不断清狗。果断开启看门狗,完美解决,看来写代码还得多看手册啊。。。。。
supermiao123:
分享一个奇葩的事,不奇葩你锤我。
比如说数组越界这种事情,到底是怎么发生的呢?
你定义了一个 50个元素的数组,在你自己的想象里,这50个已经够了,你最多只会访问到49,但是,既然是意外引起死机,就必然是因为某个地方,你的下标无意超出了49,而你认为每次写个 if(i < 50)很麻烦。
于是,你访问到了第51个
——这里说明一下,有时候稍微超出一些,只要不触及系统的配置,是不会有事的,但如果你访问到了 第 10232352个,好吧这个这么大的数字我是故意恶心你的,那,你就死定了。
指针乱指又是一种什么情况呢?
其实指针乱指和上述的数组越界往往是类似的。
比如说,人家都告诉你,指针不要随便施加 加减以外的操作,你偏不听,你还说什么 指针是C的精华,你想玩一套神乎其神的 漂移绝技。
你以为你在秋名山呢?
结果,但凡乘除这种事情,两个数据类型不一致或者结果没有进行强转,往往一个数就能变得其大,然后......就没有然后了。
很多年前,我刚工作的时候,我也玩过指针乘除这件事情,当时我是怎么发现这个BUG得呢?
我打印那片地址的所有数据,然后我突然发现有个错误的数据看着很熟悉,啊?这不是我的一个标志值么?
稍稍做个测试,我在一个和这个功能毫无关系的地方修改了那个毫无关系的标志值,不好意思,这个值再一次出现在这个毫无关系的千里之外。
于是我决定,我一定是不小心做了什么作孽的事情。
然后才引起的死机。
说实在的,为什么我说,死机其实是一种保护机制呢?
那是因为,假如在出现这种千里之外的错误的时候,我宁可它死机,否则,我永远都不知道那片存储区里有一个数据被默默的篡改了........
项目代码是我写的,有一次同事编译后下载的代码触摸不好用
同一个硬件到我这边下载后一切正常
我又一次把代码考给他,下载还是不能用
感觉有点解释不清了
我到他电脑上用Beyond Compare软件把他编译的和我考给他的一一比较
没发现有不同的地方
重装过相同版本的IAR编译器问题也不能解决
后来在比较我这边和他那边生成的.hex文件时看到里边有一个字节不一样
然后这个问题就一直没有解决。
bug最多的还是程序端没有被执行,一般使用Debug调试,但是有的时候成百上千次的循环中不适合断点调试,所以使用串口打印,最常用的错误定位方法是:
#define MARK(s) printf("%s,%d,%s\r\n",__FILE__,__LINE__,s)
使用就是例如MARK("tangquan");,打印出来就是main.c,115,tangquan
事实上除非出现很麻烦的问题一般我不用debug,串口大部分问题都能搞定的。
在调试一个电压采集板子的时候,用到linear公司的ltc1605aig,当时用的时候初学,对手册不是特别钻研,只是基本功能实现就ok,结果就是每次采集完成以后都要手动复位,但虽然也能实现功能,但就是觉得哪里不舒服。后来仔细阅读手册之后才发现,有一个管脚的电平没有设置对,芯片明明可以连续采集的。
这个bug没有造成太大的损失,但告诉我对付芯片要认真,手册是唯一可以依靠的专家。
1. 写入Flash的图案数据与读出显示的不同,显示不全,经仔细查找,是读出的BUFFER定义小了。
2. 非接触卡,不同卡类型的流程上处理出现问题,经查程序和分析,是一个变量用作了2个用途,增加一个变量,使得各司其职,问题得到解决。
3. 非接触卡,有年检的操作,再根据结果,对于不同卡类型,不同充值消费规则都有不同处理, 当时自测加修改程序,费了不少周折,后期在现场程序运行稳定。
总结如下,程序对于可能出现的情况处理的越全面,出现bug的几率就越低。
某次做完一块板,stm32的,然后焊完就下载程序测试,程序也能下载,就是再次下载程序的时候,下不进去了,然后查硬件:时钟,复位,电源,下载信号,发现没问题,死活就是下不进去。然后就换了一个芯片,然后又重复之前的操作,苦思冥想了好几天,最后发现串口下载可以用,然后我突然明白了什么,原来是软件设置上把SWD接口禁掉了。。
我用11颗WS2811S级联去驱动11颗RGB LED,我把SET脚拉高,设置成低速模式,写完驱动一测试,果然没任何反应,
于是上设备去测时序,OK没问题,和规格书一样,
出于谨慎,又仔细对着规格书把电路和时序都看了一遍,OK没问题
但是LED就是没反应,然后接着测电源电压。。。。。。一顿折腾,还是一点动静都没有
然后脑袋一亮,会不会是高速模式和低速模式搞错了,于是我按照高速模式的时序写了驱动,卧槽居然OK了
然后问题解决了,不过还没完,我又对照着规格书看了一遍,没错啊,我就是设置成了低速模式。
同样的编译器不同的STM32芯片型号,编译下载之后有一个可以自动运行,另一个要重启才能运行。好长时间没找到原因。后来设置编译器时才发现,原来设置好编译器就可以解决了这个问题。
Reset and Run 前面的对勾取消了就在下载完成时不会自动运行
Reset and Run 前面的对勾打上就在下载完成时自动运行
最近做了想项目用的STC顶配单片机,前期做了样品没啥问题,后来小批200个分到各个代理商手里,其他家都没反应有问题,唯独一家吐槽各种无动作,死机。于是拾掇各种装备前往事发地,去了各种排除,外部电源干扰,变频器干扰,布线干扰,问题仍未得到解决。仍旧是,开机一段时间后,除了中断函数内的可以执行,其余全白费, 都不工作。
在烧录之前测试好的程序,依然死机。情急之下拨通了芯片厂家的电话,他们说你可以试试关闭看门狗,看看能否可以自己重启。对着手册,发现了个bug,未打开看门狗,却在主循环里不断清狗。果断开启看门狗,完美解决,看来写代码还得多看手册啊。。。。。
wateras1:
1:最近做项目使用到了cjson,其实cjson很方便用,都不需要怎么修改就可以用,编译运行后,一直无法打印出构建的json树,我开始还以为是标准库里面的malloc,free等函数接口有问题,后来找到了stm32 .s配置文件修改了heap区,将原来的512个字节修改成3KB了,一切运行正常了
2:有一次整测试工装,出现一个很奇怪的问题,就是软件设置没问题,检查硬件也没发现什么问题,最后发现是测试工装里面的测试针没对齐,当时我们也是因为太相信工厂了,还以为是我们软硬件有问题,搞得折腾了两三天才发现。
未完,待续……
联系客服