¿Cómo puedo saber en el momento de la compilación la cantidad de memoria Flash y memoria dinámica (SRAM) de un STM32 que se utiliza?

1

SI ESTA ES UNA PREGUNTA MEJOR PARA EL DESBORDAMIENTO DE LA PILA, ¿PUEDE UN ADMINISTRADOR POR FAVOR MOVERSE?

Creo que tengo la respuesta para la memoria Flash, pero la pregunta de la memoria RAM todavía se me escapa.

Arduino tiene esta característica super agradable que muestra el uso de flash y RAM justo en el momento de la compilación. Ex. En la imagen de abajo puede ver que este programa Arduino usa 2084 bytes de flash (6%) y que las variables globales y estáticas usan 188 bytes (9%) de memoria dinámica, o SRAM.

Cuandocompilounprogramasimpledeparpadeoenun STM32F103RB Nucleo dev board en el System Workbench IDE Me gustaría saber lo mismo: cuánto flash y RAM se usa, y cuánto queda ?

¡Esto no es mucho pedir!

Cuando se completa la construcción, System Workbench muestra:

Generating binary and Printing size information:
arm-none-eabi-objcopy -O binary "STM32F103RB_Nucleo.elf" "STM32F103RB_Nucleo.bin"
arm-none-eabi-size "STM32F103RB_Nucleo.elf"
   text    data     bss     dec     hex filename
   2896      12    1588    4496    1190 STM32F103RB_Nucleo.elf

Cuando miro el archivo de salida binario, "SW4STM32 / Debug / STM32F103RB_Nucleo.bin", veo que es 2908 bytes, que es la suma de text + data . Por lo tanto, ese debe ser mi uso de Flash! Ya que tengo 128 KB de Flash, eso significa que estoy usando 2908 / (128 * 1024) = 2% del espacio total de Flash!

¿Pero cómo entiendo la cantidad de SRAM que usan mis variables globales y estáticas y cuánto está disponible para las variables locales (como muestra Arduino)?

Todavía no tengo una pista de lo que significa todo esto, pero si esto es útil para que me ayudes , aquí está la salida de objdump -h STM32F103RB_Nucleo.elf :

$ objdump -h STM32F103RB_Nucleo.elf

STM32F103RB_Nucleo.elf:     file format elf32-little

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .isr_vector   0000010c  08000000  08000000  00010000  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .text         00000a1c  0800010c  0800010c  0001010c  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  2 .rodata       00000028  08000b28  08000b28  00010b28  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .init_array   00000004  08000b50  08000b50  00010b50  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  4 .fini_array   00000004  08000b54  08000b54  00010b54  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  5 .data         00000004  20000000  08000b58  00020000  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  6 .bss          00000030  20000004  08000b5c  00020004  2**2
                  ALLOC
  7 ._user_heap_stack 00000604  20000034  08000b5c  00020034  2**0
                  ALLOC
  8 .ARM.attributes 00000029  00000000  00000000  00020004  2**0
                  CONTENTS, READONLY
  9 .debug_info   00006795  00000000  00000000  0002002d  2**0
                  CONTENTS, READONLY, DEBUGGING
 10 .debug_abbrev 000013b2  00000000  00000000  000267c2  2**0
                  CONTENTS, READONLY, DEBUGGING
 11 .debug_loc    00000d0f  00000000  00000000  00027b74  2**0
                  CONTENTS, READONLY, DEBUGGING
 12 .debug_aranges 000002e0  00000000  00000000  00028888  2**3
                  CONTENTS, READONLY, DEBUGGING
 13 .debug_ranges 00000378  00000000  00000000  00028b68  2**3
                  CONTENTS, READONLY, DEBUGGING
 14 .debug_macro  00001488  00000000  00000000  00028ee0  2**0
                  CONTENTS, READONLY, DEBUGGING
 15 .debug_line   00003dcc  00000000  00000000  0002a368  2**0
                  CONTENTS, READONLY, DEBUGGING
 16 .debug_str    00066766  00000000  00000000  0002e134  2**0
                  CONTENTS, READONLY, DEBUGGING
 17 .comment      0000007f  00000000  00000000  0009489a  2**0
                  CONTENTS, READONLY
 18 .debug_frame  00000610  00000000  00000000  0009491c  2**2
                  CONTENTS, READONLY, DEBUGGING
    
pregunta Gabriel Staples

1 respuesta

9

La información que necesita se encuentra en la salida de size (aka arm-none-eabi-size ):

   text    data     bss     dec     hex filename
   2896      12    1588    4496    1190 STM32F103RB_Nucleo.elf
  • text es el tamaño de todo el código en su aplicación.

  • data es el tamaño de las variables globales inicializadas. Cuenta tanto en la memoria flash como en la RAM, ya que se copia de la memoria flash a la RAM durante el inicio.

  • bss es el tamaño de las variables globales que se inicializan en cero (o no están inicializadas y, por lo tanto, el valor predeterminado es cero). Se almacenan solo en la memoria RAM.

  • dec y hex son la suma de text + data + bss en decimal y hexadecimal. Este valor realmente no significa mucho en un microcontrolador, por lo que debe ignorarse. (En entornos donde un programa debe cargarse en la memoria antes de ejecutarse, sería la huella total de la memoria del programa).

Para calcular el uso de RAM de su programa, agregue las columnas data y bss juntas.

Para calcular el uso de FLASH de su programa, agregue text y data .

    
respondido por el duskwuff

Lea otras preguntas en las etiquetas