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))
记录陷阱位置(