7112|29

422

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

10.13【每周讨论】关于单片机中断的有趣问题 [复制链接]


在使能并触发0号中断,而0号中断没有中断处理函数的时候,就会进入1号中断的处理函数。这是为什么呢

 

使能单片机的0号中断并触发,之后就会进入0号中断的处理函数。这是正常情况。当0号中断没有处理函数的时候,发现它会进入1号中断处理函数。但是当1号中断没有处理函数(或者说这个函数被注释)的时候,它不会进入2号中断的处理函数。其他的,当使能并触发2号中断,而2号中断没有中断处理函数的时候,也不会进入3号中断的处理函数。
只有在使能并触发0号中断,而0号中断没有中断处理函数的时候,就会进入1号中断的处理函数。这是为什么呢

 

我说过这只是一个简单的测试程序,其实没有必要上传工程了。既然各位要求,那我就上传吧。

#include<reg52.h>


#define DEBUG 1
/*
DEBUG:
1----开0号中断,0号中断处理函数存在时
 D1点亮(长按闪烁)

2----开0号中断,0号中断处理函数不存在时
 D2点亮(长按闪烁)

3----开0号中断,0、1号中断处理函数都不存在时
 都不亮

4----开2号中断,2号中断处理函数存在时
 D1点亮(长按闪烁)

5----开2号中断,2号中断处理函数不存在时
 D2点亮(长按闪烁)

 

*/
void main(void)
{
#if  (DEBUG < 4)
 EX0 = 1;
#else
 EX1 = 1;
#endif
 EA = 1;

 P1 = 0xFF; 

 while(1)
 {
  P2 = TCON ; 
 }   
}

#if (DEBUG == 1)
void Inter0(void) interrupt 0
{
 P1 = P1^0x01 ; 
}
#endif

#if ((DEBUG == 1)||(DEBUG == 2))
void Inter1(void) interrupt 1
{
 P1 = P1^0x02 ; 
}
#endif

#if (DEBUG != 5)
void Inter2(void) interrupt 2
{
 P1 = P1^0x04 ; 
}
#endif

void Inter3(void) interrupt 3
{
 P1 = P1^0x08 ; 
}

void Inter4(void) interrupt 4
{
 P1 = P1^0x10 ; 
}

 

整个工程已经上传。

 

单片机中断测试.rar (31.54 KB, 下载次数: 1)

[ 本帖最后由 longxtianya 于 2011-10-16 16:31 编辑 ]

单片机中断测试.rar

31.54 KB, 下载次数: 2

最新回复

打饭路上,对这三条nop依然很不爽.... 特别是在一些时间比较敏感,比如时序严格的场合。 后来发现问题不该这么想,应该问,如果你不需要中断处理东西,你干什么要开中断? 我曾经很脑残得想,我需要它 及时响应啊? 不过,我才知道,要让他及时响应东西,必须放在中断程序里。 于是就是说,如果不写中断函数,,没事是不会开中断的 [ 本帖最后由 辛昕 于 2011-10-16 18:49 编辑 ]  详情 回复 发表于 2011-10-16 18:48
点赞 关注
 
 

回复
举报

168

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
还没知道有这种情况……
个人签名逆水行舟,不进则退。
 
 
 

回复

1412

帖子

15

TA的资源

版主

板凳
 
楼主能不能写个例子?或者发个工程上来看看?
个人签名https://bbs.eeworld.com.cn/thread-471646-1-1.html
欢迎加入我的团队
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

4
 

回复 楼主 longxtianya 的帖子

问题就出在没有 0号中断函数。
结果,中断来的时候,CPU自个跑到0号中断的入口,走啊走,走到后来,啊哦,发现没有一个RETI,于是乎这家伙就自个往下边的中断入口走了。。。。。
你之所以没发现它把所有中断都走了一遍,可能是因为你恰好有1号中断的函数。

意思就是说,如果你启用了某个中断,就算你中断发生时什么都不做,你也要至少给他安排一句返回的语句。

在C里,就留一个空函数,它自个就会接着回到中断以前的地方了。

一个中断函数被注释掉,不知道你是怎么注释的,如果你留了个壳,那么,就跟我说的留个空函数一样

[ 本帖最后由 辛昕 于 2011-10-14 15:20 编辑 ]
个人签名

强者为尊,弱者,死无葬身之地

 
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

5
 

这恐怕跟单片鸡种有关吧?

 原则上如使能了某一中断,而且该中断确有可能发生的话,就一定要写处理函数,哪怕什么也不必处理,至少要让汇编码存在一个返回,否则弄不好单片鸡就跑飞了。
 楼主说的现象没准是在该机种规定向量表里,若0号中断向量的位置如不写代码的话,缺省代码被解释成某个转条指令,使它正好跳进1号中断处理的入口。
 
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

6
 

回复 4楼 辛昕 的帖子

 显然,辛昕的码字速度比俺快,同时回复就能抢在俺的前面,一定是平时喋喋不休练出来的。
 
 
 

回复

1万

帖子

16

TA的资源

版主

7
 

回复 4楼 辛昕 的帖子

