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

[AVR-GCC] Volatile nie działa

johny_w 13 Lut 2009 16:25 1936 3
REKLAMA
  • #1 6144858
    johny_w
    Poziom 23  
    Witam.
    Mam dość dziwny problem. Zmienne volatile działają mi jak należy, jednak z jedną z nich jest coś nie tak. Zmienna modyfikowana jest w przerwaniu, a odczytywana w innej funkcji.
    Problemem jest to, że zmienna odczytywana w funkcji zawsze ma wartość zero. Na pewno działa tak jak należy - to sprawdziłem. Wysyłałem jej wartość prosto z przerwania po SPI i zawsze się zgadzało. Zdisasemblowałem program i oba odwołania do zmiennej są poprawne. Zarówno przerwanie jak i funkcja odwołują się do tego samego adresu pamięci.
    Dziwne też jest to, że w innym przerwaniu (na innej zmiennej) to samo działa tak jak powinno.

    volatile uint16_t head0, tail0;
    volatile uint16_t head1, tail1;
    
    ISR(USART0_RX_vect)
    {
        uint16_t head0Tmp;
    
        head0Tmp = (head0+1)&127
        ...
        head0 = head0Tmp;
    }
    
    ISR(USART1_RX_vect)
    {
        uint16_t head1Tmp;
    
        head1Tmp = (head1+1)&127
        ...
        head1 = head1Tmp;
    }
    
    uint16_t getSize0(void)
    {
        return (head0-tail0);       //tutaj jest ok
    }
    
    uint16_t getSize1(void)
    {
        return (head1-tail1);       //tutaj zawsze zmienna head1 ma wartość 0
    }


    Jest na to jakieś logiczne wytłumaczenie? Czekam na pomoc.

    pozdr,
    JnS
  • REKLAMA
  • #2 6146773
    MarcinKawka
    Poziom 12  
    ten kod który przesłałeś wygląda chyba OK. Ale mogą być inne przyczyny, np. jakieś niespodziewane RESETy po drodze, złe ustawienia USARTa, itp.
  • REKLAMA
  • #3 6147735
    Aro_
    Poziom 15  
    Spróbuj zmienić przerwania miejscami, tzn zamiast USART1 daj USART0 i na odwrót. Zmienne są w porządku, problem raczej jest z przerwaniem.
  • #4 6147821
    johny_w
    Poziom 23  
    Witam.
    Ustawienia uarta są w porządku. Żadnych resetów czy innych dziwnych rzeczy też nie ma. Cały program działa tak jak powinien. Oba uarty poprawnie buforują dane. W przypadku uart1 sprawdziłem bezpośrednio odwołując się do pamięci.
    Myślałem też, że może wina leży w przepełnieniu stosu lub czymś podobnym. Wywaliłem większość programu włącznie z przerwaniem od uart0. I nic. dalej to samo. Przy pełnej funkcjonalności programu mam zajęte mniej niż 1kb ramu. Zostaje jeszcze ponad 3kb. Więc to też odpada.

    W pon. spróbuję zamienić te przerwania.
REKLAMA