Vous êtes sur la page 1sur 13

STR

AN2012

Premiers pas

Les informations d'identification sont:


utilisateur: root passwd: mot de vide

L'image bnficie galement du soutien du rseau en utilisant 'NAT'. Cela signifie que les machines virtuelles peuvent communiquer entre eux et le rseau extrieur. Cependant seules les machines du rseau local, et non partir du rseau extrieur peuvent se connecter la machine virtuelle.

Accs distance

de trouver l'adresse ip de l'OS en cours d'excution de type VMware:


/sbin/ifconfig

les deux prochains services sont lancs: 1. serveur ssh: ssh root @ <ip-address> Avec ce serveur, vous pouvez vous connecter un shell distant sur le systme d'exploitation s'excutant dans vmware. Dans ce shell, vous pouvez diter les fichiers avec les diteurs de texte tels que joe / nano / vim. 2. serveur samba: Ce serveur exporte le systme de fichiers racine que networkshare pour les fentres. Sur les ordinateurs Linux et Macintosh, vous pouvez accder ce partage en allant l'emplacement rseau:
smb://<ip-address>/root user: root passwd :<empty password>

Sous Windows, vous pouvez accder ce partage en tapant ce qui suit dans la barre d'adresse de l'explorateur:
\\<ip-address>\root user: root passwd :<empty password>

Fixer le temps et la date

Vous pouvez demander l'heure et la date de la machine virtuelle avec la commande suivante:
date

STR

AN2012

Lorsque vous faites une pause de la machine virtuelle, il peut arriver que, lorsque la machine est reprise beaucoup plus tard, les rglages de la date et l'heure ne sont pas coorectes. Une solution rapide. Vous pouvez synchroniser l'heure facilement avec un serveur de temps avec la commande suivante:

Rdate -s time.nist.gov ou ntpdate time.nist.gov note: pour ntpdate fonctionne, vous devez d'abord faire ce qui suit apt-get update apt-get install ntpdate tzconfig # set timezone to Europe\Paris America\NewYork

instead of

Modifier la langue

Langue par dfaut:

dpkg-reconfigure locales

Modification du clavier:

dpkg-reconfigure console-data

Remote access

Pour trouver ladresse IP :


/sbin/ifconfig

Utiliser le service ssh pour accede au serveur avec des clients comme putty Serveur samba 1. Linux :
smb://<ip-address>/root user: root passwd :<empty password>

2. windows :
\\<ip-address>\root user: root passwd :<empty password>

Des fichiers sources pour les TP sont sous le repertoire /root/labs Utiliser putty pour une meilleure utilisation

STR

AN2012

Linux Temps Rel (Xenomai) TP n 1: Les Bases de la Real-Time Linux

Real-Time Linux Introduction


Linux est un systme d'exploitation libre de type Unix qui fonctionne sur une varit de platesformes, y compris les PC. De nombreuses distributions Linux telles que Red Hat, Debian et Mandrake regrouper le systme d'exploitation Linux avec des outils, des logiciels de productivit, jeux, etc

L'ordonnanceur de Linux, comme celle de d'autres OS tels que Windows ou MacOS, est conu pour la meilleure rponse moyenne, de sorte qu'il se sent rapide et interactif, mme lors de l'excution de nombreux programmes. o Toutefois, elle ne garantit pas que toute tche particulire soit toujours excute dans un dlai optimal. Une tche peut tre suspendu pour un temps arbitrairement long. o Lordonnancement quitable des tches est des garanties par les systmes d'exploitation temps rel (RTOS), tels que QNX, VxWorks ou LynxOS. RTOS sont gnralement utiliss pour le contrle ou les applications de communications, et non pas pour l'informatique usage gnral. Linux a t adapt pour supporter le temps rel. De nombreuses versions de RT Linux sont disponibles, libre ou commercial. Trois couramment disponibles en libre accs RT versions de Linux sont o RTLinux, dvelopp par New Mexico Tech et maintenu par Wind River Systems . o RTAI, l'interface d'application en temps rel (RTAI), dvelopp par l'Universit polytechnique de Milan et disponible https://www.rtai.org/~~V . o Xenomai, une spin-off de RTAI Linux. Alors que RTAI est ax sur les plus bas temps de latence est techniquement possible, Xenomai considre galement une extensibilit propre aux RTOS, la portabilit et la maintenabilit comme des objectifs trs importants. Il est disponible www.xenomai.org . Ces systmes Linux RT sont des correctifs apports au code source du noyau Linux de base. Les instructions pour construire un systme Linux RT partir d'un code de la source de Linux sont fournies avec ces systmes Linux RT. En bref, il s'agit de mettre en place le systme de base Linux, obtenir le dernier le code source du noyau Linux partir www.kernel.org , patcher le code source du noyau, et la compilation du noyau patch.

