虽然循环优化了

电器工程 嵌入式 集会 服装 C++ 优化
2022-02-01 09:36:18

我的微控制器程序中有以下代码:

// Wait for ADC conversion to complete
while ( ( ADCSRA && _BS( ADSC ) ) == _BS( ADSC ) ) {}

ADCSRA 是一个寄存器,一旦模拟转换完成,它的值就会改变,我想等待一点被清除。该位指示转换完成。

查看生成的汇编代码,整个循环被一条指令替换:

in      r24, 0x06       ; ADCSRA

寄存器被读取,但它的值甚至没有被测试!?

如何更改我的 C++ 代码以指示编译器继续重新检查寄存器,而不会不必要地延迟程序?

我使用 avr-gcc 工具链。

编辑: 我将代码更改如下(Thnx:lhballoti):

while ( ( ADCSRA & _BS( ADSC ) ) == _BS( ADSC ) ) {}

将汇编代码更改为:

38:   36 99           sbic    0x06, 6         ; 6
3a:   fe cf           rjmp    .-4             ; 0x38 <__CCP__+0x4>

这显然解决了这个问题。

检查页面以获取完整的程序及其反汇编的结果代码。

1个回答

您应该使用按位与。第一个while循环中的表达式计算为零,这导致编译器完全删除循环。