pic可以直接在主函数内直接通过判断标志位执行中断吗?
本帖最后由 防滑销钉 于 2013-10-11 11:35 编辑今天去图书馆借了一本书,里面介绍外部中断时,没有采用另外写中断函数的用法,而是直接在主函数内通过判断标志位执行中断函数的。
具体情况如下所示(省略了配置过程)
void main()
{
while(1)
{
if(INTF&&INTE)
{
LED = ~LED;
INTF = 0;
}
}
以前我没用过这种方法,中断都是另外写一个函数的。出于好奇我在板子上试了一下,发现在debug模式下,上面这个程序竟然可以执行。
但是用progrmmer烧进去程序时时,就发现无法进入中断程序了。不知道为什么?大家谁能解释一下吗?
(当然,我知道这种方法很不好,但是我对这种情况不是很理解,为什么这种形式的中断,debug时可以,programmer时不行呢?最后说一次,这种方式千万不要用!) 跟配置过程有关, 如果使能了外部中断,并且全局中断是允许的, 这样写就不行。
如果允许外部中断, 但全局中断没开, 这样写应该没问题,但执行完后, 需要将中断标志清除。
it works, as long as you don't enable the interrupt and you clear the flag.
本帖最后由 防滑销钉 于 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 static/image/common/back.gif
手册上面写到不管对应的中断使能和全局中断如何。。标志位都会置一。。
看出即使中断不使能标志位都会置 ...
谢谢了,请您看看我上面的理解对吗? 防滑销钉 发表于 2013-10-11 15:17 static/image/common/back.gif
谢谢了,请您看看我上面的理解对吗?
应该对的。手册:
上面说的以免充分执行该中断应该就是你说的第五个。。 第三个还应该允许对应的外部中断。。才进入中断函数。。 R88 发表于 2013-10-11 16:32 static/image/common/back.gif
第三个还应该允许对应的外部中断。。才进入中断函数。。
对的,这个我有允许的。
那么关于debug时和program的不一样结果,你知道是为什么吗?
按道理讲,两个都应该不会进入if语句的啊! 防滑销钉 发表于 2013-10-11 16:54 static/image/common/back.gif
对的,这个我有允许的。
那么关于debug时和program的不一样结果,你知道是为什么吗?
按道理讲,两个都应 ...
不知道。。 你确定program时,程序正常运行了吗?
你的这种写法确实不提倡用,但如果禁止INTE中断,倒是可以在主循环中判断标志位INTF来进行些特殊处理,最多是响应不及时
if(INTF&&INTE)
{
LED = ~LED;
INTF = 0;
} 本帖最后由 防滑销钉 于 2013-10-11 23:45 编辑
tdh03z 发表于 2013-10-11 19:08
你确定program时,程序正常运行了吗?
你的这种写法确实不提倡用,但如果禁止INTE中断,倒是可以在主循环 ...
不是这样的,刚开始我使能了全局中断和外部中断,依照上面的程序,结果debug下会执行if下面的语句,programe时不能执行!按照我的分析,两种情况都应该不执行if下面的语句才对!
然后如若我禁用了外部中断或者全局中断,这时候debug和program都没问题,这样时是符合我的分析的。 这个只是循环检测中断标志位,并没有进入中断执行。还是很不一样的呀
有可能是编译器的问题。
{:smile:}{:smile:}{:smile:}{:smile:}{:smile:} 可以这样用
页:
[1]