Objectifs
Ce qui suit sont les principaux objectifs de cet exercice:

Pour apprendre comment Xenomai fonctionne et de construire une tche temps rel Xenomai.

STR

AN2012

Comment fonctionne RT Linux travail?


L'ide gnrale de la RT Linux, c'est que d'un petit noyau temps rel, sexcute sous Linux, ce qui signifie que le noyau en temps rel a une priorit plus leve que le noyau Linux. En temps rel les tches sont excutes par le noyau temps-rel, et celle de Linux normales sont autorises s'excuter quand les tches temps rel ne sont pas excuts. Linux peut tre considr comme la tche d'inactivit de l'ordonnanceur temps rel. Comme le noyau temps rel a une priorit plus leve, un processus normal de Linux est prempt quand une tche temps rel devient prt fonctionner et la tche temps rel est excut immdiatement.

Comment est le noyau temps rel a une priorit plus leve que le noyau Linux?
Fondamentalement, un systme d'exploitation est entran par interruptions, ce qui peut tre considr comme des battements de cur d'un ordinateur:

Tous les programmes en cours d'excution dans un systme d'exploitation sont superviser par un ordonnanceur qui leurs alloue des quantums du temps CPU. Un programme en cours d'excution peut bloquer ou volontaire abandonner la CPU. Dans ce cas lordonnanceur est inform l'aide d'une interruption logicielle (appel systme). Le matriel peut gnrer des interruptions pour interrompre le fonctionnement normal du systme d'exploitation pour une manipulation rapide du matriel.

RT Linux utilise le flux d'interruptions pour donner le noyau temps rel une priorit plus leve que le noyau Linux:

Quand une interruption arrive, elle est d'abord donne au noyau temps rel. Les interruptions destines lOS classique sont stockes et elles ne sont envoyes que si lRTOS termine ses tches. En premier lieu, le noyau temps rel capable d'excuter ses tches en temps rel entranes par ces interruptions. Ce n'est que lorsque le noyau en temps rel ne fonctionne pas, les interruptions qui ont t stockes sont passes sur le noyau Linux. En deuxime lieu, Linux peut ordonnancer ses propres processus entrans par ces interruptions.

Par consquent, quand un programme normal Linux s'excute et une interruption arrive :

il est d'abord trait par un gestionnaire d'interruption dfinie par le noyau temps rel; le code dans le gestionnaire d'interruption rveille une tche temps rel; immdiatement aprs le gestionnaire d'interruption, l'ordonnanceur temps rel est appel; l'ordonnanceur temps rel observe qu'une autre tche temps rel est prte sexcuter, il met le noyau Linux attente, et se rveille la tche temps rel. Ainsi, pour le noyau temps rel et le noyau Linux cohabitent sur une seule machine d'une manire spciale de passer des interruptions entre noyau temps rel et le noyau Linux est ncessaire. Chaque distribution de Linux RT implmente ce mcanisme sa manire propre. Xenomai utilise un pipeline d'interruption de lAdeos projet. 4

STR

AN2012

RT Linux Tches ne sont pas des programmes Linux

Une tche temps rel peut tre excute dans l'espace noyau l'aide d'un module du noyau, mais aussi elle peut galement tre excute dans l'espace utilisateur l'aide d'un programme C. Lexcution dans l'espace utilisateur au lieu de dans l'espace noyau donne un peu de surcharge supplmentaire, mais avec les avantages suivants: o Un bug dans un module du noyau peut faire planter tout le systme, mais d'un bug dans un programme de l'espace utilisateur ne peut faire planter le programme. o Dans un modle noyau, on ne peut utiliser les API temps rel et les API limites du noyau. Mais dans un programme temps rel de l'espace utilisateur temps rel peut utiliser l'ensemble de Linux API. Cependant lors de l'utilisation des API Linux dans l'espace utilisateur, le programme ne peut pas tre gr par l'ordonnanceur temps rel (HARD en temps rel), mais doit tre gr par l'ordonnanceur de Linux ( SOFT en temps rel).

Xenomai

