Ordonnancement

Vous allez maintenant réaliser un véritable ordonnanceur utilisant comme algorithme un round robin avec un intervalle de temps de 20 ms. Votre micro-contrôleur réalisera trois tâches :

  1. faire clignoter la LED rouge toutes les 300 ms
  2. envoyer en boucle un message sur le port série (chaque envoi de caractère sera espacé de 100 ms)
  3. envoyer en boucle un message sur une matrice de LED communiquant via le bus SPI

Placez vous dans le répertoire exo3. Le fichier RGB.c contient les différentes fonctions permettant d'utiliser la matrice de LEDs. Les deux fonctions que vous devrez utiliser sont init_rgb() et rgb_main(). Le fichier main.c contient les fonctions d'initialisation du port série et d'envoi d'un caractére sur le port série. Avant de réaliser l'ordonnanceur, écrivez le code de la tâche qui envoie un message sur le port série et testez-le. Faites de même avec la tâche qui envoie un message sur la matrice de LED.

Maintenant que vos différentes tâches fonctionnent, vous pouvez réaliser l'ordonnanceur. Vous devez commencer par créer une structure représentant les différentes tâches.

Comme vous l'avez lu dans l'article envoyé avant les vacances, pour réaliser le changement de contexte, il est nécessaire de sauvegarder la valeur des différents registres du micro-contrôleur. Pour cela, vous allez compléter les deux macros SAVE_CONTEXT et RESTORE_CONTEXT. Pour la gestion de la mémoire des différents processus, nous allons découper l'espace mémoire. Dans un AVR atmega328p, la mémoire est utilisée en commençant par les adresses les plus élevées. La tâche "écriture série" débutera son utilisation mémoire à l'adresse 0x0700, la tâche "écriture matrice de LED" débutera à l'adresse 0x0600 et la tâche "LED" débutera à l'adresse 0x0500. Ces adresses représentent le départ du pointeur de pile (Stack Pointer). Ce dernier est rendu directement accessible par gcc-avr via la "variable" SP.

L'ordonnanceur utilise l'algorithme du tourniquet (Round Robin) avec un intervalle de 20 ms. Pour faciliter le debug, chaque fois que l'ordonnanceur s'exécute, vous allumerez la LED jaune.

thomas 2013-11-21