【问题标题】:Why adding delay when gcc -o2 optimization is used?为什么在使用 gcc -o2 优化时添加延迟?
【发布时间】:2021-07-12 20:45:43
【问题描述】:

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

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

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

【问题讨论】:

  • 使用 GCC,-O2 标志将明确地将行 regval = regval; 优化为无操作。评论是错误的。 -O2 中的这条线不会有任何延迟。我非常怀疑他们修改了 GCC,因此在这种情况下它的行为有所不同。这将是非常令人惊讶和非常糟糕的主意。 AFAIK,标准 GCC 支持选项/标志 -O2-o 但不支持 -o2 所以它可能是不同的选项/标志。
  • 谢谢,理查德。是的,我在这里也看不到任何意义。

标签: gcc optimization delay


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-12-25
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多