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 configuration du linker pour PIC32MZ


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 877
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 877
    Par défaut Explication configuration du linker pour PIC32MZ
    Bonjour,

    Dans l'IDE MPLAB-X pour PIC32MZ, pour le linker il y a les paramètres de configuration suivants :
    - Heap size (bytes).
    - Minimum stack size (bytes).

    Dans le fichier ".ld" de mon projet, je vois écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /*
     * Provide for a minimum stack and heap size
     * - _min_stack_size - represents the minimum space that must be made
     *                     available for the stack.  Can be overridden from
     *                     the command line using the linker's --defsym option.
     * - _min_heap_size  - represents the minimum space that must be made
     *                     available for the heap.  Must be specified on
     *                     the command line using the linker's --defsym option.
     */
    EXTERN (_min_stack_size _min_heap_size)
    Donc est-ce que _min_stack_size correspond à "Minimum stack size (bytes)" et _min_heap_size à "Heap size (bytes)" ?

    Lorsqu'on appelle la fonction malloc, comment cette fonction fait pour déterminer l'espace mémoire restant pour renvoyer une erreur (pointeur NULL) en cas de problème ?
    => Pour moi, l'espace allouable pour la heap devrait être <adresse_de_fin_de_la_RAM> - _min_stack_size - <adresse_de_départ_de_la_heap> ... alors pourquoi il y a deux paramètres à configurer alors qu'un seul devrait suffire ? A quoi servent exactement ces deux paramètres ?

    Merci par avance

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 502
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par boboss123 Voir le message
    Bonjour,

    Donc est-ce que _min_stack_size correspond à "Minimum stack size (bytes)" et _min_heap_size à "Heap size (bytes)" ?
    Pour moi, c'est litérralement ce qui est écrit. => EDIT : _min_heap_size c'est la taille minimale du heap.

    Citation Envoyé par boboss123 Voir le message
    Lorsqu'on appelle la fonction malloc, comment cette fonction fait pour déterminer l'espace mémoire restant pour renvoyer une erreur (pointeur NULL) en cas de problème ?
    C'est difficile à dire sans l'implémentation exacte de malloc() dans cette lib C, mais sûrement qu'elle connait une adresse de début et une adresse de fin du heap et qu'elle travaille dedans. C'est la magie du linker qui permet de définir ces adresses, en utilisant le contenu du fichier .ld.

    Citation Envoyé par boboss123 Voir le message
    moi, l'espace allouable pour la heap devrait être <adresse_de_fin_de_la_RAM> - _min_stack_size - <adresse_de_départ_de_la_heap> ... alors pourquoi il y a deux paramètres à configurer alors qu'un seul devrait suffire ? A quoi servent exactement ces deux paramètres ?
    C'est vrai qu'en général on utilise la fin de la RAM pour mettre la stack ou la heap (je sais jamais lequel des deux). Dans ton calcul, tu ne garantis pas la taille de l'un et de l'autre. Ton linker script permet à ton projet de ne pas linker si l'une ou l'autre des 2 tailles ne peut pas être respectées.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 877
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 877
    Par défaut
    Merci pour votre réponse.

    Après quelque recherches, le paramètre _min_stack_size semble juste être utilisé pour que le linker génère une erreur si la stack size qu'il calcul est inférieure à cette valeur.

    En gros :
    1- L'adresse de début de la stack est la dernière adresse en RAM accessible (a priori les 12 derniers octets sont réservés pour stocker quelque chose : peut-être les bits de config ?)
    2- Il calcule l'adresse de fin où il va stocker les variables globales (ce qui donne l'adresse de début de la heap).
    3- Il calcule l'adresse de la fin de la heap en ajoutant à l'adresse de début de la heap, la valeur du paramètre _min_heap_size.
    4- Il rajoute ensuite une zone vide de 24 octets (je ne sais pas pourquoi) pour avoir l'adresse de fin de la stack.

    Par exemple, voici ce que ça me donne sur mon projet (fonction de mon programme qui affiche les variables créées par le linker) :
    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
    MPLAB-X config :
     - Min stack size : 10000 Bytes
     - Min heap size  : 0 Bytes
     
     +---------------+ @x8007FEF0 : _stack (stack start)
     |   CONF ZONE   |
     | Size:   10000 |
     +---------------+ @x8007D7E0 : _min_stack_size
     |   REAL ZONE   |
     | Size:   52552 |
     +---------------+ @x80070A98 : _splim (stack end)
     |    PADDING    |
     | Size:      24 |
     +---------------+ @x80070A80 : _eheap (heap end)
     |   REAL ZONE   |
     | Size:       0 |
     +---------------+ @x80070A80 : _heap (heap start)
     => Total (Stack+Heap+Padding) : 62576 Bytes
    D'ailleurs ça montre que si on défini une valeur _min_stack_size trop petite par rapport au réel, on arrive dans un cas où le linker ne génère pas d'erreur, ce qui peut être dangereux (car on n'a pas de messages d'erreurs s'il y a des données dans la zone entre _splim et _min_stack_size).

    Tout ça ne dit pas si malloc s'arrête bien à l'adresse _eheap (il faudrait que je fasse des tests).

Discussions similaires

  1. Configuration imprimante matricielle pour Crystal Reports
    Par sakinaMejd dans le forum Périphériques
    Réponses: 2
    Dernier message: 30/09/2009, 15h44
  2. Réponses: 2
    Dernier message: 03/11/2005, 08h45
  3. [Sécurité] configuration de IIS pour php4
    Par sahmi9 dans le forum Langage
    Réponses: 1
    Dernier message: 24/10/2005, 16h59
  4. Configuration des droits pour samba avec ftp et www
    Par Alkmie dans le forum Réseau
    Réponses: 2
    Dernier message: 07/11/2004, 13h50
  5. Configuration de UltraEdit pour java
    Par lantfeust dans le forum Environnement de Développement Intégré (EDI)
    Réponses: 1
    Dernier message: 19/12/2003, 16h57

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