Microchip XC16 中函数的绝对地址

问题描述 投票:0回答:2

器件: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

c function-pointers pic microchip xc16
2个回答
0
投票

正如我在 electronics.stackexchange.com 上所写的,当它根本不是 unsigned long 时,通过将其转换为

D1
,您基本上是在对编译器撒谎。这很可能会导致出现问题。

如果从D1开始的代码是符合C调用约定的代码,则

unsigned long

应声明为

D1
,并且所有采用其地址的结构体成员和变量和参数都应声明为
extern void D1(void)
,您可以使用语法
void (*D1)(void)
通过这些值来调用它。我不知道
(*var)()
变量的用途:如果正确声明
nowPlaying.file1
,您也可以调用
function(D1)
,即如上所述。

如果是数据,则应该是

function()

,并且不需要汇编器:您可以将C中的值提供为

const short D1[]
。编译器应该将 D1 按原样放入代码段中
const short D1[] = {...};
    


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.