2013-02-02 53 views
1

设备: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

+0

请澄清,因为你已经多次被问过,.s文件中的东西是真的代码还是数据;请定义'功能不正确';并请继续在这里的整个对话而不是回到electronics.stackexchange.com它来自哪里。否则,我根本看不到你在这里发布的观点。 – EJP

回答

0

正如我在写electronics.stackexchange.com,你基本上是骗来的编译器有D1,通过铸造,为unsigned long,当它根本不是无符号的。这很可能导致赛道出现问题。

如果开始在D1的东西代码,可以符合C调用约定,D1应被宣布为extern void D1(void),所有的结构成员和变量,并且利用其地址参数应该声明为void (*D1)(void),你可以使用语法(*var)()通过这些值进行调用。我不知道nowPlaying.file1变量的用途是什么:如果function()正确声明,也可以直接拨打function(D1),即如上所述。

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

+0

@downvoter请解释。告诉我们为什么函数指针不应该使用为此目的而提供的语法来输入,为什么它优于将其转换为无符号长整数和后退整数。 – EJP

0

dspic flash size可以大于16bits。你的部分有128kb的代码闪存。你想如何填充16位整数?