Volatile hatása.
- benzinkutas
- DrótVégénSzéndarab
- Hozzászólások: 31
- Csatlakozott: 2011. április 30. szombat, 6:00
Volatile hatása.
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.
Re: Volatile hatása.
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).
Mit csinál a mikrokontroller legbelül, amikor a változót csökkentem 3-mal?
Mi ezzel a gond? A gond a for ciklusnál okoz elsődlegesen problémát.
Hogyan fordul le?
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ő:
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.
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ú
...
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
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
}
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
A hiba az interruptoknál jön tipikusan elő:
Kód: Egész kijelölése
ISR(INT1_vect)
{
PORTD = változó;
}
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.
- benzinkutas
- DrótVégénSzéndarab
- Hozzászólások: 31
- Csatlakozott: 2011. április 30. szombat, 6:00
Re: Volatile hatása.
Köszönöm a kielégítő választ.
Egy párszol még el kell olvassam!
Egy párszol még el kell olvassam!