컴파일 된 코드 크기 개요


9

코드를 컴파일하면 Arduino IDE가 이진 스케치 크기를 바이트 단위로 반환합니다.

어떤 기능이나 코드의 어떤 부분이 플래시의 메모리 양을 차지하는지 알아내는 좋은 방법이 있습니까? 따라서 어떤 기능이 소중한 플래시 메모리를 가장 많이 차지하는지 또는 플래시를 낭비하고 어디에서 낭비 해야하는지 느낄 수 있습니다. 최적화 시작?

답변:


6

한 가지 방법은 프로그램의 어셈블리 목록을 보는 것입니다.

  1. 프로그램을 확인한 후 (확인 또는 다운로드 버튼을 통해) 프로그램의 .cpp, .hex 및 .elf 파일이 저장된 디렉토리를 찾으십시오. (찾는 데 문제가 있으면 arduino IDE에서 자세한 컴파일 옵션을 잠시 켜고 출력에서 ​​디렉토리 이름을 확인하십시오.)

  2. 해당 디렉토리 에서 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

  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있고 경로를 지정해야 할 수도 있습니다. 예를 들어 어셈블러 결과는 어디입니까? forum.arduino.cc의 스레드.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.