微芯片 dsPIC33 C30 函数指针大小



C30用户手册指出,近处和远处的指针宽度为16位。那么,这如何解决 24 位宽的完整代码内存空间?

我很困惑,因为我有一个汇编函数(从 C 调用(返回发生陷阱错误的程序计数器(从堆栈(。我很确定它在返回之前设置 w1 和 w0。

在 C 中,返回值定义为函数指针:

void (*errLoc)(void);

电话是:

errLoc = getErrLoc();

当我现在查看errLoc时,它是一个16位的值,我只是认为这是不正确的。还是吗?函数指针(或任何指针(是否无法访问完整的代码地址空间?

所有这些都与我在过去 48 小时内试图弄清楚的陷阱地址错误有关。

我看到您正在尝试使用dsPIC33Fxxxx/PIC24Hxxxx故障中断陷阱示例代码。

问题是dsPIC33(通过MPLAB X C30编译器(的指针大小为16位宽,但程序计数器为24位。幸运的是,getErrLoc()程序集函数确实返回了正确的大小。

但是,提供的示例 C 源代码函数签名void (*getErrLoc(void))(void)这是不正确的,因为它会将返回值视为 16 位指针。您希望将函数签名的返回类型更改为足够大,以存储下面的 24 位程序计数器值。因此,如果您选择无符号长整数作为 getErrLoc() 的返回类型,那么它将足够大,可以将 24 位程序计数器存储到 32 位无符号长整数位置。

unsigned long getErrLoc(void);  // Get Address Error Loc
unsigned long errLoc __attribute__((persistent));

(仅供参考:下次重新启动时使用__attribute__((persistent))记录陷阱位置(

最新更新