Keil 警告:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS
阿新 • • 發佈:2019-01-07
編譯程式時出現以下警告,看網上說可以是警告不再提示,本人覺得不能迴避問題,應該找出問題,排除問題,以免程式執行時還是會出錯,達不到需要效果或程式執行不穩定。
*** 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>