Qu'est-ce qu'une interruption ? Comment le microsystème l'a gère ?

Introduction

Une interruption est indispensable au système embarqué. Sans celle-ci, le microcontrôleur va avoir du mal à communiquer avec le monde extérieur.

Qu’est-ce qu’une interruption ?

Une interruption est un périphérique extérieur qui va arrêter la fonction principale du microcontrôleur pour lui dire qu’il s’est passé quelque chose.

Un exemple d’interruption peut-être une television qui affiche une chaine une et en appuyant sur le bouton de votre télécommande vous allez interrompre l’affichage pout passer sur une autre chaine par exemple.

La télévision va donc arrêter sa fonction principale qui etait d’afficher la chaine pour gerer  l’interruption et apres revenir sur le programme principal qui est d’afficher une chaine (celle que vous avez appuyé du coup). 

Les différents type d'interruption

Il existe deux types d’interruption : le polling logiciel et la scrutation hardware. 

A) Polling logiciel

Le polling logiciel est une fausse methode de scrutation, c’est à dire qu’à la fin de chaque tâche le microcontroleur va regarder s’il le bouton est appuyé par exemple. Ceci est une fausse methode de scrutation car le microcontroleur ne va pas vraiment etre interrompu mais va plutôt regarder à chaque fois si il y a pas un bouton poussoir qui serait appuyé.

 C’est un peu comme si vous attendiez un colis et que toute les deux minutes vous ouvriez la porte pour voir si le postier est devant. Il est bien plus simple d’utiliser une sonnette pour etre prevenu quand celui-ci va arriver.

C’est pareil pour le bouton pousssoir, il se peut que l’utilisateur appuie dessus pendant que la tâche principale s’execute et que le microcontroleur ne soit pas prevenu. C’est pour cela que on vous conseille plutôt la scrutation hardware.  

B) Scrutation hardware

La scrutation hardware fonctionne différemment. Celle si détecte directement lorsque que le bouton poussoir est appuyé et arrête le microcontroleur de sa tache principale comme le principe d’une sonnette et le postier. 

On va maintenant voir comment le microcontroleur gère ces interruptions. 

Interruption Vectorise et non vectorise

Comme on l’a dit il existe deux types d’interruption: les vectorises et non vectorises. 

Il faut d’abord savoir que selon qui a interromput le microcontroleur, celui doit gérer l’interruption differement. En effet si vous changez de chaîne ou bien vous éteignez votre television, il ne faut pas que les mêmes instructions s’executent car vous ne voulez pas le même résultat. C’est pour ca que le microcontroleur doit savoir quel périphérique la interrompu pour faire la bonne action. 

On va donc voir deux methodes pour savoir quel périphérique a interrompu le microcontroleur : les interruptions vectorise et non vectorise. 

A) Interruption non vectorise

Les interruptions non vectorises ont qu’une seule adresse pour toute les interruptions.

Cela veut dire que quand un périphérique arrête le microcontroleur, celui-ci ne sait pas qui l’a interrompu et donc exécute une fonction unique pour toute les interruptions.

Dans cette fonction, il va d’abord questionner tous les périphériques afin de savoir qui l’a interrompu puis il va ensuite exécuter les instructions correspondant à l’interruption. 

B) Interruption vectorisé

 

Les interruptions vectorisés elles ont différentes adresses en fonction de l’interruption.

Cela permet de savoir quelle périphérique à arrete le microcontroleur et donc de traiter directement appeler la fonction liées à celui-ci. C’est donc beaucoup plus rapide que les interruptions non vectorise. 

Interrup nesting : Dans les interruptions vectorisés, une interruption peut être interrompu par une interruption de plus haute priorité. En effet, le fait d’avoir une adresse par interruption permet de donner des niveaux de priorité entre les interruptions.

Généralement c’est le constructeur qui choisit si son microcontroleur gère les interruptions vectorise ou non vectorise. Vous le choisissez donc dans le choix du microcontroleur. Les microcontroleurs à interruptions vectorises sont plus cher que ceux à interruptions non vectorise. 

Latence d'interruption

La latence d’interuption est le temps qu’il faut au microcontrôleur pour interrompre la fonction principale et de gérer l’interruption et pour faire la recherche de la fonction d’interruption.

Comment on peut voir sur l’interruption traditionnel,  il y a trois éléments pour gérer une interruption :

  • Push : Cette partie est la sauvegarde du contexte, mettre la ligne ou s’est arrêté le microcontroleur dans le register
  • ISR : Corresponds à au traitement de la fonction d’interruption
  • Pop : Permet de remettre en place le contexte afin de reprendre la tâche principale.

