原创 C51中断函数

2006-12-22 12:33 6305 7 10 分类: MCU/ 嵌入式

C51的中断函数的格式为:void FuncIr(void) interrupt x [using y]<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


以下是梦游的一些分析:
      
一、中断函数是一个特殊的函数,没有参数,也没有返回值;但是程序中允不允许使用return呢?答案是允许的,不过只能用"return;",不能用"return(z);";用在一些需要快速返回的地方,对应的汇编会有多个ret语句,相对效率会高一些。
      
二、using的用法,using可以修饰任何函数,不过个人建议只用来修饰中断函数;简单的说,“using”会指定工作寄存器组,由于中断函数一般都是比较紧急的事情,有时一条语句都会斤斤计较,所以使用using切换寄存器组可以省去一些压栈
的动作,由于51只有两级中断,同级中断不能被打断,因此,我们可以同级中断设成同样的寄存器组,从某种意义上来说,有一组寄存器是多余的。同时个人建议中断函数应该使用using这个关键字。
      
三、中断中调用函数,首先要讨论中断函数中调用函数的必要性,前天在论坛上我和别人争论过这个问题,现在我还是这个观点:有些情况中断中调用函数还是必要的,这个时候是不是该调用函数,其实和普通函数差不多,首先是这个函数如
果调用多次,或者要带一些参数什么的就更加必要的;前天有人跟我叫劲,说假如只调用一次且无参数无返回的函数要直接写,因为如果用函数,至少会增加CALLRET两条语句,我不敢苟同,我是实际调试发现的,当你程序比较复杂时,你将那部单独拉出来做成函数,可能代码和时间都会更好。
      
四、中断中调用的函数最好不要被中断外的其它函数调用,因为会出现重复调用的警告,有时这种调用是很致命的,有人说这个函数可以用reentrant来修饰,是的,的确可以这样解决,不过个人不建议这么做,也许这样会跟你减少很多堆栈空间,并且整个程序的优化要差很多,个人建议出现这种情况就把这个函数写两遍,分成两个函数分别调用。
        
五,中断调用了函数,会出现一些莫名其妙的问题,一些数据不对。其实一般是因为汇编中使用了绝对寄存器引起的,有人说中断函数使用那个寄存器组,被中断调用的函数就使用哪个寄存器组,我认为这样不好:
      
这样会增加额外的消耗,使用using会增加一下语句:
       PUSH PSW
       MOV PSW, #XX
        ....
        POP PSW
      
更重要的是,使用using的函数不能有返回值,这是致命伤
      
个人推荐的方法有两种:
       1
、使用“#pragma NOAREGS”禁止使用绝对寄存器
       2
、使用“#pragme RB(x)”来指定本文件的工作寄存器组
      
六、一般说来,要求中断函数尽可能的短,但也有特殊情况,有些前/后台的系统中,就会把很多相对重要的事情放到定时中断(这个定时中断类似实时操作系统中的时钟节拍)去做,而且程序很长。我单独提出来这点是想告诉大家,中断函数
也是一个函数而已,只要系统有必要,可以做一些看似不合理的事情,该出手时就出手,就像goto语句一样。

文章评论3条评论)

登录后参与讨论

huotingtu_505472073 2010-12-8 23:48

恩 不错 MARK

用户1477716 2009-3-24 19:00

感谢楼主,我正好也遇到了些中断的问题,受益匪浅!

hongqi1029_800556847 2007-3-9 17:11

文章很不错不错,感谢博主的劳动。我把文章放到我的博客中作为资料保存,你介意的话我可以撤下。

上面的“更重要的是,使用using的函数不能有返回值,这是致命伤”和关于using文章的“对寄存器组的访问不可位寻址,C51 编译器规定使用 using 禁止中断的函数(#pragma disable )均不能返回 bit 类型的值。”矛盾:一个说没有返回值,一个说有。

博主是怎么理解的,能讲讲吗?谢谢

相关推荐阅读
用户1174293 2009-10-13 15:05
PID整定经验
这段时间做了一个数控项目,用到了数字PI调节,现在将整定过程稍做整理,给大家参考。采用增量式PI算法,数学公式原型:△u(k)=Kp*(e(k)-e(k-1))+Ki*e(k)+Kd*(e(k)-2e...
用户1174293 2009-06-10 17:02
SPARTAN3 AN系列电路设计及使用注意事项
XILINX在前年推出了内置FLASH的SPARTAN FPGA系列,不仅可以为FPGA提供上电加载配置,而且还可以为应用提供数据存储空间。换句话说,就是内部的FLASH单是为FPGA配置你还用不掉,...
用户1174293 2008-10-18 15:14
W77E58外扩RAM的教训
近期公司的一个项目以W77E58为核心,外扩掉电保护RAM,XC9572,A/D,D/A等。本来是一个很普通的51系统,结果前后折腾了很久才最终搞定。第一版由同事做的硬件,我做的软件,功能测试很快就通...
用户1174293 2007-01-09 13:14
EEPROM长效读写
常用的EEPROM如24LC04等的使用寿命大概是10万次,这在一些频繁修改存储数据的场合往往不够。一个很自然的想法是以空间换时间,用分块的方式轮流写入。设想在00H单元记录当前数据区首地址,每次根据...
用户1174293 2006-12-22 11:55
C语言的宏定义
写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等。下面列举一些成熟软件中常用得宏定义:<?xml:namespace prefix = o ns = "...
EE直播间
更多
我要评论
3
7
关闭 站长推荐上一条 /3 下一条