Changes between Version 4 and Version 5 of IOC_T04


Ignore:
Timestamp:
Mar 11, 2022, 8:12:02 AM (2 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • IOC_T04

    v4 v5  
    3131et suivre la procédure correspondant à votre OS (Linux, Windows ou MacOS).
    3232
    33 == Installation des librairies ESP32
     33**Installation des librairies ESP32**
    3434
    3535Par défaut, les modules ESP32 ne sont pas disponible dans l'IDE Arduino, il faut les ajouter, voici la procédure à suivre pour ajouter les gestionnaires de cartes à base d'ESP32 :
     
    4848- Vous pouvez tester le composant ESP32 en exécutant quelques exemples de tutoriaux (décrivez succinctement ce que vous avez fait dans le CR)
    4949
    50 Les documents utiles se trouvent :
     50**Les documents utiles se trouvent**
    5151- [https://randomnerdtutorials.com/installing-the-esp32-board-in-arduino-ide-windows-instructions/ Tutoriel pour l'installation des bibliothèque ESP32]
    5252- [https://github.com/adafruit/Adafruit_SSD1306 Repository API Ecran OLED]
     
    6666
    6767
    68 = Démarrage
     68= Vérification de l'environnement
    6969
    7070
     
    149149La première fait clignoter une led dont le numéro est passé en paramètre à 5Hz.
    150150La seconde affiche bonjour à une fois par seconde.
     151Ici, les tâches ne communiquent pas entre elles.
     152VOus pouvez nodifier le programme initial pour afficher "Salut" en plus de "bonjour" toutes les 2 secondes sans changer le comportement existant. Vous aurez donc "Salut" et "bonjour" qui s'affiche avec une périodicité propre à chaque message.
     153
    151154
    152155{{{#!c
     
    178181//--------- définition de la tache Led
    179182
    180 struct Led_st {
     183typedef struct Led_s {
    181184  int timer;                                              // numéro du timer pour cette tâche utilisé par WaitFor
    182185  unsigned long period;                                   // periode de clignotement
    183186  int pin;                                                // numéro de la broche sur laquelle est la LED
    184187  int etat;                                               // etat interne de la led
    185 };
    186 
    187 void setup_Led( struct Led_st * ctx, int timer, unsigned long period, byte pin) {
     188} Led_t;
     189
     190void setup_Led( Led_t * ctx, int timer, unsigned long period, byte pin) {
    188191  ctx->timer = timer;
    189192  ctx->period = period;
     
    194197}
    195198
    196 void loop_Led(struct Led_st * ctx) {
     199void loop_Led(Led_t * ctx) {
    197200  if (!waitFor(ctx->timer, ctx->period)) return;          // sort s'il y a moins d'une période écoulée
    198201  digitalWrite(ctx->pin,ctx->etat);                       // ecriture
     
    202205//--------- definition de la tache Mess
    203206
    204 struct Mess_st {
     207typedef struct Mess_st {
    205208  int timer;                                              // numéro de timer utilisé par WaitFor
    206209  unsigned long period;                                             // periode d'affichage
     
    208211} Mess_t ;
    209212
    210 void setup_Mess(struct Mess_st * ctx, int timer, unsigned long period, const char * mess) {
     213void setup_Mess(Mess_t * ctx, int timer, unsigned long period, const char * mess) {
    211214  ctx->timer = timer;
    212215  ctx->period = period;
     
    215218}
    216219
    217 void loop_Mess(struct Mess_st *ctx) {
     220void loop_Mess(Mess_t *ctx) {
    218221  if (!(waitFor(ctx->timer,ctx->period))) return;         // sort s'il y a moins d'une période écoulée
    219222  Serial.println(ctx->mess);                              // affichage du message
     
    222225//--------- Déclaration des tâches
    223226
    224 struct Led_st Led1;
    225 struct Mess_st Mess1;
     227Led_t Led1;
     228Mess_t Mess1;
    226229
    227230//--------- Setup et Loop
     
    240243
    241244**Questions**
     245
     246Mettez ces réponses dans votre CR (avec les questions pour que le CR soit lisible)
    242247- Que contient le tableau `waitForTimer[]` et à quoi sert-il ?
    243248- Si on a deux tâches indépendantes avec la même période, pourquoi ne peut-on pas utiliser le même timer dans waitFor() ?
    244249- Dans quel cas la fonction `waitFor()` peut rendre 2 ?
    245 - Modifier le programme initial pour afficher "Salut" en plus de "bonjour" toutes les 1.5 secondes sans changer le comportement existant. Vous aurez donc "Salut" et "bonjour" qui s'affiche avec une périodicité propre à chaque message.
     250
    246251
    247252= Utilisation de l'écran OLED
     
    261266**Questions**
    262267
    263 - Extraire de ce code, ce qui est nécessaire pour juste afficher un compteur qui s'incrémente toutes des 1 seconde sur l'écran OLED. Vous devez ajouter une tâche nnommée `oled` dans votre programme en conservant celles déjà dans votre sketch (programme Arduino). L'idée, c'est d'avoir plein de tâches ensemble.
     268- Extraire de ce code, ce qui est nécessaire pour juste afficher un compteur qui s'incrémente toutes des 1 seconde sur l'écran OLED. Vous devez ajouter une tâche nommée `oled` dans votre programme en conservant celles déjà dans votre sketch (programme Arduino). L'idée, c'est d'avoir plein de tâches ensemble.
    264269
    265270
     
    274279{{{#!c
    275280enum {EMPTY, FULL};
    276 struct mailbox {
     281
     282typedef struct mailbox {
    277283  int state;
    278284  int val;
    279 } mb0 = {.state = EMPTY};
    280 
    281 void loop_T1(... struct mailbox * mb ...) {
     285} mailbox_t;
     286
     287mailbox_t mb0 = {.state = EMPTY};
     288
     289void loop_T1(... mailbox_t * mb ...) {
    282290  if (mb->state != EMPTY) return; // attend que la mailbox soit vide
    283291  mb->val = 42;
     
    285293}
    286294
    287 void loop_T2(... struct mailbox * mb ...) {
     295void loop_T2(... mailbox_t * mb ...) {
    288296  if (mb->state != FULL) return; // attend que la mailbox soit pleine
    289297  // usage de mb->val
     
    305313Avec Arduino, il est très simple d'attacher une routine d'interruption (ISR) à un signal d'interruption.
    306314C'est la fonction `attachInterrupt(num, ISR, type)`. Pour l'ESP32 `num` est égal à `0` ou `1`, ce qui correspond aux pins `2`et `3` qui sont des entrées de signaux d'interruptions. Il existe d'autres sources d'interruption comme le changement d'état d'une pins ou la réception d'une données depuis un bus par exemple.
     315
    307316Ici, il faut créer une fonction `SerialEvent()` qui sera invoqué lors de la réception d'un caractère par le port série.
    308317
    309 Dans notre contexte la fonction ISR sera comme une fonction loop_Tache.
     318Dans ce système, la fonction ISR sera comme une fonction loop_Tache.
    310319
    311320**Question**
     
    314323- Représenter le graphe de tâches final sur un dessin en utilisant le langage de [http://www.graphviz.org/ graphviz] (regarder [https://graphviz.gitlab.io/_pages/Gallery/directed/traffic_lights.html ce graphe bi-parti] dont le code est [https://graphviz.gitlab.io/_pages/Gallery/directed/traffic_lights.gv.txt là]). C'est un graphe biparti avec des ronds pour les tâches et des rectangles pour les boites à lettres.
    315324
     325
     326= Tout ensemble
     327
     328Le but est de faire une application avec le maximum de tâches afin de voir l'intérêt de ce système. Vous allez ajouter le buzzer et le bouton poussoir pour complexifier votre application. Le buzzer est branché sur la broche
    316329
    317330{{{