读取存储器寄存器会返回错误的值?

时间:2018-04-06 10:52:56

标签: c embedded

我试图读取存储器寄存器并检查该寄存器中的一个标志。我可以使用ST-LINK / V2调试器检查寄存器中的值。我正在使用STM8 / 128-EVAL板。

以下是我的代码示例:

#define ADDR(addr_off)  (*(volatile uint8_t*)(0x5000 + (addr_off)))
#define CAN_MCSR        ADDR(0x428)   // control/status register
#define TXOK            (1 << 3)      // Transmission OK    (CAN_MCSR)

uint8_t send(void)
{
    volatile uint8_t state;
    state = CAN_MCSR;

    if(CAN_MCSR & TXOK)             // Line 1
        return 1;   // Succeeded    // Line 2
    else                    
        return 0;   // Failed       // Line 3
}

我感到困惑,因为当我在Line 1中设置断点时,我看到使用调试器时CAN_MCSR寄存器中的值为0x0C,而值为{{ 1}}变量是state,尽管我没有在代码中的任何其他位置修改此变量。当我前进执行if语句时,它会成功并执行0x01

但是,如果我在Line 2中设置断点,而Line 2中没有断点,则Line 3中没有断点,if条件失败并执行Line 0。 / p>

什么可能导致这个问题?

更新

我猜这是时间问题,正如一些评论所暗示的那样。我尝试过以下代码段:

Line 3

但我仍然感到困惑,当我在第1行添加断点时,为什么我的代码说state = CAN_MCSR; // state = 0x01 if(CAN_MCSR & TXOK) { state = CAN_MCSR; // state = 0x0C return state; // Succeeded } else { return state; // Failed } 等于state,而调试器则说明寄存器的值等于1

更新2

正如Clifford和Lundin建议的那样,我读了一次寄存器并将值保存在0x0C中然后测试这个变量。为了解决时间问题,我一直在等待,直到设置了标志。我知道这是一个非常糟糕的解决方案,因为它使CPU保持忙碌但它现在可以工作,并且我计划在下一步使用中断。如果有人可以建议更好的解决方案,他的回答将不胜感激。

state

0 个答案:

没有答案