У меня есть следующий код в моей программе микроконтроллера:
// 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>
Который одновременно решает проблему.
Проверьте эту страницу для полной программы и ее разобранного результирующего кода.
ADCSRA
не является изменчивым, разве второй случай также не подвергается той же оптимизации?Ответы:
Вы должны использовать побитовое AND. Выражение в первом
while
цикле обнуляется, что приводит к тому, что компилятор полностью удаляет цикл.источник