Microchip dsPIC33 C30功能指针大小?

时间:2018-01-24 04:48:31

标签: function-pointers

C30用户手册说明近处和远处的指针宽度为16位。 那么它如何解决24位宽的完整代码存储空间呢?

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

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

void (*errLoc)(void);

,电话是:

errLoc = getErrLoc();

当我现在看看errLoc时,它是一个16位值,我觉得这不对。或者是吗?函数指针(或任何指针)是否可以访问完整的代码地址空间?

这一切都与我试图在过去48小时内弄清楚的TRAP地址错误有关。

1 个答案:

答案 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))来记录陷阱位置)