C-尽管隐藏了get/set包装器,但透明使用寄存器



我正在一个嵌入式项目中工作,其中使用新硬件的新软件构造实现了现有软件的功能。

目标是控制一个复杂的硬件单元。旧软件已将单元的寄存器映射到内存中,该软件直接修改了这些寄存器。

这样:

/* 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);

方式。

我是否有任何更改来重用旧的大型代码库控制寄存器而不重写每个寄存器访问?

是否有一种方法可以在宏中隐藏/设置函数?

#define REGISTER_1 ??? /* Return value with 
GET(REGISTER_1) if not accessed with an assignment like REGISTER_1 = ... */

我考虑了宏观代码中的机制之类的缓存,该机制在寄存器的本地副本上设置了一个肮脏的标志,并自动更新/访问寄存器...

imho您正在以错误的方式尝试。访问硬件寄存器与将值存储在变量中的C心理模型相去甚远。虽然标准提到了各个段落中操作的副作用,并为更改编译器控制之外的单元物提供了volatile,但很有可能C编程器在您的较深的后果上有不同的视图或没有视图的影响。标准措辞应用于您的特殊情况。因此,当我们欺骗人类读者阅读一些看似无害的作业时,许多信息就会丢失/隐藏。更糟糕的是,如果您使用的是中断的任务,其中可能会出现Read-Modify-Write错误的克星(例如DigiPort_A |= 1;)。

鉴于寄存器访问有望在您的旧代码库中均匀,我会尝试乔纳森·莱夫勒(Jonathan Leffler)推荐的方法,让额外的工作是客户的学徒,向他发出信号,向他发出信号,表明他不应将嵌入式编程视为只是电气工程师的侧职业。

最新更新