搜索
bottom↓
回复: 15

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

[复制链接]

出0入0汤圆

发表于 2013-10-10 22:50:33 | 显示全部楼层 |阅读模式
本帖最后由 防滑销钉 于 2013-10-11 11:35 编辑

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-10-10 22:56:40 | 显示全部楼层
跟配置过程有关, 如果使能了外部中断,并且全局中断是允许的, 这样写就不行。
如果允许外部中断, 但全局中断没开, 这样写应该没问题,但执行完后, 需要将中断标志清除。

出0入0汤圆

发表于 2013-10-11 07:13:05 | 显示全部楼层
it works, as long as you don't enable the interrupt and you clear the flag.

出0入0汤圆

 楼主| 发表于 2013-10-11 10:50:10 | 显示全部楼层
本帖最后由 防滑销钉 于 2013-10-11 11:32 编辑
kanprin 发表于 2013-10-10 22:56
跟配置过程有关, 如果使能了外部中断,并且全局中断是允许的, 这样写就不行。
如果允许外部中断, 但全局 ...


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

出0入399汤圆

发表于 2013-10-11 15:01:05 | 显示全部楼层


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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-10-11 15:17:48 | 显示全部楼层
R88 发表于 2013-10-11 15:01
手册上面写到不管对应的中断使能和全局中断如何。。标志位都会置一。。

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

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

出0入399汤圆

发表于 2013-10-11 16:30:22 | 显示全部楼层
防滑销钉 发表于 2013-10-11 15:17
谢谢了,请您看看我上面的理解对吗?

应该对的。手册:


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入399汤圆

发表于 2013-10-11 16:32:27 | 显示全部楼层
第三个还应该允许对应的外部中断。。才进入中断函数。。

出0入0汤圆

 楼主| 发表于 2013-10-11 16:54:41 | 显示全部楼层
R88 发表于 2013-10-11 16:32
第三个还应该允许对应的外部中断。。才进入中断函数。。

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

出0入399汤圆

发表于 2013-10-11 17:16:21 | 显示全部楼层
防滑销钉 发表于 2013-10-11 16:54
对的,这个我有允许的。
那么关于debug时和program的不一样结果,你知道是为什么吗?
按道理讲,两个都应 ...

不知道。。

出0入0汤圆

发表于 2013-10-11 19:08:27 | 显示全部楼层
你确定program时,程序正常运行了吗?

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

出0入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都没问题,这样时是符合我的分析的。

出0入0汤圆

发表于 2013-10-11 23:50:03 | 显示全部楼层
这个只是循环检测中断标志位,并没有进入中断执行。还是很不一样的呀

出0入0汤圆

发表于 2013-10-11 23:58:02 | 显示全部楼层
有可能是编译器的问题。

出0入0汤圆

发表于 2013-10-12 08:22:20 | 显示全部楼层

出10入10汤圆

发表于 2013-10-12 08:43:33 | 显示全部楼层
可以这样用
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-19 06:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表