Co mi (opet) nedochazelo v Ccku

Marek Sembol hwm.land@gmail.com
Sobota Září 9 09:55:33 CEST 2006


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



Další informace o konferenci Hw-list