Ismael Ripoll � propos de l'auteur : Docteur de l'universit� polytechnique de Valence (Espagne) en 1996. Professeur en syst�mes d'exploitation au d�partement de DISCA. Sujets de recherche : ordonnancement temps r�el et syst�mes d'exploitation. Utilisateur de GNU/Linux depuis 1994. Loisirs : randonn�e dans les Pyr�n�es, ski, �lectronique.
Traduit en fran�ais par
S�bastien Blondeel.
|
Linux temps r�el IIR�sum� : Dans ce deuxi�me num�ro d�di� � RT-Linux je tenterai de proposer une vue plus pratique de RT-Linux. Avant de rentrer dans les d�tails, toutefois, je donnerai un aper�u rapide d'un syst�me d'exploitation temps r�el tr�s r�cent, appel� Linux KURT. KU Real Time Linux (KURT)Au d�but de cette ann�e (1998), on a vu sortir un nouveau syst�me d'exploitation temps r�el fond� sur GNU/Linux. KURT est un syst�me d'exploitation temps r�el souple (et non pas ferme), c.�.d. que l'ordonnanceur tente de satisfaire les temps d'ex�cution r�clam�s, mais si une t�che prend du retard ce n'est pas vraiment une trag�die et rien de dramatique ne se produit. Les t�ches temps r�el de KURT peuvent profiter de toutes les fonctionnalit�s de GNU/Linux, au contraire des t�ches de RT-Linux. Les am�liorations --- modifications --- apport�es au noyau sont :
Les t�ches temps r�el sont des modules charg�s dynamiquement. Une des fonctionnalit�s les plus caract�risques de KURT est sa politique d'ordonnancement. Il a �t� d�cid� d'implanter un ordonnanceur cyclique. Ce type d'ordonnanceurs utilise une table appel�e plan qui contient les actions ordonnanc�es : moment de l'activation, t�che � ex�cuter, dur�e de la t�che, etc. Cette table est construite pendant la phase de mise au point du syst�me. Plus tard, pendant l'ex�cution, le travail de l'ordonnanceur consiste simplement � lire s�quentiellement la table en suivant ses instructions. Quand on atteint la fin de la table, l'ordonnanceur retourne au d�but et continue � ex�cuter les t�ches --- d'o� le nom d'ordonnanceur cyclique. Ce type d'ordonnanceur pr�sente de nombreux avantages :
La difficult� principale r�side � g�n�rer le plan lui-m�me. De plus, d�s qu'un des param�tres des t�ches est modifi�, il est n�cessaire de reconstruire le plan, et il faut souvent beaucoup de m�moire pour le stocker. � quoi sert le temps r�el ?Nombreux sont ceux qui pensent peut-�tre que les techniques temps r�el ne sont utilis�es que par la NASA (Agence spatiale d'Am�rique du Nord), ou avec des missiles ou des artefacts semblables. Cela �tait vrai il y a quelques ann�es, mais de nos jours la situation a bien chang� --- et ce n'est pas fini --- � cause de l'int�gration de syst�mes d'information et d'�lectronique dans la vie de tous les jours des gens. On trouve par exemple le temps r�el dans les t�l�communications et les applications multimedia. Par exemple, si on souhaite que l'ordinateur joue un fichier son stock� sur le disque dur, un programme devrait contin�ment (ou mieux, p�riodiquement) lire, d�compresser et envoyer les donn�es sonores � la carte son. Si en m�me temps qu'en �coute la musique, on travaille avec une application, comme un traitement de texte ou la simple compilation du noyau lui-m�me, il est certain que des blancs se feront entendre p�riodiquement, pendant que le noyau g�rera d'autres t�ches. Si au lieu de produire du son, on produisait de la vid�o sur notre syst�me, on obtiendrait une diffusion avec des arr�ts sur image intermittents. On appelle ce genre de syst�mes temps r�el souple (le viol d'une p�riode d'ex�cution ne produit pas un r�sultat d�sastreux, mais il d�grade les services propos�s par le syst�me). Les applications de RT-Linux vont plus loin que les applications temps r�el normales. Gr�ce � RT-Linux, on peut prendre le contr�le total du PC (je dis PC et non par ordinateur car pour le moment on ne trouve RT-Linux que pour cette architecture), comme c'est le cas avec MS-DOS. Pendant une t�che temps r�el il est possible d'acc�der � tous les ports du PC, installer des gestionnaires d'interruptions, d�sactiver temporairement les interruptions, ... en d'autres termes, on peut � �crouler � le syst�me comme s'il s'agissait d'un syst�me MS-Windows. Cette opportunit� est toutefois tr�s attrayante � ceux d'entre nous qui aiment attacher de petits � gadgets � �lectroniques � l'ordinateur. Modules chargeablesPour comprendre RT-Linux et pouvoir l'utiliser, il faut conna�tre les modules de Linux qu'on peut charger dynamiquement. Matt Welsh a r�dig� un article complet o� il explique en d�tail tout ce qui concerne les modules. Qu'est-ce que c'est ?Dans la plupart des implantations d'Unix, la seule mani�re d'acc�der au mat�riel (les ports, la m�moire, les interruptions, etc.) et de passer par des fichiers particuliers et d'avoir install� au pr�alable les pilotes de p�riph�riques. M�me si les livres de qualit� expliquant comment �crire des pilotes de p�riph�riques ne manquent pas, c'est souvent un travail long et ennuyeux, puisqu'il est n�cessaire d'�crire de nombreuses fonctions pour lier le pilote au syst�me. Les modules sont des �fragments du syst�me
d'exploitation�
qu'on peut ins�rer et extraire au moment de l'ex�cution. Quand
on compile un programme comprenant plusieurs fichiers source, chaque
fichier est compil� s�par�ment, dans un premier temps, pour engendrer un
fichier objet �.o�,
puis les objets sont li�s ensemble, en r�solvant toutes les r�f�rences
et en engendrant un fichier ex�cutable unique.
Supposons que le fichier objet comportant la fonction
Les modules forment une fonctionnalit� optionnelle du noyau Linux, qu'il faut pr�ciser au moment de la compilation du noyau. Les noyaux de toutes les distributions que je connais ont �t� compil�s avec cette option activ�e. Il est m�me possible de cr�er de nouveaux modules et de les charger sans devoir recompiler ou r�amorcer le syst�me Quand un module est charg�, il se transforme en partie int�grante du syst�me d'exploitation donc :
Comme on peut le voir, un module charg� dynamiquement dispose d�j� de certaines des caract�risques d'un programme temps r�el : il �vite les retards provoqu�s par des fautes de pages et il peut acc�der � toutes les ressources du mat�riel. Comment les construire et les utiliser ?
Un module est construit � partir d'un code source �crit en langage
�C�. Voici un exemple de module minuscule (pour ex�cuter la
plupart des commandes suivantes il faut �tre super utilisateur ou
#define MODULE #include <linux/module.h> #include <linux/cons.h> static int output=1; int init_module(void) { printk("Output= %d\n",output); return 0; } void cleanup_module(void){ printk("Adi�s, Bye, Ciao, Ovuar, \n"); } Pour le compiler on utilise les param�tres suivants :
# gcc -I /usr/src/linux/include/linux -O2 -Wall -D__KERNEL__ -c exemple1.c
Le commutateur
Le noyau ne dispose pas de sortie standard, aussi ne pouvons-nous pas
utiliser la fonction
Remarquez l'absence de la fonction # insmod exemple1.o
On a maintenant install� le module # dmesg | tail -1 Output= 1
La commande # lsmod Module Pages Used by: exemple1 1 0 sb 6 1 uart401 2 [sb] 1 sound 16 [sb uart401] 0 (autoclean)
Enfin, on utilise la commande
# rmmod exemple1 # dmesg | tail -2 Output= 1 Adi�s, Bye, Ciao, Orvua,
La sortie de la commande
Il ne nous reste plus qu'� savoir comment passer des param�tres � un
module. De fa�on surprenante, rien n'est plus simple. On peut affecter
des valeurs aux variables globales en passant des param�tres � la
fonction # insmod exemple1.o output=4 # dmesg | tail -3 Output= 1 Ad�os, Bye, Chao, Ovuar, Output= 4 Maitenant qu'on sait tout ce qu'il faut savoir sur les modules, revenons � RT-Linux. Notre premier programme temps r�elIl faut d'abord se rappeler que pour utiliser RT-Linux, il faut d'abord pr�parer le noyau Linux � proposer une assistance pour les modules temps r�el — on a parl� de cette op�ration dans l'article pr�c�dent. Il y a deux mani�res d'utiliser RT-Linux :
Cette fois-ci, je discuterai de la mani�re d'utiliser RT-Linux en tant que syst�me disposant de priorit�s fixes. L'exemple que nous allons voir ne fait rien d'"utile", il se permet de mettre en place une t�che temps r�el (une simple boucle) : exemple2.c
#define MODULE #include <linux/module.h> #include <linux/kernel.h> #include <linux/version.h> #include <linux/rt_sched.h> RT_TASK task; void fun(int je_calcule) { int boucle,x,limite; limite = 10; while(1){ for (boucle=0; boucle<je_calcule; boucle++) for (x=1; x<limite; x++); rt_task_wait(); } } int init_module(void) { RTIME now = rt_get_time(); rt_task_init(&task,fun, 50 , 3000, 1); rt_task_make_periodic(&task, now+(RTIME)(RT_TICKS_PER_SEC*4000)/1000000, (RTIME)(RT_TICKS_PER_SEC * 100)/1000000); return 0; } void cleanup_module(void){ rt_task_delete(&task); } Une fois encore, on compile cet exemple en utilisant la commande suivante :
# gcc -I /usr/src/linux/include/linux -O2 -Wall -D__KERNEL__ -D__RT__ -c
exemple2.c
Puisque ce programme est un module, le point d'entr�e est la fonction
La fonction
La t�che temps r�el (la fonction
Pour ex�cuter le programme # modprobe rt_prio_sched # insmod ./exemple2.o
�tant donn� que le module
Si tout s'est bien pass�, la commande
Bien, � ce point ci le lecteur dispose d�j� d'un programme temps r�el en
cours d'ex�cution. Remarquez-vous quoi que ce soit ?
Si le processeur est un peu lent, le lecteur remarquera probablement que
Linux fonctionne un peu moins vite que d'habitude. Vous pouvez tenter
d'incr�menter le nombre d'it�rations � l'int�rieur de la boucle
de Communication entre les t�chesSous le syst�me RT-Linux, il n'existe qu'un seul moyen de communication : les files de type FIFO temps r�el. Leur mode de fonctionnement est tr�s semblable � celui des tuyaux (pipe) sous Unix, une communication par flot de donn�es sans structure. Une file FIFO est un tampon d'un nombre d'octets fix� sur lequel on peut effectuer des op�rations de lecture et d'�criture. En utilisant des files de type FIFO, il est possible d'�tablir des communications entre t�ches temps r�el aussi bien qu'entre des t�ches normales sous Linux.
Du point de vue d'un processus normal, une file de type
FIFO est un fichier � caract�re particulier. On les trouve
habituellement sous les noms
# for i in 0 1 2 3; do mknod /dev/rtf$i c 63 $i; done
S'il vous faut plus de files de type FIFO, vous pouvez facilement les
cr�er en utilisant la m�me proc�dure pour les fichiers
On utilise les files de type FIFO comme si elles �taient des fichiers
normaux (avec les fonctions
Du point de vue d'une t�che temps r�el, les files de type FIFO sont utilis�es � travers des fonctions sp�cifiques :
Consid�rons maintenant un exemple de syst�me qui utilise ces fonctions. Cet exemple est une petite modification d'un des exemples dans la distribution de RT-Linux (sound) : exemple3.c
#define MODULE #include <linux/module.h> #include <linux/rt_sched.h> #include <linux/rtf.h> #include <asm/io.h> RT_TASK tache; static int filter(int x){ static int vieil_x; int ret; if (x & 0x80) { x = 382 - x; } ret = x > vieil_x; vieil_x = x; return ret; } void fun(int mannequin) { char donnees; char temp; while (1) { if (rtf_get(0, &donnees, 1) > 0) { donnees = filter(donnees); temp = inb(0x61); temp &= 0xfd; temp |= (donnees & 1) << 1; outb(temp,0x61); } rt_task_wait(); } } int init_module(void){ rtf_create(0, 4000); /* met en place le compteur num�ro 2 */ outb_p(inb_p(0x61)|3, 0x61); /* pour s'assurer que le compteur renvoie 1 */ outb_p(0xb0, 0x43); outb_p(3, 0x42); outb_p(00, 0x42); rt_task_init(&tache, fun, 0 , 3000, 1); rt_task_make_periodic(&tache, (RTIME)rt_get_time()+(RTIME)1000LL, (RTIME)(RT_TICKS_PER_SEC / 8192LL)); return 0; } void cleanup_module(void){ rt_task_delete(&tache); rtf_destroy(0); }
Comme dans le deuxi�me exemple, on a besoin des services du module
Une t�che temps r�el p�riodique de fr�quence 8192 Hz est cr��e.
Cette t�che lit des octets dans la file de type FIFO num�ro 0, et
si elle trouve quelque chose elle l'envoie au port du haut-parleur de
l'ordinateur personnel de type PC. Si on copie un fichier son au format
".au" sur la file Pour le compiler et l'ex�cuter :
# gcc -I /usr/src/linux/include/linux -O2 -Wall -D__KERNEL__ -D__RT__ -c exemple3.c
Remarquez de quelle mani�re on peut utiliser l'outil Pour comparer la mani�re dont les fonctionnalit�s du temps r�el affectent la qualit� de la reproduction, il nous suffit d'�crire un programme qui fasse la m�me op�ration, mais � partir d'un processus utilisateur normal de Linux : exemple4.c
#include <unistd.h> #include <asm/io.h> #include <time.h> static int filter(int x){ static int vieil_x; int ret; if (x & 0x80) x = 382 - x; ret = x > vieil_x; vieil_x = x; return ret; } attends(int x){ int v; for (v=0; v<x; v++); } void fun() { char donnees; char temp; while (1) { if (read(0, &donnees, 1) > 0) { donnees = filter(donnees); temp = inb(0x61); temp &= 0xfd; temp |= (donnees & 1) << 1; outb(temp,0x61); } attends(3000); } } int main(void){ unsigned char mannequin,x; ioperm(0x42, 0x3,1); ioperm(0x61, 0x1,1); mannequin= inb(0x61);attends(10); outb(mannequin|3, 0x61); outb(0xb0, 0x43);attends(10); outb(3, 0x42);attends(10); outb(00, 0x42); fun(); } On peut compiler ce programme comme tout programme normal : # gcc -O2 exemple4.c -o exemple4 Et pour l'ex�cuter : # cat linux.au | exemple4
Pour acc�der aux ports mat�riels de l'ordinateur � partir d'un
programme normal de Linux il faut l'autorisation du syst�me
d'exploitation. C'est une mesure de protection �l�mentaire et n�cessaire
pour �viter de programmer des acc�s directs au disque dur, par exemple.
L'appel
Je sugg�re maintenant au lecteur de tester
l' ConclusionCe deuxi�me article a mis l'accent sur les d�tails de programmation des t�ches temps r�el. Les exemples pr�sent�s sont tr�s simples et manquent d'utilisation pratique, mais dans l'article suivant je proposerai une application plus utile. Nous serons capables de contr�ler le t�l�viseur � partir de GNU/Linux ou, plus surprenant encore, de contr�ler une linuxette gr�ce � une t�l�commande ! . |
Traduit en fran�ais par S�bastien Blondeel.
© Ismael Ripoll 1998 LinuxFocus 1998 Contacter le Webmestre. |