在嵌入式系统软件调试过程中,偶发性问题往往是一个令人头痛的问题。这些问题的特点是:按一定概率出现,具有不确定性。因此,如果不采取一些技巧,往往不容易捕捉到问题现场。因为问题出现的特点是“稍纵即逝”。找不到问题出现的现场,则无法深入分析问题出现的机理原因,只能通过猜测问题原因并尝试修改,然后观察问题是否再出现,如果问题看起来不再出现则认为问题解决了,但是对于问题的实质原因,却难以说出个究竟来。这种方法虽然可以避免问题,但是无法从根本解决问题,很可能导致问题复发。
对付偶发性问题的基本策略是:
(1)通过问题现象,初步判断问题的出现点。
(2)用多种手段,锁定问题现场。
(3)用验证的方法放大问题点,使之由偶发性问题变为必发问题。
(4)根据问题出现机理,提出解决对策
(5)验证解决对策的可靠性。
下面详细介绍三种具体的方法来锁定偶发性问题:
(1) 如果对实时性不高,那么可以采用文件、串口等记录手段记录程序运行过程中的各个状态、关键变量的编号,便于发生问题后跟踪分析。
(2) 如果实时性要求很高,定义若干个公共数组变量,用于记录在程序运行过程中各关键变量和现场数据,增加条件停止的程序,即所谓的陷阱程序。当发生问题后,程序跑到陷阱程序中 可以通过停止运行或把公共变量通过串口、屏幕输出,观察分析问题原因。
(3) ARM嵌入式系统中,如果程序出现突然复位或者死机时,如何找回现场?很简单,只需要在启动点上再设一个断点,当程序复位或死机时,并停止运行时,观察R13,然后 在内存中找到R13所指的程序段,反汇编之(AXD可以反汇编内存),就可以大概分析出哪个函数出问题。然后追溯到对应的C代码上,在该C代码之前若干行设置断点,然后单步运行,可以观察到问题再现。
(4) 用多余的I/O口来跟踪程序的运行状态,方法是:当程序运行到某程序段时某输出口为高电平,否则为低电平。用示波器观察输出口状态,如果问题出现在高电平,则可以初步判定可能该段程序有问题,可以深入跟踪之。这在前后台系统
中比较管用,在多任务系统中, 可以考虑用多引脚组合起来跟踪。这种方法对于实时测量系统中跟踪程序很好用。
-
-
匿名 发表于 2008/9/15 23:08:36
安装扭角仪和试件。在试件的标距两端,装上扭角仪。先将试件的一端装入扭转试验机的固定夹头,然后,将另一端装入主动夹头,用扳物拧紧夹紧螺栓,防止试验时打滑。用扭转试验机上的手摇装置,施加扭矩到(Mn)max,与此同时,检查扭转试验机和扭角仪的运行是否正常,然后卸载到(Mn)min以下少许,处于待令工作状态。2楼 回复本楼
引用 匿名 2008/9/15 23:08:36 发表于2楼的内容
-
-
-
true_toyou | 当前状态:离线
总积分:687 2024年可用积分:0
注册时间: 2007-12-18
最后登录时间: 2014-07-14
-
true_toyou 发表于 2008/9/15 23:19:40
引用 true_toyou 2008/9/15 23:19:40 发表于3楼的内容
-
-
-
-
true_toyou | 当前状态:离线
总积分:687 2024年可用积分:0
注册时间: 2007-12-18
最后登录时间: 2014-07-14
-
true_toyou 发表于 2008/9/18 16:03:29
引用 true_toyou 2008/9/18 16:03:29 发表于4楼的内容
-
-
-
-
true_toyou | 当前状态:离线
总积分:687 2024年可用积分:0
注册时间: 2007-12-18
最后登录时间: 2014-07-14
-
true_toyou 发表于 2008/9/18 16:31:00
(3) ARM嵌入式系统中,如果程序出现突然复位或者死机时,如何找回现场?很简单,只需要在启动点上再设一个断点,当程序复位或死机时,并停止运行时,观察R13,然后 在内存中找到R13所指的程序段,反汇编之(AXD可以反汇编内存),就可以大概分析出哪个函数出问题。然后追溯到对应的C代码上,在该C代码之前若干行设置断点,然后单步运行,可以观察到问题再现。5楼 回复本楼R13实际上就是SP,但当我停止时,我可能已进入取数中止,这时SP中存放的只是取数中止处理的地址,故应该是观察之前模式的R13,呵呵我现在的问题是,在CCS下如何反汇编?又或者请帮忙说说AXD下如何反汇编内存的!谢谢!
引用 true_toyou 2008/9/18 16:31:00 发表于5楼的内容
-