【问题标题】:24 bit const pointers on XC8 PIC18 not workingsXC8 PIC18 上的 24 位 const 指针不起作用
【发布时间】:2013-08-13 14:06:10
【问题描述】:

我在我的项目中遇到过两次这个问题,最后一次我使用了一种肮脏的解决方案。

平台:PIC18F87J60XC8 v1.12

我正在尝试使用 函数指针 来指向可能位于我的 ROM 上半部分 (>= 0x10000) 的函数。这意味着指针本身需要为 17 位或更大(最多 20 位)才能处理这样的函数。

这是相关代码sn-p(简体):

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
}

发生的情况是 test 从未真正被调用过。当我使用调试器 (PICKIT 3) 时,我可以看到 testPointer 中的值是 0x0C000。似乎指针中的地址被四舍五入到最大只有 16 位,而且这种情况总是会发生。但是当我将 test() 放在 0x10000 以下的某个地方时,一切正常,因为指针只需要最大 16 位。

当我从设备中读回程序时 test() 确实被放置在 0x1C000 所以这不是问题,代码就在那里。

上次我通过将文字 long 转换为指针来解决这种情况,这很有效,但它很脏,现在我想避免它。

有人知道这个问题吗?这是编译器错误吗?如果是这样,Microchip 是否已经知道这一点?有什么干净的解决方法吗? XC8 编译器是否完全支持 20 位 const 指针?

编辑:修复 &testPointer(); 上面代码中的错字--> (*testPointer()); (不,这不是我的问题)

【问题讨论】:

  • 那张图片有 20 位寻址。它连接了多少内存?
  • @trojanfoe 哎呀,我的意思是 20。为了清楚起见:我说的是地址范围 0-1FFFF。没有外部存储芯片,我只使用内置 ROM。已编辑。
  • 内存有多大?
  • 您是否尝试过将您的指针声明为far rom void (*testPointer) (void) = &test;
  • 它的 16K ROM。最后一个地址是 0x1FFFF。

标签: c microchip pic18 c89


【解决方案1】:

MPLAB C18 编译器用户指南列出了一些与您的用例相关的额外存储限定符:

near/far 程序存储器对象
far 限定符用于表示位于程序存储器中的变量可以在程序存储器中的任何位置找到,或者,如果是指针,则它可以访问多达 64K 和超过 64K 的程序存储器空间。

ram/rom 预选赛
rom 限定符表示对象位于程序内存中,而ram 限定符表示对象位于数据内存中。

稍后,手册显示了创建“一个可以访问超过 64K 程序内存空间的函数指针”的示例

far rom void (*fp) (void);

XC8 手册对 far 限定符的功能不太清楚,但仍然列出了它,这强烈表明它仍然被较新的编译器识别。

【讨论】:

  • 我不确定我是否正确,但 AFAIR 使用 far 指针并非没有问题。如果前端编译发生在near 上,则可能需要调整某些指针寄存器的最高字节。但由于我是在 3 年前与 PIC 合作的,所以我可能错了。
猜你喜欢
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 2022-11-10
  • 1970-01-01
相关资源
最近更新 更多