Le projet Xenomai a t lanc en Aot 2001. Xenomai est bas sur un noyau abstrait RTOS, utilisable pour construire tout type de interfaces temps rel, sur un noyau qui exporte un ensemble de RTOS gnrique services. Xenomai permet d'excuter en temps rel des threads soit strictement dans l'espace noyau, ou dans l'espace d'adressage d'un processus Linux. Une tche temps rel dans l'espace utilisateur bnfice de la protection de la mmoire, mais elle est ordonnance par Xenomai directement, et non plus par le noyau Linux. Le temps de latence d'ordonnancement le plus lent des cas de ce type de tche est toujours proximit des limites matrielles et prvisibles, car Xenomai n'est pas li la synchronisation avec l'activit du noyau Linux dans un tel contexte, et peut anticiper toute activit rgulire Linux sans retard. Par consquent, lenvironnement prfrable d'excution pour les applications Xenomai est l'espace utilisateur.

Xenomai API

Dans le tp, nous allons excuter des tches temps rel dans l'espace utilisateur, car travailler avec eux est plus facile. Les API Natives Xenomai sont flexibles et bien documentes. Les caractristiques les plus importantes des API Xenomai sont: o Indpendance du contexte Les API Natives Xenomai fournissent les mmes services temps rel d'une manire transparente pour l'application, indpendamment de leur mode d'excution qui est le mode utilisateur ou le mode noyau.
o

Topologie transparente Les objets Xenomai (p. ex. Un smaphore, tches, etc ..) sont toujours joignables, mme lorsque l'emplacement de l'objet est un autre espace.

STR

AN2012 cette fin, chaque catgorie de service de lAPI natif Xenomai dfinit un type de descripteur uniforme pour reprsenter les objets qu'elle gre. Par exemple, une tche sera toujours reprsent par un descripteur de RT_TASK, une file de messages par un descripteur RT_QUEUE, et un smaphore par un RT_ SEM Descripteur, indpendamment de l'espace d'excution partir de laquelle ils sont utiliss. Xenomai utilise un registre unifi, l'index de chaque descripteur d'objet sous un nom symbolique donn par l'utilisateur. En faisant cela, Xenomai vous permet de rcuprer n'importe quel descripteur associ un objet enregistr dans n'importe quel endroit de votre demande.

Voir Native API Tour pour plus d'informations sur les API native Xenomai.

C : le langage de programmation

Linux est crit dans le langage de programmation C, de mme pour Xenomai. C est le langage prfr pour l'criture des programmes RT Linux. Autres langage (par exemple, C + +) peuvent tre utiliss. Les programmes C sont compils en programmes excutables complet. En C, le point d'entr d'un programme est une fonction appele main () . Chaque tche en temps rel est associe une fonction C qui est appele lorsque la tche est planifie pour s'excuter.

Cration d'une tche


Lorsque vous crez une tche temps rel Xenomai, la structure RT_TASK est utilis comme descripteur de rfrer pour cette tche. Une structure de donnes RT_TASK est utilis pour contenir toutes les informations sur une tche: o la fonction excuter par la tche temps rel, o argument, o la taille de la pile allou pour ses variables, o sa priorit, o si elle utilise des calculs en virgule flottante, o et un gestionnaire de signal" qui sera appele lorsque la tche devient actif. La tche est cre en appelant
int rt_task_create (RT_TASK *task, const char *name, int stack_size, int priority, int mode) o o

o o o

task est un pointeur vers une structure de type RT_TASK qui doit avoir t dclare avant et dont la structure est remplie. name est une chane de caractres ASCII pour le nom symbolique de la tche. Ce nom symbolique, peut tre utilis pour rcuprer la structure des tches n'importe o dans le code en appelant rt_task_bind() la fonction. stack_size est la taille de la pile pour tre utilis par la nouvelle tche. priority est la priorit de la tche. La priorit la plus leve est de 99, tandis que la plus basse est de 1. mode est un ensemble de flag qui affectent la tche:

STR

AN2012 T_ FPU permet la tche d'utiliser le FPU (Floating Point Unit) chaque fois disponible sur la plate-forme. Ce drapeau est forc pour les tches de l'espace utilisateur. T_SUSP provoque la tche de dmarrer en mode suspendu. Dans un tel cas, le thread doit tre explicitement repris la rt_task_resume(). T_ CPU (CPUID) prcise la nouvelle tche excuter avec lid cpuid. Lidentifiants varie de 0 RTHAL_NR_CPUS - 1 (inclus). T_JOINABLE (espace utilisateur seulement) permet une autre tche d'attendre la fin de la nouvelle tche. Cela implique que rt_task_ join () est appel pour cette tche pour librer les ressources alloues de l'espace utilisateur.

Dmarrage d'une tche

Une tche peut tre dmarre en appelant:


int rt_task_start (RT_TASK *task, void(*task_func)(void *arg), void *arg) o o o

