Fixup error信息是什么意思

描述

问:我得到一个信息"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文件是比较好的方法)。

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

全部0条评论

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

×
20
完善资料,
赚取积分