Étape 5: SetIntPriority() : ce qui est prioritaire ?
Ce qui dans le monde est une « priorité d’interruption » et pourquoi avons-nous besoin de le mettre ?
Disons que l’ISR (Interrupt Service Routine, si vous vous souvenez de la partie 1) pour Int1 est occupé à exécuter, mais avant elle peut finir, Int2 se déclenche et essaie d’appeler c’est propre ISR (nous appellerons ISR1 et ISR2, pour plus de commodité). Que se passe-t-il ? ISR1 se met en pause tandis que ISR2 s’exécute, ou ISR2 doit-il attendre que ISR1 est fini ? La réponse dépend de la priorité de Int1 et Int2.
Disons que Int1 a une priorité de 4, et Int2 a une priorité de 5. Dans ce cas, Int2 ayant une priorité plus élevée, ISR1 obtient en pause pour que ISR2 puisse exécuter. Puis, une fois fait, ISR2 ISR1 reprend où elle s’était arrêtée.
Nous allons passer maintenant donc Int1 a une priorité de 5, et Int2 a une priorité de 4. Dans ce cas, parce que Int1 a la priorité la plus élevée, ISR2 doit attendre jusqu'à ce que ISR1 se fait exécuter avant qu’il puisse commencer.
Priorité entre les niveaux varient de 1 à 7, où 7 est le plus élevé. En fait, il y a aussi un niveau de priorité 0, mais qui est considéré comme handicapé et ne s’exécutera jamais. Dans le cas de notre programme, nous définir la priorité de Int2 à 4.
(Remarquez comment nous utilisons toujours des « _EXTERNAL_2_VECTOR » ? Ça va être important dans un peu.)
« Attends... » J’entends vous pensez (en utilisant mes compétences de lecture de l’esprit), « que se passe-t-il si deux interrompt avec la même priorité sont déclenchées? »
Bonne question ! Dans nos exemples précédents, si les deux Int1 et Int2 ont une priorité de 4, puis ISR2 sera toujours attendre ISR1 terminer l’exécution avant qu’il puisse commencer.
Mais attendez ! Il n’y a plus !