c++ - 使用C或C++编写硬件时是否必须使用volatile?

标签 c++ c hardware volatile

在C或C++中写入硬件(例如FIFO)时是否需要使用volatile。很容易从在线文档中确认在读取硬件时volatile是必需的,但是编写该怎么办?我担心优化器可能会消除将值数组写入FIFO并仅写入最后一个条目的循环。

最佳答案

就试一试吧。

#define MYFIFOV (*((volatile unsigned char *)0x1000000))
#define MYFIFO (*((unsigned char *)0x1000000))

void funv ( void )
{
    MYFIFOV=0;
    MYFIFOV=0;
}
void fun ( void )
{
    MYFIFO=0;
    MYFIFO=0;
}
00000000 <funv>:
   0:   e3a03401    mov r3, #16777216   ; 0x1000000
   4:   e3a02000    mov r2, #0
   8:   e5c32000    strb    r2, [r3]
   c:   e5c32000    strb    r2, [r3]
  10:   e12fff1e    bx  lr

00000014 <fun>:
  14:   e3a03401    mov r3, #16777216   ; 0x1000000
  18:   e3a02000    mov r2, #0
  1c:   e5c32000    strb    r2, [r3]
  20:   e12fff1e    bx  lr
strb表示存储字节。没有 volatile ,写操作之一被优化了。因此,是的,没有 volatile ,可以优化写入。编译器决定如何以及何时决定这样做。但是,假设它可能发生并因此给您带来麻烦。

关于c++ - 使用C或C++编写硬件时是否必须使用volatile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64374526/

相关文章:

c - 复合/字符串文字存储在内存中的什么位置?

WebAssembly 的硬件实现

c++跨平台方式定义64位无符号整数

c++ - 我可以使用 VS2008 的 C++ 编译器使用 VS2010 并且仅使用 Server 2008 Platform SDK 进行编译吗?

c - 如果包含数字,如何使整个字符串大写?

optimization - 运行程序的动态优化

c - 使用 C 确定地址线的数量和 RAM 字的大小

c++ - 创建模板化结构的 std::list (C++)

php - C++/MySQL - 通过主机地址访问数据库时为 'Unknown MySQL server host';没有IP

c - 在没有 UAC 提示的情况下提高进程完整性