Master 1 - FST - Dpt. Info - 2015-2016 Systèmes Temps-Réel / MIF25 L. Gonnord &
Master 1 - FST - Dpt. Info - 2015-2016 Systèmes Temps-Réel / MIF25 L. Gonnord & T. Excoffier http://laure.gonnord.org/pro/ TP ordonnanceur Arduino Objectifs L’objectif de ce TP consiste à réaliser un ordonnanceur de tâches de type Round Robin. Pour sim- plifier le développement et mieux appréhender le concept de tâche, cet ordonnanceur fonctionnera sur une plate-forme Arduino. Pour ce TP , le développement se fera en utilisant majoritairement le langage C. Attention, vous n’utiliserez pas la version du “language arduino” (et donc pas non plus le GUI que vous pouvez trouver sur les forums). Vous écrirez du C en utilisant l’API dont la documentation est à l’adresse : http://www.nongnu.org/avr-libc/user-manual/pages.html Crédit J. Forget et T. Vantroys. Ce TP est adapté du sujet disponible sur cette page : http://vantroys.polytech-lille.net/enseignement/IMA4_OS/tp_scheduler/ Au sujet de la plateforme de TP On vous fournit par trinôme une plateforme de TP comportant 1 arduino Uno, un cable USB, une plateforme “breadboard”, un écran LCD 2 lignes, deux LEDs (une rouge, une jaune), trois résistances 220 ohm, et une vingtaine de fils. Ils seront sous votre responsabilité durant 2 semaines. Arduino/Atmega328p Les cartes Arduino / Guenuino sont des cartes matériellement libres archi- tecturées autour d’un micro-contrôleur de la famille AVR d’Atmel. Pour ce TP nous utiliserons des Ar- duino UNO (atmega328p) comme celui de la Figure 1, qui fournissent un certain nombre d’entrées sorties numériques et analogiques sur lesquelles nous pourrons connecter des LEDs, et un écran LCD. FIGURE 1 – Plateforme Arduino Uno TP Systèmes TR, Master 1 - FST - Dpt. Info - 2015-2016, L. Gonnord & T. Excoffier 1/8 Le micro-contrôleur est programmé avec un bootloader de façon à ce qu’un programmateur dé- dié ne soit pas nécessaire. Les Makefile fournis utiliseront avrdude 1 pour charger les binaires dans la mémoire du micro-contrôleur. Installation et manipulations préliminaires Pour pouvoir utiliser les Arduino Uno du départe- ment, il faudra : — Installer sur les machines de TP ou sur vos machines les paquets arduino, gcc-avr et avrdude, et éventuellement avr-binutils et avr-libc si ils ne viennent pas avec. — Vérifier que le fichier avrdude.conf est bien présent dans /usr/share/arduino/hardware/tools/ (si il est présent ailleurs, il faudra modifier les Makefile). — Permettre à l’utilisateur d’utiliser le port USB en écriture : usermod -aG dialout <username> (ou useradd ...) Compilation et upload Dans ce TP , nous utiliserons une chaîne de compilation/assemblage/télé- chargement sur la plateforme fournie par avr-gcc 2. Pour compiler, vous devez utiliser le Makefile fourni. La cible all permet de compiler et la cible upload permet de transférer le binaire dans la plate-forme Arduino. Pour utiliser la cible upload sur les machines de TP , il faut au préalable brancher la plate-forme Arduino via le câble USB. Style de programmation Les tâches exécutées sur cette plateforme seront des tâches infinies pé- riodiques. Typiquement, un programme Arduino réalisant une tâche de période (un peu plus que) 300 ms aura la forme : #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> int main(void) { //initialisation de ports, variables, ... while(1) { //des trucs _delay_ms(300); } } Allez, c’est parti ! 1 Faire clignoter 2 LEDs Afin de découvrir le développement sur la plate-forme Arduino, vous allez dans un premier temps réaliser un programme qui fera uniquement clignoter une LED rouge, puis une jaune. On vous four- nit un ciruit déjà câblé. 1. Voir http://www.nongnu.org/avrdude/ 2. Il existe une version plus user-friendly avec des fonctions de haut niveau et une interface graphique utilisateur, mais désirons maîtriser les temps d’exécution “cachés” derrière l’utilisation de librairies ... TP Systèmes TR, Master 1 - FST - Dpt. Info - 2015-2016, L. Gonnord & T. Excoffier 2/8 1.1 Circuit Le circuit simple représenté Figure 2 représente le câblage pour la LED rouge. FIGURE 2 – LED sur Plateforme Arduino Uno Notes : — On utilise une plaque d’essai (breadboard) sans soudure. Dans cette plaque, tous les points d’une même ligne d’alimentation (horizontales sur le schéma) et tous les points d’une même colonne (numérotées 20, 30, ...sur le schéma) sont connectés entre eux. — La grande patte de la LED est connectée au port Analog 0 de l’Arduino via une resistance 220 ohm. — Le circuit est fermé en reliant la petite patte de la LED à la masse, via la ligne noire (ou bleue) du breadboard. Le câblage pour la LED jaune est similaire, celle-ci sera reliée au port analog 1. 1.2 Allumage de deux LEDs Pour allumer ou éteindre une LED, il faut configurer le registre d’entrée/sortie sur lequel est connectée la LED. Comme l’explique la documentation 3 : — les connections “analog” 0 à 5 sont contrôlées à l’aide du registre nommé PORTC (commande) le bit 0 de chacun de ces deux registres commande la connection 0, le bit 1 la connection 1, .... — le registre de configuration se nomme DDRC. Chaque bit de ce registre représente une entrée / sortie du port C (le bit 0 pour la connection 0, ...). Un 0 signifie une utilisation en tant qu’entrée et un 1 signifie une utilisation en tant que sortie. Placez vous dans le répertoire exo1 et éditez le fichier main.c (boucle infinie). En vous reportant à la documentation citée ci-dessus, 1. Écrivez la fonction init_led afin de pouvoir utiliser les deux LEDS. Pour activer une sortie, il faut positionner à 1 le bit correspondant du registre PORTC. 4 2. Écrivez la boucle principale afin d’allumer la LED rouge pendant 200 ms, l’éteindre puis allu- mer la LED jaune pendant 300 ms puis retour à l’allumage de la LED rouge. Afin de temporiser, 3. Voir https://www.arduino.cc/en/Reference/PortManipulation. Attention, la documentation est faite pour le langage arduino de haut niveau. Pour manipuler une chaîne de bits en C on pourra utiliser 0b11111110 (à la place du B11111110) 4. Voir http://playground.arduino.cc/Code/BitMath si vous avez du mal avec les opérations bit à bit. TP Systèmes TR, Master 1 - FST - Dpt. Info - 2015-2016, L. Gonnord & T. Excoffier 3/8 il faut utiliser la fonction _delay_ms qui prend en paramètre le nombre de millisecondes à attendre (et qui fait une attente active 5). 3. Vérifiez le bon fonctionnement de votre programme. 2 Désynchroniser deux LEDs Vous allez maintenant utiliser l’un des timers du micro-contrôleur pour faire clignoter les deux LEDs à deux fréquences différentes, la LED rouge clignotera toutes les 200ms et la LED jaune toutes les 400 ms en parallèle. Le montage est le même que précédemment. Afin de faire clignoter la LED jaune toutes les 400 ms en parallèle de la LED rouge, nous allons utiliser un timer : — Le main continue d’allumer la LED rouge comme auparavant. — Toutes les 400 ms, une fonction d’interruption sera appelée. Elle réalisera le changement d’état de la LED jaune, puis rendra la main. Timers et arduino L’initialisation du timer est fournie. À chaque cycle de l’horloge, un compteur est incrémenté et il est comparé à la valeur se trouvant dans un registre (registre OCR1A dans notre cas). Si ils sont égaux, une interruption est générée. Le programme est alors dérouté pour exécuter la fonction correspondante et le compteur est réinitia- lisé 6. Les fonctions d’interruptions, dans le cas d’un micro-contrôleur AVR et de l’utilisation de avr-gcc sont nommées ISR et prennent en paramètre le vecteur d’interruption correspondant (dans notre cas, il s’agit de TIMER1_COMPA_vect). Le timer est initialisé avec un prescaler de 1024, cela signifie que le compteur est incrémenté tous les 1024 cycles. L’arduino est cadencé à 16 MHz. Pour activer les interruptions 7 vous devez appeler la fonction sei(). Pour désactiver les inter- ruptions, la fonction est cli(). Dans le fichier main.c du répertoire exo2 : 1. Écrivez le code de la fonction task_led_red qui fait clignoter la LED rouge toutes les 200 ms (i.e., la LED est allumée pendant 200 ms, puis éteinte pendant 200 ms). Cette fonction est ap- pelée dans la boucle de la fonction main. Testez le bon fonctionnement. 2. Déterminez la valeur du nombre NB_TICK pour initialiser le registre OCR1A, afin que la fonc- tion d’interruption soit appelée toutes les 400 ms. 3. Remplissez la fonction ISR pour réaliser le changement d’état de la LED jaune. 4. Testez. Grâce à l’utilisation du timer, vous avez pu réaliser ainsi deux tâches qui s’exécutent en parallèle. 3 Ordonnanceur Vous allez maintenant réaliser un véritable ordonnanceur utilisant un algorithme Round Robin 8 avec un intervalle de temps de 40 ms. Votre micro-contrôleur réalisera trois tâches : — faire clignoter la LED rouge toutes les 300 ms. 5. Voir http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html, la fonction _delay_loop_2() utili- sée fait du busy waiting 6. Voir par exemple http://http://www.avrbeginners.net/architecture/timers/timers.html 7. La documentation est ici http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html 8. Voir https://en.wikipedia.org/wiki/Round-robin_scheduling et votre cours ! TP Systèmes TR, Master 1 - FST - Dpt. Info - 2015-2016, L. Gonnord & T. Excoffier 4/8 — envoyer en boucle un message sur le port série (chaque envoi de caractère sera espacé de 100 ms). — envoyer en boucle un message sur un mini écran LCD (avec une API fournie). FIGURE 3 – LED et LCD sur Plateforme uploads/Management/ tr-ordo-arduino 1 .pdf
Documents similaires










-
30
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Nov 20, 2022
- Catégorie Management
- Langue French
- Taille du fichier 0.6532MB