版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1.Warning280:’i’:unreferencedlocalvariable說明局部變量i在函數(shù)中未作任何的存取操作解決方法消除函數(shù)中i變量的宣告及即定義的參數(shù)在程序中并未調(diào)用2Warning206:’Music3’:missingfunction-prototype說明Music3()函數(shù)未作宣告或未作外部宣告所以無(wú)法給其他函數(shù)調(diào)用解決方法將敘述voidMusic3(void)寫在程序的最前端作宣告如果是其他文件的函數(shù)則要寫成externvoidMusic3(void),即作外部宣告3Error:318:can’topenfile‘beep.h’說明在編譯C:\8051\MANN.C程序過程中由于main.c用了指令#include“beep.h”,但卻找不到所致解決方法編寫一個(gè)beep.h的包含檔并存入到c:\8051的工作目錄中4Error237:’LedOn’:functionalreadyhasabody說明LedOn()函數(shù)名稱重復(fù)定義即有兩個(gè)以上一樣的函數(shù)名稱解決方法修正其中的一個(gè)函數(shù)名稱使得函數(shù)名稱都是獨(dú)立的5***WARNING16:UNCALLEDSEGMENT,IGNOREDFOROVERLAYPROCESSSEGMENT:?PR?_DELAYX1MS?DELAY說明DelayX1ms()函數(shù)未被其它函數(shù)調(diào)用也會(huì)占用程序記憶體空間解決方法去掉DelayX1ms()函數(shù)或利用條件編譯#if…..#endif,可保留該函數(shù)并不編譯6***WARNING6:XDATASPACEMEMORYOVERLAPFROM:0025HTO:0025H說明外部資料ROM的0025H重復(fù)定義地址解決方法外部資料ROM的定義如下PdataunsignedcharXFR_ADC_at_0x25其中XFR_ADC變量的名稱為0x25,請(qǐng)檢查是否有其它的變量名稱也是定義在0x25處并修正它7WARNING206:’DelayX1ms’:missingfunction-prototypeC:\8051\INPUT.CError267:’DelayX1ms‘:requiresANSI-styleprototypeC:\8051\INPUT.C說明程序中有調(diào)用DelayX1ms函數(shù)但該函數(shù)沒定義即未編寫程序內(nèi)容或函數(shù)已定義但未作宣告解決方法編寫DelayX1ms的內(nèi)容編寫完后也要作宣告或作外部宣告可在delay.h的包含檔宣告成外部以便其它函數(shù)調(diào)用8***WARNING1:UNRESOLVEDEXTERNALSYMBOLSYMBOL:MUSIC3解決辦法:1.是文件沒有添加到工程里。2.可能是因?yàn)榇嬖跊]有被調(diào)用的已經(jīng)定義的函數(shù)。3.不知道你有沒有把Sourcegroup組下面的A51.C刪掉,如果沒有刪,在A51.c上點(diǎn)右鍵,選擇removefile"".4.建一個(gè)新的c文件,里面寫一個(gè)空的函數(shù),把該文件添加到project中,注意該文件不能再選generateassemblerSRCfile和assembleSRCfile選項(xiàng)。重新編譯工程,如果警告該函數(shù)沒被調(diào)用,在主文件中調(diào)一下。5.建一個(gè)新的c文件,把主文件中的幾個(gè)函數(shù)移至該文件,把該文件添加到project中,注意該文件不能再選generateassemblerSRCfile和assembleSRCfile選項(xiàng)。重新編譯工程9***WARNING2:REFERENCEMADETOUNRESOLVEDEXTERNALSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)ADDRESS:0018H在MUSIC3函數(shù)里面MUSIC這個(gè)參數(shù)有使用,沒有申明?;蛘呱昝髁藳]有實(shí)體。也就是說對(duì)于這個(gè)參數(shù),編譯器無(wú)法解析。10***ERROR107:ADDESSSPACEOVERFLOWSPACE:DATASEGMENT:_DATA_GOUP_LENGTH:0018H說明data空間已經(jīng)不夠用,原因是你可能有好多函數(shù),而函數(shù)內(nèi)部的局部變量又沒有定義其空間,這種情況下,系統(tǒng)會(huì)將變量分配到你在OtionsforTarget對(duì)話框里的設(shè)置的空間。如果你在下圖所示中的MemoryModel里設(shè)置成Small:variablesinDATA,則DATA空間很快便用完,導(dǎo)致data空間不夠用。解決的辦法有兩種,一是通過更改MemoryModel設(shè)置,可以設(shè)置成pdata或xdata,以便有足夠大的空間,但這又帶來新的問題,程序運(yùn)行速度減慢,而且code代碼也會(huì)加大,因?yàn)槿绻粋€(gè)局部變量被存放在了xdata空間,匯編語(yǔ)言訪問xdata空間的代碼大小要比訪問data空間的代碼大,變量一旦很多,程序的代碼也會(huì)逐漸增大;二是根據(jù)自己的要求設(shè)置變量的空間。所以這涉及到代碼優(yōu)化的問題,遇到具體問題時(shí),在運(yùn)行速度和代碼大小之間取得適合自己的情況Project>Optionfortarget>BL51Locate選項(xiàng)卡,如上圖紅圈部分所示,根據(jù)自己系統(tǒng)的存儲(chǔ)器分布情況,可以設(shè)置代碼區(qū)間和XDATA區(qū)間。通常默認(rèn)情況下,代碼區(qū)間很小,所以會(huì)造成107號(hào)錯(cuò)誤,根據(jù)需求,調(diào)大該范圍即可。11ERRORL105:PUBLICREFERSTOIGNOREDSEGMENTSYMBOL:
USARTDATACOUNTSEGMENT:?DT?USART_READWRITERam空間不足:外部變量:定義處不用加External,聲明處要加External將以data型別定義的公共變量修改為idata型別的定義12***ERROR118:REFERENCEMADETOERRONEOUSEXTERNALSYMBOL:VOLUMEMODULE:C:\8051\OSDM.OBJ(OSDM)ADDRESS:4036H定義了某某函數(shù)或全部變量在不同文件里面想調(diào)用它,卻在包含頭文件里面少了extern語(yǔ)句,或只有主程序和包含頭文件沒有(EXTERN定義語(yǔ)句(函數(shù))).如果調(diào)試時(shí)有些if結(jié)構(gòu)里的語(yǔ)句符合條件沒有執(zhí)行,或者某些語(yǔ)句不符合條件也被執(zhí)行,那是因?yàn)閕f和else里有相同的語(yǔ)句,編譯的時(shí)候作優(yōu)化處理了。13WARNING15(MULTIPLECALLTOSEGMENT)癥狀原因Warning15向我們表明了linker發(fā)現(xiàn)了一個(gè)函數(shù),這個(gè)函數(shù)不僅在maincode里被調(diào)用了,而且在ISR(或者被ISR調(diào)用的函數(shù)中)被調(diào)用了。或者是被同時(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ò)誤。解決方法有幾種方法去解決這個(gè)問題如果你100%確認(rèn)這個(gè)函數(shù)的兩個(gè)副本都不會(huì)同時(shí)執(zhí)行(如果此函數(shù)是被main調(diào)用并且中斷是未被使能的)并且此函數(shù)沒有使用內(nèi)存(只使用的寄存器),那么你就可以忽略此警告如果此函數(shù)使用了內(nèi)存,你就要使用OVERLAYdirective來將此函數(shù)從覆蓋分析(overlayanaysis)中移除。舉例如下:OVERLAY(?PR?_WRITE_GMVLX1_REG?D_GMVLX1!*)如上語(yǔ)句能阻止被此函數(shù)使用的內(nèi)存遭到覆蓋。如果這個(gè)函數(shù)調(diào)用了你程序中其他的在別處的函數(shù),那么你可能需要將這些函數(shù)也排除在覆蓋分析之外。如果當(dāng)此函數(shù)在執(zhí)行時(shí)可以被調(diào)用,那么事情就會(huì)變得比較的復(fù)雜。你可能需要:無(wú)論何時(shí)當(dāng)從main中調(diào)用此函數(shù)時(shí),需要關(guān)閉中斷。你可能需要對(duì)被調(diào)用的函數(shù)使用#pragmadisable。你也必須使用OVERLAYdirective將此函數(shù)從overlayanalysis中移除。為此函數(shù)創(chuàng)建兩個(gè)副本。一個(gè)給main,一個(gè)給ISR。使此函數(shù)可重入。14E:\VCWORK\2815.C(826):errorC236:'_wrbyte':differentlengthofparameterlists子函數(shù)里的形參聲明的方式不對(duì),需要每個(gè)參數(shù)都定義一下類型E:\VCWORK\2815.C(743):errorC183:unmodifiablelvalue出現(xiàn)errorC183:unmodifiablelvalue的錯(cuò)誤,最后發(fā)現(xiàn)時(shí)存在一個(gè)數(shù)組是ucharcodexx[5],后邊把它用作接受串口的緩沖區(qū),顯示ucharcode是不能改變的,是寫在rom中的。應(yīng)該改成ucharxx[5],這是寫在ram中的原因:修改了不能改變的變量,E:\VCWORK\2815.C(799):errorC242:'array[]':toomanyinitializers15ERRORL104:MULTIPLEPUBLICDEFINITIONSSYMBOL:_WRITE_DATAMODULE:.\ds18b20start.obj(DS18B20c/c++語(yǔ)言中有很多地方要用到extern,但是如果沒有真正的了解它的意義,會(huì)給編程帶來很大的麻煩,為了使大家少走彎路,特祥細(xì)的說明一下。對(duì)于比較小的程序,一般只有一個(gè)c文件和一個(gè)頭文件,全局變量我們通常會(huì)直接定義在c文件中,在程序之前加inti定義。如果要在頭文件中定義有以下兩種方法:用extern來聲明:externinti;這一句只是對(duì)變量i進(jìn)行聲明,在c文件的程序之前必須加上inti進(jìn)行定義。externinti=0;這一句聲明和定義都做了。對(duì)于大一點(diǎn)的程序,有很多c文件和頭文件,這個(gè)時(shí)候全局變量就必須在頭文件中聲明(不需要初始化),然后在一個(gè)c文件中定義(該初始化的要初始化)。如果在頭文件中定義,則編譯的時(shí)候會(huì)出現(xiàn)重復(fù)定義的錯(cuò)誤。如果只有頭文件中聲明就會(huì)出現(xiàn)沒有定義有警告。***ERRORL104:MULTIPLEPUBLICDEFINITIONSSYMBOL:KMODULE:222.obj(222)出現(xiàn)上述錯(cuò)誤則是因?yàn)樽兞縦重復(fù)定義,把你的頭文件中的變量定義前加extern(只是變量聲明不用初始化),再在某一個(gè)你要調(diào)用該變量的c文件的程序之前再定義(注意第一個(gè)調(diào)用的c文件要負(fù)責(zé)附帶初始化該變量,其他調(diào)用的c文件就不需要初始化過程啦)14MAIN.C(85):warningC259:'parameter':pointer:differentmspace原因,函數(shù)調(diào)用時(shí)候的實(shí)參和聲明時(shí)候的形參存儲(chǔ)空間不同,修改成一致即可。16E:\VC\2815\2815\FTOC.C(32):warningC231:'_memcpy':attempttoredefineintrinsicfunction17***ERRORL121:IMPROPERFIXUP訪問內(nèi)存指令超出指令的尋址范圍了,例如MOVX@Ri指令超出了PDATA段的范圍,或者是ACALL指令超出了2k的尋址范圍.檢查你的調(diào)用子函數(shù)的命令.特別是那些LCALL,ACALL等18***WARNINGL2:REFERENCEMADETOUNRESOLVEDEXTERNALSYMBOL:MAINMODULE:C:\KEIL\C51\LIB\C51S.LIB(?C_INIT)ADDRESS:080DH在main函數(shù)里面C_INIT這個(gè)參數(shù)有使用,沒有申明。或者申明了沒有實(shí)體。也就是說對(duì)于這個(gè)參數(shù),編譯器無(wú)法解析。19keil4warningC316:unterminatedconditionals今天用Keil4寫程序時(shí)遇到這個(gè)問題:warningC316:unterminatedconditionals跑了幾個(gè)論壇,在審視了一遍代碼之后,知道了原因:像類似XX.C(99):warningC316:unterminatedconditionals這種警告的話XX.c文件有一個(gè)凌亂的條件編譯或預(yù)編譯。因?yàn)镃語(yǔ)言中有些頭文件中的預(yù)編譯或宏定義,那么條件編譯就避免不了。寫條件編譯時(shí),可能有忘寫一個(gè)基本的語(yǔ)句。比如說,你用了條件編譯#ifndef而忘記寫#endif。因?yàn)樗麄儽緛砭褪桥涮椎?。有前者必有后者。不能丟掉其中任何一個(gè)。一個(gè)include文件最后的#endif少了#前綴或者沒有#endif,都會(huì)出現(xiàn)類似警告。就像你寫C語(yǔ)句,你不會(huì)寫了inti
而不能忘記寫";",否者就不能把一個(gè)語(yǔ)句表達(dá)完整??傊?,出現(xiàn)上述問題。先看看整個(gè)C文件中是否出現(xiàn)上述錯(cuò)誤,或整個(gè)工程中自己寫的那些頭文件中里面的條件編譯是否都寫對(duì)了,即:前面寫了#ifndef,后面是否有對(duì)應(yīng)的#endif。20DS1302.C(86):errorC183:unmodifiablelvaluecode的內(nèi)容只能讀,不能改.定義數(shù)組時(shí)把code去掉。21keil編譯警告‘Argument':conversion:pointertonon-pointer是什么問題應(yīng)該是參數(shù)傳遞錯(cuò)誤,指針參數(shù)處傳遞了非指針參數(shù)。22***ERRORL114:SEGMENTDOESNOTFIT塊大小與目標(biāo)設(shè)備不符。段溢出了,你的DATA區(qū)超過了256字節(jié)你的idata變量太大(CEH),與器件容量不匹配??赡苣愕膯纹瑱C(jī)型號(hào)選成31了,選個(gè)256字節(jié)內(nèi)部RAM的應(yīng)該就行,將定義為data的變量定義為xdata類型,問題解決了。23errorC193:badoperandtype%取模不能用浮點(diǎn)數(shù),frequence要轉(zhuǎn)成整型來取模,小數(shù)位可以乘10后轉(zhuǎn)整型來得到。24常見錯(cuò)誤error
1:
Out
of
memory
內(nèi)存溢出error
2:
Identifier
expected
缺標(biāo)識(shí)符error
3:
Unknown
identifier
未定義的標(biāo)識(shí)符error
4:
Duplicate
identifier
重復(fù)定義的標(biāo)識(shí)符error
5:
Syntax
error
語(yǔ)法錯(cuò)誤error
6:
Error
in
real
constant
實(shí)型常量錯(cuò)誤error
7:
Error
in
integer
constant
整型常量錯(cuò)誤error
8:
String
constant
exceeds
line
字符串常量超過一行error
10:
Unexpected
end
of
file
文件非正常結(jié)束error
11:
Line
too
long
行太長(zhǎng)error
12:
Type
identifier
expected
未定義的類型標(biāo)識(shí)符error
13:
Too
many
open
files
打開文件太多error
14:
Invalid
file
name
無(wú)效的文件名error
15:
File
not
found
文件未找到error
16:
Disk
full
磁盤滿error
17:
Invalid
compiler
directive
無(wú)效的編譯命令error
18:
Too
many
files
文件太多error
19:
Undefined
type
in
pointer
def
指針定義中未定義類型error
20:
Variable
identifier
expected
缺變量標(biāo)識(shí)符error
21:
Error
in
type
類型錯(cuò)誤error
22:
Structure
too
large
結(jié)構(gòu)類型太長(zhǎng)error
23:
Set
base
type
out
of
range
集合基類型越界error
24:
File
components
may
not
be
files
or
objectsfile分量不能是文件或?qū)ο骵rror
25:
Invalid
string
length
無(wú)效的字符串長(zhǎng)度error
26:
Type
mismatch
類型不匹配error
27:error
27:Invalid
subrange
base
type
無(wú)效的子界基類型error
28:Lower
bound
greater
than
upper
bound
下界超過上界error
29:Ordinal
type
expected
缺有序類型error
30:Integer
constant
expected
缺整型常量error
31:Constant
expected
缺常量error
32:Integer
or
real
constant
expected
缺整型或?qū)嵭统A縠rror
33:Pointer
Type
identifier
expected
缺指針類型標(biāo)識(shí)符error
34:Invalid
function
result
type
無(wú)效的函數(shù)結(jié)果類型error
35:Label
identifier
expected
缺標(biāo)號(hào)標(biāo)識(shí)符error
36:BEGIN
expected
缺BEGINerror
37:END
expected
缺ENDerror
38:Integer
expression
expected
缺整型表達(dá)式error
39:Ordinal
expression
expected
缺有序類型表達(dá)式error
40:Boolean
expression
expected
缺布爾表達(dá)式error
41:Operand
types
do
not
match
操作數(shù)類型不匹配error
42:Error
in
expression
表達(dá)式錯(cuò)誤error
43:Illegal
assignment
非法賦值error
44:Field
identifier
expected
缺域標(biāo)識(shí)符error
45:Object
file
too
large
目標(biāo)文件太大error
46:Undefined
external
未定義的外部過程與函數(shù)error
47:Invalid
object
file
record
無(wú)效的OBJ文件格式error
48:Code
segment
too
large
代碼段太長(zhǎng)error
49:Data
segment
too
large
數(shù)據(jù)段太長(zhǎng)error
50:DO
expected
缺DOerror
51:Invalid
PUBLIC
definition
無(wú)效的PUBLIC定義error
52:Invalid
EXTRN
definition
無(wú)效的EXTRN定義error
53:
Too
many
EXTRN
definitions
太多的EXTRN定義error
54:OF
expected
缺O(jiān)Ferror
55:INTERFACE
expected
缺INTERFACEerror
56:Invalid
relocatable
reference
無(wú)效的可重定位引用error
57:THEN
expected
缺THENerror
58:TO
or
DOWNTO
expected
缺TO或DOWNTOerror
59:Undefined
forward
提前引用未經(jīng)定義的說明error
61:Invalid
typecast
無(wú)效的類型轉(zhuǎn)換error
62:Division
by
zero
被零除error
63:Invalid
file
type
無(wú)效的文件類型error
64:Cannot
read
or
write
variables
of
this
type
不能讀寫此類型變量error
65:Pointer
variable
expected
缺指針類型變量error
66:String
variable
expected
缺字符串變量error
67:String
expression
expected
缺字符串表達(dá)式error
68:Circular
unit
reference
單元UNIT部件循環(huán)引用error
69:Unit
name
mismatch
單元名不匹配error
70:Unit
version
mismatch
單元版本不匹配error
71:Internal
stack
overflow
內(nèi)部堆棧溢出error
72:Unit
file
format
error
單元文件格式錯(cuò)誤error
73:IMPLEMENTATION
expected
缺IMPLEMENTATIONerror
74:Constant
and
case
types
do
not
match
常量和CASE類型不匹配error
75:Record
or
object
variable
expected
缺記錄或?qū)ο笞兞縠rror
76:Constant
out
of
range
常量越界error
77:File
variable
expected
缺文件變量error
78:Pointer
expression
expected
缺指針表達(dá)式error
79:Integer
or
real
expression
expected
缺整型或?qū)嵭捅磉_(dá)式error
80:Label
not
within
current
block
標(biāo)號(hào)不在當(dāng)前塊內(nèi)error
81:Label
already
defined
標(biāo)號(hào)已定義error
82:Undefined
label
in
preceding
statement
part
在前面未定義標(biāo)號(hào)error
83:Invalid
@
argument
無(wú)效的@參數(shù)error
84:UNIT
expected
缺UNITerror
85:
";"
expected
缺“;”error
86:
":"
expected
缺“:”error
87:
","
expected
缺“,”error
88:
"("
expected
缺“(”error
89:
")"
expected
缺“)”error
90:
"="
expected
缺“=”error
91:
":="
expected
缺“:=”error
92:
"["
or
"(."
Expected
缺“[”或“(.”error
93:
"]"
or
".)"
expected
缺“]”或“.)”error
94:
"."
expected
缺“.”error
95:
".."
expected
缺“..”error
96:Too
many
variables
變量太多error
97:Invalid
FOR
control
variable
無(wú)效的FOR循環(huán)控制變量error
98:Integer
variable
expected
缺整型變量error
99:Files
and
procedure
types
are
not
allowed
here
該處不允許文件和過程類型error
100:String
length
mismatch
字符串長(zhǎng)度不匹配25errorC2085:'Delete':notinformalparameterlist不在形參列表中,意思是在函數(shù)定義后丟掉了‘;’25..\QXJ\TEST.C(371):errorC100:unprintablecharacter0xA1skipped在語(yǔ)句后面出現(xiàn)了不該出現(xiàn)的字符。二、C語(yǔ)言浮點(diǎn)數(shù)的存儲(chǔ)方式C語(yǔ)言和C#語(yǔ)言中,對(duì)于浮點(diǎn)類型的數(shù)據(jù)采用單精度類型(float)和雙精度類型(double)來存儲(chǔ),float數(shù)據(jù)占用32bit,double數(shù)據(jù)占用64bit,我們?cè)诼暶饕粋€(gè)變量floatf=2.25f的時(shí)候,是如何分配內(nèi)存的呢?如果胡亂分配,那世界豈不是亂套了么,其實(shí)不論是float還是double在存儲(chǔ)方式上都是遵從IEEE的規(guī)范的,float遵從的是IEEER32.24,而double遵從的是R64.53。無(wú)論是單精度還是雙精度在存儲(chǔ)中都分為三個(gè)部分:符號(hào)位(Sign):0代表正,1代表為負(fù)指數(shù)位(Exponent):用于存儲(chǔ)科學(xué)計(jì)數(shù)法中的指數(shù)數(shù)據(jù),并且采用移位存儲(chǔ)尾數(shù)部分(Mantissa):尾數(shù)部分其中float的存儲(chǔ)方式如下圖所示:而雙精度的存儲(chǔ)方式為:R32.24和R64.53的存儲(chǔ)方式都是用科學(xué)計(jì)數(shù)法來存儲(chǔ)數(shù)據(jù)的,比如8.25用十進(jìn)制的科學(xué)計(jì)數(shù)法表示就為:8.25*,而120.5可以表示為:1.205*,這些小學(xué)的知識(shí)就不用多說了吧。而我們傻蛋計(jì)算機(jī)根本不認(rèn)識(shí)十進(jìn)制的數(shù)據(jù),他只認(rèn)識(shí)0,1,所以在計(jì)算機(jī)存儲(chǔ)中,首先要將上面的數(shù)更改為二進(jìn)制的科學(xué)計(jì)數(shù)法表示,8.25用二進(jìn)制表示可表示為1000.01,我靠,不會(huì)連這都不會(huì)轉(zhuǎn)換吧?那我估計(jì)要沒轍了。120.5用二進(jìn)制表示為:1110110.1用二進(jìn)制的科學(xué)計(jì)數(shù)法表示1000.01可以表示為1.0001*,1110110.1可以表示為1.1101101*,任何一個(gè)數(shù)都的科學(xué)計(jì)數(shù)法表示都為1.xxx*,尾數(shù)部分就可以表示為xxxx,第一位都是1嘛,干嘛還要表示呀?可以將小數(shù)點(diǎn)前面的1省略,所以23bit的尾數(shù)部分,可以表示的精度卻變成了24bit,道理就是在這里,那24bit能精確到小數(shù)點(diǎn)后幾位呢,我們知道9的二進(jìn)制表示為1001,所以4bit能精確十進(jìn)制中的1位小數(shù)點(diǎn),24bit就能使float能精確到小數(shù)點(diǎn)后6位,而對(duì)于指數(shù)部分,因?yàn)橹笖?shù)可正可負(fù),8位的指數(shù)位能表示的指數(shù)范圍就應(yīng)該為:-127-128了,所以指數(shù)部分的存儲(chǔ)采用移位存儲(chǔ),存儲(chǔ)的數(shù)據(jù)為元數(shù)據(jù)+127,下面就看看8.25和120.5在內(nèi)存中真正的存儲(chǔ)方式。首先看下8.25,用二進(jìn)制的科學(xué)計(jì)數(shù)法表示為:1.0001*按照上面的存儲(chǔ)方式,符號(hào)位為:0,表示為正,指數(shù)位為:3+127=130,位數(shù)部分為,故8.25的存儲(chǔ)方式如下圖所示:而單精度浮點(diǎn)數(shù)120.5的存儲(chǔ)方式如下圖所示:那么如果給出內(nèi)存中一段數(shù)據(jù),并且告訴你是單精度存儲(chǔ)的話,你如何知道該數(shù)據(jù)的十進(jìn)制數(shù)值呢?其實(shí)就是對(duì)上面的反推過程,比如給出如下內(nèi)存數(shù)據(jù):0100001011101101000000000000,首先我們現(xiàn)將該數(shù)據(jù)分段,010000010111011010000000000000000,在內(nèi)存中的存儲(chǔ)就為下圖所示:根據(jù)我們的計(jì)算方式,可以計(jì)算出,這樣一組數(shù)據(jù)表示為:1.1101101*=120.5而雙精度浮點(diǎn)數(shù)的存儲(chǔ)和單精度的存儲(chǔ)大同小異,不同的是指數(shù)部分和尾數(shù)部分的位數(shù)。所以這里不再詳細(xì)的介紹雙精度的存儲(chǔ)方式了,只將120.5的最后存儲(chǔ)方式圖給出,大家可以仔細(xì)想想為何是這樣子的下面我就這個(gè)基礎(chǔ)知識(shí)點(diǎn)來解決一個(gè)我們的一個(gè)疑惑,請(qǐng)看下面一段程序,注意觀察輸出結(jié)果
floatf=2.2f;
doubled=(double)f;
Console.WriteLine(d.ToString("0.0000000000000"));
f=2.25f;
d=(double)f;
Console.WriteLine(d.ToString("0.0000000000000"));可能輸出的結(jié)果讓大家疑惑不解,單精度的2.2轉(zhuǎn)換為雙精度后,精確到小數(shù)點(diǎn)后13位后變?yōu)榱?.2000000476837,而單精度的2.25轉(zhuǎn)換為雙精度后,變?yōu)榱?.2500000000000,為何2.2在轉(zhuǎn)換后的數(shù)值更改了而2.25卻沒有更改呢?很奇怪吧?其實(shí)通過上面關(guān)于兩種存儲(chǔ)結(jié)果的介紹,我們已經(jīng)大概能找到答案。首先我們看看2.25的單精度存儲(chǔ)方式,很簡(jiǎn)單01000000100100000000000000000000,而2.25的雙精度表示為:0100000000010010000000000000000000000000000000000000000000000000,這樣2.25在進(jìn)行強(qiáng)制轉(zhuǎn)換的時(shí)候,數(shù)值是不會(huì)變的,而我們?cè)倏纯?.2呢,2.2用科學(xué)計(jì)數(shù)法表示應(yīng)該為:將十進(jìn)制的小數(shù)轉(zhuǎn)換為二進(jìn)制的小數(shù)的方法為將小數(shù)*2,取整數(shù)部分,所以0.282=0.4,所以二進(jìn)制小數(shù)第一位為0.4的整數(shù)部分0,0.4×2=0.8,第二位為0,0.8*2=1.6,第三位為1,0.6×2=1.2,第四位為1,0.2*2=0.4,第五位為0,這樣永遠(yuǎn)也不可能乘到=1.0,得到的二進(jìn)制是一個(gè)無(wú)限循環(huán)的排列00110011001100110011...,對(duì)于單精度數(shù)據(jù)來說,尾數(shù)只能表示24bit的精度,所以2.2的float存儲(chǔ)為:但是這樣存儲(chǔ)方式,換算成十進(jìn)制的值,卻不會(huì)是2.2的,應(yīng)為十進(jìn)制在轉(zhuǎn)換為二進(jìn)制的時(shí)候可能會(huì)不準(zhǔn)確,如2.2,而double類型的數(shù)據(jù)也存在同樣的問題,所以在浮點(diǎn)數(shù)表示中會(huì)產(chǎn)生些許的誤差,在單精度轉(zhuǎn)換為雙精度的時(shí)候,也會(huì)存在誤差的問題,對(duì)于能夠用二進(jìn)制表示的十進(jìn)制數(shù)據(jù),如2.25,這個(gè)誤差就會(huì)不存在,所以會(huì)出現(xiàn)上面比較奇怪的輸出結(jié)果三、xdataidatapdatadataDATA:固定指前面0x00-0x7f的128個(gè)RAM,可以用acc直接讀寫的,速度最快,生成的代碼也最小。IDATA:固定指前面0x00-0xff的256個(gè)RAM,其中前128和dATa的128完全相同,只是因?yàn)樵L問的方式不同。IDATA是用類似C中的指針方式訪問的。匯編中的語(yǔ)句為:moxACC,@Rx.(不重要的補(bǔ)充:c中IDATA做指針式的訪問效果很好)XDATA:外部擴(kuò)展RAM,一般指外部0x0000-0xffff空間,用DPTR訪問。PDATA:外部擴(kuò)展RAM的低256個(gè)字節(jié),地址出現(xiàn)在A0-A7的上時(shí)讀寫,用movxACC,@Rx讀寫。這個(gè)比較特殊,而且C51好象有對(duì)此BUG,建議少用。但也有他的優(yōu)點(diǎn),具體用法屬于中級(jí)問題,這里不提。STARTUP.A51的作用,和匯編一樣,在C中定義的那些變量和數(shù)組的初始化就在STARTUP.A51中進(jìn)行,如果你在定義全局變量時(shí)帶有數(shù)值,如unsignedchardATaxxx="100";,那STARTUP.A51中就會(huì)有相關(guān)的賦值。如果沒有=100,STARTUP.A51就會(huì)把他清0。(STARTUP.A51==變量的初始化)。這些初始化完畢后,還會(huì)設(shè)置SP指針。對(duì)非變量區(qū)域,如堆棧區(qū),將不會(huì)有賦值或清零動(dòng)作。有人喜歡改STARTUP.A51為了滿足自己一些想當(dāng)然的愛好,這是不必要的,有可能錯(cuò)誤的。比如掉電保護(hù)的時(shí)候想保存一些變量,但改STARTUP.A51來實(shí)現(xiàn)是很笨的方法,實(shí)際只要利用非變量區(qū)域的特性,定義一個(gè)指針變量指向堆棧低部:0xff處就可實(shí)現(xiàn)。,為什么還要去改?可以這么說:任何時(shí)候都可以不需要改STARTUP.A51,如果你明白它的特性。bit是在內(nèi)部數(shù)據(jù)存儲(chǔ)空間中20H..2FH區(qū)域中一個(gè)位的地址,這在DATA的20H以后以字節(jié)形式出現(xiàn),可互相參照。另外加上8051可尋址的SFR,但剛剛試過,只是00H--7FH起作用,也就是說當(dāng)數(shù)據(jù)有變化時(shí)顏色變紅,以后的從80H到--FFH就不是位尋址區(qū)了,是位尋址的特殊寄存器,如涉及到了可位尋址的那11個(gè)當(dāng)然會(huì)有反應(yīng)。復(fù)位后,程序計(jì)數(shù)器PC的內(nèi)容為0000H,內(nèi)部RAM各單元的值不確定。各功能寄存器的復(fù)位值如下:堆棧指針SP的復(fù)位值為07H,累加器ACC、寄存器B的復(fù)位值為00H,數(shù)據(jù)指針DPTR的復(fù)位值為0000H,而p0、p1、p2、p3四個(gè)口的復(fù)位值為0FFH。其他SFR如PSW、TCON、TMOD、TL0、TH0、TL1、TH1的復(fù)位值也為00H。wave中是低128字節(jié)和高128字節(jié)(0-7FH),低128字節(jié)是片內(nèi)RAM區(qū),高128字節(jié)(80-FFH)是SFR(特殊功能寄存器)bit則是位于低128字節(jié)的20H..2FH區(qū)域,即data的20H..2FH區(qū)域code是在0000H..0FFFFH之間的一個(gè)代碼地址。我用ORG
5000HTAB:
DB
22H,3BH,43H,66H,5H,6DH,88H后,CODE從5000H開始以后變成DB各位DATA是在0到127之間的一個(gè)數(shù)據(jù)存儲(chǔ)器地址,或者加128..255范圍內(nèi)的一個(gè)特殊功能寄存器(SFR)地址。兩者訪問的方式不同。實(shí)際上由于PSW的復(fù)位設(shè)置PSW.3=RS0和PSW.4=RS1皆為0,所以通用工作寄存器區(qū)就是第0區(qū),所以data的00--07H部分是與REG欄中的R0--R7對(duì)應(yīng)的。以后的則僅代表低128字節(jié)的內(nèi)部RAM。IDATA是0to255范圍內(nèi)的一個(gè)IDATA存儲(chǔ)器地址,IDATA與DATA重合低128字節(jié),有的地方只有DATA表示256字節(jié)的片內(nèi)RAM,XDATA是0-65535范圍內(nèi)的一個(gè)XDATA存儲(chǔ)器地址。指針類型和存儲(chǔ)區(qū)的關(guān)系詳解一、存儲(chǔ)類型與存儲(chǔ)區(qū)關(guān)系data
>
可尋址片內(nèi)rambdata
>
可位尋址的片內(nèi)ramidata
>
可尋址片內(nèi)ram,允許訪問全部?jī)?nèi)部rampdata
>
分頁(yè)尋址片外ram(MOVX@R0)(256BYTE/頁(yè))xdata
>
可尋址片外ram(64k地址范圍FFFFH)code
>
程序存儲(chǔ)區(qū)(64k地址范圍),對(duì)應(yīng)MOVC@DPTR二、指針類型和存儲(chǔ)區(qū)的關(guān)系對(duì)變量進(jìn)行聲明時(shí)可以指定變量的存儲(chǔ)類型如:uchardatax和dataucharx相等價(jià)都是在內(nèi)ram區(qū)分配一個(gè)字節(jié)的變量。同樣對(duì)于指針變量的聲明,因涉及到指針變量本身的存儲(chǔ)位置和指針?biāo)赶虻拇鎯?chǔ)區(qū)位置不同而進(jìn)行相應(yīng)的存儲(chǔ)區(qū)類型關(guān)鍵字的使用如:ucharxdata*datapstr是指在內(nèi)ram區(qū)分配一個(gè)指針變量("*"號(hào)后的data關(guān)鍵字的作用),而且這個(gè)指針本身指向xdata區(qū)("*"前xdata關(guān)鍵字的作用),可能初學(xué)C51時(shí)有點(diǎn)不好懂也不好記。沒關(guān)系,我們馬上就可以看到對(duì)應(yīng)“*”前后不同的關(guān)鍵字的使用在編譯時(shí)出現(xiàn)什么情況。ucharxdatatmp[10];
//在外ram區(qū)開辟10個(gè)字節(jié)的內(nèi)存空間,地址是外ram的0x0000-0x0009.第1種情況:uchardata*datapstr;pstr="tmp";首先要提醒大家這樣的代碼是有bug的,他不能通過這種方式正確的訪問到tmp空間。為什么?我們把編譯后看到下面的匯編代碼:MOV0x08,#tmp(0x00)
;0x08是指針pstr的存儲(chǔ)地址看到了嗎!本來訪問外ram需要2byte來尋址64k空間,但因?yàn)槭褂胐ata關(guān)鍵字(在"*"號(hào)前的那個(gè)),所以按KeilC編譯環(huán)境來說就把他編譯成指向內(nèi)ram的指針變量了,這也是初學(xué)C51的朋友們不理解各個(gè)存儲(chǔ)類型的關(guān)鍵字定義而造成的bug。特別是當(dāng)工程中的默認(rèn)的存儲(chǔ)區(qū)類為large時(shí),又把tmp[10]聲明為uchartmp[10]時(shí),這樣的bug是很隱秘的不容易被發(fā)現(xiàn)。第2種情況:ucharxdata*datapstr;pstr=tmp;這種情況是沒問題的,這樣的使用方法是指在內(nèi)ram分配一個(gè)指針變量("*"號(hào)后的data關(guān)鍵字的作用),而且這個(gè)指針本身指向xdata區(qū)("*"前xdata關(guān)鍵字的作用)。編譯后的匯編代碼如下。MOV0x08,#tmp(0x00)
;0x08和0x09是在內(nèi)ram區(qū)分配的pstr指針變量地址空間MOV0x09,#tmp(0x00)這種情況應(yīng)該是在這里所有介紹各種情況中效率最高的訪問外ram的方法了,請(qǐng)大家記住他。第3種情況:ucharxdata*xdatapstr;pstr="tmp";這中情況也是對(duì)的,但效率不如第2種情況。編譯后的匯編代碼如下。MOVDPTR,#0x000A
;0x000A,0x000B是在外ram區(qū)分配的pstr指針變量地址空間MOVA,#tmp(0x00)MOV@DPTR,AINCDPTRMOVA,#tmp(0x00)MOVX@DPTR,A這種方式一般用在內(nèi)ram資源相對(duì)緊張而且對(duì)效率要求不高的項(xiàng)目中。第4種情況:uchardata*xdatapstr;pstr="tmp";如果詳細(xì)看了第1種情況的讀者發(fā)現(xiàn)這種寫法和第1種很相似,是的,同第1種情況一樣這樣也是有bug的,但是這次是把pstr分配到了外ram區(qū)了。編譯后的匯編代碼如下。MOVDPTR,#0x000A
;0x000A是在外ram區(qū)分配的pstr指針變量的地址空間MOVA,#tmp(0x00)MOVX@DPTR,A第5種情況:uchar*datapstr;pstr="tmp";大家注意到"*"前的關(guān)鍵字聲明沒有了,是的這樣會(huì)發(fā)生什么事呢?下面這么寫呢!對(duì)了用齊豫的一首老歌名來說就是“請(qǐng)跟我來”,請(qǐng)跟我來看看編譯后的匯編代碼,有人問這不是在講C51嗎?為什么還要給我們看匯編代碼。C51要想用好就要盡可能提升C51編譯后的效率,看看編譯后的匯編會(huì)幫助大家盡快成為生產(chǎn)高效C51代碼的高手的。還是看代碼吧!MOV0x08,#0X01
;0x08-0x0A是在內(nèi)ram區(qū)分配的pstr指針變量的地址空間MOV0x09,#tmp(0x00)MOV0x0A,#tmp(0x00)注意:這是新介紹給大家的,大家會(huì)疑問為什么在前面的幾種情況的pstr指針變量都用2byte空間而到這里就用3byte空間了呢?這是KeilC的一個(gè)系統(tǒng)內(nèi)部處理,在KeilC中一個(gè)指針變量最多占用3byte空間,對(duì)于沒有聲明指針指向存儲(chǔ)空間類型的指針,系統(tǒng)編譯代碼時(shí)都強(qiáng)制加載一個(gè)字節(jié)的指針類型分辯值。具體的對(duì)應(yīng)關(guān)系可以參考KeilC的help中C51User'sGuide。第6種情況:uchar*pstr;pstr="tmp";這是最直接最簡(jiǎn)單的指針變量聲明,但他的效率也最低。還是那句話,大家一起說好嗎!編譯后的匯編代碼如下。MOVDPTR,#0x000A
;0x000A-0x000C是在外ram區(qū)分配的pstr指針變量地址空間MOVA,#0x01MOV@DPTR,AINCDPTRMOVDPTR,#0x000AMOVA,#tmp(0x00)MOV@DPTR,AINCDPTRMOVA,#tmp(0x00)MOVX@DPTR,A這種情況很類似第5種和第3種情況的組合,既把pstr分配在外ram空間了又增加了指針類型的分辨值。keil錯(cuò)誤
2011-04-1809:41:29|
分類:
\o"單片機(jī)"單片機(jī)|舉報(bào)|字號(hào)
訂閱C51編譯器識(shí)別錯(cuò)類型有三種1、致命錯(cuò)誤:偽指令控制行有錯(cuò),訪問不存在的原文件或頭文件等。2、語(yǔ)法及語(yǔ)義錯(cuò)誤:語(yǔ)法和語(yǔ)義錯(cuò)誤都發(fā)生在原文件中。有這類錯(cuò)誤時(shí),給出提示但不產(chǎn)生目標(biāo)文件,錯(cuò)誤超過一定數(shù)量才終止編譯。3、警告:警告出現(xiàn)并不影響目標(biāo)文件的產(chǎn)生,但執(zhí)行時(shí)有可能發(fā)生問題。程序員應(yīng)斟酌處理。D.1致命錯(cuò)誤C_51FATAL_ERRORACTION:<當(dāng)前行為>LINE:<錯(cuò)誤所在行>ERROR:<錯(cuò)誤信息>terminated或C_51FATALERRORACTION:<當(dāng)前行為>FILE:<錯(cuò)誤所在文件>ERROR:<錯(cuò)誤信息>terminatedC_51TERMINATEDC_51(1)ACTION的有關(guān)信息*PARSINGINVOKE-/#PRAGMA_LINE在對(duì)#pragma指明的控制行作此法分析時(shí)出錯(cuò)。*ALLOCATINGMEMORY系統(tǒng)分配存儲(chǔ)空間時(shí)出錯(cuò)。編譯較大程序需要512k空間。*OPENINGINPUT_FILE打開文件時(shí),未找到或打不開源文件/頭文件。*CREATELIST_FILE/OBJECT_FILE/WORK_FILE不能創(chuàng)建上述文件??赡艽疟P滿或文件已存在而且寫保護(hù)。*PARSINGSOURCE_FILE/ANALYZINGDECLARATIONS分析源程序時(shí)發(fā)現(xiàn)外部引用名太多。*GENERATINGINTERMEDIATECODE源代碼被翻譯成內(nèi)部偽代碼,錯(cuò)誤可能來源于函數(shù)太大而超過內(nèi)部極限。*WRITINGTOFILE在向文件(work,list,prelist或objectfile)寫時(shí)發(fā)生錯(cuò)誤。(2)ERROR的有關(guān)信息*MEMORYSPACEEXHAUSTED所有可用系統(tǒng)空間耗盡。至少需要512k字節(jié)空間。沒有足夠空間,用戶必須檢查常駐內(nèi)存的驅(qū)動(dòng)程序是否太多。*FILEDOESNOTEXISTFILE行定的文本文件名未發(fā)現(xiàn)。*CAN’TCREATFILEFILE行定義的文件不能被創(chuàng)建。*SOURCEMUSTCOMEFROMADISK_FILE源文件和頭文件必須存在于硬盤或軟盤上??刂婆_(tái)、CON、CI或類似設(shè)備不允許作為輸入文件。*MORETHAN256SEGMENTS/PUBLICS/EXTERNALS受OMF_51的歷史限制,一個(gè)源程序不能超過256個(gè)各種函數(shù)的類型段,256個(gè)全局變量,256個(gè)公共定義或外部引用名。不使用為變量可以減少使用的段數(shù)。使用static存儲(chǔ)類型說明符可減少全局變量的使用數(shù)目。合理調(diào)整定義性說明的位置可減少外部引用名的使用數(shù)目。*FILEWRITEERROR當(dāng)向list、prelist、work或object文件中寫內(nèi)容時(shí),由于空間不夠而發(fā)生錯(cuò)誤。*NON_NULLARGUMENTEXPECTED所選的控制參數(shù)需要一個(gè)括號(hào)內(nèi)的變量,如一個(gè)文件夾或一個(gè)數(shù)。*“(”AFTERCONTROLEXPECTED變量的左括號(hào)丟失。*“)”AFTERPARAMETEREXPECTED變量的右括號(hào)丟失。*RESPECIFIEDORCONFLICTINGCONTROL所選的控制參數(shù)與前面發(fā)生沖突或重復(fù),例如CODE和NOCOND*BADDECIMALNUMBER控制參數(shù)的數(shù)字含有非法數(shù),需要使用十進(jìn)制數(shù)。*OUTOFRANGEDECIMALNUMBER控制參數(shù)的數(shù)字越界,例如OPTIMIZE的參量為0-5。*IDENTIFIEREXPECTED控制參數(shù)DEFINE需要一個(gè)標(biāo)識(shí)符做參量,與C語(yǔ)言的規(guī)則相同。*PARSESTACKOVERFLOW分析棧溢出??赡苁窃闯绦虬貏e復(fù)雜的表達(dá)式,或功能塊嵌套數(shù)超過15。*PREPOCESSOR:MACROTONESTED宏擴(kuò)展期間,預(yù)處理器的棧耗用太大。表明宏嵌套太多,或有遞歸宏定義。*PREPOCESSOR:LINETOOLONG(510)宏擴(kuò)展后行超過510個(gè)字符。*CAN’THAVEGENERALCONTROLININVOCATIONLINE一般控制(如EJECT)不能是命令行的一部分,應(yīng)將它們放入源文件“pragma”預(yù)處理行中。D.2語(yǔ)法及語(yǔ)義錯(cuò)誤D.2.1錯(cuò)誤格式這類錯(cuò)誤在列表文件中產(chǎn)生如下格式的信息:***ERROR<number>INLINE<line>OF<file>:errormessage***WARING<number>INLINE<line>OF<file>:warningmessage<number>表示錯(cuò)誤行;<line>表示源文件或頭文件中與錯(cuò)誤或警告相關(guān)的行;<file>指明了錯(cuò)誤所在的源文件或頭文件;D.2.2錯(cuò)誤信息及可能發(fā)生的原因*ERROR100:unprintablecharacter0x??skipped源文件中發(fā)現(xiàn)非法字符(注意,注解內(nèi)的字符不做檢查)。*ERROR101:unclosedstring串未用引號(hào)結(jié)尾。*ERROR102:stringtoolong串不得超過511個(gè)字符。為了定義更長(zhǎng)的串,用戶必須使用續(xù)行符‘\’邏輯的繼續(xù)該串,在詞匯分析時(shí)遇到以該符號(hào)結(jié)尾的行會(huì)與下行連接起來。*ERROR103:invalidcharacterconstant試圖再聲明一個(gè)已定義的宏,已存在的宏可以用#undef指令刪除。預(yù)定義的宏不能刪除。*ERROR104:identifierexpected預(yù)處理器指令期望產(chǎn)生一個(gè)標(biāo)示符,如ifdef<name>。*ERROR105:unclosedcomment當(dāng)注解無(wú)結(jié)束界定符(*/)時(shí)產(chǎn)生此錯(cuò)誤。*EROOR106:unbalanced#if-endifcontrolsendif的數(shù)量與if或ifdef的數(shù)量不匹配。*ERROR107:includefilenestingexceeds9include指令后的文件名無(wú)效或丟失*ERROR108:expectedstring,如#error“string”預(yù)處理器指令期望一個(gè)串變量。*ERROR109:<usererrortext>由#error偽指令引入的錯(cuò)誤信息以錯(cuò)誤信號(hào)形式顯示。*ERROR110:missingdirective預(yù)處理行#后缺少偽指令。*ERROR111:unknowndirective預(yù)處理行#后不是偽指令。*ERROR112:misplaced‘elif’*ERROR113:misplaced‘else’*ERROR114:misplaced‘endif’指令elif/else/endif只有在if、ifdef、ifndef指令內(nèi)才是合法的。*ERROR117:badintegerexpressionif/elif指令的數(shù)值表達(dá)式有語(yǔ)法錯(cuò)誤。*ERROR118:missing’(‘a(chǎn)ftermacroidentifier宏調(diào)用中實(shí)參表的左括號(hào)丟失*ERROR119:reuseofmacroformalparameter宏定義形參名重復(fù)使用*ERROR120:‘C’unexpectedinformallist形參表中不允許有字符‘c’,應(yīng)用逗號(hào)代替*ERROR121:missing‘)’afteractualparameter宏調(diào)用實(shí)參表的右括號(hào)丟失*ERROR122:illegalmacroinvocation宏調(diào)用的實(shí)參表與宏定義中的形參表不同*ERROR123:missingmacronameafter‘define’#define偽指令后缺預(yù)定義的宏*ERROR124:expectedmacroformalparameter宏定義要求形參名*ERROR125:declaratertoocomplex說明過于復(fù)雜*ERROR126:type-stackunderflow對(duì)象的聲明至多只能包含20個(gè)類型修飾符(【】,*,(),)錯(cuò)誤126經(jīng)常在錯(cuò)誤125之前,兩者一起發(fā)生。*ERROR127:invalidstorageclass對(duì)象用無(wú)效的存儲(chǔ)類所說明。當(dāng)在函數(shù)外用auto/register存儲(chǔ)時(shí)會(huì)發(fā)生這種情況。*ERROR128:memoryspace:illegalmemoryspace‘memoryspace’used函數(shù)參數(shù)的存儲(chǔ)類由存儲(chǔ)模式(SMALLLARGECOMPACT)決定用戶不能改變,使用不同于存儲(chǔ)模式的自動(dòng)變量應(yīng)該為靜態(tài)的存儲(chǔ)類*ERROR129:missing’;’before‘token’該錯(cuò)誤表示分號(hào)丟失,通常該錯(cuò)誤會(huì)引發(fā)一連串的錯(cuò)誤,引發(fā)的這些錯(cuò)誤無(wú)關(guān)緊要。因?yàn)槿鄙俜痔?hào)后編譯器不能做正確的語(yǔ)法分析*ERROR130:valueoutofrangeusing或interrupt指令后參數(shù)越限。using用的寄存器組號(hào)位0-3,interrupt需要0-15的中斷號(hào)*ERROR131:duplicatefunction-parameter函數(shù)中形參名重復(fù),形參名應(yīng)彼此不同*ERROR132:notinformalparameterlist函數(shù)內(nèi)參數(shù)聲明使用的名字未出現(xiàn)在參數(shù)表中*ERROR133:charfunction(v0,v1,v2)Char*v0,*v1,*v5;/*’v5’在形參中未出現(xiàn)*ERROR134:xdata/idata/pdata/dataonfunctionnotpermitted函數(shù)總是駐留于0x5xxxx的code存儲(chǔ)區(qū),不能位于xdata/idata/pdata/data空間*ERROR135:badstorageclassforbit位變量的定義可以接受static或extern的存儲(chǔ)類,用REGIESTER和ALIEN都是非法的*ERROR136:‘void’onvariable‘void’類型只允許作為函數(shù)的返回類型或與指針類型合用(void*)*ERROR137:illegalparametertype:’function’函數(shù)參數(shù)的類型不能是函數(shù),然而函數(shù)指針可以作為參數(shù)*ERROR138:interrupt()maynotreceiveorreturnvalue(s)中斷函數(shù)既不能有參數(shù)又不能有返回值*ERROR139:illegaluseof‘a(chǎn)lien’關(guān)鍵字alien將函數(shù)定義為PL/M51規(guī)定的過程與函數(shù)結(jié)構(gòu)。這意味著C函數(shù)中有參數(shù)的縮記符號(hào)(即funct(…);)時(shí)是不能用alien的*ERROR140:bitinillegalmemory-space位變量的定義可包含修飾符DATA,如果無(wú)修飾符則假定為DATA。因?yàn)槲蛔兞渴冀K位于0x4xxx的內(nèi)部數(shù)據(jù)存儲(chǔ)器中,當(dāng)試圖采用其他存儲(chǔ)空間就會(huì)產(chǎn)生這個(gè)錯(cuò)誤。*ERROR141:NEAR<token>:expected<token>編譯器所見的單詞是錯(cuò)誤的。期望正確的單詞*ERROR142:invalidbaseaddressSfr說明中的基址有錯(cuò)。有效基址為0x80-0xff。如果聲明采用base^pos形式,則基址是8的整數(shù)倍*ERROR143:invalidabsolutebitpositionSbit說明中位地址必須在0x80-0xff之間*ERROR144:base^pos:invalidbitpositionSbit說明中位pos必須在0~7之間*ERROR145:undeclaredsfrSfr未說明*ERROR146:invalidsfr絕對(duì)位地址說明(base^pos)包含無(wú)效的基地址。這個(gè)基地址必須與sfr名相對(duì)應(yīng)*ERROR147:objecttoolarge對(duì)象不能超過65536(64k)字節(jié)*ERROR148:fieldnotpermittedinunion聯(lián)合不能包含位成員,這個(gè)限制是由8051結(jié)構(gòu)決定的。*ERROR149:functionmemberinstruct/union結(jié)構(gòu)或者聯(lián)合不能包含函數(shù)類型的成員。但是指向函數(shù)的指針是允許的*ERROR150:bitmemberinstruct/union結(jié)構(gòu)或者聯(lián)合不能包含位類型的成員,這個(gè)限制是由8051結(jié)構(gòu)決定的*ERROR151:selfrelativestruct/union結(jié)構(gòu)或者聯(lián)合不能包含自身*ERROR152:bitfieldtypetoosmallfornumberofbits位域聲明中指定的位數(shù)超過所給原型中位的數(shù)量*ERROR153:namedbit-fieldcannothave0width命名的域?qū)挾葹?錯(cuò)誤,只有未命名的位域允許是0寬度*ERROR154:protofield無(wú)指向位域指針的類型*ERROR155:char/intrequiredforfields位域基類型要求char或int類型,unsignedchar或unsignedint也有效*ERROR156:alienpermittedonfunctiononlyAlien只能用于函數(shù)*ERROR157:var_parmsonalienfunction有變參數(shù)的函數(shù)不能用alien,因?yàn)镻L/M51函數(shù)只能用固定數(shù)量的參數(shù)*ERROR158:functioncontainsunnamedparameter函數(shù)定義的參數(shù)表中包含無(wú)名參數(shù)。無(wú)名參數(shù)只允許用于函數(shù)的原型中*ERROR159:typefollowsvoid函數(shù)原型聲明中可含一個(gè)空的參數(shù)表f(void)。Void后不能再用其他類型定義*ERROR160:voidinvalidVoid類型只能與指針合用或表明函數(shù)沒有返回值*ERROR161:formalparameterignored函數(shù)內(nèi)的外部函數(shù)引用聲明使用了無(wú)類型的參數(shù)表。例如“extern(a,b,c);”要求形參表*ERROR162:duplicatefunction-parameter函數(shù)內(nèi)參數(shù)名重復(fù)*ERROR163:unknownarraysize一般的不管是一維數(shù)組還是多維數(shù)組或外部數(shù)組,都需要指定數(shù)組的大小,這個(gè)大小是由編譯器的初始化時(shí)計(jì)算,這個(gè)錯(cuò)誤表明試圖為一個(gè)未定維的數(shù)組使用sizeof運(yùn)算符,會(huì)哦著一個(gè)多維數(shù)組的附加元素未定義。*ERROR164:ptrtonull這一個(gè)錯(cuò)誤通常是由前一個(gè)錯(cuò)誤造成的*ERROR165:ptrtobit指向位的指針不是合法的類型*ERROR166:arrayoffunction數(shù)組不能包含函數(shù),但可能包含指向函數(shù)的指針。*ERROR167:arrayoffields位域不能安排為數(shù)組*ERROR168:arrayofbit數(shù)組沒有位類型*ERROR169:functionreturnsfunction函數(shù)不能返回函數(shù),但可以返回一個(gè)指向函數(shù)的指針*ERROR170:functionreturnsarray函數(shù)不能返回?cái)?shù)組,但可返回指向數(shù)組的指針*ERROR171:missingenclosingswithBreak/continue語(yǔ)句只能出現(xiàn)在for,while,dowhile或switch語(yǔ)句中間。*ERROR172:missingenclosingswithCase語(yǔ)句只能用在switch語(yǔ)句中*ERROR173:missingreturn-expression返回類型不是integer的函數(shù)必須包含一條代表達(dá)式的return語(yǔ)句。由于要與老版本兼容,編譯器對(duì)返回整形值的函數(shù)不做檢查*ERROR174:return-expressiononvoid-functionVoid函數(shù)不能返回值,因此不能包含帶表達(dá)式return的語(yǔ)句*ERROR175:duplicatecasevalue每個(gè)case語(yǔ)句必須包含一個(gè)常量表達(dá)式做其變量,這個(gè)值不能在switch語(yǔ)句的各級(jí)中出現(xiàn)多次*ERROR176:morethanonedefaultSwitch語(yǔ)句中不能包含多于一個(gè)的default語(yǔ)句*ERROR177:differentstruct/union賦值或參數(shù)傳遞中使用了結(jié)構(gòu)/聯(lián)合的不同類型*ERROR178:struct/unioncomparisonillegal根據(jù)ANSIC,兩個(gè)結(jié)構(gòu)或聯(lián)合的比較是不允許的*ERROR179:cannot/castfrom/tovoid-type將void類型轉(zhuǎn)化為其他類型數(shù)據(jù)或?qū)⑵渌愋娃D(zhuǎn)化為void類型都是非法的*ERROR180:cannotcastto’function’轉(zhuǎn)化為function是非法的,使用函數(shù)指針指向不同的函數(shù)*ERROR181:incompatibleoperand在所給的運(yùn)算符中至少有一個(gè)操作符類型是無(wú)效的*ERROR182:pointtodifferentobject報(bào)告指針使用不一致*ERROR183:unmodifiablevalue預(yù)修改的對(duì)象位于CODE存儲(chǔ)區(qū),因而不能修改*ERROR184:sizeof:illegaloperandSizeof運(yùn)算符不能決定函數(shù)或位域大小*ERROR185:differentmemoryspace對(duì)象說明的存儲(chǔ)空間與前面的不一致*ERROR186:invaliddereference這條錯(cuò)誤信息可能由編譯器內(nèi)部問題產(chǎn)生的*ERROR187:notanlvalue所需參量必須是可變對(duì)象的地址*ERROR188:unknownobjectsize無(wú)法計(jì)算對(duì)象的大小,因?yàn)槿鄙贁?shù)組的維數(shù)或因?yàn)橥ㄟ^void指針的間接訪問*ERROR189:‘&’onbit/sfrillegal地址操作符‘&’不允許用于位對(duì)象或sfr*ERROR190:’&’:notanlvalue地質(zhì)部是可變的對(duì)象,不能作為左值*ERROR191:‘&’onconstant試圖為所列類型常數(shù)建立指針*ERROR192:‘&’onarray/function地址操作符&不允許用于數(shù)組或函數(shù),函數(shù)和數(shù)組本身都代表了地址*ERROR193:illegalop-type(s)*ERROR193:illegaladd/subonptr*ERROR193:illegaloperationonbit(s)*ERROR193:badoperandtype當(dāng)一個(gè)表達(dá)式使用給定運(yùn)算符的非法操作類型時(shí)就會(huì)出現(xiàn)該錯(cuò)誤,使用個(gè)定運(yùn)算符的非法操作類型的無(wú)效的表達(dá)式,例如bit+bit,ptr+ptr,或ptr*<any>。錯(cuò)誤信息包括引起錯(cuò)誤的運(yùn)算符。下列運(yùn)算可使用位操作符賦值(=)OR/復(fù)合OR(|,|=)AND/復(fù)合AND(&,&=)XOR/復(fù)合XOR(^,^=)位或常數(shù)的安位比較(==,!=)取反(~)*ERROR194:’*’indirectiontoobjectofunknownsize間接操作符*不能用于void指針(void*),因?yàn)橹羔標(biāo)傅膶?duì)象的大
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年一級(jí)建造師考試核心知識(shí)點(diǎn)與實(shí)操題庫(kù)大全
- 2026年鋼琴演奏基本技術(shù)與音樂鑒賞考核題
- 2026年社交媒體營(yíng)銷技巧與實(shí)踐能力試題
- 2026年英語(yǔ)教育托福聽力技巧與解題策略題庫(kù)
- 2026年語(yǔ)言培訓(xùn)教師課堂組織實(shí)操練習(xí)題
- 2026年電氣工程師考試電工基礎(chǔ)理論試題解析
- 2026年金融分析師投資策略分析題集
- 2026年房地產(chǎn)銷售顧問專業(yè)知識(shí)筆試模擬題
- 2026年編程達(dá)人進(jìn)階訓(xùn)練算法與數(shù)據(jù)結(jié)構(gòu)核心題集
- 2026年物流管理專業(yè)知識(shí)測(cè)試題及解析手冊(cè)
- 2025年及未來5年市場(chǎng)數(shù)據(jù)中國(guó)軟包裝用復(fù)合膠行業(yè)市場(chǎng)調(diào)研分析及投資戰(zhàn)略咨詢報(bào)告
- 斜拉橋的未來發(fā)展
- 柴油發(fā)電機(jī)操作與維護(hù)手冊(cè)
- 巡察流程培訓(xùn)會(huì)課件
- 項(xiàng)目管理施工合同范本
- 全國(guó)物業(yè)管理法律法規(guī)及案例解析
- 抖音來客本地生活服務(wù)酒旅酒店民宿旅游景區(qū)商家代運(yùn)營(yíng)策劃方案
- 北侖區(qū)打包箱房施工方案
- 車載光通信技術(shù)發(fā)展及無(wú)源網(wǎng)絡(luò)應(yīng)用前景
- 2026屆上海市金山區(qū)物理八年級(jí)第一學(xué)期期末調(diào)研試題含解析
- 2026年數(shù)學(xué)競(jìng)賽希望杯-三年級(jí)100題培訓(xùn)題練習(xí)含答案
評(píng)論
0/150
提交評(píng)論