logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

AVR/ATmega8 - Gdzie stosować volatile przy tablicach i strukturach?

lukaszjanda 26 Sty 2017 14:03 2451 40
  • #1 16229669
    lukaszjanda
    Poziom 11  
    Witam, ostatnio pisze bibliotekę służącą do eliminacji drgań styków w przyciskach.
    Będzie to działało w ten sposób, że w timerze wywołujemy funkcje obniżającą czas po którym możemy wcisnąć przycisk kolejny raz.
    Tak samo w kodzie - używamy funkcji z biblioteki która robi wszystko za nas :)

    Jednak napotkałem na taki problem - gdzie zastosować volatile przy tablicy i strukturze? Nie jestem pewien ale czy jesli w tablicy zastosuje volatile to wtedy kompilator za kazdym razem bedzie sprawdzal po prostu jej adres, a nie wartosci?
    uC - ATmega8

    Oto kod:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    [/code]
  • #2 16229732
    BlueDraco
    Specjalista - Mikrokontrolery
    A nie prościej zwyczajnie wykrywać naciśnięcie w przerwaniu timera? Toż to dwie linie kodu tylko, bez żadnych funkcji i bibliotek...
  • #3 16230117
    grko
    Poziom 33  
    @lukaszjanda Przed użyciem volatile powinieneś się zastanowić dlaczego chcesz aby miała ona taki atrybut. Samo użycie zmiennej w dwóch różnych kontekstach jeszcze nie determinuje tego, że musi być zastosowane volatile. W Twoim przypadku spodziewałbym się problemów z dostępem do pól struktury eliminacja z wielu kontekstów.
  • #4 16231346
    JacekCz
    Poziom 42  
    W popularnym odczuciu volatile robi jakąś magię przy programowaniu wątkowym ,przerwaniach itd... to tak funkcjonuje na zasadzie ktoś widział przez ramię i słyszał, że sąsiada bratanek nawet wie dlaczego

    Jest to w C,C++ ale (o dziwo dla niektórych) w Javie i C# jednakowo błędna wiara, prostowana przez kompetentnych instruktorów.
    W nowszych z tych języków jest koncepcja danej przez język synchronizacji, m.in w postaci słowa synchronized, jest to o czym nieświadomie marzy większość użytkowników używając volatile

    volatile jest TYLKO prośbą aby kompilator nie optymalizował do zmiennej rejestrowej

    W żadnym z tych języków nie ma gwarancji spójności mimo deklaracji volatile (a spójnośc jest drugim z marzeń tych co używają słowa ) dla danych większych niż naturalny dla platformy integer
  • #5 16231371
    Konto nie istnieje
    Konto nie istnieje  
  • #6 16231451
    Konto nie istnieje
    Konto nie istnieje  
  • #7 16231866
    Konto nie istnieje
    Konto nie istnieje  
  • #8 16231906
    Konto nie istnieje
    Konto nie istnieje  
  • #9 16231917
    grko
    Poziom 33  
    JacekCz napisał:

    W żadnym z tych języków nie ma gwarancji spójności mimo deklaracji volatile (a spójnośc jest drugim z marzeń tych co używają słowa ) dla danych większych niż naturalny dla platformy integer


    To również nie jest poprawnym stwierdzeniem. Dla naturalnego typu dla danej platformy nie mamy zapewnionej atomowości a zarazem spójności danych związanej z wielodostępem do tego typu zmiennych. Nie ma to asolutnie nic wspólnego z volatile.
  • #10 16232024
    Konto nie istnieje
    Konto nie istnieje  
  • #11 16232082
    Konto nie istnieje
    Konto nie istnieje  
  • #12 16232102
    Konto nie istnieje
    Konto nie istnieje  
  • #13 16232106
    Konto nie istnieje
    Konto nie istnieje  
  • #14 16232134
    Konto nie istnieje
    Konto nie istnieje  
  • #15 16232151
    Konto nie istnieje
    Konto nie istnieje  
  • #16 16232231
    Konto nie istnieje
    Konto nie istnieje  
  • #17 16232239
    Konto nie istnieje
    Konto nie istnieje  
  • #18 16232248
    Konto nie istnieje
    Konto nie istnieje  
  • #19 16232265
    Konto nie istnieje
    Konto nie istnieje  
  • #20 16232450
    BlueDraco
    Specjalista - Mikrokontrolery
    Chłopaki, wątek chyba nie był na ten temat, a Autor dawno uciekł. Chcecie się potłuc - to może prywatnie_?
    PS: Albertb ma tym razem rację. ;)
  • #21 16232550
    Konto nie istnieje
    Konto nie istnieje  
  • #22 16232655
    BlueDraco
    Specjalista - Mikrokontrolery
    Kompilator / konsolidator realizuje zmienną tak, jak jest to możliwe. Jeśli zmienna volatile jest lokalna dla funkcji, to może ona zostać umieszczona w rejestrze. Teoretycznie zmienna publiczna też może być zrealizowana w rejestrze, tylko wymaga to wiedzy o całym programie i w dodatku stwierdzenia, że możemy sobie na to pozwolić, bo wszystkie funkcje mają mało zmiennych i zostaje globalnie wolny rejestr - więc normalny kompilator przy normalnym programie tego nie zrobi. Byłoby to możliwe tylko przy optymalizacji globalnej, co wymaga "zawrócenia" programu w postaci skonsolidwanej do kompilatora. Teoretycznie np. GCC to potrafi i odpowiednie mechanizmy istnieją, co nie znaczy, że w praktyce się to kiedykolwiek uda. W każdym razie definicja języka w żaden sposób tego nie wyklucza.

    No i właśnie dałem się wciągnąć w bicie piany... ;)
  • #23 16232699
    JacekCz
    Poziom 42  
    BlueDraco napisał:
    Kompilator / konsolidator realizuje zmienną tak, jak jest to możliwe. Jeśli zmienna volatile jest lokalna dla funkcji, to może ona zostać umieszczona w rejestrze. Teoretycznie zmienna publiczna też może być zrealizowana w rejestrze, tylko wymaga to wiedzy o całym programie i w dodatku stwierdzenia, że możemy sobie na to pozwolić, bo wszystkie funkcje mają mało zmiennych i zostaje globalnie wolny rejestr - więc normalny kompilator przy normalnym programie tego nie zrobi. Byłoby to możliwe tylko przy optymalizacji globalnej, co wymaga "zawrócenia" programu w postaci skonsolidwanej do kompilatora. Teoretycznie np. GCC to potrafi i odpowiednie mechanizmy istnieją, co nie znaczy, że w praktyce się to kiedykolwiek uda. W każdym razie definicja języka w żaden sposób tego nie wyklucza.



    Zachodzi to co piszesz. Niezbyt duży projekt w dość dobrym stylu C++ (czyli nie za bardzo otwarte zakresy itd...) prywatna statyczna składowa (małej) klasy zniknęła ze statycznego dumpu, choć metody używają. ATmel Studio 7 więc GCC
  • #24 16232704
    Konto nie istnieje
    Konto nie istnieje  
  • #25 16232737
    grko
    Poziom 33  
    @Piotrus_999 Ale standard nie definiuje również innych źródeł zmiany tego typu zmiennych więc chyba może być przez działanie procesora. Co nie?

    Nejlepszym dowodem na to jest to, że taki program się bez problemu kompiluje i generuje spodziewany output:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    @JacekCz LTO jest w gcc od dłuższego czasu więc nie ma się czym ekscytować specjalnie.
  • #26 16232822
    Konto nie istnieje
    Konto nie istnieje  
  • #27 16232831
    grko
    Poziom 33  
    @Piotrus_999 To może skompilujesz i sprawdzisz? Bo to, że generuje się warning to jest jedna sprawa a to, że to dozwolona konstrukcja to inna. Nie mniej, nie ma żadnych przeszkód aby zmienna miała atrybut volatile oraz register (pomijając już sensowność tego typu rozwiązań). Standard tego absolutnie nie zabrania. Aż dziwne, że na Twoim przykładzie trzeba Ci to tłumaczyć.
  • #28 16232855
    Konto nie istnieje
    Konto nie istnieje  
  • #29 16232891
    grko
    Poziom 33  
    Piotrus_999 napisał:
    @grko Nie czytasz postów i pouczasz - gdzie napisałem że nie można?

    Przecież już wcześniej o tym pisałem. przy volatile chcielibyśmy uniknąć optymalizacji pisania i odczytywania, a kompilator o tym przestrzega.
    Piotrus_999 napisał:
    Poza globalną zmienną w rejestrze typu register char x asm ("r5"); to nie może być.

    Zresztą nie wiem jak to jest z optymalizacją operacji na takich zmiennych, w każdym bądz razie dodanie im atrybutu volatile daje warning, ze zmienne register mogą być optymalizowane.


    Po pierwsze, dlaczego zmienna register nie może być volatile? W kodzie, który wrzuciłem mimo warninga kompilator umieścił ta zmienna w żądanym rejestrze? Po drugie, jakie optymalizacje mógłby zastosować kompilator wobec tego typu zmiennej co by ją czyniło "nie volatile"?
  • #30 16232929
    BlueDraco
    Specjalista - Mikrokontrolery
    Jeżli nikt nie nakazał kompialtorowi, by zmienna volatile była w miejscu innym niż rejestr, to może ona być w rejestrze. A nakazać można albo przypisując jej jawnie adres lub sekcję, albo pobierając jej adres i używając go do czegoś. Można przecież sobie wyobrazić sytuację, gdy zmienna umieszczona w rejestrze służy do komunikacji pomiędzy procedurą obsługi przerwania i wątkiem i zapewne przy odpowiednich zaklęciach kompilator GCC na AVR to potrafi zrobić.
REKLAMA