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

[复制链接]
 楼主| 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 | 显示全部楼层
未来是梦 发表于 2009-11-8 10:17 | 显示全部楼层
还是别用USING ;
这关键字感觉就是画蛇添足;
mohanwei 发表于 2009-11-8 10:26 | 显示全部楼层
中断using 1或2,3
xwj 发表于 2009-11-8 10:26 | 显示全部楼层
其实51只有3种(个)优先级!
每个优先级统一用一个using 即可。

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

而对于使用了中断重入技巧的程序,不允许使用using。
xwj 发表于 2009-11-8 10:32 | 显示全部楼层
LZ的程序中,
timer0_int() interrupt 1 USING 0 {   
  
  //中断使用是寄存器组0
}

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

把using 0 换成using 1(或2、3)就会好了
如果要传递参数给中断,应该用全局变量,并用variable声明。
草履虫 发表于 2009-11-9 15:09 | 显示全部楼层
中断中使用USING 0真的会出错吗?还真没有了听说过。
只知道不写的时候所有的函数均黙认为using 0。如果中断不用using 1,2/3的时候,只是压栈出栈的时候,操作较多,代码的效率降低而已。出错还是第一次。除非是因为嵌入汇编后,变量安排不合理的时候会出现。很早之前用的时候,中断使用using 0会编译后,汇编中出现push AR0,...push ar7、pop ar7,....pop ar0的代码,如果没有的话会出问题道是可能,但一般情况下C51的黙认状态是会产生的。
草履虫 发表于 2009-11-9 15:13 | 显示全部楼层
补充:
如果程序较大时,变量太多,造成堆栈不够的情况,会出现像6楼说的那样,主要原因是堆栈溢了造成的。并非是中断使用的using 0。
huey.lu 发表于 2009-11-22 18:11 | 显示全部楼层
using特性,个人理解为寄存器全部压栈。
如果不用using,中断函数会根据使用寄存器的情况压栈。(非中断函数不会)
xwj 发表于 2009-11-22 19:17 | 显示全部楼层
LS第一句理解严重错误。
using特性是切换寄存器组,Keil认为你既然切换了,那就不用保护R0~R7了,所以就会去掉对R0~R7的保护指令,而中断操作中只要用到R0~R7就必然会造成地址00~07的意外改变,所以必然出错。

LS第二句理解是对的。


另外,7、8楼的理解严重错误,建议两位先去研究研究Keil编译后的反汇编代码,不然理解起来谬误重重,没法解释,反而害老x在一边瞎着急...
草履虫 发表于 2009-11-23 08:37 | 显示全部楼层
我的**有错误,重新看了一下。呵。。。
如果不使用using 的话, 中断会自动保护R寄存器。使用后,不对R寄存器保护。
感谢LS的指正。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

2

主题

4

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部