应对KEIL C51错误的覆盖警告信息L48处置

因为项目编译结果比较大,几乎超出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)

顺利编译和链接完成。