AVR-G++ czemu się tak kompiluje?

Oct 19, 2007 2 Replies

Witam



Poniżej fragment z listingu kompilatora (uC==ATMega8):



byte SPI_TRX(char cData=0) { SPDR = cData; // Start transmission 104: 8f b9 out 0x0f, r24 ; 15 while (!(SPSR & (1<<SPIF))); // Wait for transmission complete 106: 77 9b sbis 0x0e, 7 ; 14 108: fe cf rjmp .-4 ; 0x106 <_Z7SPI_TRXc+0x2>



return SPDR; 10a: 8f b1 in r24, 0x0f ; 15 } 10c: 99 27 eor r25, r25 10e: 08 95 ret


00000110 <_Z7RS_znakh>:

void RS_znak(byte data) { 110: 48 2f mov r20, r24 112: 21 e0 ldi r18, 0x01 ; 1 114: 30 e0 ldi r19, 0x00 ; 0 while (!(UCSRA&(1<<UDRE))); // Wait for empty transmit buffer 116: 8b b1 in r24, 0x0b ; 11 118: 99 27 eor r25, r25 11a: 55 e0 ldi r21, 0x05 ; 5 11c: 96 95 lsr r25 11e: 87 95 ror r24 120: 5a 95 dec r21 122: e1 f7 brne .-8 ; 0x11c <_Z7RS_znakh+0xc>



124: 82 27 eor r24, r18 126: 93 27 eor r25, r19 128: 80 fd sbrc r24, 0 12a: f5 cf rjmp .-22 ; 0x116 <_Z7RS_znakh+0x6>

UDR=data; // Put data into buffer, sends the data 12c: 4c b9 out 0x0c, r20 ; 12 12e: 08 95 ret


Czy ktoś mi może wytłumaczyć, dlaczego pierwsza funkcja kompiluje się normalnie, a druga do testowania jednego bitu robi takie kombinacje?


Jak już kiedyś wspominałem, robię na pracę magisterską generator DDS -

formatting link
. Choć urządzenie już prawie gotowe (kończę oprogramowanie), może macie jakieś uwagi? :)


Mi skompilowalo sie normalnie:

while (!(UCSRA&(1<<UDRE))); 5002: 5d 9b sbis 0x0b, 5 ; 11 5004: fe cf rjmp .-4 ; 0x5002 <main+0x17c>

U Ciebie potraktowało to jako liczby 16-bitowe. Albo 1 jest 16 - bitowa albo UCSRA. Ale dlaczego nie wiem.

Sawik przemówił ludzkim głosem:

[...]

Jest to prawdopodobnie związane z błędnym obliczaniem kosztu operacji podczas optymalizacji kodu przez gcc. Więcej informacji znajdziesz tutaj:

formatting link

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required