防滑销钉 发表于 2013-10-10 22:50:33

pic可以直接在主函数内直接通过判断标志位执行中断吗?

本帖最后由 防滑销钉 于 2013-10-11 11:35 编辑

今天去图书馆借了一本书,里面介绍外部中断时,没有采用另外写中断函数的用法,而是直接在主函数内通过判断标志位执行中断函数的。
具体情况如下所示(省略了配置过程)
void main()
{
while(1)   
{
    if(INTF&&INTE)
    {
      LED = ~LED;
      INTF = 0;
    }
}
以前我没用过这种方法,中断都是另外写一个函数的。出于好奇我在板子上试了一下,发现在debug模式下,上面这个程序竟然可以执行。
但是用progrmmer烧进去程序时时,就发现无法进入中断程序了。不知道为什么?大家谁能解释一下吗?
(当然,我知道这种方法很不好,但是我对这种情况不是很理解,为什么这种形式的中断,debug时可以,programmer时不行呢?最后说一次,这种方式千万不要用!)

kanprin 发表于 2013-10-10 22:56:40

跟配置过程有关, 如果使能了外部中断,并且全局中断是允许的, 这样写就不行。
如果允许外部中断, 但全局中断没开, 这样写应该没问题,但执行完后, 需要将中断标志清除。

millwood0 发表于 2013-10-11 07:13:05

it works, as long as you don't enable the interrupt and you clear the flag.

防滑销钉 发表于 2013-10-11 10:50:10

本帖最后由 防滑销钉 于 2013-10-11 11:32 编辑

kanprin 发表于 2013-10-10 22:56 static/image/common/back.gif
跟配置过程有关, 如果使能了外部中断,并且全局中断是允许的, 这样写就不行。
如果允许外部中断, 但全局 ...

是不是可以这样理解:
1.pic当有中断发生时,不论是否允许中断,INTF都是会置1的,
2.当在主函数中这样写时,相当于不断查询中断标志位INTF是否为1,所以中断发生时会执行if里面的语句。
3.如果我允许了全局中断,那么中断发生时,应为硬件中断响应时间肯定小于查询,那么程序首先会跳转到中段向量处执行中断程序。
4.因为我没有写中断程序,也就相当于中断程序为空,当然中断程序里面也没有将INTF置为0.
5.所以程序由中断跳出以后,会立即再次进入外部中断,这样循环下去,一直不会执行判断if的语句。
6.最后一个问题,按照上面的分析,如果打开全局中断,打开外部中断,那么debug和program应该都不会执行if里面的语句。但是为什么我实际调试时,在DEBUG模式下竟然可以执行?按道理讲,应该都是失败的啊!

R88 发表于 2013-10-11 15:01:05



手册上面写到不管对应的中断使能和全局中断如何。。标志位都会置一。。

看出即使中断不使能标志位都会置一。。

防滑销钉 发表于 2013-10-11 15:17:48

R88 发表于 2013-10-11 15:01 static/image/common/back.gif
手册上面写到不管对应的中断使能和全局中断如何。。标志位都会置一。。

看出即使中断不使能标志位都会置 ...

谢谢了,请您看看我上面的理解对吗?

R88 发表于 2013-10-11 16:30:22

防滑销钉 发表于 2013-10-11 15:17 static/image/common/back.gif
谢谢了,请您看看我上面的理解对吗?

应该对的。手册:


上面说的以免充分执行该中断应该就是你说的第五个。。

R88 发表于 2013-10-11 16:32:27

第三个还应该允许对应的外部中断。。才进入中断函数。。

防滑销钉 发表于 2013-10-11 16:54:41

R88 发表于 2013-10-11 16:32 static/image/common/back.gif
第三个还应该允许对应的外部中断。。才进入中断函数。。

对的,这个我有允许的。
那么关于debug时和program的不一样结果,你知道是为什么吗?
按道理讲,两个都应该不会进入if语句的啊!

R88 发表于 2013-10-11 17:16:21

防滑销钉 发表于 2013-10-11 16:54 static/image/common/back.gif
对的,这个我有允许的。
那么关于debug时和program的不一样结果,你知道是为什么吗?
按道理讲,两个都应 ...

不知道。。

tdh03z 发表于 2013-10-11 19:08:27

你确定program时,程序正常运行了吗?

你的这种写法确实不提倡用,但如果禁止INTE中断,倒是可以在主循环中判断标志位INTF来进行些特殊处理,最多是响应不及时
if(INTF&&INTE)
    {
      LED = ~LED;
      INTF = 0;
    }

防滑销钉 发表于 2013-10-11 23:42:41

本帖最后由 防滑销钉 于 2013-10-11 23:45 编辑

tdh03z 发表于 2013-10-11 19:08
你确定program时,程序正常运行了吗?

你的这种写法确实不提倡用,但如果禁止INTE中断,倒是可以在主循环 ...

不是这样的,刚开始我使能了全局中断和外部中断,依照上面的程序,结果debug下会执行if下面的语句,programe时不能执行!按照我的分析,两种情况都应该不执行if下面的语句才对!
然后如若我禁用了外部中断或者全局中断,这时候debug和program都没问题,这样时是符合我的分析的。

tragedy 发表于 2013-10-11 23:50:03

这个只是循环检测中断标志位,并没有进入中断执行。还是很不一样的呀

mii 发表于 2013-10-11 23:58:02

有可能是编译器的问题。

气球 发表于 2013-10-12 08:22:20

{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}

szxszx 发表于 2013-10-12 08:43:33

可以这样用
页: [1]
查看完整版本: pic可以直接在主函数内直接通过判断标志位执行中断吗?