请教一个关于周期性复位的问题

[复制链接]
 楼主| zxb1717 发表于 2012-12-5 09:18 | 显示全部楼层 |阅读模式
最近接到一个任务,排查一个周期性复位的问题,用的是LPC21XX系列的ARM,设定的喂狗周期为9秒,带类似于uc-os类型的操作系统,出现的现象是:有一批产品,如果正常工作,可能一直都没事,个别产品会出现一旦出现复位,就会一直以13秒左右的间隔不断复位,只有断电重启才能解决,由于代码量庞大,一时也不知从何处开始下手,不知各位大侠能否以自己经验的角度给点建议,出问题的原因有哪些?在此谢谢了!
ayb_ice 发表于 2012-12-5 09:55 | 显示全部楼层
RTOS下一般不用狗的,因为本身基于事件驱动机制,
检查复位源,确定复位源才能下手
delin17 发表于 2012-12-5 10:51 | 显示全部楼层
一般IC都应该可以看到复位源的。看复位源,再究原因
 楼主| zxb1717 发表于 2012-12-5 10:55 | 显示全部楼层
由于事件发生很随机,又不能现场调试,怎样找复位源呢,请大家不灵赐教啊
 楼主| zxb1717 发表于 2012-12-5 10:57 | 显示全部楼层
楼上几位说的是从PC指针找复位源么,还是另有方法,能否详述一下,谢谢!
mohanwei 发表于 2012-12-5 11:13 | 显示全部楼层
在通信协议增加一个“读取复位源”命令……有液晶界面的话增加个按钮也可以
 楼主| zxb1717 发表于 2012-12-5 11:46 | 显示全部楼层
mohanwei 发表于 2012-12-5 11:13
在通信协议增加一个“读取复位源”命令……有液晶界面的话增加个按钮也可以 ...

如果楼上所说的“读取复位源”是指读取寄存器RSIR的值的话我试过了,不管是主动去复位还是出现问题时的复位,值都是一样的,而且都是看门狗超时复位,但是不理解楼上说的“在通信协议增加一个“读取复位源”命令”,您指的通信协议是指什么呢?谢谢!
 楼主| zxb1717 发表于 2012-12-5 11:48 | 显示全部楼层
现在的情况是,要么不出现复位,一旦出现非正常复位的话除非重新上电,否则就会一直以固定的间隔复位,不知道怎么去定位bug,这个着实令人费解啊,希望路过的都给点建议,不管对错,都谢谢啊
 楼主| zxb1717 发表于 2012-12-5 13:20 | 显示全部楼层
还有个疑问就是,为什么看门狗复位不能使程序进入正常状态,而重新上电就能使程序进入正常状态呢,难道是ARM内部的RAM在看门狗复位时数据没有清掉导致的吗?请路过高手赐教啊?
海里蛐蛐 发表于 2012-12-5 14:04 | 显示全部楼层
外设模块没有初始化,初始化程序里面把所有的外设初始化,尤其是中断标志位
 楼主| zxb1717 发表于 2012-12-5 14:12 | 显示全部楼层
zxb1717 发表于 2012-12-5 13:20
还有个疑问就是,为什么看门狗复位不能使程序进入正常状态,而重新上电就能使程序进入正常状态呢,难道是AR ...

如果外设没有初始化的话,程序马上就复位了吧,而不是运行一段时间以后才复位吧
 楼主| zxb1717 发表于 2012-12-5 14:13 | 显示全部楼层
海里蛐蛐 发表于 2012-12-5 14:04
外设模块没有初始化,初始化程序里面把所有的外设初始化,尤其是中断标志位 ...

谢谢楼上建议,可是如果外设没有初始化的话,程序马上就复位了吧,而不是运行一段时间以后才复位吧
 楼主| zxb1717 发表于 2012-12-5 14:19 | 显示全部楼层
哪位高手有没有除了查看寄存器直接定位复位源的方法,最好能定位复位前的代码位置,能否指导一下
qqlvjh 发表于 2012-12-5 15:26 | 显示全部楼层
进入看门狗中断后,不让系统复位,而是把堆栈里的PC值输出出来,之后根据地址可以大概定位出位于哪个模块。
mohanwei 发表于 2012-12-5 15:27 | 显示全部楼层
ARM内核很多外设都需要自己去初始化一下的,厂家提供的外设库里有相应的初始化函数可以直接调用。
例如STM32的串口,如果正在发送数据,突然看门狗复位了,然后程序对其设置波特率,可能就会死机……所以主程序应该先调用一下USART_DeInit()
 楼主| zxb1717 发表于 2012-12-6 09:38 | 显示全部楼层
qqlvjh 发表于 2012-12-5 15:26
进入看门狗中断后,不让系统复位,而是把堆栈里的PC值输出出来,之后根据地址可以大概定位出位于哪个模块。 ...

这个方法可以试一下,谢谢赐教,待我做实验后上传结果
 楼主| zxb1717 发表于 2012-12-7 09:20 | 显示全部楼层
根据qqlvjh的建议,昨天做了一天的实验,写了段汇编,把进入中断后的PC值读出来,不过和qqlvjh建议不一样的地方是,我喂狗不是在看门狗中断里,而是在定时器0中断里喂的,读出来的PC值就是当下正在执行的语句地址,而不是进中断前的指令地址,为什么,难道PC始终保存当前正在执行的语句地址,有什么办法可以保存进中断前的语句地址吗?请高手给个建议,我就想知道进中断前正在执行的语句或者地址是哪一条,谢谢啦!
 楼主| zxb1717 发表于 2012-12-7 11:02 | 显示全部楼层
自己顶一个,有新的结果上传,请看贴“以下指令是否实现读取SP指针的值呢?”
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

231

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

31

主题

231

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部