编译代码大小概述


9

当我编译代码时,Arduino IDE将以字节为单位返回二进制草图大小。

有没有一种好的方法来找出(大约)什么功能或代码的哪一部分占用了闪存中的多少内存,以便让我感觉到什么功能占用了大部分宝贵的闪存,或者我可能在哪里浪费了闪存,应该开始优化?

Answers:


6

一种方法是查看程序的程序集列表。

  1. 编译程序后(通过“验证”或“下载”按钮),找到该程序的.cpp,.hex和.elf文件的存储目录。(如果找不到它们,请在arduino IDE中短暂打开详细的编译选项,然后在输出中查看目录名称。)

  2. 在该目录中,运行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

  3. 查看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上发帖。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.