Documente Academic
Documente Profesional
Documente Cultură
Exercice RTAI
2014
Exercice 1
Tches Priodiques
Le but de ce premier exercice est de crer deux tches priodiques
en utilisant la librairie RTAI.
Initialisation du Timer
Toutes les fonctions relatives aux temps de RTAI utilisent le Timer,
c'est pourquoi il est indispensable de l'initialiser et de le lancer au
dbut de chaque programme mme si nous n'utilisons pas
directement les fonctions associes au Timer. L'initialisation est
ralise de la manire suivante:
rt_timer_start(TM_ONESHOT)
De manire gnrale nous utiliserons une initialisation non
priodique du timer, car elle permet d'utiliser les nanosecondes
comme unit de temps dans certains paramtres de fonctions la
place du nombre de ticks du processeur.
3
Priodicit de la Tche
Nous devons en premier lieu indiquer que la Tche est priodique:
rt_task_set_periodic(NULL, TM_NOW, (RTIME)10000000);
La valeur "TM_NOW" pour le second paramtre indique la date de
rveil de la tche. Le dernier paramtre spcifie la priode en
nanosecondes. Dans cet exemple la priode est de 10 ms.
Nous devons maintenant faire en sorte que notre tche ait un
comportement priodique:
for (i = 0; i < nb_iter; i++) {
// coeur de la tche
rt_task_wait_period(); // attente de la periode suivante
}
La tche s'excute donc "nb_iter" fois.
5
"
"
"
<
>
"
Exemple
Exemple
Dvelopper 2 tches qui assurent lordre dexcution suivant, vous
utiliserez les smaphores. Faites varier les priorits relatives des 2
tches, lordre dexcution ne doit pas tre modifi.
Solution
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <rtai/task.h>
#include <rtai/timer.h>
RT_TASK task1, task2;
SEM *sem1, *sem2, *sem3, *sem4;
int nb_iter = 10;
static void task_code(void *cookie);
int main () {
rt_timer_start(TM_ONESHOT);
if (rt_task_create(&task1, "TASK1", 0, 30, 0)) {
perror("creation task"); exit(1);}
if (rt_task_create(&task2, "TASK2", 0, 30, 0)) {
perror("creation task"); exit(1);}
if (rt_task_start(&task1, &task_code1, NULL)) {
perror("start"); exit(1);}
if (rt_task_start(&task2, &task_code2, NULL)) {
perror("start"); exit(1);}
pause();
return 0;
rt_typed_sem_init (sem1, 1, 0);
rt_typed_sem_init (sem2, 0, 0);
rt_typed_sem_init (sem3, 0, 0);
rt_typed_sem_init (sem4, 0, 0);
Exemple
Soit une tche logicielle de type chien de garde qui vrifie quun
compteur est rgulirement incrment et qui a le comportement
suivant en cas derreur:
Si le compteur na pas t incrment au bout de 1,5 seconde,
mission dun message derreur (fonction de chien de garde)
Si son excution ne sest pas termine en 1 seconde, mission dun
message derreur (respect dchance)
Ecrire les taches compteur et chien de garde.