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