Re: Temps réel

Pàgina inicial

Reply to this message
Autor: Edgar Bonet
Data:  
A: ML Guilde
Assumptes vells: Temps réel (était Rosegarden)
Assumpte: Re: Temps réel
Le jeudi 16 juin, Frédéric a écrit :
> [...] Tu parles de temps réel avec un noyau standard ? Ou avec un
> noyau genre Rtlinux ?


Le noyau standard fournit du « soft real-time ». Ce n'est pas du niveau
de RTLinux ou RTAI, mais ça te permet d'avoir un processus qui soit
absolument prioritaire sur les autres. Ce processus va préempter tous
les autres dès qu'il passera à l'état prêt, et il ne pourra lui-même pas
être préempté par un autre : il aura donc le processeur pour lui tout
seul jusqu'à ce qu'il décide de le rendre en faisant un appel système
qui le fasse dormir.

J'utilise ça dans ma manip, en combinaison avec /dev/rtc, pour réaliser
des tâches périodiques avec une période de 1 ms. La tâche est bien
effectuée dans la milliseconde demandée, sauf une fois tous les 10^4 à
10^5 (ce n'est donc pas 100% fiable). Dans certains cas le retard peut
atteindre la dizaine de ms (surtout si on fait beaucoup travailler X).
J'ai essayé ça sur un noyau 2.4. Il paraît que le 2.6 est plus
performant (meilleur respect des délais) sur ce point. Faudra que je
mette à jour.

Le seul problème du temps réel (soft ou hard) est que si ton processus
temps réel est bogué et qu'il rentre dans une boucle infinie, il ne
lâche plus jamais le processeur et tu es bon pour un reboot à la dure.

> dans le premier cas, comment mettre ça en oeuvre ?


#include <stdio.h>
#include <sys/mman.h>
#include <sched.h>

/*
 * Become a real time process.
 * Returs 0 on success, -1 on error.
 */
int become_real_time(void)
{
    struct sched_param priority;


    if (mlockall(MCL_CURRENT | MCL_FUTURE) == -1) {
        perror("mlockall");
        return -1;
    }


    priority.sched_priority = 10;
    if (sched_setscheduler(0, SCHED_FIFO, &priority) == -1) {
        perror("sched_setscheduler");
        return -1;
    }


    return 0;
}


La valeur de priority.sched_priority n'a pas d'importance tant que tu as
un seul processus temps réel. Il faut juste qu'elle soit > 0 et
< sched_get_priority_max() (99 en principe, c.f. le man).

Il faut bien entendu être root, sinon tu te prends EPERM.

-- 
Edgar Bonet           Maison : 04 76 21 29 16    Bureau : 04 76 88 10 96
3 rue Jean Prévost    Mobile : 06 77 19 79 39    Fax    : 04 76 88 11 91
38000 Grenoble        guilde@???     www.edgar-bonet.org