问:我得到一个信息"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文件是比较好的方法)。
-
数据
+关注
关注
8文章
7015浏览量
89002 -
编译器
+关注
关注
1文章
1634浏览量
49128
发布评论请先 登录
相关推荐
评论