Le Système Embarqué Temps Réel Vxworks
Le Système Embarqué Temps Réel Vxworks
Le Système Embarqué Temps Réel Vxworks
VxWorks
Frank Singhoff
Bureau C-203
Université de Brest, France
LISyC/EA 3883
singhoff@univ-brest.fr
a
footprint ou empreinte mémoire.
UE systèmes temps réel, Université de Brest – Page 3/87
Exécutif : architecture et services (1)
• Caractérisques de l’exécutif :
Environnement
de développement
Utilitaires
Agence Agence
tâches temps
Noyau
Agence Agence
mémoire E/S
Application
Exécutif (ex : VxWorks)
Noyau de l’exécutif
Couche matérielle
Carte
Contrôleur série Processeur
• Critères de performances :
Latence sur interruption.
Latence sur commutation de contexte/tâche.
Latence sur préemption.
Sémaphore "shuffle" (temps écoulé entre la libération d’un
sémaphore et la réactivation d’une tâche bloquée sur celui-ci).
Temps de réponse pour chaque service (appel système, fonctions de
bibliothèque).
etc.
UE systèmes temps réel, Université de Brest – Page 7/87
Exécutif : architecture et services (5)
. TCP/IP sur
Ethernet , liens
séries, etc
. TFTP, NFS
Environnement de
développement Machine cible
GDB RGDB
rsh
OS temps réel
Disque NFS
25
21.42
19.7
20
Pourcentage
15
12.84
10.19
10
6.64 5.96
5
4.69
3.89
2.86 2.41 2.3 1.95
1.83 1.72 1.61
uc E
X
III
S
S
-L X
S9
+
T
S
Ch ux
s
ire
X
ks
sC
O
re
us
RT
O
sN
RT T
N
X
O
or
in
ta
nx
us
pS
ut
R
le
Q
w
rié
V
W
A
or
Ly
do
iR
do
vx
op
N
in
in
pr
W
W
n
tio
lu
So
• Produits "open-source" :
• Problèmes :
Portabilité difficile car il existe beaucoup de différences entre les
UNIX.
Tout n’est pas (et ne peut pas) être normalisé.
Divergence dans l’implantation des services POSIX (ex : threads sur
Linux).
Architecture de la norme.
• Exemple de systèmes POSIX : Lynx/OS, VxWorks, Solaris, Linux,
QNX, etc .. (presque tous les systèmes temps réel).
Nom Signification
_POSIX_PRIORITY_SCHEDULING Ordonnancement
à priorité fixe
_POSIX_REALTIME_SIGNALS Signaux temps réel
_POSIX_ASYNCHRONOUS_IO E/S asynchrones
_POSIX_TIMERS Chien de garde
_POSIX_SEMAPHORES Sémaphores
etc ...
• Conséquence : que veut dire "être conforme POSIX 1003.1b" ... pas
grand chose puisque la partie obligatoire n’est pas suffisante pour
construire des applications temps réel.
int a=100;
int a=100;
sleep(1);
printf("a = %d\n",a);
}
= gain de temps
= gain de "place" mémoire, de ressources
= gain de prédictiblité (cf. contraintes systèmes embarqués
temps réel).
• Exemple de bibliothèques :
taskLib. Gestion des tâches.
sockLib. Sockets BSD.
f tpLib. Client FTP.
Ethernet
• Commandes du chargeur :
3. Chargement de l’exécutif :
[VxWorks Boot]: @
->
UE systèmes temps réel, Université de Brest – Page 28/87
Compilation croisée (1)
• La chaîne de compilation sur l’hôte (ex : Sun) est constituée de :
cpp68k. Préprocesseur.
cc68k. Compilateur C.
ld68k. Editeur de liens (édition incrémentale uniquement).
nm68k. Liste les symboles d’un objet.
as68k. Assembleur 68000.
ar68k et ranlib68k. Outils de construction de bibliothèques.
• Les binaires produits par ces commandes ne sont pas exécutables sur
Sun mais sur la cible (Motorola 68000 + VME).
helloWorld() {
int id=taskIdSelf();
printf("Nom = %s ; Id = %x\n",taskName(id),id);
}
• Compilation sur l’hôte (pas d’édition de liens) :
kermorvan$cc68k -g -c hello.c -DCPU=MC68030
• Services offerts :
Chargement de code et de données. Edition des liens.
Mise au point (niveau assembleur).
Consultation et modification des ressources VxWorks
(ex : tâches).
Gestion de symbole des modules.
Services classiques offerts par un shell : variables,
redirection E/S, appel de fonction, historique, etc.
stack: base 0x3a8460 end 0x3a5d50 size 9000 high 4092 margin 4908
• Scénario d’exécution :
-> ld < var.o
-> affiche()
var = 100
-> affiche()
var = 300
UE systèmes temps réel, Université de Brest – Page 36/87
Le shell VxWorks (6)
• Principales commandes du shell VxWorks :
sp, td, ts, tr, repeat. Opérations sur les tâches : création,
suppression, etc.
Ethernet
• Sur l’hôte :
1. Lancement de gdb :
kermorvan$vxgdb&
2. Connexion à la cible :
(vxgdb)target vxworks vxkermorvan
3. Lancement d’une tâche :
run helloWorld
4. Commandes vxgdb : break, list, step, next, display, printf, etc.
Ordonnancement et tâches.
Synchronisation : les sémaphores.
Communication : pipe et file de messages.
Manipulation du temps.
Gestion des interruptions.
Drivers et vxWorks.
a
Highest Priority First.
UE systèmes temps réel, Université de Brest – Page 42/87
Ordonnancement (2)
pended ready delayed
suspended
a
Task Control Block
init() {
tid=taskSpawn("fils1",101,0,5000,
(FUNCPTR)coucou,0,0,0,0,0,0,0,0,0,0);
tid=taskSpawn("fils2",101,0,5000,
(FUNCPTR)coucou,0,0,0,0,0,0,0,0,0,0);
}
• Exécution :
-> ld < pere.o
-> sp init
task spawned: id = 0x3a59a0, name = fils1
task spawned: id = 0x3a59a1, name = fils2
Tache fils1
Tache fils2
permet d’utiliser un
timeout infini.
semDelete(sem) Destruction du sémaphore.
void tache() {
while(1) {
semTake(msm,WAIT_FOREVER);
/* utiliser la section critique */
semGive(msm);
}
}
void init() {
msm = semMCreate(SEM_INVERSION_SAFE | SEM_Q_PRIORITY);
tid = taskSpawn("mut1",101,0,5000,(FUNCPTR)tache,
0,0,0,0,0,0,0,0,0,0);
tid = taskSpawn("mut2",101,0,5000,(FUNCPTR)tache,
0,0,0,0,0,0,0,0,0,0);
}
UE systèmes temps réel, Université de Brest – Page 50/87
Synchronisation : les sémaphores (5)
• Les sémaphores à compteur : sémaphore
mémorisant le nombre d’opérations effectuées.
init() {
imprimantes=semCCreate(0,NB_IMPRIMANTES);
}
init() {
int i;
section_critique=semMCreate(0);
for(i=0;i<NB_TACHES;i++) {
sempriv[i]=semCCreate(0,0);
taches[i]=FAIT_QQ_CHOSE;
taskSpawn(...);
}
}
UE systèmes temps réel, Université de Brest – Page 54/87
Synchronisation : les sémaphores (9)
/* Allouer les ressources pour la tache "id" */
void allouer(int id)
{
semTake(section_critique,WAIT_FOREVER);
if(ressources<0)
{
taches[id]=ATTENDRE;
}
else {
taches[id]=UTILISER;
ressources--;
semGive(sempriv[id]);
}
semGive(section_critique);
semTake(sempriv[id],WAIT_FOREVER);
}
semTake(section_critique,WAIT_FOREVER);
taches[id]=FAIRE_QQ_CHOSE;
ressources++;
for(i=0;i<NB_TACHES;i++)
if( (ressources>0) && (taches[i]==ATTENDRE) )
{
ressources--;
taches[i]=UTILISER;
semGive(sempriv[i]);
}
semGive(section_critique);
}
UE systèmes temps réel, Université de Brest – Page 56/87
Communication (1)
• Outils de communication offerts :
Tâche A Tâche B
void init() {
msg = msgQCreate(20,500,MSG_Q_FIFO);
tid=taskSpawn("cons",101,0,10000,
(FUNCPTR)consommateur, 0,0,0,0,0,0,0,0,0,0);
tid=taskSpawn("prod",101,0,10000,
(FUNCPTR)producteur, 0,0,0,0,0,0,0,0,0,0);
}
void producteur() {
char buff [100];
while(1) {
sprintf(buff,"Il est %d tics\n",tickGet());
msgQSend(msg,buff,sizeof(buff),
WAIT_FOREVER,MSG_PRI_NORMAL);
}
}
UE systèmes temps réel, Université de Brest – Page 60/87
Communication (5)
void consommateur()
{
char buff [100];
while(1)
{
strcpy(buff,"");
msgQReceive(msg,(char *) buff,sizeof(buff),
WAIT_FOREVER);
printf("message = %s\n",buff);
}
}
• Scénario d’exécution :
-> sp init
message = Il est 32262 tics
message = Il est 33002 tics
...
trop_tard() {
go=-1;
}
...
wd=wdCreate();
wdStart(wd,echeance,(FUNCPTR)trop_tard,0);
while(go>0) {
printf("Je Bosse .....\n");
taskDelay(10);
}
printf("Debloquee par interruption : echeance ratee\n");
• Scénario d’exécution :
-> sp echeance
Je Bosse .....
Je Bosse .....
Debloquee par interruption : echeance ratee
UE systèmes temps réel, Université de Brest – Page 65/87
Gestion des interruptions (1)
Prise en compte
interruption
Traitement
interruption
Tâche x Tâche x
Sauvegarde Restauration
contexte
contexte
• Caractéristiques :
Modification possible du vecteur d’interruption.
Une seule pile pour toutes les interruptions (attention aux interruptions imbriquées).
Pas de co-gestion tâches/interruptions : contexte interruption différent =⇒ services
de l’exécutif pas tous disponibles dans une interruption (ex : opérations bloquantes,
E/S, etc).
Partie dépendante du BSP.
Appels systèmes
Noyau
Table de drivers
create remove open close read write ioctl
1
2
3
4
• Installation du driver :
int demoDrvMajor=-1;
STATUS demoDrv () {
demoDrvMajor = iosDrvInstall (demoOpen, (FUNCPTR)NULL, demoOpen,
demoClose, demoRead, demoWrite, demoIoctl);
}
• Descripteur de périphérique :
typedef struct {
DEV_HDR devHdr;
char data[MAX_SIZE];
} demo_dev;
void read_file() {
char buff [100];
int nb=read(fd,&buff,20);
printf(" read ; size = %d ; text = %s\n",nb,buff);
}
(5) (4)
(1)
Majeur valeur
0
1
Table de descripteurs de fichiers 2
3 2 xxdev
4
5
(2) (3)
Table de drivers
(1)
Majeur valeur
0
1
2
Table des descripteurs de fichiers 3 2 xxdev
4
5
(2)
(3)
Table de drivers
• Généralités :
Notion de systèmes embarqués temps réel.
Différences entre un exécutif et un système d’exploitation.
Modularité, architecture hôte/cible, portabilité, BSP.
Etat du marché.
• VxWorks :
Abtractions : tâches, adressage virtuel unique, outils de
communication et de synchronisation.
Utilisation de l’environnement de compilation et d’exécution.
API de l’exécutif (ordonnancement, outils de communication et de
synchronisation).
UE systèmes temps réel, Université de Brest – Page 84/87
Sommaire
1. Généralités sur les systèmes embarqués temps réel.
2. Le système VxWorks.
3. Résumé.
4. Références.
[DEM 94] I. Demeure and J. Farhat. « Systèmes de processus légers : concepts et exemples
». Technique et Science Informatiques, 13(6):765–795, décembre 1994.
[DEN 66] B. Dennis and E. C. Van Horn. « Programming Semantics for Multiprogrammed
Computations ». Communications of the ACM, 9(3):143–155, March 1966.
[GAL 95] B. O. Gallmeister. POSIX 4 : Programming for the Real World . O’Reilly and
Associates, January 1995.
[GHO 94] K. Ghosh, B. Mukherjee, and K. Schwan. « A survey of Real Time Operating
Systems ». Technical Report, College of Computig. Georgia Institute of Technology.
Report GIT-CC-93/18, February 1994.
[J. 93] J. M. Rifflet. La programmation sous UNIX. Addison-Wesley, 3rd edition, 1993.
[RIV 97] Wind River. VxWorks : programmer’s guide. Wind River System, March 1997.
[TIM 00] M. Timmerman. « RTOS Market survey : preliminary result ». Dedicated System
Magazine, (1):6–8, January 2000.
[VAH 96] U. Vahalia. UNIX Internals : the new frontiers. Prentice Hall, 1996.