首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++20中是否不推荐使用volatile限定符?

c++20中是否不推荐使用volatile限定符?
EN

Stack Overflow用户
提问于 2021-01-14 17:26:06
回答 1查看 715关注 0票数 4

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

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

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

为了提高性能,这些挥发物中的一些被放在C头文件中。当我在一个cpp文件中包含这些头文件时,我得到了很多不推荐使用的易失性错误。

有什么方法可以禁用这些错误吗?

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

代码语言:javascript
复制
/*!
 * @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));
}
代码语言:javascript
复制
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));      |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

由于这些定义分布在恩智浦SDK中,因此我尝试只提取必要的部分。

https://godbolt.org/z/WKzj5j

然而,Godbolt似乎还不错。也许是因为我在arm eabi上使用了gcc 10。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-14 17:52:46

您不能再使用|=,但您可以使用=,因此请更改以下内容:

代码语言:javascript
复制
(*(volatile uint32_t *)regAddr) |= (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT((uint32_t)name));

要这样做:

代码语言:javascript
复制
*(volatile uint32_t *)regAddr = *(volatile uint32_t *)regAddr | (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT((uint32_t)name));
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65716368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档