TP02 : Introduction à FreeRTOS
Dans ce TP, nous modifierons le TP précédent pour y introduire les composants du système d’exploitation FreeRTOS.
Objectifs du TP
À la fin de ce TP, les étudiants :
- auront conçu et implémenté une application multitâches
- auront implémenté des tâches (threads)
- auront implémenté un mécanisme de communication à l’aide de queues (message queues)
- auront réalisé un test unitaire qui tourne sur une cible pour chaque composant logiciel développé;
- auront rédigé un journal de travail et déposé le PDF dans le dépôt git.
Les livrables sont :
- un projet git dans votre groupe sur gitlab.forge.hefr.ch avec le code du TP et le code du programme de test;
- une configuration CI/CD de gitlab pour valider votre TP;
- un journal de travail déposé sur gitlab.
Temps accordé : 4 périodes de 45 minutes en classe + travail personnel à la maison
Délai
Le TPs doit être rendu au plus tard 6 jours après la séance en classe à 23:59
Prise en main de FreeRTOS
L’enseignant vous a assigné un projet sur gitlab.forge.hefr.ch (embsys/2024-2025/sup/tp01/tp02<X>
).
Le projet à été créé à partir du projet starter-tp02.
Le dossier lib
contient tout ce dont vous avez besoin pour faire ce TP (y compris le code pour le Thermo 3).
Implémentez deux tâches (tasks) pour faire clignoter deux LEDs à des fréquences différentes (par exemple, la LED rouge avec une demie-période de 200ms et la LED bleue avec une demie-période de 207ms).
Utilisez la fonction vTaskDelayUntil()
de FreeRTOS pour obtenir une bonne précision de la fréquence.
Utilisation de paramètres
Modifiez votre code pour implémenter les deux tâches avec une seule et unique fonction. Cette fonction recevra les arguments (quelle LED et quelle période) en paramètre.
Attention
Lisez la description du paramètre pvParameters
sur la page qui décrit la fonction
xTaskCreate. Assurez-vous de bien comprendre
la partie qui parle de la stack.
Modifiez encore votre code pour faire clignoter les 4 LEDs avec ces demi-périodes :
- LED_GREEN : 200ms
- LED_ORANGE : 207ms
- LED_RED : 214ms
- LED_BLUE : 221ms
Testez et assurez-vous d’avoir le bon résultat.
Question
Décrivez comment faire pour arriver au même résultat, mais sans utiliser de threads.
Encore plus de tâches
Ajoutez 3 threads à votre projet :
- Un thread qui lit le capteur de température à une fréquence de 1Hz (une fois par seconde)
- Un thread qui affiche la température sur l’écran LCD
- Un thread qui affiche la température sur l’affichage 7-segments
Utilisez des message queues pour communiquer entre les threads.
Les infos sur les tâches
Dans la tâche qui gère le capteur et lit la température, ajoutez un appel à la
fonction vTaskGetInfo
.
Lors de chaque mesure, affichez le nom de votre tâche (pcTaskName
),
son état (eCurrentState
) ainsi que son Stack High Water Mark (usStackHighWaterMark
)
Question
Expliquez avec vos mots ce qu’est le Stack High Water Mark. Quelles constructions de programme contribuent à faire varier ce Stack High Water Mark ?
Tests et validations
Comme il n’y a pas de nouveaux modules dans le dossier lib
, nous ne pouvons pas
vraiment tester l’application sans réorganiser tout le code. À la place, écrivez
un test unitaire qui valide la création de tâches et l’envoi de messages au travers
de queues.
Implémentez les deux tâches conformément au schéma ci-dessous :
La tâche Sender tire un entier (int) au hasard et l’envoie à la tâche Multiplier. Cette dernière multiplie l’entier reçu par 1000 et retourne le résultat de la multiplication au Sender. Le Sender vérifie le résultat reçu. Pour faire le test, n’utilisez pas la même multiplication, mais divisez plutôt la valeur reçue par 1000 et comparez le résultat au nombre envoyé.
Testez que le Multiplier fonctionne correctement en lui envoyant un millier de nombres aléatoires et en vérifiant les réponses reçues.
Pour générer un entier aléatoire (entre 0
et 0x7fffffff
), utilisez la fonction rand()
de la bibliothèque stdlib.h
Conseil
Si certains tests ne passent pas, examinez les valeurs qui posent un problème et corrigez votre procédure de test.
À ne pas oublier
Gardez toujours en têtes les bonnes pratiques ainsi que les dix commandements du bon programmeur.
- Choisissez de bons noms pour les classes, les méthodes et les variables.
- Implémentez les bibliothèques avec un haut niveau d’abstraction pour pouvoir réutiliser les méthodes dans d’autres projets.
- Faites des “git commit” régulièrement avec de bons commentaires.
- Configurez le CI/CD de gitlab et testez automatiquement le plus de choses possibles.
- Implémentez des tests unitaires.
- Utilisez des assertions dans votre code pour le documenter et le rendre plus robuste.
Journal de travail
- Rédigez un rapport (journal de travail) avec les indications suivantes :
- Une page de titre avec au minimum :
- le nom et le logo officiel de l’école
- le nom du cours : Systèmes Embarqués 1
- le titre de votre document : “TP02 : Introduction à FreeRTOS”
- le numéro de votre groupe
- les noms des auteurs (vous) avec la classe dans laquelle vous êtes
- la date à laquelle vous avez terminé le rapport
- éventuellement la version du rapport
- Une introduction pour poser le contexte
- Un résumé des notions que vous avez apprises pendant ce TP en précisant si c’est
- non acquis
- acquis, mais encore à exercer
- parfaitement acquis
- Un résumé des points qui vous semblent importants et que vous devez retenir
- Les réponses aux questions.
- Le code source bien formaté et avec du “syntax highlighting” de votre code source.
- Une conclusion par laquelle vous donnez vos impressions sur le TP, ce que vous avez aimé, ce que vous avez moins aimé, et éventuellement des suggestions pour des changements. Indiquez également le nombre d’heures que vous avez passées, par personne, en dehors des heures de TP en classe.
Important
Déposez votre rapport dans un dossier /docs
de votre dépôt git
(tp02) avec le nom report02.pdf
(le chemin complet vers votre rapport est donc
/docs/report02.pdf
)