工程师解决Bug通用套路

硬件调试和软件调试其实都是分块化思想,按部就班有条理的进行。只有这样才能排查出Bug来。硬件调试需要熟练使用万用表和示波器这两大神器!软件上则是IDE、仿真器的相互配合。对于Bug的积极思考以及解决方案的勇于尝试能换来丰硕的成果。

一、硬件调试前期准备

1、先摸一下金属,再拿电路板

人体带有静电,尤其在干燥地区,摸到金属经常会被电到。

静电对电路板的损害非常大,打到裸板很容易造成元器件损坏。工厂的工人都佩戴有静电手环,穿着防静电服,但是硬件开发工程师在办公室里,一般都不会有这么好的静电防护措施。故要养成防静电的好习惯:拿电路板前,先找一个金属物体摸一下,把身上的静电泄放掉,然后再拿电路板。

2、拿电路板的板边,不要捏着芯片

还是因为静电。虽然可以通过模金属泄放掉静电,但拿着电路板往实验室走的过程中,不可能一直摸着金属,而此时身体一样会产生静电。故拿着电路板的板边,而不是直接捏着芯片部分。这样能够使静电不直接打到芯片,而是传导到电路板的地线上。(电路板板边一般都会设计有一圈GND线路)

3、用直流电源供电,而不是适配器或电池

硬件工程师调试电路板时,需要供电。直接使用直流适配器或者电池,不能直接看到电压和电流,一旦电源或电路板出现电压过高或者电流过大,无法直接发现。等到闻到糊味的时候,就已经晚了。

所以推荐硬件工程师使用数字直流电源供电,能够随时看到电压和电流,一旦发现电流电压异常,能够以最快的速度断电,保护电路板。通过观看工作电流的变化,也能及时发现电路板是否有故障。例如大部分电路板的工作电流是100mA,但有一块是150mA,那说明这块电路板有局部短路的情况。(如果不看数字,只通过适配器或电池来供电,就发现不了这个问题。)

4、先碰一下电源线,再固定线路

如果采用直流电源供电,一般是焊正负极电源线。不要一下子就把电线接起来,而是先碰一下电源线,同时盯着直流电源的数据,看看有没有短路或者大电流。如果确定没问题了,再把线路连接固定起来。例如,把电源线的正负极焊反了,或者直流电源电压调的太高了,此时都能够在半秒钟内发现问题。而在这两种情况下,一旦短路或者高压时间超过1秒钟,很可能就把芯片烧毁了。

5、线缆和电路板,用胶布固定

电路板调试的时候,焊接或者插上的线会比较多:电源线、串口线、USB线、JTAG线、外设的线等等。这些线路和电路板的连接点,往往只是一个测试点。一旦受力,测试点被扯掉了,板子就废了。因此需要用胶布把电路板固定好。可以把电路板和线缆都贴在桌子上,也可以找块泡沫或者纸板贴上去。这样就避免了焊点直接受力,几乎不可能被扯掉。

相信每个硬件工程师,都遇到过“一转眼电路板就掉地上了”、“一站起来衣服就挂到了几根线”这样的情况。

6、电路板裸露部分,用绝缘胶保护

电路板在裸板调试的时候,没有外壳的保护,而且周围焊接了很多测试线路,很容易短路!因此应当把电路板的元器件部分,用绝缘胶或者美纹胶带贴起来,这样就不会被碰到,也不会短路了

7、长短线,避免电源短路

硬件工程师、嵌入式软件工程师桌面上通常很乱,一块电路板,几组电源线,几台直流电源,非常常见。如果电源线很容易就碰到了一起短路了,就会对测试和调试效率造成影响。如果电源线剪成一样的长度,使用电源夹子的时候就很容易短路。如果电源线剪的一长一短,因为导线本身有一定的硬度,正负极就很难碰到一起去了。这种剪线方式,一次成型,比贴绝缘胶要更快速,尤其适合没有直插电源、也没有供电夹具,必须要手工焊接电源线的场景。

8、铜箔当作测试点,方便示波器探测

电路板调试的时候,经常需要用示波器打波形。有很多信号不一定预留了测试点,只能通过元器件管脚来测量信号。

如果直接拿探针捅在元器件上,一只手捏着探针,另一只手操作示波器,很容易捅偏了,测量不到信号,或者导致元器件短路。如果直接焊线出来,用探针很难压住,也很容易压飞了。(示波器有钩子,只测一根线的时候可以用钩子,但需要轮流测好几根线的时候,钩子就不方便了)。

