为什么在使用 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
我读了一个带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