Chinaunix首页 | 论坛 | 博客
  • 博客访问: 456637
  • 博文数量: 73
  • 博客积分: 3593
  • 博客等级: 中校
  • 技术积分: 912
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-14 11:32
文章分类

全部博文(73)

文章存档

2013年(2)

2012年(20)

2011年(25)

2010年(12)

2009年(14)

分类: 嵌入式

2010-12-31 00:34:40

 
 
一般OS都是在系统调度定时器中区喂狗。外部看门狗一般是1s左右,调度通常是n ms,因此只要系统正常跑的时候外部看门狗都不会复位。
 
如果程序运行过程中外部看门狗复位了,一般是关中断时间过长或者关中断后进入死循环了。
 
关中断时间过长:
开关中断通常是调用系统的接口函数。如果是存在关中断时间比较临界的情况,可以在调用开关中断的接口中挂钩子函数,统计每次关中断时间的长度。如果中断时间超过预设的阀值,打印出调用地方(文件名/函数名/代码行,需编译器支持),打印进程/线程名和堆栈回溯(需CPU支持)。
 
关中断后进入死循环了:
这个时候中断已经关了,cpu自己又在死循环里面。要知道CPU在哪里死循环,需要额外的手段。对于MIPS和PPC,有一种中断就非屏蔽中断--NMI。即使在关中断的情况下,CPU也可以相应NMI中断。如果CPU可以将NMI向量入口定向到异常处理程序入口,则可以在异常处理中找出在哪里死循环了。
那怎样才能产生NMI中断?通常使用最多的是使用CPU内置的看门狗定时器产生或者外部中断引脚。
如果CPU内置看门狗和外部中断都不能用那就麻烦了。不过办法总比问题多,想想总有办法的。
 
另,对于MIPS和PPC异常比中断优先级高。想办法让CPU产生异常也就可以了。
 
第3种可能是CPU死掉了。broadcom的CPU就存在这种情况。如果某些外设core没有被初始化,就去访问该core下面的寄存器的话,CPU马上翘辫子。
阅读(2052) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~