程序跑飞与看门狗
先看看这个跑飞的代码: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(;;);
}
我很想知道程序跑飞的原因有哪些??
extern int increase;
extern Uint32 intcount;
我觉得应该是声明的这些变量在别的地方坐了修改吧
你的跑飞就是指到了另一个中断函数是吧 这很正常啊
说明第二个中断函数的优先级更高
zhangmangui 发表于 2013-7-26 21:50 static/image/common/back.gif
你的跑飞就是指到了另一个中断函数是吧 这很正常啊
说明第二个中断函数的优先级更高
...
在默认情况下,其他中断不是关闭的吗?加上,也没有其他中断事件发生啊 去固定的地方,就不叫 "跑飞".
要找一下中断怎么工作了 是不是你的EvaRegs.CMPR1过小,先产生的CMP1INT中断,而你的CMP1INT_ISR是个死循环,把 for(;;);屏蔽掉试试。 hczsea 发表于 2013-7-29 09:10 static/image/common/back.gif
是不是你的EvaRegs.CMPR1过小,先产生的CMP1INT中断,而你的CMP1INT_ISR是个死循环,把 for(;;);屏蔽掉试试 ...
也有这种可能 airwill 发表于 2013-7-27 21:07 static/image/common/back.gif
去固定的地方,就不叫 "跑飞".
要找一下中断怎么工作了
这倒不一定。
跑飞之后往往会停在一些死循环的地方,比如一个无效的中断。 zhangmangui 发表于 2013-7-29 09:42 static/image/common/back.gif
也有这种可能
因为字面理解,那两个中断应该是:定时器1定时中断和比较中断。 hczsea 发表于 2013-7-29 10:35 static/image/common/back.gif
因为字面理解,那两个中断应该是:定时器1定时中断和比较中断。
嗯应该是这两个中断 zhangmangui 发表于 2013-7-29 10:41 static/image/common/back.gif
嗯应该是这两个中断
所以比较中断可能在定时中断之前产生,而ISR是死循环,所以应该不是楼主所说的程序跑飞,程序是正常的,只是进入死循环了。 jlass 发表于 2013-7-29 10:11 static/image/common/back.gif
这倒不一定。
跑飞之后往往会停在一些死循环的地方,比如一个无效的中断。 ...
嗯, 如果 CPU 有非法地址保护, 就会被特定异常捕捉到 谢谢大家的热心解答。 我都不开比较中断,为什么会跑到比较中断函数里去呢?加了看门狗后就不会了。
页:
[1]