gpt4 book ai didi

c - 强制执行 volatile 内存位置访问的正确顺序

转载 作者:行者123 更新时间:2023-11-30 14:59:31 25 4
gpt4 key购买 nike

考虑以下代码片段:

volatile uint32_t *registers;
\\ ...
\\ registers gets mmap'd and so on
\\ ...
registers[0] = 0x1;
registers[1] = 0x1;

在此寄存器mmap初始化到某个外围地址空间(因此是 volatile 的)。

我还没有在任何地方看到过这个讨论,但在我看来,在一般情况下,这些寄存器写入(或者实际上任何寄存器访问)应该通过内存屏障相互保护。问题是,如果外设期望访问顺序正确,编译器很可能会忽略这一点。

所以它应该看起来像:

volatile uint32_t *registers;
pthread_mutex_t reg_mutex;

\\ ...
\\ registers gets mmap'd and so on
\\ ...
pthread_mutex_lock(&reg_mutex);
registers[0] = 0x1;
pthread_mutex_unlock(&reg_mutex);

pthread_mutex_lock(&reg_mutex)
registers[1] = 0x1;
pthread_mutex_unlock(&reg_mutex);

我的推理正确吗?我错过了什么吗?有更好的方法吗?

在我看来,这应该是理解使用内存映射设备的核心。

编辑:在回答问题时,我注意到指令的无序执行存在潜在问题。在这种情况下,我将重新表述该问题以明确解决该问题:内存屏障是限制处理器正确排序的正确方法吗? (互斥体是有效的策略吗?)

最佳答案

根据 C 和 C++ 标准,对 volatile 内存位置的访问永远不会重新排序,因此您无需执行任何特殊操作。它们也永远不会组合在一起,所以如果你这样做:

registers[0] = 0x1;
registers[0] = 0x1;
registers[0] = 0x1;
registers[0] = 0x1;

编译器将生成 4 次内存写入。

查看C11标准最新草案 - http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

6.7.3 Type qualifiers

...

7 An object that has volatile-qualified type may be modified in ways unknown to the implementation or have other unknown side effects. Therefore any expression referring to such an object shall be evaluated strictly according to the rules of the abstract machine, as described in 5.1.2.3. Furthermore, at every sequence point the value last stored in the object shall agree with that prescribed by the abstract machine, except as modified by the unknown factors mentioned previously.134) What constitutes an access to an object that has volatile-qualified type is implementation-defined.

在您的示例中,每一行实际上都是一个“完整表达式”(因为每一行都以 ; 结尾),因此每一行都包含一个序列点。上述要求强制所有访问按给定顺序执行,无需优化、重新排序或任何巧妙的技巧。

但是 - 请注意,这仅说明编译器将生成按照源代码中的确切顺序和编号访问这些内存位置的指令。例如,如果您需要在多个内核之间同步这些访问,那么这完全依赖于硬件,任何 C 标准都无法帮助您。无论如何 - 互斥锁可能有点太多而无法强制进行这种同步。为此,您最好使用编译器的一些内部函数。

关于c - 强制执行 volatile 内存位置访问的正确顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42723098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com