我正在为没有内存保护的嵌入式系统编写系统级代码(在 ARM Cortex-M1 上,使用 gcc 4.3 编译)并且需要直接读取/写入内存映射寄存器。到目前为止,我的代码如下所示:
#define UART0 0x4000C000
#define UART0CTL (UART0 + 0x30)
volatile unsigned int *p;
p = UART0CTL;
*p &= ~1;
有没有不使用指针的更短的方法(我的意思是代码更短)?我正在寻找一种方法来编写如此短的实际分配代码(如果我不得不使用更多#defines 就可以了):
*(UART0CTL) &= ~1;
到目前为止,我尝试的任何事情都以 gcc 提示它无法将某些东西分配给左值...
最佳答案
#define UART0CTL ((volatile unsigned int *) (UART0 + 0x30))
:-P
编辑添加:哦,针对所有关于如何将问题标记为 C++ 和 C 的评论,这里有一个 C++ 解决方案。 :-P
inline unsigned volatile& uart0ctl() {
return *reinterpret_cast<unsigned volatile*>(UART0 + 0x30);
}
这可以直接卡在头文件中,就像 C 风格的宏一样,但你必须使用函数调用语法来调用它。
关于c++ - 在 C/C++ 中直接写入内存地址的最短代码是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2417195/