因为项目编译结果比较大,几乎超出51程序空间的64K限制
linking...
Program Size: data=47.3 xdata=8168 const=1694 code=52081
这样无法增加新的功能模块,原来使用7级编译优化改为9级,这样就出来了链接警告信息:
linking...
*** WARNING L48: IGNORED RECURSIVE CALL
CALLED: _RX8130_WRIT_BYTE/RTC
CALLER: RX8130_STOP/RTC
Program Size: data=47.3 xdata=8168 const=1694 code=38305
void Rx8130_Stop(void) {
SDA_OUT();
RTC_SDA=0;
RTC_SCL=1;
Delayus();//15
RTC_SDA=1;
Delayus();//15
SDA_IN();
}
void Rx8130_Writ_Byte(U8 bhDat) {
U8 bh=8;
SDA_OUT();
for(;bh>0;bh--) {
if(bhDat&0x80)
RTC_SDA=1;
else
RTC_SDA=0;
bhDat=(bhDat<<1);
Delayus();
RTC_SCL=1;
Delayus();
RTC_SCL=0;
Delayus();
}
Rx8130_Cack();
}
项目中只有X8130_WRIT_BYTE对RX8130_STOP的调用,不会存在反过来的调用关系,明显是KEIL C51的链接器错误的定位了这个问题,其实不处理是没有问题的,但这么多年来对项目要求一致遵循零错误零警告的原则。
这个时候就需要人工告诉链接器,RX8130_STOP对RX8130_WRIT_BYTE没有调用关系,使用了OVERLAY指令。
OVERLAY(?PR?RX8130_STOP?RTC ~ ?PR?_RX8130_WRIT_BYTE?RTC)
顺利编译和链接完成。