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 :

execution switch


Sujet :

C

  1. #21
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par calitom
    La variable Freq.force est fixée à 44. Donc la période est 1/Freq.force. Mais normalement, on devrait avoir plus d'échantillons que ca, c'est pour ca que je ne comprend pas pourquoi avec cette fréquence on arrive pas à avoir les 1024 échantillons...
    Mais encore faut-il que tu puisse aller demander un sampling au moins une fois par période, tu ne crois pas ?
    C'est cette ligne qui est "fautive" à priori :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       if( Perio.force<=(tempsboucle-tps_force) )
    car elle vérifie le temps "réel", et peut donc "sauter" des échantillons si elle a passé trop de temps dans le corps du "if". Il faudrait utiliser un timer et/ou un thread d'acquisition "pure".
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  2. #22
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    818
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2005
    Messages : 818
    Par défaut
    Citation Envoyé par Mac LAK
    Il faudrait utiliser un timer et/ou un thread d'acquisition "pure".
    C'est à dire? Qu'est ce qu'un thread d'acquisition "pure"? Je ne vois pas vraiment ce que tu veux que j'essaye de faire...

  3. #23
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par calitom
    C'est à dire? Qu'est ce qu'un thread d'acquisition "pure"? Je ne vois pas vraiment ce que tu veux que j'essaye de faire...
    C'est pourtant simple : ta boucle fait un polling sur le temps écoulé (contrôlé par l'OS, et indépendant de ton programme) par rapport à une limite prédéfinie (deadline).
    Par exemple, si tu dois faire une acquisition toutes les 20 ms, et que l'exécution de ta boucle prends 21 ms :
    - 1ère étape : acquisition.
    - 2ème étape : delta = 21, donc on n'effectue pas l'itération => acquisition perdue.
    - 3ème étape : delta < 1 ms, donc acquisition.
    - 4ème étape : delta = 22 ms => acquisition perdue.
    etc, etc, etc.
    C'est encore plus vicieux si ton temps d'exécution d'une itération est (par exemple) de 10 ms, mais que tu te fais "piquer" la main par un autre processus... En ce cas, tu devras attendre la fin du quantum de temps de l'autre processus, soit 100 ms de manière générale...

    La solution passe en général par un thread de très haute priorité (TIME_CRITICAL), qui ne fait qu'un traitement simple :
    - Récupération de l'adresse du buffer d'échantillons (passé en paramètre du thread).
    - Passage en priorité maximale.
    - Attente d'un évènement => le thread est suspendu.
    - L'application finit de préparer les données, puis déclenche l'évènement.
    - Le thread se réveille immédiatement, car il est de priorité supérieure.
    - Il va acquérir les données, mais l'attente entre deux samplings se fait via un appel à Sleep plutôt qu'une deadline (vérifier le temps d'exécution du sampling, s'il est long, afin de ne pas introduire de dérive temporelle).
    - Pendant le Sleep du thread d'acquisition, l'application peut s'exécuter. Tu peux utiliser un compteur de samples auquel tu accèdes via les fonctions "Interlocked*" si tu as besoin de récupérer les informations en continu.
    - Lorsque le Sleep est terminé, le thread d'acquisition reprend (presque) immédiatement la main, car de priorité supérieure. On peut aider ce passage de main en effectuant des Sleep(1) dans l'application, par exemple.
    - Lorsque l'acquisition est terminée, le thread déclenche l'évènement indiquant à l'application que les 1024 échantillons sont obtenus, puis se se termine.
    - L'application n'a plus qu'à finir la destruction du thread.

    Une autre solution peut être faite à l'aide d'un timer, mais suivant l'implémentation, ce n'est pas toujours très précis...

    Je repose ma question : quelle est la fréquence d'échantillonnage ? Ou, pour être plus précis, la période d'échantillonnage ? Un sample toutes les milli, toutes les 10, 20, 200 ms ? Suivant la précision requise, l'une ou l'autre des solutions sera préférable...

    Tu comprends un peu mieux ?
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  4. #24
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    818
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2005
    Messages : 818
    Par défaut
    Citation Envoyé par Mac LAK
    Je repose ma question : quelle est la fréquence d'échantillonnage ? Ou, pour être plus précis, la période d'échantillonnage ? Un sample toutes les milli, toutes les 10, 20, 200 ms ? Suivant la précision requise, l'une ou l'autre des solutions sera préférable...
    A vrai dire, je ne sais pas vraiment quelle est la fréquence d'échantillonage... Ce que j'ai réussi à comprendre, c'est que l'acquisition sur un capteur se fait à chaque appel d'une des fonctions du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LectureForce();
    LectureDeplacement();
    Ces fonctions font l'acquisition. Ci-dessous, la fonction Lecture Deplacement():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void LectureDeplacement(void)
    {
    /* Lecture du capteur de déplacement et conversion en mm */
    /* lecture du capteur */
     
    //CONF_DEPLACE;
    DEPLACE;
    /* conversion en mm */
         Capt.deplace[1] = ((Capt.deplace[1] * 25.0 )- 10.5);
    }
    DEPLACE; correspond à ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define DEPLACE     AISampleChannel (2, "1", 10, 0, &Capt.deplace[1]);
    La fonction AISampleChannel, fournie par LabWindows, fait l'acquisition sur la carte numéro "2", sur la voie "1", avec 10V max et 0V min, et range la valeur acquise dans Capt.deplace[1].
    Ainsi, je pense que la fréquence d'acquisition dépend de la vitesse d'éxécution du programme. Mais c'est ce que je pense avoir compris...

  5. #25
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par calitom
    Ainsi, je pense que la fréquence d'acquisition dépend de la vitesse d'éxécution du programme. Mais c'est ce que je pense avoir compris...
    Oui, c'est ça.
    Exemple caractéristique : l'appel à la fonction "Timer()" (elle fait quoi, d'ailleurs, cette babasse ???), qui manipule des flottants en plus (monumentale erreur).

    Admettons que la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       if((Timer()-tempsdeb)>0.02)
    , qui est une mesure de temps par deadline, soit exprimée en secondes : ça fait donc 20 ms. Il est beaucoup plus rapide et précis d'utiliser l'API Win32 et la fonction GetTickCount() à la place !! Que des entiers, précision à la milliseconde, gain de temps d'exécution important (les flottants renvoyés par Timer() sont forcément, d'une manière ou d'une autre, calculés à partir d'entiers), etc...

    Même topo pour cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       if( Perio.force<=(tempsboucle-tps_force) )
    .
    Bref, arrange ça, tu vas déjà gagner pas mal de performances.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  6. #26
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    818
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2005
    Messages : 818
    Par défaut
    J'avais deja penser aux timer, mais je n'étais pas sur que ca venait de la...
    Je vais essayer avec GetTickCount alors...
    En tout cas, merci beaucoup de ton aide...
    Je te tiens au courant du résultat...

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Gestion des options / switch d'un executable
    Par akorx dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 06/02/2013, 12h24
  2. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  3. [Kylix] Demarrer en cliquant sur l'executable ???
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 26/04/2002, 11h24
  4. [Kylix] Execution d'une application hors de l'edi
    Par Sadam Sivaller dans le forum EDI
    Réponses: 1
    Dernier message: 20/04/2002, 23h22
  5. Réponses: 2
    Dernier message: 17/03/2002, 19h00

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