IAR C / C ++比较运算符的行为

内核恐慌

我有以下定义:

#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的值是相同的-如果不应该跳转到failureHanlder(),则均为0x3f。我正在使用IAR C / C ++和STM32F4 Discovery Board开发LIS3DSH加速器库。这是情况的屏幕截图:如果子句出错?

掩体

您应该输入类型if(DEVICE_ID==ident)if( (uint8_t)DEVICE_ID == (uint8_t)ident)

过去,这一直是我的问题。

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

另外,由于您具有IAR,因此不妨弹出“汇编”视图,然后查看实际上正在比较哪些寄存器和/或常量。同时打开“寄存器”视图...,这样您就可以自己查看寄存器值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C#+运算符的奇怪行为

来自分类Dev

C ++指针,++运算符行为

来自分类Dev

Ternery运算符在C ++中的奇怪行为

来自分类Dev

重载C ++赋值运算符的行为类似于Java

来自分类Dev

重载运算符“ <<” c ++的意外行为

来自分类Dev

C ++-unordered_map运算符[],意外行为

来自分类Dev

C ++中三元运算符的异常行为

来自分类Dev

C中“,”运算符的行为不清楚

来自分类Dev

Ternery运算符在C ++中的奇怪行为

来自分类Dev

比较运算符重载与转换运算符的C ++优先级

来自分类Dev

IAR中C函数的别名

来自分类Dev

C ++运算符[]

来自分类Dev

C ++运算符“?:”

来自分类Dev

比较字符串与“ <”或“>”运算符(C)

来自分类Dev

C ++ 20比较:关于歧义反向运算符的警告

来自分类Dev

C ++逻辑否定比较运算符不起作用

来自分类Dev

C- 比较运算符而不是 strcmp

来自分类Dev

C 中的字符串与运算符的比较

来自分类Dev

C#Null合并运算符与Null和Empty集合之间的OR运算符的行为不同

来自分类Dev

为什么C ++ STL容器使用“小于”运算符<而不是“等于”运算符==作为比较器?

来自分类Dev

继承的综合比较运算符会产生警告/错误:ISO C ++ 20考虑使用重载运算符'!='

来自分类Dev

C ++中的“ << / >>”运算符

来自分类Dev

C ++转换运算符

来自分类Dev

C ++运算符重载++

来自分类Dev

C ++运算符<<(void *)

来自分类Dev

+ = C ++中的运算符

来自分类Dev

C ++-重载[]运算符

来自分类Dev

C ++运算符重载

来自分类Dev

位运算符C ++