Keil C 中的一些ERROR和WARNING
07-28
1.LAB100.C(12): error C216: subscript on non-array or too many dimensions原程序如下:#include <reg51.h> #include <intrins.h>void delay(int);unsigned char code dis_code[8]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a};main() {int i,j;P2=0xff;while(1){P2=0x7f;for(i=0;i<8;i++) {P0=dis_code[i]; P2=_crol_[j,1];j=P2;delay(1); }}}void delay(int x){int i;for(i=0;i<x;i++);}問題在於P2=_crol_[j,1];應該改為P2=_crol_(j,1);2.從網上COPY的程序執行類似的功能,有時候如果現象沒出現,或者不明顯,可以調整下延遲函數。3.數碼管的掃描顯示0—7,延遲函數的延遲時間在1ms左右,是通過人眼的視覺暫留而產生的現象,如果延遲函數設置的太大,則看不到持續顯示0—7的現象。4.用KEILC51調試程序時,出現錯誤提示為「unprintable character 0XA1 skipped」用KEILC51調試程序時,出現錯誤提示為「unprintable character 0XA1 skipped」的問題。輸入法的問題。在程序行輸入中文模式下標點符號,不會顯示,但是會出現標題這樣的問題。打上//馬上就能看到沒有顯示的標點符號5.*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESSSEGMENT: ?PR?_COMPARE?TESTLCD說明:程序中有些函數(或片段)以前(調試過程中)從未被調用過,或者根本沒有調用它的語句。這條警告信息前應該還有一條信息指示出是哪個函數導致了這一問題。只要做點簡單的調整就可以。不理它也沒什麼大不了的。解決方法:去掉COMPARE()函數或利用條件編譯#if …..#endif,可保留該函數並不編譯。6.LAB99.C(19): error C141: syntax error near "{", expected "const"程序如下:#include<reg51.h>#include<intrins.h>sbit LEDP=P1^0;unsigned char counter;main(){TMOD=0x01;TH0=0x3C;TL0=0xB0;counter=0x0A;EA=1; ET0=1; TR0=1; while(1) {};}void timer0_int(void) interrupt {TH0=0x3C;TL0=0xB0;counter--; if((counter)!=0) { counter=0x0A; LEDP=~LEDP; }}問題在中斷函數的寫法上,C下面51的中斷函數要這麼寫:void timer0_int(void) interrupt N using M其中的N是不同中斷對應的中斷號,一般單片機的書上都有說明的,M是這個中斷函數在存儲空間中所佔的bank,一般不要和main函數的一樣就可以了,而main函數的在bank0,那麼針對51單片機,這個M可以為1,2,3 7.C51編譯警告「*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL」 *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: ?C_START MODULE: .STARTUP.obj (?C_STARTUP) *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: ?C_START MODULE: .STARTUP.obj (?C_STARTUP) ADDRESS: 000DH 如果你在用C51編譯器出現上面的警告,並且找遍了網上也沒能找出個究竟時,你是否覺得這個問題很難,難得以至於沒人能回答呢? 其實這個只是初學者和粗心者才會犯的錯誤:沒把C文件添加到項目中!///另外,還有可能是因為存在沒有被調用的已經定義的函數。本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/liufei_learning/archive/2010/07/15/5737531.aspx8.*** WARNING L15: MULTIPLE CALL TO SEGMENT***原因Warning 15向我們表明了linker發現了一個函數,這個函數不僅在main code里被調用了,而且在ISR(或者被ISR調用的函數中)被調用了。或者是被同時被多個ISR同時調用了。這樣會產生一個問題,就是在此函數不是一個可重入函數,而當此函數已經在執行時它可能被另一個ISR所調用。這樣就會導致結果是可變的而且很可能會導致一些參數的錯誤。另一個問題就是本地變數和參數所使用的內存可能被其他函數的內存覆蓋。如果函數是由中斷所調用的,則此函數的內存就會被使用。這會引起其它函數的內存錯誤。舉例來說,對於你的第一個警告,WRITE_GMVLX1_REG是會被多個root所調用。其被定義在D_GMVLX1.C或者D_GMVLX1.A51中。他不僅會被ISR(或者被ISR調用的函數)而且也會被MAIN.C中的VSYNC_INTERRUPT函數所調用。解決辦法:(1).主程序調用該函數時禁止中斷,可以在該函數被調用時用#pragma disable語句來實現禁止中斷的目的。必須使用OVERLAY指令將該函數從覆蓋分析中除去。 (2).複製兩份該函數的代碼,一份到主程序中,另一份複製到中斷服務程序中。 (3).將該函數設為重入型。例如: void myfunc(void) reentrant { ... } 這種設置將會產生一個可重入堆棧,該堆棧被被用於存儲函數值和局部變數,用這種方法時重入堆棧必須在STARTUP.A51文件中配置。 這種方法消耗更多的RAM並會降低重入函數的執行速度。9.void delay(unsigned char i){ while(i--) { ; }}main(){ unsigned char i,k; while(1) { i=8; delay(i); i=7; delay(i); k=10; }}編譯器的意思是我那行程序i=7;沒有用,怎麼解決這個問題呢 實際上是被編譯了的,調用函數時傳遞的的確是7。沒有寫回到i倒是事實,因為編譯器認為後面不再用i了,所以就沒有回寫。如果你將下面的k=10改成k=i,那麼就會將7寫回到i,並且keil編譯器不會直接使用立即數7,而用一條減1指令,從前面的8減1變成7。10. 單片機中_crol_函數的的意思:_crol_(a,m) 將a循環左移,步進為m_cror_(a,n) 將a循環右移,步進為n11.if(temp-ret>min_value){min_value=temp-ret;min_id=i;}LAB06.C(72): error C193: "-": illegal op-type(s)此處需要強制類型轉換,因為上面有一定義 unsigned int ret[50]. unsigned int temp = 0temp和ret不是同一類型數據。12.用KEILC51調試程序時,出現錯誤提示為「unprintable character 0XA1 skipped」的問題。輸入法的問題,在程序行輸入中文模式下標點符號,不會顯示,但是會出現標題這樣的問題,打上//馬上就能看到沒有顯示的標點符號13.#include "stdafx.h"#include"stdio.h"#include"conio.h"int main(int argc, char* argv[]){char a[9][9]={{"","","","*"},{"","","*","*","*"},{"","*","*","*","*","*"},{"*","*","*","*","*","*","*"},{"","*","*","*","*","*"},{"","","*","*","*"},{"","","","*"}};int i,j;printf("%c",a[i][j]);return 0;}error C242: "a[][]": too many initializers如果要使用預設賦值,則前面的每行不能預設賦值,只能在最後預設,也就是你可以對前7行進行完全賦值,後兩行預設,卻不能每行中缺一些,還缺行.initializer 初始化14. Warning 280:』i?unreferenced local variable說明局部變數i 在函數中未作任何的存取操作解決方法消除函數中i 變數的宣呿15. Warning 206:』Music3?missing -prototype說明Music3( )函數未作宣告或未作外部宣告所以無法給其他函數調用解決方法將敘述void Music3(void)寫在程序的最前端作宣告如果是其他文件的函數則要寫成extern void Music3(void),即作外部宣告16. Compling :C:8051MANN.CError:318:can』t open file 『beep.h?說明在編譯C:8051MANN.C 程序過程中由於main.c 用了指令#i nclude 「beep.h?但卻找不到所致解決方法編寫一個beep.h 的包含檔並存入到c:8051 的工作目錄中17. Compling:C:8051LED.CError 237:』LedOn? already has a body說明LedOn( )函數名稱重複定義即有兩個以上一樣的函數名稱解決方法修正其中的一個函數名稱使得函數名稱都是獨立的18. ***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESSSEGMENT: ?PR?_DELAYX1MS?DELAY說明DelayX1ms( )函數未被其它函數調用也會佔用程序記憶體空間解決方法去掉DelayX1ms( )函數或利用條件編諉if ?.#endif,可保留該函數並不編譯19. ***WARNING 6 :XDATA SPACE MEMORY OVERLAPFROM : 0025HTO: 0025H說明外部資料ROM 皿025H 重複定義地址解決方法外部資料ROM 的定義如下Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC 變數的名稱為0x25,請檢查是否有其它的變數名稱也是定義在0x25 處並修正宿br> 20. WARNING 206:』DelayX1ms? missing -prototypeC:8051INPUT.CError 267 :』DelayX1ms ?requires ANSI-style prototype C:8051INPUT.C說明程序中有調用DelayX1ms 函數但該函數沒定義即未編寫程序內容或函數已定義但未作宣告解決方法編寫DelayX1ms 的內容編寫完後也要作宣告或作外部宣告可在delay.h 的包含檔宣告成外部以便其它函數調甿br> 21. ***WARNING 1:UNRESOLVED EXTERNAL SYMBOLSYMBOL:MUSIC3MODULE:C:8051MUSIC.OBJ(MUSIC)***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNALSYMBOL:MUSIC3MODULE:C:8051MUSIC.OBJ(MUSIC)ADDRESS:0018H說明程序中有調用MUSIC 函數但未將該函數的含擴檔C 加入到工程檔Prj 作編譯和連接解決方法設MUSIC3 函數在MUSIC C 里將MUSIC C 添加到工程文件中縣br> 22. ***ERROR 107:ADDESS SPACE OVERFLOWSPACE: DATASEGMENT: _DATA_GOUP_LENGTH: 0018H***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNALSYMBOL: VOLUMEMODULE: C:8051OSDM.OBJ (OSDM)ADDRESS: 4036H說明data 存儲空間的地址範圍丿~0x7f,當公用變數數目和函數里的局部變數如果存儲模式設為SMALL 則局部變數先使用工作寄存器R2~R7 作暫存當存儲器不夠用時則伿br> 以data 型別的空間作暫存的個數超迿x7f 時就會出現地址不夠的現豿br> 解決方法將以data 型別定義的公共變數修改為idata 型別的定乿br> 說明如對編譯出錯感興趣的網友能否把你們常遇到皿strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">錯誤信息收集起來並提出最終的解決辦法加以歸納以期共享(轉自:http://blog.sina.com.cn/s/blog_5f0bed160100cmu9.html) 23. keilc51 的編程:(1)、 注意程序的輸入方法,使用簡體中文-美式鍵盤(2)、 拷貝程序是要注意,防止看不到的亂碼產生(3)、 F11、step:以單步執行程序 F10、step over:以過程單步執行程序(4)、 error :invalid instruction operand 錯誤原因為語句不符合語法 error: illegal factor error: undefined symbol 拼寫錯誤,需要仔細檢查 error:syntax error near"void" 語法句法錯誤 我的錯誤是void main()前面的一個函數缺少結束的大括弧(5)、 memory window:C、D、I、X,分別代表代碼存儲空間、直接定址的片內存儲空間、間接定址的片內存儲空間、擴展的外部RAM 空間;數字代表想要查看的地址。例如輸入D:0 即可觀察到地址0 開始的片內RAM 單元值、鍵入C:0 即可顯示從0 開始的ROM 單元中的值,即查看程序的二進位代碼。本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/lixiaohuprogram/archive/2009/09/09/4534786.aspx24.P1是在頭文件中定義的sfr P1=0x90;這裡就是把P1指向實際地址0x90(寄存器地址),這個應該可以理解。而P1^0的意思就是指P1埠的0位,「^」是個說明符。但是,在C語言的代碼裡面,不能直接用P1^0,因為「^」這個符號在代碼中是運算符,編譯器不能識別了。所以,一般需要重新定義sbit P1_0=P1^0;那麼,P1_0就可以在代碼中代表P1埠的0位了。這裡P1_0也可以用其他字元表示,例如sbit BUSY=P1^0;還有一個方法直接定義位變數,注意,這裡的0x90是位地址sbit P1_0 = 0x90;
推薦閱讀:
推薦閱讀:
※一些基本的陰陽五行知識和64卦序
※一些你所不知的秘密【轉】
※(0065)辦公室里的一些基本禮節
※我們怕癌, 可癌最怕它們! 他癌症早期, 每天吃上一些, 癌細胞全部去光光了!
※市區擁堵路段開車,你必須學會的一些實用乾貨技巧
TAG:一些 |