External avbryter på MPIDE del 2: setIntVector() (5 / 10 steg)
Steg 5: SetIntPriority(): Vad är prioriterade?
Vad i hela världen är en "avbrott prioritet" och varför behöver vi ställa in den?
Låt oss säga att ISR (Interrupt Service rutin, om du minns från del 1) för Int1 är upptagen utförande, men innan det kan avsluta, Int2 blir utlöst och försöker ringa är det egna ISR (vi kallar dem ISR1 och ISR2, för enkelhetens skull). Vad händer? Har ISR1 få sätta på paus medan ISR2 utför, eller har ISR2 att vänta tills ISR1 är klar? Svaret beror på prioriteten av Int1 och Int2.
Låt oss säga att Int1 har prioritetsvärdet 4, och Int2 har en prioritering av 5. I detta fall, eftersom Int2 har högre prioritet, blir ISR1 paus så att ISR2 kan utföra. Sedan, när ISR2 är klar, ISR1 återupptas där den slutade.
Låt oss byta det nu Int1 har en prioritering av 5 och Int2 har en prioritering av 4. I detta fall, eftersom Int1 har högre prioritet, ISR2 måste vänta tills ISR1 är gjort köra innan det kan börja.
Prioriterade nivåer varierar från 1 till 7, där 7 är den högsta. Faktiskt, det finns också en prioritetsnivå 0, men som anses vara funktionshindrade, och kommer aldrig att köra. När det gäller vårt program satt vi Int2 prioritet till 4.
(Lägg märke till hur vi fortfarande använder "_EXTERNAL_2_VECTOR"? Det blir viktigt i ett stycke.)
"Vänta..." Jag kan höra du tänker (med min tankeläsaren befogenheter), "vad händer om två avbryter med samma prioritet utlöses?"
Bra fråga! I vårt tidigare exempel, om både Int1 och Int2 har en prioritering av 4, då ISR2 kommer alltid vänta på ISR1 till slut köra innan det kan börja.
Men vänta! Det finns mer!