Sawik
Guest
Fri Oct 19, 2007 12:41 pm
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 -
http://www.et.put.poznan.pl/~krzychu/mgr/ . Choć urządzenie już prawie
gotowe (kończę oprogramowanie), może macie jakieś uwagi? :)
--
pozdrawiam
Sawi
Bogdan G
Guest
Fri Oct 19, 2007 1:28 pm
Quote:
Czy ktoś mi może wytłumaczyć, dlaczego pierwsza funkcja kompiluje się
normalnie, a druga do testowania jednego bitu robi takie kombinacje?
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.
Zbych
Guest
Fri Oct 19, 2007 6:12 pm
Sawik przemówił ludzkim głosem:
Quote:
Witam
Poniżej fragment z listingu kompilatora (uC==ATMega8):
[...]
Czy ktoś mi może wytłumaczyć, dlaczego pierwsza funkcja kompiluje się
normalnie, a druga do testowania jednego bitu robi takie kombinacje?
Jest to prawdopodobnie związane z błędnym obliczaniem kosztu operacji
podczas optymalizacji kodu przez gcc. Więcej informacji znajdziesz tutaj:
http://lists.gnu.org/archive/html/avr-gcc-list/2007-08/msg00011.html