Jump to content
ELFORUM - Forumul electronistilor

Problema cu compilatorul avr-gcc si optimizarea codului


rotten

Recommended Posts

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 to comment
  • Replies 1
  • Created
  • Last Reply

Top Posters In This Topic

  • rotten

    2

Top Posters In This Topic

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 to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines