Mentre loop ottimizzato via


8

Ho il seguente codice nel mio programma di microcontrollore:

// Wait for ADC conversion to complete
while ( ( ADCSRA && _BS( ADSC ) ) == _BS( ADSC ) ) {}

Dove ADCSRA è un registro che cambierà il suo valore una volta completata una conversione analogica e dove voglio aspettare che un po 'sia chiaro. Questo bit indica la conversione completata.

Guardando il codice assembly risultante, l'intero ciclo viene sostituito da una singola istruzione:

in      r24, 0x06       ; ADCSRA

Il registro viene letto, ma il suo valore non è nemmeno testato !?

Come devo modificare il mio codice C ++ per indicare al compilatore di continuare a ricontrollare il registro, senza inutili ritardi nel programma?

Uso la toolchain avr-gcc.

EDIT: ho modificato il codice come segue (Thnx: lhballoti):

while ( ( ADCSRA & _BS( ADSC ) ) == _BS( ADSC ) ) {}

Che ha cambiato il codice assembly in:

38:   36 99           sbic    0x06, 6         ; 6
3a:   fe cf           rjmp    .-4             ; 0x38 <__CCP__+0x4>

Che risolve apperentemente il problema.

Controllare questa pagina per il programma completo e il codice risultante smontato.


3
Non intendi usare un AND bit a bit?
lhballoti,

di solito si dovrebbe dichiarare i registri ad essere volatile, e quindi i cicli in cui si non modificare le cose non saranno ottimizzati ... ma che dovrebbe essere fatto per voi nelle file include.
W5VO,

Anche se ho individuato l'errore immediatamente, ho difficoltà a capire perché il compilatore abbia ottimizzato il loop nel primo caso. Se ADCSRAnon è volatile, anche il secondo caso non è soggetto alla stessa ottimizzazione?
lhballoti,

Non dovresti modificare la tua domanda con la risposta, piuttosto accetta la risposta di qualcuno o scrivi la tua risposta e accettala.
Kellenjb,

@Kellenjb - jippie l'ha aggiunto prima che fosse una risposta. lhballoti lo ha appena lasciato come commento.
Stevenvh,

Risposte:


11

Dovresti usare un AND bit per bit. L'espressione nel primo whileciclo viene valutata su zero, il che causa la rimozione totale del ciclo da parte del compilatore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.