Ceci fonctionne très bien s’il y a une interruption à la fois, mais si le microcontrôleur est interrompu plusieurs fois, il va sortir de l’interruption et revenir à la fonction principale avant de directement repartir à rechercher une autre fonction d’interruption ce qui est une perte de temps.

Le cortex M3 lui utilise une autre méthode pour les interruptions : le tail chaining. Cette méthode permet de gagner du temps lors d’un enchainement d’interruption car le microprocesseur sait qu’après l’interruption qu’il traite il y en a une suivante et donc qu’il n’a pas besoin de faire une sauvegarde ni une  remise en contexte avec la fonction push et pop et donc on gagne du temps.

Problème d'interruption

Il y a certaine fonction qui ne peuvent pas être interrompu par une autre fonction, notamment parce qu’elle utilise les mêmes ressources (mémoire partagée).

On va voir un exemple juste en dessous :

Nous avons deux fonctions, une qui enlève puis ajoute un élément dans une liste et l’autre qui recherche un élément dans cette même liste.

Un des problèmes de ces deux fonctions c’est qu’elle utilise la même liste donc la même ressource.

Voici la liste de départ : liste = [1,6,3,9,2,4]

  1. La fonction enlève_ajoute : La fonction enlève le chiffre 6.
  2. fonction recherche : La fonction recherche va interrompre la fonction enlève_ajoute avant que cette fonction ait eu le temps d’ajouter le nombre 7. La fonction recherche va rechercher dans la liste le    nombre 7. La fonction recherche ne va pas le trouver et donc va tourner en boucle. 

En conclusion, la fonction recherche ne peut pas interrompre la fonction enlève_ajoute. On va voir comment régler ce problème de fonction qui ne peuvent pas être interrompu.

Atomicité

Pour régler le problème de fonction qui ne peut pas être interrompu par une autre, on utilise l’atomicité.

Une fonction A est atomique à B  si :

  • On ne peut pas mettre en parallèle A avec B
  • A ne peut pas être interrompu par B
  • B ne peut pas observer d’états intremédiaire dans A pendant l’éxécution de A

Les périodes d’atomicité diminuent le taux de paralllélisme, c’est pourquoi elles doivent etre le plus bref possible et ne doivent pas faire rater des échéances.

On va maintenant voir comment fonctionne l’atomicité pour différent matériel :

  • Mono-cpu sans interruptions : Pour quitter une fonction, il faut que celle-ci appelle un autre programme ou bien fasse un return.
  • Monocpu avec interruption : une fonction est interrompu quand une fonction plus importante l’interrompt. L’interruption arrive seulement à la fin de l’instruction en cours.
  • Multicpu à bus unique : Le bus joue le rôle d’arbitre pour la synchronisation entre les fonctions et savoir laquelle va utiliser la ressource.

 

Le sémaphore

Un sémaphore est une variable partagée par différents fonctions, qui garantit que ceux-ci ne peuvent y accéder que de façon séquentielle à travers des opérations atomiques.

Un sémaphore est une méthode couramment utilisée pour restreindre l’accès à des ressources partagées et de synchroniser les processus dans un environnement de programmation concurrente.

La Famine

La famine est un problème que peut avoir avec un processus atomique :  Lorsqu’un processus est perpétuellement privé des ressources nécessaires afin de terminer son exécution.

Il se produit lorsqu’un algorithme n’est pas équitable, c’est-à-dire qu’il ne garantit pas à tous les processus souhaitant accéder à une section une probabilité non nulle d’y parvenir.

Inter Blocage

Lorsque deux processus ont besoin des mêmes ressources, si chacun des deux processus prennents chacun une ressource alors les deux processus sont en famine car chacun d’eux a besoin de la ressource que l’autre a prise.

Pour cela on peut donner un exemple concret :

Bob et john veulent ont tous les deux besoins d’un pneu et d’un crique pour changer la roue de leur voiture. Bob prends le nouveau pneu et John le crique. Dans ce cas John et Bob sont tous les deux en famines car chacun à la ressource dont l’autre a besoin.

Une solution c’est que Bob et John prennent les ressources dans le même sens : le pneu puis le crique par exemple. De ce fait si Bob prends le pneu et que John en a aussi besoin, alors John reste bloqué sur la première ressource (le pneu) et ne prends pas le crique.