如何在标准 C++ 中强制执行特定的内存存储顺序?

问题描述 投票:0回答:1

这有点像语言律师问题。

在典型的嵌入式系统或设备驱动程序中,通常需要对 MMIO/PIO 寄存器进行非常特定的内存存储序列。举个例子:

store byte 0x10 to 0x40002000
store byte 0xaa to 0x40002001

例如,如果从未读取过写入,则组合写入(例如将 16 位数量 0xaa10 写入 0x40002000)或优化写入都是不正确的。

通常在 C 中,我们会使用 volatile 变量来达到此目的:

*(volatile uint8_t *)0x40002000 = 0x10;
*(volatile uint8_t *)0x40002001 = 0xaa;

我的问题是:在标准 C++ 中,这样的代码是否能保证产生所需的存储序列?如果不是,有没有办法保证这样的顺序?

答案应引用标准(任何版本)。如果这是不可能的(或没有明确定义),请用标准支持它。

c++ embedded language-lawyer volatile
1个回答
0
投票

所有

volatile
所做的就是告诉编译器相关地址处的值可能会被外部代理更改。这将确保编译器每次需要访问时都会生成 LDR 和 STR 指令,从而防止读取或写入被优化。

然而,读取和写入的实际顺序取决于处理器,并且通常由相关 CPU 架构决定。 ARM 是出了名的乱序。为了保证顺序,编译器需要添加内存屏障,例如 ARM 上的 DMB。挥发性不会这样做。

禁用给定地址的缓存可能会有所帮助,否则将需要为每次写入手动刷新缓存。

© www.soinside.com 2019 - 2024. All rights reserved.