task est un pointeur sur une structure de type RT_TASK qui doit tre dj initialis par un appel rt_task_create () . task_function est la fonction de la tche excuter. arg est un argument pointeur de type void donne la fonction de tche.

Si vous avez dj dfini T_SUSP comme un flag de mode rt_task_ create () , la tche sera lance dans un mode suspendu. Dans ce cas, vous devez explicitement de reprendre la tche avec rt_task_resume (). Sinon, la tche temps rel est prt excuter immdiatement.

Bonjour tout le monde


Le code C ex01.c illustre la cration et le dbut d'une tche demo qui crit un message.
#include <stdio.h> #include <signal.h> #include <unistd.h> #include <sys/mman.h>

#include <native/task.h> #include <native/timer.h>

#include <rtdk.h> RT_TASK demo_task;

STR

AN2012

void demo(void *arg) { RT_TASK *curtask; RT_TASK_INFO curtaskinfo;

// hello world rt_printf("Hello World!\n");

// inquire current task curtask=rt_task_self(); rt_task_inquire(curtask,&curtaskinfo); // print task name rt_printf("Task name : %s \n", curtaskinfo.name); } int main(int argc, char* argv[]) { char str[10] ; // Perform auto-init of rt_print buffers if the task doesn't do so rt_print_auto_init(1);

// Lock memory : avoid memory swapping for this program mlockall(MCL_CURRENT|MCL_FUTURE);

rt_printf("start task\n");

/*

STR
* Arguments: &task, * * * * */ sprintf(str,"hello"); rt_task_create(&demo_task, str, 0, 50, 0); name, stack size (0=default), priority, mode (FPU, start suspended, ...)

AN2012

/* * Arguments: &task, * * */ rt_task_start(&demo_task, &demo, 0); } task function, function argument

Dans le programme ci-dessus, la mmoire est verrouille en appelant


mlockall ( MCL _CURRENT | MCL _FUTURE);

de sorte qu'il ne peut pas tre chang sur le disque. Prvenir change est indispensable quand les performances dun RTOS doivent tre atteintes. Par consquent, Xenomai gnre un avertissement lorsque cela est oubli quand son API est appele.

La bibliothque rdtk impression temps rel


Notez que dans le code ci-dessus, nous avons utilis rt_ printf () au lieu de la commande printf (). Nous n'avons pas utilis printf (), car il utilise les appels systme Linux et par consquent ralentit terriblement le thread temps rel. Au lieu de cela, nous utilisons rt_printf partir de la bibliothque impression temps rel rdtk. elle est intgre dans la partie espace utilisateur Xenomai, mais elle ne dpend pas des services Xenomai. Elle utilise uniquement lAPI POSIX. Le librtprint API ressemble beaucoup printf:

rt_vfprintf 9

STR

AN2012 rt_vprintf rt_fprintf rt_printf

Pour dmarrer le thread de sortie non-RT il faut appeler le code suivant au dbut d'un programme Xenomai:
rt_print_auto_ init (1);

Cette auto-init initialise le buffer de rt_print et de dmarrer le thread de sortie non-RT.

Compiler un programme de Xenomai


Pour compiler le programme ci-dessus, il faut d'abord obtenir les CFLAGS et LDFLAGS en excutant
> xeno-config --xeno-cflags

et
> xeno-config --xeno-ldflags

Pour dfinir ces flags, utilisez


> export CFLAGS=`xeno-config --xeno-cflags`

et
> export LDFLAGS=`xeno-config --xeno-ldflags`

Enfin, compiler le programme ex01.c avec la bibliothque native implmentant lAPI Xenomai et la bibliothque 'rtdk' print library
> gcc $CFLAGS $LDFLAGS -lnative -lrtdk ex01.c -o ex01

Par dfaut 'ex01' est li avec les bibliothques dynamiques dans /usr/xenomai/lib. Nous devons d'abord indiquer Linux o les trouver laide de la variable d'environnement LD_LIBRARY_PATH :
> export LD_LIBRARY_PATH=/usr/xenomai/lib

Puis excuter le programme:


>. / Ex01

Exercices
10

STR

AN2012

Exercice 1a.
Compilez et excutez le programme ex01.c pour se familiariser avec la manipulation des tches Xenomai. Tout d'abord, essayer un build manuel en compilant avec les commandes ci-dessus. Ensuite, essayez un Makefile (en utilisant les commandes "make" et ". / ex01").

Exercice 1b.
Introduire une erreur en commentant la cession la tche en cours comme suit:
/ / curtask = rt_task_self ();

