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 :

Explication #Define ?


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 17
    Par défaut Explication #Define ?
    Bonjour a tous!
    Tout d'abord merci de me repondre si vous le faite.
    Alors voila mon probleme (je vais essayer d'etre le plus clair possible), je sais bien ce qu'est un #include mais le reste me parait quelque peu mysterieux.
    D'apres ce que j'ai compris il sagit des definitions des adresse des registre du µC mais je sui scurieux de savoir ce que fait au final la derniere ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BASE_PIO_LED->PIO_OER = (LED_A | LED_B);
    pouvez vous m'expliquer par ordre cronologique ce qui se passe svp?

    Je dois aussi avouer que je ne saisi pas non plus ces lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define PIO_OER         (AT91_CAST(AT91_REG *) 	0x00000010)
    #define AT91C_BASE_PIOA	(AT91_CAST(AT91PS_PIO) 0xFFFFF400)
    Pour les AT91 CAST et REG * et les 0x... je ne m'y retrouve plus pourriez vous me dire ce qui se passe pour chacune des variables. (je sais tout de meme que le 0x... est un nombre hexa mais avec les * reg parentheses etc je ne m'y retrouve pas, en fait un define tout simple je comprend bien mais des tortueux comme ceux que je vous propose je suis perdu)

    Pour cette ligne il me faudrai juste la confirmation que la variable vaut 1 décalé de 0 donc 1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define AT91C_PIO_PA0	(1 <<  0)



    /**Dans fichier AT91SAM7S64.h**/
    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
    #ifndef __ASSEMBLY__
    typedef volatile unsigned int AT91_REG;// Hardware register definition
    #define AT91_CAST(a) (a)
    #else
    #define AT91_CAST(a)
    #endif
     
    #ifndef __ASSEMBLY__
    typedef struct _AT91S_PIO {
    	...
    	...
    	...
    	AT91_REG	PIO_OER;	// Output Enable Register
    	...
    	...
    } AT91S_PIO, *AT91PS_PIO;
    #else
    #define ...
    #define ...
    #define ...
    #define PIO_OER         (AT91_CAST(AT91_REG *) 	0x00000010) // (PIO_OER) Output Enable Register
    #define ...
    #define ...
    #endif
     
    #define AT91C_PIOA_PER	(AT91_CAST(AT91_REG *) 0xFFFFF400) //(PIOA) PIO Enable Register
     
     
    #define AT91C_PIO_PA0	(1 <<  0)	//Pin Controlled by PA0
    #define AT91C_PIO_PA1	(1 <<  1)	//Pin Controlled by PA1
    #define AT91C_BASE_PIOA	(AT91_CAST(AT91PS_PIO) 0xFFFFF400) //(PIOA) Base Address

    /**Dans fichier AT91SAM7S-EK.h**/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include "AT91SAM7S64.h"
     
    #define AT91B_LED1          AT91C_PIO_PA0
    #define AT91B_LED2          AT91C_PIO_PA1
    #define AT91D_BASE_PIO_LED  AT91C_BASE_PIOA

    /**Dans fichier main.c**/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include "AT91SAM7S-EK.h"
    #include "AT91SAM7S64.h"
     
    #define LED_A          AT91B_LED1
    #define LED_B          AT91B_LED2
    #define BASE_PIO_LED   AT91D_BASE_PIO_LED
     
    BASE_PIO_LED->PIO_OER = (LED_A | LED_B);
    Merci beaucoup à tous.
    Tibo

  2. #2
    Membre éprouvé

    Femme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Décembre 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Décembre 2007
    Messages : 67
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BASE_PIO_LED->PIO_OER = (LED_A | LED_B);
    pouvez vous m'expliquer par ordre chronologique ce qui se passe svp?

    Ici on affecte PIO_OER avec LED_A ou LED_B (ce n'est pas soit l'un, soit l'autre, c'est un ou bit à bit).

    Si on regarde les octets LED_A et LED_B, il valent respectivement 00000001 et 00000010 et donc le ou des 2 donne l'octet 00000011.


    Je dois aussi avouer que je ne saisi pas non plus ces lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define PIO_OER         (AT91_CAST(AT91_REG *) 	0x00000010)
    #define AT91C_BASE_PIOA	(AT91_CAST(AT91PS_PIO) 0xFFFFF400)
    Il s'agit simplement de définition d'adresses physiques du µC que l'on définit dans les constantes PIO_OER et AT91C_BASE_PIOA. les (AT91_CAST(AT91_REG *) et (AT91_CAST(AT91PS_PIO) sont des cast qui permettent de dire que les adresses en question correspondent à des types prédéfinis (structures...) et on a le * juste pour dire que c'est un pointeur.

    Pour cette ligne il me faudrai juste la confirmation que la variable vaut 1 décalé de 0 donc 1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define AT91C_PIO_PA0	(1 <<  0)
    Je confirme


    [B]Pour le cheminement maintenant :[/B]


    Si on part du main.c

    #define LED_A AT91B_LED1
    #define LED_B AT91B_LED2
    #define BASE_PIO_LED AT91D_BASE_PIO_LED

    BASE_PIO_LED->PIO_OER = (LED_A | LED_B);


    on arrive a dire que

    AT91D_BASE_PIO_LED = AT91C_BASE_PIOA qui est l'adresse de base de PIOA définit sous forme de stucture (AT91PS_PIO)

    Donc quand on fait : BASE_PIO_LED->PIO_OER = (LED_A | LED_B);

    On dit que c'est l'élément PIO_OER de la structure BASE_PIO_LED (qui est de type AT91PS_PIO) qui est pointé et auquel on effecte le calcul
    LED_A ou LED_B.

    le registre PIO_OER aura donc au final la valeur binaire 00000011.


    Tu as compris ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 17
    Par défaut Comprehension
    Citation Envoyé par exterieur Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BASE_PIO_LED->PIO_OER = (LED_A | LED_B);
    pouvez vous m'expliquer par ordre chronologique ce qui se passe svp?

    Ici on affecte PIO_OER avec LED_A ou LED_B (ce n'est pas soit l'un, soit l'autre, c'est un ou bit à bit).

    Si on regarde les octets LED_A et LED_B, il valent respectivement 00000001 et 00000010 et donc le ou des 2 donne l'octet 00000011.


    Je dois aussi avouer que je ne saisi pas non plus ces lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define PIO_OER         (AT91_CAST(AT91_REG *) 	0x00000010)
    #define AT91C_BASE_PIOA	(AT91_CAST(AT91PS_PIO) 0xFFFFF400)
    Il s'agit simplement de définition d'adresses physiques du µC que l'on définit dans les constantes PIO_OER et AT91C_BASE_PIOA. les (AT91_CAST(AT91_REG *) et (AT91_CAST(AT91PS_PIO) sont des cast qui permettent de dire que les adresses en question correspondent à des types prédéfinis (structures...) et on a le * juste pour dire que c'est un pointeur.

    Pour cette ligne il me faudrai juste la confirmation que la variable vaut 1 décalé de 0 donc 1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define AT91C_PIO_PA0	(1 <<  0)
    Je confirme


    [B]Pour le cheminement maintenant :[/B]


    Si on part du main.c

    #define LED_A AT91B_LED1
    #define LED_B AT91B_LED2
    #define BASE_PIO_LED AT91D_BASE_PIO_LED

    BASE_PIO_LED->PIO_OER = (LED_A | LED_B);


    on arrive a dire que

    AT91D_BASE_PIO_LED = AT91C_BASE_PIOA qui est l'adresse de base de PIOA définit sous forme de stucture (AT91PS_PIO)

    Donc quand on fait : BASE_PIO_LED->PIO_OER = (LED_A | LED_B);

    On dit que c'est l'élément PIO_OER de la structure BASE_PIO_LED (qui est de type AT91PS_PIO) qui est pointé et auquel on effecte le calcul
    LED_A ou LED_B.

    le registre PIO_OER aura donc au final la valeur binaire 00000011.


    Tu as compris ?
    Yep, j'ai compris. Merci beaucoup pour les details et la chronologie et d'avoir passé du temps à m'expliquer tout ca.
    A bientot peut etre et bonne journée
    Tibo

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

Discussions similaires

  1. [explications]: #define dans un main
    Par tagwin dans le forum C
    Réponses: 2
    Dernier message: 20/03/2007, 08h12
  2. pointeurs (explications)
    Par isidore dans le forum C
    Réponses: 4
    Dernier message: 18/04/2003, 10h41
  3. Explication procédure stockée
    Par underworld dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2002, 10h51
  4. Recherche code d'un fifo,ou explication
    Par don-diego dans le forum C
    Réponses: 8
    Dernier message: 25/07/2002, 10h26
  5. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18

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