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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 4
    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 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    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 confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 599
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 4
    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 confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 599
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 4
    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 Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    676
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 95
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 676
    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.

+ 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