Enregistrez le programme qui en rsulte que ex01b.c Construire et excuter ce programme, observez le rsultat. Ensuite introduire une valeur de retour pour le rt_task_inquire appeler et afficher le code.
err = rt_task_start(&task,&task_body,NULL); if (err) { fprintf(stderr,"failed to start task, code %d\n",err); return 0; }

Construire et excuter la nouvelle version du programme.

11

STR

AN2012

Linux Temps Rel (Xenomai) TP n 2: Ordonnancement et communication inter-processus (IPC)

1 Mesure de la performance dun systme temps rel : la gigue


Un systme temps rel doit tre temporellement dterministe. La gigue (jitter en anglais) est la fluctuation de ce temps de raction. Idalement, celle-ci est nulle. Dans la pratique, un systme temps rel performant prsente une gigue dont la valeur est faible (<100 us) et surtout borne (pour le terminisme). On se propose de mesurer la gigue sur la priode dune tche dfinie priodique sous Linux (temps rel mou) et Xenomai (temps rel dur). 1.1 Gigue sous Xenomai 1. Dans le rpertoire gigue_xenomai, tudier le code du fichier periodic.c avec la documentation POSIX skin/Clocks et Thread management. 2. Compiler avec make et excuter le programme avec ./periodic. Quelle est la rsolution de lhorloge MONOTONIC dans Xenomai ? On notera que le temps systme est renvoy sous la forme de 2 champs dans une structure timespec : tv_sec pour la partie en secondes et tv_nsec< 10 9 pour la partie en nanosecondes du temps courant. 3. Constater que la tache (thread) priodique na pas le temps de sexcuter. Pourquoi, sachant que le fin du main implique la fermeture du processus ? 4. Dcommenter alors la ligne \\pthread_join(). Rechercher lutilit de cette fonction. Pourquoi lexcution du programme ne se finit alors jamais ? Utiliser la combinaison de touche ctrl-c (envoie du signal SIG INT la tche) pour demander au systme lINTerruption/fermeture du programme. 5. Commenter la ligne mlockall(...); dans le main. Recompiler avec make et excuter. Est-il cohrent que Xenomai contrairement Linux refuse lexcution sans linstruction mlockall ? 6. On veut mesurer prcisment la borne infrieure (avance maximale > 0) et la borne suprieure (retard maximale > 0) de la gigue : lcart entre la priode de la tche et la priode demande. Utiliser les 2 variables max_advance et max_delay pour stocker lcart maximal rencontr au cours de lexcution. On affichera chaque priode de lexcution la valeur actuelle de ces 2 variables. 7. Tester et stresser le systme pour observer lvolution de la gigue : ouvrir Firefox, passer de linterface graphqiue (ctl-alt-F7) `a la console (ctr-alt-F2), ... Conclure sur la gigue de Xenomai. 1.2 Gigue sous Linux 1. Dans le rpertoire gigue_linux, ouvrir le fichier periodic.c. Constater quil est trs semblable au fichier prcdent. Excuter et noter la rsolution de lhorloge MONOTONIC sous Linux. 2. Ajouter dans le code le calcul de la gigue. Excuter et stresser le systme dexploitation.
12

STR

AN2012

3. Entre le noyau Linux utilis (temps rel mou et faible latence) et le Noyau Xenomai (temps rel dur) lequel est le plus dterministe temporellement ?

2 IPC : Synchronisation entre tches


Lexcution parallle de plusieurs tches (en temps partag, ou simultan si plusieurs CPUs) pose des problmes de synchronisation pour laccs concurrent un priphrique ou un emplacement mmoire. 2.1 Analyse dun problme daccs concurrent 1. Dans le rpertoire synchro_frigo1, examiner, compiler et excuter le programme pthread_race. Quel problme survient avec le partage de la variable commune refrigerator ? Est-ce d a la prsence de 2 tches ? Commenter la cration dune des deux tches pour vrification. 2. Lerreur survient de manire sporadique. On cherche lenchanement spcifique de commutation de tches la source du problme par lajout : (a) dinstructions du type fprintf(stderr,"1"); , fprintf(stderr,"2"); , ... avant et aprs chaque instruction contenue dans les boucles while(1) pour suivre via laffichage la squence dexcution des instructions des 2 tches. (b) dune instruction fprintf(stderr,"\n"); comme dernire instruction de la boucle while(1) pour la lisibilit. (c) de linstruction exit(0); aprs laffichage de Dad : damned who stole my candy ! pour quitter le programme ds lapparition de lerreur. On inclura <stdlib.h> si ncessaire. 3. Excuter et interprter la squence dexcutions responsable du problme daccs concurrent.

13