C30用户手册指出,近指针和远指针均为16位宽。那么如何寻址24位宽的完整代码存储空间呢?
我很困惑,因为我有一个汇编函数(从C调用)返回程序计数器(从堆栈),其中发生了陷阱错误。我很确定它会在返回前设置w1和w0。
在C中,返回值被定义为函数指针:
void (*errLoc)(void);调用是这样的:
errLoc = getErrLoc();当我现在看errLoc时,它是一个16位的值,我只是不认为这是正确的。还是真的是这样?函数指针(或任何指针)可以不访问整个代码地址空间吗?
所有这些都与一个陷阱地址错误有关,我在过去48小时内一直在试图找出这个错误。
发布于 2020-06-24 15:21:52
我看到您正在尝试使用dsPIC33Fxxxx/PIC24Hxxxx故障中断陷阱示例代码。
问题是dsPIC33的指针大小(通过MPLAB 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))记录陷阱位置)
https://stackoverflow.com/questions/48415007
复制相似问题