volatile 限定符是否在 c++20 中被弃用?

Is the volatile qualifier deprecated in c++20?

我刚刚在我的嵌入式项目中下载了带有 c++20 的 GCC 10。

但是在嵌入式应用程序中,使用 volatile 来注册结构映射器是很常见的。

由于编译器不知道寄存器值是否被 DMA 从外部更改,因此“强制”重新加载该寄存器是有意义的。

为了提高性能,其中一些易失性内容被放置在 C Header 文件中。 当我将这些 headers 包含在 cpp 文件中时,我得到了很多不稳定的弃用错误。

有什么方法可以消除这些错误吗?

@根据要求编辑一些示例代码。

/*!
 * @brief Enable the clock for specific IP.
 *
 * @param name  Which clock to enable, see \ref clock_ip_name_t.
 */
static inline void CLOCK_EnableClock(clock_ip_name_t name)
{
    uint32_t regAddr = SIM_BASE + CLK_GATE_ABSTRACT_REG_OFFSET((uint32_t)name);
    (*(volatile uint32_t *)regAddr) |= (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT((uint32_t)name));
}
C:/xxx/kinetisSDK/2.7.0/devices/MK64F12/drivers/fsl_clock.h:671:37: error: compound assignment with 'volatile'-qualified left operand is deprecated [- Werror=volatile] 
671 |     (*(volatile uint32_t *)regAddr) |= (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT((uint32_t)name));      |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

由于这些定义遍布整个 NXP SDK,因此我尝试只提取必要的部分。

https://godbolt.org/z/WKzj5j

不过 Godbolt 似乎没问题。可能是因为我在 arm eabi 上使用 gcc 10。

你不能再使用|=,但你可以使用=,所以改变这个:

(*(volatile uint32_t *)regAddr) |= (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT((uint32_t)name));

为此:

*(volatile uint32_t *)regAddr = *(volatile uint32_t *)regAddr | (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT((uint32_t)name));