I have the answer for Flash memory, but the RAM question still eludes me.
Arduino has this super nice feature which displays flash and RAM usage right at compile time. Ex. in the image below you can see that this Arduino program uses 2084 bytes of flash (6%) and that global and static variables use 188 bytes (9%) of dynamic memory, or SRAM.
When I compile a simple blink program on an STM32F103RB Nucleo dev board in the System Workbench IDE I'd like to know the same thing: how much Flash and RAM is used, and how much is remaining?
When building completes, System Workbench shows:
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
When I look at the binary output file, "SW4STM32/Debug/STM32F103RB_Nucleo.bin", I see it is 2908 bytes, which is the sum of text
+ data
. Therefore, that must be my Flash usage! Since I have 128KB of Flash, that means I am using 2908/(128*1024) = 2% of the total Flash space.
But how do I figure out how much SRAM my global and static variables are using, and how much is available for local variables (like Arduino shows)?
I don't have a clue what any of this stuff means yet, but if this is helpful to help you help me, here is the output from 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
Best Answer
The information you need is all in the output from
size
(akaarm-none-eabi-size
):text
is the size of all code in your application.data
is the size of initialized global variables. It counts against both flash memory and RAM, as it's copied from flash to RAM during startup.bss
is the size of global variables which are initialized to zero (or are uninitialized, and hence default to zero). They're stored in RAM only.dec
andhex
are the sum oftext + data + bss
in decimal and hexadecimal. This value doesn't really mean much on a microcontroller, so it should be ignored. (In environments where a program must be loaded into memory before running, it would be the total memory footprint of the program.)To calculate the RAM usage of your program, add the
data
andbss
columns together.To calculate the FLASH usage of your program, add
text
anddata
.