EmbedOS https://bbs.21ic.com/?478132 [收藏] [复制] [RSS] 玩转电子,乐在其中,成就你我!

日志

ARM程序运行过程中经常出现复位解决方案

已有 2621 次阅读2009-5-17 00:49 |个人分类:ARM|系统分类:ARM| ARM, 程序运行过程中经常出现复位

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中断也可解决。我想也还可以停止计数,加载完后再继续我想也可以,问题可能出在计数溢出时跑到复位处执行去了。


路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (4 个评论)

回复 huihui118 2009-5-23 15:01
自己祝贺下本帖被管理员设为精华,欢迎大家发表自己的看法,[emot]1[/emot]
回复 huihui 2009-5-24 11:28
顶下子哈!~我可不会只会看不只持下
回复 he 2009-5-24 14:28
没有找出原因不算解决方案,最多说碰巧,或者暂时的掩盖

QUOTE:
以下为EmbedOS的回复: 哈哈,这可不能说是掩盖,事实上就是这样解决了,你可以写个小代码试试
回复 SZYDXDL 2009-6-14 03:56
顶一下