Compiler construction 微芯片XC16中函数的绝对地址

Compiler construction 微芯片XC16中函数的绝对地址,compiler-construction,function-pointers,pic,microchip,xc16,Compiler Construction,Function Pointers,Pic,Microchip,Xc16,设备: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, 0x82

设备: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
我已在a*.h中声明了同样的情况

extern void D1(void);
现在我将D1传递给一个表读取函数

nowPlaying.file1 = (unsigned long) D1;
function(nowPlaying.file1);
我的问题是,如果D1的地址高于0x8000,则例程不正确。我尝试了大小代码模型,但结果是一样的。我认为这是由于指针的16位限制。是否有任何方法可以直接从代码中访问D1的绝对地址。可能是内置函数或宏之类的东西

请注意,编译器手册中说明:

MPLAB XC16 C编译器完全支持指向函数的指针 允许间接调用函数。函数指针总是 16位宽

我把同样的问题贴在了


正如我在electronics.stackexchange.com上所写的那样,你基本上是在对编译器撒谎,将其转换为
无符号长
,而它根本不是无符号长。这很可能会导致问题

如果从D1开始的内容是符合C调用约定的代码,
D1
应声明为
extern void D1(void)
,并且所有获取其地址的结构成员、变量和参数应声明为
void(*D1)(void)
,您可以使用语法
(*var)(
)通过这些值调用它。我不知道
nowPlaying.file1
变量的作用是什么:如果
function()
声明正确,您也可以调用
function(D1)
,即如上所述


如果它是数据,它应该是
constshortd1[]
,您不需要汇编程序:您可以在C中提供值作为
constshortd1[]={…}。编译器应将D1放入代码段,因为它是
const

dspic闪存大小可以大于16位。您的部件有128kb的代码闪存。您想如何将其填充为16位整数?

@downvoter请解释。请告诉我们为什么不应该使用为此目的提供的语法键入函数指针,以及为什么将其强制转换为无符号的long和back更为优越。请澄清,.s文件中的内容是真正的代码还是数据,正如多次询问的那样;请定义“函数不正确”;请在这里继续整个对话,而不是回到electronics.stackexchange.com。否则我看不出你在这里发帖的意义。