Microchip XC16中函数的绝对地址

时间:2013-02-02 08:10:36

标签: 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,  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位宽。

我在

发布了同样的问题

https://electronics.stackexchange.com/questions/56858/absolute-address-of-a-function-in-microchip-xc16

2 个答案:

答案 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中填充它?