Linux temps reel et embarqu´ e´ -...
Transcript of Linux temps reel et embarqu´ e´ -...
Systemes temps reel et Systemes embarquesLinux temps reel et embarque
Loıc Cuvillon
Ecole Nationale Superieure de Physique de Strasbourg
24 fevrier 2014
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 1 / 103
Plan
Plan
1 Linux Operating SystemOperating SystemLinux KernelLinux Driver Model
2 Le temps reelTemps reel mou/durOrdonnancement preemptif
3 Linux XenomaiLinux n’est pas temps reelArchitecture de Xenomai
4 Programmation Muli-taches (Posix/Xenomai)Les threadsIPC : mutex et semaphoreIPC : messages et memoire partageeSignauxLe temps
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 2 / 103
Bibliographie
Bibliographie
Le noyau Linux
Understanding the Linux kernel, 3eme Edition, D.P. Bovet et M. Cesati,O’Reilly.Linux Kernel Development, 2eme Edition, Robert Love, Novell Press.Linux Device Drivers, Jonathan Corbet, Alessandro Rubini, and GregKroah-Hartman,O’Reilly
Le temps reel :
Real-time concepts for embedded systems, Q. Li, CMP Books.Xenomai documentation
Documents de cours et Annales :
http ://eavr.u-strasbg.fr/wiki/index.php/ENSPS 3A et master ISTI
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 3 / 103
Linux Operating System
Plan
1 Linux Operating SystemOperating SystemLinux KernelLinux Driver Model
2 Le temps reelTemps reel mou/durOrdonnancement preemptif
3 Linux XenomaiLinux n’est pas temps reelArchitecture de Xenomai
4 Programmation Muli-taches (Posix/Xenomai)Les threadsIPC : mutex et semaphoreIPC : messages et memoire partageeSignauxLe temps
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 4 / 103
Linux Operating System Operating System
Operating System
Operating system
a collection of software that provideservices and abstraction of thehardware to multiple user programs
enable multi-tasking, multi-user
share CPU, memory,... for processes
enable inter-processes communicationHardware
Operating System
User Application
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 5 / 103
Linux Operating System Operating System
Operating System Features
2. Memory
− memory allocation
− virtual memory
Management
Drivers
1. ProcessManagement
− process creation/
CPU time−sharing
− scheduling/
destruction
Device System
3. File and
− open / close
− read / write
Keyboard Mouse ScreenHard−driveCPU
6. System Call Handling
GCC Internet Browser Shell
libc
system calls
management
− Timers / Alarms
− System Time
5. Time
Hardware abstraction
OS
/ker
nel
Sp
ace
Hardware
User Space
OS
Communication
4. Inter−Process
− Message queues
/ Shared memory
Networking− Socket/
− Synchronization
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 6 / 103
Linux Operating System Operating System
Process scheduling
scheduler(odonnanceur) select the process to run at one time
CPU time-sharing for multi-tasking
3 states for a process : ready, running, blocked
vlc
gedit
−read()
−sleep()
−sem_wait()
− ...
ssh gcc bash xterm
CPU timeline
CPU
Ready Tasks Pool Blocked Tasks Pool
Running Task
blocking function
return of the
Scheduler :periodically select
the task to run
If call to a blocking function:
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 7 / 103
Linux Operating System Operating System
Scheduling
Ordonnancement disponible sous Linux
SCHED OTHER : ordonnanceur equitable (default)
augmentation de la priorite des taches qui ont eu peu de temps CPU niveaude ”nice” pour favoriser des taches
SCHED FIFO : ordonnanceur TR a priorite fixe (need to be root user)
taches utilisant cet ordonnanceur sont prioritaires sur les tachesSCHED OTHERsi priorite identique la premiere dans la file est entierement executee
SCHED RR : equivalent a SCHED FIFO
mais une tache interrompue est remise en bout de sa file de priorite
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 8 / 103
Linux Operating System Operating System
Linux Process/Task scheduling
Running Task
CPU
The Rule: Task with highest level run first.
99 98 2 1...
T3
T4 T5
RT Tasks (SCHED_FIFO/RR) (SCHED_OTHER)
Priority level
T1
0
T7
T6
T9
T8
T2
scheduler
Ready RT Tasks Pool
Inside Priority level 0 only,
tasks have a nice level.
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 9 / 103
Linux Operating System Operating System
POSIX system calls
ONLY way to ask the OS a service :open file sys_open, write on screen sys_write, memory allocation..
each OS syscall has its corresponding function in the libc :open(), write()
call notification to the OS through interruption (INT 0X80)
%eax Name Linux Source %ebx %ecx %edx
1 sys exit kernel/exit.c int
2 sys fork kernel/process.c struct pt regs
4 sys write fs/read write.c unsigned int const char * size t
5 sys open fs/open.c const char * int int
11 sys execve kernel/process.c struct pt regs
15 sys chmod fs/open.c const char * mode t
23 sys setuid kernel/sys.c uid t
...
37 sys kill kernel/signal.c int int
39 sys mkdir fs/namei.c const char * int
78 sys gettimeofday kernel/time.c struct timeval * struct timezone *
...
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 10 / 103
Linux Operating System Operating System
System call
The “Hello World !”
.data
msg: .ascii "Hello world!\n"
len = . - msg # taille du message->len
.text
.global _start
_start:
movl $len,%edx # argument 3: taille du message
movl $msg,%ecx # argument 2: pointeur sur le message
movl $1,%ebx # argument 1: descripteur de fichier (stdout)
movl $4,%eax # numero de l’appel systeme (4=sys_write)
int $0x80 # INT 80h
movl $0,%ebx # argument 1: code de sortie
movl $1,%eax # numero de l’appel systeme (1=sys_exit)
int $0x80 # INT 80h
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 11 / 103
Linux Operating System Operating System
System call
The “Hello World !”as hello.S -o hello.o
ls hello.o -o hello
strace ./hello :strace enable to track system call and signals of the process
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 12 / 103
Linux Operating System Operating System
System Call
EAX 5
EBX @filename
ECX 1
IR INT 0x80
int fd=
open(filename,
O_RDONLY);
1
libc
fopen(filename,
FILE *F=
"w"
return fd
User Space
ISR Ox80
−call syscall function
−retrieve syscall number
−rise CPU privilege
sys_open
−retrieve parameters
−check parameters
−retrieve process userID
−browse file system
−return file descriptor *fd* number via EAX
−check file permission
−lower CPU privilege
OS (Kernel) Space
user process
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 13 / 103
Linux Operating System Linux Kernel
Linux Kernel
Linux Kernel
the Kernel :software providing all OS functionality
kernel monolithic, 1 binary file
but parts of kernel can be unload/load :the modules
written in C, open-source
version 0.01 in 1991 by Linus Torvald
Process scheduling
Process communication
Memory management
File Systems
Network stack
Syscalls
DriversModule 1
Module 2
Module 3
Linux Kernel
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 14 / 103
Linux Operating System Linux Kernel
Kernel compilation
$> cp linux−3.8/arch/x86/boot.bzimage /boot
5. Kernel installation on PC plateform
make installor $> update−grub (update bootloader (amorçage))
linux−3.8.tar.gz
1. Download Kernel source from kernel.org in /usr/src
2. Kernel configuration in linux−3.8/ folder
$> make menuconfig
3. Compilation of kernel and modules
$> make
4. Module installation
$> make modules_install
Menu to select kernel core features,optionnal features as static code or module
Create compress kernel image (bzimage) and module objects *.ko
Create /lib/modules/3.8.0 and copy *.ko in it
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 15 / 103
Linux Operating System Linux Kernel
Kernel compilation
Kernel configuration
save and load in the .config file
features can be set has [] not include , [*] include in kernel imageor [M] compiled as a module
correct configuration not easy(base .config files available at www.kernel-seeds.org)
Modules
kernel object (*.ko) can be load/unload on demand
used for drivers, file system support, optional features
avoid to compile again the kernel if one driver missing
useful for development-debug
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 16 / 103
Linux Operating System Linux Kernel
Module Manipulation
vga_fb
Linux Kernel
1. list of loaded modules
2. load/unload modules
> rmmod vga_fb
soundcore
soundcore
vga_fb
bluetooth
> lsmod
> insmod /lib/.../bluetooth.ko
Exercise : unload and load the Ethernet card driver
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 17 / 103
Linux Operating System Linux Kernel
Kernel Module Programming
in Kernel Programming
in kernel programming → C language
only kernel API (printk, kalloc) → no libc (user-space) : no printf, fopen
dynamic linking with Kernel procedure at insertion of module
User SpaceUser Space
libc
User API
library function call
system call
Kernel function call
Kernel Task
time
libc
Kernel API
Kernel Space
time
Kernel Space
User task
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 18 / 103
Linux Operating System Linux Kernel
Kernel Module Programming
API function : printk()
print message in kernel ring buffer (in RAM since kernel can not fopen)
availability of printk() in kernel can be checked in /proc/kallsyms
otherwise error message : Undefined symbol at loading
printk("hello!");
[43.0] ACPI: error[52.6] usb−2: new dev[54.3] hello!
root@pc: dmesg
To visualize ring buffer in terminal:
RAM memory
[43.0] ACPI: error
[52.6] usb−2: new dev
[54.3] hello!3.
printk("hello!");
1.1.> insmod ./hello.ko
2. Dynamic Linking
at insertion
3. Execution printk
drivers
...
register_c
kalloc:
printk:
2.
Linux Kernel
kernel procedure:
...IPC
Scheduler
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 19 / 103
Linux Operating System Linux Kernel
Module programming
no main() function
one called at insertion : init_module() or module_init(*func)
one called at removal : cleanup_module() or module_exit(*func)
other functions have to be called through the 2 previous ones
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
int init_module (void)
{ printk("Hello world!\n"); return 0;
}
void cleanup_module(void)
{ printk("Bye! \n");}
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 20 / 103
Linux Operating System Linux Kernel
Module compilation
Module Compilation
Kernel source tree is needed (kernel headers and .config)
for hello.c module, this makefile is used and then command make :
obj-M := hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
Exercise : compilation and test of the previous hello.c module
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 21 / 103
Linux Operating System Linux Driver Model
Device drivers
Device files
each device accessed by a specialfile called ’device file’ in /dev
→ open, read, write syscalls can beused to access devices
device file associated with a driver
read Mouse device
open(/dev/input/mice)and read it
or cat /dev/input/mice
Hw
Dev
ices
User Application
system call
/dev/cdrom
Kern
el Sp
ace
Virtual file system
User S
pace
/dev/mice /dev/sda
driver A driver B driver C
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 22 / 103
Linux Operating System Linux Driver Model
Device drivers
Inside the driver
write one function for each fileoperation :
fops={
.open=device_open,
.write=device_write,
.read=device_read
};
int device_open()
{...}
copy_from_user() : to copyin the kernel data from a userside write()
copy_to_user() : to copykernel data to the user side
read (fd, )write(fd, ) close(fd)fd=open("
.openfunction
.writefunction
.readfunction
.releasefunction
Hardware device
User Application
/dev/newdriver
driver functions
Virtual file system
Kern
el
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 23 / 103
Linux Operating System Linux Driver Model
Device Files
Create a device filemknod name device_type major minor
Exemple : mknod /dev/newdriver c 60 0
the major number is the unique ID of the associated kernel driver.(numbers list in kernel /Documentation/devices.txt)
crw− r−− −−− 1 root root 13, 63 janv 23 19:42 /dev/input/mice
group’s member rights
owner rights (r=read,w=write,x=execute)
> ls −l /dev/input/mice
Device type:
c, for character device (data transmitted one byte at a time)
b, for block device (hard disks, data transmitted one block of data at a time)
users groupowner
other users rights
Minor number: to identify devices using same drivers
Major number: ID of associated driver
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 24 / 103
Linux Operating System Linux Driver Model
Char Device driver
Exemple : char device driver with .open operation
#include <linux/kernel.h><linux/module.h><linux/fs.h><asm/uaccess.h><asm/io.h>
static int device_open(struct inode *, struct file *);
static int Major=60;
static struct file_operations fops = {
.open = device_open
};
static int device_open(struct inode *inode, struct file *file)
{
printk("open\n");
return 0;
}
int init_module(void)
{ int Res;
Res = register_chrdev(Major, "newdriver", &fops); /*enregistre le pilote*/
return 0; }
void cleanup_module(void)
{ unregister_chrdev(Major, "newdriver"); }
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 25 / 103
Linux Operating System Linux Driver Model
Char device driver
Char device driverregister_chrdev(Major, "newdriver", &fops) :to register a major number for the driver and its file operation.
driver linked to device files with the same major number
Exercise :
create a special device file with a major number 60.
give all users rights to read/write on the device file :chmod o+rx device name
load previous driver
test opening with a small C program or with the shell command :echo -n 1 > device name
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 26 / 103
Linux Operating System Linux Driver Model
Char device driver
addition of .write operation to the previous driver
char my_data[1];
ssize_t device_write(struct file *filep,const char *buff,size_t count,
loff_t *offp );
static struct file_operations fops = {
.write = device_write,
.open = device_open
};
ssize_t device_write(struct file *filep,const char *buff,size_t count,
loff_t *offp )
{
/*function to copy user space buffer to kernel space*/
if ( copy_from_user(my_data,buff,1) != 0 )
{ printk( "Userspace -> kernel copy failed!\n" );
return 0; }
printk("int: %i",my_data[0]);
return 1;
}
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 27 / 103
Linux Operating System Linux Driver Model
Char device driver
Exercise :
Modify the previous driver to light on the PS2 Keyboard LEDs accordingto the value of the character written on its device file.
ioperm not needed anymore (run in kernel) and non-root user can writeon the device
Code Reminder : to change the LEDS states
outb(0xED,0x60); /*send L(ED) change cmd on input*/
while (inb(0x64)&0x2)); /*wait for keyboard input empty*/
outb( ?? ,0x60); /*send value ?? of LED to light*/
/*state of one LEDS: 1 of the 3 least significant bits*/
/*1=LED on, 0=LED off*/
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 28 / 103
Le temps reel
Plan
1 Linux Operating SystemOperating SystemLinux KernelLinux Driver Model
2 Le temps reelTemps reel mou/durOrdonnancement preemptif
3 Linux XenomaiLinux n’est pas temps reelArchitecture de Xenomai
4 Programmation Muli-taches (Posix/Xenomai)Les threadsIPC : mutex et semaphoreIPC : messages et memoire partageeSignauxLe temps
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 29 / 103
Le temps reel
Systeme temps reel
Systeme temps reel
Def :systeme (materiel et logiciel) qui satisfait aux contraintesfonctionnelles et temporelles qui lui sont imposees.
Temps de reponse d’un systeme :
temps entre l’apparition d’un vecteur d’entree et l’apparition du vecteurde sortie associe.
SystèmeS1
S0E0
E1
E2
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 30 / 103
Le temps reel Temps reel mou/dur
Systeme temps reel mou (soft real-time)
la majorite des systemes informatiques sont temps reel ”mou” :
un lecteur mp3
lecteur video (variation possible du framerate : fps)
Systemes Temps reel mou
Def : systeme devant satisfaire des echeances temporelles mais avec undegre de flexibilite, tolerance sur l’echeance.
une echeance non satisfaite :
pas de destruction du systemea une penalite relative au retard sur l’echeance
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 31 / 103
Le temps reel Temps reel mou/dur
Systeme temps reel dur (hard real-time)
Systeme temps reel dur
Def : systeme devant respecter des echeances avec une tolerance nulle.
utilite nulle des resultats obtenus apres echeance.
penalite elevee : panne complete du systeme + danger pour l’integritephysique du systeme ou des etres humains.
la critere entre un systeme temps reel dur et mou est la penalite en casde non-respect de l’echeance.
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 32 / 103
Le temps reel Temps reel mou/dur
Systeme temps reel dur (hard real-time)
Majoritairement des taches periodiques
Tache de regulation et d’asservissement d’un systeme physique.Tout retard destablise l’asservissement.(Exemple : regulation de l’altitude en mer des misiles rasants Exocet)
Tache de supervision
Applications du temps reel dur
aeronautique/spatial, automobile (ABS, Airbag. . . )
systemes militaires, medicaux (IRM)
process industriel (centrales nucleaires, robotique (evitons lesbutees !),. . . )
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 33 / 103
Le temps reel Ordonnancement preemptif
Problematique du temps reel
Simple : si 1 tache periodique
Pas de systeme d’exploitation
1 µ-controleur avec 1 tache (code) execute a chaque interruption d’unehorloge
temps reel si : Temps execution < Periode de la tache
Example : ABS, 1978
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 34 / 103
Le temps reel Ordonnancement preemptif
Problematique du temps reel
Complexe : multitude de taches de periodes differentes
taches de supervision, d’archivage, de l’interface graphique,d’asservissement...
→ Probleme de concurrence pour l’acces au CPU, la memoire...
→ Politique d’ordonnancement necessaire pour assurer les echeances destaches
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 35 / 103
Le temps reel Ordonnancement preemptif
OS temps reel
Caracteristiques
une politique d’ordonnancement ”temps reel”Resoudre la concurrence des taches pour le CPU
un temps de reponse (latence) assez court pour l’application visee
Usage
n’assure pas le respect des contraintes temps reel d’un programmequelconque !(exemple : inversion de priorite avec pathfinder (NASA))
mais donne les primitives pour y parvenirsi conception et timings valides par experience ou simulation.
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 36 / 103
Le temps reel Ordonnancement preemptif
Ordonnancement
Ordonnancement
appel a l’ordonnanceur (scheduler)→ choix du process a executer parmi les processus prets
En exécution
BloquéPrêt
Ordonnanceur Appel à une
fonction bloquante
Retour de la fonction
bloquante
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 37 / 103
Le temps reel Ordonnancement preemptif
Ordonnancement preemptif
Objectif de l’ordonnanceur temps reel
faisabilite : assurer l’ordonnancement des taches et leurs echeances
implementable
le plus utilise : ordonnanceur preemptif a priorite fixe
Ordonnanceur preemptif a priorite fixe
preemption : capacite a interrompre une tache au profit d’une autre
priorite fixe : chaque tache a une priorite d’execution invariante
regle : execution de la tache de plus haute priorite non-bloquee achaque appel a l’ordonnanceur
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 38 / 103
Le temps reel Ordonnancement preemptif
Ordonnancement preemptif a priorite fixe
Ordonnancement RM (rate-monotonic)
etudie dans les annees 70 (Liu&Leyland) et etendu par la suite
generalisation des ordonnanceurs preemptifs a priorite fixe
hypotheses :
taches periodiques et independantes uniquementpriorite P de la tache inverse a sa periode T
A i+T iA i
Ci
t
tache i
Caracterisation d’une tache
Ai : date d’activation de la tache i(prete)
Ti : periode d’activation de latache i
Ci : duree de la tache i
Pi : priorite de la tache i
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 39 / 103
Le temps reel Ordonnancement preemptif
Ordonnancement RM
Condition suffisante d’ordonnancement
N taches periodiques et independantes sont ordonnancables si :
U =N∑
i=1
Ci
Ti
< N(21N − 1)
︸ ︷︷ ︸
cst. de liu & Leyland
(1)
avec
avec Pi =1
Ti
(2)
N Cst. de l&l
1 12 0.823 0.78.. ..∞ 0.69
U : taux de charge du CPU
si {cst de l&l} < U < 1 :on ne peut conclure avec ce test
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 40 / 103
Le temps reel Ordonnancement preemptif
Ordonnancement RM
Exemple 1
ordonnanceur execute toutes les unites de temps
occupation du CPU 81.5% ( 2550 + 30
95 )→ condition suffisante d’ordonnancabilite verifiee
i Ci Ti Pi
1 25 50 0.022 30 95 0.01
échéanceème2 échéanceème3A1 échéance ère1A1 A1 A1
A2
A2
0 50 150100
t
échéanceère1 échéanceème2fin
fin fin fin
fin
Tâche 2
Tâche 1
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 41 / 103
Le temps reel Ordonnancement preemptif
Ordonnancement RM
Exemple 2
ordonnanceur execute toutes les unites de temps
occupation du CPU → condition suffisante
poursuite de l’analyse
i Ci Ti Pi
1 25 502 30 75
A1
A2
0 50 150100
t
Tâche 2
Tâche 1
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 42 / 103
Le temps reel Ordonnancement preemptif
Ordonnancement RM
Temps d’execution dans le pire cas de la tache i : Wi
soit hp(i), l’ensemble des taches de priorite superieur a la tache i
soit ⌈⌉, l’operateur plafond (entier superieur)
Wi = Ci +N∑
j∈hp(i)
⌈Wi
Tj
⌉ (3)
Methode de calcul de Wi
iterative a partir de k = 0 et avec W 0i = Ci
arret si ∃k ′ tel que W k ′
i > Ti ou W k ′
i = W k ′+1i
W k+1i = Ci +
N∑
j∈hp(i)
⌈W k
i
Tj
⌉Cj (4)
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 43 / 103
Le temps reel Ordonnancement preemptif
Ordonnancement RM
Retour sur l’exercice 2 :
Tache 1 : (pas de tache plus prioritaire)
W 01 = C1 = 25
W 11 = C1 = W 0
1
Tache 2 : 1 tache prioritaire, hp(j) = {1}
W 02 = C2 = 30
W 12 = C2 + ⌈
W 02
T1⌉C1
= 30 + ⌈30
50⌉C1 = 30 + 1 ∗ 25 = 55
W 22 = C2 + ⌈
W 12
T1⌉C1 = 30 + ⌈
55
50⌉25
= 30 + 2 ∗ 25 = 80 > T2(echec)
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 44 / 103
Le temps reel Ordonnancement preemptif
Ordonnancement RM
Conclusion
en presence d’un ordonnancement preemptif et de taches periodiquesindependantes :
RM permet d’utiliser des priorites fixes pour les tachesRM donne un critere suffisant d’ordonnancabilite
Remarques
un grand nombre de taches = 69% du CPU utilisable (Cst. de l&l)
31% restant (instants creux) utilisable pour les taches sporadiques,asynchrones
le RME (RM Etendu) peut prendre en compte des taches dependantes
des ordonnancements preemptifs a priorites variables existent : EDF
critere necessaire et suffisant U < 100%mais bien + complexe a implementer (priorites a recalculer dynamiquement)
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 45 / 103
Linux Xenomai
Plan
1 Linux Operating SystemOperating SystemLinux KernelLinux Driver Model
2 Le temps reelTemps reel mou/durOrdonnancement preemptif
3 Linux XenomaiLinux n’est pas temps reelArchitecture de Xenomai
4 Programmation Muli-taches (Posix/Xenomai)Les threadsIPC : mutex et semaphoreIPC : messages et memoire partageeSignauxLe temps
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 46 / 103
Linux Xenomai Linux n’est pas temps reel
Latence globale
En reponse a une interruption
Temps de reponse (latence)= latence d’interruption + duree dugestionnaire (ISR) + latence d’ordonnancement + duree del’ordonnanceur
Tâche en
executionTâche
prête
Interruption (INT)
temps
Tâche
bloquée
d’interruption
Latence
ordonnanceurLatence
Odonnanceur
(Scheduler)
Espace
noyau
Espace
utilisateur
d’interruption
Gestionnaire
Latence globale ou temps de reponse
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 47 / 103
Linux Xenomai Linux n’est pas temps reel
Latence du kernel Linux
Facteurs de latence d’interruption
interruption masquee dans les sections critiques du noyau Linux
Facteurs de latence d’ordonnancement
preemption (appel ordonnanceur) inactive dans les sectionscritiques du noyau Linux
Linux, un noyau devenu preemptif
noyau premptif : peut repondre a plusieurs appels systeme en parallele
→ creation de sections critiques(via mutex) pour eviter concurrence surles variables/structures internes du noyau
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 48 / 103
Linux Xenomai Linux n’est pas temps reel
La preemption dans l’espace noyau
Illustration : latence du noyau linux
reveil d’une tache de haute priorite B par une interruption
alors que l’on est dans la section critique d’un appel systeme
→ latence importante
Préemption du processus A par B
AppelSystème
tempsINT
Processus A
Espace utilisateur
Espace noyau
Priorité
ISR ordonnanceur
Processus B
latence d ’ INT
Section critique de l’appel systeme
non interruptible, non premptible
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 49 / 103
Linux Xenomai Linux n’est pas temps reel
Motivation pour un Linux temps reel
RTOS dedies et commerciaux
Vxworks (monolithique), QNX (micro-noyau)
developpement sur une machine host par cross-compilation
Pour : performant, petite taille et fonctionnalites (debogage)
Contre : couts importants, sources majoritairement fermes, drivers acreer
GPOS libre avec extension RT
linux xenomai, RTAI
developpement direct sur le systeme possible
Pour : Open sources, gratuit, support communautaireenvironnement linux : X windows, drivers (not RT but open source)
Contre : ”You can put racing stripes on a bulldozer but it won’t go anyfaster” (RTLinux Manifesto)
→ modifications importantes du noyau pour approcher les performances desRTOS commerciaux
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 50 / 103
Linux Xenomai Linux n’est pas temps reel
Solution pour rendre TR le noyau Linux
1/Modifier le noyau
rendre le noyau le plus preemptible possiblereduire le nombre de sections critiques, ajout heritage de priorite,...
le patch RT PREEMPT fait progressivement ces modifications
2/Ajouter un micro noyau temps reel
concept du ”Dual Kernel” ou co-noyau
adosser un micro-noyau temps reel a Linux
Linux Xenomai et RTAI
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 51 / 103
Linux Xenomai Architecture de Xenomai
co-noyau Xenomai
Le concept
un micro-noyau Xenomai entre le hardware et Linux
ordonnanceur temps reel specifiqueindependant des sections critiques Linux
Prioritaire sur noyau Linux
Via un tube d’interruption(INT), Xenomai recoit en priorite les INT
or les noyaux sont pilotes par les interruptions :
interuption horloge systeme : appels ordonnanceur, timersinterruptions des peripheriquesappels systeme (interruprion 0x80)
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 52 / 103
Linux Xenomai Architecture de Xenomai
ADEOS (now i-pipe)
Le pipe d’evenement ou ”I-pipe”
disponible sous forme d’un patch du noyau
evenements dispatches successivement aux domaines a travers un tubevirtuel
l’INT capturee par Xenomai peut etre remis dans le tuyau pour Linux
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 53 / 103
Linux Xenomai Architecture de Xenomai
Xenomai
Co-noyau Linux-Xenomai
ISR
ISR
Contrôle
masque IRQSources d’interruptions
Virtualisation d’interruptions
Migration espace utilisateurApplications TR
Domaine Linux (noyau standard)
Domaine Xenomai (co−noyau)
ordonnanceur
ordonnanceur TR Application TR
espace kernel
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 54 / 103
Linux Xenomai Architecture de Xenomai
Compilation/Configuration de Xenomai
Patch des source du noyau Linux
patch et source de la suite Xenomai disponible sous forme d’archives(tar xf xenomai-xx.x.tbz)
script interactif pour le patch a executer a partir du repertoire source dukernel linuxsh ../xenomai-2.x.x/scripts/scripts/prepare-kernel.sh
Configuration/compilation identique au kernel linux
configuration (make menuconfig)
compilation du noyau linux-xenomai (make)
Note
les services de gestion d’interruptions ne sont pas compiles par defaut
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 55 / 103
Linux Xenomai Architecture de Xenomai
Compilation de la suite Xenomai
La suite xenomai
a compiler dans le repertoire source de Xenomai (pour un x86) :(cd xenomai-xx.x ; ./configure –enable-x86-sep ;make ;make install)
utilitaires de test de xenomai (latency)entetes et bibliotheques pour l’API xenomai dans l’espace utilisateur(userspace), ainsi que les differents skins (API Native, POSIX, VXWORKS)documentation
installation par defaut dans /usr/xenomai
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 56 / 103
Linux Xenomai Architecture de Xenomai
Xenomai
Tache TR dans l’espace noyau Xenomai
sous forme d’un module noyau
utile pour developper des drivers temps reel (gestion des INT)
sinon deconseille : pas de protection memoire (plantage Linux possible)
Tache TR dans l’espace utilisateur
sous forme d’une application multi-thread classique
executee par le noyau Xenomai
plusieurs API disponibles pour Xenomai (native, POSIX, VXworks...)
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 57 / 103
Linux Xenomai Architecture de Xenomai
Xenomai
Migration des Tache TR dans l’espace utilisateur
→ permettre a une tache xenomai de faire un appel systeme Linux(ouvrir un fichier, utiliser un pilote non-RT)
si migration dans le domaine Linux (secondaire)
le noyau Linux herite de la priorite de la tache Xenomai TR migree ;Linux devient une tache TR Xenomailatence superieure pour la tache ;executee par Linux donc souffre de ses latences
Execution de la tâche Xenomai
Migration
Linux
domaine
Xenomai
temps
domaine
Appel système Linux
Appel API Xenomai
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 58 / 103
Linux Xenomai Architecture de Xenomai
Xenomai
Perfomance du noyau Xenomai
distribution du temps de reponse a une interuption(Source : How fast is fast enough ? Choosing between Xenomai and Linux for
real-time applications. J H Brown)
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 59 / 103
Linux Xenomai Architecture de Xenomai
Xenomai API
skins pour l’Interface de Programmation (API)
le noyau Xenomai fournit les services d’un RTOS generique
l’API native est une API parmi d’autres utilisant ces services
skins disponibles (POSIX, VxWorks,..) en plus de l’API Native
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 60 / 103
Linux Xenomai Architecture de Xenomai
Xenomai API/Posix
Categories de services
gestion des taches
creer une tache avec une priorite en parametrert task create() / pthread create()
definir une thread comme periodiquert task set periodic() / pthread make periodic np()
gestion du temps et alarmes
definir une thread comme periodiquert timer read() / clock gettime()
synchronisation
creer un semaphorert sem create() / sem init()
gestion d’interruption
creer un gestionnaire d’interruption (noyau)rt intr create() / pthread intr attach np()
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 61 / 103
Programmation Muli-taches (Posix/Xenomai)
Plan
1 Linux Operating SystemOperating SystemLinux KernelLinux Driver Model
2 Le temps reelTemps reel mou/durOrdonnancement preemptif
3 Linux XenomaiLinux n’est pas temps reelArchitecture de Xenomai
4 Programmation Muli-taches (Posix/Xenomai)Les threadsIPC : mutex et semaphoreIPC : messages et memoire partageeSignauxLe temps
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 62 / 103
Programmation Muli-taches (Posix/Xenomai) Les threads
Thread : 1 processus leger
Un processus :plusieurs fils d’execution
pour chaque fil (thread) :
1 etat des registres1 compteur ordinal
execution en parralele
legerete
meme espace d’adressage
variables globales (data)partagees entre threads
global var 2
global var1
{ var1, var2
thread1( )
...}
{ var1, var2
thread2( )
...}
Prog. counter
CPU Registers
{ thread1( )
thread2( ) ...}
main( )
Prog. counter
CPU Registers
Prog. counter
CPU Registers
thread1main main thread2 thread2
Processus
thread1
timeCPU timeline
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 63 / 103
Programmation Muli-taches (Posix/Xenomai) Les threads
Thread : Creation et destruction
Creation d’une thread
la fonction main() est la thread initiale
une thread peut creer une nouvelle thread avecpthread_create()/rt_task_create()
Fin d’une thread
si fin d’execution de son code
si appel a la fonction pthread_exit()/rt_task_delete()
si une thread la stoppe avec pthread_cancel()/rt_task_delete()
si le processus se termine : le main() retourne.
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 64 / 103
Programmation Muli-taches (Posix/Xenomai) Les threads
Thread : Destruction
Attente de la fin d’une threadpthread_join()/rt_task_join() :thread appelante bloque tant que la thread indiquee n’est pas finie
eviter que le main ne se termine et detruise les threads.
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 65 / 103
Programmation Muli-taches (Posix/Xenomai) Les threads
Thread : Example
/* Function as body of the thread */
void* dad_is_having_a_beer( void *ptr )
{
printf("Is my beer in the fridge?");
return NULL; }
...
int main( void )
{
pthread_t thread1, thread2; //thread descriptor
pthread_create( &thread1, NULL, dad_is_having_a_beer,
(void*) NULL );
pthread_create( &thread2, NULL, son_is_having_a_coke,
(void*) NULL );
pthread_join( thread1, NULL);
pthread_join( thread2, NULL);
return 0; }Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 66 / 103
Programmation Muli-taches (Posix/Xenomai) Les threads
Thread : Creation et destruction
Attributs de creation
la politique d’ordonnancement, la taille de la pile,...
API native : en parametre de rt_task_create()
dont la priorite fixe de la tache (0 (priorite basse)-99(priorite haute))
POSIX : attributs dans une structure de type pthread_attr_t
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 67 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : mutex et semaphore
Situation de competition (race condition)
Definition
manipulation conjointe d’une meme ressource ou variable par 2 tachessans synchronisation de l’acces
Consequence : resultat non deterministe, fonction de l’ordonnancementdes processus.
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 68 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : mutex et semaphore
Mutex
Illustration avec une variable partagee entre 2 processus legers (threads)
if (frigo==EMPTY)
frigo=BEER;
else
frigo=EMPTY;
if (frigo == BEER)
printf("who stole my beer!");
{
}
Dad:
preemption
preemption
preemption
EMPTY
COKE
BEER
EMPTY
0.
1.
2.
3.
frigo:
Etat variable
if (frigo==EMPTY)
frigo=COKE;
else
frigo=EMPTY;
if (frigo == COKE)
printf("who stole my coke!");
Son:
{
}
0.
2.
3.
1.
> who stole my coke!
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 69 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : mutex et semaphore
Mutex
Illustration avec une variable partagee entre 2 processus legers (threads)
if (frigo==EMPTY)
frigo=BEER;
else
frigo=EMPTY;
if (frigo == BEER)
printf("who stole my beer!");
{
}
Dad:
EMPTY0.
1.
2.
3.
frigo:
Etat variable
if (frigo==EMPTY)
frigo=COKE;
else
frigo=EMPTY;
if (frigo == COKE)
printf("who stole my coke!");
Son:
{
}
1.
0.
2.
preemption
BEER
EMPTY
COKE
4.
4.
3.
EMPTY
> (no message display)
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 70 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : mutex et semaphore
l’objet Mutex (Mutual Exception)
Definition
2 etats : ouvert/libre (1), ou ferme (0)
une tache peut acquerir le mutex si il est libre : 1 → 0
si le mutex n’est pas libre, la tache bloque tant qu’il n’est pas libere
la tache ayant acquis le mutex, doit le liberer ensuite : 0 → 1
Fonction Xenomai Fonction Posix Operation
rt mutex create() pthread mutex init() creer un mutex
(toujours heritage de priorite) pthread mutexattr init() definir proprietes du mutex
rt mutex delete() pthread mutex destroy() detruire un mutex
rt mutex aquire() pthread mutex lock() acquerir un mutex
rt mutex release() pthread mutex unlock() liberer un mutex
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 71 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : mutex et semaphore
Mutex
Usage
protection par une section critique : encadree par une acquisition etliberation d’un mutex
pour un meme mutex, seul 1 processus a la fois peut etre dans unesection critique
partagée
Ressource
MutexTâche
Tâche
Tache()
{ ...
pthread\_mutex\_lock();
//lecture/ecriture sur la ressource : la section critique
pthread\_mutex\_unlock();
}
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 72 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : mutex et semaphore
Mutex
Solution : un mutex pour prevenir l’acces simultane au frigo
if (frigo==EMPTY)
frigo=BEER;
else
frigo=EMPTY;
if (frigo == BEER)
printf("who stole my beer!");
}
pthread_mutex_unlock(&mx);
pthread_mutex_lock(&mx);
{
Dad:
{
Son:
if (frigo==EMPTY)
frigo=COKE;
else
frigo=EMPTY;
if (frigo == COKE)
printf("who stole my coke!");
pthread_mutex_unlock(&mx);
pthread_mutex_lock(&mx);
}
preemption
preemption
(Son bloque,
Mutex deja acquis)
preemption
(Mutex libre)
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 73 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : mutex et semaphore
Mutex
Problemes courants avec les mutexes (et semaphores)
famine : privee de la ressource monopolisee par les taches prioritaires
interblocage : taches ayant chacune une ressource voulue par une autre
inversion de priorite : execution de taches non prioritaires car la tacheprioritaire attend une ressource
Solutions possibles
interblocage :
detection du blocage par le RTOSprocedure de deblocage (liberation forcee d’une ressource)
inversion de priorite : algorithme d’heritage de priorite
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 74 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : mutex et semaphore
Mutex
Interblocage (Deadlock)
la ressource est protegee par un mutex (exclusion mutuelle)
une chaıne de 2 taches ou plus, ou chaque tache possede une ressourcevoulue par une autre
A
Tâche Tâche
B
A1
A2 mutex_unlock
A et B (prévu)
0 50 100
mutex_lock
B
mutex_lock
A
t
possédépar veut veut
possédépar
mutex_lock
t
mutex_lock
BA
Inter−blocage
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 75 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : mutex et semaphore
Mutex
Inversion de priorite
Def : situation ou des taches de basse priorite s’executent avant unetache de haute priorite du a un blocage sur une ressource
situation aggravee par les taches de priorite intermediaire
A2
A1
t
Priorité
0 50 100
t
150
mutex_lock
t
mutex_lock
3
mutex_unlock
mutex_lock
section critique de (comportement normal)
∆t
∆t ≤ T1
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 76 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : mutex et semaphore
Mutex
Inversion de priorite
Def : situation ou des taches de basse priorite s’executent avant unetache de haute priorite du a un blocage sur une ressource
situation aggravee par les taches de priorite intermediaire
A2
A1
t
Priorité
0 50 100
t
150
mutex_lock
t
t
mutex_lock
A4
A3
mutex_unlock
mutex_lock
Inversion de priorité
∆t +C3 + C4
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 76 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : mutex et semaphore
Mutex
Heritage de priorite
algorithme pour resoudre le probleme d’inversion de priorite
le plus frequemment implemente dans les RTOS(rarement implemente dans les GPOS (linux))
Principe :
liberer au plus tot la ressource qui bloque la tache prioritaire
→ si une tache A bloque sur une ressource detenue par une tache B depriorite inferieure :
1 la priorite de la tache B est elevee a celle de A2 des que la ressource est liberee, B retrouve sa priorite initiale
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 77 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : mutex et semaphore
Mutex
Heritage de priorite
algorithme pour resoudre le probleme d’inversion de priorite
le plus frequemment implemente dans les RTOS(rarement implemente dans les GPOS (linux))
A2
A1
t
3
t
Priorité
0 50 100
t
150
mutex_lock
t
mutex_lock
A4
A
mutex_unlock
mutex_lock
héritage:
initial)
∆t
(P1 = P1
P1 = P2
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 77 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : mutex et semaphore
Mars Pathinder : un cas celebre d’inversion de priorite
Mars Pathinder
sonde avec rover (sojourner) pour exploration de la surface de Mars
“faster, better and cheaper” concept (< 150 million $)
le bug : re-initialisation de la sonde annulant les commandes en cours
cause : inversion de priorite retardant assez l’execution d’une tache pourdeclencher le watchdog de reinitilisation de la sonde
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 78 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : mutex et semaphore
Semaphore
Definition
un objet partage, assimilable a un compteur, pouvant soit etre disponible(compteur ≥ 1) ou indisponible (0)
1 l’acquisition d’un semaphore decremente son compteur2 la liberation d’un semaphore incremente son compteur3 la tache bloque (passif) si le compteur est a zero lors d’une tentative
d’acquisistion
un semaphore binaire est un semaphore dont le compteur est limite a 1
Fonction Xenomai Fonction Posix Operation
rt sem create() sem init() creer un semaphorert sem delete() sem destroy() supprimer un semaphore
rt sem p() sem wait() acquerir un semaphorert sem v() sem post() liberer un semaphore
rt sem broadcast() voir objet barrier debloquer toutes les tachesen attente sur le semaphore
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 79 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : mutex et semaphore
Semaphore
Usage
coordination de l’acces a une ressource : un compteur
synchronisation entre taches
rendez-vousbarriere de synchronisation
acces a une ressource multiple (2 canaux, 2 co-processseurs. . . )
Sémaphore
(initialisé à 2)
Ressource
identique 1
Ressource
identique 2
A1
A2
Tâche
Tâche
Tâche
0 50 100 150
sem_wait sem_post
sem_wait sem_post
3
A1 sem_wait sem_post
t
Sémaphore
2 1 0 210
bloque
Priorité
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 80 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : mutex et semaphore
Semaphores : exemple du producteur-consommateur
BufferSize = 3;
pthread_mutex_t mutex ; // access to critical section
sem_t empty, full ;
sem_init(&full,0, 0); // number of full buffer slots
sem_init (&empty, 0,BufferSize); // number of empty slots
Producer() {
int widget;
while (TRUE) { // loop forever
make_new(widget); // create a new widge
sem_wait(&empty); // decrement the empty semaphore
pthread_mutex_lock(&mutex); // enter critical section
put_item(widget); // put widget in buffer
pthread_mutex_unlock(&mutex); // leave critical section
sem_post(&full); // increment the full semaphore
}
} Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 81 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : mutex et semaphore
Semaphores : exemple du producteur-consommateur
Consumer() {
int widget;
while (TRUE) { // loop forever
sem_wait(&full); // decrement the full semaphore
pthread_mutex_lock(&mutex); // enter critical section
remove_item(widget);// take a widget
pthread_mutex_unlock(&mutex); // leave critical section
sem_post(&empty); // increment the empty semaphore
consume_item(widget);// consume the item
}
}
Interet :
Attente passive (bloque si rien a consommer/produire)
Solution sans semaphore : des compteurs dans la section critique+ attente active
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 82 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : mutex et semaphore
Semaphore
Synchronisation simple de taches
la tache 2 a besoin que 1 ait fait son travail prealablement
si P2 > P1, 2 redemarre des que 1 atteint le point de synchro.
cas mono-CPU
A1
A2
Priorité
0 50 100 150
t
sem_wait
sem_post
bloquesem_wait
sem_post
TâcheTâche
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 83 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : messages et memoire partagee
File de messages (”queue”)
Definition
objet de communication asynchrone entre 2 taches TR
taille de la file definie a la creation (nombre max. de messages contenus)
si file pleine : impossible d’ecrire de nouveaux messages
lecture dans la file est non-bloquante, ou bloquante(tache bloquee tant qu’il n’y a pas un message)
→ synchronisation avec message
Fonction Xenomai Fonction Posix Operation
rt queue create() mq open() creer une filert queue delete() mq close() supprimer une filert queue write() mq send() envoyer un messagert queue read() mq receive() lire un message
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 84 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : messages et memoire partagee
File de messages (”queue”)
un mode message urgent et broadcast souvent disponible
Message
B
Message
B
Message
B
A
Message
Message
A
Message
B par une tâche
Lecture de A
File de message
Ecriture B
par tâche
MessageMessage
Message
A
Ecriture
Message urgent (LastIn First Out)
A
urgente C
C
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 85 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : messages et memoire partagee
File de messages
Communication avec accuse de reception
notification de reception du message a l’envoyeur
outil : file + semaphore binaire (ou une 2eme file si message de retour)
cas mono-CPU
A1
0 50 100 150
t
A2Tâche
Tâche
mq_receive sem_post
sem_waitmq_sent
Priorité
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 86 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : messages et memoire partagee
File de messages (”pipe”)
L’objet pipe
communication entre un processus linux (exemple : GUI) et un processusXenomai
utilise un objet RT_PIPE identifie par son numero de mineur et device
Fonction Xenomai Fonction Posix Operation
rt pipe create() open() creer une filert pipe delete() close() supprimer une filert pipe write() write envoyer un messagert pipe read() read() lire un message
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 87 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : messages et memoire partagee
File de messages (”pipe”)
rt_pipe_create
(RT_PIPE*, ,0)
rt_pipe_create
(RT_PIPE*, ,1)
rt_pipe_read()
rt_pipe_write()
write()
read()
open("/dev/rtp0",)
open("/dev/rtp1",)
Linux Task
(ex: Interface graphique)
Realtime Task
Xenomai
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 88 / 103
Programmation Muli-taches (Posix/Xenomai) IPC : messages et memoire partagee
Memoire partagee
Definition
une zone memoire partagee par des taches
allocation faite dans un tas memoire de taille fixe reserve au demarrage→ allocation dynamique de memoire temporellement deterministe
utiliser un mutex pour un acces coherent a la memoire(race condition)
communication inter-taches : file de messages preferable (evite le mutex)
Fonction Xenomai Fonction Posix Operation
rt heap create() shm open() creer une memoire partageert heap delete() close() supprimer une memoire partageert heap alloc() nmap() allouer de la memoirert heap free() unmap() liberer de la memoire
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 89 / 103
Programmation Muli-taches (Posix/Xenomai) Signaux
Signaux
Generalites
kill() : delivre signal a un processus ou thread
identifie par un numero (1 a SIGRTMAX (64 sous linux) )
action par defaut a reception : fin du processus (exit())
pas d’equivalent direct sous xenomai
Quelques Signaux Usuels
Numero Sens du signal
SIGINT Interruption interactive (ctr-c au clavier)SIGKILL Signal non deroutableSIGSEGV Violation memoire(MMU)SIGALARM Expiration d’un delai (alarm(),pause)ou timerSIGCHLD Fin processus enfantSIGUSR1 Signal reserve pour les applicationsSIGRTMIN -SIGRTMAX 32 signaux temps reel libres d’utilisation
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 90 / 103
Programmation Muli-taches (Posix/Xenomai) Signaux
Delivrance des Signaux
Masquage des signaux
un masque definie les signaux dont on veut bloquer la delivrance
SIGKILL et SIGTSTP ne peuvent etre masques
Fonctions de definition de masques
sigemptyset(sigset_t* set);
initialise un masque set sans aucun signal
sigfillset(sigset_t* set);
initialise un masque set avec tous les signaux
sigaddset(sigset_t* set, int signal);
ajoute le signal au masque set
sigdelset(sigset_t* set, int signal)
supprime le signal du masque set
int sigsmember(sigset_t* set, int signal)
teste si le signal est contenu dans le masque.
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 91 / 103
Programmation Muli-taches (Posix/Xenomai) Signaux
Delivrance des Signaux
Action associee au signal
sigaction(int signal, struct sigaction *new,
struct sigaction *old);
1 le signal considere2 l’action associee definit par la structure sigaction new3 une structure old pour sauvegarde l’action anterieure ou NULL
struct sigaction { void (*sa_handler)(int) ;
sigset_t sa_mask;
unsigned long sa_flags; }
sa_handler, la fonction a executer lors de l’arrivee du signal
sa_mask, les signaux a bloquer pendant le traitement du sigaction
sa_flags, pour modifier le comportement du signal ou non (NULL)
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 92 / 103
Programmation Muli-taches (Posix/Xenomai) Signaux
Delivrance des Signaux
Attente sur un signal quelconque
pause(void); bloque dans l’attente d’un signal quelconque
Attente d’un signal particulier
int sigwait(sigset_t* set, NULL);
cherche un signal en attente parmi ceux du masque set
et retourne le signal en attente selectionne
si aucun signal en attente : bloque
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 93 / 103
Programmation Muli-taches (Posix/Xenomai) Signaux
Delivrance des Signaux
Exemple Capture de SIGINT (ctrl-c)
void SignalHandler( int signal_num )
{ fprintf( stderr, "Catch ctrl-c\n"); }
void main( void )
{
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_handler=SignalHandler;
sigaction ( SIGINT, &sa, NULL);
while(1) sleep(1); //while to prevent end of main
}
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 94 / 103
Programmation Muli-taches (Posix/Xenomai) Signaux
Delivrance des Signaux
Blocage de signaux
bloquer les signaux delivres a un thread
sigprocmask(int methode, sigset_t *new, sigset_t*old);
avec
new, un masque de signauxmethode est :
SIG SETMASK : utiliser new comme nouveau masque pour la threadSIG BLOCK : ajouter les signaux de new au masque actuelSIG UNBLOCK : retirer les signaux de new du masque actuel
old pour y sauvegarder le masque anterieure ou non (NULL)
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 95 / 103
Programmation Muli-taches (Posix/Xenomai) Le temps
La gestion du temps Linux et skin POSIX
Mesure du temps : horloges
Resolution 1 ns, si option CONFIG_HIGH_RES_TIMERS dans le noyau
le temps (tv_sec,tv_nsec secondes) stocke dans unestruct timespec :
{ time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */ };
Horloges disponibles clkid t :
CLOCK_MONOTONIC, temps depuis la mise sous tension (A UTILISER)
CLOCK_REALTIME, temps depuis l’Epochmodifiable par clock_settime()
CLOCK_PROCESS_CPUTIME_ID, temps CPU consomme par le process
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 96 / 103
Programmation Muli-taches (Posix/Xenomai) Le temps
La gestion du temps Linux et skin POSIX
Lecture des horloges
clock_nanosleep(clockid_t,, struct timespec *res,)
thread dort res nanosecondes ou attend un signal quelconque
clock_gettime( , ) obtenir le temps ecoule
clock_getres( , ) obtenir la resolution de l’horloge
Compilation sous Linux
l’utilisation de ces fonctions necessite l’edition de lien avec librt : -librt
et les threads requierent l’inclusion de <pthread.h> et -libpthread
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 97 / 103
Programmation Muli-taches (Posix/Xenomai) Le temps
La gestion du temps XENOMAI
Lecture des horloges
RTIME, un long long int qui contient un temps en us
RTIME rt_timer_read ( void ) retourne le temps courant
rt_task_sleep(RTIME time)
fait dormir (bloque) la tache time us.
Voir examples
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 98 / 103
Programmation Muli-taches (Posix/Xenomai) Le temps
La gestion du temps
Les timers
API posix avec struct itimerspec
{ struct timespec it_interval; /*Timer period*/
struct timespec it_value; /*Initial expiration time*/};
Signaler l’expiration struct sigevent {
int sigev_notify; /* Notification method */
int sigev_signo; /* Signal d’expiration */
void (*sigev_notify_function) (union sigval); };
ou sigev_notify peut prendre les valeurs :
SIGEV_NONE : ne pas signaler, on se satisfait de timer_gettime()
SIGEV_SIGNAL : generer le signal sigev_signo pour le processusSIGEV_THREAD : cree une thread dont la fonction de depart estsigev_notify_function
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 99 / 103
Programmation Muli-taches (Posix/Xenomai) Le temps
La gestion du temps
Les timerstimer_create(clockid_t, struct sigevent *evp,
timer_t);
creer un timer associe a l’action evp
timer_settime(timer_t timerid, int flags,
struct itimerspec *new, NULL);
arme le timer avec les valeur de new
timer_gettime(timer_t timerid,struct itimerspec *cur)
obtenir la valeur courante du timer
timer_delete(timer_t timerid) detruire le timer.
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 100 / 103
Programmation Muli-taches (Posix/Xenomai) Le temps
Tache periodique
Tache periodique sous Xenomai
rt_task_set_periodic(,date,period)
/pthread_make_periodic_np()
genere un signal periodique de periode period
le premier signal est envoye a partir de l’instant date+period
rt_task_wait_period(&overrun)/pthred_wait_np()
bloque tant qu’aucun signal n’est en attenteoverrun compte le nombre de signaux (periodes) manques
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 101 / 103
Programmation Muli-taches (Posix/Xenomai) Le temps
Thread : tache periodique
while(1)
{
....
}
rt_task_wait_period(&overrun)
rt_task_make_periodic( );
periodic Task A
Task A
Periodic release signal
CPU timeline
rt_task_wait_period()
rt_task_wait_period()rt_task_wait_period(&overrun)
overrun=1, code erreur −ETIMEDOUT
1 signal/période perdueEchec ! (plus d’1 signal en attente)
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 102 / 103
Programmation Muli-taches (Posix/Xenomai) Le temps
Tache periodique
tache periodique sous Linux
pthread_make_periodic_np() n’existe pas
1 utiliser un timer lie a un descripteur de fichieret lecture bloquante read() sur ce fichier.http://www.2net.co.uk/tutorial/periodic_threads
2 programmer un timer periodiqueet attendre son signal d’expiration avec sigwait()
Voir example
Loıc Cuvillon (ENSPS) Systemes temps reel et Systemes embarques Annee scolaire 2013-2014 103 / 103