解決一個(gè)Keil C報(bào)錯(cuò)信息:error C132
掃描二維碼
隨時(shí)隨地手機(jī)看文章
今天寫把自己的一個(gè)程序改成多文件后出現(xiàn)了下面的一個(gè)報(bào)警:not in formal parameter list
找了半天也沒(méi)有解決問(wèn)題,后來(lái)在網(wǎng)上找到別人解決同樣問(wèn)題的方法.他是頭文件一個(gè)函數(shù)聲明時(shí)落了個(gè)分號(hào)造成的,我立刻檢查自己的程序,發(fā)現(xiàn)同樣少了一個(gè)分號(hào).分號(hào)添上后編譯鏈接通過(guò).
下面是我轉(zhuǎn)載的別人解決問(wèn)題的文章:
error C132 :“****”not in formal parameter list
花了偶將近半個(gè)小時(shí)來(lái)查找錯(cuò)誤,最終發(fā)現(xiàn)原來(lái)是在頭文件里的一個(gè)函數(shù)聲明時(shí)露了一個(gè)分號(hào)造成緊挨著在它下面聲明的參數(shù)not in formal parameter list。記在在這里,免得以后忘記了,同時(shí)也供大家分享。錯(cuò)誤代碼如下:
之前我在函數(shù)聲明出列出函數(shù)聲明如下:
void Display_Normal();
void Display_Reset()
void Display_Year();
void Display_Month();
void Display_Day();
void Display_Week();
void Display_Hour();
void Display_Minute();
void Display_Second();
下面是另外一些常見的錯(cuò)誤提示 :
1.第一種錯(cuò)誤信息
***WARNING L15: MULTIPLE CALL TO SEGMENT
SEGMENT: ?PR?_WRITE_GMVLX1_REG?D_GMVLX1 CALLER1: ?PR?VSYNC_INTERRUPT?MAIN CALLER2: ?C_C51STARTUP
***WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: ?PR?_SPI_SEND_WORD?D_SPI CALLER1: ?PR?VSYNC_INTERRUPT?MAIN CALLER2: ?C_C51STARTUP
***WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: ?PR?SPI_RECEIVE_WORD?D_SPI CALLER1: ?PR?VSYNC_INTERRUPT?MAIN CALLER2: ?C_C51STARTUP
該警告表示連接器發(fā)現(xiàn)有一個(gè)函數(shù)可能會(huì)被主函數(shù)和一個(gè)中斷服務(wù)程序(或者調(diào)用中斷服務(wù)程序的函數(shù))同時(shí)調(diào)用, 或者同時(shí)被多個(gè)中斷服務(wù)程序調(diào)用。
出現(xiàn)這種問(wèn)題的原因之一是這個(gè)函數(shù)是不可重入性函數(shù),當(dāng)該函數(shù)運(yùn)行時(shí)它可能會(huì)被一個(gè)中斷打斷,從而使得結(jié)果發(fā)生變化 并可能會(huì)引起一些變量形式的沖突(即引起函數(shù)內(nèi)一些數(shù)據(jù)的丟失,可重入性函數(shù)在任何時(shí)候都可以被ISR打斷,一段時(shí)間后又可以 運(yùn)行,但是相應(yīng)數(shù)據(jù)不會(huì)丟失)。 原因之二是用于局部變量和變量(暫且這樣翻譯,arguments,[自變量,變?cè)粩?shù)值,用于確定程序或子程序的值])的內(nèi)存區(qū)被其他函數(shù)的內(nèi)存區(qū)所覆蓋,如果該函數(shù)被中斷,則它的內(nèi)存區(qū)就會(huì) 被使用,這將導(dǎo)致其他函數(shù)的內(nèi)存沖突。 例如,第一個(gè)警告中函數(shù)WRITE_GMVLX1_REG 在D_GMVLX1.C 或者D_GMVLX1.A51被定義,它被一個(gè)中斷服務(wù)程序或者一個(gè)調(diào)用了中斷 服務(wù)程序的函數(shù)調(diào)用了,調(diào)用它的函數(shù)是VSYNC_INTERRUPT,在MAIN.C中。 解決方法: 如果你確定兩個(gè)函數(shù)決不會(huì)在同一時(shí)間執(zhí)行(該函數(shù)被主程序調(diào)用并且中斷被禁止),并且該函數(shù)不占用內(nèi)存(假設(shè)只使用寄存器), 則你可以完全忽略這種警告。 如果該函數(shù)占用了內(nèi)存,則應(yīng)該使用連接器(linker)OVERLAY指令將函數(shù)從覆蓋分析(overlay analysis)中除去,例如: OVERLAY (?PR?_WRITE_GMVLX1_REG?D_GMVLX1 ! *)
上面的指令防止了該函數(shù)使用的內(nèi)存區(qū)被其他函數(shù)覆蓋。如果該函數(shù)中調(diào)用了其他函數(shù),而這些被調(diào)用在程序中其他地方也被調(diào)用, 你可能會(huì)需要也將這些函數(shù)排除在覆蓋分析(overlay analysis)之外。這種OVERLAY指令能使編譯器除去上述警告信息。 如果函數(shù)可以在其執(zhí)行時(shí)被調(diào)用,則情況會(huì)變得更復(fù)雜一些。
這時(shí)可以采用以下幾種方法:
A.主程序調(diào)用該函數(shù)時(shí)禁止中斷,可以在該函數(shù)被調(diào)用時(shí)用#pragma disable語(yǔ)句來(lái)實(shí)現(xiàn)禁止中斷的目的。必須使用OVERLAY指令將該函數(shù) 從覆蓋分析中除去。
B.復(fù)制兩份該函數(shù)的代碼,一份到主程序中,另一份復(fù)制到中斷服務(wù)程序中。
C.將該函數(shù)設(shè)為重入型。例如: void myfunc(void) reentrant { ... } 這種設(shè)置將會(huì)產(chǎn)生一個(gè)可重入堆棧,該堆棧被被用于存儲(chǔ)函數(shù)值和局部變量,用這種方法時(shí)重入堆棧必須在STARTUP.A51文件中配置。 這種方法消耗更多的RAM并會(huì)降低重入函數(shù)的執(zhí)行速度。
2.第二種錯(cuò)誤信息 *** WARNING L16:UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_COMPARE?TESTLCD 說(shuō)明:程序中有些函數(shù)(或片段)以前(調(diào)試過(guò)程中)從未被調(diào)用過(guò),或者根本沒(méi)有調(diào)用它的語(yǔ)句。 這條警告信息前應(yīng)該還有一條信息指示出是哪個(gè)函數(shù)導(dǎo)致了這一問(wèn)題。只要做點(diǎn)簡(jiǎn)單的調(diào)整就可以。不理它也沒(méi)什么大不了的。 解決方法:去掉COMPARE()函數(shù)或利用條件編譯#if …..#endif,可保留該函數(shù)并不編譯。
3. Warning 280:’i’:unreferenced local variable
說(shuō)明局部變量i 在函數(shù)中未作任何的存取操作
解決方法消除函數(shù)中i 變量的宣告
4 Warning 206:’Music3’:missing function-prototype
說(shuō)明Music3( )函數(shù)未作宣告或未作外部宣告所以無(wú)法給其他函數(shù)調(diào)用
解決方法將敘述void Music3(void)寫在程序的最前端作宣告如果是其他文件的函數(shù)
則要寫成extern void Music3(void),即作外部宣告
5 Compling :C:8051MANN.C
Error:318:can’t open file ‘beep.h’
說(shuō)明在編譯C:8051MANN.C 程序過(guò)程中由于main.c 用了指令#include “beep.h”,但
卻找不到所致
解決方法編寫一個(gè)beep.h 的包含檔并存入到c:8051 的工作目錄中
6 Compling:C:8051LED.C
Error 237:’LedOn’:function already has a body
說(shuō)明LedOn( )函數(shù)名稱重復(fù)定義即有兩個(gè)以上一樣的函數(shù)名稱
解決方法修正其中的一個(gè)函數(shù)名稱使得函數(shù)名稱都是獨(dú)立的
7 ***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_DELAYX1MS?DELAY
說(shuō)明DelayX1ms( )函數(shù)未被其它函數(shù)調(diào)用也會(huì)占用程序記憶體空間
解決方法去掉DelayX1ms( )函數(shù)或利用條件編譯#if …..#endif,可保留該函數(shù)并不編
譯
8 ***WARNING 6 :XDATA SPACE MEMORY OVERLAP
FROM : 0025H
TO: 0025H
說(shuō)明外部資料ROM 的0025H 重復(fù)定義地址
解決方法外部資料ROM 的定義如下
Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC 變量的名稱為0x25,請(qǐng)檢查是否有其它的變量名稱也是定義在0x25 處并修正它
9 WARNING 206:’DelayX1ms’: missing function-prototype
C:8051INPUT.C
Error 267 :’DelayX1ms ‘:requires ANSI-style prototype C:8051INPUT.C
說(shuō)明程序中有調(diào)用DelayX1ms 函數(shù)但該函數(shù)沒(méi)定義即未編寫程序內(nèi)容或函數(shù)
已定義但未作宣告
解決方法編寫DelayX1ms 的內(nèi)容編寫完后也要作宣告或作外部宣告可在delay.h
的包含檔宣告成外部以便其它函數(shù)調(diào)用
10 ***WARNING 1:UNRESOLVED EXTERNAL SYMBOL
SYMBOL:MUSIC3
MODULE:C:8051MUSIC.OBJ(MUSIC)
***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL:MUSIC3
MODULE:C:8051MUSIC.OBJ(MUSIC)
ADDRESS:0018H
說(shuō)明程序中有調(diào)用MUSIC 函數(shù)但未將該函數(shù)的含擴(kuò)檔C 加入到工程檔
Prj 作編譯和連接
解決方法設(shè)MUSIC3 函數(shù)在MUSIC C 里將MUSIC C 添加到工程文件中去
11 ***ERROR 107:ADDESS SPACE OVERFLOW
SPACE: DATA
SEGMENT: _DATA_GOUP_
LENGTH: 0018H
***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNAL
SYMBOL: VOLUME
MODULE: C:8051OSDM.OBJ (OSDM)
ADDRESS: 4036H
說(shuō)明data 存儲(chǔ)空間的地址范圍為0~0x7f,當(dāng)公用變量數(shù)目和函數(shù)里的局部變量如果存
儲(chǔ)模式設(shè)為SMALL 則局部變量先使用工作寄存器R2~R7 作暫存當(dāng)存儲(chǔ)器不夠用時(shí)則會(huì)
以data 型別的空間作暫存的個(gè)數(shù)超過(guò)0x7f 時(shí)就會(huì)出現(xiàn)地址不夠的現(xiàn)象
解決方法將以data 型別定義的公共變量修改為idata 型別的定義