Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

modifikator volatile ??

[es] :: Elektronika :: Mikrokontroleri :: modifikator volatile ??

[ Pregleda: 3440 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

memento.ei
student

Član broj: 316313
Poruke: 16
*.dynamic.isp.telekom.rs.



+11 Profil

icon modifikator volatile ??07.11.2013. u 01:14 - pre 126 meseci
Mozda nije pitanje za ovaj deo foruma ali pri programiranju mikrokontrolera se koristi :),
ili ti vise puta sam naleteo na nju...

Naso sam ovakvo objasnjenje :
"Modifikatorom volatile se prevodiocu saopstava da se sadrzaj ovih promenljivih moze
promeniti mimo kontrole programa, to jest od strane samih periferijskih jedinica.
Dodavanjem modifikatora volatile sprecava se mogucnost da prevodilac izvrsi optimizaciju
koda na mestu gde se pristupa I/O registru".

E sad moze li neko dati neki praktican primer de se konkretno koristi promenljiva volatile
pri programiranju mikrokontrolera, i sta bi bilo ako je ne bi koristio ??


Sve električne stvari rade na beli dim, kad taj beli dim iz njih izađe, te stvari više
ne rade.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: modifikator volatile ??07.11.2013. u 01:33 - pre 126 meseci
Code:

volatile int varijabla;
...
interrupt isr(){  //ovo ti je interapt
  if (PORTX.Y == 1 ) varijabla = 1;
}

void main(){
...
 varijabla =0;
 while (varijabla == 0){
    // iz ove petlje neces nikad izaci
    // ako varijabla nije volatile
    PORTA.1 = 1;
    PORTA.1 = 0;
 }
//sav kod koji se ovde nalazi nece postojati


dakle ako varijablu ne deklarises kao volatile kompajler ce da zakljuci da posto unutar petlje ne menjas vrednost varijable a pre toga je varijabla = 0 on ne vidi da varijabla moze da se promeni sa vrednosti nula i sve posle petlje ce da izbaci napolje kao mrtav kod a while(varijabla == 0) ce da zameni sa mrtvom petljom ... kada mu kazes da je varijabla volatile onda kompajler zna da varijabla moze "magicno" da se promeni na nekom drugom mestu "za koje on ne zna" i nece da izoptimizuje taj deo koda i izbaci mrtav kod (koji nije mrtav) i slicno ... u ovom primeru ta varijabla se menja u interaptu (sto kompajler ne moze da zna), isto tako varijabla moze da bude vezana za neku posebnu mem lokaciju u mikrokontroleru koja se menja van samog koda (PORTX je primer takve varijable i ona je vec definisana kao volatile) no ti mozes sam svoju varijablu da zalepis na neku memorisku lokaciju koja se ne menja programski vec van programa (na neki counter, externi ulaz etc..) i onda moras da je deklarises kao volatile ...

jasno?
 
Odgovor na temu

memento.ei
student

Član broj: 316313
Poruke: 16
*.dynamic.isp.telekom.rs.



+11 Profil

icon Re: modifikator volatile ??07.11.2013. u 02:37 - pre 126 meseci
Hvala Bogdane na odgovoru, ako sam dobro razumeo, za
deo koda koji si naveo kao primer ali bez upotrebe modifikatora volatile, recimo ako stoji samo int varijabla;
Citat:
bogdan.kecman
Code:

 int varijabla;
...
interrupt isr(){  //ovo ti je interapt
  if (PORTX.Y == 1 ) varijabla = 1;
}

void main(){
...
 varijabla =0;
 while (varijabla == 0){
    // iz ove petlje neces nikad izaci
    // ako varijabla nije volatile
    PORTA.1 = 1;
    PORTA.1 = 0;
 }
//sav kod koji se ovde nalazi nece postojati


recimo program se nalazi u petlji while , desava se interapt, program skace u interapt,
varijabla pri povratku iz interapta je 1 i program izlazi iz petlje, ali posto deo koda posle petlje ne postoji
(jer je prevodilac izbriso taj deo => nismo stavili volatile),
varijabla ponovo postaje =>varijabla =0; ??

Sve električne stvari rade na beli dim, kad taj beli dim iz njih izađe, te stvari više
ne rade.
 
Odgovor na temu

lestrigonac
Lestrigonac
Futog, Novi Sad

Član broj: 145470
Poruke: 247
*.dynamic.kdsinter.net.



+2 Profil

icon Re: modifikator volatile ??07.11.2013. u 09:58 - pre 126 meseci
Neces nikada izaci iz while petlje, posto ce kompajler prilikom prevodjenja (ukoliko nema optimizacije) uslov u while petlji da interpretira kao uvek tacan (umesto uslova ce staviti TRUE ili 1).

Ovde je detaljno objasnjeno. ;)

Srdacan pozdrav,
Lestrigonac
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2377 Profil

icon Re: modifikator volatile ??07.11.2013. u 10:18 - pre 126 meseci
upravo kako je lestrigorac objasnio, nikad neces izaci iz while posto ce
umesto while (v==0){...} biti labela: .. goto labela dakle nema vise
proedjenja (sto bi poredio kada "zna" da je uvek netacno), takodje ceo
kod posle while petlje ne postoji, cemu kada nikad ne mozes da udjes u
njega, ako unutar while petlje citas varijablu to ce umesto varijable da
zameni konstantom 0 etc etc ..
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: modifikator volatile ??

[ Pregleda: 3440 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.