Sari la conținut
ELFORUM - Forumul electronistilor

Problema cu compilatorul avr-gcc si optimizarea codului


rotten

Postări Recomandate

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  0x00
Dupa 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
  • Răspunsuri 1
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • rotten

    2

Top autori în acest subiect

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări