分享一些网友工作中遇到的bug和解决技巧
下面,跟着我一起看看大家在工作中遇到的bug和解决技巧吧!
mzb2012:
最近做了想项目用的STC顶配单片机,前期做了样品没啥问题,后来小批200个分到各个代理商手里,其他家都没反应有问题,唯独一家吐槽各种无动作,死机。于是拾掇各种装备前往事发地,去了各种排除,外部电源干扰,变频器干扰,布线干扰,问题仍未得到解决。仍旧是,开机一段时间后,除了中断函数内的可以执行,其余全白费, 都不工作。
在烧录之前测试好的程序,依然死机。情急之下拨通了芯片厂家的电话,他们说你可以试试关闭看门狗,看看能否可以自己重启。对着手册,发现了个bug,未打开看门狗,却在主循环里不断清狗。果断开启看门狗,完美解决,看来写代码还得多看手册啊。。。。。
supermiao123:
分享一个奇葩的事,不奇葩你锤我。
事情是这样的,我做了个新板子,STM32的,图是照扒之前的,绝对好使,无明显大坑。
但是这个板子居然不能下载,一直报内核错误之类的错误。我用的是SWD下载方式。于是,我觉得是不是片子没焊好,于是检查电路,检查周边,补锡,重新刮锡,都不行,仔细看图也没看出来。于是,走上了换片子的道路,结果换了四五片,一个现象,于是,把问题定位到了硬件上。应该不是芯片的事。于是奇葩的事来了。首先,拿示波器表笔点CLK看波形,波形正常,然后突然发现下载好使了!我去,这是啥意思,表笔相当于上拉电阻?对地电容?下拉电阻?于是都试了一遍,还是无济于事。然后,我又用表笔点了一下CLK,下载成功。我去,拔掉表笔,一个悬空的表笔点CLK,居然也好使。于是我试了试万用表表笔,因为示波器表笔上有9M电阻和电容补偿,万用表表笔比较单纯,结果,也好使
,最后我焊了一截导线,不出所料,好使,我把下载的速度调到K级别,依然是这种方式好使。哎╮(╯▽╰)╭,谁来解释解释。
辛昕:
比如说数组越界这种事情,到底是怎么发生的呢?
你定义了一个 50个元素的数组,在你自己的想象里,这50个已经够了,你最多只会访问到49,但是,既然是意外引起死机,就必然是因为某个地方,你的下标无意超出了49,而你认为每次写个 if(i < 50)很麻烦。
于是,你访问到了第51个
——这里说明一下,有时候稍微超出一些,只要不触及系统的配置,是不会有事的,但如果你访问到了 第 10232352个,好吧这个这么大的数字我是故意恶心你的,那,你就死定了。
指针乱指又是一种什么情况呢?
其实指针乱指和上述的数组越界往往是类似的。
比如说,人家都告诉你,指针不要随便施加 加减以外的操作,你偏不听,你还说什么 指针是C的精华,你想玩一套神乎其神的 漂移绝技。
你以为你在秋名山呢?
结果,但凡乘除这种事情,两个数据类型不一致或者结果没有进行强转,往往一个数就能变得其大,然后......就没有然后了。
很多年前,我刚工作的时候,我也玩过指针乘除这件事情,当时我是怎么发现这个BUG得呢?
我打印那片地址的所有数据,然后我突然发现有个错误的数据看着很熟悉,啊?这不是我的一个标志值么?
稍稍做个测试,我在一个和这个功能毫无关系的地方修改了那个毫无关系的标志值,不好意思,这个值再一次出现在这个毫无关系的千里之外。
于是我决定,我一定是不小心做了什么作孽的事情。
然后才引起的死机。
说实在的,为什么我说,死机其实是一种保护机制呢?
那是因为,假如在出现这种千里之外的错误的时候,我宁可它死机,否则,我永远都不知道那片存储区里有一个数据被默默的篡改了........
long521:
今年遇到一个BUG,一块测温的线路板,新开发的程序,发现在过高压的时候,温度竟然没变,但是老的板子是没有这种现象的,最后搞了很长时间,才发现,原来,AD的设置上出错了,但是竟然也能读出正确的AD值,解出温度值,怪异吧,怪异吧
littleshrimp:
以前做过一个触摸开关,单片机使用MSP430G2553
项目代码是我写的,有一次同事编译后下载的代码触摸不好用
同一个硬件到我这边下载后一切正常
我又一次把代码考给他,下载还是不能用
感觉有点解释不清了
我到他电脑上用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,串口大部分问题都能搞定的。
sjl2001:
我也分享一个bug和解决办法吧
在调试一个电压采集板子的时候,用到linear公司的ltc1605aig,当时用的时候初学,对手册不是特别钻研,只是基本功能实现就ok,结果就是每次采集完成以后都要手动复位,但虽然也能实现功能,但就是觉得哪里不舒服。后来仔细阅读手册之后才发现,有一个管脚的电平没有设置对,芯片明明可以连续采集的。
这个bug没有造成太大的损失,但告诉我对付芯片要认真,手册是唯一可以依靠的专家。
springvirus:
1. 写入Flash的图案数据与读出显示的不同,显示不全,经仔细查找,是读出的BUFFER定义小了。
2. 非接触卡,不同卡类型的流程上处理出现问题,经查程序和分析,是一个变量用作了2个用途,增加一个变量,使得各司其职,问题得到解决。
3. 非接触卡,有年检的操作,再根据结果,对于不同卡类型,不同充值消费规则都有不同处理, 当时自测加修改程序,费了不少周折,后期在现场程序运行稳定。
总结如下,程序对于可能出现的情况处理的越全面,出现bug的几率就越低。
shakencity:
我之前做了个程序,stm32f103的芯片,一切问题都没有,运行也ok,关键问题是软件仿真时候,点run就不动,点暂停,才显示波形,再点run 又不动,再点暂停又显示波形,把程序烧到片子里,跑了几次,没发现什么问题,重新编译了程序,依然问题存在,然后上论坛请教了下,结果图也贴了,程序也贴了,但没什么结果,可能程序太小,大家看不上吧,最后不管不顾了,重新把程序抄了一遍,所有设置都没动,居然好了,很是纳闷~~
人民币的幻想:
分享一个我碰到的最蛋疼的Bug,其实也不算是什么问题,就是自己不长记性。
某次做完一块板,stm32的,然后焊完就下载程序测试,程序也能下载,就是再次下载程序的时候,下不进去了,然后查硬件:时钟,复位,电源,下载信号,发现没问题,死活就是下不进去。然后就换了一个芯片,然后又重复之前的操作,苦思冥想了好几天,最后发现串口下载可以用,然后我突然明白了什么,原来是软件设置上把SWD接口禁掉了。。
zhengzhirui:
用SI1000 SILICON的射频CPU,老是在使用完片上AD后,系统休眠后就有可能醒不来(随机性的),而且休眠定时器会变的非常不准,,特别奇怪,,代码几次确定没有任何问题,,,最后用完AD后,,使用强制软件复位解决了系统问题,,差点搞死我,,,看来这是SILICON片内的BUG啊!!!
MrKingMCU:
说一个我昨天刚刚解掉的一个问题,严格来说应该不是bug
我用11颗WS2811S级联去驱动11颗RGB LED,我把SET脚拉高,设置成低速模式,写完驱动一测试,果然没任何反应,
于是上设备去测时序,OK没问题,和规格书一样,
出于谨慎,又仔细对着规格书把电路和时序都看了一遍,OK没问题
但是LED就是没反应,然后接着测电源电压。。。。。。一顿折腾,还是一点动静都没有
然后脑袋一亮,会不会是高速模式和低速模式搞错了,于是我按照高速模式的时序写了驱动,卧槽
居然OK了
然后问题解决了,不过还没完,我又对照着规格书看了一遍,没错啊,我就是设置成了低速模式。
我不懂:
我最近遇到过的一个关于STM32编译问题,也不算BUG吧,算是一些设置的问题。
同样的编译器不同的STM32芯片型号,编译下载之后有一个可以自动运行,另一个要重启才能运行。好长时间没找到原因。后来设置编译器时才发现,原来设置好编译器就可以解决了这个问题。
Reset and Run 前面的对勾取消了就在下载完成时不会自动运行
Reset and Run 前面的对勾打上就在下载完成时自动运行
xscc:
调试一块样板,单片机会无规律的复位重启,换了芯片重新烧录,没什么效果,头大。没办法只有屏蔽代码,分离故障,将无线部分停掉后,系统正常,最后发现是外接稳压器标称容量有问题,发射时稳压器有较大的压降,导致单片机复位,更换合格稳压器后,系统恢复正常。
mzb2012:
最近做了想项目用的STC顶配单片机,前期做了样品没啥问题,后来小批200个分到各个代理商手里,其他家都没反应有问题,唯独一家吐槽各种无动作,死机。于是拾掇各种装备前往事发地,去了各种排除,外部电源干扰,变频器干扰,布线干扰,问题仍未得到解决。仍旧是,开机一段时间后,除了中断函数内的可以执行,其余全白费, 都不工作。
在烧录之前测试好的程序,依然死机。情急之下拨通了芯片厂家的电话,他们说你可以试试关闭看门狗,看看能否可以自己重启。对着手册,发现了个bug,未打开看门狗,却在主循环里不断清狗。果断开启看门狗,完美解决,看来写代码还得多看手册啊。。。。。
wateras1:
1:最近做项目使用到了cjson,其实cjson很方便用,都不需要怎么修改就可以用,编译运行后,一直无法打印出构建的json树,我开始还以为是标准库里面的malloc,free等函数接口有问题,后来找到了stm32 .s配置文件修改了heap区,将原来的512个字节修改成3KB了,一切运行正常了
2:有一次整测试工装,出现一个很奇怪的问题,就是软件设置没问题,检查硬件也没发现什么问题,最后发现是测试工装里面的测试针没对齐,当时我们也是因为太相信工厂了,还以为是我们软硬件有问题,搞得折腾了两三天才发现。
未完,待续……