我正在从事一个嵌入式项目,其中现有软件的功能是通过新硬件上的新软件架构实现的。
目标是控制一个复杂的硬件单元。 旧软件将单元的寄存器映射到内存中,软件直接修改这些寄存器。
像这样:
/* Register is defined with offset */
#define REGISTER_1 regMem[0x1234]
/* And can be accessed like this (obvious) */
REGISTER_1 = 0;
if (REGISTER_1 == 0) {...}
在新硬件上,包装器(不能省略)只允许访问
SET(REG_ADDR,VALUE);
GET(REG_ADDR);
方式。
我是否有任何改变来重用控制寄存器的旧的、大的代码库而不重写每个寄存器访问?
有没有办法在宏中隐藏 GET/SET 函数?
#define REGISTER_1 ??? /* Return value with
GET(REGISTER_1) if not accessed with an assignment like REGISTER_1 = ... */
我想到了宏代码中的类似缓存的机制,它在寄存器的本地副本上设置一个脏标志,并在访问时自动更新/获取寄存器...
最佳答案
恕我直言,您正在以错误的方式尝试。访问硬件寄存器与将值存储在变量中的 C 心智模型相去甚远。虽然该标准在相应段落中提到了操作的副作用,并为在编译器控制之外更改内容的单元格提供了 volatile
,但 C 程序员很可能会有不同的看法或没有看法总而言之,关于适用于您的特殊情况的标准措辞的更深层次的影响。因此,当我们诱使人类读者阅读一些看似无害的作业时,很多信息就会丢失/隐藏。更糟糕的是,如果您正在使用可中断的任务,那么读-修改-写错误的克星可能会降临到您身上(例如 DigiPort_A |= 1;
)。
鉴于寄存器访问有望在您的旧代码库中统一,我会尝试 Jonathan Leffler 推荐的方法,让客户的额外工作成为学徒应得的,向他表明嵌入式编程不应被视为只是电气工程师的副业。
关于c - 通过隐藏 get/set 包装器透明地使用寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47436390/