Les drivers sur VxWorks
Frank Singhoff
L'objectif du TP est de montrer comment réaliser un driver
caractère avec VxWorks. Dans un premier temps, un exemple simplifié vous
est donné. Puis, on vous demande d'écrire un driver gérant des
fichiers en mémoire.
L'exemple que vous allez manipuler est celui étudié en cours. Le code du driver est
ici.
Il est complété par le fichier d'entête
demo.h. Vous disposez du fichier
test_demo.c
pour tester le driver.
Préparation :
- Compilez et chargez dans la cible les fichiers demoDrv.c, puis
test_demo.c.
- Initialisez le driver sur la cible en invoquant la fonction demoDrv.
Questions :
- Quel est la primitive VxWorks permettant d'ajouter un nouveau driver dans l'exécutif ?
- Quel est la primitive VxWorks permettant de créer un nouveau périphérique ?
- Quelles sont les informations contenues dans le descripteur de périphérique ?
- Créer un périphérique dont le nom est /dev/montest.
- Effectuer sur /dev/montest une opération d'écriture, puis de lecture.
- Ajouter dans le driver une opération ioctl dont le nom est GET_OPEN
et qui permet à l'utilisateur de récupérer le nombre actuel de tâches ayant ouvert le
périphérique mais ne l'ayant pas encore refermé.
On souhaite écrire un driver qui permet aux utilisateurs
d'exploiter des fichiers en mémoire. Pour ce faire, vous
disposez des fichiers
vfileDrv.c et vfile.h.
Question 1 : fonctionnalités de base du driver
Le driver doit fonctionner de la façon suivante :
- Le périphérique est constitué d'enregistrement de taille fixe. A
la création du périphérique, la taille maximale des enregistrements est
spécifiée. Le nombre d'enregistrement est borné par le driver (cf. MAX_ENR).
- L'état du fichier est défini par un offset (position courante de
lecture/écriture) et d'une taille courante.
- L'opération d'ouverture accepte les modes suivants :
- O_RDONLY : le fichier est ouvert en lecture et l'offset
est positionné à 0. La taille courante du fichier n'est pas modifiée.
- O_WRONLY : le fichier est ouvert en écriture et l'offset
est positionné à 0. La taille courante du fichier n'est pas modifiée.
- O_RDWR : le fichier est ouvert en lecture/écriture et l'offset
est positionné à 0. La taille courante du fichier n'est pas modifiée.
- O_APPEND : le fichier est ouvert en écriture et l'offset
est positionné à la taille courante du fichier. La taille courante du fichier n'est pas modifiée.
- O_TRUNC : le fichier est ouvert en écriture et l'offset
ainsi que la taille du fichier sont positionnés à zéro.
- Les contrôles suivants doivent être effectués par le driver
- Le nombre de caractères lus et écrits par read/write
doit être multiple de la taille des enregistrements.
- Les fonctions read/write doivent contrôler
si le périphérique a été ouvert conformément à l'opération demandée
(ex : lecture interdite si ouverture en mode O_WRONLY).
- Le fichier possède une taille maximale.
Les opérations read/write
doivent vérifier si cette taille maximale n'est pas dépassée.
- Les fonctions ioctl suivantes doivent être implantées
(cf. vfile.h):
- GVF_SIZE : consultation de la taille courante du fichier.
- GVF_OFFSET : consultation de l'offset.
- SVF_OFFSET : modification de l'offset.
On vous demande de :
- Complétez le fichier vfileDrv.c.
- Pour valider votre solution, vous pouvez utiliser
le fichier test_vfile.c
comme point de départ.
Vous aurez besoin de connaitre les valeurs numériques des constantes
O_RDONLY,
O_WRONLY,
O_RDWR,
O_APPEND et
O_TRUNC
qui sont respectivement 0, 1, 2, 8 et 1024.
Question 2 : gestion de la concurrence
Contrairement à UNIX, dans VxWorks, le code d'un driver est réentrant et plusieurs
tâches peuvent donc exécuter le code du driver sur un même
périphérique de façon concurrente.
Travail à faire :
-
Modifiez le code du driver afin qu'une tâche accède en exclusion mutuelle
le périphérique.
- Vérifiez qu'une tâche qui tente d'ouvrir un fichier déjà ouvert
par une autre tâche, reste bloquée sur l'invocation d'open.
Page maintenue par Frank Singhoff
(singhoff@univ-brest.fr)
Dernière mise à jour le 13 février 2002