虽然优化了循环


8

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

// 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年

尽管我立即发现了错误,但是我还是无法理解为什么编译器在第一种情况下会优化循环。如果ADCSRA不是不稳定的,那么第二种情况也不会受到同样的优化吗?
lhballoti

您不应该用答案来编辑问题,而应该接受别人的答案或编写自己的答案并接受。
Kellenjb

@Kellenjb-jippie在回答之前就添加了它。lhballoti首先发表评论。
stevenvh 2012年

Answers:


11

您应该使用按位AND。第一个while循环中的表达式求值为零,这使编译器完全删除了该循环。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.