RTV forum PL | NewsGroups PL

Zrozumienie priorytetów przerwań w AVR-gcc: INT0, INT4 i INT7 w praktyce

avr-gcc i priorytety przerwa

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Zrozumienie priorytetów przerwań w AVR-gcc: INT0, INT4 i INT7 w praktyce

pawel
Guest

Tue Apr 03, 2007 5:22 pm   



Witam.
Może mi ktoś wytłumaczyć jak to jest z tymi przerwaniami?

Z tego co wyczytałem to avr maja sprzętowy priorytet przerwań i nie da się
go zmienić
i że przerwanie o niższym wektorze ma większy priorytet.
Jednak nie do końca mi to działa w avr-gcc.

Obsługuję trzy zewnętrzne przerwania INT0, INT4 i INT7.
Może podam uproszczny przykład kodu:

SIGNAL(SIG_INTERRUPT4){
printf_P(PSTR("Przerwanie 4\r\n"));
sei();
while(1); //sprawdzenie priorytetów przerwań
}

SIGNAL(SIG_INTERRUPT0){
printf_P(PSTR("Przerwanie 0\r\n"));
}
SIGNAL(SIG_INTERRUPT7){
printf_P(PSTR("Przerwanie 7\r\n"));
}

Rozumiem że po wiejściu w przerwanie 4 wszystkie inne przerwania domyślnie

zablokowane nawet te o wyższym priotytecie jak IN0.
Więc odblokowałem sei(). Rozumiem też że w tym momencie już może
wykonać się przerwanie INT0 i tak się dzieje. Nie rozumiem tylko dlaczego
wykonuje się też przerwanie INT7? Przecież ma niższy priorytet i nie
powinno?
A może powinno?

Proszę o wyjaśnienie.
Dziękuję i pozdrawiam
Paweł

Pawel K
Guest

Tue Apr 03, 2007 5:25 pm   



pawel napisał(a):
Quote:
Witam.
Może mi ktoś wytłumaczyć jak to jest z tymi przerwaniami?

Z tego co wyczytałem to avr maja sprzętowy priorytet przerwań i nie da się
go zmienić
i że przerwanie o niższym wektorze ma większy priorytet.
Jednak nie do końca mi to działa w avr-gcc.

Obsługuję trzy zewnętrzne przerwania INT0, INT4 i INT7.
Może podam uproszczny przykład kodu:

SIGNAL(SIG_INTERRUPT4){
printf_P(PSTR("Przerwanie 4\r\n"));
sei();
while(1); //sprawdzenie priorytetów przerwań
}

SIGNAL(SIG_INTERRUPT0){
printf_P(PSTR("Przerwanie 0\r\n"));
}
SIGNAL(SIG_INTERRUPT7){
printf_P(PSTR("Przerwanie 7\r\n"));
}

Rozumiem że po wiejściu w przerwanie 4 wszystkie inne przerwania domyślnie

zablokowane nawet te o wyższym priotytecie jak IN0.
Więc odblokowałem sei(). Rozumiem też że w tym momencie już może
wykonać się przerwanie INT0 i tak się dzieje. Nie rozumiem tylko dlaczego
wykonuje się też przerwanie INT7? Przecież ma niższy priorytet i nie
powinno?
Priorytet tylko swiadczy o kolejnosci obslugiwania przerwan...


pozdrawiam
Pawel K

Luk@sz
Guest

Tue Apr 03, 2007 5:33 pm   



pawel napisał(a):
Quote:
Z tego co wyczytałem to avr maja sprzętowy priorytet przerwań i nie da się
go zmienić i że przerwanie o niższym wektorze ma większy priorytet.

Priorytety odnoszą się do kolejności wykonania jeśli wystąpią w tym
samym momencie.

Quote:
Rozumiem że po wiejściu w przerwanie 4 wszystkie inne przerwania domyślnie
są zablokowane nawet te o wyższym priotytecie jak IN0.
Więc odblokowałem sei(). Rozumiem też że w tym momencie już może
wykonać się przerwanie INT0 i tak się dzieje. Nie rozumiem tylko dlaczego
wykonuje się też przerwanie INT7? Przecież ma niższy priorytet i nie
powinno?

