mirekk36 napisał(a):
w AVR nie ma priorytetów przerwań
A ja się z tobą Mirku nie zgodzę
. Priorytety są.
Twierdzę tak z lekką przekorą do słów Mirka, bo nie takie jak myśli kolega. I dla początkujących słowa Mirka powinny wystarczyć.
Priorytety są tylko uwzględniane przy wybieraniu do obsługi przerwania w przypadku jeżeli w danym momencie są zgłoszone dwa lub więcej przerwania. Wykona się przerwanie to z wyższym priorytetem (niższy adres wektora przerwania). Tak ustalonego priorytetu nie można zmienić. Oraz ten priorytet nie obowiązuje w czasie obsługi innego przerwania (nie ma systemu przerywania przerwania przez inne z wyższym priorytetem).
To coś jak na skrzyżowaniu z drogami równorzędnymi. Żadna droga nie ma pierwszeństwa (nie ma priorytetu), ale jak pojawią się dwa samochody w tym samym czasie, to musi być jakoś rozsądzone kto ma pierwszy przejechać (czyli jest priorytet
). Lecz jak już ktoś wjechał na skrzyżowanie, to on ma pierwszeństwo przed tym dojeżdżającym do skrzyżowania, niezależnie od jego strony. I w procesorze tak samo - w momencie sprawdzania flag przerwań "przelatywane" są one w zadanej kolejności (to są te priorytety), ale jak już któryś został wyzwolony, to już on dostał priorytet i inni czekają.
--
Pozdrawiam,
Robert
------------------------ [ Dodano po: 2 minutach ]O kicajek szybciej napisał o tym samym
------------------------ [ Dodano po: 15 minutach ]Wracając do problemu kolegi, to przerwanie z wyższym priorytetem (niższy wektor przerwania) może skanibalizować cały czas procesora i inne przerwanie o niższym priorytecie się może wykonywać bardzo rzadko, albo wcale.
Dlatego, jak masz zaburzony timing przerwania timera, to należy popatrzeć się co się dzieje w innych przerwaniach a szczególnie w przerwaniach o wyższym priorytecie, bo może ono się zapętla - trwa tak długo, że jak się kończy, to już czeka ustawiona ponownie flaga i następuje kolejne jego wyzwolenie.