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 :

incrementer l'adresse d'un pointeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2007
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 39
    Par défaut incrementer l'adresse d'un pointeur
    bonjour à tous,
    voici mon probleme, je fais un petit soft permettant de venir ecrire puis lire dans une sdram.
    l'utilise un pointeur d'adresse u32*adress_data.
    le probleme étant que je veux écrire à toutes les adresses mais quand je fais
    adress_data++; bien sure l'adresse est incrementer de 4;
    la sdram utiliser va de l'adresse 0x00000000->0x03ffffff;

    si quelqu'un aurait une solution .
    merci

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Tu peux pas utiliser une variable de type pointeur sur unsigned char:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char *p_address_data;
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Membre averti
    Inscrit en
    Février 2007
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 39
    Par défaut
    ok mais meme si j'utilise un "long int" je vais avoir le meme resultat quand j'incremente l'adresse du pointeur??

    voici ce qu'on m'a conseillé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main()
    {
        long int *adress_sdram;
        alt_u32 buf;
        alt_u32 data=0x55aa;
        alt_u32 cpt=0;
        adress_sdram=SDRAM_0_BASE;
        printf("sdram initialise\ndebut ecriture\n");
        do
        {
            adress_sdram[cpt]=data;
            cpt++;
        }  while(cpt<SDRAM_0_SPAN);//adresse de fin
    }

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Je ne comprends pas bien où est ton problème?

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #5
    Membre averti
    Inscrit en
    Février 2007
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 39
    Par défaut
    salut,
    en fait je veux mettre des valeurs a des adresses successives dans un pointeur tout simplement.
    exemple: je met le valeur 0xffff à l'adresse 0,puis 1 puis 2,.........
    jespere que je suis un peu plus clair dans ce que je veux faire
    merci

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Mais si l'unité d'adressage de ta mémoire est le byte, et qu'un byte fait par exemple 8 bits. Je ne vois pas l'intérêt d'écrire 0xffff (4 bytes) à l'adresse SDRAM_0_BASE, puis à l'adresse SDRAM_0_BASE + 1, etc.

    Que représente SDRAM_0_SPAN exactement? S'il s'agit d'un décalage en bytes depuis SDRAM_0_BASE, le code que tu propose est faux.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #7
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par calagan
    salut,
    en fait je veux mettre des valeurs a des adresses successives dans un pointeur tout simplement.
    exemple: je met le valeur 0xffff à l'adresse 0,puis 1 puis 2,.........
    jespere que je suis un peu plus clair dans ce que je veux faire
    merci
    Je pense que tu confonds l’adresse physique de la SDRAM avec l’adressage de la SDRAM par le processeur.
    Si tu as une SDRAM 16 bits, les mots sont organisés ainsi :
    @0 => mot 0 de 16bits
    @1 => mot 1 de 16bits
    @2 => mot 2 de 16 bits
    et ainsi de suite.

    Maintenant si tu veux adresser ta SDRAM par le processeur, avec pour unité d’adressage l’octet (ça doit être le cas pour NIOS II), en faisant des accès 16 bits, les adresses doivent évoluer comme cela :
    @0 => mot 0 de 16bits
    @2 => mot 1 de 16bits
    @4 => mot 2 de 16 bits
    etc….

    Le code suivant devrait faire l’affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        unsigned short *adress_sdram = SDRAM_0_BASE;
        unsigned int cpt;
     
        for (cpt = 0; cpt < (SDRAM_0_SPAN+1)/sizeof(*adress_sdram) ; cpt++)
        {
            *adress_sdram = data;
             adress_sdram++;
        }

  8. #8
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Je parlais de celui-là.

    Citation Envoyé par calagan
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main()
    {
        long int *adress_sdram;
        alt_u32 buf;
        alt_u32 data=0x55aa;
        alt_u32 cpt=0;
        adress_sdram=SDRAM_0_BASE;
        printf("sdram initialise\ndebut ecriture\n");
        do
        {
            adress_sdram[cpt]=data;
            cpt++;
        }  while(cpt<SDRAM_0_SPAN);//adresse de fin
    }

  9. #9
    Membre averti
    Inscrit en
    Février 2007
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 39
    Par défaut
    aparement quand je passe en mode debug et que j'observe mon pointeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    adress_sdram[cpt]=data;
            cpt++;
    n'est pas pris en compte, mon compteur pointe toujours à l'adresse0x0000

  10. #10
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par calagan
    aparement quand je passe en mode debug et que j'observe mon pointeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    adress_sdram[cpt]=data;
            cpt++;
    n'est pas pris en compte, mon compteur pointe toujours à l'adresse0x0000
    C'est normal. Tu incrémentes le compteur cpt et non pas ton pointeur adress_sdram.

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par calagan
    bonjour à tous,
    voici mon probleme, je fais un petit soft permettant de venir ecrire puis lire dans une sdram.
    l'utilise un pointeur d'adresse u32*adress_data.
    le probleme étant que je veux écrire à toutes les adresses mais quand je fais
    adress_data++; bien sure l'adresse est incrementer de 4;
    la sdram utiliser va de l'adresse 0x00000000->0x03ffffff;

    si quelqu'un aurait une solution .
    merci
    Il est évident que si tu utilises un type u32, et que bytes font 8 bits, l'incrémet est de 32 / 8 = 4 bytes, en toute logique.

    Ce que tu veux faire n'est pas portable pour de nombreuses raisons.

    As-tu bien accès à la mémoire physique, et non à la mémoire logique (MMU) ?

    Quelle est la taille des bytes sur ta machine ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include <limits.h>
     
       printf ("CHAR_BIT = %d\n", CHAR_BIT);
    Si c'est bien 8, tu peux accéder à toutes les adresses de cette zone mémoire avec un pointeur de type unsigned char :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #define SDRAM_MIN 0x00000000
    #define SDRAM_MAX 0x03fffffful
     
    ...
     
       unsigned char *p = (unsigned char *) SDRAM_MIN;
    chaque incrémentation de p pointera sur le byte suivant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       while (p <= SDRAM_MAX)
       {
          /* faire ce qu'on a a faire avec p... */
          p++;
       }

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/05/2010, 11h49
  2. Réponses: 1
    Dernier message: 28/08/2009, 17h31
  3. Réponses: 15
    Dernier message: 30/09/2008, 23h36
  4. Adresse d'un pointeur
    Par Stnaire dans le forum Réseau
    Réponses: 18
    Dernier message: 17/11/2007, 06h56
  5. [TP] Afficher l'adresse d'un pointeur
    Par So_nya dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 14/09/2007, 01h25

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