打印

keil中如何确保各自的寄存器组不被破坏

[复制链接]
2868|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hero0765|  楼主 | 2009-7-24 09:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void func1() 


 //函数使用了乘法运算,因此需要使用寄存器进行参数传递, 
//默认是寄存器组0,因此timer0 中断会破坏我的乘法运算。 
//但又不希望关闭中断。 



timer0_int() interrupt 1 USING 0 {   
  
  //中断使用是寄存器组0 



因此想利用#pragma noaregs 指令, 

#pragma noaregs 
void func1() 



以禁止func1()使用绝对寄存器寻址,也就是不希望func1()中的运算使用寄存器组0。 
但失败,这条指令都不起到我想要的作用。 

#pragma  NOREGPARMS 这条指令也试过,但也失败。 

请问是否我的书写格式错误?还是还要其它的设置的?如何让不同的函数使用各自的寄存器组,而不互相干扰呢? 
还有一个疑问: 
keil C51 的寄存器组只有4组,因此没有可能每个函数使用唯一的寄存器组。假设:func1() 被 func2() 中断,func2()在运行中又被func3()中断,func3()在运行中又被func4()中断,等等。每个中断函数都需要利用寄存器组进行运算,那么如何确保各自的寄存器组不被破坏呢?

相关帖子

沙发
xlsbz| | 2009-11-5 09:15 | 只看该作者
:P

使用特权

评论回复
板凳
未来是梦| | 2009-11-8 10:17 | 只看该作者
还是别用USING ;
这关键字感觉就是画蛇添足;

使用特权

评论回复
地板
mohanwei| | 2009-11-8 10:26 | 只看该作者
中断using 1或2,3

使用特权

评论回复
5
xwj| | 2009-11-8 10:26 | 只看该作者
其实51只有3种(个)优先级!
每个优先级统一用一个using 即可。

注意:
using 0 已经默认被非中断级使用,任何中断不许用它,否则绝对会出错。

而对于使用了中断重入技巧的程序,不允许使用using。

使用特权

评论回复
6
xwj| | 2009-11-8 10:32 | 只看该作者
LZ的程序中,
timer0_int() interrupt 1 USING 0 {   
  
  //中断使用是寄存器组0
}

是最大的错误,绝对会出错。

把using 0 换成using 1(或2、3)就会好了
如果要传递参数给中断,应该用全局变量,并用variable声明。

使用特权

评论回复
7
草履虫| | 2009-11-9 15:09 | 只看该作者
中断中使用USING 0真的会出错吗?还真没有了听说过。
只知道不写的时候所有的函数均黙认为using 0。如果中断不用using 1,2/3的时候,只是压栈出栈的时候,操作较多,代码的效率降低而已。出错还是第一次。除非是因为嵌入汇编后,变量安排不合理的时候会出现。很早之前用的时候,中断使用using 0会编译后,汇编中出现push AR0,...push ar7、pop ar7,....pop ar0的代码,如果没有的话会出问题道是可能,但一般情况下C51的黙认状态是会产生的。

使用特权

评论回复
8
草履虫| | 2009-11-9 15:13 | 只看该作者
补充:
如果程序较大时,变量太多,造成堆栈不够的情况,会出现像6楼说的那样,主要原因是堆栈溢了造成的。并非是中断使用的using 0。

使用特权

评论回复
9
huey.lu| | 2009-11-22 18:11 | 只看该作者
using特性,个人理解为寄存器全部压栈。
如果不用using,中断函数会根据使用寄存器的情况压栈。(非中断函数不会)

使用特权

评论回复
10
xwj| | 2009-11-22 19:17 | 只看该作者
LS第一句理解严重错误。
using特性是切换寄存器组,Keil认为你既然切换了,那就不用保护R0~R7了,所以就会去掉对R0~R7的保护指令,而中断操作中只要用到R0~R7就必然会造成地址00~07的意外改变,所以必然出错。

LS第二句理解是对的。


另外,7、8楼的理解严重错误,建议两位先去研究研究Keil编译后的反汇编代码,不然理解起来谬误重重,没法解释,反而害老x在一边瞎着急...

使用特权

评论回复
11
草履虫| | 2009-11-23 08:37 | 只看该作者
我的**有错误,重新看了一下。呵。。。
如果不使用using 的话, 中断会自动保护R寄存器。使用后,不对R寄存器保护。
感谢LS的指正。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

粉丝