Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
pointeur et structure
Envoyé par: iostrym

Bonjour, j'ai une petite question à poser aux habitués du C.
Dans un programme C, qui permet l'acces aux registre d'un UART, j'ai les lignes suivantes :

#define AT91_USART0_BASE (0xfffd0000)

---

#define arch_decomp_setup() HW_AT91_USART_INIT \
at91_usart_init((volatile struct atmel_usart_regs *)AT91_USART0_BASE,9600)

---

struct atmel_usart_regs{
unsigned long cr; // control
unsigned long mr; // mode
unsigned long ier; // interrupt enable
unsigned long idr; // interrupt disable
unsigned long imr; // interrupt mask
unsigned long csr; // channel status
unsigned long rhr; // receive holding
unsigned long thr; // tramsmit holding
unsigned long brgr; // baud rate generator
unsigned long rtor; // rx time-out
unsigned long ttgr; // tx time-guard
unsigned long res1;
unsigned long rpr; // rx pointer
unsigned long rcr; // rx counter
unsigned long tpr; // tx pointer
unsigned long tcr; // tx counter
};

Le pointeur sur structure AT91_USART0_BASE possède la valeur 0xfffd0000 donc
l'adresse des champs internes à la struture sont automatiquement des offset par rapport à l'adresse de départ de la structure ?

Soit

adresse cr = 0xfffd0000 + 4
adresse mr = 0xfffd0000 + 8

ou

adresse cr = 0xfffd0000
adresse mr = 0xfffd0000 + 4

Merci de votre aide.

Poste le Monday 22 May 2006 12:09:41
Répondre     Citer    
Re: pointeur et structure
Envoyé par: Sve@r

Citation
iostrym
Le pointeur sur structure AT91_USART0_BASE possède la valeur 0xfffd0000 donc...
... donc déjà ça part très mal car "AT91_USART0_BASE" n'est pas une structure mais une macrodéfinition...

Citation
iostrym
l'adresse des champs internes à la struture sont
automatiquement des offset par rapport à l'adresse
de départ de la structure ?

Soit

adresse cr = 0xfffd0000 + 4
adresse mr = 0xfffd0000 + 8

ou

adresse cr = 0xfffd0000
adresse mr = 0xfffd0000 + 4

Merci de votre aide.

EN THEORIE, si l'adresse de "struct atmel_usart_regs" vaut 0xfffd0000, alors:
&cr=0xfffd0000
&mr=0xfffd0000 + sizeof(cr) donc 0xfffd0000 + 4
etc

DANS LA REALITE, il arrive que parfois (souvent) le compilateur rajoute des octets pour que les champs soient alignés sur des mots machine. Ca optimise l'accès aux champs, ça optimise aussi la taille mémoire quand on a des tableaux de structure, etc. Donc &mr risquera
- de ne pas être 0xfffd0000 + 4
- d'être différent suivant la machine sur laquelle tu compiles

En tout état de cause, ce genre de manipulation mémoire est très dangereux, générateur de bug et absolument pas portable. Il y a sûrement (toujours) moyen de faire autrement...




L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Monday 22 May 2006 18:07:23
Répondre     Citer    
Re: pointeur et structure
Envoyé par: abgech

Citation
Sve@r
En tout état de cause, ce genre de manipulation mémoire est très dangereux, générateur de bug et
absolument pas portable. Il y a sûrement (toujours) moyen de faire autrement...

En l'occurence, la structure est composée uniquement de unsigned long int elle ne contiendra donc pas de bytes de padding sous GNU C. Avec un autre compilateur ?

Le fait du manque de portabilité n'est pas vraiment un inconvénient dans la mesure où ce type de programme, qui accède directement au matériel n'est de toute façon pas portable.


Par contre, il Il y a moyen de faire autrement et portable:
#define AT91_USART0_BASE (0xfffd0000)
...
#define cr  ((unsigned long int*)AT91_USART0_BASE +  0 * sizeof(unsigned long int)) // control
#define mr  ((unsigned long int*)AT91_USART0_BASE +  1 * sizeof(unsigned long int)) // mode
#define ier ((unsigned long int*)AT91_USART0_BASE +  2 * sizeof(unsigned long int)) // interrupt enable
...
#define tcr ((unsigned long int*)AT91_USART0_BASE + 15 * sizeof(unsigned long int)) // tx counter

...

cr* = ...
... = cr* ...
...

Attention, je n'ai pas compilé ce code, il y a peut-être des erreurs de syntaxe, mais je voulais simplement te donner une idée.



Poste le Monday 22 May 2006 21:15:54
Répondre     Citer    
Re: pointeur et structure
Envoyé par: Sve@r

Citation
abgech
En l'occurence, la structure est composée
uniquement de unsigned long int elle ne contiendra
donc pas de bytes de padding sous GNU C.
Le fait du manque de portabilité n'est pas vraiment un inconvénient dans la mesure où ce type de programme, qui accède directement au matériel n'est de toute façon pas portable.
Pour cet exemple-ci, probablement très certainement. Mais je parlais de la méthode dans un cadre généraliste...


L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Tuesday 23 May 2006 07:50:48
Répondre     Citer    
Re: pointeur et structure
Envoyé par: iostrym

Merci pour vos réponses j'allais répondre a peu près ce qu'a dit abgech pour ma défense :-)

c'est vrai ce code est spécifique pour une architecture ARM. Le fait d'avoir défini en long donne des champs de 32 bits ce qui "aligne" forcément les valeurs. Enfin je pense. J'utilise GCC donc si j'en crois abgech je ne devrais pas avoir de problème

De toute façon j'adapte ce code et la personne qui a fait ca avant moi, devait savoir ce qu'elle faisait... contrairement à moi :-)

Merci pour vos réponses à tout les deux !

Poste le Tuesday 23 May 2006 18:48:07
Répondre     Citer    
Re: pointeur et structure
Envoyé par: Sve@r

Citation
iostrym
...et la personne qui a fait ca avant moi, devait savoir ce qu'elle faisait...

Huuuh... dangereuse présomption...
Ptet que le gars avant toi a pris le truc d'un autre en présumant aussi de la chose etc etc (téléphone arabe). Et tu penses au pov'typ qui sera après toi ???yawning smiley)


L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Thursday 25 May 2006 13:05:51
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
pointeur et structure
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons