問:怎么來改正“fixup”錯誤?
答:這里假定你已經(jīng)知道如何來定位導(dǎo)致fixup錯誤的代碼位置。如果不清楚,請參看前面的問答“怎么來定位"Fixup error"信息?”。
Fixup錯誤通常是發(fā)生在PICC編譯器轉(zhuǎn)換兩個不同bank指針類型時。在大多數(shù)的場合,這個錯誤是發(fā)生在傳遞一個bank指針給某一個只接受其他bank指針的函數(shù),或者是分配一個bank指針給另外一個bank的指針。
要修正這個錯誤,你需要改變函數(shù)的聲明,或者用bankx限定符來改變指針使它成為正確的指針類型。
要注意的是'const'指針可以訪問所有的bank但是它不能被寫入。還有,在PIC中檔單片機(jī)里,bank0指針式是可以指向bank1數(shù)據(jù)的,它并不會產(chǎn)生fixup錯誤,反之亦然(譯者注:因為PICC的指針操作是會采用FSR,F(xiàn)SR是8位的,它可以指向兩個bank的數(shù)據(jù))。同樣地,bank2指針可以指向bank3而沒有fixup錯誤,反之亦然。但是bank0或bank1指針就不能夠指向bank2或bank3了(譯者注:bank2和bank3的指針是大于8位的)。
下面是一個在指針分配上會產(chǎn)生fixup錯誤的示例:
bank2 char value; //變量在bank2里
char * ptr; //變量在bank0里
//const char * ptr; //可能的解決方法
void
func(char * param) //使用一個bank0指針作為參數(shù)
//func(bank2 char * param) //可能的解決方法
{
*param = 7;
}
int
main()
{
//下面會產(chǎn)生一個fixup錯誤,因為傳遞bank2指針給了函數(shù)
//而這個函數(shù)只接受bank0指針
func(&value);
//下面也會產(chǎn)生一個fixup錯誤,因為把一個bank2指針給bank0指針賦值
//兩個指針的寬度是不一樣的
ptr = &value;
}
還有一些fixup錯誤是因為'extern'聲明和實際的聲明不匹配而產(chǎn)生的。例如在'lib.c'里聲明了一個全局變量:
//lib.c
bank3 char var;
//end lib.c
如果extern的聲明像下面的話,就會產(chǎn)生一個fixup錯誤:
//lib.c
extern char var;
//正確的應(yīng)該是: extern bank3 char var;
//end lib.c
一個好的習(xí)慣是把所有的'extern'聲明以及函數(shù)的原型放到頭文件里。然后#include這個頭文件到需要聲明該變量的文件中去,還有需要使用該變量的文件中去。這可以讓編譯器能夠找出類型聲明的不匹配。
-
編譯器
+關(guān)注
關(guān)注
1文章
1607瀏覽量
48977 -
MPLAB
+關(guān)注
關(guān)注
9文章
215瀏覽量
66710
發(fā)布評論請先 登錄
相關(guān)推薦
評論