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 :

Accès aux registres processeur en C


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 4
    Points : 0
    Points
    0
    Par défaut Accès aux registres processeur en C
    Bonjour

    Je suis un débutant en C et je n'arrive pas à comprendre pourquoi l'instruction suivante qui permet de configurer un registre à l'adresse 0x40021018, fonctionne:

    *(int *)0x40021018 |= (1<<2);

    Ce que je ne comprend pas c'est l'absence de déclaration de la variable pointeur. Pour moi un cast de pointeur sur une adresse ne force pas le type d'une variable car elle n'existe pas! Je ne sais même pas comment le compilateur peut comprendre que l'adresse 0x400221018 n'est pas une variable.

    Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Tu serais pas sur une plateforme particulière où sa documentation indique ce genre de chose ?
    Cette syntaxe semble pas mal spécifique.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    0x400221018 c'est une adresse. Il n'y a aucune raison d'avoir une variable. C'est suffisant pour le processeur, quand on écrit quelque chose dans cette adresse, il y a un périphérique qui est connecté à cette adresse qui "sait" ce qu'il faut faire.
    Pour plus de compréhension, il faut se renseigner sur ce qu'est un bus processeur.

    Ce type d'adresse semble correspondre avec ce qui se fait souvent avec les processeurs ARM. Certaines adresses sont des adresses dites "logiques", elle correspondent à un accès à la RAM ou à Flash (et elles on ne doit y accéder qu'à travers les variables, fonctions et piles qu'aura mis en place le compilateur), d'autres adresses sont des adresses physiques qui sont en connexion directes avec des périphériques que l'on appelle parfois registres processeurs. Est-ce ton cas?

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 4
    Points : 0
    Points
    0
    Par défaut Par défaut Accès aux registres processeur en C
    Bonsoir

    C'est bien une plateforme ARM et l'adresse en question est une adresse de base pour un ensemble de registres qui correspondent à un ou une famille de périphérique. Pour la documentation, je n'ai rien trouvé qui permette de répondre à la question mais je vais replonger dedans. Quand je fais un essai de compilation sur codeblock avec l'option "console" qui est en natif, cela compile sans erreur (après cela ne fonctionne pas car l'adresse n'est pas autorisée).

    De ce que je comprend, un cast pointeur sur une adresse (int *) 0x40021018 peut suffire au compilateur pour reconnaitre que c'est un registre qui est adressé. Est-ce une option du compilo ou de base dans le langage?

    Merci de toute façon pour votre aide

  5. #5
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    Ça n'est pas une option du compilo. Le compilo fait ce que ton code lui demande, ce qu'il y a à cette adresse c'est ton problème pas le sien.
    Ça n'est pas non plus une particularité du langage. Ce code n'est pas un cas particulier.

    Mais ça dépend du mode dans lequel ton application s'exécute. Commander directement un périphérique est normalement interdit; si 2 applications décident simultanément de "parler" à un même périphérique ça ne peut que produire un beau merdier. Donc pour une application "normale" écrire aux adresses 0x40000000 va être intercepté par le système et va stopper immédiatement ton application! Ton application doit donc être exécutée dans un mode "privilégié". Je connais les processeurs ARM (le hardware) mais pas l'architecture de ton système d'exploitation (le software), donc je ne sais pas comment demander ce mode "privilégié", ça n'est vraisemblablement pas dans le code (encore une fois ni le compilateur, ni le langage n'ont à savoir ce qui se passe à ces adresses) c'est surement dans dans configuration de l'éditeur des liens et dans la manière de lancer ton exécutable.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 4
    Points : 0
    Points
    0
    Par défaut Accès aux registres processeur en C
    Merci pour ton aide et tes explications

    Je cherche à récupérer le document qui décrit la norme du langage C. Cela existe-il et si oui savez-vous ou le récupérer?

    Merci

  7. #7
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    Salut tout le monde,

    Oui il y a les drafts. Sur open-std.org ou sur Wikipedia, tu cherches C99 par exemple et tu as les liens vers les autres dialectes et documents correspondants en bas de pages.

  8. #8
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    Je vais quand même répondre à la question.

    Citation Envoyé par bertrandbd Voir le message
    Est-ce une option du compilo ou de base dans le langage?
    Alors ce genre d'écriture fait partie du langage, il n'a rien d'exceptionnel. Ça se rencontre plus en micrologiciel et pilote mais pratiquement pas en applicatif, sauf en émulation et simulation où c'est quand même bien utile.

    Par contre il faut éviter de parler de "registres processeur" quand le type de registre (matériel) concerné n'a rien à voir avec le CPU. Sur les puces tout en un (MCU, SoC) qui intègrent donc au moins un CPU, il est important de pouvoir faire la différence.

    Par ailleurs dans toute documentation de composant, tous les registres sont nommés. Donc si on utilise un registre dans le code, une bonne pratique c'est de le faire au travers de son nom. Par exemple pour un registre nommé XYZ_A, de largeur 32bits et positionné à l'adresse 0x12345678, en C on écrirait, disons sommairement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdint.h> //pour uint32_t
    #define  XYZ_A  (*(volatile uint32_t*) 0x12345678)
     
    int main(void) {
        uint32_t x= XYZ_A; //lecture du registre
        XYZ_A= x; //écriture dans le registre
    }
    Ici la ligne importante, c'est celle qui paradoxalement n'a pas été commenté puisque c'est ce qui va être fait.
    Alors on part de l'adresse, on la caste en pointeur qui pointe donc exactement à l'emplacement du registre, c'est le type à largeur fixe qui le garantit. Un volatile pour empêcher toute ingérence prédictive du compilateur. Et enfin l'opérateur de déréférencement qui permet à proprement parler l'accès au registre. On rattache le tout a l'identifiant XYZ_A et le preprocesseur s'occupera du reste.
    La finalité de tout ça c'est d'utiliser cette identifiant de manière tout-à-fait transparente, exactement comme s'il s'agissait d'une variable. Ensuite avec les opérations adéquates, il ne restera plus qu'à travailler au niveau du bit et ainsi interagir avec le système.

  9. #9
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    Citation Envoyé par bertrandbd Voir le message
    Merci pour ton aide et tes explications

    Je cherche à récupérer le document qui décrit la norme du langage C. Cela existe-il et si oui savez-vous ou le récupérer?

    Merci
    J'espère que cette question est hors du sujet courant, tu ne trouveras dans cette norme aucune information sur les conséquences d'un accès forcé à une adresse forcée.
    Attention quand même c'est un document un peu difficile à lire pour un débutant. C'est 600 pages d'informations concrètes avec de rares exemples. Ça reste accessible mais j'espère que tu as au moins une bonne connaissance du langage C.

  10. #10
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    Ah @dalfab ton message me rappelle une discussion : https://www.developpez.net/forums/d2...stre-hardware/

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 4
    Points : 0
    Points
    0
    Par défaut
    Merci à vous

    J'ai trouvé la norme; si j'ai des insomnies je saurais quoi faire

  12. #12
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Ce que je ne comprend pas c'est l'absence de déclaration de la variable pointeur.
    Non tu déclare rien ,tu demande ici d'écrire directement dans une adresse.

    Bref ce que tu fait , n'a rien de particulier, c'est ce qui est fait souvent dans l'embarqué quand on veut taper dans une IO (kaitlyn à bien expliquer).
    Maintenant seul la doc t'indiquera ce que ça fait ,vu que c'est une adresse totalement arbitraire.

    (Enfin pas totalement pour des raisons de facilité , on branche souvent les adresses haute pour chaque type RAM/ROM/IO etc etc et on subdivise ensuite , pour cela que tu trouvera certain machine des "mirror" , vu que certain fils sont pas branché , donc que tu fasse 0x21001000 ou 0x20001000 , sur certain machine c'est pareil , mais là aussi la doc l'indique ).

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Février 2013
    Messages : 24
    Points : 28
    Points
    28
    Par défaut adressage logique et virtuel
    C'est parce que tu travaille directement avec un adressage logique, et non pas un adressage virtuel.

    Ainsi donc il n'y a pas de conversion dans la mmu.
    Ce qui fais que tes adresses correspondent directement a des périphériques.
    On appel cela le mapping mémoire.
    Dans la documentation de ton hard tu dois avoir quelque part cette adressage, ou alors dans un header.

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

Discussions similaires

  1. Accès aux registres du port parallèle
    Par Auteur dans le forum LabVIEW
    Réponses: 0
    Dernier message: 28/05/2020, 19h32
  2. Accès aux registres Windows en C
    Par Poupinelelapin dans le forum C
    Réponses: 1
    Dernier message: 11/07/2009, 08h35
  3. Réponses: 1
    Dernier message: 10/09/2008, 14h39
  4. [Kylix] Kylix: acces aux portx séries
    Par ghost942 dans le forum EDI
    Réponses: 4
    Dernier message: 03/02/2003, 21h10
  5. [VB6] [BDD] Optimisation de l'accès aux données
    Par LadyArwen dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 30/01/2003, 13h27

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