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

Linux Discussion :

Champs de bits & noyau linux


Sujet :

Linux

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 52
    Points : 38
    Points
    38
    Par défaut Champs de bits & noyau linux
    Bonjour,

    Je suis actuellement en train d'écrire un driver sous Linux (donc dans l'espace noyau) pour un carte d'acquisition entrees/sorties.
    Je suis actuellement en train d'essayer de modifier certains registres de ma carte. Donc pour les modifier, et pour rendre mon code bien plus lisible que de simples valeurs hexadécimales, je souhaite utiliser les champs de bits. Les fonctions que j'utilise sont donc "inb()" et "outb()".
    Pour écrire certains bits a '1' et d'autres à '0', j'utilise la méthode suivante:
    - lecture de mon registre actuel en faisant un "inb()"
    - copie de celui-ci dans mon champ de bits
    - définition des bits
    - ecriture dans le registre avec "oub()"

    Mon programme ressemble donc à ca:

    typedef struct{
    unsigned char bit0 :1;
    [...]
    }CHAMP1;

    {
    [...]
    CHAMP champ;
    [...]
    champ=inb(reg);
    champ.bit0=1;
    out(champ,reg);
    [...]
    }

    Lorsque je compile j'ai les erreurs suivantes:
    - "incompatible type in assignment" pour la ligne "champ=inb(reg);"
    - "incompatible type for argument 1 of 'outb'" pour la ligne "out(champ,reg);"

    Auriez-vous une idée pour résoudre ces erreurs ?
    J'ai essayé de typecasté avec (unsigned char), (char) mais ça ne fonctionne toujours pas...

    Je vous remercie d'avance pour votre aide.

  2. #2
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut
    Salut

    Vérifie les types que tu utilise (déjà dans le bout de code que tu donne, la structure que tu déclare (CMAMP1) n'est pas celle que tu utilise (CHAMP)... Je suppose que c'est une erreur de frappe en recopiant ici

    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
    #include <stdlib.h>
     
    typedef struct {
      unsigned char bit0 :1; 
    } CHAMP;
     
    CHAMP
    inb(int i)
    {
      CHAMP r;
      r.bit0 = 0;
      return(r);
    } /* inb() */
     
    void
    out(CHAMP champ, int reg)
    {
    } /* out() */
     
     
    int
    main(int argc, char *argv[])
    {
      CHAMP champ;
      int reg = 0;
     
      champ=inb(reg);
      champ.bit0=1;
      out(champ,reg);
     
      exit(EXIT_SUCCESS);
    } /* main() */
    Ceci se compile avec pour seul warning:
    foo.c:4: warning: type of bit-field `bit0' is a GCC extension

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 52
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    Merci pour ton aide. En effet tu as raison, j'ai comis une erreur en recopiant. C'est bien CHAMP

    Par contre toi tu définis les fonctions inb() et outb() alors que se sont deux fonctions déja existantes...

    J'ai réussi en castant de la manière suivante:
    *(unsigned char *)&champ=(unsigned char)inb(reg);

    outb(*(unsigned char *)&champ);

    Merci pour tin aide en tout cas !!

  4. #4
    Membre éprouvé
    Avatar de SnakemaN
    Profil pro
    Bidouille-tout Android
    Inscrit en
    Juillet 2006
    Messages
    871
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Bidouille-tout Android

    Informations forums :
    Inscription : Juillet 2006
    Messages : 871
    Points : 1 118
    Points
    1 118
    Par défaut
    Super si c'est résolu, mais n'oublie pas le petit en bas de page

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

Discussions similaires

  1. Un warning pendant la phase d execution du noyau linux
    Par Djo00 dans le forum Administration système
    Réponses: 9
    Dernier message: 15/07/2006, 02h57
  2. Problème d'execution du noyau linux sur 1 carte
    Par Djo00 dans le forum Administration système
    Réponses: 4
    Dernier message: 12/07/2006, 13h34
  3. Champs de bit et affectation
    Par the_ionic dans le forum C
    Réponses: 11
    Dernier message: 09/06/2006, 17h13
  4. lire un champ de bit a partir d'un fichier
    Par loupdeau dans le forum MFC
    Réponses: 5
    Dernier message: 09/08/2005, 13h53

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