我在我的项目中两次遇到这个问题,最后一次我使用了一种肮脏的解决方案。
平台:PIC18F87J60,XC8 v1.12
我正在尝试使用函数指针指向可能位于我的 ROM 上半部分(> = 0x10000)的函数。这意味着指针本身需要为 17 位或更大(最多 20 位)才能处理这样的函数。
这是相关的代码片段(简化):
void test(void) @ 0x1C000
{
printf("function pointer called!\r\n");
}
void main(void) {
void (*testPointer) (void) = &test;
//Now testPointer contains 0x0C000
(*testPointer)(); //Doesn't call test. Instead it jumps to 0x0C000
}
发生的事情是测试实际上从未被调用。当我使用调试器 ( PICKIT 3 ) 时,我可以看到 testPointer 中的值是 0x0C000。似乎指针中的地址被四舍五入到最大只有 16 位,而且这种情况总是会发生。但是当我将 test() 放在 0x10000 以下的某个地方时,一切正常,因为指针只需要最大 16 位。
当我从设备中读回程序时,test() 确实位于 0x1C000,所以这不是问题,代码就在那里。
上次我通过将文字 long 转换为指针来解决这种情况,这很有效,但它很脏,现在我想避免它。
有没有人认识到这个问题?这是编译器错误吗?如果是这样,Microchip 是否已经知道这一点?有什么干净的解决方法吗?XC8 编译器是否完全支持 20 位 const 指针?
编辑:修复 &testPointer(); 上面代码中的错字 --> (*testPointer()); (不,这不是我的问题)