中断中调用函数与函数可重入问题

中断中调用函数与函数可重入问题


2024年4月19日发(作者:)

中断中调用函数与函数可重入问题

一、中断函数是一个特殊的函数,没有参数,也没有返回值;但是程序中允

不允许使用return呢?答案是允许的,不过只能用"return;",不能用

"return(z);";用在一些需要快速返回的地方,对应的汇编会有多个ret语句,相

对效率会高一些。

1 g& j; ^; r! @' ` 二、using的用法,using可以修饰任何函数,不

过个人建议只用来修饰中断函数;简单的说,“using”会指定工作寄存器组,由

于中断函数一般都是比较紧急的事情,有时一条语句都会斤斤计较,所以使用

using切换寄存器组可以省去一些压栈

7 g/ O F. @% A! k7 _9 的动作,由于51只有两级中断,

同级中断不能被打断,因此,我们可以同级中断设成同样的寄存器组,从某种意义

上来说,有一组寄存器是多余的。同时个人建议中断函数应该使用using这个关键

字。9 V8 [! t0 y( l

三、中断中调用函数,首先要讨论中断函数中调用函数的必要性,前天在论坛上我

和别人争论过这个问题,现在我还是这个观点:有些情况中断中调用函数还是必要

的,这个时候是不是该调用函数,其实和普通函数差不多,首先是这个函数

如 r5 X8 C; ^7 s2 g+ ]: }1 u$ `( {厦门E城论坛果调用多次,或者要带一

些参数什么的就更加必要的;前天有人跟我叫劲,说假如只调用一次且无参数无返

回的函数要直接写,因为如果用函数,至少会增加CALL和RET两条语句,我不敢

苟同,我是实际调试发现的,当你程序比较复杂时,你将那部单独拉出来做成函

数,可能代码和时间都会更好。

4 C4 h( A/ M8 [. u& Z& x. A. M6 四、中断中调

用的函数最好不要被中断外的其它函数调用,因为会出现“重复调用”的警告,有

时这种调用是很致命的,有人说这个函数可以用reentrant来修饰,是的,的确可

以这样解决,不过个人不建议这么做,也许这样会跟你减少很多堆栈空间,并且整

个程序的优化要差很多,个人建议出现这种情况就把这个函数写两遍,分成两个函

数分别调用。

( o O+ L& 8 b6 E3 O. Z" e: I厦门电子城,厦门e城,电子零件,单片机,电

子,xmecity,电子制作,DIY,电脑,元件, 五,中断调用了函数,会出现

一些莫名其妙的问题,一些数据不对。其实一般是因为汇编中使用了绝对寄存器引

起的,有人说中断函数使用那个寄存器组,被中断调用的函数就使用哪个寄存器

组,我认为这样不好:厦门E城论坛6 s8 B5 J9 ?; n: |" c% f

这样会增加额外的消耗,使用using会增加一下语句:集合厦门地区电子爱好者的

论坛,互相交流,提高自己的知识1 d) G. l( W, G* g0 O$ G

PUSH PSW7 s( N) q, w j$ o$ S+ f2 p5 o

MOV PSW, #XX

9 K3 i/ A2 [- E: w; V- ]! I5 Y0 P ....

& d9 D3 S5 K0 `4 V厦门电子城,厦门e城,电子零件,单片机,电子,xmecity,电子

制作,DIY,电脑,元件, POP - z. L+ `' _8 }1 B)

A, a

更重要的是,使用using的函数不能有返回值,这是致命伤

' v' g# e6 W* D: |" Q0 g厦门E城论坛 个人推荐的方法有两种:

" V( Q P# ^9 y: O) D2 z9 g厦门电子城,厦门e城,电子零件,单片机,电

子,xmecity,电子制作,DIY,电脑,元件, 1、使用“#pragma NOAREGS”禁

止使用绝对寄存器厦门电子城,厦门e城,电子零件,单片机,电子,xmecity,电子制

作,DIY,电脑,元件,' s7 n1 e7 H: A4 c3 ?+ M: _

2、使用“#pragme RB(x)”来指定本文件的工作寄存器组4 2 I+ R1 a# S' N

六、一般说来,要求中断函数尽可能的短,但也有特殊情况,有些前/后台的系统

中,就会把很多相对重要的事情放到定时中断(这个定时中断类似实时操作系统中

的时钟节拍)去做,而且程序很长。我单独提出来这点是想告诉大家,中断函数8

j7 ^8 O: f V$ J

也是一个函数而已,只要系统有必要,可以做一些看似不合理的事情,该出手时就

出手,就像goto语句一样。


发布者:admin,转转请注明出处:http://www.yc00.com/web/1713535753a2268279.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信