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

Avr studio 6, C - Petla while działa mimo niespełnionego warunku

bczarnota 17 Lip 2013 23:39 1572 9
  • #1 12533719
    bczarnota
    Poziom 11  
    Program sprawdzam pod debuggerem, problem pojawia się w jednej linijce kodu i jest bardzo irytujący.
    while(Status1 == 1);

    W trakcie działania programu przerwanie od timera zmienia zmienną Status1 z 1 na 0 i do tego momentu debugger pokazuje że wszystko działa. Kiedy podejrzę sobie wartość zmiennej jest ona równa 0 po przerwaniu a program zawiesza się na pętli. Co ciekawe takie rozwiązanie raz działa a raz nie i nie wiem zupełnie od czego to zależy. Program wgrany na Atmege 8 też nie działa poprawnie. Ma ktoś jakiś pomysł?
  • #3 12534266
    stanleysts
    Poziom 27  
    Nie masz nawiasu masz średnik od razu, to jest bezsensu.
  • #4 12534687
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #5 12534729
    piotrva
    VIP Zasłużony dla elektroda
    stanleysts napisał:
    Nie masz nawiasu masz średnik od razu, to jest bezsensu.

    Nie w tym problem - taki zapis jest poprawny;
    Skoro zmienna jest zmieniana w przerwaniu to obstawiam jak przedmówcy na brak atrybutu volatile.
  • #6 12536828
    stanleysts
    Poziom 27  
    Facepalm :D
    Nigdy tego bez nawiasów nie użyłem, co nie zmienia faktu, że byłem pewny że działa na odwrót :P
  • #7 12537355
    bczarnota
    Poziom 11  
    Magia :) nagle wszystko działa jak w zegarku. Jeszcze prosił bym o wyjaśnienie dlaczego tak się dzieje. Dziękuje serdecznie za pomoc :)
  • #8 12537380
    stanleysts
    Poziom 27  
    W skrócie zmienne volatile są odczytywane z aktualną wartością za każdym razem (ich wartość może się nagle zmieniać - tak jak zmiana zmiennej poprzez przerwanie), bez tego kompilator może optymalizować kod i pracować na starych wartościach.
  • #9 12537381
    piotrva
    VIP Zasłużony dla elektroda
    bczarnota napisał:
    Jeszcze prosił bym o wyjaśnienie dlaczego tak się dzieje.

    No to:
    mickpr napisał:
    Pokaż nieco większy fragment programu.

    I nadal nie mówisz nic czy zmienna jest volatile czy nie.
    Jeśli nie to wtedy (sam zaobserwowałem) czasem działa, ale w 99% przypadków nie działa.

    Dodano po 6 [minuty]:

    Co do samego pytania o volatile - jak wspomniał kol. @stanleysts:
    modyfikator volatile powoduje, że wszystkie odwołania do danej zmiennej są prowadzone zawsze w kontekście pamięci SRAM, jeśli tego modyfikatora nie ma kompilator może daną zmienną na drodze optymalizacji umieścić np. w rejestrze i wtedy przerwanie zmodyfikuje wartość w SRAM, ale program będzie operował na jej kopii umieszczonej w jakimś rejestrze. Ale może się zdarzyć, że kompilator tak przetłumaczy program na język maszynowy, że akurat oba odwołania będą do SRAM i wszystko zadziała... Do czasu nawet drobnej modyfikacji programu.
  • #10 12537514
    bczarnota
    Poziom 11  
    Dodanie argumentu volatile przed zmienną załatwiło sprawę, pokazanie większego fragmentu kodu nie było konieczne, jeżeli komuś na nim bardzo zależy to zapraszam na pw. Temat uznaje za zamknięty. Dziękuje wszystkim zainteresowanym za pomoc :)
REKLAMA