我刚刚在我的嵌入式项目中下载了带有c++20的GCC 10。
然而,在嵌入式应用程序中,使用volatile作为注册结构映射器是很常见的。
由于编译器不知道寄存器值是否由DMA在外部更改,因此“强制”重新加载此寄存器是有意义的。
为了提高性能,这些挥发物中的一些被放在C头文件中。当我在一个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)); |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~由于这些定义分布在恩智浦SDK中,因此我尝试只提取必要的部分。
然而,Godbolt似乎还不错。也许是因为我在arm eabi上使用了gcc 10。
发布于 2021-01-14 17:52:46
您不能再使用|=,但您可以使用=,因此请更改以下内容:
(*(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));https://stackoverflow.com/questions/65716368
复制相似问题