問:我得到一個信息"Fixup error referencing ...";或者是"Fixup error in expression ..."
這究竟是什么意思,我該怎么做?
答:簡單地說,這意味著鏈接器指示你要去調整(fixup)對一個存儲位置的引用,因為計算出的地址是和可用的空間是不匹配的,例如:對一個字節(8位)的引用,卻要求放入一個大于0xFF的值。
在使用PICC編譯器時,這種問題比較多地發生在指針沒有被正確地聲明的情況下,例如:
bank2 char ch;
char *ptr;
ptr = &ch; //這里就會出現fixup error
這是一個fixup error,因為"ptr"是默認指向bank0數據的指針(這里ptr只有8位,而&ch是一個大于8位的一個地址)——要改正它需要讓指針也指向bank2,如下:
bank2 char *ptr;
要定位發生fixup error的原因,可以查看完整的錯誤信息。這里有一個例子:
gmain6.obj:113:Fixup overflow referencing psect rbss_1 (loc 0x8C8 (0x8C2+6), size 1, value 0xA8)
這個錯誤信息是來自PICC編譯器。這里的"size"告訴我們這是對一個字節的引用——實際上這是一個7位數據的引用,因為這個數值0xA8太大了,和7位的數據引用是不匹配的。
從信息里可知,在這里是引用了rbss_1,也就是bank1的地址,它建議了一個將對bank1的引用卻沒有截斷完整地址以適合指令的7位地址。
注意這個位置——0x8C8。這是一個出錯指令的絕對地址;請確保你已經產生了匯編列表文件,請打開編輯它。這個提供的地址是一個字節地址,因為PIC的程序空間是14位寬的,所以計算字地址時要用該地址除以2——0x8C8/2 = 0x464。
在list文件里,可以很簡單地定位到0x464:
993 0464 00A8 movwf _TempChar ;#
^^^^ location
在出錯信息里給出的值(0xA8)就是TempChar的地址——你還可以檢查map或者symbol文件來查找對應這個地址的符號(通常使用list文件是比較好的方法)。
-
數據
+關注
關注
8文章
7048瀏覽量
89070 -
編譯器
+關注
關注
1文章
1634瀏覽量
49139
發布評論請先 登錄
相關推薦
評論