【发布时间】:2013-02-02 08:10:35
【问题描述】:
器件:dsPIC33FJ128GP802
我有一些 *.s 文件如下
.global _D1
.section .speex, code
_D1:
.pword 0x66C821, 0x1B0090, 0xD96C36, 0x9B60B0, 0xDD4E36, 0xBF4E53
.pword 0xD1098B, 0x719BD9, 0x873989, 0x003B69, 0x279035, 0xED4244
.pword 0xE1403C, 0x54D439, 0x826550, 0xC59627, 0xDD0432, 0x88FA29
我已经在 *.h 中声明了同样的内容
extern void D1(void);
现在我将 D1 传递给表读取函数
nowPlaying.file1 = (unsigned long) D1;
function(nowPlaying.file1);
我的问题是,如果D1的地址在0x8000以上,则例程不正确。我尝试了大大小小的代码模型,但结果是一样的。我认为这是由于指针的 16 位限制。有什么方法可以直接从代码中访问 D1 的绝对地址。可能是内置函数或宏之类的东西。
请注意编译器手册说:
MPLAB XC16 C 编译器完全支持指向函数的指针,它 允许间接调用函数。函数指针总是 16 位宽。
我已经发布了同样的问题
【问题讨论】:
-
请澄清,正如您多次被问到的那样,.s 文件中的内容究竟是代码还是数据;请定义“功能不正确”;请在此处继续整个对话,而不是返回它来自的 electronics.stackexchange.com。否则我根本看不到你在这里发帖的意义。
标签: compiler-construction function-pointers pic microchip xc16