Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega 32 - specyfikator volatile

squelch 18 Kwi 2015 10:24 642 7
  • #1 18 Kwi 2015 10:24
    squelch
    Poziom 11  

    Cześć

    Załóżmy że mam pewną funkcje w której zwiększam zmienną a o jeden. W funkcji main wywołuje funkcje i wynik przypisuje do zmiennej b. Załóżmy też że mam przerwanie które też zwiększa a o jeden. W celu optymalizacji operacje na zmiennej a będą wykonywane w wolnym rejestrze i przy wyjściu z funkcji wynik rejestru zapiszemy do zmiennej załóżmy że wywoła się funkcja i mamy zwiększone a i nagle bach nastąpiło przerwanie w którym zwiększy się a o jeden w wolnym rejestrze i przy wyjściu z przerwania wynik zapiszemy do zmiennej a.

    Po co w takim razie stosować to volatile :?: :?: :?: . Czy moglibyście podać jakiś mały kod w C gdzie widać różnice z zastosowaniem volatile i bez może ja coś żle kumam w tym przykładzie.

    0 7
  • #2 18 Kwi 2015 10:30
    BlueDraco
    Specjalista - Mikrokontrolery

    Twoje pytanie nie ma związku z ATmega - to są kwestie definicji języka C.
    Jeśli modyfikujesz (np. inkrementujesz) zmienną w kodzie o dwóch różnych priorytetach (np. w przerwaniu i w pętli), to żaden volatile nie pomoże - musisz zablokować przerwania w programie głównym na czas modyfkacji zmiennej. Co innego, jeśli np. w przerwaniu inkrementujesz,a w wątku głównym tylko przypisujesz nową wartość.

    volatile zapewnia poprawne wykonanie w tym drugim przypadku - umożliwia bezpieczne testowanie wartości zmiennej modyfikowanej bez wiedzy kodu testującego.

    0
  • #3 18 Kwi 2015 11:22
    94075
    Użytkownik usunął konto  
  • #4 18 Kwi 2015 11:36
    BlueDraco
    Specjalista - Mikrokontrolery

    No, z tą szybkością to akurat nieprawda - inkrementacja zmiennej o dowolnej długości na CM zajmuje 3..4 instrukcje, to przy 50 MHz wciąż będzie na ogół szybciej niż jedna instrukcja na 8.bitowcu... ;)

    1
  • #5 18 Kwi 2015 11:52
    94075
    Użytkownik usunął konto  
  • #6 18 Kwi 2015 12:50
    -psiak-
    Poziom 32  

    Właściwie to wszystko już powiedziano wyżej, ale chciałeś przykład, więc ...

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #7 19 Kwi 2015 18:56
    mcvsama
    Poziom 15  

    squelch napisał:
    Czy moglibyście podać jakiś mały kod w C gdzie widać różnice z zastosowaniem volatile i bez może ja coś żle kumam w tym przykładzie.


    Volatile zasadniczo zostało wymyślone do tego, aby robić I/O za pomocą pamięci. Tj. pod jakimś adresem masz nie komórkę pamięci, ale urządzenie, które nasłuchuje operacji pisania po pamięci. Pisząc pod ten adres tak naprawdę komunikujesz się z urządzeniem. Teraz jeśli nie użyjesz volatile i kompilator zoptymalizuje Ci jakieś zapisy lub odczyty… to zepsuje Ci całą komunikację. Wtedy używasz volatile, który - jak już przedpiścy wytłumaczyli - powoduje, że kompilator nie wtrynia się ze swoimi optymalizacjami.

    Atomowość to co innego - zmienne volatile nie gwarantują atomowości ani zapisów, ani odczytów.

    0
  • #8 20 Kwi 2015 13:29
    dondu
    Moderator Mikrokontrolery Projektowanie

    albertb napisał:
    Dlatego potrzebne jest blokowanie przerwań.

    Dodać należy, że dla przykładu podanego przez kol. albertb, że w przypadku mikrokontrolerów AVR przy wejściu w funkcję obsługi przerwania następuje automatyczne zablokowanie przerwań, więc pod tym względem operacje w tej funkcji są atomowe (wyjątek gdy użyjemy ISR_NOBLOCK wtedy pierwszym rozkazem w funkcji przerwania jest rozkaz odblokowania przerwań sei).

    Jednakże poza funkcją przerwania (lub w funkcji przerwania z ISR_NOBLOCK) należy już zadbać o atmowość niezależnie od użycia volatile, bo np. zmniejszenie zmiennej volatile unsigned long trwa dość długo:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    i może stać się to co opisali albertb i BlueDraco, a co podsumował kol. mcvsama:

    mcvsama napisał:
    Atomowość to co innego - zmienne volatile nie gwarantują atomowości ani zapisów, ani odczytów.

    0