![]() |
| 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é. | |||||||
|
|||||||
| Linux Forum d'entraide sur le système Linux. Avant de poster -> Tutoriels Linux, F.A.Q Linux |
![]() |
|
|
Outils de la discussion |
|
|
#1 (permalink) |
|
Futur Membre du Club
![]() Date d'inscription: juin 2007
Messages: 39
|
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 (permalink) |
![]() Date d'inscription: mai 2002
Messages: 729
|
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() */
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 |
|
|
|
|
|
#3 (permalink) |
|
Futur Membre du Club
![]() Date d'inscription: juin 2007
Messages: 39
|
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 (permalink) |
|
Membre émérite
![]() Date d'inscription: juillet 2006
Localisation: Toulouse
Âge: 24
Messages: 837
|
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 |
|
|
|
![]() |
![]() |
||
Champs de bits & noyau linux
|
||
| Outils de la discussion | |
|
|