zmienne używane w przerwaniach avr-gcc



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "Paweł" <paw1976_at_nospam_poczta.onet.pl>
Subject: zmienne używane w przerwaniach avr-gcc
Date: Tue, 25 Oct 2005 17:46:46 +0200


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ł



Poprzedni Następny
Wiadomość
Spis treści
From: Zbych <abuse_at_nospam_onet.pl>
Subject: Re: zmienne =?ISO-8859-2?Q?u=BFywane_w_przerwaniach_avr-gc?=
Date: Tue, 25 Oct 2005 18:28:01 +0200


Paweł przemówił ludzkim głosem:

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;
}

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.

Poprzedni Następny
Wiadomość
Spis treści
From: "Mister" <wojpie_at_nospam_wywal_to.poczta.onet.pl>
Subject: Re: zmienne używane w przerwaniach avr-gcc
Date: Wed, 26 Oct 2005 09:30:20 +0200


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



Poprzedni Następny
Wiadomość
Spis treści
From: "Paweł" <paw1976_at_nospam_poczta.onet.pl>
Subject: Re: zmienne używane w przerwaniach avr-gcc
Date: Wed, 26 Oct 2005 10:08:38 +0200


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

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ł



Poprzedni Następny
Wiadomość
Spis treści
From: "Paweł" <paw1976_at_nospam_poczta.onet.pl>
Subject: Re: zmienne używane w przerwaniach avr-gcc
Date: Wed, 26 Oct 2005 10:14:49 +0200


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ł




Poprzedni Następny
Wiadomość
Spis treści
From: "Mister" <wojpie_at_nospam_wywal_to.poczta.onet.pl>
Subject: Re: zmienne używane w przerwaniach avr-gcc
Date: Wed, 26 Oct 2005 11:01:57 +0200



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