我的微控制器程序中有以下代码:
// 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>
这就解决了这个问题。
检查此页面以获取完整的程序及其反汇编的结果代码。
3
您不是要使用按位AND吗?
—
lhballoti
通常你会申报登记挥发,然后循环哪里你不修改的东西不会被优化......但应该为你的包含文件来完成。
—
W5VO 2012年
尽管我立即发现了错误,但是我还是无法理解为什么编译器在第一种情况下会优化循环。如果
—
lhballoti
ADCSRA
不是不稳定的,那么第二种情况也不会受到同样的优化吗?
您不应该用答案来编辑问题,而应该接受别人的答案或编写自己的答案并接受。
—
Kellenjb
@Kellenjb-jippie在回答之前就添加了它。lhballoti首先发表评论。
—
stevenvh 2012年