Guide d'utilisation de Syndex V5 (par Cédric Pradalier)
Pré-requis
- Application de référence :
$WRKREP/linuxIO2_
- Sur le Cycab, ie la machine
bcycab
: /root/syndex/linuxIO2_
- Faire une copie avant toute modification et travailler sur la copie. La version actuelle de ce repertoire est essentielle pour toutes les manipulations fonctionnant actuellement sur le Cycab.
- Pour une question de confort:
- éviter de travailler directement sur le Cycab
- travailler avec un affichage déporté sur une station (telnet + export DISPLAY=...)
Définition de l'architecture Syndex
Cette architecture est définie dans le fichier
linio.sdx
.
Pour la visualiser :
- positionner la variable suivante (si non predefinie)
export SYNDEX5=/usr/local/syndex51 |
setenv SYNDEX5 /usr/local/syndex51 |
- lancer
syndex
via la commande /usr/local/syndex51/syndex5
- ouvrir le fichier
linio.sdx
via le menu File
et l'item Open...
Le graphe affiché à l'écran (cf.
ci-dessus) possède deux sous-graphes disjoints :
- Une partie composée de
root, r555, f555
et can
. Cette partie représente les processeurs et les canaux de communication disponibles. Pour ajouter un processeur mpc555
, il suffit donc d'ajouter (copier/coller) une boîte nommée 555
. Ensuite, éditer (click droit -> properties) les propriétés du noeud et modifier selon les besoins. à vérifier, consulter une référence concernant l'identifiant du noeud 555 ?
- La seconde partie du graphe représente le flux de données et d'opération qui tourne sur ce système. Il existe plusieurs type de boîtes :
-
extio
: une boîte fonctionnelle avec des variables statiques, une initialisation et un corps de boucle. C'est la plus pratique.
-
function
: comme extio
, mais sans variable statique ni initialisation
-
constant, ...
: quelle est leur utilité ?
C'est dans cette partie du graphe qu'il faudra ajouter l'accès aux ultra-sons, 'exportation des valeurs et eventuellement la lecture de commande/parametres du programme utilisateur.
Quelques explications sur le graphe actuel : On peut le découper en trois parties.
- [A gauche] les fonctions de lecture des capteurs (TPU, SPI,...) : pas d'entrée, juste des sorties. Si on demande (click droit -> show constraints), les contraintes, on constate que ces boîtes doivent s'exécuter sur le
mpc555
qui leur correspond.
- [Au milieu]
linuxIO
: une mémoire partagée, contrainte sur le PC embarqué (noté root
). Les données issues des capteurs sont écrites dans la mémoire en passant par le CAN. [cf plus les mecanismes reels mis en place ici]. Il serait judicieux que les ultra-sons soient gérés dans une boîte similaire à linuxIO
.
- [A gauche] l'envoi des commandes jusqu'aux fonctions qui réalisent les PIDs du contrôle bas-niveau. Les commandes sont lues dans la mémoire partagée et envoyées sur le CAN aux
mpc555
. Les fonctions intermediaires gèrent la sécurité.
Implantation des boîtes
Les fonctions représentées par les boîtes du graphe Syndex sont implémentées dans le fichier
linio.m4x
. Il s'agit d'un fichier en format
M4
(langage de script infame), qui va être interprété au moment où le code représenté par le graphe Syndex sera généré.
ne pas utiliser d'apostrophe dans les
commentaires : cela plante la compilation.
Syntaxe d'une fonction
La syntaxe d'une fonction est la suivante :
define(`MaFonction',`ifelse(
MGC,INIT,`le code correspondant a l'initialisation',
MGC,LOOP,`le code execut? ? chaque it?ration',
MGC,END,`le code de terminaison')
')
Selon les règles de traduction disponible et le processeur, le code est écrit soit en assembleur, soit en C.
En assembleur, les arguments (de
$1
à
$9
) sont accessibles avec
B(lwz r31,$1)
. En C, ce sont des
int*
, accessibles avec
*$2
.
De cette façon, on doit pouvoir utiliser et compiler du C sur les
mpc555
, mais comment ?
Les identifiants des cartes CAN sont aussi définis ici, avec quelque chose comme
define(`r555id',0x...)
. cf les premieres lignes de
linio.m4x
Différence entre B()
et _B()
:
Dans
B()
, il y a une fonction d'initialisation absente de
_B()
. Normalement, on appelle donc
B()
la première fois et
_B()
ensuite.
Ces fonctions définissent le cadre de pile courant et permettent donc d'accéder aux arguments des fonctions.
Visualisation et debug
Il est possible de créer un module qui affiche ses entrées. Il s'agit de la fonction
display
un exemple est disponible dans
/root/syndex/man_drv2/linio.m4x
.
Pour l'ajouter au graphe Syndex :
- soit étudier l'interface Syndex pour trouver le moyen de le faire
- soit ajouter la bonne ligne dans le fichier
=linio.sdx
, dont la syntaxe est assez evidente.
Cas particulier du module linio
Lorsqu'il est interpreté par
M4
, ce module construit un fichier
linio.h
contenant les structures et adresses des mémoires partagées. Ces structures sont construites à partir des noms de toutes les variables d'entrée et de sortie du module. La fonction définit alors le code d'un module noyau RTAI qui
crée les mémoires partagées. On peut ensuite y accéder depuis l'espace utilisateur du système linux avec
rtaishm
.
Pour une illustration de ce mécanisme, voir la classe
CycabInterface
dans
= /root/src/CycabDrv/cycabTools.*=
, en particulier les constructeurs/destructeurs.
Utilisation de divert
ou diversion
En M4, la notion de diversion correspond à un ensemble de lignes de code dont les sorties sont gardées dans un coin et ressorties plus tard.
Par exemple, le code qui se situe entre
divert(ITtimer)
et
divert(0)
est inseré dans le gestionnaire d'interruption timer (une IT toutes les millisecondes), quel que soit l'endroit oú il est écrit dans le fichier
linio.m4x
.
Exécution de l'ensemble
Une fois que le code et le graphe Syndex sont OK, il faut tester et compiler.
3 étapes sont nécessaires pour cela :
- Dans Syndex, utiliser l'item
Adequation->DoIt
. C'est une forme de verification syntaxique du graphe. Cela signale de façon plus ou moins claire les problèmes qui peuvent exister.
- Dans Syndex, utiliser l'item
Adequation->GenExec
. Cette étape permet de générer le code M4. Pas de message d'erreur. Les fichiers f555.s
, r555.s
et root.c
sont générés.
- Dans un shell, en ayant au préalable soulevé le Cycab (raison de sécurité), on lance
make
. Les fichiers générés sont compilés et le module root
est chargé, le code est téléchargé sur les processeurs 555
et l'application est lancée.
Si une erreur est détectée sur la ligne
1255
du fichier
r555.s
, il faut identifier l'équivalent dans le fichier
linio.m4x
et corrigé. Un plaisir...
--
SorayaArias - 22 Jul 2004