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