Changes between Version 26 and Version 27 of IOC_T06
- Timestamp:
- Mar 20, 2026, 5:37:08 AM (7 months ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
IOC_T06
v26 v27 115 115 116 116 Chaque tâche est représentée par 117 - une fonction `step_ Tache()` qui code son comportement qui sera appelée dans la fonction`loop()`.118 - une seconde fonction `init_ Tache()` qui initialise les ressources de la tâche (périphériques) et l'état interne.119 - une structure contenant l'état interne et le contexte d'exécution représenté par une variable globale sous forme d'une structure ` Tache_t`. Cette structure est passée en argument de la tâche des fonctions `init_Tache()` et `step_Tache()`.120 121 Les fonctions `step_ Tache()` et `init_Tache()` peuvent avoir des variables locales mais leur état n'est pas conservé entre deux instances d'exécutions.122 Elles peuvent aussi avoir des variables static mais ces variables ont une valeur unique même si la tâche est en plusieurs exemplaires et que donc elle utilise la même fonction `step_ Tache()`. Les variables static ne sont pas conseillées parce qu'elles ne peuvent être initialisées dans la fonction `init_Tache()`. Expliquez pourquoi dans le CR pour vérifier que vous avez compris.117 - une fonction `step_tache()` qui code son comportement qui sera appelée dans la fonction Arduino `loop()`. 118 - une seconde fonction `init_tache()` qui initialise les ressources de la tâche (périphériques) et l'état interne qui sera appelée par la fonction Arduino `setup()`. 119 - une structure contenant l'état interne et le contexte d'exécution représenté par une variable globale sous forme d'une structure `ctx_tache_t`. Cette structure est passée en argument de la tâche des fonctions `init_tache()` et `step_tache()`. 120 121 Les fonctions `step_tache()` et `init_tache()` peuvent avoir des variables locales mais leur état n'est pas conservé entre deux instances d'exécutions. 122 Elles peuvent aussi avoir des variables static mais ces variables ont une valeur unique même si la tâche est en plusieurs exemplaires et que donc elle utilise la même fonction `step_tache()`. Les variables static ne sont pas conseillées parce qu'elles ne peuvent être initialisées dans la fonction `init_tache()`. Expliquez pourquoi dans le CR pour vérifier que vous avez compris. 123 123 124 124 La structure contexte ressemble à : 125 125 {{{#!c 126 struct Tache_s{126 typedef struct { 127 127 unsigned int etat; 128 128 int config; 129 }; 130 struct Tache_s T1, T2; // 2 contextes pour 2 instances de tâches ayant le même comportement 131 }}} 132 133 134 C'est la fonction `init_Tache()`qui initialise le contexte avec des paramètres. 135 {{{#!c 136 void init_Tache(struct Tache_s *ctx, params...) { 129 } ctx_tache_t; 130 131 ctx_tache_t T1, T2; // 2 contextes pour 2 instances de tâches ayant le même comportement 132 }}} 133 134 135 C'est la fonction `init_tache()`qui initialise le contexte avec des paramètres. 136 {{{#!c 137 void init_tache(ctx_tache_t *ctx, params...) { 137 138 // Initialisation du contexte} 138 139 ctx->etat = etat_initial; // reçu dans les paramètres … … 141 142 }}} 142 143 143 La fonction `loop()` demande donc l'exécution des fonctions `step_Tache()` à tour de rôle.144 La fonction Arduino `loop()` demande donc l'exécution des fonctions `step_tache()` à tour de rôle. 144 145 Les tâches n'ont pas le droit de conserver le processeur, sinon cela crée un blocage du système (une famine pour les autres tâches). 145 146 Cela signifie qu'il est interdit de faire des boucles d'attente d'un événement. 146 147 147 `connectors` sont des pointeurs vers des variables globales utilisées pour la communication sinter-tâches.148 `connectors` sont des pointeurs vers des variables globales utilisées pour la communication inter-tâches. 148 149 La structure générale d'une tâche est la suivante : 149 150 150 151 {{{#!c 151 void step_ Tache(tache_t *ctx, connectors....) {152 void step_tache(ctx_tache_t *ctx, connectors....) { 152 153 // test de la condition d'exécution, si absent on SORT 153 154 if (evement_attendu_absent) return; … … 205 206 //--------- définition de la tache Led 206 207 207 struct Led_s{208 int timer; // n umérodu timer pour cette tâche utilisé par WaitFor208 typedef struct { 209 int timer; // n° du timer pour cette tâche utilisé par WaitFor 209 210 unsigned long period; // periode de clignotement 210 211 int pin; // numéro de la broche sur laquelle est la LED 211 212 int etat; // etat interne de la led 212 } ;213 214 void init_ Led( struct Led_s* ctx, int timer, unsigned long period, byte pin) {213 } ctx_led_t; 214 215 void init_led(ctx_led_t * ctx, int timer, unsigned long period, byte pin) { 215 216 ctx->timer = timer; 216 217 ctx->period = period; … … 221 222 } 222 223 223 void step_ Led( struct Led_s* ctx) {224 void step_led(ctx_Led_t * ctx) { 224 225 if (!waitFor(ctx->timer, ctx->period)) return; // sort s'il y a moins d'une période écoulée 225 226 digitalWrite(ctx->pin,ctx->etat); // ecriture … … 229 230 //--------- definition de la tache Mess 230 231 231 struct Mess_s{232 struct { 232 233 int timer; // numéro de timer utilisé par WaitFor 233 234 unsigned long period; // periode d'affichage 234 235 char mess[20]; 235 } ;236 237 void init_ Mess( struct Mess_s* ctx, int timer, unsigned long period, const char * mess) {236 } ctx_mess_t; 237 238 void init_mess(ctx_mess_t * ctx, int timer, unsigned long period, const char * mess) { 238 239 ctx->timer = timer; 239 240 ctx->period = period; … … 242 243 } 243 244 244 void step_ Mess(struct Mess_s*ctx) {245 void step_mess(ctx_mess_t *ctx) { 245 246 if (!(waitFor(ctx->timer,ctx->period))) return; // sort s'il y a moins d'une période écoulée 246 247 Serial.println(ctx->mess); // affichage du message … … 249 250 //--------- Déclaration des contexte de tâches 250 251 251 struct Led_sLed1;252 struct Mess_sMess1;252 ctx_led_t Led1; 253 ctx_mess_t Mess1; 253 254 254 255 //--------- Setup et Loop 255 256 256 257 void setup() { 257 init_ Led(&Led1, 0, 100000, LED_BUILTIN); // Led est exécutée toutes les 100ms258 init_ Mess(&Mess1, 1, 1000000, "bonjour"); // Mess est exécutée toutes les secondes258 init_led(&Led1, 0, 100000, LED_BUILTIN); // Led est exécutée toutes les 100ms 259 init_mess(&Mess1, 1, 1000000, "bonjour"); // Mess est exécutée toutes les secondes 259 260 } 260 261 261 262 void loop() { 262 step_Led(&Led1); 263 step_Mess(&Mess1); 264 } 265 263 step_led(&Led1); 264 step_mess(&Mess1); 265 } 266 266 }}} 267 267 … … 320 320 enum {EMPTY, FULL}; 321 321 322 struct mailbox_s{322 struct { 323 323 int state; 324 324 int val; 325 } ;326 327 struct mailbox_smb = {.state = EMPTY};325 } mailbox_t ; 326 327 mailbox_t mb = {.state = EMPTY}; 328 328 329 329 void step_T1(... mailbox_t * mb ...) { … … 356 356 Ici, il faut créer une fonction `SerialEvent()` qui sera invoqué lors de la réception d'un caractère par le port série. 357 357 358 Dans ce système, la fonction ISR sera comme une fonction step_ Tache.358 Dans ce système, la fonction ISR sera comme une fonction step_tache. 359 359 360 360 **Question**
