为什么在使用 gcc -o2 优化时添加延迟?

Why adding delay when gcc -o2 optimization is used?

我读了一个带LCD的STM32的示例代码,发现下面的代码,其目的是将LCD控制器寄存器索引写入LCD控制器的输出数据。

void LCD_WR_REG(uint16_t regval)
{ 
    regval = regval;       // Necessary delay when using -o2 optimization
    LCD->LCD_REG = regval;
}

我搜索了一段时间 -o2,但没有得到太多有用的信息来说明这里的注释是什么意思,或者为什么这里需要自我赋值。

评论完全错误。这个操作会被优化掉。我相信这条评论是在代码的原始作者正在努力使其工作的地方写的,而这一行中还有其他东西。

LCD_WR_REG:
        ldr     r3, .L3
        strh    r0, [r3]        @ movhi
        bx      lr
.L3:
        .word   1207993344

如果将 regval 声明为 volatile

,它可能会产生一些影响
void LCD_WR_REG1(volatile uint16_t regval)
{ 
    regval = regval;       // Necessary delay when using -o2 optimization
    LCD->LCD_REG = regval;
}
LCD_WR_REG1:
        sub     sp, sp, #8
        strh    r0, [sp, #6]    @ movhi
        ldrh    r3, [sp, #6]
        strh    r3, [sp, #6]    @ movhi
        ldr     r2, .L7
        ldrh    r3, [sp, #6]
        strh    r3, [r2]        @ movhi
        add     sp, sp, #8
        bx      lr
.L7:
        .word   1207993344

https://godbolt.org/z/Th7naabf7