首页 > 解决方案 > 一旦触发中断,对象的成员值就会改变

问题描述

我有一个 UART 类,其中包含Fifo. 我注意到,一旦 UART IRQ 处理程序被触发,Fifo实例的成员变量就会发生变化。我想不出任何进一步的断点,因为里面的东西看起来非常好Uart::init()……接下来发生的事情是 IRQ 处理程序。

// uart.hpp
class Uart 
{
  Fifo rx;
  Fifo tx;
  public:
  void init();
  void irqHandler();
};

// uart.cpp
static Uart *pUart;

void Uart::init() 
{
  pUart = this;
  // verified Uart::rx's members are as expected
  // ...
}

void IRQ_Handler(void) 
{
  pUart->irqHandler();
}

void Uart::irqHandler() 
{
    // Uart::rx members seem to have changed here...
}

int main(void) 
{
  Uart uart;
  uart.init();
  while(1);
}

标签: c++embedded

解决方案


  1. 将共享对象声明为 volatile:
static volatile Uart *pUart;
  1. 如果代码已经用优化开关编译,不要期望调试器会话很容易理解。代码和数据可以省略或重新排序,使其不再反映源代码所暗示的顺序或状态。

推荐阅读