La programmation du microcontrôleur AT91SAM7S256 se réalise avec le logiciel de
développement IAR Embedded Workbench Kickstart. Ce logiciel permet la compilation
de codes en langage C et la programmation du microcontrôleur par liaison JTAG. Un
mode « Debug » est accessible pour corriger d'éventuelles erreurs de comportement du
programme. L'application développée doit configurer les périphériques du
microcontrôleur notamment les deux liaisons série asynchrone universel (USART(s)),
ordonner, réaliser l'envoi et la réception de messages sur ces deux liaisons, et assurer un
niveau de qualité de service. La Figure 24 décrit le modèle suivi pour structurer le
logiciel de communication. Un message reçu doit tout d'abord remonter les différentes
couches pour pouvoir être routé, puis redescendre pour être envoyé. La qualité de
service réalise des mesures dans toutes les couches traversées par les messages et
calcule les critères d'envoi.
Figure 24 : Architecture logiciel du module de communication
Le programme est réalisé de telle sorte qu'il puisse être amélioré. Pour cela, l'application
est divisée en plusieurs tâches. La tâche US assure la configuration et l’utilisation des
périphériques USART(s). La tâche TI assure la configuration et l’utilisation des
périphériques Timer(s). Ces deux premières tâches constituent la couche de plus bas
niveau. La couche supérieure est l'ordonnanceur, matérialisé par la tâche OR où est
organisé l'envoi des messages en fonction des données de la qualité de service. La
dernière couche correspond à la tâche RO qui détermine le routage de messages.
CemOA
: archive
ouverte
d'Irstea
30
Parallèlement à cette pile, la tâche QS réalise le relevé des mesures de la qualité de
service et calcule les critères permettant de prendre des décisions à son sujet.
Les fichiers « .h » d'une couche fournissent les interfaces uniquement pour la couche
supérieure. Les interfaces sont constituées par les prototypes des fonctions, des
constantes et définitions de type. Des fonctions sont uniquement dédiées à retourner les
valeurs des variables globales, ceci dans le but de limiter ce type de variables à une
même tâche. Les noms des variables globales, des constantes et des fonctions sont
constitués des deux premières lettres correspondantes à leur tâche associée, puis de
quatre autres lettres désignant leur rôle (une variable globale, une constante, une
fonction). Exemple : US_FUNC_trans_char.
Le fichier Boart.h fait la correspondance entre des étiquettes permettant d'accéder aux
ressources du microcontrôleur et des étiquettes propres à notre application, cela dans le
but de conserver le reste du programme en cas de changement de composant.
Le fichier frame.h définit la structure de la trame dans laquelle sont conservées les
données de la communication. Des informations supplémentaires sont ajoutées aux
données « utilisateur », afin d'assurer le routage, de caractériser le type de données, de
tester l'intégrité des données à leur réception et de propager des informations utiles à la
qualité de service. Actuellement, le réseau ne comprend que deux nœuds sans fils et ne
nécessite pas de champs identifiant le destinataire, mais dans le but de conserver un
certain niveau de généricité, plusieurs champs sont présents dans l'entête.
L'entête comprend les identifiants des différents nœuds acteurs de la communication, le
nombre de sauts possibles avant destruction du message, un critère sur la nature du
message, la date d'envoi et la taille du message (voir Figure 25).
L'identifiant de l'émetteur ID_E correspond au nœud à l'origine du message pour un
destinataire d'identifiant ID_D. Les messages transitent par une succession de couples
de nœuds transmetteur-récepteur d'identifiant ID_T et ID_R.
Le TTL (Time-to-Live) est une valeur initialisée à la création du message et
décrémentée à chaque saut de transmission. Le message est détruit si à sa réception, son
paramètre TTL est nul. Ce fonctionnement a pour but de lutter contre la congestion du
réseau par erreur de routage.
La Critère correspond à la nature du message. Il fait intervenir la notion de priorité et
sera décrite dans le chapitre sur l'ordonnanceur du module de communication.
Le corps de la trame contient les données « utilisateur ». Chaque donnée comprend le
nom de la donnée sur un octet et sa valeur sur quatre autres octets.
De plus, deux octets identifiant les trames de l'application en début de trame et un
checksum en fin de trame ne figurant pas dans la structure sont transmis.
La taille maximale d'une trame est fixée à 100 octets équivalant à la taille maximale du
buffer d'entrée de la puce XBeePro.
Figure 25 : Structure d'une trame
CemOA
: archive
ouverte
d'Irstea
Le fichier usart.c réalise les envois et les réceptions. Les fonctions atomiques utilisées
sont l'envoi d'un octet par appel de fonction et la réception d'un octet par interruption.
L'envoi d'une trame s'effectue par l'envoi successif des octets de la trame. Avant l'envoi
du premier octet, la valeur du checksum est initialisée à zéro, puis, après chaque envoi,
le checksum est calculé en réalisant un « ou-exclusif » entre sa valeur précédente et la
valeur transmise. La fonction d'interruption qui accuse la réception d'un octet, rend
compte également du décodage et de la vérification du checksum des trames. Le
décodage est réalisé à l'aide d'une machine d'états qui évolue à chaque réception d'octet
(voir Figure 26). Le temps passé dans cette fonction d'interruption est court. À chaque
état de la machine, la sauvegarde de l'octet reçu et un calcul du checksum intermédiaire
sont exécutés.
Figure 26 : Machine d'état de la fonction de réception
Une fois qu'une trame est reconnue correcte, elle est sauvegardée en attendant sa lecture
par une autre fonction. La taille mémoire étant limitée, seules les trois dernières trames
de chaque USART sont conservées. L'interface avec la couche supérieure se fait avec
deux fonctions : la fonction d'envoi et la fonction de réception d'une trame.
Le fichier ordonnanceur.c organise l'envoi des messages selon la stratégie expliquée
dans le chapitre suivant « Ordonnanceur du module de communication ». L'interface
avec la couche supérieure se fait avec deux fonctions : la fonction d’insertion et la
fonction de lecture d'une trame.
Le fichier routage.c est actuellement minimaliste. Les trames sont redirigées en fonction
de ID_D. Dans notre application les ordinateurs « PC » avec le logiciel AROCCAM ont
également un identifiant. Le routage se fait avec des identifiants connus d'avance afin de
réaliser des tests. Une version plus complexe avec l'utilisation de protocole routage
CemOA
: archive
ouverte
d'Irstea
32
CIVIC sera à développer pour assurer le fonctionnement d'un réseau ad hoc fortement
mobile.
Figure 27 : Identifiant des différends nœuds
Le fichier QoS.c calcule les paramètres utiles à l'ordonnanceur pour prendre ses
décisions. Le nombre total d'octets, le nombre d'octets d'erreur et le nombre des nœuds
voisins sont les informations nécessaires aux calculs. Ces relevés sont réalisés toutes les
secondes.
Dans le document
Développement de modules de communication pour la coopération de robots mobiles en milieu naturel
(Page 30-33)