Saya memiliki kode berikut dalam program mikrokontroler saya:
// Wait for ADC conversion to complete
while ( ( ADCSRA && _BS( ADSC ) ) == _BS( ADSC ) ) {}
Di mana ADCSRA adalah register yang akan mengubah nilainya begitu konversi analog selesai dan di mana saya ingin menunggu sedikit menjadi jelas. Bit ini menunjukkan konversi selesai.
Melihat kode perakitan yang dihasilkan, seluruh loop diganti dengan satu instruksi:
in r24, 0x06 ; ADCSRA
Register sudah dibaca, tetapi nilainya bahkan belum diuji !?
Bagaimana saya harus mengubah kode C ++ saya untuk menginstruksikan kompiler untuk terus memeriksa ulang register, tanpa menunda program?
Saya menggunakan toolchain avr-gcc.
EDIT: Saya mengubah kode sebagai berikut (Thnx: lhballoti):
while ( ( ADCSRA & _BS( ADSC ) ) == _BS( ADSC ) ) {}
Yang mengubah kode perakitan menjadi:
38: 36 99 sbic 0x06, 6 ; 6
3a: fe cf rjmp .-4 ; 0x38 <__CCP__+0x4>
Yang benar-benar memecahkan masalah.
Periksa halaman ini untuk mengetahui program yang lengkap dan kode yang dihasilkan yang dibongkar.
ADCSRA
tidak stabil, bukankah huruf kedua juga mengalami optimasi yang sama?Jawaban:
Anda harus menggunakan bitwise AND. Ekspresi di
while
loop pertama mengevaluasi ke nol, yang menyebabkan kompiler untuk menghapus loop sama sekali.sumber