【发布时间】:2020-09-23 06:57:42
【问题描述】:
我们使用了大量的寄存器,都是位域的结构,例如
struct MyRegister {
uint32_t bit_field0 : 2;
uint32_t bit_field1 : 5;
...
};
volatile MyRegister my_register; // Mapped by the linker to a specific address.
我想创建一个模板来帮助我创建影子寄存器。 比如:
Shadow<> my_register_shadow(my_register); // my_register_shadow is a variable initialized with my_register address and value (reads my_register value).
my_register_shadow.bit_field0 = 2; // Doesn't access to real register my_register.
my_register_shadow.bit_field1 = 6; // Doesn't access to real register my_register.
my_register_shadow.flush(); // Only now write to my_register.
我目前的解决方案:
template <typename T>
class Shadow : public T
{
public:
Shadow(volatile T& reg) : T(reg), reg_(reg) {}
void flush() { reg_ = *this; }
private:
volatile T& reg_;
};
#define SHADOW_REG(SHADOW, REG) Shadow<decltype(REG)> SHADOW(REG)
SHADOW_REG(my_register, my_register_shadow); // Define my_register_shadow variable.
my_register_shadow.bit_field0 = 2; // Doesn't access to real register my_register.
my_register_shadow.bit_field1 = 6; // Doesn't access to real register my_register.
my_register_shadow.flush(); // Only now write to my_register.
我正在寻找没有宏的解决方案,有什么想法吗?
【问题讨论】:
-
c++17 允许您省略模板参数,因此您不需要宏
-
如果你没有c++17,使用
auto和一个辅助函数模板。auto my_register_shadow = make_shadow(my_register); -
标题有点误导,因为您的问题实际上并不是关于“遮蔽”任何东西,而是关于避免使用宏...