MPLAB XC8编译器出现“fixup”错误怎么办

描述

问:怎么来改正“fixup”错误?

答:这里假定你已经知道如何来定位导致fixup错误的代码位置。如果不清楚,请参看前面的问答“怎么来定位"Fixup error"信息?”。

Fixup错误通常是发生在PICC编译器转换两个不同bank指针类型时。在大多数的场合,这个错误是发生在传递一个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这个头文件到需要声明该变量的文件中去,还有需要使用该变量的文件中去。这可以让编译器能够找出类型声明的不匹配。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分