375447109 发表于 2013-7-26 20:32

程序跑飞与看门狗

先看看这个跑飞的代码:
interrupt void T1PINT_ISR(void)    // EV-A
{
      extern int increase;
        extern Uint32 intcount;
        intcount++;
        KickDog();   
    if(intcount>=1000)    //禁止看门狗时,程序会跑飞,但当intcount>=100时,不会。开启看门狗,intcount>=任何值 都不会跑飞。
        {
          intcount = 0;
          if(increase==1)
                {
                  EvaRegs.CMPR1 = (EvaRegs.CMPR1-938);
                        if(EvaRegs.CMPR1<=0x0753)
                        {
                          EvaRegs.CMPR1 = 0x0753;
                                increase = 0;
                        }
                }
                if(increase==0)
                {
                  EvaRegs.CMPR1 = (EvaRegs.CMPR1+938);
                        if(EvaRegs.CMPR1>=0x41EB)
                        {
                          EvaRegs.CMPR1 = 0x41EB;
                                increase = 1;
                        }
                }
        }
        PieCtrl.PIEACK.all = PIEACK_GROUP2;
        EvaRegs.EVAIFRA.bit.T1PINT = 1;
        EINT;
}
它跑飞不是乱跑,而总是来到这里:
interrupt void CMP1INT_ISR(void)    // EV-A
{
   asm ("      ESTOP0");
   for(;;);
}
我很想知道程序跑飞的原因有哪些??


zhangmangui 发表于 2013-7-26 21:46

extern int increase;
extern Uint32 intcount;
我觉得应该是声明的这些变量在别的地方坐了修改吧

zhangmangui 发表于 2013-7-26 21:50

你的跑飞就是指到了另一个中断函数是吧   这很正常啊
说明第二个中断函数的优先级更高   

375447109 发表于 2013-7-27 17:47

zhangmangui 发表于 2013-7-26 21:50 static/image/common/back.gif
你的跑飞就是指到了另一个中断函数是吧   这很正常啊
说明第二个中断函数的优先级更高   
...

在默认情况下,其他中断不是关闭的吗?加上,也没有其他中断事件发生啊

airwill 发表于 2013-7-27 21:07

去固定的地方,就不叫 "跑飞".
要找一下中断怎么工作了

hczsea 发表于 2013-7-29 09:10

是不是你的EvaRegs.CMPR1过小,先产生的CMP1INT中断,而你的CMP1INT_ISR是个死循环,把 for(;;);屏蔽掉试试。

zhangmangui 发表于 2013-7-29 09:42

hczsea 发表于 2013-7-29 09:10 static/image/common/back.gif
是不是你的EvaRegs.CMPR1过小,先产生的CMP1INT中断,而你的CMP1INT_ISR是个死循环,把 for(;;);屏蔽掉试试 ...

也有这种可能

jlass 发表于 2013-7-29 10:11

airwill 发表于 2013-7-27 21:07 static/image/common/back.gif
去固定的地方,就不叫 "跑飞".
要找一下中断怎么工作了

这倒不一定。
跑飞之后往往会停在一些死循环的地方,比如一个无效的中断。

hczsea 发表于 2013-7-29 10:35

zhangmangui 发表于 2013-7-29 09:42 static/image/common/back.gif
也有这种可能

因为字面理解,那两个中断应该是:定时器1定时中断和比较中断。

zhangmangui 发表于 2013-7-29 10:41

hczsea 发表于 2013-7-29 10:35 static/image/common/back.gif
因为字面理解,那两个中断应该是:定时器1定时中断和比较中断。

嗯应该是这两个中断

hczsea 发表于 2013-7-29 10:45

zhangmangui 发表于 2013-7-29 10:41 static/image/common/back.gif
嗯应该是这两个中断

所以比较中断可能在定时中断之前产生,而ISR是死循环,所以应该不是楼主所说的程序跑飞,程序是正常的,只是进入死循环了。

airwill 发表于 2013-7-29 11:07

jlass 发表于 2013-7-29 10:11 static/image/common/back.gif
这倒不一定。
跑飞之后往往会停在一些死循环的地方,比如一个无效的中断。 ...

嗯, 如果 CPU 有非法地址保护, 就会被特定异常捕捉到

375447109 发表于 2013-7-29 20:58

谢谢大家的热心解答。

375447109 发表于 2013-7-29 21:01

我都不开比较中断,为什么会跑到比较中断函数里去呢?加了看门狗后就不会了。
页: [1]
查看完整版本: 程序跑飞与看门狗