Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 20 sie 2026, o 16:12


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 24 maja 2013, o 10:27 
Offline
Użytkownik

Dołączył(a): 31 paź 2012
Posty: 99
Pomógł: 4

Witam .

Mam takie małe pytanko odnośnie 'volatile' . Po przeczytaniu wyjaśnienia w niebieskiej książce Mirka i uzupełnieniu ewentualnych braków tutaj byłem przekonany , że wiem wszystko o tym specyfikatorze .

Przeglądając jednak sieć parę dni temu natknąłem się na prezentowany poniżej fragment dokumentu


Cytuj:
Obsługa przerwań (3)
Nieco wydumana procedura obsługi przerwania INT0 zmienia
stan wyjścia co drugi raz:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Aktywne czekanie w procedurze obsługi przerwania jest
wyjątkowo złym rozwiązaniem!
Zostało użyte, aby uniknąć problemu drgania styków klawisza
i zademonstrować użycie słowa kluczowego volatile.

Zdecydowanie demonstruje użycie 'volatile' lecz nie wyjaśnia jego zastosowania .

O ile definiowanie wewnątrz przerwania zmiennej ze specyfikatorem 'static' jest dla mnie oczywiste ,nie bardzo jakoś jest dla mnie zrozumiałe , dlaczego zmienna definiowana wewnątrz przerwania opatrzona jest specyfikatorem 'volatile' ? Jaki ma to wpływ na zachowanie się programu po kompilacji ?

Szukałem odpowiedzi w sieci ale nie udało mi się znaleźć nic konkretnego co by mogło wyjaśnić powyższe zastosowanie 'volatile' , poza umieszczoną na wielu stronach regułą , że :

Cytuj:
ZAWSZE ale to ZAWSZE - jeśli korzystamy ze zmiennej zarówno w przerwaniu jaki i w dowolnej funkcji programu - TRZEBA użyć specyfikatora volatile.


Wydaje mi się jednak , że to bardziej odnosi się do zmiennej definiowanej w funkcji ,w czasie działania której przerwanie może być wywołane i dokonywać zmian na tej zmiennej a nie do zmiennej definiowanej w przerwaniu , która poza nim nie jest widoczna dla innych funkcji .

Tak więc nie wiem czy autorzy tego opracowania wzięli sobie tę regułę zbyt mocno do serca i wszędzie definiują zmienne 'volatile' czy jednak jak zwykle czegoś nie wiem i patrzę na to w zły sposób.

Dziękuję za jakiekolwiek wyjaśnienie i pozdrawiam .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 maja 2013, o 11:17 
Offline
Użytkownik

Dołączył(a): 24 kwi 2013
Posty: 454
Pomógł: 30

Według mnie powinna być tam zmienna lokalna. Chyba że komuś zależało, żeby po zakończeniu przerwania t widoczne na zewnątrz miało wartość 2000. Choć i tak trzeba by ją gdzieś wcześniej zadeklarować.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 maja 2013, o 11:40 

Pomógł: 0

#ciamciak# napisał(a):
Według mnie powinna być tam zmienna lokalna.
Według mnie jest tam zmienna lokalna :) A definiowanie jej jako ulotnej nie ma chyba większego sensu.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 24 maja 2013, o 11:55 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27464
Lokalizacja: Szczecin
Pomógł: 1045

wwojtek napisał(a):
Według mnie jest tam zmienna lokalna A definiowanie jej jako ulotnej nie ma chyba większego sensu.


w tym przypadku może mieć sens i ma - chociaż przykład jest hmmm powiedziałbym że nie wydumany ale ..... hmm hmmm - no dobra

w przerwaniu użyto pętli opóźniającej:

for (t = 0; t < 2000; ++t);

spróbuj sobie skompilować ten przykład bez volatile i z volatile i zobacz że kod raz będzie mniejszy (gdy nie ma volatile) a raz będzie większy gdy jest volatile ... a wiesz dlaczego ?

ano dlatego że gdy nie dasz volatile dla zmiennej t to kompilator z uwagi na włączoną optymalizację -Os usunie z kodu całą tą pętlę uznając że ona nic nie robi i do niczego nie jest potrzebna. (nie będzie opóźnienia)

jeśli zaś dasz volatile - to NAKAZUJESZ kompilatorowi BEZWZGLĘDNIE aby pod żadnym pozorem nie optymalizował działań ze zmienną t i wtedy taka pętla zostanie skompilowana i zadziała (będzie opóźnienie)

reasumując - przykład ten pokazuje inny sposób wykorzystania specyfikatora volatile - chociaż jest nieszczęśliwy - tyle że autor opracowania napisał wyraźnie że to wydumany przykład - tylko po to aby zaprezentować sposób wykorzystania volatile.


Autor postu otrzymał pochwałę

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 maja 2013, o 12:13 
Offline
Użytkownik

Dołączył(a): 31 paź 2012
Posty: 99
Pomógł: 4

pagosa747 napisał(a):
Zdecydowanie demonstruje użycie 'volatile' lecz nie wyjaśnia jego zastosowania .


mirekk36 napisał(a):
ano dlatego że gdy nie dasz volatile dla zmiennej t to kompilator z uwagi na włączoną optymalizację -Os usunie z kodu całą tą pętlę uznając że ona nic nie robi i do niczego nie jest potrzebna. (nie będzie opóźnienia)

jeśli zaś dasz volatile - to NAKAZUJESZ kompilatorowi BEZWZGLĘDNIE aby pod żadnym pozorem nie optymalizował działań ze zmienną t i wtedy taka pętla zostanie skompilowana i zadziała (będzie opóźnienie)


I to jest właśnie to czego mi brakowało , jak zwykle proste i zrozumiałe wytłumaczenie problemu .

Dziękuję bardzo i pozdrawiam .

Teraz widzę jak niewiele jeszcze wiem :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 maja 2013, o 13:35 

Pomógł: 0

Ajjjj mea maxima culpa :? Przez "nieblokujące" podejście do programowania tak się odzwyczaiłem od wszelkich pętelek opóźniających, że w ogóle o tym nie pomyślałem :roll: A sam niedawno dopisywałem "volatile" w identycznej sytuacji, bo mi "profesjonalna i firmowa" biblioteka durniała po włączeniu optymalizacji :lol:



Góra
  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO