51单片机中断程序中用上using可以精简代码,节省堆栈,不过有时会出现一个问题:
用上using,在中断服务程序里调用函数要小心一点,因为keilC有时会产生依赖绝对地址的代码,例如如下函数,功能是从片外的存储设备中读取一个字节:
ucharReadByte(ucharaddress)
{
retrunPBYTE[address];
}
会被编译成如下代码:
MOVR0,0x07
MOVXA,@R0
MOVR7,A
这时,如果在中断服务程序里调用ReadByte(0xAA);就会发现读出的数据根本不对,因为using1使得中断服务程序在调用函数时使用第一组寄存器传递参数,编译器生成的代码如下:
MOVR7,#0xAA
LCALLReadByte
而ReadByte这个函数的代码是使用绝对地址为0x07的第0组寄存器的R7来传递参数的,所以会出问题。
解决方法是在定义ReadByte这个函数的前面加上"#pragmanoaregs",这样编译器就会生成不依赖于绝对地址的代码了,函数ReadByte被编译生成的代码如下:
XCHA,R0
MOVA,R7
XCHA,R0
MOVXA,@R0
MOVR7,A
这样就可以大胆的使用using了,使用using才是充分利用51架构的使用方法。