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.
Jest na to jakieś logiczne wytłumaczenie? Czekam na pomoc.
pozdr,
JnS
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