当我编译代码时,Arduino IDE将以字节为单位返回二进制草图大小。
有没有一种好的方法来找出(大约)什么功能或代码的哪一部分占用了闪存中的多少内存,以便让我感觉到什么功能占用了大部分宝贵的闪存,或者我可能在哪里浪费了闪存,应该开始优化?
当我编译代码时,Arduino IDE将以字节为单位返回二进制草图大小。
有没有一种好的方法来找出(大约)什么功能或代码的哪一部分占用了闪存中的多少内存,以便让我感觉到什么功能占用了大部分宝贵的闪存,或者我可能在哪里浪费了闪存,应该开始优化?
Answers:
一种方法是查看程序的程序集列表。
编译程序后(通过“验证”或“下载”按钮),找到该程序的.cpp,.hex和.elf文件的存储目录。(如果找不到它们,请在arduino IDE中短暂打开详细的编译选项,然后在输出中查看目录名称。)
在该目录中,运行avr-objdump -S
fn.cpp.elf > listing.txt
,其中fn.cpp.elf是草图的名称,将其.ino
删除并.cpp.elf
在末尾添加。例如,使用sketch serialecho.ino
:
avr-objdump -S serialecho.cpp.elf> listing.txt
查看listing.txt
文件,并使用十六进制算术从其结束地址中减去每个函数的开始地址。例如,带有setup
代码
void setup(){Serial.begin(9600); }
在清单中,我们将看到
00000144 <setup>:
...(6 lines snipped)...
144: 26 e0 ldi r18, 0x06 ; 6
146: 40 e8 ldi r20, 0x80 ; 128
148: 55 e2 ldi r21, 0x25 ; 37
14a: 60 e0 ldi r22, 0x00 ; 0
14c: 70 e0 ldi r23, 0x00 ; 0
14e: 80 e1 ldi r24, 0x10 ; 16
150: 92 e0 ldi r25, 0x02 ; 2
152: db c1 rjmp .+950 ; 0x50a <_ZN14HardwareSerial5beginEmh>
00000154 <loop>:
计算结果0x154–0x144 = 0x10表明此部分的setup
长度为16个字节。
这些示例是在linux系统上生成的。我认为该方法在MSWindows系统上是相同的,除了您可能需要说avr-objdump.exe
而不是avr-objdump
,并且可能需要指定其路径。参见例如Assemler结果,在哪里?在forum.arduino.cc上发帖。