Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Linux

Linux Forum d'entraide sur le système Linux. Avant de poster -> Tutoriels Linux, F.A.Q Linux

Réponse
 
Outils de la discussion
Vieux 14/08/2007, 19h17   #1 (permalink)
Futur Membre du Club
 
Date d'inscription: juin 2007
Messages: 39
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.
damdam78 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 15/08/2007, 11h16   #2 (permalink)
Rédacteur/Modérateur
 
Date d'inscription: mai 2002
Messages: 729
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 :
#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
__________________

Smortex

Les FAQ Assembleur - Linux
In The Beginning Was The Command Line Neal Stephenson
Smortex est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/08/2007, 10h13   #3 (permalink)
Futur Membre du Club
 
Date d'inscription: juin 2007
Messages: 39
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 !!
damdam78 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 21/08/2007, 16h57   #4 (permalink)
Membre émérite
 
Avatar de SnakemaN
 
Date d'inscription: juillet 2006
Localisation: Toulouse
Âge: 24
Messages: 837
Par défaut

Super si c'est résolu, mais n'oublie pas le petit en bas de page
__________________
C'est le signe d'un fou, qu'avoir honte d'apprendre
Ubuntu 8.04 Hardy Heron @home
LE guide libre Linux & Ubuntu pour tous : Simple comme Ubuntu
Pour fêter la nouvelle version Scrouncht
SnakemaN est actuellement connecté   Envoyer un message privé Réponse avec citation
Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Linux



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide


Fuseau horaire GMT +1. Il est actuellement 16h51.


Publiez vos articles, tutoriels et cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter
Copyright 2000-2008 www.developpez.com - Legal informations