W momencie przyjęcia przerwania blokowane jest globalne zezwolenie na
przerwania. Jeśli je włączysz poprzez sei() to możesz w przerwać
aktualną funkcję obsługi przerwania innym przerwaniem. Nie ma tu żadnych
priorytetów ani ograniczeń(poza rozmiarem stosu). Jeśli chciałbyś
przyjmować wybrane przerwania musisz je programowo włączyć/wyłączyć.

Pozdro

pawel
Guest

Tue Apr 03, 2007 5:37 pm   



Quote:
Priorytet tylko swiadczy o kolejnosci obslugiwania przerwan...

Ech. Najważniejsze to rozumieć co się czyta.
Dzięki serdeczne.
Pozdrawiam
Paweł

pawel
Guest

Tue Apr 03, 2007 5:47 pm   



Quote:
Priorytet tylko swiadczy o kolejnosci obslugiwania przerwan...

Ale zaraz, zaraz. Czy to znaczy że przerwanie o wyższym priorytecie może
zostać przerwane
przez przerwanie o niższym jeżeli jest włączone ogólne zezwolenie sei()?
Czyli inaczej niż w procesorach 8051?

Paweł

Pawel K
Guest

Tue Apr 03, 2007 5:53 pm   



pawel napisał(a):
Quote:
Priorytet tylko swiadczy o kolejnosci obslugiwania przerwan...

Ale zaraz, zaraz. Czy to znaczy że przerwanie o wyższym priorytecie może
zostać przerwane
przez przerwanie o niższym jeżeli jest włączone ogólne zezwolenie sei()?
Czyli inaczej niż w procesorach 8051?
tak, i wcale nie ma znaczenia priorytet przerwania

jakie nadejdzie w trakcie wykonywania aktualnego.

Andy
Guest

Tue Apr 03, 2007 7:05 pm   



Użytkownik "Pawel K" <groups@kpw.qs.pl> napisał w wiadomości
news:euu0rb$lpu$1@inews.gazeta.pl...
Quote:
pawel napisał(a):
Priorytet tylko swiadczy o kolejnosci obslugiwania przerwan...

Ale zaraz, zaraz. Czy to znaczy że przerwanie o wyższym priorytecie może
zostać przerwane
przez przerwanie o niższym jeżeli jest włączone ogólne zezwolenie sei()?
Czyli inaczej niż w procesorach 8051?
tak, i wcale nie ma znaczenia priorytet przerwania
jakie nadejdzie w trakcie wykonywania aktualnego.


Niestety jest inaczej niz w 51.

W AVR wlasciwie nie ma priorytetow
w takim sensie, ktore przerwanie moze przerwac inne.

Trzeba to kontrolowac samemu
uzywajac flag lub odpowiednich sekwencji sei, cli.

--
Andrzej

Mister
Guest

Tue Apr 03, 2007 8:36 pm   



Quote:
SIGNAL(SIG_INTERRUPT0){
Poczytaj o INTERRUPT...



Mister

Łukasz Zemła
Guest

Wed Apr 04, 2007 7:34 am   



Mister napisał(a):
Quote:
SIGNAL(SIG_INTERRUPT0){
Poczytaj o INTERRUPT...


Albo (żeby być "trendy") o ISR( ).

--
Pozdrawiam,
Łukasz "Coulomb" Zemła

Krzysztof Piecuch
Guest

Wed Apr 04, 2007 7:41 am   



Mister napisał(a):
Quote:
SIGNAL(SIG_INTERRUPT0){
Poczytaj o INTERRUPT...


Mister



http://elportal.pl/n0017/c_materialy/dodatkowe/z_avrlibc.pdf


elektroda NewsGroups Forum Index - Elektronika Polska - Zrozumienie priorytetów przerwań w AVR-gcc: INT0, INT4 i INT7 w praktyce

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map