可以剪几块铜箔贴在电路板上,再把信号用导线引出来,焊在铜箔上。这样就可以直接用示波器探针戳上去了,不会偏,不会短路,也不会测量不到。

二、硬件调试小技巧

不论采用分块调试,还是整体调试,通常电子电路调试步骤包括:① 检查电路~在通电调试前按照原理图进行逐级检查,特别要注意检查电源是否接错,电源与地是否有短路,二极管方向和电解电容的极性是否接反,集成电路和晶体管的引脚是否接错,观察焊点焊点是否牢固等。② 通电观察~一定要调试好所需电源电压数值,并确定电路板电源端无短路现象后,才能上电。上电后观察是否有异常现象,如冒烟、异常气味、放电的声光、元器件发烫等。如果有,断电测量各集成块电源引脚电压是否正常。③ 静态调试~不加载输入信号,测量各级直流工作电压和电流是否正常。④ 动态调试~加载输入信号,观测电路输出信号是否符合要求。⑤ 指标测试~静态与动态调试正常后,根据具体需求对相关技术指标进行测量并记录数据。

遵循以上步骤进行调试过程中,如何准确判断集成电路的好坏至关重要。首先要掌握该集成电路的用途、内部结构原理、主要电特性等,必要时还要分析内部电路原理图。除了这些,如果再有各引脚对地直流电压、波形、对地正反向直流电阻值,那么,对检查前判断提供了更有利条件;然后按故障现象判断其部位,再按部位查找故障元件,此时需要判断证明该器件是否确实损坏。一般对集成电路的检查判断方法有两大类:不在线检查判断(即集成电路未焊入PCB的判断)和在线检查判断(即集成电路连接在PCB板上的判断方法)。具体讨论如下:

1、电压测量法

主要是测出各引脚对地的直流工作电压值;然后与标称值相比较,依此来判断集成电路的好坏。用电压测量法来判断集成电路的好坏是检修中最常用的方法之一,但要注意区别非故障性的电压误差。测量集成电路各引脚的直流工作电压时,如遇到个别引脚的电压与原理图或者技术资料所标电压值不符,不要急于判定集成电路已损坏,应该先排除以下几个因素后再确定。

⑴ 所提供的标称电压是否可靠,因为有些说明书,原理图等资料上所标的数值与实际电压有较大差别,有时甚至是错误的。此时,应多找一些有关资料进行对照,必要时分析内部原理图与外围电路再进行理论上的计算或估算来证明电压是否有误。

⑵ 要区别所提供的标称电压的性质,其电压是属哪种工作状态的电压。因为集成块的个别引脚随着注入信号的不同而明显变化。

⑶ 要注意由于外围电路可变元件引起的引脚电压的变化。当测量出的电压与标称电压不符时可能因为个别引脚或与该引脚相关的外围电路,连接的是一个阻值可变的电位器或是开关。

⑷ 要防止由于测量造成的误差。由于万用表表头内阻不同或不同电流电压档会造成误差。

⑸ 当测得某一引脚电压与正常值不符时,应根据该引脚电压对IC正常工作有无重要影响以及其他引脚电压的响应变化进行分析,才能判断IC的好坏。

⑹ 对于动态接收装置,在有无信号时,IC各引脚电压是不同的。如发现引脚电压出现异常变化,该变不变,不该变反而变了,说明IC已损坏。

⑺ 对于多种工作方式的装置,在不同工作方式下,IC各引脚电压也是不同的。

以上几点是在IC没有故障的情况下,由于某种原因而使所测结果与标称值不同。如果排除以上几个因素后,结果还是不符时,需进一步分析原因,但不外乎两种可能。一是集成电路本身故障引起;二是IC外围电路造成的。

2、在线直流电阻普测法

