打印

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

[复制链接]
2790|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者
由于事件发生很随机,又不能现场调试,怎样找复位源呢,请大家不灵赐教啊

使用特权

评论回复
5
zxb1717|  楼主 | 2012-12-5 10:57 | 只看该作者
楼上几位说的是从PC指针找复位源么,还是另有方法,能否详述一下,谢谢!

使用特权

评论回复
6
mohanwei| | 2012-12-5 11:13 | 只看该作者
在通信协议增加一个“读取复位源”命令……有液晶界面的话增加个按钮也可以

使用特权

评论回复
7
zxb1717|  楼主 | 2012-12-5 11:46 | 只看该作者
mohanwei 发表于 2012-12-5 11:13
在通信协议增加一个“读取复位源”命令……有液晶界面的话增加个按钮也可以 ...

如果楼上所说的“读取复位源”是指读取寄存器RSIR的值的话我试过了,不管是主动去复位还是出现问题时的复位,值都是一样的,而且都是看门狗超时复位,但是不理解楼上说的“在通信协议增加一个“读取复位源”命令”,您指的通信协议是指什么呢?谢谢!

使用特权

评论回复
8
zxb1717|  楼主 | 2012-12-5 11:48 | 只看该作者
现在的情况是,要么不出现复位,一旦出现非正常复位的话除非重新上电,否则就会一直以固定的间隔复位,不知道怎么去定位bug,这个着实令人费解啊,希望路过的都给点建议,不管对错,都谢谢啊

使用特权

评论回复
9
zxb1717|  楼主 | 2012-12-5 13:20 | 只看该作者
还有个疑问就是,为什么看门狗复位不能使程序进入正常状态,而重新上电就能使程序进入正常状态呢,难道是ARM内部的RAM在看门狗复位时数据没有清掉导致的吗?请路过高手赐教啊?

使用特权

评论回复
10
海里蛐蛐| | 2012-12-5 14:04 | 只看该作者
外设模块没有初始化,初始化程序里面把所有的外设初始化,尤其是中断标志位

使用特权

评论回复
11
zxb1717|  楼主 | 2012-12-5 14:12 | 只看该作者
zxb1717 发表于 2012-12-5 13:20
还有个疑问就是,为什么看门狗复位不能使程序进入正常状态,而重新上电就能使程序进入正常状态呢,难道是AR ...

如果外设没有初始化的话,程序马上就复位了吧,而不是运行一段时间以后才复位吧

使用特权

评论回复
12
zxb1717|  楼主 | 2012-12-5 14:13 | 只看该作者
海里蛐蛐 发表于 2012-12-5 14:04
外设模块没有初始化,初始化程序里面把所有的外设初始化,尤其是中断标志位 ...

谢谢楼上建议,可是如果外设没有初始化的话,程序马上就复位了吧,而不是运行一段时间以后才复位吧

使用特权

评论回复
13
zxb1717|  楼主 | 2012-12-5 14:19 | 只看该作者
哪位高手有没有除了查看寄存器直接定位复位源的方法,最好能定位复位前的代码位置,能否指导一下

使用特权

评论回复
14
qqlvjh| | 2012-12-5 15:26 | 只看该作者
进入看门狗中断后,不让系统复位,而是把堆栈里的PC值输出出来,之后根据地址可以大概定位出位于哪个模块。

使用特权

评论回复
15
mohanwei| | 2012-12-5 15:27 | 只看该作者
ARM内核很多外设都需要自己去初始化一下的,厂家提供的外设库里有相应的初始化函数可以直接调用。
例如STM32的串口,如果正在发送数据,突然看门狗复位了,然后程序对其设置波特率,可能就会死机……所以主程序应该先调用一下USART_DeInit()

使用特权

评论回复
16
zxb1717|  楼主 | 2012-12-6 09:38 | 只看该作者
qqlvjh 发表于 2012-12-5 15:26
进入看门狗中断后,不让系统复位,而是把堆栈里的PC值输出出来,之后根据地址可以大概定位出位于哪个模块。 ...

这个方法可以试一下,谢谢赐教,待我做实验后上传结果

使用特权

评论回复
17
zxb1717|  楼主 | 2012-12-7 09:20 | 只看该作者
根据qqlvjh的建议,昨天做了一天的实验,写了段汇编,把进入中断后的PC值读出来,不过和qqlvjh建议不一样的地方是,我喂狗不是在看门狗中断里,而是在定时器0中断里喂的,读出来的PC值就是当下正在执行的语句地址,而不是进中断前的指令地址,为什么,难道PC始终保存当前正在执行的语句地址,有什么办法可以保存进中断前的语句地址吗?请高手给个建议,我就想知道进中断前正在执行的语句或者地址是哪一条,谢谢啦!

使用特权

评论回复
18
zxb1717|  楼主 | 2012-12-7 11:02 | 只看该作者
自己顶一个,有新的结果上传,请看贴“以下指令是否实现读取SP指针的值呢?”

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

231

帖子

1

粉丝