Co mi (opet) nedochazelo v Ccku

Dušan Slavětínský dslav2@treeinfo.cz
Sobota Září 9 15:50:18 CEST 2006


Zdravim,
Myslim ze je to spravne. Ten vyraz je provadeny zleva do prava. 

Takto to chape prekladac:
g_u8P1 = (g_u8P2 = 1);

A protože jsou promene volatile musí to udelat presne jak je to zapsane.

Zkuste to nasat takto: 
g_u8P1 = 1;
g_u8P2 = 1;

S tím by si optimalizace měla poradit.

Dušan Slavětínský

-----Original Message-----
From: hw-list-bounces@list.hw.cz [mailto:hw-list-bounces@list.hw.cz] On Behalf Of Marek Sembol
Sent: Saturday, September 09, 2006 9:56 AM
To: HW-news
Subject: Co mi (opet) nedochazelo v Ccku

Zdravim,
Treba uz to valna vetsina z vas zna, tak mne nekamentujte, ale nekdo je treba stejne pomalejsi jako ja a bude se mu to hodit:) Opet mne totiz udivilo, ze prekladac C udela presne to, co mu reknete:)

mam 2 globalni, 8-bit, volatile promenne.
volatile unsigned char g_u8P1;
volatile unsigned char g_u8P2;
a ty se rozhodnu nekde v programu obe nastavit na hodnotu 1.
g_u8P1 = g_u8P2 = 1;
Vysledek prekladu je (na AVR):
	g_u8P1 = g_u8P2 = 1;
     180:	81 e0       	ldi	r24, 0x01	; 1
     182:	80 93 69 00 	sts	0x0069, r24
     186:	80 91 69 00 	lds	r24, 0x0069
     18a:	80 93 68 00 	sts	0x0068, r24
Neboli prekladac ulozi 1 do g_u8P2, precte hodnotu z g_u8P2 a tu zapise do g_u8P1. A zadne optimalizace tomu nepomuzou. Prekladac proste cti to, co jsem mu rekl: promenne jsou volatile, takze mu je muze kdokoliv "pod rukama" zmenit. Takze zapis (a jeho preklad) a jeho preklad toho, co opravdu bylo mou intenci je:

	g_u8P1 = 1; g_u8P2 = 1;
     180:	81 e0       	ldi	r24, 0x01	; 1
     182:	80 93 68 00 	sts	0x0068, r24
     186:	80 93 69 00 	sts	0x0069, r24

Preruseni byly zakazane, takze na funkcnost programu to nemohlo mit vliv, ale prece jen - skoda tech par byte a cyklu...

Hezky weekned,
Marek
_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz Hw-list@list.hw.cz http://list.hw.cz/mailman/listinfo/hw-list



Další informace o konferenci Hw-list