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