打印

程序跑飞与看门狗

[复制链接]
1957|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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
你的跑飞就是指到了另一个中断函数是吧   这很正常啊
说明第二个中断函数的优先级更高   
...

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

使用特权

评论回复
5
airwill| | 2013-7-27 21:07 | 只看该作者
去固定的地方,就不叫 "跑飞".
要找一下中断怎么工作了

使用特权

评论回复
6
hczsea| | 2013-7-29 09:10 | 只看该作者
是不是你的EvaRegs.CMPR1过小,先产生的CMP1INT中断,而你的CMP1INT_ISR是个死循环,把 for(;;);屏蔽掉试试。

使用特权

评论回复
7
zhangmangui| | 2013-7-29 09:42 | 只看该作者
hczsea 发表于 2013-7-29 09:10
是不是你的EvaRegs.CMPR1过小,先产生的CMP1INT中断,而你的CMP1INT_ISR是个死循环,把 for(;;);屏蔽掉试试 ...

也有这种可能

使用特权

评论回复
8
jlass| | 2013-7-29 10:11 | 只看该作者
airwill 发表于 2013-7-27 21:07
去固定的地方,就不叫 "跑飞".
要找一下中断怎么工作了

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

使用特权

评论回复
9
hczsea| | 2013-7-29 10:35 | 只看该作者
zhangmangui 发表于 2013-7-29 09:42
也有这种可能

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

使用特权

评论回复
10
zhangmangui| | 2013-7-29 10:41 | 只看该作者
hczsea 发表于 2013-7-29 10:35
因为字面理解,那两个中断应该是:定时器1定时中断和比较中断。

嗯  应该是这两个中断

使用特权

评论回复
11
hczsea| | 2013-7-29 10:45 | 只看该作者
zhangmangui 发表于 2013-7-29 10:41
嗯  应该是这两个中断

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

使用特权

评论回复
12
airwill| | 2013-7-29 11:07 | 只看该作者
jlass 发表于 2013-7-29 10:11
这倒不一定。
跑飞之后往往会停在一些死循环的地方,比如一个无效的中断。 ...

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

使用特权

评论回复
13
375447109|  楼主 | 2013-7-29 20:58 | 只看该作者
谢谢大家的热心解答。

使用特权

评论回复
14
375447109|  楼主 | 2013-7-29 21:01 | 只看该作者
我都不开比较中断,为什么会跑到比较中断函数里去呢?加了看门狗后就不会了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

95

帖子

0

粉丝