1

我有以下定义:

#define DEVICE_ID   ((uint8_t)0x3f)

我有以下功能:

void LIS3DSH_Init(LIS3DSH_InitTypeDef* LIS3DSH_InitStruct)
{
//    uint8_t ctrl=0x00;
    uint8_t ident=0x00;

    LIS3DSH_LowLevel_Init();

    LIS3DSH_Read(&ident,
                 LIS3DSH_WHOAMI_REG_ADDR,
                 1);

    if(DEVICE_ID==ident)
    {
        // LIS3DSH detected
    }
    else
    {
        // LIS3DSH not detected

        failureHandler();
    }

}   // LIS3DSH_Init

现在,如果我在这个函数中一步一步地进行,在 LIS3DSH_Read 函数调用之后,ident 变量的值是 0x3f,这没关系。我的问题是,为什么该死的 if 子句会跳转到 failureHandler?DEVICE_ID 和 ident 的值相同 - 都是 0x3f,如果不应该跳转到 failureHanlder()。我正在使用 IAR C/C++ 和 STM32F4 Discovery Board 开发 LIS3DSH 加速器库。以下是情况截图:if 子句出错了?!

4

2 回答 2

1

是函数

failureHandler()

处理?如果不是,调试器的视图只是由于编译器优化而令人困惑。优化后的代码很可能对好的情况和失败的情况都使用了一个共同的“返回”代码。即使在好的情况下,调试器也会在故障路径的“出口”处停止。

于 2013-10-29T08:20:11.797 回答
1

您应该将类​​型if(DEVICE_ID==ident)转换为if( (uint8_t)DEVICE_ID == (uint8_t)ident)

这在过去对我来说一直是个问题。

是的,将 ident 声明为 volatile,出于调试目的,尝试在比较之前通过__no_operation();内部的 for 循环添加延迟。请注意,前面有 2 个下划线,而不是 1(内在 NOP 指令),并且单个 NOP 在 168MHz 板上大约需要约 29ns,通过示波器测量。

此外,由于您有 IAR,您不妨打开“程序集”视图并查看实际比较的寄存器和/或常量。也打开“寄存器”视图......这样您就可以看到寄存器值本身。

于 2013-11-03T08:56:27.970 回答