코드를 컴파일하면 Arduino IDE가 이진 스케치 크기를 바이트 단위로 반환합니다.
어떤 기능이나 코드의 어떤 부분이 플래시의 메모리 양을 차지하는지 알아내는 좋은 방법이 있습니까? 따라서 어떤 기능이 소중한 플래시 메모리를 가장 많이 차지하는지 또는 플래시를 낭비하고 어디에서 낭비 해야하는지 느낄 수 있습니다. 최적화 시작?
코드를 컴파일하면 Arduino IDE가 이진 스케치 크기를 바이트 단위로 반환합니다.
어떤 기능이나 코드의 어떤 부분이 플래시의 메모리 양을 차지하는지 알아내는 좋은 방법이 있습니까? 따라서 어떤 기능이 소중한 플래시 메모리를 가장 많이 차지하는지 또는 플래시를 낭비하고 어디에서 낭비 해야하는지 느낄 수 있습니다. 최적화 시작?
답변:
한 가지 방법은 프로그램의 어셈블리 목록을 보는 것입니다.
프로그램을 확인한 후 (확인 또는 다운로드 버튼을 통해) 프로그램의 .cpp, .hex 및 .elf 파일이 저장된 디렉토리를 찾으십시오. (찾는 데 문제가 있으면 arduino IDE에서 자세한 컴파일 옵션을 잠시 켜고 출력에서 디렉토리 이름을 확인하십시오.)
해당 디렉토리 에서 fn.cpp.elf를 실행 avr-objdump -S
하십시오. > 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
있고 경로를 지정해야 할 수도 있습니다. 예를 들어 어셈블러 결과는 어디입니까? forum.arduino.cc의 스레드.