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