器件: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位宽。
我在
发布了同样的问题答案 0 :(得分:0)
正如我在electronics.stackexchange.com上所写的那样,你基本上向编译器说谎D1
,将其转换为unsigned long
,当它不是无符号长整数时。这很可能会导致问题进入轨道。
如果从D1开始的东西是符合C调用约定的代码,那么D1
应该被声明为extern void D1(void)
,并且所有结构成员以及取其地址的变量和参数应该是声明为void (*D1)(void)
,您可以使用语法(*var)()
通过这些值调用它。我不知道nowPlaying.file1
变量的用途:如果function(D1)
被正确声明,您也可以致电function()
,如上所述。
如果是数据,则应为const short D1[]
,并且您不需要汇编程序:您可以将C中的值提供为const short D1[] = {...};
。编译器应将D1放入代码段,因为它是const
。
答案 1 :(得分:0)
dspic闪存大小可以大于16位。你的部件有128kb代码闪存。你想如何在16位int中填充它?