Changes between Version 11 and Version 12 of SujetTP6-2016


Ignore:
Timestamp:
Mar 22, 2016, 11:02:57 PM (9 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SujetTP6-2016

    v11 v12  
    11= Communication sans fil =
     2
     3== Préambule ==
     4
     5Vous devez utiliser la dernière version d'arduino qui se trouve
     6{{{#!bash
     7> /opt/arduino-1.6.8/arduino
     8}}}
    29
    310== Documents de référence ==
     
    1421
    1522== Exécution ''multi-tâches'' ==
     23
     24Avant 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
     26Commenç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
     33Chaque tâche est représentée par une fonction qui code son comportement.
     34Dans l'environnement Arduino, la fonction loop() s'exécute en boucle, c'est elle qui va séquencer l'exécution des tâches.
     35La fonction loop() demande donc l'exécution des tâches à tour de rôle.
     36Les tâches n'ont pas le droit de conserver le processeur sinon celà crée un blocage du système.
     37La structure générale d'une tâche est la suivante :
     38
     39{{{#!c
     40void 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
     48Pour 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.
    1649
    1750{{{#!c
     
    3467}
    3568
    36 void setup() {
    37   pinMode(13,OUTPUT);
    38   Serial.begin(115200);
    39 }
    40 
    4169void Led(int timer, long period, int led) {
    4270  static int val = 0;
     
    4977  if (!(waitFor(timer,period))) return;
    5078  Serial.println(mess);
     79}
     80
     81void setup() {
     82  pinMode(13,OUTPUT);
     83  Serial.begin(115200);
    5184}
    5285