c - 通过隐藏 get/set 包装器透明地使用寄存器

标签 c caching macros embedded reusability

我正在从事一个嵌入式项目,其中现有软件的功能是通过新硬件上的新软件架构实现的。

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

像这样:

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

相关文章:

c - 在 PIC18f87k22 上使用 EUSART 模块时出现问题

java - 从文件配置 ehcache

php - 启用缓存会影响动态内容吗?

c++ - C/C++ 宏中的逗号传递给另一个宏

c++ - C++::自定义异常,未捕获变量消息(<< 运算符)

c - 为什么我会收到关于 printf() with %s taking type void * as parameter 的警告?

c - 无法从 Linux 计算机将 UDP 发送到多播组

c - 命令上的符号查找错误

C++缓存性能奇怪的行为

c++ - 用于 C 和 C++ 的函数签名的可移植 UNUSED 参数宏