首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >微芯片XC16中函数的绝对地址

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

Stack Overflow用户
提问于 2013-02-02 08:10:35
回答 2查看 1.7K关注 0票数 1

设备: dsPIC33FJ128GP802

我有一些*.s文件如下

代码语言:javascript
复制
.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中宣布了同样的情况。

代码语言:javascript
复制
extern void D1(void);

现在,我将D1传递给表读取函数。

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2013-02-03 05:59:39

正如我在electronics.stackexchange.com上所写的,您基本上是在欺骗编译器关于unsigned long,将其转换为unsigned long,而它根本不是一个无符号的长。这很可能会在赛道上引起问题。

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

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

票数 0
EN

Stack Overflow用户

发布于 2016-05-31 11:38:32

dspic闪存大小可以大于16位。您的部分有128 has的代码闪存。你想怎么把它塞进一个16位的整数里?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14659962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档