• Aucun résultat trouvé

Architecture logicielle du module de communication

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.

Documents relatifs