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函数制作关键部分(以及摆脱宏以外的事情)?
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().