Vous êtes sur la page 1sur 37

Temps rel sous LINUX

Pierre Ficheux (pierre.ficheux@openwide.fr)


Patrice Kadionik (kadionik@enseirb.fr)
Mai 2003
Rsum
Cet article a pour but de raliser un tour d'horizon des solutions temps rel dans
l'environnement LINUX. Aprs une dfinition du concept de systme temps rel, les auteurs
s'attacheront dcrire les solutions logicielles disponibles ainsi que quelques exemples de rsultats
obtenus.
Dfinition d'un systme temps rel
Temps partag et temps rel
La gestion du temps est l'un des problmes majeurs des systmes d'exploitation. La
raison est simple : les systme d'exploitation modernes sont tous multitache or ils utilisent du
matriel bas sur des processeurs qui ne le sont pas, ce qui oblige le systme partager le temps du
processeur entre les diffrentes tches. Cette notion de partage implique une gestion du passage
d'une tche l'autre qui est effectue par un ensemble d'algorithmes appel oraonnanceur
(scheauler en anglais).
Un systme d'exploitation classique comme UNIX, LINUX ou Windows utilise la
notion de temps partage par opposition au temps reel Dans ce type de systme, le but de
l'ordonnanceur est de donner l'utilisateur une impression de confort tout en s'assurant que toutes
les tches demandes sont finalement excutes. Ce type d'approche entrane une grande complexit
dans la structure mme de l'ordonnanceur qui doit tenir compte de notions comme la rgulation de
la charge du systme ou la date depuis laquelle une tche donne est en cours d'excution. De ce
fait, on peut noter plusieurs limitations par rapport la gestion du temps.
Tout d'abord, la notion de priorit entre les tches est peu prise en compte, car l'ordonnanceur a pour
but premier le partage quitable du temps entre les diffrentes tches du systme (on parle de
quantum de temps ou tick). Notez que sur les diffrentes versions d'UNIX dont LINUX, la
commande nice permet de modifier la priorit de la tche au lancement.
Ensuite, les diffrentes tches doivent accder des ressources dites partagees ce qui
entrane des incertitudes temporelles. Si une des tches effectue une criture sur le disque dur, celui-
ce n'est plus disponible aux autres tches un instant donn et le dlai de disponibilit du
priphrique n'est donc pas prvisible.
En outre, la gestion des entres/sorties peut gnrer des temps morts car une tche peut
tre bloque en attente d'accs un lment d'entre/sortie. La gestion des interruptions reues par
une tche n'est pas optimise. Le temps de latence - soit le temps coul entre la rception de
l'interruption et son traitement - n'est pas garanti par le systme.
Enfin, l'utilisation du mcanisme de memoire virtuelle peut entraner des fluctuations
importante s dans les temps d'excution des tches.
Notion de temps rel
Le cas des systmes temps rel est diffrent. Il existe un grande nombre de dfinition
d'un systme dit temps reel mais une dfinition simple d'un tel systme pourra tre la suivante :
n systme temps reel est une association logicielmateriel o le logiciel permet entre
autre une gestion aaequate aes ressources materielles en vue ae remplir certaines taches ou
1/37
fonctions aans aes limites temporelles bien precises
Un autre dfinition pourrait tre :
"n systme est ait temps reel lorsque linformation aprs acquisition et traitement
reste encore pertinente"
Ce qui signifie que dans le cas d'une information arrivant de faon rgulire (sous
forme d'une interruption priodique du systme), les temps d'acquisition et de traitement doivent
rester infrieurs la priode de rafrachissement de cette information.
Il est vident que la structure de ce systme dpendra de ces fameuses contraintes. On
pourra diviser les systmes en deux catgories :
1. Les systmes dits contraintes souples ou molles (soft real time). Ces systmes
acceptent des variations dans le traitement des donnes de l'ordre de la demi-seconde
(ou 500 ms) ou la seconde. On peut citer l'exemple des systmes multimdia : si
quelques images ne sont pas affiches, cela ne met pas en pril le fonctionnement
correct de l'ensemble du systme. Ces systmes se rapprochent fortement des
systmes d'exploitation classiques temps partag. Ils garantissent un temps moyen
d'excution pour chaque tche. On a ici une rpartition pJDOLWDLUH du temps CPU
entre processus.
2. Les systmes dits contraintes aures (hara real time) pour lesquels une gestion
stricte du temps est ncessaire pour conserver l'intgrit du service rendu. On citera
comme exemples les contrles de processus industriels sensibles comme la
rgulation des centrales nuclaires ou les systmes embarqus utiliss dans
l'aronautique. Ces systmes garantissent un temps maximum d'excution pour
chaque tche. On a ici une rpartition WRWDOLWDLUHdu temps CPU entre tches.
Les systmes contraintes dures doivent rpondre trois critres fondamentaux :
1. Le dterminisme logique : les mmes entres appliques au systme doivent produire
les mmes effets.
2. Le dterminisme temporel : un tche donne doit obligatoirement tre excute dans
les dlais impartis, on parle d'echeance.
3. La fiabilite : le systme doit tre disponible. Cette contrainte est trs forte dans le cas
d'un systme embarqu car les interventions d'un oprateur sont trs difficiles voire
mme impossibles. Cette contrainte est indpendante de la notion de temps rel mais
la fiabilit du systme sera d'autant plus mise l'preuve dans le cas de contraintes
dures.
Un systme temps rel n'est pas forcment plus rapiae qu'un systme temps partag.
Il devra par contre satisfaire des contraintes temporelles strictes, prvues l'avance et imposes
par le processus extrieur contrler. Une confusion classique est de mlanger temps rel et rapidit
de calcul du systme donc puissance du processeur (microprocesseur, micro-contrleur, DSP). On
entend souvent :
Etre temps reel cest avoir beaucoup ae puissance . aes MIPS voire aes MFLOPS
2/37
Ce nest pas toujours vrai. En fait, tre temps rel dans l'exemple donn prcdemment,
c'est tre capable d'acquitter l'interruption priodique (moyennant un temps de latence
d'acquittement d'interruption impos par le matriel), traiter l'information et le signaler au niveau
utilisateur (rveil d'une tche ou libration d'un smaphore) dans un temps infrieur au temps entre
deux interruptions priodiques conscutives. On est donc li la contrainte de dlai entre deux
interruptions gnres par le processus extrieur contrler.
Si cette dure est de l'ordre de la seconde (pour le contrle d'une raction chimique par exemple), il
ne sert rien davoir un systme base de Pentium IV ! Un simple processeur 8 bits du type micro-
contrleur Motorola 68HC11, Microchip PIC, Scenix, AVR... ou mme un processeur 4 bits fera
amplement l'affaire, ce qui permettra de minimiser les cots sur des forts volumes de production.
Si ce temps est maintenant de quelques dizaines de microsecondes (pour le traitement
des donnes issues de l'observation d'une raction nuclaire par exemple), il convient de choisir un
processeur nettement plus performant comme un processeur 32 bits Intel x86, StrongARM ou
Motorola ColdFire.
L'exemple donn est malheureusement idyllique (quoique frquent dans le domaine
des tlcommunications et rseaux) puisque notre monde interagit plutt avec un systme
lectronique de faon apriodique.
Il convient donc avant de concevoir ledit systme de connatre la dure minimale entre
deux interruptions, ce qui est assez difficile estimer voire mme impossible. C'est pour cela que
lon a tendance concevoir dans ce cas des systmes performants (en terme de puissance de calcul
CPU et de rapidit de traitement dune interruption) et souvent sur-dimensionns pour respecter des
contraintes temps rel mal cernes priori. Ceci induit en cas de sur-dimensionnement un sur-cot
non ngligeable.
En rsum, on peut dire qu'un systme temps rel doit tre prvisible (preaictible en
anglais) les contraintes temporelles pouvant s'chelonner entre quelques micro-secondes (s) et
quelques secondes
La figure suivante permet d'illustrer la notion de temps rel sur le cas particulier de l'excution d'une
tche priodique. Idalement, une tche priodique doit tre excute toutes les m secondes (son
temps d'excution reste infrieur m). Dans le cas d'un systme non temps rel, un temps de latence
apparat avant l'excution effective de la tche priodique. il varie fortement au cours du temps
(charge du systme...). Dans le cas d'un systme temps rel, ce temps de latence doit tre born et
garanti infrieur une valeur fixe et connue l'avance. Si ce n'est pas le cas, il y a un dfaut de
fonctionnement pouvant causer le crash du systme. Les diteurs de systmes temps rel donnent
gnralement cette valeur qui est fixe (si le systme est bien conu) quelle que soit la charge du
systme ou du nombre de tches en fonction du processeur utilis.
3/37
Figure 1 Tache perioaique et temps reel
Une petite exprience
L'exprience dcrite sur la figure ci-dessous met en vidence la diffrence entre un
systme classique et un systme temps rel. Elle est extraite d'un mmoire sur le temps rel ralis
par William Blachier l'ENSIMAG en 2000.
Figure 2 Test comparatif temps reeltemps partage
Le but de l'exprience est de gnrer un signal priodique sortant du port parallle du
PC. Le temps qui spare deux missions du signal sera mesur l'aide d'un compteur. Le but est de
visualiser l'volution de ce dlai en fonction de la charge du systme. La frquence initiale du signal
4/37
est de 25 Hz (Hertz) ce qui donne une demi-priode T/2 de 20 ms.
Sur un systme classique, cette demi-priode varie de 17 23 ms, ce qui donne une variation de
frquence entre 22 Hz et 29 Hz. La figure ci-dessous donne la reprsentation graphique de la mesure
sur un systme non charg puis pleine charge :
Figure 3. Reprsentation sur un systme classique
Sur un systme temps rel, la demi-priode varie entre 19,990 ms et 20,015 ms, ce qui
donne une variation de frquence de 24,98 Hz 25,01 Hz. La variation est donc beaucoup plus
faible. La figure donne la reprsentation graphique de la mesure :
Figure 4. Reprsentation sur un systme temps rel
Lorsque la charge est maximale, le systme temps rel assure donc une variation de +/-
0,2 Hz alors que la variation est de +/- 4 Hz dans le cas d'un systme classique.
Ce phnomne peut tre reproduit l'aide du programme square.c crit en langage C.
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <asm/io.h>
#define LPT 0x378
int ioperm();
5/37
int main(int argc, char **argv)
{
setuid(0);
if (ioperm(LPT, 1, 1) < 0) {
perror("ioperm()");
exit(-1);
}
while(1) {
outb(0x01, LPT);
usleep(50000);
outb(0x00, LPT);
usleep(50000);
}
return(0);
}
Le signal gnr sur la broche 2 (bit D0) du port parallle est thoriquement un signal priodique
carr de demi-priode T/2 de 50 ms. On observe l'oscilloscope le signal suivant sur un systme
non charg (AMD Athlon 1500+).
Figure 5 Generation aun signal carre sous Linux non charge
On remarque que l'on n'a pas une priode de 100 ms mais de 119,6 ms d au temps supplmentaire
d'excution des appels systme. Ds que l'on stresse le systme (criture rptitive sur disque d'un
fichier de 50 Mo), on observe le signal suivant :
6/37
Figure 6 Generation aun signal carre sous Linux charge
On observe maintenant une gigue (/itter) sur le signal gnr. La gigue maximale sur la dure de
l'exprience est de 17,6 ms. La forme du signal varie maintenant au cours du temps, n'est pas de
forme carre mais rectangulaire. LINUX n'est donc plus capable de gnrer correctement ce signal.
Il faut noter aussi que le front montant sur la figure prcdente apparat sans gigue car il a servi
comme front de synchronisation de l'oscilloscope. La gigue observe est donc voir comme la
contribution de la gigue sur front montant et sur front descendant. Si l'on diminue la valeur de la
demi-priode, la gigue devient aussi importante que cette dernire et dans ce cas, Linux ne gnre
plus aucun signal !
Cette exprience met donc en vidence l'importance des systmes temps rel pour
certaines applications critiques.
Premption et commutation de contexte
Le noyau (kernel) est le composant principal d'un systme d'exploitation multitche
moderne. Dans un tel systme, chaque tche (ou processus) est dcompose en threaas (processus
leger ou tache legre) qui sont des lments de programmes coopratifs capables d'excuter chacun
une portion de code dans un mme espace d'adressage. Chaque thread est caractris par un
contexte local contenant la priorite du thread, ses variables locales et l'tat de ses registres. Le
passage d'un thread un autre est appel changement de contexte (context switch) Ce changement
de contexte sera plus rapide sur un thread que sur un processus car les threads d'un processus
voluent dans le mme espace d'adressage ce qui permet le partage des donnes entre les threads
d'un mme processus Dans certains cas, un processus ne sera compos que d'un seul thread et le
7/37
changement de contexte s'effectuera sur le processus lui-mme.
Dans le cas d'un systme temps rel, le noyau est dit preemptif c'est dire qu'un thread
peut tre interrompu par l'ordonnanceur en fonction du niveau de priorit et ce afin de permettre
l'excution d'un thread de plus haut niveau de priorit prt tre excut. Ceci permet d'affecter les
plus hauts niveaux de priorit des tches dites critiques par rapport l'environnement rel contrl
par le systme. La vrification des contextes commuter est ralise de manire rgulire par
l'ordonnanceur en fonction de l'horloge logicielle interne du systme, ou tick timer systme.
Dans le cas d'un noyau non premptif - comme le noyau LINUX - un thread sera
interrompu uniquement dans le cas d'un appel au noyau ou d'une une interruption externe. La notion
de priorit tant peu utilise, c'est le noyau qui dcide ou non de commuter le thread actif en
fonction d'un algorithme complexe.
Les extensions POSlX
La complexit des systmes et l'interoprabilit omniprsente ncessitent une
standardisation de plus en plus grande tant au niveau des protocoles utiliss que du code source des
applications. Mme si elle n'est pas obligatoire, l'utilisation de systmes conformes POSIX est de
plus en plus frquente.
POSIX est l'acronyme de Portable Operating System Interface ou interface portable
pour les systmes d'exploitation. Cette norme a t dveloppe par l'IEEE (Institute of Electrical
ana Electronic Engineering) et standardise par l'ANSI (American National Stanaaras Institute) et
l'ISO (International Stanaaras Organisation).
Le but de POSIX est d'obtenir la portabilit des logiciels au niveau de leur code source.
Le terme de portabilite est un anglicisme driv de portability terme lui-mme rserv au jargon
informatique. Un programme qui est destin un systme d'exploitation qui respecte POSIX doit
pouvoir tre adapt moindre frais sous n'importe quel autre systme POSIX. En thorie, le portage
d'une application d'un systme POSIX vers un autre doit se rsumer une compilation des sources
du programme.
POSIX a initialement t mis en place pour les systmes de type UNIX mais d'autres
systmes d'exploitation comme hinaows NT sont aujourd'hui conformes POSIX. Le standard
POSIX est divis en plusieurs sous-standards dont les principaux sont les suivants :
+ IEEE 1003.1-1990 : POSIX Partie 1 : Interface de programmation (API) systme.
Dfinition d'interfaces de programmation standards pour les systmes de type UNIX,
connu galement sous l'appellation ISO 9945-1. Ce standard contient la dfinition de
ces fonctions (binaings) en langage C.
+ IEEE 1003.2-1992 : Interface applicative pour le shell et applications annexes.
Dfinit les fonctionnalits du shell et commandes annexes pour les systmes de type
UNIX.
+ IEEE 1003.1b-1993 : Interface de programmation (API) temps rel. Ajout du support
de programmation temps rel au standard prcdent. On parle galement de
POSIX.4.
+ IEEE 1003.1c-1995 : Interface de programmation (API) pour le multithreading.
Pour le sujet qui nous intresse, la plupart des systmes d'exploitation temps rel sont
conformes partiellement ou totalement au standard POSIX. C'est le cas en particulier des systmes
temps rel LynxOS (http ://www.lynuxworks.com) et QNX (http ://www.qnx.com). Quant LINUX, sa conformit
par rapport POSIX 1003.1b (temps rel) est partielle dans sa version standard et il ncessite
l'application de modification (ou patch) sur les sources du noyau.
8/37
Tour d'horizon des principaux systmes temps rel
Le but de cette section est deffectuer un rapide tour dhorizon des principaux systmes
d'exploitation utiliss dans les environnement embarqus. Ce tour d'horizon n'inclut pas les
systmes base de LINUX qui seront bien entendu dcrits en dtails plus loin dans l'article. Il
convient avant tout de prciser les diffrences entre noyau, excutif et systme d'exploitation temps
rel :
+ Un noyau temps rel est le minimum logiciel pour pouvoir faire du temps rel : ordonnanceur,
gestion de tches, communications inter-tches, autant dire un systme plutt limit mais
performant.
+ Un excutif temps rel possde un noyau temps rel complt de modules/bibliothques pour
faciliter la conception de l'application temps rel : gestion mmoire, gestion des E/S, gestion de
timers, gestion d'accs rseau, gestion de fichiers. Lors de la gnration de l'excutif, on choisit
la carte les bibliothques en fonction des besoins de l'application temps rel. Pour le
dveloppement, on a besoin d'une machine hte (host) et de son environnement de
dveloppement crois (compilateur C crois, utilitaires, debugger) ainsi que du systme cible
(target) dans lequel on va tlcharger (par liaison srie ou par le rseau) l'application temps rel
avec l'excutif.
+ Un systme d'exploitation temps rel est le cas particulier o l'on a confusion entre le systme
hte et le systme cible qui ne font plus qu'un. On a donc ici un environnement de
dveloppement natif.
VxWorks et pSOS
VxWorks est aujourd'hui l'excutif temps rel le plus utilis dans l'industrie. Il est
dvelopp par la socit hina River (http ://www.windriver.com) qui a galement rachet rcemment les
droits du noyau temps rel pSOS, un peu ancien mais galement largement utilis. VxWorks est
fiable, faible empreinte mmoire, totalement configurable et port sur un nombre important de
processeurs (PowerPC, 68K, CPU32, ColdFire, MCORE, 80x86, Pentium, i960, ARM,
StrongARM, MIPS, SH, SPARC, NECV8xx, M32 R/D, RAD6000, ST 20, TriCore). Un point fort
de VxWorks a t le support rseau (sockets, commandes r..., NFS, RPC...) disponible ds 1989 au
dveloppeur bien avant tous ses concurrents. VxWorks est galement conforme POSIX 1003.1b.
QNX
Dvelopp par la socit canadienne QNX Software (http ://www.qnx.com), QNX est un
systme temps rel de type UNIX. Il est conforme POSIX, permet de dvelopper directement sur
la plateforme cible et intgre l'environnement graphique Photon, proche de X hinaow System.
C/OS (micro-C OS) et C/OS ll
C/OS, dvelopp par le Canadien Jean J. Labrosse, est un excutif temps rel destin
des environnements de trs petite taille construits autour de micro-contrleurs. Il est maintenant
disponible sur un grand nombre de processeurs et peut intgrer des protocoles standards comme
TCP/IP (C/IP) pour assurer une connectivit IP sur une liaison srie par PPP. Il est utilisable
gratuitement pour l'enseignement (voir http ://www.ucos-ii.com).
Windows CE
Annonc avec fracas par Microsoft comme le systme d'exploitation embarqu qui tue
Windows CE et ses cousins comme Embedded Windows NT n'ont pour l'instant pas dtrn les
systmes embarqus traditionnels Victime d'une rputation de fiabilit approximative, Windows
9/37
CE est pour l'instant cantonn l'quipement de nombreux assistants personnels ou PDA.
LynxOS
LynxOS est dvelopp par la socit LynuxWorks (http ://www.lynuxworks.com) qui a
rcemment modifi son nom de part son virage vers LINUX avec le dveloppement de Blue Cat Ce
systme temps rel est conforme la norme POSIX.
Nucleus
Nucleus est dvelopp par la socit Accelerated Technology Inc
(http ://www.acceleratedtechnology.com). Il est livr avec les sources et il n'y pas de royalties payer pour la
redistribution.
eCOS
Acronyme pour Embeaaable Configurable Operating System, eCOS fut initialement
dvelopp par la socit Cygnus figure emblmatique et prcurseur de l'open source professionnel,
aujourd'hui rattache la socit Red Hat Software. Ce systme est adapt aux solutions trs faible
empreinte mmoire et profondment enfouies. Son environnement de dveloppement est bas sur
LINUX et la chane de compilation GNU avec conformit au standard POSIX.
Les contraintes des systmes propritaires
La majorit des systmes propritaires dcrits la section prcdente souffrent
cependant de quelques dfauts forts contraignants.
Les systmes sont souvent raliss par des socits de taille moyenne qui ont du mal
suivre l'volution technologique : le matriel volue trs vite - la dure de vie d'un processeur de la
famille x86 est par exemple de l'ordre de 12 24 mois - les standards logiciels font de mme et de
plus en plus d'quipements ncessitent l'intgration de composants que l'on doit importer du monde
des systmes informatiques classiques ou du multimdia.
De ce fait, les cots de licence et les droits de redistribution des systmes (ou royalties)
sont parfois trs levs car l'diteur travaille sur un segment de march trs spcialis, une niche
dans laquelle les produits commercialiss le sont pour leur fonction finale et non pour la valeur du
logiciel lui-mme. Contrairement au monde de la bureautique o la pression commerciale peut
inciter l'utilisateur faire voluer son logiciel frquemment - et donc payer un complment de
licence - le logiciel embarqu est considr comme un mal ncessaire souvent destin durer
plusieurs annes, en conservant une compatibilit avec du matriel et des processeurs obsoltes.
Le cot de dveloppement d'applications autour de systmes propritaires est souvent
plus lev car les outils de dveloppement sont mal connus de la majorit des dveloppeurs
disponibles sur le march du travail car non tudis l'universit. Il est donc ncessaire de recruter
du personnel trs spcialis donc rare. Les formations autour de ces outils sont galement onreuses
car trs spcialises ce qui oblige l'diteur pratiquer des cots levs pour compenser le manque
d'effet de masse.
Tout cela implique un ensemble de spcificits contraignantes pour la gestion globale
des outils informatiques de l'entreprise.
Les avantages de l'open source
Les trois points suivants de la dfinition du logiciel open source sont fondamentaux
dans le cas du logiciel embarqu et temps rel :
10/37
1. La redistribution sans royalties. Ce point rgle le problme conomique des droits de
redistribution ou royalties, trs contraignant dans le cas d'un systme distribu
grande chelle.
2. La disponibilit du code source. Ce point est encore plus fondamental car il est la
base de la conception d'un logiciel de qualit et surtout maintenable dans le temps.
3. La possibilit de raliser un dveloppement driv de ce code source. L encore,
l'open source permet de raliser des conomies substancielles en intgrant des
composants existants dans une solution industrielle.
LlNUX comme systme temps rel
Forts des arguments concernant l'open source, il est normal d'tre tent par l'utilisation
de LINUX comme systme temps rel. Outre les avantages inhrents l'open source, la fiabilit
lgendaire de LINUX en fait un candidat idal. Malheureusement, LINUX n'est pas nativement un
systme temps rel. Le noyau LINUX fut en effet conu dans le but d'en faire un systme gnraliste
donc bas sur la notion de temps partag et non de temps rel.
La communaut LINUX tant trs active, plusieurs solutions techniques sont
cependant disponibles dans le but d'amliorer le comportement du noyau afin qu'il soit compatible
avec les contraintes d'un systme temps rel comme dcrit au dbut de l'article. Concrtement, les
solutions techniques disponibles sont divises en deux familles :
1. Les patchs dits premptifs permettant d'amliorer le comportement du noyau
LINUX en rduisant les temps de latence de ce dernier. Ces modifications ne
transforment pas LINUX en noyau temps rel dur mais permettent d'obtenir des
rsultats satisfaisants dans le cas de contraintes temps rel molles . Cette
technologie est disponible auprs de diffrents projets open source et elle est
galement supporte commercialement par divers diteurs spcialiss dont le plus
connu est l'amricain MontaVista (http://www.mvista.com). La notion de noyau
premptif est intgre dans le noyau de dveloppement 2.5.
2. Le noyau temps rel auxiliaire. Les promoteurs de cette technologie considrent que
le noyau LINUX ne sera jamais vritablement temps rel et ajoute donc ce noyau
un vritable ordonnanceur temps rel priorits fixes. Ce noyau auxiliaire traite
directement les tches temps rel et dlgue les autres tches au noyau LINUX,
considr comme la tche de fond de plus faible priorit. Cette technique permet de
mettre en place des systmes temps rel durs . Cette technologie utilise par
RTLinux et son cousin europen RTAI. RTLinux est support commercialement par
FSMLabs (http://www.fsmlabs.com) qui a des relations chaotiques avec la
communaut open source cause du brevet logiciel qui couvre l'utilisation de ce
noyau auxiliaire. Pour cette raison, le projet RTAI - qui n'est pas associ une entit
commerciale - tend utiliser une technique similaire mais ne tombant pas sous le
coup du brevet.
Les patchs premptifs
Ce paragraphe prsente les deux principaux patchs permettant d'amliorer les
performances du noyau LINUX 2.4 au niveau du temps de latence pour la prise en compte d'une
interruption. Le document dcrit la mthode d'application des patchs puis commente les rsultats
obtenus avec des outils de mesures spcialiss.
11/37
Les diffrentes solutions disponibles
Cette tude se limitera aux patchs les plus utiliss dans l'environnement LINUX :
+ Le patch Prempt Kernel maintenu par Robert M. Love et disponible sur
http://www.tech9.net/rml/linux. Le principe du patch est d'ajouter systmatiquement des
occasions d'appel l'ordonnanceur et donc de minimiser le temps entre la rception d'un
vnement et l'appel la fonction schedule() (ordonnanceur LINUX).
+ Le patch Low latency maintenu par Andrew Morton et disponible sur
http://www.zip.com.au/~akpm/linux/schedlat.html. Le principe est un peu diffrent car au
lieu d'opter pour une stratgie "systmatique", les dveloppeurs du patch ont prfr
effectuer une analyse du noyau afin d'ajouter des "points de premption" subtilement placs
dans les sources du noyau afin de "casser" des boucles d'attente trop longues.
Il faut noter que l'tude s'applique uniquement au noyau 2.4.20 (dernire version stable
disponible ce jour). Des versions similaires du patch Prempt Kernel sont intgres au noyau de
dveloppement 2.5. Une fusion des deux patchs est peut tre envisageable dans le futur noyau 2.6
(information sans garantie mais voque dans certains interviews de Robert M. Love). De mme,
l'diteur MontaVista Software diffuse une version de noyau 2.4 incluant un patch premptif trs
similaire celui de Robert M. Love (qui travaille d'ailleurs chez MontaVista !).
Procdure d'application du patch
La procdure est similaire pour les deux patchs :
1. Extraire les sources du noyau LINUX dans le rpertoire /usr/src. Dans notre cas cela
donne un rpertoire /usr/src/linux-2.4.20 que l'on peut suffixer par le type de
patch. On peut ensuite positionner le lien linux-2.4 sur cette arborescence.
# cd /usr/src
# mv linux-2.4.20 linux-2.4.20_kpreempt
# rm -f linux-2.4; ln -s linux-2.4.20_kpreempt linux-2.4
2. Rcuprer le patch correspondant la version du noyau, puis appliquer le patch :
# cd /usr/src/linux-2.4
# patch -p1 < un_repertoire_de_stockage/patchfile
3. Configurer le noyau LINUX en activant les options habituelles du noyau non patch ainsi
que les options spcifiques du patch. Avant d'appliquer le patch il est ,03(5$7,) de
vrifier le bon fonctionnement du noyau non patch sur votre matriel.
Il faut ensuite configurer puis compiler le noyau avec la procdure habituelle :
# make xconfig
# make dep; make clean; make bzImage; make modules
Configuration du noyau patch Preempt Kernel
Il est conseill d'utiliser le paramtre EXTRAVERSION dfini au dbut du Makefile
du noyau, soit dans ce cas :
VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 20
EXTRAVERSION = -kpreempt
12/37
ce qui permet de suffixer larborescence des modules suivant le type de noyau (ici
kpreempt) et donc de faire cohabiter plusieurs versions du noyau 2.4.20 patch sur le mme
systme.
Ensuite il convient de vrifier l'option de noyau premptif (CONFIG_PREEMPT) en
utilisant make xconfig et en validant l'option dans la rubrique Processor type ana features
comme indiqu sur la figure ci-dessous.
Figure 7 Jaliaation ae CONFIGPREEMPT
Il est galement ncessaire de valider le support RTC (Real Time Clock) car certains
outils de mesure de latence utilisent le device /dev/rtc.
Figure 8 Jaliaation au support RTC
Enfin il est ncessaire de valider l'utilisation du DMA (Direct Memory Access) sur le
bus PCI cot noyau ce qui normalement fait par dfaut. L'utilisation du DMA permet d'amliorer
fortement les performances puisque le processeur n'est plus sollicit.
Figure 9 Jaliaation au support DMA
Une fois le noyau compil, on peut l'installer par :
# cp arch/i386/boot/bzImage /boot/bzImage-2.4.20_kpreempt
# make modules_install
puis ajouter une entre supplmentaire dans le fichier /etc/lilo.conf (ou
/etc/grub.conf suivant le chargeur utilis). Dans le cas de LILO cela donne :
image=/boot/bzImage-2.4.20_kpreempt
label=linux20_kp
read-only
root=/dev/hda1
Il faut ensuite valider cette nouvelle entre en tapant :
# lilo
Configuration du noyau patch Low Latency
La configuration est trs similaire sauf que l'on utilisera le suffixe lowlat. La validation de
l'option CONFIG_LOLAT est galement dans la rubrique Processor type ana features.
13/37
Figure 10 Jaliaation ae CONFIGLOLAT
La deuxime option permet de dbrayer dynamiquement l'option en manipulant le
systme de fichier virtuel /proc, nous ne l'utiliserons pas pour l'instant.
Outils de mesure utiliss
Pour effectuer les mesure, nous utilisons principalement l'outil Latency_graph-0.2 disponible sur
http://www.linuxdj.com/latency-graph. Nous avons lgrement modifi le programme de test
testlatency.c afin d'utiliser des sorties graphiques PNG (la libgd ne supporte plus le GIF pour
des questions de licence) et de pouvoir spcifier le nom du fichier de sortie. Le principe de l'outil de
mesure est de dmarrer deux timers (30ms et 60 ms) et de mesurer la drive de ceux-ci par rapport
la priode attendue. Les mesures intressantes sont obtenues en stressant le systme, le plus souvent
par des accs disque rptitifs. Dans notre cas, nous avons utilis un petit script nomm
stress.sh bas sur la commande dd.
#!/bin/sh
while [ 1 ]
do
echo "Creating file..."
dd if=/dev/zero of=foo bs=1M count=50
sync
echo "Removing file..."
rm -f foo
sync
done
Ce script cre puis efface de manire rptitive des fichiers de 50 Mo. Une fois le
script lanc depuis une console, on pourra excuter le test en tapant dans une autre console :
testlatency -f 2.4.20_stock_stress.png
qui produit une courbe de rsultats au format PNG.
Nous utiliserons galement ponctuellement le programme realfeel2 inclus dans le
package amlat disponible sur le site du patch Low latency. Ce programme produit un historique des
temps de latence sur un nombre de points donn. On l'utilisera comme suit :
realfeel2 --samples 100000 2.4.20_stock_stress.hist
Mesures effectues
Le systme utilis est bas sur un AMD Duron 900 MHz, quip de 128 Mo de RAM,
d'un disque IDE rcent (mais bas de gamme !) et de la distribution Red Hat 7.3. Bien entendu, le
rsultat absolu de la mesure est trs dpendant de l'architecture matrielle du systme. Le but est ici
d'observer une tendance dans les rsultats.
Avant d'effectuer les tests, il convient de vrifier grce la commande hdparm si les
14/37
accs disque utilisent le DMA que nous avons valid cot noyau.

# hdparm /dev/hda
/dev/hda:
multcount = 16 (on)
I/O support = 0 (default 16-bit)
unmaskirq = 0 (off)
using_dma = 0 (off)
keepsettings = 0 (off)
nowerr = 0 (off)
readonly = 0 (off)
readahead = 8 (on)
geometry = 3648/255/63, sectors = 58615258, start = 0
busstate = 1 (on)
Nous pouvons positionner le DMA ainsi que deux autres paramtres d'optimisation
(cependant moins importants) avec la ligne de commande suivante:

# hdparm -d 1 -c 1 -u 1 /dev/hda
/dev/hda:
setting 32-bit I/O support flag to 1
setting unmaskirq to 1 (on)
setting using_dma to 1 (on)
I/O support = 1 (32-bit)
unmaskirq = 1 (on)
using_dma = 1 (on)
Les options utilises sont dcrites ci-dessous dans un extrait du man haparm:
+ -d
Disable/enable the "using_dma" flag for this drive.
+ -u
Get/set interrupt-unmask flag for the drive. A setting of 1 permits the driver to unmask other
interrupts during processing of a disk interrupt, which greatly improves Linux's
responsiveness and eliminates "serial port overrun" errors.
+ -c
Query/enable (E)IDE 32-bit I/O support. A numeric parameter can be used to enable/disable
32-bit I/O support
Noyau 2.4.20 standard
Nous effectuons tout d'abord une mesure sur un noyau 2.4.20 standard. Si le systme n'est pas
stress, nous obtenons logiquement le rsultat suivant.
15/37
Figure 11 Mesure sur un systme stanaara non charge
Par contre lorsque le systme est stress par le script stresssh on observe des irrgularits sur les
courbes (36 et 66 ms).
16/37
Figure 12 Mesure sur un systme stanaara stresse
Pour se convaincre de l'utilit du DMA, la courbe ci-dessous prsente le rsultat de la mesure
lorsque le DMA n'est pas valid par hdparm. Le rsultat se passe de commentaires !
17/37
Figure 13 Mesure sur un systme stanaara stresse sans DMA
Noyau 2.4.20 avec patch Preempt KerneI
Avec le patch preempt-kernel, nous obtenons la courbe suivante :
18/37
Figure 14 Mesure avec patch Preempt Kernel stresse
Le rsultat est trs bon malgr un petit "glitch" au milieu de la courbe. Si nous
utilisons le programme realfeel2 sur le mme systme, nous obtenons le fichier d'historique
suivant sur 100000 itrations :
0.0 99828
0.1 118
0.2 5
0.3 2
0.5 3
0.6 2
0.7 1
1.1 1
2.4 1
2.5 5
2.6 5
2.7 2
2.8 4
2.9 2
3.4 1
4.0 1
6.3 1
9.5 1
11.4 1
11.9 1
12.0 1
12.1 1
12.2 1
19/37
12.3 1
12.5 1
12.7 1
12.9 1
13.3 1
13.4 2
13.6 1
13.7 1
14.3 1
15.1 1
15.2 1
Soit une latence maximale de 15 ms mais avec trs peu de points suprieurs 1 ms.
Noyau 2.4.20 avec patch Low Latency
Avec ce patch appliqu, nous obtenons la courbe suivante :
Figure 15 Mesure avec patch Low Latency stresse
Le rsultat est parfait. Si nous utilisons le programme realfeel2 sur le mme
systme, nous obtenons le fichier d'historique suivant sur 100000 itrations :
20/37
0.0 99858
0.1 134
0.2 5
0.3 3
Soit une latence maximale de seulement 0.3 ms !
Test du programme square sur les noyaux patchs
Nous avons galement effectu une mesure l'oscilloscope lors de l'utilisation du
programme square dcrit prcdemment. Dans le cas du noyau 2.4.20 modifi par le patch
Preempt Kernel et subissant la mme charge que pour les autres mesures, nous obtenons la courbe
suivante, indiquant une latence maximale lgrement suprieure 200 s.
Figure 16 Execution ae square avec le patch Preempt Kernel
Dans le cas du patch Low Latency, nous obtenons un meilleur rsultat avec une latence
maximale d'environ 80 s.
21/37
Figure 17 Execution ae square avec le patch Low Latency
Conclusion
Le patch Low Latency semble tre plus efficace que Preempt Kernel, ce qui est
galement le rsultat obtenu par d'autres tudes cites dans la partie bibliographique. Ceci tant dit,
des tudes plus approfondies sur des cas rels permettront galement de valider la stabilit des
noyaux modifis s'ils sont soumis de fortes sollicitations pendant un grand intervalle de temps. Il
conviendra plus tard de tester la version intgre au noyau 2.6 lorsque celui-ci sera disponible soit
probablement pas avant la fin de l'anne 2003.
Le systme RTLinux
Principe
Les patch tests prcdemment permettent d'amliorer les temps de latence sur la
noyau mais le concept se rapproche plus d'une amlioration de la qualit de service que du temps
rel dur. Forts de cette conclusion des dveloppeurs on choisi une stratgie totalement diffrente.
Puisque le noyau LINUX n'est dfinitivement pas un noyau temps rel, la meilleure solution est de
la faire cohabiter avec un noyau auxiliaire bas sur un vrai ordonnanceur temps rel priorits fixes.
Les tches temps rel sont grs par ce noyau et le traitement des autres tche est dlgu au noyau
LINUX, lui-mme considr comme une tche de plus faible priorit (ou iale task) par le noyau
temps rel. Le schma ci-dessous dcrit l'architecture du systme double noyau. Les interruptions
matrielles sont captes par le noyau temps rel. Si l'interruption ne correspond pas une tche
temps rel, elle est traite par le noyau LINUX.
22/37
Figure 18 Systme aouble noyau
Historique, RTLinux et la GPL
Historiquement, le premier projet utilisant ce principe est RTLinux, projet initialement
open source issu des travaux de Victor Yodaiken et Michael Barabanov l'universit du nouveau
Mexique aux Etats Unis. RTLinux a depuis fait couler beaucoup d'encre dans la communaut open
source car Yodaiken et Barabanov ont depuis cr la socit FSMLabs (http://www.fsmlabs.com)
charge d'assurer le dveloppement et le support commercial de RTLinux qui est un produit
rsolument orient industrie. Le produit est dsormais diffus en version commerciale
(RTLinux/Pro) dont les sources ne sont pas publis (sauf aux clients) mais aussi sous GPL
(appele aussi RTLinux/Free) mais il est clair que FSMLabs ne fait quasiment plus voluer la
version GPL. De plus, l'espace rserv aux composants GPL sur le serveur FSMLabs se rduit de
plus en plus au point de ne plus trouver la documentation en ligne pour la dernire version (3.2) de
RTLinux/Free.
Le dcalage entre la version commerciale et la version GPL n'est pas la seule raison
de la grogne autour de RTLinux. Les fondateurs ont par contre dpos un brevet logiciel aux Etats
-Unis concernant l'utilisation du noyau auxiliaire avec le noyau LINUX, ce qui n'est pas vraiment
bien vu par la communaut, d'autant que le produit actuel a reu le support de nombreux
contributeurs l'poque o RTLinux tait uniquement un projet open source. La licence de
RTLinux/Free affranchit cependant l'utilisateur des contraintes du brevet mais les projets
doivent bien sr tre diffuss sous GPL. Le fait est que FSMLabs est quelque peu en porte faux
avec la GPL car de part la structure de RTLinux, les tches temps rel sont dveloppes dans
l'espace du noyau LINUX, royaume de la GPL. La diffusion de modules en binaire est tolre dans
le cas de pilotes de priphriques car ceux-ci sont assez peu intimes avec les structures du noyau
LINUX. Dans le cas d'un noyau temps rel auxiliaire, les conditions sont toutes autres et le cas
RTLinux n'a pas fini de faire couler de l'encre virtuelle sur le net.
23/37
Structure et installation
Le fait est que RTLinux est cependant un bon produit, assez largement utilis pour des
produits sensibles dans le domaine des tlcommunications ou des applications militaires. Le
systme est concis et bien document. L'interface de programmation est assez simple et permet de
dvelopper des tches temps rel concises. Nous insistons sur le fait que seules les tches temps rel
sont gres par le noyau auxiliaire, les autres tches sont gres par le noyau LINUX. Du fait que les
tches temps rel se situent dans l'espace noyau, RTLinux propose des systmes de communication
de type FIFO ou mmoire partage entre les tches temps rel et l'espace utilisateur dans lequel
s'excutent habituellement les applications.
La distribution RTLinux/Free est constitue de deux lments :
1. Un patch appliquer au noyau LINUX. Ceci implique donc que la distribution est lie une
version donne du noyau LINUX sur laquelle ce patch s'applique correctement . La version 3.2
de RTLinux/Free fournit des patchs pour les noyau 2.4.0, 2.4.4, 2.4.17, 2.4.18 et 2.4.19. Il est
cependant possible d'adapter le patch une autre version si l'on est un peu entran :)
2. Un ensemble de modules LINUX constituant le noyau temps rel auxiliaire.
La procdure d'installation est dcrite dans le fichier doc/Installation.txt de
l'archive de documentation en ligne rtldoc-3.1.tar.gz, qui n'est malheureusement plus
disponible pour la distribution 3.2. Les utilisateurs de cette dernire version (qui est trs proche de
la version 3.1) devront se contenter du rpertoire doc de l'archive des sources contenant des
fichier HOWTO associs aux distributions Red Hat 7.x et SuSE 8.0. Le principe de l'installation est
cependant assez simple :
1. La premire tape est l'extraction de l'archive des sources de RTLinux/Free dans le rpertoire
/usr/src afin de conduire la cration du rpertoire /usr/src/rtlinux
2. Dans ce rpertoire, on doit installer une version de noyau supporte par RTLinux (voir le
rpertoire patches de la distribution). Il est bien entendu FONDAMENTAL d'utiliser pour cela
une arborescence de source officielle (provenant de ftp.kernel.org ou l'un de ses miroirs) et NON
PAS une arborescence fournie par un diteur de distribution (sinon le patch ne s'appliquera pas
correctement).
3. Aprs application du patch adquat, il faut ensuite paramtrer le noyau en fonction de la
configuration matrielle, exactement comme on le ferait pour un noyau standard en utilisant une
commande de type make xconfig. Il est d'ailleurs possible de rcuprer le fichier .config
d'un noyau 2.4 fonctionnel car le patch RTLinux/Free ajoute uniquement le paramtre
CONFIG_RTLINUX qui est valid par dfaut pour les architectures x86 et PowerPC. Notez
qu'il est important de NE PAS valider le support APM (Aavancea Power Management) qui
perturbe le fonctionnement de RTLinux.
Lorsque le noyau est compil et install en ajoutant une nouvelle entre au chargeur LILO ou
GRUB, il faut valider son bon fonctionnement en effectuant un redmarrage sur ce nouveau
noyau.
4. La prochaine tape est la gnration des modules spcifiques RTLinux/Free, qui sont
conformes l'API des modules du noyau LINUX. Cette action est effectue par une squence
trs proche de celle utilise pour le noyau LINUX, soit :
# make xconfig
# make dep
# make
# make devices
# make install
24/37
Dans un premier temps, il est conseill d'utiliser les options par dfaut au niveau du make
xconfig.
5. On peut ensuite charger dynamiquement les modules en utilisant la commande rtlinux, soit :
# rtlinux start
Scheme: (-) not loaded, (+) loaded
(+) mbuff
(-) psc
(+) rtl_fifo
(+) rtl
(+) rtl_posixio
(+) rtl_sched
(+) rtl_time
Notez que l'on peut passer en paramtre le nom d'un module RTLinux temps rel excuter soit
par exemple :
# rtlinux start my_rt_module
Les programmes RTLinux tant des modules, le dmarrage d'un programme correspond au
chargement du module par la commande insmod, l'arrt du programme correspond au
dchargement en utilisant la commande rmmod ou bien rtlinux stop. Le chargement
des modules peut tre vrifi par la commande :
# rtlinux status
Scheme: (-) not loaded, (+) loaded
(+) mbuff
(-) psc
(+) rtl_fifo
(+) rtl
(+) rtl_posixio
(+) rtl_sched
(+) rtl_time
La distribution RTLinux/Free inclut quelques programmes d'exemple dont un classique
Hello horla dans le rpertoire /usr/src/rtlinux/examples.
Prsentation des bases de l'APl RTLinux au travers d'un exemple
L'API de programmation RTLinux est relativement simple utiliser car elle comporte
un relativement petit nombre de fonctions. Le point le plus important, au risque de se rpter, est la
ncessiter de programmer les modules temps rel dans l'espace du noyau et non dans l'espace
utilisateur. Cette contrainte est non ngligeable car elle a de fortes implications sur la facilit de
programmation (programmer dans l'espace du noyau ncessite une grande rigueur), les outils de
debug disponibles (assez peu en fait dans l'espace du noyau) mais aussi la conformit par rapport
la GPL.
Pour notre exemple appel rtsquare, nous allons reprendre le programme de gnration
de signal carr dcrit au dbut de l'article. Cet exemple avait mis en vidence la forte influence de la
charge du systme sur la mesure du rsultat effectue grce un oscilloscope.
Un programme RTLinux est conforme l'API des modules du noyau LINUX. Il inclut
donc en premier lieu une fonction init_module, appele lors du chargement du module et une
fonction cleanup_module appele lors du dchargement.
int init_module(void)
{
pthread_attr_t attr;
25/37
struct sched_param sched_param;
/* Priorit 1 */
pthread_attr_init (&attr);
sched_param.sched_priority = 1;
pthread_attr_setschedparam (&attr, &sched_param);
/* Cration du thread applicatif */
pthread_create (&thread, &attr, bit_toggle, (void *)0);
return 0;
}
La fonction init_module effectue ici les actions suivantes:
1. Positionnement du niveau de priorit de la tche, qui est ici fix 1.
2. Cration du threaa applicatif qui dans notre cas va piloter le port parallle du PC. Nous
remarquons que la cration du thread utilise la fonction pthread_create, conforme l'API
POSIX.
void cleanup_module(void)
{
pthread_delete_np (thread);
}
La fonction cleanup_module se limite la destruction du thread applicatif. Le
code du thread est dcrit ci-dessous, prcd par les dfinitions gnrales du programme.
#include <rtl_time.h>
#include <rtl_sched.h>
#include <asm/io.h>
/* Adresse du port parallle */
#define LPT 0x378
/* Priode de sollicitation de 50 ms */
int period=50000000;
/* Valeur envoye sur le port parallle */
int nibl=0x01;
/* Identifiant du thread applicatif */
pthread_t thread;
/* Corps du thread applicatif */
void * bit_toggle(void *t)
{
/* On programme un rveil de la tche toute les 50 ms */
pthread_make_periodic_np(thread, gethrtime(), period);
while (1){
/* Ecriture de la valeur sur le port // */
outb(nibl,LPT);
/* Calcul de la valeur suivante (ngation) */
nibl = ~nibl;
/* Attente du rveil */
pthread_wait_np();
26/37
}
}
La compilation du programme seffectue grce un fichier Makefile adapt
l'environnement RTLinux/Free. Dans ce fichier, nous considrons que notre exemple est install
avec les autres exemples RTLinux/Free dans un sous-rpertoire de
/usr/src/rtlinux/examples.
all: rtsquare.o
include ../../rtl.mk
rtsquare: rtsquare.c
$(CC) ${INCLUDE} -Wall -O2 -o rtsquare.c
clean:
rm -f *.o
Lorsque le fichier rtsquare.o est gnr, nous pouvons tester l'application en
utilisant la commande rtlinux start rtsquare.
Si nous testons cet exemple dans les conditions de charge du systme LINUX standard
du dbut de l'article, nous obtenons le rsultat ci-dessous l'oscilloscope. La mesure du /itter donne
la valeur de 25.6 s compars aux 17.6 ms du noyau LINUX standard, ce qui correspond environ
un rapport 1000.
Figure 19 Resultat au test rtsquare sous RTLinux
27/37
Les FlFO de communication
De part la structure de RTLinux (tches temps rel dans l'espace noyau et tches
classiques dans l'espace utilisateur), il est ncessaire de mettre en place un systme de
communication entre les deux lments de l'application. Le plus souvent, cette communication est
effectue grce des FIFO /dev/rtfX (X variant de 0 63) cres lors de l'installation par la
commande make devices. Cot modules noyau, la FIFO est manipule l'aide de fonctions
spciales comme rtf_create et associe une fonction de traitement (ou hanaler) appele lors
de la rception d'un caractre sur la FIFO.
Dans l'espace utilisateur, la FIFO est vue comme un fichier gnralis classique
(device) et peut donc tre exploite comme telle ce qui facilite grandement la mise au point des
programmes. Le petit module ci-dessous permet d'utiliser la FIFO /dev/rtf0 dans l'espace
noyau. Cot utilisateur, on crit sur la FIFO par une simple commande echo redirige sur le device.
#include <rtl.h>
#include <time.h>
#include <pthread.h>
#include <rtl_fifo.h>
pthread_t thread;
char c;
int my_fifo_handler (unsigned int fifo)
{
int err;
char c;
/* Lecture des caractres reus */
while ((err = rtf_get (0, &c, 1)) == 1) {
rtl_printf("my_fifo_handler: got %x\n", c);
pthread_wakeup_np (thread);
}
if (err != 0)
return -EINVAL;
else
return 0;
}
void * start_routine(void *arg)
{
struct sched_param p;
p . sched_priority = 1;
pthread_setschedparam (pthread_self(), SCHED_FIFO, &p);
/* Attente infinie */
while (1)
pthread_wait_np ();
return 0;
}
int init_module(void) {
int f;
/* Cration de la FIFO et de la fonction de traitement */
f = rtf_create (0, 100);
rtf_create_handler(0, &my_fifo_handler);

return pthread_create (&thread, NULL, start_routine, 0);
}
void cleanup_module(void) {
28/37
/* Dtruit la FIFO */
rtf_destroy(0);
pthread_delete_np (thread);
}
Le systme RTAl
Historique
Le projet RTAI (pour Real Time Application Interface) a pour origine le dpartement
d'ingnierie arospatiale (DIAPM) de l'Ecole polytechnique de Milan (Politecnico di Milano). Pour
des besoins internes, Paolo Montegazza du DIAPM entreprit de dvelopper un produit inspir de
RTLinux mais intgrant quelques amliorations et corrections concernant en particulier les modes
temps rel et la gestion des nombres flottants. Contrairement RTLinux, RTAI ne fut pas
dvelopp dans le but de crer un produit commercial mais surtout afin d'viter des cots de
licences sur des RTOS propritaires comme QNX, alors utilis au DIAPM.
Du fait de cette optique de dveloppement interne, l'architecture actuelle de la
distribution RTAI apparat comme plus complexe tant au niveau de la dfinition de l'API (syntaxe et
nombre d'appels) et de la position par rapport aux licences (GPL et LGPL). Il est clair aussi que
RTAI est rapidement apparu aux yeux des responsables du projet RTLinux (Yodaken et Barabanov)
comme un redoutable concurrent, sachant que RTLinux avait lui une vocation commerciale. Suite
la mise en place du brevet logiciel sur RTLinux, la position de RTAI est devenu quelque peu
inconfortable et jusqu' la refonte rcente de RTAI autour du micro-noyau ADEOS (pour remplacer
la couche initiale RTHAL), le brevet logiciel FSMlabs apparaissait comme une pe de
Damocles au dessus de RTAI.
Similitudes et diffrences avec RTLinux : LXRT
La structure de RTAI est proche de celle de RTLinux. De mme, les fonctionnalits du
type FIFO de communication ou mmoire partage sont galement disponibles avec RTAI.
Cependant, les dveloppeurs de RTAI ont rcemment fait un effort particulier sur une
extension appele LXRT (LinuX Real Time) permettant de dvelopper des tches temps rel dans
l'espace utilisateur et non plus dans l'espace noyau. Ce dernier point est extrmement intressant
tant au niveau de la licence (il n'y a plus d'embarras avec la GPL contrairement au cas de RTLinux)
que de la facilit de dveloppement car nous savons que dvelopper dans l'espace noyau est
relativement plus complexe.
Au niveau des performances, nous verrons dans les exemples que les rsultats par
rapport au mme programme dvelopp dans l'espace noyau sont trs honorables et ce bien que
LXRT soit encore en cours d'volution.
Structure et installation
La structure de RTAI tant proche de celle de RTLinux (noyau LINUX modifi co-
existant avec un ordonnanceur temps rel) la procdure d'installation est proche de cette de
RTLinux. Dans ce document, nous utiliserons la dernire version diffuse ce jour sur
http://www.rtai.org soit la 24.1.11. Lorsque l'archive est extraite (en gnral sur
/usr/src/rtai-24.1.11), la procdure d'installation est dcrite dans le fichier
README.INSTALL.
La principale diffrence est la contrainte concernant le compilateur gcc utiliser. Le
fichier GCC-WARNINGS indique que le compilateur conseill est le 2.95.3. Le compilateur 2.96
29/37
fourni avec la Red Hat 7.x nest pas utilisable. Les compilateurs gcc 3.x sont susceptibles de
marcher mais le rsultat n'est pas garanti. Si l'on a un compilateur non support, le mieux est donc
d'installer la version 2.95.3 sur un rpertoire alternatif. Dans notre cas (Red Hat 7.3) nous avons
install ce compilateur compil partir des sources GNU sur l'arborescence /usr/local.
1. Comme pour RTLinux, la premire tape consiste construire un noyau intgrant le patch RTAI
adapt. Le rpertoire patches de la distribution 24.1.11 contient des fichiers de patch pour le
dernier noyau LINUX stable ce jour, soit le 2.4.20. C'est ce moment l qu'il faut choisir entre
l'ancienne technologie RTHAL et la nouvelle technologie ADEOS. Notez que le choix n'a pas
d'influence sur l'API utilisable dans les applications RTAI, qui restent compatibles au niveau du
code source. Pour nos essais, nous avons utilis la nouvelle technologie ADEOS.
2. Avant de recompiler le noyau modifi, il convient de valider l'option adquate en fonction de la
technologie choisie dans le menu General Setup dans le cas de ADEOS ou Processor type ana
features pour RTHAL. Le patch effectue automatiquement la modification du champ
EXTRAVERSION du fichier Makefile du noyau LINUX. Ce champ ne DOIT PAS tre
modifi ensuite sous peine d'chec de la suite de l'installation.
3. Aprs compilation et installation du noyau, il convient de redmarrer le systme avec ce noyau
afin de vrifier son bon fonctionnement.
4. La compilation des modules RTAI passe par la configuration via la commande :
# make menuconfig
au niveau du rpertoire des sources.
5. Aprs validation des options par dfaut, on poursuit la compilation par les commandes :
# make dep; make; make install; make dev
Le systme est alors prt l'excution des exemples dans le rpertoire examples ou du
programme de mesure de latence dans le rpertoire latency_calibration.
Adaptation de l'exemple prcdent l'APl de RTAl
Dans le paragraphe concernant RTLinux, nous avons prsent le petit programme
rtsquare qui gnre un signal carr priodique sur le port parallle du PC. L'API de RTAI tant
quelque peu diffrente de celle de RTLinux, le programme demande quelques modifications. Les
lignes suivantes prsentent la version RTAI du programme rtsquare. La principale diffrence est
la moindre compatibilit avec la syntaxe POSIX, de ce fait, l'API RTAI apparat comme plus
spcifique que celle de RTLinux. Une API POSIX existe dans RTAI au niveau des tches noyau
mais celle-ci est incomplte et les efforts de dveloppement se portent aujourd'hui plus vers LXRT
que vers l'API noyau.
#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/io.h>
#include <rtai.h>
#include <rtai_sched.h>
#define RT_PRIORITY 0
#define RT_STACK_SIZE 1000
#define LPT 0x378
#define PERIOD 50000000 /* 50 ms = 50 x 1000000 ns */
int nibl=0x01;
static RT_TASK task;
30/37
static void bit_toggle(int t)
{
while (1){
outb(nibl,LPT);
nibl = ~nibl;
/* Attente du rveil */
rt_task_wait_period();
}
}
int init_module(void)
{
RTIME now, tick_period;
/* A commenter */
rt_set_oneshot_mode();
/* Cration de la tche */
if (rt_task_init(&task, bit_toggle, 0, RT_STACK_SIZE, RT_PRIORITY, 0, 0) < 0)
rt_printk ("init_module: rt_task_init error\n");
/* Dmarrage du timer en calculant tout d'abord la valeur de la priode en
codage interne RTAI (RTIME)
*/
tick_period = start_rt_timer(nano2count(PERIOD));
now = rt_get_time();

/* La tche devient priodique sur la valeur donne */
if (rt_task_make_periodic(&task, now, tick_period) < 0)
rt_printk("task_make_periodic error\n");
return 0;
}
void
cleanup_module(void)
{
stop_rt_timer();
rt_task_delete(&task);
}
Au niveau du fichier Makefile, la syntaxe est similaire celle de RTLinux :
CC=gcc
RTAISRC=/usr/src/rtai-24.1.11
KERNELSRC = /lib/modules/$(shell uname -r)/build
CFLAGS=-I$(RTAISRC)/include -I. -D__KERNEL__ -I$(KERNELSRC)/include -Wall
-Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-
frame-pointer -pipe -mpreferred-stack-boundary=2 -march=i686 -DMODULE
all: rtsquare_rtai.o
clean:
rm -f *.o *~
Le chargement du module s'effectue grce au script rt_modprobe disponible dans
dans le rpertoire scripts de la distribution RTAI, soit :
# rt_modprobe rtsquare_rtai.o
Pour arrter la tche temps rel, il suffit de dcharger le module grce la
commande rmmod ou bien l'aide du script rt_rmmod. Le rsultat de la mesure de latence
31/37
effectue grce l'oscilloscope est donn sur la figure suivante. La valeur maximale de latence se
situe aux environ de 25 s ce qui est quivalent au rsultat obtenu avec RTLinux.
Figure 20 Resultat au test rtsquare sous RTAI (moae noyau)
Adaptation de l'exemple LXRT
Un document d'introduction la programmation sous LXRT est disponible sur
http://people.mech.kuleuven.ac.be/~psoetens/portingtolxrt.html. Le principe de LXRT est de
conserver les appels de l'API RTAI noyau tout en effectuant bien sr quelques adaptations vu que
nous avons maintenant affaire un programme en mode utilisateur et non plus un module noyau. Le
code source de la version LXRT du programme rtsquare est dcrit ci-dessous. La structure du
programme est trs comprhensible. Un point important est l'utilisation de la fonction
rt_make_hard_real_time permettant de placer la tche sous le contrle de l'ordonnanceur
temps rel.
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sched.h>
#include <sys/mman.h>
#include <math.h>
#include <signal.h>
#include <sys/io.h>
#define KEEP_STATIC_INLINE
#include <rtai_lxrt_user.h>
#include <rtai_lxrt.h>
32/37
#define LPT 0x378
#define PERIOD 50000000 /* 50 ms = 50 x 1000000 ns */
int nibl=0x01;
static RT_TASK *task;
static void got_sigint ()
{
rt_make_soft_real_time();
rt_task_delete (task);
exit (0);
}
main (int ac, char **av)
{
RTIME now, tick_period;
unsigned long task_name;
/* Signal dinterruption du programme */
signal (SIGINT, got_sigint);
rt_set_oneshot_mode();
task_name = nam2num("RTSQUARE_LXRT");
mlockall(MCL_CURRENT | MCL_FUTURE);
if (!(task = rt_task_init(task_name, 1, 0, 0))) {
rt_printk ("init_module: rt_task_init error\n");
exit (1);
}

tick_period = start_rt_timer(nano2count(PERIOD));
printf ("tick_period = %ld\n",(long)tick_period);
now = rt_get_time();
if (rt_task_make_periodic(task, now, tick_period)) {
printf("task_make_periodic error\n");
exit (1);
}
/* L'appel ioperm est ncessaire puisque nous sommmes en
mode utilisateur */
rt_allow_nonroot_hrt();
if (ioperm (LPT, 1, 1) < 0) {
perror("ioperm()");
exit (1);
}
/* Passage en mode temps rel */
rt_make_hard_real_time();
while (1){
outb(nibl,LPT);
nibl = ~nibl;
rt_task_wait_period();
}
}
Le fichier Makefile utilis est dcrit ci-dessous :
CC=gcc
LIBLXRT=../../lxrt/lib/liblxrt.a
CFLAGS= -g -I /usr/src/rtai-24.1.11/include -I. -I/usr/src/linux-2.4/include
-Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common
33/37
-fomit-frame-pointer -pipe -mpreferred-stack-boundary=2 -march=i686
all: rtsquare_lxrt.o
$(CC) -o rtsquare_lxrt rtsquare_lxrt.o $(LIBLXRT)
clean:
rm -f *.o *~
L'excution du programme ncessite le chargement des modules principaux de RTAI
ainsi que du module LXRT. Le lancement du programme peut donc tre effectu par un script
similaire celui dcrit ci-dessous :
#!/bin/sh
insmod rtai
insmod rtai_sched
insmod rtai_lxrt_old
./rtsquare_lxrt
Vu que le programme est excut dans l'espace utilisateur, il pourra tre interrompu par
un signal classique, comme un SIGINT obtenu par la combinaison de touches Ctrl-C. Le rsultat de
la mesure l'oscilloscope donne le rsultat suivant. Le temps de latence maximal constat est de 55
s ce qui est moins bon qu'en mode noyau mais trs acceptable pour un bon nombre d'applications.
Figure 21 Resultat au test rtsquarelxrt sous LXRT (moae utilisateur)
Cas particulier des microcontrleurs (Clinux)
La distribution Clinux a dj fait le cadre d'une prsentation dtaille dans Linux
Magazine de fvrier 2002. Clinux est aujourd'hui l'une des distributions les plus utilises comme
Linux embarqu.
34/37
Clinux (prononcer you see Linux ) est l'acronyme de Micro Controller Linux
Le projet Clinux lanc en janvier 1998 est un portage de Linux version 2.0.x originellement sur
des processeurs ne possdant d'unit de gestion mmoire MMU (Memory Management nit).
Cest en fait la base un portage de Linux sur microcontrleur Motorola 68328 et drivs que l'on
trouvait par exemple dans les ordinateurs de poche (Hanahela) PalmPilot.
Outre la famille Motorola 683xx, il existe maintenant des portages Clinux pour processeurs
Motorola ColdFire, i960 d'Intel, ARM7TDMI et depuis peu NIOS d'Altera.
Clinux bas sur le noyau Linux 2.4.x est maintenant oprationnel.
Cartes cibles pour Clinux
PIateforme origineIIe : Ie kit Csimm
Les responsables du projet Clinux ont propos originellement une plateforme
matrielle des fins de tests : le kit Csimm. Ce kit comprend un module qui se prsente sous la
forme d'une barrette SIMM 30 broches. Le module Csimm se compose de :
+ Un microcontrleur DragonBall EZ (68EZ328) bas sur un cur Motorola 68000 16 MHz. Il
intgre un contrleur de DRAM, un port srie (interface RS.232), une interface SPI, un
contrleur LCD (rsolution QVGA), une sortie Timer et une sortie PWM.
+ Jusqu 18 E/S parallles.
+ Une horloge Temps Rel calendrier.
+ De la mmoire dynamique DRAM de 8 Mo.
+ De la mmoire FLASH de 2 Mo.
+ Une interface Ethernet IEEE 802.3 10BaseT.
Le module Csimm est commercialis par Arcturus Networks Inc sous forme dun kit
de dveloppement comprenant le module Csimm, un carte dassemblage / dveloppement (kit
Cgardener), le CD de dveloppement, lalimentation au prix de 495 USD
(https://shop.arcturusnetworks.com/ucsimm.dragonball.ez.shtml). A des fins d'enseignement, il
existe le kit Cacademix correspondant au kit prcdent avec un manuel de TP utilis par des
universits amricaines et vendu 295 USD (https://shop.arcturusnetworks.com/ucacademix.shtml).
Figure 22. Moaule Csimm
PIateformes drives
La socit Arcturus Networks Inc propose aussi d'autres kits plus performants. On
peut citer :
35/37
+ Le kit Cdimm base d'un microcontrleur DragonBall VZ (68VZ328) 33 MHz
(https://shop.arcturusnetworks.com/ucdimm.dragonball.vz.shtml).
+ Le kit Cdimm base d'un microcontrleur ColdFire 5272
(https://shop.arcturusnetworks.com/coldfire5272.shtml).
+ Le kit ARM7TDMI base du processeur ATMEL AT91 ARM7TDMI
(https://shop.arcturusnetworks.com/arm7tdmi.development.kit.shtml).
Autres pIateformes
Clinux peut aussi tre mis en oeuvre sur des cartes (d'valuation) base de processeur ColdFire.
On peut citer les cartes suivantes :
+ Les cartes Arnewsh SBC5206 et SBC5307.
+ Les cartes Motorola MCF5206eLITE, MCF5206C3, MCF5307C3, MCF5407C3 (1000 euros
environ), MCF5272C3, MCF5282C3.
+ Les cartes Lineo eLIA 5307, NETtel et SecureEdge.
+ La carte Netburner CFV2-40.
Extension temps rel pour Clinux
L'extension temps rel de Clinux ne fait malheureusement pas partie intgrante du
projet pour des raisons videntes de maintenance : prise en compte de la version du noyau LINUX
avec la prise en compte de la version de l'extension temps rel (RTAI, RTLinux) avec la prise en
compte de la version du portage de Clinux pour un processeur cible particulier !
Quelques portages existent pour des versions de Clinux et processeurs cibles bien prcis :
1. Un portage de RTLinux sous Clinux existe avec les restrictions suivantes : noyau 2.0.38 et
processeur Motorola DragonBall. Le patch pourra tre rcupr l'adresse suivante :
https://courseware.vt.edu/users/binoy/4984/project1.html.
2. Un portage de RTAI sous Clinux existe aussi dans le cas particulier suivant : processeur
Motorola Coldfire 5272. Le portage a t intgr dans la distribution officielle RTAI 24.1.11
dans la branche arch/m68knommu de la distribution RTAI. La procdure de compilation est
dcrite dans le fichier READMEm68knommu. L'extension temps rel RTAI doit tre mise en
oeuvre sur une carte Motorola MCF5272C3. Des informations supplmentaires donnes par B.
Kuhn responsable du portage sont disponibles l'adresse
http://www.uclinux.org/~bkuhn/Platforms/Coldfire/tarifa/20020227/README.
Des mesures de temps de latence dans ce cas trs particulier ne sont pas disponibles car
le kit Csimm des auteurs est tomb en panne pendant les tests :( Les rsultats sont priori
similaires ceux trouvs avec RTAI sur PC.
Conclusions et perspectives
Les exemples prsents dans cet article indiquent clairement que LINUX occupe une
place de plus en plus importante dans le monde des systmes d'exploitation temps rel.
LINUX n'est pas fondamentalement un systme d'exploitation temps rel car trop
gnraliste. Par application de diffrents patchs (low latency preempt kernel), il est possible d'avoir
un systme LINUX temps rel mou. Il est possible d'avoir un systme LINUX temps dur en utilisant
36/37
les extensions temps rel RTLinux et RTAI. Le choix final se fera en fonction des contraintes
temporelles imposes par le processus contrler depuis LINUX en prenant aussi en compte la
complexit de mise en oeuvre dans chaque cas (configuration du noyau, criture de l'application
temps rel).
Nous nous sommes attachs la description des technologies les plus utilises (et galement
disponibles en open source) mais d'autres systmes plus ou moins propritaires s'appuient galement
sur LINUX pour offrir des fonctionnalits temps rel. Nous pouvons citer par exemple le systme
Jaluna 2, rcemment prsent par l'ex-quipe de Chorus Systmes et qui prsente une architecture
extrieurement similaire celle de RTLinux ou RTAI (noyau LINUX associ un noyau auxiliaire
temps rel).
Du cot de RTAI, nous pensons que l'volution vers ADEOS et LXRT permettra
rapidement (d'ici quelques mois) de faciliter la migration d'un environnement propritaire vers un
systme entirement open source sans rencontrer les soucis techniques et lgaux du dveloppement
industriel dans l'espace du noyau LINUX.
Remerciements
Philippe Gerum (rpm@xenomai.org) contributeur majeur des nouvelles versions de
RTAI intgrant la technologie ADEOS. Architecte nettoyeur de la future distribution RTAI :)
Bibliographie
+ Site web de Patrice Kadionik sur
http://www.enseirb.fr/~kadionik
+ Ouvrage Linux Embarque par Pierre Ficheux aux ditions Eyrolles
+ Low-Latency 24x with ALSA HOhTO par Paul Winkler sur
http://www.djcj.org/LAU/guide/Low_latency-Mini-HOWTO.php3
+ Linux scheauler latency par Clark Williams sur
http://www.linuxdevices.com/articles/AT8906594941.html
+ Realfeel Test of the Preemptible Kernel Patch par Andrew Webber sur
http://www.linuxjournal.com/article.php?sid=6405
+ Can Linux be a real-time operating system ? par Kevin Morgan sur
http://www.linuxdevices.com/articles/AT5152980814.html
+ Real-Time ana Embeaaea Guiae par H. Bruyninckx.
http://people.mech.kuleuven.ac.be/~bruyninc/rthowto
+ Site de FSMlabs/RTLinux.
http://www.fsmlabs.com
+ Site du projet RTAI.
http://www.rtai.org
+ Site du projet ADEOS.
http://www.nongnu.org/adeos
+ Le temps rel par William Blachier sur
http://www-ensimag.imag.fr/cours/Systeme/docs.etudiants.html
37/37

Vous aimerez peut-être aussi