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



Teraz jest 9 maja 2026, o 11:29


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 4 wrz 2018, o 12:31 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1085
Pomógł: 73

Cześć,

pisząc kod zacząłem zastanawiać się jak to jest z tym volatile w przypadku funkcji.....

Wytłumaczę na podstawie poniższego kodu.

Załóżmy, że mam dwie proste funkcję do ustawiania i odczytywania jakiejś flagi: set i get.

Funkcja set będzie czasem ustawiana w przerwaniu a czasem w pętli głównej. Odczytywana będzie tylko w pętli głównej.

Czy powinienem użyć tu volatile? Jesli tak, to w którym dokładnie miejscu?

Przygotowałem kilka kodów, zerknijcie proszę i napiszcie, który jest prawidłowy? A może żaden z nich? :)

Będę wdzieczny za każdą pomoc :)

1.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


2.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


3.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 wrz 2018, o 12:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2014
Posty: 855
Lokalizacja: pod Warszawą
Pomógł: 58

Oczywiście trzecia wersja. Zawsze jak używasz zmiennej w programie głównym i w przerwaniu specyfikatorem Votatile
Generalnie chodzi o to żeby kompilator nie optymalizował dostępu do takiej zmiennej.


Autor postu otrzymał pochwałę

_________________
Pomóżcie mi stanąć na nogi



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 wrz 2018, o 14:19 
Offline
Moderator
Avatar użytkownika

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

Moim zdaniem kolega przekombinował pytanie na maxa - podczas gdy zasada użycia volatile jest prosta jak drut i krótka

ZAWSZE ale to ZAWSZE jeśli jakaś zmienna ma być wykorzystywana zarówno w przerwaniu jak i w innej części programu to MUSI BYĆ volatile, a jeśli nie będzie używana w przerwaniu to nie musi mieć volatile

Oczywiście to PODSTAWOWA zasada - bo generalnie volatile oznacza tylko tyle że mówisz kompilatorowi: "ej ty nie optymalizuj mi dostępu do tej zmiennej" - wiadomo, że w zaawansowanym programowaniu można jej używać również w innych przypadkach albo chociażby np do przekazywania portów jako argumenty funkcji itp - ale zanim do tego dojdziesz wystarczy ta podstawowa formułka.


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: 4 wrz 2018, o 15:18 
Offline
Użytkownik

Dołączył(a): 10 gru 2016
Posty: 34
Pomógł: 1

mirekk36 napisał(a):
Moim zdaniem kolega przekombinował pytanie na maxa - podczas gdy zasada użycia volatile jest prosta jak drut i krótka

ZAWSZE ale to ZAWSZE jeśli jakaś zmienna ma być wykorzystywana zarówno w przerwaniu jak i w innej części programu to MUSI BYĆ volatile, a jeśli nie będzie używana w przerwaniu to nie musi mieć volatile

Oczywiście to PODSTAWOWA zasada - bo generalnie volatile oznacza tylko tyle że mówisz kompilatorowi: "ej ty nie optymalizuj mi dostępu do tej zmiennej" - wiadomo, że w zaawansowanym programowaniu można jej używać również w innych przypadkach albo chociażby np do przekazywania portów jako argumenty funkcji itp - ale zanim do tego dojdziesz wystarczy ta podstawowa formułka.


Dobrze też wiedzieć jak takie coś działa i po co się stosuje, a nie wykuć na blachę, że " tam użyj i już, bo tam musi być".


Cytując wikipedię:
volatile znaczy ulotny. Oznacza to, że kompilator wyłączy dla takiej zmiennej optymalizacje typu zastąpienia przez stałą lub zawartość rejestru, za to wygeneruje kod, który będzie odwoływał się zawsze do komórek pamięci danego obiektu. Zapobiegnie to błędowi, gdy obiekt zostaje zmieniony przez część programu, która nie ma zauważalnego dla kompilatora związku z danym fragmentem kodu lub nawet przez zupełnie inny proces.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 wrz 2018, o 15:22 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1085
Pomógł: 73

mirekk36 napisał(a):
Moim zdaniem kolega przekombinował pytanie na maxa - podczas gdy zasada użycia volatile jest prosta jak drut i krótka

ZAWSZE ale to ZAWSZE jeśli jakaś zmienna ma być wykorzystywana zarówno w przerwaniu jak i w innej części programu to MUSI BYĆ volatile, a jeśli nie będzie używana w przerwaniu to nie musi mieć volatile

Oczywiście to PODSTAWOWA zasada - bo generalnie volatile oznacza tylko tyle że mówisz kompilatorowi: "ej ty nie optymalizuj mi dostępu do tej zmiennej" - wiadomo, że w zaawansowanym programowaniu można jej używać również w innych przypadkach albo chociażby np do przekazywania portów jako argumenty funkcji itp - ale zanim do tego dojdziesz wystarczy ta podstawowa formułka.


Tak Mirku, pamiętam to z BB ale powiedz mi, czy argument funkcji "set..." również powinien być Volatile?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 wrz 2018, o 15:30 
Offline
Moderator
Avatar użytkownika

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

a spróbuj dać "bez volatile" i sam sprawdź ;) zachęcam do takich testów ... bo to wiele więcej cię nauczy

mówię ci skompiluj sobie to i zobacz co się stanie, sprawdź i z volatile i bez dla argumentu - a jak jeszcze nie będziesz wiedział o co chodzi to śmiało tu dopytaj

_________________
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: 5 wrz 2018, o 06:18 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1085
Pomógł: 73

Ok, dzięki Panowie :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 wrz 2018, o 06:41 
Offline
Moderator
Avatar użytkownika

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

czyli jak widzisz - jeśli zmienna ma specyfikator volatile to kompilator będzie się burzył jeśli taką zmienną będziesz chciał przekazać jako argument funkcji a będzie on (ten argument) pozbawiony tegoż specyfikatora.

Zwrócę jeszcze uwagę, że w przypadku tak prostego ustawiania flag - to troszkę hmmm nadmiarowym delikatnie mówiąc jest tworzenie funkcji set() do zapalania czy gaszenia tej flagi, zamiast tej funkcji wystarczy po prostu w przerwaniu i w kodzie przypisywać fladze wartość bezpośrednio - typu

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


albo

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
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: 5 wrz 2018, o 20:56 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1085
Pomógł: 73

Zgadza się, te funkcje są na wyrost trochę ale bardziej chodzi mi o zrozumienie istoty problemu :)

Rozbudowałem program o callbacka, możecie zerknąć i powiedzieć, czy teraz volatile jest też potrzebny? Jeśli tak to gdzie i dlaczego? :) to tylko teoretyczne rozważanie. W przerwaniu wywołuję callbaka i w tym callbaku wywołuję dopiero funkcję set....

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


czy to ma prawo działać?



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

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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO