欢迎光临散文网 会员登陆 & 注册

如何用分解问题的方法来调试——调试思路02

2019-05-09 08:34 作者:冻吃打吃  | 我要投稿

上文提到:

调试的核心的目标只有一个,那就是尽可能精确地锁定到决定性的错误因素.
而核心的手段也只有一个,那就是分解问题.李昂1998,公众号:吉大仪电216小论坛硬件调试和软件调试的一点点微小的思路1


由上文可知,只有找到决定性的错误因素,才能避免该换电源的时候换了灯丝,该换灯丝的时候换了开关,该换开关的时候换了电源.....最后解决问题的效率极慢甚至徒劳无功.

那么如何找到决定性的错误因素呢?,如上文开头所,核心手段就是分解问题.

分解问题大体上可以分为两种:

    分解串行问题的断点调试方法

    分解并行问题的对照试验方法.

一.分解串行问题的断点调试方法

串行问题发生在流程式的系统当中,流程怎么理解呢?就是有顺序的,按步骤地实现特定的功能,有明显的先后之分.

拿“陀螺仪数据显示”这个小系统为例,这就是一个典型的流程式的系统.

第一步,陀螺仪初始化.

第二步,陀螺仪测量到姿态信息.

第三步,陀螺仪编码姿态信息.

第四步,陀螺仪发送姿态信息.

第五步,上位机接收姿态信息.

第六步,上位机解码姿态信息.

第七步,上位机显示姿态信息.

每一步之间有严格的先后关系,前一步不成功,后面的步骤哪怕都没问题,最后的结果也一定不正确.

如果你看到了最后的现象是“上位机不显示姿态信息”,那么在进一步调试系统之前,你面临的困境就是“每一步都可能出问题”.而且如果上一步存在问题,无论下一步是否存在问题,总的现象都是有问题.

这时就需要用到“断点”的调试方法,或者广义一点说,是断点式的调试思想.

最显而易见的断点调试方法,就是在程序里面打断点,不必多说.除此之外,还有断点思想的广义调试方法,不仅可以打程序断点,还可以打物理断点(字面意义上把导线断开),还可以打数学断点(对求解的多个步骤依次验算)等等.只要是针对串行问题的步骤分解方法,都能够叫做断点思想的广义调试方法.

断点思想的广义调试方法是解决串行问题的基本方法.

二.分解并行问题的对照试验方法

并行问题发生在有应该相互独立的多个部分的系统当中,说并行问题发生在相互独立的多个部分是很好理解的,但是为什么有多了应该两个字呢?

这是因为,如果系统的各个应该相互独立的多个部分真的相互独立,完全不会互相影响,那么就不会出现并行问题了.并行问题的本质,就是本来应该相互独立的多个部分,实质上并没有相互独立,而他们之间的我们不希望的相互影响,正是造成并行问题的根本原因.

对照试验方法正是探究多个部分的相互影响的一个重要手段,对照试验本身也极大地推动了人类认识自然的伟大进程.

拿“stm32控制步进电机并显示”这个小系统为例,这就是一个典型的存在并行部分的系统.

部分一:stm32控制步进电机的转速

部分二:stm32控制OLED显示当前的转速

我们希望的是,这两个部分完全不相互影响,也就是应该独立,而当这样的系统出现bug时,就要考虑各个并行部分是否实际独立了.

这个时候就可以设计以下的一组对照试验,来判断是否出现了并行问题:

实验一:stm32控制步进电机,但不控制OLED.

实验二:stm32控制OLED,但不控制步进电机.

实验三:stm32既控制步进电机,又控制OLED.

如果实验三的结果是无法同时工作,实验一和实验二的结果是可以单独工作,那么就很明显,这个系统出现了并行问题,这个时候我们就要着重考察这两个部分所占用的共同资源(如标志位、CPU资源等)和各部分控制的全局因素(如全局延时、更改全局变量等).

如果实验一或者实验二其中一个无法单独工作,那么无法判断现在是否出现并行问题,应该先保证各个部分能够独立工作.

实际中的系统往往是串行问题和并行问题混杂的,经常是多个串行问题形成的步骤链彼此是应该相互独立的,因此,断点调试方法和对照试验方法都需要灵活掌握.

如何用分解问题的方法来调试——调试思路02的评论 (共 条)

分享到微博请遵守国家法律