C语言 PIC32 设备上的指针与调试器中的预期值不匹配



关于指针行为的快速问题(我正在PIC32MX270F256D上做一个项目)。

我当前实现了以下代码:

void main(void)
{
    int size = 15;
    int check;
    int *ptr;
    ptr = &size;
    check = *ptr;
    while(1);        //just so it hangs at the end
}

现在,我正在打开可变手表的情况下逐步完成该程序。 声明大小后,我可以在监视窗口中看到 size 的值为 15,并且位于地址 0xA000FFC8(到目前为止一切顺利)。 在行ptr = &size;之后,监视窗口显示 ptr 具有值0xA000FFC8(如预期的那样)。 现在在最后一行(check = *ptr;)之后,监视窗口显示检查值为0xA000FFC8。

在我看来,这是非常简单的功能。 最后,在 while 循环中挂起时,检查的值应该为 15,不是吗? 如果是,我的代码不正确,或者Microchip IDE显然有问题? 如果没有,我错过了什么来使这项工作成为应有的工作?

谢谢。

-肖恩

注意:我使用的是MPLAB X和Microchip的XC32编译器。

这可能是一个优化问题。 编译器确定您的代码实际上没有执行任何操作,因此它不会费心生成代码。 具体来说,您的代码实际上并没有使用您存储在 check 中的值。

您可以将指针声明为 volatile,以强制编译器不对其进行优化。 即,int *ptr;变得volatile int *ptr;.

您还可以以有意义的方式使用check的值,例如将其打印出来。

printf("My pointer %p points to %u.n", ptr, check);

或者,您可以查看编译器文档并找出如何关闭优化。 调试时,不进行优化即可进行编译通常很有帮助,以便编译的代码与源代码紧密匹配。

注意:在某些时候,您将需要访问已映射到内存地址的硬件或芯片寄存器。 执行此操作时,请确保这些指向映射内存的指针是易失性的,否则您将遇到同样的问题!

最新更新