IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

[RTLinux] Systèmes temps réels


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Février 2005
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 27
    Par défaut [RTLinux] Systèmes temps réels
    Bonjour,

    Je suis actuellement des cours de systèmes temps réels et en TP j'ai pu manipuler un peu RTLinux, en "jouant" avec les fichiers suivants, qui manipulent l'allumage/l'extinction des LED du clavier et des entrées/sorties :

    - kbLED.c : allumage des LED
    - kbRead.c : lecture clavier
    - threadTest.c : test de thread

    J'ai pas trop bien compris comment manipuler les threads avec RTLinux.

    Par exemple, dans le fichier kbLED.c, si je veux faire flasher la Num Lock LED pendant 0,5 s toutes les 3 secondes (la LED est donc allumée pendant 0,5 s et est éteinte pendant 2,5 s, et le cycle est répété), comment je fais ?

    La fonction "pthread_make_periodic_np( pthread_self(), gethrtime(), sec1*3)", si j'ai bien compris, c'est pour démarrer le thread et répéter le cycle toutes les 3 s ? Mais j'ai pas bien saisi l'utilité de pthread_wait_np() dans ce cas ?

    Et puis donc, comment je peux contrôler la durée de l'allumage de la LED ?

    Merci beaucoup !

    Les fichiers suivants kbRead.c et testThread.c sont fournis à titre d'aide parce que j'ai un projet à programmer sous RTLinux. Je peux être amené à de nouveau solliciter votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre averti
    Inscrit en
    Février 2005
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 27
    Par défaut
    En gros, est-ce que quelqu'un serait assez gentil(le) pour m'expliquer ligne par ligne le programme kbLED.c ? Par exemple, l'utilisé de la variable tmp ? Merci beaucoup.

  3. #3
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    Au sujet des threads:
    http://emmanuel-delahaye.developpez....#helloworlds_1

    Au sujet de la variable tmp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
        while (n<100) {
            pthread_wait_np();// stops and waits until next execution
    		//suspends execution of the currently running realtime thread until the start of the next period
            rtl_printf("n=%d\n", n); //debug only
            ++n;      
     
            tmp = 0;
            if (!isOn) {//signifie qu'on s'attend à ce que isOn soit à 1 par défaut,
    			//donc si c'est c'est à 0, on rentre dans le "if" : LED non allumée
               isOn =1;
               //tmp |= 1; //Srl-lock "|=" = bit to bit comparison
               tmp |= 2; //Num-lock
               //tmp |= 4; //Cap-lock
            } else { isOn=0; }
            setLED( tmp );
     
        }//end while
    tmp |=2; -> tmp = tmp | 2;
    Bon, ben on fait un "ou" entre tmp et 2 -> comme il est initialisé à 0... cela vaut 2. Les coups suivants 2 ou 2, cela fait 2. Je pense que cela ne corresponds pas au besoin. Un ou exclusif (^ si ma mémoire est bonne) devrait sans doute mieux convenir...

    Pourquoi ne pas utiliser une fonction sleep() qui temporise ?
    Par exemple,mettre dans la boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    setDEL(0);
    sleep(valeur1);
    setDEL(1);
    sleep(valeur2);
    Bon courage et bon Dimanche

  4. #4
    Membre averti
    Inscrit en
    Février 2005
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 27
    Par défaut
    C'est le programme tel qu'il m'a été donné et écrit par le prof.

    Donc puis-je donc faire pour faire allumer la LED pendant 0,5 s et la laisser éteinte pendant 2,5 s, et recommencer ainsi le cycle ?

  5. #5
    Membre averti
    Inscrit en
    Février 2005
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 27
    Par défaut
    J'ai pas essaye la fonction sleep(), je sais pas si ca marche sous RTLinux.

    En ravanche, j'ai pu faire ce que je voulais, mais c'est pas tres beau a mon avis, y a largement mieux, donc si quelqu'un peut me dire comment (le prof a notamment parler de rajouter une variable temporaire mais je vois pas trop l'utilite). Voila le code modifie qui fait allumer la LED pendant 0.5 s puis la laisse eteinte pendant 2.5 s, et le cycle est repete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    void* task_fcn(void* arg) {
        long sec1 = 1000000000L;
        int n =0;
        int isOn = 0; //0: LED currently off, 1: currently on
        unsigned int tmp; //temp variable to compute LED pattern
     
        pthread_make_periodic_np( pthread_self(), gethrtime(), sec1/2 );
        //periode de 0.5 s
     
        while (n<100) {
            pthread_wait_np();
            //Laisse eteint pdt 0.5 s et allume la LED pdt 0.5 s
            rtl_printf("n=%d\n", n); //debug only
            ++n;      
     
            tmp = 0;
            if (!isOn) {
               isOn =1;
               //c'est la partie moche et artificielle qui fait attendre 2 s
               pthread_wait_np();
               pthread_wait_np();
               pthread_wait_np();
               pthread_wait_np();
     
               //allumage de la LED pdt un cycle = 0.5 s
               //tmp |= 1; //Srl-lock
               tmp |= 2; //Num-lock
               //tmp |= 4; //Cap-lock
            } else { isOn=0; }
            setLED( tmp );
     
        }//end while
        return 0;
    }
    Est-ce quelqu'un peut me confimer les roles de pthread_wait_np() et de pthread_make_periodic_np( pthread_self(), gethrtime(), sec1/2 ) ?

    Ensuite, a l'aide du fichier kbRead.c, il faut que j'arrive a declencher ou detruire le cycle de "flash" de la LED. Je sais pas trop s'il faut creer 2 threads a controler de l'exterieur (dans la main), ou si je peux controler le @eme thread a l'interieur du !er thread ?

    Merci beaucoup.

Discussions similaires

  1. système temps réels explication
    Par xavierdestev dans le forum Embarqué
    Réponses: 3
    Dernier message: 10/07/2013, 13h51
  2. Réponses: 10
    Dernier message: 16/08/2009, 12h57
  3. certifications dans les systèmes temps réels et embarqués
    Par christianf dans le forum Certifications
    Réponses: 3
    Dernier message: 19/09/2008, 09h38
  4. certifications en systèmes temps réel et embarqués
    Par christianf dans le forum Emploi
    Réponses: 0
    Dernier message: 15/09/2008, 17h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo