2015-02-09 121 views
-3

我正面临一个非常奇怪的问题。等于运算符“==”表现得像赋值运算符“=”

- 我有一个如果条件:

if((IN_SYNC == sync_flag) || (cycle_number == spi_slot_number)) 

的条件之前,将变量“spi_slot_number”是“7”和如果条件之后它被变成“0”(这是值“cycle_number”)!!!

有没有人知道这样的事情会发生怎么样?!

重要提示:

1 - 我的代码是用C语言。

2-我在条件前后检查了堆栈,以确保没有发生堆栈损坏。

3-我的程序是一个线程程序,所以没有中断或其他线程可以中断。

4-如果我评论如果条件,每件事情都很好。

5我不知道如何生成汇编代码...

+4

通常这是来自未定义的行为和/或线程问题。 – inetknght 2015-02-09 16:45:27

+3

我们需要更多的代码,而不仅仅是一个'if'语句。 – nouney 2015-02-09 16:45:28

+4

发布更多的代码。我不相信这一点。 – 2015-02-09 16:45:31

回答

2

正如有人说,你有没有足够的共享代码实际验证你的问题。然而,我想到的是IN_SYNC标识符。这是一个标准的编码惯例,将宏放在所有大写字母上,如果它是一个宏,它可能会做一些肮脏的事情。检查IN_SYNC的定义。

另一件事 - 您的if测试有两个测试,由||分隔。运营商。尝试将两项测试分开以查看哪一项导致副作用。类似这样的:

printf("%d \n", spi_slot_number); 
if (IN_SYNC == sync_flag) { 
    /* do nothing */ 
    } 
printf("after IN_SYNC test %d \n", spi_slot_number); 
if (cycle_number == spi_slot_number) { 
    /* do nothing */ 
    } 
printf("after cycle_number test %d \n", spi_slot_number); 
+0

我做过了,条件“cycle_number == spi_slot_number”是导致问题的原因之一。 – 2015-02-09 17:46:04

+3

如果这是Wind River嵌入式编译器,请尝试检查PreProcessor输出(使用-E命令行选项)以确认没有您不期望的事情发生。如果这看起来没问题,那么使用-S命令行选项生成Assembly输出并检查机器代码。如果这看起来没问题,那么你的硬件有问题,或者你在编译器工具链中发现了一个错误(可能是链接器应该被指责?) - 并且你应该向Wind River提交一个错误报告。 – user590028 2015-02-09 17:56:42

1

如果您比较spi_slot_number的临时副本,会发生什么情况?它是否按预期工作?

void GetData(slot_id_T spi_slot_number, uint8_t* data_received, 
     uint16_t data_length, uint8_t data_is_valid_flag) 
{ 
    uint8_t cycle_number; 
    slot_id_T copy = spi_slot_number; // <- ADDED 

    cycle_number = GetCycleNumber() + 1; 
    if(cycle_number > LAST_CYCLE) 
    { 
     cycle_number = 0; 
    } 

    printf("%d \n", spi_slot_number); 

    if((IN_SYNC == sync_flag) || (cycle_number == copy)) // <- CHANGE 
    { 
     printf("%d \n", spi_slot_number); 

     switch(data_is_valid_flag) 
     { 
     case DATA_IS_VALID: 
      SendData(spi_slot_number, p_buffer, data_length); 
      break; 

     case DATA_IS_NOT_VALID: 
      IndicateDataNotValid(spi_slot_number, p_buffer, data_length); 
      break; 

     default: 
      /* Do Nothing */ 
      break; 
     } 
     } 
}