[ memento.ei @ 07.11.2013. 01:14 ] @
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 ??

[ bogdan.kecman @ 07.11.2013. 01:33 ] @
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?
[ memento.ei @ 07.11.2013. 02:37 ] @
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; ??
[ lestrigonac @ 07.11.2013. 09:58 ] @
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
[ bogdan.kecman @ 07.11.2013. 10:18 ] @
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 ..