关键部分通过constexpr

Amo*_*mum 1 c++ embedded critical-section c++11

在嵌入式编程中,需要创建代码的原子部分 - 所谓的关键部分.它们通常通过宏实现,例如,如下所示:

#define ENTER_CRITICAL() int saved_status_ = CPU_STATUS_REGISTER; __disable_irq();
#define EXIT_CRITICAL()  CPU_STATUS_REGISTER = saved_status_
Run Code Online (Sandbox Code Playgroud)

即保存输入中断状态(启用或禁用); 在退出 - 它被恢复.问题是需要额外的变量.

我的问题是:是否有可能通过constexpr函数制作关键部分(以及摆脱宏以外的事情)?

Yak*_*ont 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.
  }
};
Run Code Online (Sandbox Code Playgroud)

你会像这样使用它:

void foo() {
  // unprotected code goes here
  {
    CriticalSection _;
    // protected code goes here
  }
  // unprotected code goes here
}
Run Code Online (Sandbox Code Playgroud)

在没有任何状态的情况下执行此操作是不可能的,因为CPU_STATUS_REGISTER它是运行时值.C/C++中的状态主要存储在变量中.

我强烈怀疑,在任何非平凡的优化级别,上述RAII类将编译到您的宏编译完全相同的代码,除非你不再记得要EXIT_CRITICAL().