gpt4 book ai didi

c++ - IAR C/C++ 比较运算符行为

转载 作者:行者123 更新时间:2023-11-30 04:12:59 25 4
gpt4 key购买 nike

我有以下定义:

#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

现在,如果我在这个函数中逐步进行,ident 变量在 LIS3DSH_Read 函数调用后获得值 0x3f,这没问题。我的问题是,为什么 if 子句跳转到 failureHandler? DEVICE_ID 和 ident 的值相同——都是 0x3f,如果不应该跳转到 failureHanlder()。我正在使用 IAR C/C++ 和 STM32F4 探索板开发 LIS3DSH 加速器库。这是情况的屏幕截图:If clause going wrong?!

最佳答案

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

这在过去一直困扰着我。

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

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

关于c++ - IAR C/C++ 比较运算符行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19622386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com