zaujimavost pri programovani AVR v GCC
Ing. Petr Weissar, Ph.D.
weissar@kae.zcu.cz
Úterý Říjen 23 20:02:26 CEST 2007
Ahoj, neznam sice AVR-ko prilis, ale ten kod je pokazdy v C jiny, ono ti to
chodi ruzne ... Pokud prvni priklad je:
PORTA = counter++;
Tak ekvivalent je sekvence:
PORTA = counter;
counter++;
V tom prvnim mas totiz POST-inkrement, coz jsi ve svem prikladu nezohlednil.
Zkus to takto prelozit, jestli se to nahodou "nespravi" :-)
Petr
> Dobry den,
>
> pri pokusoch s AVR a Eclipse+WinAVR som ako prve skusil kratky program:
> ---------- begin ----------
> #include <avr/io.h>
>
> void main( void){
> unsigned char counter = 0;
> while(1){
> PORTA = counter++;
> }
> }
> ---------- end ----------
>
> Po spusteni sa mi to zdalo pomalsie, ako som cakal. Tu je dovod:
> ---------- begin ----------
> void main( void){
> ce: 80 e0 ldi r24, 0x00 ; 0
> d0: 90 e0 ldi r25, 0x00 ; 0
> unsigned char counter = 0;
> while(1){
> PORTA = counter++;
> d2: 8b bb out 0x1b, r24 ; 27
> d4: 01 96 adiw r24, 0x01 ; 1
> d6: fd cf rjmp .-6 ; 0xd2 <main+0x4>
> ---------- end ----------
> (counter je v R24 a R25 = 16 bitov)
>
>
>
> Po prepisani programu na:
> ---------- begin ----------
> #include <avr/io.h>
>
> void main( void){
> unsigned char counter = 0;
> while(1){
> counter++;
> PORTA = counter;
> }
> }
> ---------- end ----------
>
> sa to prelozi takto:
> ---------- begin ----------
> void main( void){
> ce: 80 e0 ldi r24, 0x00 ; 0
> unsigned char counter = 0;
> while(1){
> counter++;
> d0: 8f 5f subi r24, 0xFF ; 255
> PORTA = counter;
> d2: 8b bb out 0x1b, r24 ; 27
> d4: fd cf rjmp .-6 ; 0xd0 <main+0x2>
> ---------- end ----------
> (counter je v R24 = 8 bitov)
>
>
> Vie mi to niekto vysvetlit?
>
> Richard Kaliciak
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list@list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
Další informace o konferenci Hw-list