1. 程式人生 > >Keil 警告:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS

Keil 警告:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS

       編譯程式時出現以下警告,看網上說可以是警告不再提示,本人覺得不能迴避問題,應該找出問題,排除問題,以免程式執行時還是會出錯,達不到需要效果或程式執行不穩定。

*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS

說是這個警告表示存在定義了未呼叫的函式,但是我今天碰到的壓根就不是這個原因。

<span style="font-size:14px;">#include <REG52.H>
#include <stdio.h>
#include <intrins.h>

#define uchar unsigned char	          //巨集定義
#define uint unsigned int	         //巨集定義

uchar b;                             //用來接收資料儲存
uchar j=0;
uint i=0;			    //用來判斷相應的子程式
uchar LED1= 0xfe;	                 //作為流水燈的開始
uchar LED2=0Xfe;                     //作為跑馬燈的開始
uchar LED3 = 0xfE;	                 //作為二進位制加法燈的開始
uchar LED4=0XFF;                     //作為花樣燈的開始
uchar code table[]={0xff,//全滅
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,//依次逐個點亮
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,//依次逐個疊加
0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,//依次逐個遞減
0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e,//兩邊靠攏後分開
0x7e,0x3c,0x18,0x00,0x00,0x18,0x3c,0x7e,//兩邊疊加後遞減
0x00};//全亮

void delay(void);                    //延時函式的宣告
void liushuideng(void);              //流水燈的宣告
void paomadeng(void);                //跑馬燈的宣告
void huayangdeng(void);              //花樣燈的宣告
void stopLed();                      //停止所有燈的效果
void erjinzhideng(void);             //二進位制加法燈的宣告
void xianshi(uint j);				 //顯示程式
void init(void);                     //初始化函式

void main (void)
 {      
    init();                          //初始化  
	while(1)
    { 
	 xianshi(i);			     	 //顯示
    }
}

void init(void)					   //初始化函式的定義
{
        SCON = 0x50;               //REN=1允許序列接受狀態,串列埠工作模式1    	       	   
	    TMOD|= 0x20;               //定時器工作方式2                    
		PCON|= 0x80; 
		TH1 = 0xF3;	              //baud*2  /*  波特率4800、資料位8、停止位1。效驗位無 (12M)
    	TL1 = 0xF3;         
		TR1  = 1; 				  //開啟定時器
		PS=1;                     //把串列埠中斷的優先順序設為最高                                       
		ES   = 1;                 //開串列埠中斷                  
		EA   = 1;
 }
void delay(void)	             //延時函式的定義
{
uchar i;
uchar ms=250;
	while(ms--)
	{
		for(i = 0; i < 120; i++);
	}

}
void liushuideng(void)	          //流水燈
{
     P2 = LED1;
	 delay();	   
	 LED1 = LED1 << 1;        //迴圈右移1位,點亮下一個LED "<<"為左移位
 		 if(P2 ==0X00 )
	 {
	    LED1 = 0xfe;       	// 0xfe = 1111 1110  
	  }       
}

void paomadeng(void)	         //跑馬燈
{
	P2 = LED2;
    LED2 = _crol_(LED2,1);	   	//迴圈右移1位,點亮下一個LED  此函式位庫函式	
	delay();
}

void huayangdeng(void)	        //花樣燈
{  	  P2=table[j++];
       delay();
	   if(j==42)
	   j=0;
} 

void erjinzhideng(void)	        //二進位制加法燈
{
	  P2= LED4;
	  delay();
	  LED4--;
}

void stopLed()
{
	P2=0xff;	
}

void xianshi(uint j)	        //呼叫相對應的程式
{
   switch(j)
        {
           if(j==1)	  P2=0xfe;			//點亮第一個LED
	   if(j==2)	  P2=0xfd;			//點亮第二個LED
	   if(j==3)	  P2=0xfb;			//點亮第三個LED
	   if(j==4)	  P2=0xf7;			//點亮第四個LED
	   if(j==5)	  P2=0xef;			//點亮第五個LED
	   if(j==6)       P2=0xdf;			//點亮第六個LED
	   if(j==7)	  P2=0xbf;			//點亮第七個LED
	   if(j==8)	  P2=0x7f;			//點亮第八個LED
	   if(j==9)	  liushuideng();	        //流水燈
	   if(j==10)      paomadeng();	            	//跑馬燈
	   if(j==11)      huayangdeng();		//花樣燈
	   if(j==12)      erjinzhideng();	        //二進位制加法燈
	   if(j==13)      stopLed();			//停止燈效果
        }	
}
			
void com_isr(void) interrupt 4  //串列埠中斷入口函式
{		
    ES=0;	                    //再中斷進行處理程式的時候關閉串列埠中斷			         
	b=SBUF;		            	//將接收的資料存於變數中
	switch(b)						//分支語句,進行判斷
	{ 
	    case '1':i=1;break;         //點亮第一個LED的賦值
		case '2':i=2;break;         //點亮第二個LED的賦值
	    case '3':i=3;break;         //點亮第三個LED的賦值
	    case '4':i=4;break;         //點亮第四個LED的賦值
		case '5':i=5;break;         //點亮第五個LED的賦值
		case '6':i=6;break;         //點亮第六個LED的賦值
	    case '7':i=7;break;         //點亮第七個LED的賦值
		case '8':i=8;break;         //點亮第八個LED的賦值
		case '9':i=9;break;  		//流水燈的賦值
		case 'a':i=10;break; 		//跑馬燈的賦值
	    case 'b':i=11;break; 	    //花樣燈的賦值
		case 'c':i=12;break; 	    //二進位制加法燈的賦值
		case 'd':i=13;break;        //停止所有燈效果的賦值	 
		default:   break;
  	 }
   	   RI=0;								//清除中斷標誌位
	   ES=1;								//處理完中斷程式再開啟串列埠中斷
}
</span>
<span style="font-size:14px;">    問題出現在呼叫這個函式的地方:void xianshi(uint j)   最初打算用switch來完成函式呼叫,後來改為用if,忘了刪除原來的switch,然後就出現了這個警告。可見,出現這個警告不僅僅是定義了未呼叫的函式。</span>