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 :

Champs de bits et tableaux de structures


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 1
    Par défaut Champs de bits et tableaux de structures
    Bonjour,

    Pour une meilleure lisibilité du code, je souhaiterais utiliser un tableau de structure contenant notamment des variables, pointeurs de fonctions et si possible des champs de bits. Je précise que ce programme est utilisé sur microcontrôleur.

    Ci-dessous un exemple de l'utilisation d'un tableau de structure qui permet l'appel d'une fonction correspondant à l'octet reçu.

    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
     
    const struct {
    	unsigned char cmd_inactive;
    	unsigned char (*ptr_fct_inactive)(void);
    	unsigned char cmd_disabled;
    	unsigned char (*ptr_fct_disabled)(void);
    } table_cmd[] = {
    {0x10, cmd_reset_inactive,              0x10, cmd_reset_disabled,},
    {0x11, cmd_configuration_inactive,      0x11, cmd_configuration_disabled,},
    {0x12, cmd_poll_inactive,               0x12, cmd_poll_disabled,},
    {0x14, cmd_reader_inactive,             0x14, cmd_reader_disabled,},	
    {0x35, cmd_expansion_inactive,          0x35, cmd_expansion_disabled,}
    };
     
    unsigned char Etat_inactive()
    {
    int i;	 
      	for (i = 0; table_cmd[i].cmd_inactive; i++)      		   
        	if (Rx_octet == table_cmd[i].cmd_inactive)	
    		return table_cmd[i].ptr_fct_inactive(); 
     return 0;	
    }

    Cet exemple est fonctionnel et j'aimerais utiliser cette architecture avec les bits d'interruptions du microcontrôleur, ceux-ci sont construits sous forme de champs de bits:

    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
     
    extern volatile near unsigned char       PIR1;
    extern volatile near union {
      struct {
        unsigned TMR1IF:1;
        unsigned TMR2IF:1;
        unsigned CCP1IF:1;
        unsigned SSP1IF:1;
        unsigned TX1IF:1;
        unsigned RC1IF:1;
        unsigned ADIF:1;
        unsigned PSPIF:1;
      };
      struct {
        unsigned :3;
        unsigned SSPIF:1;
        unsigned TXIF:1;
        unsigned RCIF:1;
      };
    } PIR1bits;
    Mon problème est donc d'utiliser un de ces champs dans le tableau de structure et ensuite appeler une fonction si tel bit & tel bit à été mis à 1.

    J'ai pu lire que les champs de bits sont difficilement portables alors est il possible d'obtenir une solution ou doit on se contenter d'une architecture basé sur un if, else if...

    Merci d'avance pour vos informations.
    Bon week end

  2. #2
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Bonsoir,

    Ce que tu peux essayer d'utiliser, c'est un masque appliqué sur les registres. Par exemple, pour chaque action, tu tests l'état d'un bit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    unsigned short masque ;
    for(masque=0x001; masque<0x100; masque<<=1) {
        if(PIR1&masque) {
            // Action si le bit # est à 1
        }
        else {
            // Action si le bit # est à 0
        }
    }
    Respectivement, le masque va prendre les valeur 1h, 2h, 4h, 8h, 10h, 20h, 40h et 80h. Tous les bits du registre PIR1 seront testés si différent de 0.
    --> Si (PIR1 & 1) <> 0 ==> le bit TMR1IF est à 1
    --> Si (PIR1 & 2) <> 0 ==> le bit TMR2IF est à 1
    --> Si (PIR1 & 4) <> 0 ==> le bit CCP1IF est à 1
    --> Si (PIR1 & 8) <> 0 ==> le bit SSP1IF est à 1
    etc...
    ATTENTION: Si tes registres font plus d'un octet, cela ne fonctionnera plus si tu ne respectes pas l'endianness ton micro-contrôleur (voir http://fr.wikipedia.org/wiki/Endianness).

Discussions similaires

  1. champs de bits dans une structure - option de gcc pour bon fonctionnement
    Par matdakillah dans le forum RedHat / CentOS / Fedora
    Réponses: 1
    Dernier message: 08/10/2008, 12h44
  2. champs de bits
    Par Nico_stras dans le forum C++/CLI
    Réponses: 6
    Dernier message: 31/01/2007, 12h37
  3. enum et champs de bits
    Par FamiDoo dans le forum C++
    Réponses: 12
    Dernier message: 12/07/2006, 13h22
  4. Champs de bit et affectation
    Par the_ionic dans le forum C
    Réponses: 11
    Dernier message: 09/06/2006, 16h13
  5. lire un champ de bit a partir d'un fichier
    Par loupdeau dans le forum MFC
    Réponses: 5
    Dernier message: 09/08/2005, 12h53

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