Хотя цикл оптимизирован


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
Разве вы не хотите использовать побитовое И?
lhballoti

обычно вы объявляете регистры энергозависимыми, а затем циклы, в которых вы не вносите изменения, не будут оптимизированы ... но это должно быть сделано для вас во включаемых файлах.
W5VO

Хотя я сразу заметил ошибку, у меня возникли проблемы с пониманием того, почему компилятор оптимизировал цикл в первом случае. Если ADCSRAне является изменчивым, разве второй случай также не подвергается той же оптимизации?
lhballoti

Вы не должны редактировать свой вопрос с ответом, а просто принять чей-либо ответ или написать свой собственный ответ и принять его.
Kellenjb

@Kellenjb - Джиппи добавил это, прежде чем это было ответом. Сначала lhballoti дал это как комментарий.
Стивенвх

Ответы:


11

Вы должны использовать побитовое AND. Выражение в первом whileцикле обнуляется, что приводит к тому, что компилятор полностью удаляет цикл.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.