【问题标题】:Absolute address of a function in Microchip XC16Microchip XC16 中函数的绝对地址
【发布时间】:2013-02-02 08:10:35
【问题描述】:

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

【问题讨论】:

  • 请澄清,正如您多次被问到的那样,.s 文件中的内容究竟是代码还是数据;请定义“功能不正确”;请在此处继续整个对话,而不是返回它来自的 electronics.stackexchange.com。否则我根本看不到你在这里发帖的意义。

标签: compiler-construction function-pointers pic microchip xc16


【解决方案1】:

正如我在electronics.stackexchange.com 上所写的那样,您基本上是在向编译器撒谎D1,将其转换为unsigned long,而它根本不是无符号长。这很可能会导致后续问题。

如果从 D1 开始的东西是符合 C 调用约定的代码,D1 应该声明为extern void D1(void),并且所有获取其地址的结构成员和变量和参数都应该声明为@987654325 @,您可以使用语法(*var)() 通过这些值调用它。我不知道nowPlaying.file1 变量的用途:如果function() 被正确声明,您也可以调用function(D1),即如上所述。

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

【讨论】:

  • @downvoter 请解释一下。告诉我们为什么不应该使用为此目的提供的语法来键入函数指针,以及为什么将它转换为 unsigned long 并返回更好。
【解决方案2】:

dspic 闪存大小可以大于 16 位。您的零件有 128kb 代码闪存。您想如何将其填充到 16 位 int 中?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多