Volatile hatása.

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Avatar
benzinkutas
DrótVégénSzéndarab
Hozzászólások: 31
Csatlakozott: 2011. április 30. szombat, 6:00

Volatile hatása.

Hozzászólás Szerző: benzinkutas »

A változónak milyen tulajdonságára hat a Volatile. Próbáltam utána olvasni itt http://arduino.cc/en/Reference/Volatile, de sajnos nem tudtam kihámozni a hatását.
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: Volatile hatása.

Hozzászólás Szerző: csabeszq »

Nem egyszerű a volatile, leírom, próbáld megérteni, ha valami nem világos kérdezz.

A globális változók a memóriában vannak tárolva (328P 2K RAM). A mikrokontroller amikor az utasításokat hajtja végre, nem közvetlenül a memóriába dolgozik, hanem vannak regiszterei (belső tároló), ahol az információt ideiglenesen eltárolja (Atmel esetén 32 regiszter van).

Kód: Egész kijelölése

uint8_t változó; // a 256. memóriacímre kerül, 1 byte hosszú
uint8_t változó2; // a 257. memóriacímre kerül, 1 byte hosszú
...
Mit csinál a mikrokontroller legbelül, amikor a változót csökkentem 3-mal?

Kód: Egész kijelölése

lds r24, változó // (256-os cím) változót betölti az 24-es regiszterbe
subi r24, 3 // levon belőle hármat
sts változó, r24 // visszaírja a 256-os címre
Mi ezzel a gond? A gond a for ciklusnál okoz elsődlegesen problémát.

Kód: Egész kijelölése

uint8_t változó = 0;

int main()
{
  for( változó = 0; változó < 100; változó++ )
    ; // ne csinálj semmit
}
Hogyan fordul le?

Kód: Egész kijelölése

1. r24-be berak nullát
2. végigpörgeti r24-et 0 és 100 között
3. a legutolsó lépésben kerül be a 256. memóriacímre a 100-as érték
Magyarul: a te for ciklusod egyszer írja a memóriát, amikor kilép a ciklusból. Ez jó, mert a kód eszméletlenül gyors lesz tőle.
A hiba az interruptoknál jön tipikusan elő:

Kód: Egész kijelölése

ISR(INT1_vect)
{
  PORTD = változó;
}
Amikor az interrupt meghívódik, a változót megpróbáljuk eltárolni PORTD-re. De a változóban kezdetben 0 van, a végén 100 van, a köztes értékek teljességgel kimaradnak, ugyanis a for ciklus a belső regiszterekben történik, nem pedig a 256-os változó címén.

Tehát a hiba akkor jön elő, amikor a főprogram és az interrupt egyszerre használ egy globális változót.

Amikor beírod a változó elé, hogy volatile, akkor a fordító tudni fogja, hogy interrupt is használja a változót, így minden egyes hivatkozásnál kiolvassa a memóriából az értékét és mindenegyes változtatásnál visszaírja. A teljesítmény értelemszerűen drasztikusan le fog esni, de ugyanazt fogja látni a főprogram és az interrupt is.

Erre való a volatile.
Avatar
benzinkutas
DrótVégénSzéndarab
Hozzászólások: 31
Csatlakozott: 2011. április 30. szombat, 6:00

Re: Volatile hatása.

Hozzászólás Szerző: benzinkutas »

Köszönöm a kielégítő választ.

Egy párszol még el kell olvassam!
Válasz küldése