一般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马上翘辫子。
阅读(2061) | 评论(0) | 转发(0) |