C30用户手册说明近处和远处的指针宽度为16位。 那么它如何解决24位宽的完整代码存储空间呢?
我很困惑,因为我有一个汇编程序函数(从C调用)返回程序计数器(从堆栈)发生陷阱错误。我很确定它会在返回之前设置w1和w0。
在C中,返回值被定义为函数指针:
void (*errLoc)(void);
,电话是:
errLoc = getErrLoc();
当我现在看看errLoc时,它是一个16位值,我觉得这不对。或者是吗?函数指针(或任何指针)是否可以访问完整的代码地址空间?
这一切都与我试图在过去48小时内弄清楚的TRAP地址错误有关。
答案 0 :(得分:1)
我看到您正在尝试使用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))
来记录陷阱位置)