|||
ARM程序运行过程中经常出现复位解决方案
最近开发的一项目中,在运行中,经常出现程序跑到复位点上去了,进入了死循环,通过KEIL DEBUG发现程序在指令
Soft_Reset B Soft_Reset
运行,进入了复位状态,此时要查原来运行进入的地址很困难,因为此异常并没有一些寄存器,可以显示原来中断的地址,但我发现,只要我用了定时器延时就会出现,延时程序如下:
//Define delay time macro
#define DelayNms(X)\
{\
AIC_IDCR=(1<<TC0_ID);TimeOutFlag=1;DelayTime=(uint16)X;AIC_IECR=(1<<TC0_ID);while(TimeOutFlag);\
}
此程序意思是如果我装载延时的值时,关定时器中断,注意不是IRQ中断,完成后再开定时器中断,结果在调用这个延时时就出现程序跑到复位处去了,也就是上面讲的那条指令处,很是奇怪,资料以及芯片文档上并没有相关的说明?会不会这是个芯片上的缺陷?后来我在BAIDU里一SO,是有些工程师提到过碰到过这个情况,说法比较多。
有的说没有中断服务子程序有的说是执行了空指针,而我的程序没有哪执行了空指针也有定时器中断服务子程序并清中断标志,对这个问题很是奇怪,上面这个程序就是,我关了中断,如果计数溢出的话就不能进行中断而已,根据说明书,我想发生溢出状态寄存器相应位为1 而不会出现复位,后来实在难于找到问题根源,我把程序改了一下,如下:
//Define delay time macro
#define DelayNms(X)\
{\
TimeOutFlag=1;DelayTime=(uint16)X;FreshDelayTimeFlag=1;while(TimeOutFlag);\
}
通过一标志位来指示要加载新的数据,发现问题解决了,也就是不关定时器中断,还有些工程师提出这样的解决方法,关IRQ中断也可解决。我想也还可以停止计数,加载完后再继续我想也可以,问题可能出在计数溢出时跑到复位处执行去了。