問(wèn):怎么來(lái)改正“fixup”錯(cuò)誤?
答:這里假定你已經(jīng)知道如何來(lái)定位導(dǎo)致fixup錯(cuò)誤的代碼位置。如果不清楚,請(qǐng)參看前面的問(wèn)答“怎么來(lái)定位"Fixup error"信息?”。
Fixup錯(cuò)誤通常是發(fā)生在PICC編譯器轉(zhuǎn)換兩個(gè)不同bank指針類型時(shí)。在大多數(shù)的場(chǎng)合,這個(gè)錯(cuò)誤是發(fā)生在傳遞一個(gè)bank指針給某一個(gè)只接受其他bank指針的函數(shù),或者是分配一個(gè)bank指針給另外一個(gè)bank的指針。
要修正這個(gè)錯(cuò)誤,你需要改變函數(shù)的聲明,或者用bankx限定符來(lái)改變指針使它成為正確的指針類型。
要注意的是'const'指針可以訪問(wèn)所有的bank但是它不能被寫(xiě)入。還有,在PIC中檔單片機(jī)里,bank0指針式是可以指向bank1數(shù)據(jù)的,它并不會(huì)產(chǎn)生fixup錯(cuò)誤,反之亦然(譯者注:因?yàn)镻ICC的指針操作是會(huì)采用FSR,F(xiàn)SR是8位的,它可以指向兩個(gè)bank的數(shù)據(jù))。同樣地,bank2指針可以指向bank3而沒(méi)有fixup錯(cuò)誤,反之亦然。但是bank0或bank1指針就不能夠指向bank2或bank3了(譯者注:bank2和bank3的指針是大于8位的)。
下面是一個(gè)在指針?lè)峙渖蠒?huì)產(chǎn)生fixup錯(cuò)誤的示例:
bank2 char value; //變量在bank2里
char * ptr; //變量在bank0里
//const char * ptr; //可能的解決方法
void
func(char * param) //使用一個(gè)bank0指針作為參數(shù)
//func(bank2 char * param) //可能的解決方法
{
*param = 7;
}
int
main()
{
//下面會(huì)產(chǎn)生一個(gè)fixup錯(cuò)誤,因?yàn)閭鬟fbank2指針給了函數(shù)
//而這個(gè)函數(shù)只接受bank0指針
func(&value);
//下面也會(huì)產(chǎn)生一個(gè)fixup錯(cuò)誤,因?yàn)榘岩粋€(gè)bank2指針給bank0指針賦值
//兩個(gè)指針的寬度是不一樣的
ptr = &value;
}
還有一些fixup錯(cuò)誤是因?yàn)?extern'聲明和實(shí)際的聲明不匹配而產(chǎn)生的。例如在'lib.c'里聲明了一個(gè)全局變量:
//lib.c
bank3 char var;
//end lib.c
如果extern的聲明像下面的話,就會(huì)產(chǎn)生一個(gè)fixup錯(cuò)誤:
//lib.c
extern char var;
//正確的應(yīng)該是: extern bank3 char var;
//end lib.c
一個(gè)好的習(xí)慣是把所有的'extern'聲明以及函數(shù)的原型放到頭文件里。然后#include這個(gè)頭文件到需要聲明該變量的文件中去,還有需要使用該變量的文件中去。這可以讓編譯器能夠找出類型聲明的不匹配。
-
編譯器
+關(guān)注
關(guān)注
1文章
1642瀏覽量
49311 -
MPLAB
+關(guān)注
關(guān)注
9文章
217瀏覽量
67035
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
XC8編譯器與8位PIC MCU兼容嗎?
XC8編譯器中的eeprom_read/write宏出現(xiàn)問(wèn)題
MPLAB XC8 C編譯器是否可以屏蔽/禁用有關(guān)pitch的咨詢報(bào)告?
MPLAB C18編譯器到MPLAB XC8 C編譯器的移植過(guò)程詳細(xì)中文資料概述
MPLAB XC8 C編譯器的用戶指南詳細(xì)中文資料概述免費(fèi)下載
![<b class='flag-5'>MPLAB</b> <b class='flag-5'>XC8</b> C<b class='flag-5'>編譯器</b>的用戶指南詳細(xì)中文資料概述免費(fèi)下載](https://file.elecfans.com/web1/M00/53/30/pIYBAFseQWeAOjkqAACZOYfuw-s369.png)
如何將C源代碼從MPLAB C18編譯器移植到MPLAB XC8C編譯器的詳細(xì)概述
![如何將C源代碼從<b class='flag-5'>MPLAB</b> C18<b class='flag-5'>編譯器</b>移植到<b class='flag-5'>MPLAB</b> <b class='flag-5'>XC8</b>C<b class='flag-5'>編譯器</b>的詳細(xì)概述](https://file.elecfans.com/web1/M00/52/F1/pIYBAFsYqfmAJIh9AACRTaIAtmw014.png)
MPLAB XC8入門(mén)教程之啟動(dòng)指南資料免費(fèi)下載
MPLAB C18到MPLAB XC8的移植概述
PIC16F877A 創(chuàng)建工程 (MPLAB X IDE @XC8)
![PIC16F877A 創(chuàng)建工程 (<b class='flag-5'>MPLAB</b> X IDE @<b class='flag-5'>XC8</b>)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
PIC MCC配置與XC8編譯器問(wèn)題
![PIC MCC配置與<b class='flag-5'>XC8</b><b class='flag-5'>編譯器</b>問(wèn)題](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
MPLAB XC8 PIC匯編器的簡(jiǎn)單介紹
適用于AVR MCU的MPLAB XC8 C編譯器用戶指南
![適用于AVR MCU的<b class='flag-5'>MPLAB</b> <b class='flag-5'>XC8</b> C<b class='flag-5'>編譯器</b>用戶指南](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
適用于PIC MCU的MPLAB XC8 C編譯器用戶指南
![適用于PIC MCU的<b class='flag-5'>MPLAB</b> <b class='flag-5'>XC8</b> C<b class='flag-5'>編譯器</b>用戶指南](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評(píng)論