c++ - 在 C/C++ 中直接写入内存地址的最短代码是什么?

标签 c++ c gcc systems-programming

我正在为没有内存保护的嵌入式系统编写系统级代码(在 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/

相关文章:

windows - Mingw FFTW3 找不到库/头文件

java - 返回对成员变量的引用时的 SWIG-Java 内存管理

c++ - SwapBuffers 使我的程序崩溃!

c++ - 为什么我应该在使用命名空间 std 之后包含头文件 <iostream>?

c - 将赔率分配给大小为 50 的数组

c - SIGPIPE 带运行程序

c++ - SFINAE 用作返回类型,但不是参数类型

c++ - 如何在 C/C++ 中包含宏的行的末尾添加语句?

c++ - 如何警告 C 中 void 指针参数的类型不兼容?

c - 为共享库文件(*.so)生成头文件(*.h)