Co mi (opet) nedochazelo v Ccku
Lukáš Grepl
L.Grepl@sh.cvut.cz
Sobota Září 9 15:57:11 CEST 2006
> 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
Jojo, takovy HiTech PICC se chova uplne stejnym zpusobem, taky jsem na
to pred casem nahodou narazil. A je to samozrejme naprosto spravne.
Naopak je nebezpecne, kdyz nekdo nepouzije to volatile a udela klasicky
neco jako:
char flag; // bez volatile
void interrupt isr() // preruseni
{
flag = 1;
// ...
}
void main()
{
// ...
flag = 0;
while (!flag) // cekani na provedeni preruseni
;
// ...
}
a ono to potom muze nebo nemusi fungovat, podle toho jak to moc to dany
prekladac zoptimalizuje...
Lukas Grepl
Další informace o konferenci Hw-list