avr-gcc i priorytety przerwań

Apr 03, 2007 9 Replies

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 napisał(a):

Priorytet tylko swiadczy o kolejnosci obslugiwania przerwan...

pozdrawiam Pawel K

pawel napisał(a):

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

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

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

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 napisał(a):

tak, i wcale nie ma znaczenia priorytet przerwania jakie nadejdzie w trakcie wykonywania aktualnego.

Użytkownik "Pawel K" snipped-for-privacy@kpw.qs.pl> napisał w wiadomości news:euu0rb$lpu$ snipped-for-privacy@inews.gazeta.pl...

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.

Poczytaj o INTERRUPT...

Mister

Mister napisał(a):

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

Mister napisał(a):

formatting link

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required