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