正解:carnation:
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 
 

回复

1万

帖子

141

TA的资源

版主

8
 
中断使能后,只要发生中断,程序指针将跳往中断入口地址,这个地址的内容是一个跳转指令,指向中断服务程序,而没有中断服务程序时,这个地址的内容为空,数值为00或ff,程序继续会向下运行,而紧邻的地址中如果是其它跳转指令,则自然跳转到其它中断服务程序中去了,具体跳哪里,要看离中断0入口地址中最近的那个跳转指令的指向了。
 
 
 

回复

422

帖子

0

TA的资源

纯净的硅(高级)

9
 

回复 4楼 辛昕 的帖子

没留空壳,整个函数名都去掉了。
我也是你这么想的,但是为什么开并触发0号中断,而0号没有处理函数的时候会进入1号,而1号也没有的时候,却不会继续往下走进入2号呢?
还有,触发2号中断,当没有2号处理函数的时候不会进入3号哦,为什么呢?
 
 
 

回复

422

帖子

0

TA的资源

纯净的硅(高级)

10
 

回复 8楼 chunyang 的帖子

您的分析有道理。但是这样的话,
例如开并触发0号中断,而0号没有处理函数的时候会进入1号,而1号也没有的时候,却不会继续往下走进入2号呢?
还有,触发2号中断,当没有2号处理函数的时候不会进入3号哦,为什么呢?
 
 
 

回复

422

帖子

0

TA的资源

纯净的硅(高级)

11
 

回复 板凳 youki12345 的帖子

这个没有必要留个工程上来吧,就是最简单的测试程序哦。开0号中断,写所有函数中断的处理函数,里面的处理只需要点亮一个LED灯即可,测试嘛。编译下载看结果,然后注释0号中断(将整个函数连同函数名一起注释),编译下载看结果。依次……
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

12
 
看下你那里的汇编代码就知道了,有时候在没有写中断函数,中断地址的地方会塞一些其他代码进去的,主要看你怎么链接了

[ 本帖最后由 ziyoutian 于 2011-10-15 14:20 编辑 ]
 
 
 

回复

1181

帖子

0

TA的资源

五彩晶圆(初级)

13
 

其实上面的回答都没有真正解决楼主的问题,不过按我的理解应该能顺序进入2、3号中断,回头我问问其他人,看看能不能帮你解决。

 
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

14
 

应该跟单片机种和编译系统有关

 各鸡种的中断向量表并非千篇一律,向量代码或许是服务程序的入口地址,也可能是转跳指令,向量的排列方式也各异。对于未填写程序的区域(一般由置全1或全0),其默认代码可能正好是转跳指令,也可能是NOP指令,也可能是例外中断指令,等等。总之若不限定单片机种和编译系统,这个问题可能是无解的。
 
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

15
 

原帖由 longxtianya 于 2011-10-15 08:07 发表 这个没有必要留个工程上来吧,就是最简单的测试程序哦。 ...

 是否简单不能只看source,需弄清这些source对应的汇编码(机器码)才能知其所以然。最好的探查办法就是看汇编文件,或许只需看几步就能解开谜底。别人手上没有这个工程,既无决定性的依据,说的都只是猜测而已。

 
 
 

回复

117

帖子

0

TA的资源

一粒金砂(高级)

16
 
看汇编,,看没有RETI
 
 
 

回复

1万

帖子

141

TA的资源

版主

17
 

原帖由 longxtianya 于 2011-10-15 08:01 发表 您的分析有道理。但是这样的话,例如开并触发0号中断,而0号没有处理函数的时候会进入1号,而1号也没有的时候,却不会继续往下走进入2号呢?还有,触发2号中断,当没有2号处理函数的时候不会进入3号哦,为什么呢 ...

 

你去查一下51的中断入口地址排序就知道了,中断1下面的不是中断2,标准51没有外中断2的,具体是什么我也要去查书。

 
 
 

回复

133

帖子

0

TA的资源

纯净的硅(初级)

18
 
学习了啊
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

19
 

回复 11楼 longxtianya 的帖子

啥都别说了,赶紧上你的工程吧。
或者您只上HEX码也行.....
当然,如果你的东西是公司机密或者价值百万,那当我没说过。

错误的原因可以是千千万万,而正确的只有一个——我真喜欢这个唯一。

管它什么乱七八糟的原因,只要有一个明确的转移指令,我还不信它不老老实实回去了。

仙猫和chunyang 两位大叔经验丰富,我就不知道原来中断入口的转移会因平台不同而不同。

它怎么突然从1跑到2,但不从2跑到3?
谁知道,只有HEX知道。

就好象几个月前,我碰到一桩怪事:有一个STC的SPI的中断标志位,我给它软件写中断标志,结果它见鬼了,怎样都看不到这个标志.......大半夜我被逼恼了,大摆擂台,结果最后被镭影发现我脑残了,因为我头一回碰到 有寄存器 写1清零的——就是说写啥都是零.......
个人签名

强者为尊,弱者,死无葬身之地

 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

20
 
确实跟芯片型号密不可分,有的芯片天生BUG
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表