Automaticke pretypovani u AVR-GCC

Tomáš Halabala tomas.halabala@iol.cz
Středa Červenec 22 10:53:25 CEST 2009


Děkuji, jo toto je řešení, ale co mě na tom nejvíce zaráží je, jak jsem 
psal, že v jednom případě překladač tu trojku nerozšířil a v jiném místě 
programu s úplně stejným zápisem pouze s jinými názvy proměnných tu 
trojku převedl na int, což jak píšete odpovídá ANSI C. Ale proč to tedy 
dodržuje překladač podle nálady? To už asi zůstane nezodpovězeno.
Odpovědí je zřejmě asi IAR.

Použil jsem C, protože se jedná o velmi rozsáhlý program a samozřejmě ty 
nejkritičtější části jsou psané v assembleru. Administrativní část je v 
C s tím, že neustále kontroluji efektivnost překladu. Slibuji si od toho 
přece jen snadnější přenositelnost na jiné MCU a CPU, což je také 
směrodatné.

Tomáš

Miroslav Šinko napsal(a):
> 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 :-)



Další informace o konferenci Hw-list