这一方法是在发现引脚电压异常后,通过测试集成电路的外围元器件好坏来判定集成电路是否损坏.。由于是断电情况下测定阻值,所以比较安全,并可以在没有资料和数据而且不必要了解其工作原理的情况下,对集成电路的外围电路进行在线检查,在相关的外围电路中,以快速的方法对外围元器件进行一次测量,以确定是否存在较明显的故障。具体操作是先用万用表R×10Ω档分别测量二极管和三极管的正反向电阻值。此时由于欧姆档位定得很低,外电路对测量数据的影响较小,可很明显地看出二极管、三极管的正反向电阻,尤其是PN结的正向电阻增大或短路更容易发现。其次可对电感是否开路进行普测,正常时电感两端阻值较大,那么即可断定电感开路。继而根据外围电路元件参数的不同,采用不同的欧姆档位测量电容和电阻,检查有否较为明显的短路和开路性故障,从而排除由于外围电路引起个别引脚的电压变化。

3、电流流向跟踪电压测量法

此方法是根据集成电路内部的外围元件所构成的电路,并参考供电电压,即主要测试点的已知电压进行各点电位的计算或估算,然后对照所测电压电否符合,来判断集成块的好坏,本方法必须具备完整的集成块内部电路图和外围电路原理图。

4、在线直流电阻测量对比法

此方法是利用万用表测量待查集成电路各引脚对地正反向直流电阻值与正常数据进行对照来判断好坏。这一方法需要积累同一机型同型号集成电路的正常可靠数据,以便和待查数据相对比。

测量时需要注意一下三点:

❶ 测量前要先断开电源,以免测试时损坏电表和元件。

❷ 万用表电阻档的内部电压不得大于6V,量程最好用R×100或R×1K档。

❸ 测量IC 引脚参数时,要注意测量条件,如被测机型,与IC相关的电位器阻值等,还要考虑外围电路元件的好坏。

5、非在线数据与在线数据对比法

所谓非在线数据是指集成电路未与外围电路连接时,所测得的各引脚对应于地脚的正反向电阻值。非有线数据通用性强,可以对不同机型、不同电路、集成电路型号相同的电路作对比。具体测量对比方法如下:首先应把被查集成电路的接地脚用空心针头和铬铁使之与印刷电路板脱离,再对应于某一怀疑引脚进行测量对比。如果被怀疑引脚有较小阻值电阻连接于地或电源之间,为了不影响被测数据,该引脚也可与印刷板开路。直至外电路的阻值不影响被测集成电路的电阻值为止。但要注意一点,直流电阻测量对比法对于不同批次同一型号的集成电路,有一定的误差和差异,对这种情况,要在了解内部结构的基础上,进行分析、判断。

6、替换法

用替换法判断集成电路的好坏的确是一种干净利索的事,可以减少许多检查分析的麻烦。但必须注意如下几点:

① 尽量选用同型号的集成电路或可以直接代换的其他型号,这样可不改变原机电路的引线,简便易行,容易恢复原机的性能指标。

② 更换拆焊原机上的集成电路时,不要急躁,不能乱拔,乱撬引脚,用所具备的条件选择最适合拆卸集成电路的方法。

③ 在还没有判断外围电路是否有故障,以及未确认原集成电路已损坏之前,不要轻易替换集成电路,否则换上去的集成电路有可能再次报废。

④ 有些集成电路,虽然型号相同,但还要考虑其型号后缀不同。

⑤ 有时采用试探性替换,此时最好先装一专用集成电路插座,或用细导线临时连接,这样好坏对比方便。另外,在通电前电源VCC回路里最好再串接一直流电流表,降压电阻阻值由大到小观察集成电路总电流的变化是否正常。对于功放电路一定要按规定装好散热片。

⑥ 在选用同功能但不同型号和不同引脚排列的集成电路代换时,还应注意以下几点:

● 尽量选用功能、引脚、电特性相近的集成电路。

● 改变引脚连线时,应尽量利用PCB上的孔位和线路,连线要整齐,信号线的前后段不要交叉,以免电路产生自激。

● 集成电路的供电电压应与集成电路的电源电压VCC的典型值相符。

● 集成电路的各信号输入、输出阻抗要与原电路相匹配,连接好的集成电路在通电前应作最后一次的检查,确认电路无误后再接通电源。

7、总电流测量法

该法是通过检测IC电源进线的总电流,来判断IC好坏的一种方法。由于IC内部绝大多数为直接耦合,IC损坏时(如某一个PN结击穿或开路)会引起后级饱和与截止,使总电流发生变化。所以通过测量总电流的方法可以判断IC的好坏。也可用测量电源通路中电阻的电压降,用欧姆定律计算出总电流值。

三、软件调试小技巧

