zmienne używane w przerwaniach avr-gcc

Oct 25, 2005 5 Replies

Witam.



Czy używając tej samej zmiennej np: typu integer w przerwaniu AVR i tej samej zmiennej w zwykłej funkcji muszę samodzielnie zadbać o jej prawidłową wartość ?



Np: w takiej sytuacji jak niżej czy muszę wywołać cli() przed sprawdzeniem i ?



timer interrupt(){ i++; }



int main(){



if(i == 10) // tu może być przerwanie ? tab[i] = 5; }


Dzięki za pomoc Paweł



Paweł przemówił ludzkim głosem:

Raczej powinieneś, ale zamiast blokować przerwanie możesz posłużyć się jakąś zmienną tymczasową do której przepiszesz "i" przed pierwszym porównaniem. Nie podałeś jaki rozmiar ma "i". Jeśli większy niż bajt to nawet na czas przepisywania zmiennej powinieneś wyłączyć przerwanie od timera. Sprawdź też, czy nie trzeba nadać zmiennej atrybutu volatile.

Napisał zmienna integer czyli koniecznie trzeba zablokować przerwanie bo nie jest to operacja "atomowa". Koniecznie atrybut volatile.

Mister

Nie rozumiem, dlaczego volatile skoro i tak mam zablokowane przerwania ?

czy nie będzie tak że jeżeli zablokuję przerwania to 'i' i tak nie zmieni się w trakcie wykonywania poniższych operacji? :

cli(); if(i == 10) tab[i] = 5; sei();

Pozdrawiam Paweł

A i nie rozumiem jeszcze jednego. Czy jeżeli będzie to zmienna 1 bajtowa i nie będę blokował przerwań to czy taki kawałek kodu zawsze będzie dobrze działał?

A czy kiedy pomiędzy porównaniem if, a przypisaniem do tab wystąpi przerwanie to volatile coś pomoże ?

if(i == 10)

tab[i] = 5;

Paweł

Mylisz pojęcia:

  1. volatile - nakazuje kompilatorowi (nie zgłębiając zbytnio tematu ) zakaz optymalizacji zmiennej.
  2. W powyższym przykładzie musisz zablokować przerwanie przed if i odblokować po przypisaniu gdyż "i" nie może być wtedy modyfikowane. Jeżeli chodzi o operację atomową na zmiennej typu char to tak musisz blokować przerwanie bo i może się zmienić po porównaniu a przed przypisaniem.

Jeżeli byś miał np. taki przypadek (i typu char):

if(i == 10)

tab[2] = 5; to blokada przerwań byłaby zbędna. Mister

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required