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]; 應(yīng)該改為P2=_crol_(j,1); 2. 從網(wǎng)上COPY的程序執(zhí)行類似的功能,有時(shí)候如果現(xiàn)象沒出現(xiàn),,或者不明顯,,可以調(diào)整下延遲函數(shù)。
3. 數(shù)碼管的掃描顯示0—7,,延遲函數(shù)的延遲時(shí)間在1ms左右,,是通過人眼的視覺暫留而產(chǎn)生的現(xiàn)象,
如果延遲函數(shù)設(shè)置的太大,,則看不到持續(xù)顯示0—7的現(xiàn)象,。 4. 用KEILC51調(diào)試程序時(shí),出現(xiàn)錯(cuò)誤提示為“unprintable character 0XA1 skipped”
用KEILC51調(diào)試程序時(shí),,出現(xiàn)錯(cuò)誤提示為“unprintable character 0XA1 skipped”的問題,。 輸入法的問題。在程序行輸入中文模式下標(biāo)點(diǎn)符號(hào),,不會(huì)顯示,,但是會(huì)出現(xiàn)標(biāo)題這樣的問題。 打上//馬上就能看到?jīng)]有顯示的標(biāo)點(diǎn)符號(hào) 5. *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_COMPARE?TESTLCD 說明:程序中有些函數(shù)(或片段)以前(調(diào)試過程中)從未被調(diào)用過,或者根本沒有調(diào)用它的語句,。 這條警告信息前應(yīng)該還有一條信息指示出是哪個(gè)函數(shù)導(dǎo)致了這一問題,。只要做點(diǎn)簡(jiǎn)單的調(diào)整就可以。 不理它也沒什么大不了的,。解決方法:去掉COMPARE()函數(shù)或利用條件編譯#if …..#endif,可保留該函數(shù)并不編譯,。 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; } } 問題在中斷函數(shù)的寫法上,C下面51的中斷函數(shù)要這么寫: void timer0_int(void) interrupt N using M 其中的N是不同中斷對(duì)應(yīng)的中斷號(hào),,一般單片機(jī)的書上都有說明的,,M是這個(gè)中斷函數(shù)在存儲(chǔ)空間中所占的bank,一般不要和main函數(shù)的一樣就可以了,,而main函數(shù)的在bank0,,那么針對(duì)51單片機(jī),這個(gè)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編譯器出現(xiàn)上面的警告,,并且找遍了網(wǎng)上也沒能找出個(gè)究竟時(shí),你是否覺得這個(gè)問題很難,,難得以至于沒人能回答呢,?
其實(shí)這個(gè)只是初學(xué)者和粗心者才會(huì)犯的錯(cuò)誤:沒把C文件添加到項(xiàng)目中!
///另外,,還有可能是因?yàn)榇嬖跊]有被調(diào)用的已經(jīng)定義的函數(shù),。
本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/liufei_learning/archive/2010/07/15/5737531.aspx
8. *** WARNING L15: MULTIPLE CALL TO SEGMENT***
原因Warning 15向我們表明了linker發(fā)現(xiàn)了一個(gè)函數(shù),,這個(gè)函數(shù)不僅在main code里被調(diào)用了,,而且在ISR(或者被ISR調(diào)用的函數(shù)中)被調(diào)用了?;蛘呤潜煌瑫r(shí)被多個(gè)ISR同時(shí)調(diào)用了,。 這樣會(huì)產(chǎn)生一個(gè)問題,就是在此函數(shù)不是一個(gè)可重入函數(shù),,而當(dāng)此函數(shù)已經(jīng)在執(zhí)行時(shí)它可能被另一個(gè)ISR所調(diào)用,。這樣就會(huì)導(dǎo)致結(jié)果是可變的而且很可能會(huì)導(dǎo)致一些參數(shù)的錯(cuò)誤。 另一個(gè)問題就是本地變量和參數(shù)所使用的內(nèi)存可能被其他函數(shù)的內(nèi)存覆蓋,。如果函數(shù)是由中斷所調(diào)用的,,則此函數(shù)的內(nèi)存就會(huì)被使用。這會(huì)引起其它函數(shù)的內(nèi)存錯(cuò)誤,。
舉例來說,,對(duì)于你的第一個(gè)警告,WRITE_GMVLX1_REG是會(huì)被多個(gè)root所調(diào)用,。其被定義在D_GMVLX1.C或者D_GMVLX1.A51中,。他不僅會(huì)被ISR(或者被ISR調(diào)用的函數(shù))而且也會(huì)被MAIN.C中的VSYNC_INTERRUPT函數(shù)所調(diào)用。
解決辦法: (1).主程序調(diào)用該函數(shù)時(shí)禁止中斷,,可以在該函數(shù)被調(diào)用時(shí)用#pragma disable語句來實(shí)現(xiàn)禁止中斷的目的,。必須使用OVERLAY指令將該函數(shù)從覆蓋分析中除去。 (2).復(fù)制兩份該函數(shù)的代碼,,一份到主程序中,,另一份復(fù)制到中斷服務(wù)程序中。 (3).將該函數(shù)設(shè)為重入型,。例如: void myfunc(void) reentrant { ... } 這種設(shè)置將會(huì)產(chǎn)生一個(gè)可重入堆棧,,該堆棧被被用于存儲(chǔ)函數(shù)值和局部變量,用這種方法時(shí)重入堆棧必須在STARTUP.A51文件中配置,。
這種方法消耗更多的RAM并會(huì)降低重入函數(shù)的執(zhí)行速度,。 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;沒有用,怎么解決這個(gè)問題呢 實(shí)際上是被編譯了的,, 調(diào)用函數(shù)時(shí)傳遞的的確是7,。沒有寫回到i倒是事實(shí),因?yàn)榫幾g器認(rèn)為后面不再用i了,,所以就沒有回寫,。 如果你將下面的k=10改成k=i,那么就會(huì)將7寫回到i,,并且keil編譯器不會(huì)直接使用立即數(shù)7,,而用一條減1指令,從前面的8減1變成7,。
10. 單片機(jī)中_crol_函數(shù)的的意思:
_crol_(a,m) 將a循環(huán)左移,,步進(jìn)為m _cror_(a,n) 將a循環(huán)右移,步進(jìn)為n
11. if(temp-ret>min_value)
{ min_value=temp-ret; min_id=i; } LAB06.C(72): error C193: '-': illegal op-type(s) 此處需要強(qiáng)制類型轉(zhuǎn)換,,因?yàn)樯厦嬗幸欢x unsigned int ret[50]. unsigned int temp = 0 temp和ret不是同一類型數(shù)據(jù),。 12. 用KEILC51調(diào)試程序時(shí),出現(xiàn)錯(cuò)誤提示為“unprintable character 0XA1 skipped”的問題,。
輸入法的問題,在程序行輸入中文模式下標(biāo)點(diǎn)符號(hào),,不會(huì)顯示,但是會(huì)出現(xiàn)標(biāo)題這樣的問題,打上//馬上就能看到?jīng)]有顯示的標(biāo)點(diǎn)符號(hào)
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 如果要使用缺省賦值,則前面的每行不能缺省賦值,只能在最后缺省,也就是你可以對(duì)前7行進(jìn)行完全賦值,后兩行缺省,卻不能每行中缺一些,還缺行. initializer 初始化 14. Warning 280:’i?unreferenced local variable
說明局部變量i 在函數(shù)中未作任何的存取操作解決方法消除函數(shù)中i 變量的宣呿 15. Warning 206:’Music3?missing -prototype 說明Music3( )函數(shù)未作宣告或未作外部宣告所以無法給其他函數(shù)調(diào)用 解決方法將敘述void Music3(void)寫在程序的最前端作宣告如果是其他文件的函數(shù)則要寫成extern void Music3(void),即作外部宣告 16. Compling :C:\8051\MANN.C Error:318:can’t open file ‘beep.h?說明在編譯C:\8051\MANN.C 程序過程中由于main.c 用了指令#i nclude “beep.h?但卻找不到所致解決方法編寫一個(gè)beep.h 的包含檔并存入到c:\8051 的工作目錄中 17. Compling:C:\8051\LED.C Error 237:’LedOn? already has a body 說明LedOn( )函數(shù)名稱重復(fù)定義即有兩個(gè)以上一樣的函數(shù)名稱 解決方法修正其中的一個(gè)函數(shù)名稱使得函數(shù)名稱都是獨(dú)立的 18. ***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_DELAYX1MS?DELAY 說明DelayX1ms( )函數(shù)未被其它函數(shù)調(diào)用也會(huì)占用程序記憶體空間解決方法去掉DelayX1ms( )函數(shù)或利用條件編諉if ?.#endif,可保留該函數(shù)并不編譯 19. ***WARNING 6 :XDATA SPACE MEMORY OVERLAP
FROM : 0025H TO: 0025H 說明外部資料ROM 皿025H 重復(fù)定義地址 解決方法外部資料ROM 的定義如下Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC 變量的名稱為0x25,請(qǐng)檢查是否有其它的變量名稱也是定義在0x25 處并修正宿br> 20. WARNING 206:’DelayX1ms? missing -prototype
C:\8051\INPUT.C Error 267 :’DelayX1ms ?requires ANSI-style prototype C:\8051\INPUT.C 說明程序中有調(diào)用DelayX1ms 函數(shù)但該函數(shù)沒定義即未編寫程序內(nèi)容或函數(shù)已定義但未作宣告 解決方法編寫DelayX1ms 的內(nèi)容編寫完后也要作宣告或作外部宣告可在delay.h 的包含檔宣告成外部以便其它函數(shù)調(diào)甿br> 21. ***WARNING 1:UNRESOLVED EXTERNAL SYMBOL SYMBOL:MUSIC3 MODULE:C:\8051\MUSIC.OBJ(MUSIC) ***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL:MUSIC3 MODULE:C:\8051\MUSIC.OBJ(MUSIC) ADDRESS:0018H 說明程序中有調(diào)用MUSIC 函數(shù)但未將該函數(shù)的含擴(kuò)檔C 加入到工程檔Prj 作編譯和連接 解決方法設(shè)MUSIC3 函數(shù)在MUSIC C 里將MUSIC C 添加到工程文件中縣br> 22. ***ERROR 107:ADDESS SPACE OVERFLOW
SPACE: DATA SEGMENT: _DATA_GOUP_ LENGTH: 0018H ***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNAL SYMBOL: VOLUME MODULE: C:\8051\OSDM.OBJ (OSDM) ADDRESS: 4036H 說明data 存儲(chǔ)空間的地址范圍丿~0x7f,當(dāng)公用變量數(shù)目和函數(shù)里的局部變量如果存 儲(chǔ)模式設(shè)為SMALL 則局部變量先使用工作寄存器R2~R7 作暫存當(dāng)存儲(chǔ)器不夠用時(shí)則伿br> 以data 型別的空間作暫存的個(gè)數(shù)超迿x7f 時(shí)就會(huì)出現(xiàn)地址不夠的現(xiàn)豿br> 解決方法將以data 型別定義的公共變量修改為idata 型別的定乿br> 說明如對(duì)編譯出錯(cuò)感興趣的網(wǎng)友能否把你們常遇到皿strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">錯(cuò)誤信息收集起來并提出最終的 解決辦法加以歸納以期共享(轉(zhuǎn)自:http://blog.sina.com.cn/s/blog_5f0bed160100cmu9.html) 23. keilc51 的編程:
(1),、 注意程序的輸入方法,,使用簡(jiǎn)體中文-美式鍵盤 (2)、 拷貝程序是要注意,,防止看不到的亂碼產(chǎn)生 (3),、 F11、step:以單步執(zhí)行程序 F10,、step over:以過程單步執(zhí)行程序 (4),、 error :invalid instruction operand 錯(cuò)誤原因?yàn)檎Z句不符合語法 error: illegal factor error: undefined symbol 拼寫錯(cuò)誤,需要仔細(xì)檢查 error:syntax error near'void' 語法句法錯(cuò)誤 我的錯(cuò)誤是void main()前面的一個(gè)函數(shù)缺少結(jié)束的大括號(hào) (5),、 memory window:C,、D、I,、X,,分別代表代碼存儲(chǔ)空間、 直接尋址的片內(nèi)存儲(chǔ)空間,、間接尋址的片內(nèi)存儲(chǔ)空間,、擴(kuò)展的外部RAM 空間; 數(shù)字代表想要查看的地址。例如輸入D:0 即可觀察到地址0 開始的片內(nèi)RAM 單元值,、鍵入C:0 即 可顯示從0 開始的ROM 單元中的值,,即查看程序的二進(jìn)制代碼。 本文來自CSDN博客,,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/lixiaohuprogram/archive/2009/09/09/4534786.aspx 24. P1是在頭文件中定義的 sfr P1=0x90;
這里就是把P1指向?qū)嶋H地址0x90(寄存器地址),,這個(gè)應(yīng)該可以理解,。
而P1^0的意思就是指P1端口的0位,“^”是個(gè)說明符,。但是,,在C語言的代碼里面,不能直接用P1^0,,因?yàn)?#8220;^”這個(gè)符號(hào)在代碼中是運(yùn)算符,,編譯器不能識(shí)別了。
所以,,一般需要重新定義
sbit P1_0=P1^0;
那么,,P1_0就可以在代碼中代表P1端口的0位了。這里P1_0也可以用其他字符表示,,例如
sbit BUSY=P1^0;
還有一個(gè)方法直接定義位變量,,注意,這里的0x90是位地址
sbit P1_0 = 0x90;
|
|