1

在嵌入式编程中,需要创建代码的原子部分——所谓的临界区。它们通常通过宏实现,例如,像这样:

#define ENTER_CRITICAL() int saved_status_ = CPU_STATUS_REGISTER; __disable_irq();
#define EXIT_CRITICAL()  CPU_STATUS_REGISTER = saved_status_

即在进入中断状态(启用或禁用)时保存;退出时 - 它已恢复。问题是为此需要额外的变量。

我的问题是:是否可以通过 constexpr 函数创建关键部分(并摆脱宏)?

4

1 回答 1

6

RAII 解决方案将是传统的:

struct CriticalSection {
  int saved_status_;
  void Enter() {
    saved_status_ = CPU_STATUS_REGISTER;
    __disable_irq();
  }
  CriticalSection() { Enter(); }
  void Exit() {
    CPU_STATUS_REGISTER = saved_status_;
  }
  ~CriticalSection() {
    Exit(); // Can you call this more than once safely?  Dunno.
  }
};

你会这样使用它:

void foo() {
  // unprotected code goes here
  {
    CriticalSection _;
    // protected code goes here
  }
  // unprotected code goes here
}

在没有任何状态的情况下这样做是不可能的,因为这CPU_STATUS_REGISTER是一个运行时值。C/C++ 中的状态主要存储在变量中。

我强烈怀疑,在任何非平凡的优化级别下,上述 RAII 类将编译为与您的宏编译成完全相同的代码,除非您不再需要记住 EXIT_CRITICAL()。

于 2013-04-17T20:18:22.823 回答