在嵌入式编程中,需要创建代码的原子部分-所谓的关键部分。它们通常是通过宏来实现的,例如:
#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()。