程序调试(除错)过程中的一些雕虫小技(八、在程序中设置窃听器)
1、你的定时中断频率是否等于设想的那个值?
2、你的主程序循环一次花了多少时间?
3、你的程序中某一次复杂计算需要耗费多少时间?
4、你的程序里某个动作发生的具体时刻是什么时候?
5、……
——也许你不关心这些时间,那么你就不必看这一回了。
但是——
1、当我们的计时时钟发生偏差时,我们希望知道定时中断是否正常发生了;
2、当我们的程序任务较多,并已经导致任务堵塞时,我们需要知道主程序运行一圈的时间是多少,以便我们合理分割任务,避免堵塞;
3、同样,为了避免任务堵塞,我们要了解那些复杂计算所消耗的时间,并采取必要的措施(优化算法、分时间片执行、调整执行频率)来保证系统的实时性;
4、当程序中某些动作与其它动作或状态存在时间上的关联时,我们必须严格控制它的执行时机,确保它在正确的时刻被执行到;
5、……
我们如何才能从外部,对这些这些发生在程序内部的时间(时刻)进行精准的测量?
我们当然不能钻到芯片里面去监视每一条指令的运行情况。但是,我们可以学习一下克格勃,给程序安装个窃听器。
具体方法:
1、首先,你需要一台示波器。没有的话,可以去偷、去抢、去骗。总之,最终你搞定了这台示波器,欧耶。
2、其次,你的芯片上要有一个空余的输出口用作测试口。没有的话,就拆东墙补西墙吧,先把不相关功能的IO口挪用一下啦。总之,最终你搞定了这个测试口,欧耶。
3、接下来,你可以在你要“监听”的程序段中,写一小段程序,对那个测试口取反(或者输出一个脉冲)。
4、最后让程序全速运行起来,你就可以用示波器来监听程序的运行状况了。
以本回开始举的几个例子来分析:
1、如果要测试定时中断频率,只要在中断中对这个测试口取反,即可通过示波器观测中断频率;
2、如果要测试主程序运行周期,只要把取反指令放在主程序循环圈中,即可;
3、如果要测试一次复杂计算(或其它动作)需要消耗多少时间,我们只需在计算之前把测试口变为高电平,等到计算结束后立即把输出口恢复到低电平,这段高电平的时间长度,即为计算消耗时间;
4、如果想知道两个动作之间的延时时间,我们也可以按照上一条方法一样,在两个动作发生前把测试口分别取一次反。就可以通过示波器轻松测试出来。
5、根据实际案例的具体情况,我们可以把这种窃听技术变换出更多花样。比如我们可以用两个IO口做测试口,同步检测两个事件的发生时刻,并测量其相互时间关系。等等……
6、引申开去,这个测试口不仅仅可以检测时间,也可以用来检测内部数据的变化。比如当某个数据的值发生“越界”时,输出一个高电平(平时为低电平)。
等到我们取得我们想要的测试数据,我们可以把这个临时的测试口功能撤销。同时,那些测试代码也可一并删除或屏蔽。
总结:把程序内在的、不直观的、快速的一些状态变化,通过IO口传递出来,以便我们观测。——这就是我们这一回所讲的“窃听器”调试技巧的精髓。
——警告,请勿把“窃听器”安装在女生宿舍哦!
——那样的话,匠人岂不就成为教唆犯了。罪过,罪过。。。。。
(想看下回吗?请顶贴!)
文章评论(0条评论)
登录后参与讨论