我试图读取存储器寄存器并检查该寄存器中的一个标志。我可以使用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