程序猿们面对复杂的代码敲打电脑时连眉头都不会皱一下,但Bug这个词确实他们痛苦的根源。当我们处理Bug时,不光是为了自己,很多时候是因为被测试和领导盯着,就像这样:

在复杂代码中找Bug是一个难点,以下总结为程序猿解决Bug通用套路,具有实际参考意义。

1、IDE调试

根据实际项目需求和语言特点选择一个最合适的IDE,配合开发板以及仿真器,进行断点设置、寄存器和IO口查看能快速定位Bug所在,发现问题所在也就离解决问题不远了。

2、重构大法

如果发现无论如何也找不到Bug,而且代码只是复杂,本身并不是很长,直接重写代码吧!重构大法是解决爆炸性Bug的绝招。

3、printf 大法

大家都说printf大法(也称cout大法,亦可称之为串口调试信息输出)好,我也这么觉得!!!把需要验证的参数打印出来,不仅直观,而且方便调试。

4、日志大法

日志大法,法力无边。一个成熟的系统少不了日志模块,懂得和善于使用日志大法调Bug的同学,恭喜你,未来可期!

5、小黄鸭调试法

小黄鸭不懂程序,故我们可以向他解释每一行程序的作用,以此来激发灵感!

6、二分定位法

把程序逻辑一点点注释掉,看看还会不会出问题,类似二分查找的方法,逐步缩小问题范围。

7、模拟现场法

模拟现场,有时候我会问自己,如果我要实现Bug描述的现象我要怎么写代码才行?比如遇到一个死锁问题,但是检查代码发现所有的锁都是配对的,没有忘记解锁的地方,而且锁很简单就是一个普通的临界段,保护几行赋值语句而已。这样的代码怎么写才能让他死锁呢?如果让我故意制造这样一个现象,只有在上锁的时候强制杀掉线程了。既然这样就可以去看看有谁强杀了线程了没有。

8、制作调试工具

此方法在很多大厂比较常见,一个是快速迭代的要求,一个是大厂的通用框架比较成熟,当然工具的适用性比较强。

9、优先解决可重现的Bug

可重现的Bug,优先解决,多调试测试几次,把容易解决的Bug先解决掉,亦可减少Bug数量,也可以减少干扰。

10、放大现象

有些Bug不是很明显,那么就想办法增加他的破坏性,把现象放大,这是在系统压力测试时会经常遇到的一种方法。千万别觉得自己的系统就几千日活,就把压力测试压得很低,结果,实际上线时,系统压力过大宕机的情况不在少数,这种问题很多大厂也出现过。

四、同一问题的不同看法

完成一个复杂的系统或者硬件工程,需要考虑的事情很多,以下对比分享给大家。

菜鸟:程序只要稳定即可,代码长一点,效率低一点不是关键。

老鸟:CPU的速度和存储器的空间都是用钱买来的,如果写代码时多花几天时间提高一下程序效率,那么从降低CPU主频和减少存储器容量所节约的成本绝对是划算的。

菜鸟:面板上的指示灯选什么颜色呢?我觉得蓝色比较特别,就选它吧

老鸟:其他红绿黄橙等颜色的不管大小(5mm以下)封装如何,都已经成熟了几十年,价格一般都在5毛钱以下,而蓝色却是近三四年才发明的东西,技术成熟度和供货稳定度都比较差,价格却要贵四五倍。目前蓝色指示灯只用在不能用其他颜色替代的场合,如显示视频信号等。

菜鸟:我们系统要求这么高,包括MEM、CPU、FPGA等所有的芯片都要选最快的

老鸟:在一个高速系统中并不是每一部分都工作在高速状态,而器件速度每提高一个等级,价格差不多要翻倍,另外还给信号完整性问题带来极大的负面影响。

菜鸟:我们这系统是220V供电,就不用在乎功耗问题了

老鸟:低功耗设计并不仅仅是为了省电,更多的好处在于降低了电源模块及散热系统的成本、由于电流的减小也减少了电磁辐射和热噪声的干扰。随着设备温度的降低,器件寿命则相应延长(半导体器件的工作温度每提高10读,寿命缩短一半)。

菜鸟:这些总线信号都用电阻拉一下,感觉放心些

老鸟:信号需要上下拉的原因很多,但也不是个个都要拉。上下拉电阻拉一个单纯的输入信号,电流也就几十微安以下,但拉一个被驱动了的信号,其电流将达毫安级,现在的系统常常是地址数据各32位,可能还有244/245隔离后的总线及其它信号,都上拉的话,几瓦的功耗就耗在这些电阻上了。

