Automaticke pretypovani u AVR-GCC

Miroslav Šinko sinkomiro@gmail.com
Středa Červenec 22 00:07:13 CEST 2009


Myslim, ze problem je v konverziach na int podla ANSI C, kde cislo 3
je implicitne 16-bit. Kedysi sa to tu preberalo.

Pohral som sa s AVR-GCC. Riesenim je takyto zapis:

 void fce(void)
 {
U8 val=3;
    if (val & Status) { ...
 ..
}

pre druhy priklad:
 void fce(void)
 {
U8 val1=3, val2=3;
    if ((val1 & Status) == val2) { ...
 ..
}

Pri optimalizacii O1 nevytvara na zasobniku priestor pre val (val1,2)
a kod je taky, ako si predstavujete :-)

	if(val & status)
 136:	80 91 63 00 	lds	r24, 0x0063
 13a:	83 70       	andi	r24, 0x03	; 3
 13c:	11 f0       	breq	.+4      	; 0x142 <fce+0xc>


	if((val1 & status) == val2)
 136:	80 91 63 00 	lds	r24, 0x0063
 13a:	83 70       	andi	r24, 0x03	; 3
 13c:	83 30       	cpi	r24, 0x03	; 3
 13e:	11 f4       	brne	.+4      	; 0x144 <fce+0xe>

miro

PS: wek by Vam este napisal nieco o vhodnosti C na casovo kriticke aplikacie :-)


2009/7/21, Tomáš Halabala <tomas.halabala@iol.cz>:
> Ne, tady se ma vzdy provest jednou AND a pak jednou zjisteni nenulovosti
> nebo porovnani s konstantou. Oboji jsou dve instrukce, ale to jsem ani
> probirat nechtel.
> Jde o casove kritickou aplikaci, kde mi vadi pretypovani na U16 a tim
> pridani dalsich zbytecnzch instrukci, ktere zdrzuji.
>
> Opravdu nikdo nevi?
> To jsem si mohl myslet. Na me otazky tu na konfere jeste nikdo nemel
> odpoved :-(
>



Další informace o konferenci Hw-list