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 :

Pointeur de tableau dans un programme pour µC


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut Pointeur de tableau dans un programme pour µC
    Bonsoir,

    Je fait un bibliothèque d'objet en C pour programmer des µC. Je bloque un peu sur un objet ou j'ai besoin d'utiliser un tableau.

    En fait il s’agit d'une structure symbolisant mon objet (voir sequenceur.h), celle ci contient un pointeur (unsigned int *sequence) sur un entier que j’aimerai bien utiliser pour renvoyer sur le tableau que je veut exploiter dans les fonctions de l'objet.

    dans mon main j'initialise mon objet en lui envoyant l'adresse de la première case d'un tableau (voir les lignes soulignées du main.c)

    Mais mon µC ne fonctionne pas comme voulu.. Je pense qu'il n'arrive pas à exploiter le tableau comme il faut, la sortie (s) de l'objet ne change pas d'état..

    J'utilise la bonne méthode pour manipuler mon tableau ?


    sequenceur.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct o_sequenceur{
        unsigned char index;
        unsigned int *sequence;
        unsigned int count;
        unsigned char s, ev;
    };
     
    void o_sequenceur_init(struct o_sequenceur *o, unsigned int *sequence);
    void o_sequenceur_run(struct o_sequenceur *o, unsigned int _ev, unsigned int _raz);
    sequenceur.c
    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
    #include "sequenceur.h"
     
    // INIT de l'objet "o_sequenceur"
    void o_sequenceur_init(struct o_sequenceur *o, unsigned int *_sequence)
    {
        o->s = 0;
        o->ev = 0;
        o->index = 0;
     
        o->sequence = _sequence;
    }
     
    // RUN de l'objet "o_sequenceur"
    void o_sequenceur_run(struct o_sequenceur *o, unsigned int _ev, unsigned int _raz)
    {
        if(_ev == 1)
            o->count++;
     
        if(o->sequence[o->index] == o->count)
        {
            o->index++;
            o->s = !o->s;
        }
    }
    main.c
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #include <xc.h>
    #include "clock.h"
    #include "ecu.h"
    #include "bp.h"
    #include "tor.h"
    #include "diviseur.h"
    #include "pwm.h"
    #include "front.h"
    #include "bit.h"
    #include "bit8.h"
    #include "tor8.h"
    #include "minuterie.h"
    #include "sequenceur.h"
    
    
    
    struct o_clock  clock;
    struct o_tor led_run;
    struct o_diviseur h50ms, h1s;
    struct o_pwm pwm_run;
    struct o_tor8 porta;
    struct o_sequenceur sequenceur;
    
    unsigned int tableau[3] = {4,4,4};
    
    void main(){
    
        ecu_init();
        o_clock_init(&clock,10000000,1000);
        o_tor_init(&led_run,5,2);
        o_diviseur_init(&h50ms, 50);
        o_diviseur_init(&h1s, 1000);
        o_pwm_init(&pwm_run,20);
        o_tor8_init(&porta,1);
        o_sequenceur_init(&sequenceur, &tableau[0]);
    
    
        while(1){
    
            o_clock_run(&clock);
            o_diviseur_run(&h50ms, clock.ev);
            o_diviseur_run(&h1s, clock.ev);
            o_pwm_run(&pwm_run,10,h50ms.ev,0);
            o_tor_run(&led_run,sequenceur.s);
            o_tor8_run(&porta,0xEF);
            o_sequenceur_run(&sequenceur,h1s.ev,0);
        }
    }

  2. #2
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut
    Je n'ai pas très bien compris l'objectif du programme, mais quoi qu'il en soit j'ai une petite remarque :

    Dans la fonction o_sequenceur_init(), tu n'initialises pas le membre count de ta structure. Pourtant, tu l'utilises (ligne 19), et même tu l'incrémentes (ligne 16). En C, le résultat de l'incrément ou de la comparaison d'une variable non initialisée est INDETERMINE, ce qui me laisse penser qu'il y a un petit oubli quelque part.

  3. #3
    Membre actif
    Profil pro
    Ingénieur
    Inscrit en
    Avril 2013
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Avril 2013
    Messages : 77
    Par défaut
    Bonjour,

    Est ce que tu as identifié où le problème se produit?

    J'ai un doute sur cette ligne de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    o->sequence = _sequence;
    J'allouerai plutôt la mémoire pour o->sequence, et ensuite j’appellerai memcpy.

    Ensuite, évite peut être ce genre de commande : mais plutôt , de même plutôt que Bon courage

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    @phi1981 : oui, sauf qu'ici struct o_sequenceur sequenceur; est une variable globale. Si le compilateur suit la norme, les champs devraient tous être mis à zéro. Dans le doute, tu as raison : il vaut mieux initialiser le champ !

    @alyma :
    - pourquoi un doute ? On copie une adresse dans un conteneur d'adresse, pas de besoin d'allouer de la mémoire pour cela ?
    - pour les commandes, ce n'est que pour un soucis de clarté ? Les priorités des opérateurs rendent les parenthèses inutiles si je ne me trompe pas.

    @petitnul12:
    -#include <xc.h> --> ça n'a rien à voir avec XC ?
    - pourquoi l'argument _raz n'est utilisé dans le run du séquenceur ?
    - que vaut le paramètre h1s.ev ?
    - as-tu simplement pris ton débogueur et mis des breakpoints sur les instructions modifiant l'état de ton séquenceur pour voir si les tests réussissent ou échouent systématiquement ?

  5. #5
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut
    Citation Envoyé par Bktero Voir le message
    @phi1981 : oui, sauf qu'ici struct o_sequenceur sequenceur; est une variable globale. Si le compilateur suit la norme, les champs devraient tous être mis à zéro. Dans le doute, tu as raison : il vaut mieux initialiser le champ !
    Exact. Je dois arrêter de poster AVANT d'avoir bu le café. Merci Bktero.

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    De rien

    Tu as quand même raison sur le principe : il y a une fonction qui initialise explicitement tous les champs sauf un. Ce genre devrait aussi être dans la fonction d'initialisation. Si la variable était déclarée dans le main, alors ça ferait du n'importe quoi. Je voulais juste signaler qu'ici, ce n'est peut-être pas l'origine du problème. Ça reste une erreur de la fonction d'initialisation.

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    Citation Envoyé par Bktero Voir le message
    @phi1981 : oui, sauf qu'ici struct o_sequenceur sequenceur; est une variable globale. Si le compilateur suit la norme, les champs devraient tous être mis à zéro. Dans le doute, tu as raison : il vaut mieux initialiser le champ !

    @alyma :
    - pourquoi un doute ? On copie une adresse dans un conteneur d'adresse, pas de besoin d'allouer de la mémoire pour cela ?
    - pour les commandes, ce n'est que pour un soucis de clarté ? Les priorités des opérateurs rendent les parenthèses inutiles si je ne me trompe pas.

    @petitnul12:
    - --> ça n'a rien à voir avec XC ?
    - pourquoi l'argument _raz n'est utilisé dans le run du séquenceur ?
    - que vaut le paramètre h1s.ev ?
    - as-tu simplement pris ton débogueur et mis des breakpoints sur les instructions modifiant l'état de ton séquenceur pour voir si les tests réussissent ou échouent systématiquement ?
    XC est la bilbiothèque du compilateur de Microchip. Rien a voir avec le langage de programmation.
    J'ai corriger l'initialisation du count.
    Le _raz est pas utilisé, car je n'ai pas complétement fini la fonction, je procède par étape =)

    Si j’écris la déclaration de fonction sous cette forme, tout fonctionne..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void o_sequenceur_init(struct o_sequenceur *o, unsigned int* _sequence)
    Le placement de l'étoile change tout, je ne comprend pas trop la différence sur ce coup la.

    h1s.ev vaut 1 toutes les secondes, et durant un tour de tache de fond.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. pointeur sur tableau dans une structure
    Par rollbich dans le forum Débuter
    Réponses: 3
    Dernier message: 02/06/2013, 22h23
  2. problème de tri de tableau dans un programme
    Par chupinours dans le forum Débuter
    Réponses: 9
    Dernier message: 27/10/2012, 15h41
  3. Réponses: 10
    Dernier message: 28/06/2010, 07h53
  4. Réponses: 11
    Dernier message: 20/10/2006, 13h19
  5. Pb pour se servir d'un tableau dans une autre unité
    Par libititi dans le forum Langage
    Réponses: 7
    Dernier message: 08/06/2005, 11h40

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