我的微控制器程序中有以下代码:
// 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>
这显然解决了这个问题。
检查此页面以获取完整的程序及其反汇编的结果代码。