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
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?
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
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?
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: