rotten Postat Decembrie 14, 2009 Partajează Postat Decembrie 14, 2009 Problema ciudata cu avr-gcc:avr-gcc version 4.3.2WinAVR-20090313Cand folosesc niveluri de optimizare mai mari de 1, apelul catre anumite functii nu mai apare in assembler:Exemplu: unsigned char sendPKT( data_block *pachet ){ LCD_dispClear(); LCD_GotoXY(0,0); fprintf_P(&display,PSTR("PKT_SEND %x %d %x"),pachet->type,pachet->length,pachet->data[0]); pachet_crc = CRC_SEED; calc_crc(pachet_crc,0x11); calc_crc(pachet_crc,0); calc_crc(pachet_crc,1); calc_crc(pachet_crc,0xAB); ... unde "calc_crc" si "CRC_SEED" sant definite ca: unsigned int calc_crc(unsigned int crc,unsigned char data) ; #define CRC_SEED 0x00Dupa compilare si rulare, pachet_crc este tot timpul 0 si in .lss am:cu -oS (code size is 71934 bytes):{...} pachet_crc = CRC_SEED; 6456: 10 92 6a 03 sts 0x036A, r1 645a: 10 92 69 03 sts 0x0369, r1 calc_crc(pachet_crc,0x11); 645e: 80 91 69 03 lds r24, 0x0369 6462: 90 91 6a 03 lds r25, 0x036A calc_crc(pachet_crc,0); 6466: 80 91 69 03 lds r24, 0x0369 646a: 90 91 6a 03 lds r25, 0x036A calc_crc(pachet_crc,1); 646e: 80 91 69 03 lds r24, 0x0369 6472: 90 91 6a 03 lds r25, 0x036A calc_crc(pachet_crc,0xAB); 6476: 80 91 69 03 lds r24, 0x0369 647a: 90 91 6a 03 lds r25, 0x036A{...}Cu -o3 (code size is 85098 bytes):pachet_crc = CRC_SEED;{...} 7608: 10 92 66 03 sts 0x0366, r1 760c: 10 92 65 03 sts 0x0365, r1 calc_crc(pachet_crc,0x11); 7610: 80 91 65 03 lds r24, 0x0365 7614: 90 91 66 03 lds r25, 0x0366 calc_crc(pachet_crc,0); 7618: 80 91 65 03 lds r24, 0x0365 761c: 90 91 66 03 lds r25, 0x0366 calc_crc(pachet_crc,1); 7620: 80 91 65 03 lds r24, 0x0365 7624: 90 91 66 03 lds r25, 0x0366 calc_crc(pachet_crc,0xAB); 7628: 80 91 65 03 lds r24, 0x0365 762c: 90 91 66 03 lds r25, 0x0366{...} => Se schimba doar adresa variabilei in memorieCu -o2 la fel, dar code size devine 73970 bytesCu -o1 code size este 71336 bytes si : calc_crc(pachet_crc,0x11);{...} 6236: 80 91 65 03 lds r24, 0x0365 623a: 90 91 66 03 lds r25, 0x0366 623e: ed b7 in r30, 0x3d ; 61 6240: fe b7 in r31, 0x3e ; 62 6242: 3a 96 adiw r30, 0x0a ; 10 6244: 0f b6 in r0, 0x3f ; 63 6246: f8 94 cli 6248: fe bf out 0x3e, r31 ; 62 624a: 0f be out 0x3f, r0 ; 63 624c: ed bf out 0x3d, r30 ; 61 624e: 61 e1 ldi r22, 0x11 ; 17 6250: 0e 94 30 30 call 0x6060 ; 0x6060 <calc_crc> calc_crc(pachet_crc,0); 6254: 80 91 65 03 lds r24, 0x0365 6258: 90 91 66 03 lds r25, 0x0366 625c: 60 e0 ldi r22, 0x00 ; 0 625e: 0e 94 30 30 call 0x6060 ; 0x6060 <calc_crc> calc_crc(pachet_crc,1); 6262: 80 91 65 03 lds r24, 0x0365 6266: 90 91 66 03 lds r25, 0x0366 626a: 61 e0 ldi r22, 0x01 ; 1 626c: 0e 94 30 30 call 0x6060 ; 0x6060 <calc_crc> calc_crc(pachet_crc,0xAB); 6270: 80 91 65 03 lds r24, 0x0365 6274: 90 91 66 03 lds r25, 0x0366 6278: 6b ea ldi r22, 0xAB ; 171 627a: 0e 94 30 30 call 0x6060 ; 0x6060 <calc_crc>{...}Deci apleul catre functia respectiva este corect doar in cazul nivelului de optimizare 1 (-o1) Mersi Link spre comentariu
rotten Postat Decembrie 15, 2009 Autor Partajează Postat Decembrie 15, 2009 Am corectat problema. Era o greseala de a mea. Valoare returnata de functie nu o salvam nicaieri -> e si normal ca la optimizare sa nu o mai adaugeTopic closed. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum