Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Analyse utilisation mémoire C

2 views
Skip to first unread message

Pascal06

unread,
Feb 2, 2023, 4:20:13 PM2/2/23
to
Bonsoir à toutes et tous,
existe-t-il un outil permettant d'analyser l'espace mémoire utilisé par
les variable dans un programme en C ?
L'analyse serait réprésentée sous la forme d'un graphique ou d'un
tableau: telle variable int occupe tant d'octets, ou tel % de la taille
totale de la mémoire, tel tableau de char tant d'octets, etc.
En gros ça serait quelque chose qui automatise l'utilisation de la
fonction sizeof sur toutes les variables du programme.
Je sais pas si je m'explique bien :)
Merci par avance,
Pascal

JKB

unread,
Feb 2, 2023, 5:48:33 PM2/2/23
to
Le 02-02-2023, Pascal06 <to...@toto.com> a écrit :
> Bonsoir à toutes et tous,

Bonsoir,
Pas sûr que je comprenne la demande. Si c'est pour un code
s'exécutant sur une machine standard, il faut voir les sections du
binaires (.data par exemple, ou .text). Le code source ne donnera
pas grand'chose parce que le compilateur peut optimiser des tas de
choses (alignement mémoire entre autre, champs de bits...).

Si c'est pour de l'embarqué, il existe toujours un utilitaire avec
le cross-compilateur qui permet de le savoir. Typiquement, quelque
chose comme :

avr-size --format=avr --mcu=atmega1284 firmware.elf
AVR Memory Usage
----------------
Device: atmega1284

Program: 122466 bytes (93.4% Full)
(.text + .data + .bootloader)

Data: 6011 bytes (36.7% Full)
(.data + .bss + .noinit)

EEPROM: 2311 bytes (56.4% Full)
(.eeprom)

Sinon, pour les variables les unes après les autres, ça va être
difficile puisqu'il y a en C des variables automatiques (sur la
pile), des globales ou statiques et des variables sur le tas. Ça n'a
donc pas beaucoup de sens.

JKB

--
Si votre demande me parvient en code 29, je vous titiouillerai volontiers
une réponse.

tTh

unread,
Feb 3, 2023, 2:16:31 AM2/3/23
to
Et pourquoi ne pas aller poser la question dans le groupe C ?

--
+-------------------------------------------------------------------+
| https://danstonchat.com/1138.html |
+-------------------------------------------------------------------+

Pascal06

unread,
Feb 3, 2023, 4:23:01 AM2/3/23
to
Le 02/02/2023 à 23:48, JKB a écrit :
> Bonsoir,
>
> Pas sûr que je comprenne la demande. Si c'est pour un code
> s'exécutant sur une machine standard, il faut voir les sections du
> binaires (.data par exemple, ou .text). Le code source ne donnera
> pas grand'chose parce que le compilateur peut optimiser des tas de
> choses (alignement mémoire entre autre, champs de bits...).
>
> Si c'est pour de l'embarqué, il existe toujours un utilitaire avec
> le cross-compilateur qui permet de le savoir. Typiquement, quelque
> chose comme :
>
> Sinon, pour les variables les unes après les autres, ça va être
> difficile puisqu'il y a en C des variables automatiques (sur la
> pile), des globales ou statiques et des variables sur le tas. Ça n'a
> donc pas beaucoup de sens.
>
> JKB

Bonjour JKB,
Merci pour ta réponse.
Effectivement je me suis peut être mal exprimé. Je ne cherche pas à
connaître la taille des variables dans le code compilé, mais plutôt je
cherche à faire un récapitulatif des variables dans le code non
compilé.

Par exemple:

void main (void){

unsigned char unevariable;
unsigned char unevariable2[2];

// un code

}

void unefonction (void) {

int variablefonction;
// un autre code

}

L'outil me donnerait un récapitulatif sous forme de fichier csv (par
exemple):

fonction;variable;type;taille_octets;
"void main (void)";"unevariable";"unsigned char";1;
"void main (void)";"unevariable2[2];"unsigned char";2;
"void unefonction (void)";variablefonction";"int";4;

On voit dans mon exemple simpliste que les tailles en octets seraient le
résultats obtenus par sizeof(); notamment j'ai pris pour exemple le
résultat de sizeof(int) qui dépend fortement du processeur cible :)

Pascal

Pascal06

unread,
Mar 24, 2023, 3:46:59 AM3/24/23
to
Le 03/02/2023 à 10:23, Pascal06 a écrit :
> Le 02/02/2023 à 23:48, JKB a écrit :
>> Bonsoir,
>>
>> Pas sûr que je comprenne la demande. Si c'est pour un code
>> s'exécutant sur une machine standard, il faut voir les sections du
>> binaires (.data par exemple, ou .text). Le code source ne donnera
>> pas grand'chose parce que le compilateur peut optimiser des tas de
>> choses (alignement mémoire entre autre, champs de bits...).
> Pascal

Bonjour à toutes et tous,

je reviens sur ce messages, car depuis j'ai trouvé des éléments de
réponses.
Il existe donc deux outils qui permettent d'analyser les fichiers map
générés par le compilateur gcc:
https://github.com/govind-mukundan/MapViewer
https://www.sikorskiy.net/info/prj/amap/

Malheureusement, ces outils ne fonctionnent pas avec le code que je
voulais analyser et qui est compilé avec XC8 de Microchip: celui-ci
n'étant pas basé sur GCC (contrairement à XC16).
Par contre,
dans le code assembleur qui est généré (fichier .lst), il est indiqué
en commentaire la taille de chacune des variables utilisées, par exemple:

1642 ;; *************** function _main *****************
1643 ;; Defined at:
1644 ;; line 112 in file "main.c"
1645 ;; Parameters: Size Location Type
1646 ;; None
1647 ;; Auto vars: Size Location Type
1648 ;; sgOld 4 63[BANK0 ] unsigned long
1649 ;; spOld 4 59[BANK0 ] unsigned long
1650 ;; sg 4 0 unsigned long
1651 ;; sp 4 0 unsigned long
1652 ;; drvConfig 2 67[BANK0 ] struct .
1653 ;; adcRawValue 2 0 unsigned short
1654 ;; msdiStatus 1 0 enum E3961
1655 ;; i 1 0 unsigned char
1656 ;; Return value: Size Location Type
1657 ;; 2 313[None ] int
1658 ;; Registers used:
1659 ;; wreg, fsr0l, fsr0h, fsr1l, fsr1h, status,2, status,0, pclath,
cstack

Ce qui correspond donc tout à fait à ce que je cherchais. On voit par
exemple que sgOld prend 4 octets, que c'est un unsigned long ( =
uint32_t), qu'il utilise le bank0.
Le micro 8 bits utilisé est une PIC16F15244
Ce fichier lst est placé dans le dossier /dist/default du projet.

Si ça peut aider d'autre personnes ;)

Pascal
0 new messages