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

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

即输入中断状态时(启用或禁用)将被保存;退出时-恢复。问题是为此需要其他变量。

我的问题是:是否可以通过constexpr函数进行关键部分的处理(以及摆脱宏的方法)?

最佳答案

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()。

07-24 15:05