首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Microchip dsPIC33 C30函数指针大小?

Microchip dsPIC33 C30函数指针大小?
EN

Stack Overflow用户
提问于 2018-01-24 12:48:31
回答 1查看 229关注 0票数 2

C30用户手册指出,近指针和远指针均为16位宽。那么如何寻址24位宽的完整代码存储空间呢?

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

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

代码语言:javascript
复制
void (*errLoc)(void);

调用是这样的:

代码语言:javascript
复制
errLoc = getErrLoc();

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

所有这些都与一个陷阱地址错误有关,我在过去48小时内一直在试图找出这个错误。

EN

回答 1

Stack Overflow用户

发布于 2020-06-24 15:21:52

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

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

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

代码语言:javascript
复制
unsigned long getErrLoc(void);  // Get Address Error Loc
unsigned long errLoc __attribute__((persistent));

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48415007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档