菜鸟:降低功耗都是硬件人员的事,与软件没关系

老鸟:硬件只是搭个舞台,唱戏的却是软件,总线上几乎每一个芯片的访问、每一个信号的翻转差不多都由软件控制的,如果软件能减少外存的访问次数(多使用寄存器变量、多使用内部CACHE等)、及时响应中断(中断往往是低电平有效并带有上拉电阻)及其它针对具体单板的特定措施都将对降低功耗作出很大的献。

菜鸟:CPU用大一点的CACHE,就应该快了

老鸟:CACHE的增大,并不一定就导致系统性能的提高,在某些情况下关闭CACHE反而比使用CACHE还快。原因是搬到CACHE中的数据必须得到多次重复使用才会提高系统效率。所以在通信系统中一般只打开指令CACHE,数据CACHE即使打开也只局限在部分存储空间,如堆栈部分。同时也要求程序设计要兼顾CACHE的容量及块大小,这涉及到关键代码循环体的长度及跳转范围,如果一个循环刚好比CACHE大那么一点点,又在反复循环的话,那就惨了。

菜鸟:这主频100M的CPU只能处理70%,换200M主频的就没事了

老鸟:系统的处理能力牵涉到多种多样的因素,在通信业务中其瓶颈一般都在存储器上,CPU再快,外部访问快不起来也是徒劳。

菜鸟:这么多任务到底是用中断还是用查询呢?还是中断快些吧

老鸟:中断的实时性强,但不一定快。如果中断任务特别多的话,这个没退出来,后面又接踵而至,一会儿系统就将崩溃了。如果任务数量多但很频繁的话,CPU的很大精力都用在进出中断的开销上,系统效率极为低下,如果改用查询方式反而可极大提高效率,但查询有时不能满足实时性要求,所以最好的办法是在中断中查询,即进一次中断就把积累的所有任务都处理完再退出

菜鸟:这部分电路只要要求软件这样设计就不会有问题

老鸟:硬件上很多电气特性直接受软件控制,但软件是经常发生意外的,程序跑飞了之后无法预料会有什么操作。设计者应确保不论软件做什么样的操作硬件都不应在短时间内发生永久性损坏

菜鸟:程序代码命名可以随心所欲,自由发挥,能用就行

老鸟:程序代码的命名,可以反映出程序猿的水平。尽量不要使用中文、拼音、拼音缩写、中英混搭以及模仿式命名。想要命名的更有意义,你只需要将每一类、每一个方法、每一个单词的名字都用你开发时的意思直接描述出来即可。

菜鸟:软件设计根据需求来实现功能即可

老鸟:模型抽象能力对于程序猿来说还是很重要的。模型决定一个系统的可用性、稳定性、易用性、可维护性、可扩展性!这里的模型就是你设计一个软件时,为其所抽象出来的原理性的描述。微软MEF,个人觉得其模型构建非常的漂亮和优雅,有兴趣的可以看看《体验Managed Extensibility Framework精妙的设计》这篇文章。MEF核心就是组合基元,其简单的定义了动态组合的支持基础,然后一层一层的进行扩展。

菜鸟:程序异常处理差不多就行了,按正常逻辑进行处理即可

老鸟:通过异常处理可以看出一个程序猿设计的严谨与扎实的基础知识。对于Java开发人员而言,会发现每一个方法都有可能需要强制的处理异常和声明这个函数需要处理的异常,这中强制的约束,会强迫开发人员来习惯性的考虑和思考它。不过,对于大部分人来说,它处理异常的方式就是简单的使用try { … } catch(Exception anyException) { // 忽略异常 },用这种方式来捕捉所有的异常信息。这样做的好处就是快,傻,缺点就是一旦出现问题,就不知道问题在哪发生,怎么回事,如果有靠谱的QA还好一些,比如外企,他们都有规范的测试方法和测试流程,一旦发现问题,就会将重现捕捉完整的描述出来给开发者看。不过,在国内没有严格的测试是很正常的,那么出现问题时,就傻了。

关于异常处理,另一面,就是菜鸟程序员在写代码或者实现功能的时候,一般不考虑反面情况,一个软件按照正常步骤可能能走通,但是一旦出点意外,就麻烦了。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注