| 23 | |
| 24 | Avant de commencer à utiliser les modules nRF24L01+ nous allons voir comment il est possible de programmer des applications multi-tâches coopératives dans l'environnement Arduino sans pour autant alors les services d'un OS. Le code a été volontairement simplifié à l'extrème afin de bien comprendre le principe. |
| 25 | |
| 26 | Commençeons par exprimer les besoins. Dans une applications pour micro-contrôleur, il est nécessaire : |
| 27 | - d'exécuter des tâches périodiquement ; |
| 28 | - d'exécuter des tâches lorsque des événements surviennent ; |
| 29 | - de mesurer le temps séparant deux événements ; |
| 30 | - de synchroniser l'exécution de deux tâches (une tâche T1 s'exécute et produit des données qui sont récupérées par une tache T2) ; |
| 31 | - etc. |
| 32 | |
| 33 | Chaque tâche est représentée par une fonction qui code son comportement. |
| 34 | Dans l'environnement Arduino, la fonction loop() s'exécute en boucle, c'est elle qui va séquencer l'exécution des tâches. |
| 35 | La fonction loop() demande donc l'exécution des tâches à tour de rôle. |
| 36 | Les tâches n'ont pas le droit de conserver le processeur sinon celà crée un blocage du système. |
| 37 | La structure générale d'une tâche est la suivante : |
| 38 | |
| 39 | {{{#!c |
| 40 | void tache(arguments) { |
| 41 | // test de la condition d'exécution |
| 42 | if (evement_attendu_absent) return; |
| 43 | // code de la tache |
| 44 | .... |
| 45 | } |
| 46 | }}} |
| 47 | |
| 48 | Pour les tâches périodiques, nous pouvons écrire une fonction qui exploite un timer interne du processeur qui s'incrémente chaque microseconde. Cette fonction nommée waitFor() prend un numéro de timer (il en faudra autant que de tâches périoodiques) et une période en microsecondes. wairFor() rend 0 tant que le temps écoulé depuis le précédent appel est inférieur à la période en paramètre, sinon il rend le nombre de périodes entières écoulées depuis le dernier appel. |