Looking at an assembly listing of your code is the most direct method for finding out details of space allocation. On my Ubuntu Linux system, I use a shell script (that is, a file containing shell commands) like the following to produce an assembly listing of the most-recently-compiled .ino
file, which must be in the working directory when the script executes:
#!/bin/sh
# Look for .ino in current directory, and find recent /tmp/build...
item=*.ino
[ -z "$item" ] && echo ino file not found && exit
BDIR=/tmp/$(ls -t /tmp | egrep -m1 build.*tmp)
BASE=$(basename $item .ino)
avr-objdump -S -I$PWD $BDIR/$BASE.cpp.elf > $BASE.ino.asm
All the stuff before the avr-objdump
line allows the script to find out the name of the current .ino
file and the name of the /tmp/
subdirectory where the .ino
's .elf
file is found.
You can also use avr-objdump
to get a more concise size listing, as follows, where $BDIR
and $BASE
are as in the script above and represent the build directory in /tmp/
, and the basename of the .ino
file.
avr-objdump -C -d $BDIR/$BASE.cpp.o| egrep -C2 '^Disassembly' | egrep -v '^--|^$|^Disassembly' | less
This will produce a list with two-line entries like the following, in which each line beginning with 00000000 is a subroutine name, and the next line shows the last line of its compiled code. In this example output, the setup_PowerDown()
routine has 0xA4
bytes of code, ISR __vector_13
has 0xC6
bytes, keepAlive()
has 0x10
bytes, etc.
00000000 <setup_PowerDown()>:
a4: 08 95 ret
00000000 <__vector_13>:
c6: 18 95 reti
00000000 <keepAlive()>:
10: 08 95 ret
00000000 <eeWrite1(unsigned char, unsigned char)>:
3a: 08 95 ret
00000000 <eeWrite2(unsigned char, unsigned char)>:
18: 0c 94 00 00 jmp 0 ; 0x0 <eeWrite2(unsigned char, unsigned char)>
00000000 <parValidate(unsigned char, unsigned char, unsigned char)>:
64: 08 95 ret
00000000 <loadSettings()>:
e0: 08 95 ret
00000000 <applySettings()>:
84: 08 95 ret
Some IDEs provide symbol table information that includes sizes of routines, stack frames, and data. I don't know if that's available via Arduino IDE, AVR-libc, or GNU Binutils. The symbol table provided by avr-readelf -s
(as in following command) provides quite detailed symbol information that seems quite useless in its raw form.
avr-readelf -s $BDIR/$BASE.cpp.o
The methods described above are somewhat ad hoc, and depend on files left after avr-gcc
or avr-g++
run. I don't know of any “official” methods for getting the information you want to see.