logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

WinAVR - Jak ocenić rozmiar funkcji?

_Wojtek_ 09 Wrz 2009 21:59 1526 6
  • #1 7000479
    _Wojtek_
    Poziom 11  
    Czy w WinAVR można wyświetlić jakieś bardziej szczegółowe informacje o kodzie programu?
    Chodzi mi o statystykę ile kodu zajmują poszczególne funkcje w programie, oraz ile ram'u "zużywają".
  • #2 7000505
    k4be
    Poziom 31  
    Zdeasembluj skompilowany program i obejrzyj kod. Z RAMem, starczy popatrzeć jakie i ile zmiennych deklarujesz :P
  • #3 7000523
    kwesoly
    Poziom 15  
    Jeśli masz plik *.elf powstały w trakcie kompilacji wywołaj sobie(np w konsoli, lub dopisz do make'a odpowiednio):

    avr-objdump -h -S plik.elf  >"plik.lss"


    dostaniesz ładny kod w asm, w komentarzach opisane kiedy funkcja się zaczyna kończy. Ramu wprost ci nie poda, ale możesz zaobserwować zużycie stosu w symulatorze.
  • #4 7000750
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Bezsensu...

    Ustawić proces kompilacji tak aby generowany był plik .map, a w nim znaleźć co potrzeba:

    
     .text.main     0x08000210       0x10 ./main.o
                    0x08000210                main
     .text._GLOBAL__I_led
                    0x08000220       0x18 ./main.o
     .text          0x08000238       0x5c ./startup.o
                    0x08000238                Reset_Handler
     .text          0x08000294       0x50 c:/program files/codesourcery/sourcery g++ lite/bin/../lib/gcc/arm-none-eabi/4.3.3/../../../../arm-none-eabi/lib/thumb2\libc.a(lib_a-init.o)
                    0x08000294                __libc_init_array
    

    Z czego wynika, że funkcja main zajmuje 0x10, _GLOBAL__I_led - 0x18, Reset_Handler - 0x5c, a __libc_init_array - 0x50.

    Co do RAMu, to możesz sobie zobaczyć tak jedynie statyczne zmienne (czyli te z atrybutem "static"), bo inne ładowane są na stos. Zmienne statyczne widać również w tym pliku, tyle że w sekcji .data (zainicjalizowane) lub .bss (niezainicjalizowane, czyli równe 0). Dla przykładu:

    
     .data          0x20000004        0x4 ./Pin.o
    [...]
     .bss           0x20000028        0x4 ./Pin.o
    


    Widać, że w obiekcie Pin.o są 4 bajty w sekcji data i 4 w sekcji bss.

    Co do zużycia stosu (zmienne automatyczne), to jedynie dezassemblacja.

    4\/3!!
  • #5 7002203
    tmf
    VIP Zasłużony dla elektroda
    A nie prosciej tak zrobic - avr-nm --size-sort projekt.elf - co da nam posortowana liste obiektow, dodatkowo mozna to przegrepowac wzgledem interesujacego nas symbolu.
  • #6 7003511
    _Wojtek_
    Poziom 11  
    Dziękuje Kolegom za podpowiedzi jednak pliki *.lss i *.map są po prostu nie czytelne.
    Grzebanie i wyszukiwanie w nich zwięzłej informacji jest czasochłonne.
    Do tej pory posługiwałem się prostszą "łopatologiczną" metodą - wycinania funkcji i sprawdzania o ile zmniejszy się zajętość flash i ram.
    Chciałem się dowiedzieć czy jest jakaś lepsza metoda, może trochę nie precyzyjnie zadałem pytanie, ale nie bardzo wiedziałem jak szukać tej informacji.
    W komercyjnym kompilatorze dostaje coś takiego:
    
    LINK MAP OF MODULE:  flash (TEST)
    
    
                TYPE    BASE      LENGTH    RELOCATION   SEGMENT NAME
                -----------------------------------------------------
    
                * * * * * * *   D A T A   M E M O R Y   * * * * * * *
                REG     0000H     0008H     ABSOLUTE     "REG BANK 0"
                DATA    0008H     0003H     UNIT         ?DT?_PRINT_CIMG?TEST
                DATA    000BH     0002H     UNIT         ?DT?DELAY0?TEST
                DATA    000DH     0002H     UNIT         ?DT?CLS?TEST
                DATA    000FH     0002H     UNIT         ?DT?DELAY1?TEST
                DATA    0011H     0002H     UNIT         ?DT?DELAY2?TEST
                DATA    0013H     0002H     UNIT         ?DT?DELAY3?TEST
                DATA    0015H     0001H     UNIT         ?DT?_WRITE_BIT?TEST
                DATA    0016H     0001H     UNIT         ?DT?MAIN?TEST
                        0017H     0009H                  *** GAP ***
                DATA    0020H     000CH     BIT_ADDR     ?BA?TEST
                IDATA   002CH     0001H     UNIT         ?STACK
    
                * * * * * * *   C O D E   M E M O R Y   * * * * * * *
                CODE    0000H     0003H     ABSOLUTE     
                CODE    0003H     0304H     INBLOCK      ?PR?PRINT_IMG?TEST
                CODE    0307H     008CH     UNIT         ?C_C51STARTUP
                CODE    0393H     0078H     UNIT         ?CO?TEST
                CODE    040BH     0034H     INBLOCK      ?PR?MAIN?TEST
                CODE    043FH     0029H     INBLOCK      ?PR?_PRINT_CIMG?TEST
                CODE    0468H     0026H     INBLOCK      ?PR?CLS?TEST
                CODE    048EH     001EH     INBLOCK      ?PR?DELAY0?TEST
                CODE    04ACH     001EH     INBLOCK      ?PR?DELAY1?TEST
                CODE    04CAH     001EH     INBLOCK      ?PR?DELAY2?TEST
                CODE    04E8H     001EH     INBLOCK      ?PR?DELAY3?TEST
                CODE    0506H     0018H     INBLOCK      ?PR?_WRITE_BIT?TEST
                CODE    051EH     000FH     UNIT         ?C_INITSEG
                CODE    052DH     000EH     INBLOCK      ?PR?STROB_LE?TEST
                CODE    053BH     0009H     INBLOCK      ?PR?INIT?TEST
    
    

    Dodatkowo do każdego modułu mam:
    
    
    NAME                                    CLASS   MSPACE  TYPE    OFFSET  SIZE
    ====                                    =====   ======  ====    ======  ====
    
    
    P1 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0090H  1
    P3 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00B0H  1
    blink. . . . . . . . . . . . . . . . .  EXTERN   DATA   U_CHAR   -----  1
    anim . . . . . . . . . . . . . . . . .  EXTERN   DATA   U_CHAR   -----  1
    anim_brak. . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
    anim_lad . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
    _pnt_anim. . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
      n. . . . . . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0000H  1
    _pnt_bat . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
      n. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0007H  1
      f. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0007H  1
      t. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0006H  1
    _pnt_tab . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
      a. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0007H  1
      b. . . . . . . . . . . . . . . . . .  AUTO     DATA   INT      0000H  2
      s. . . . . . . . . . . . . . . . . .  AUTO     DATA   PTR      0002H  3
      i. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0007H  1
      c. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0006H  1
    zeg_anim . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
    anim_stop. . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
    bat_tab. . . . . . . . . . . . . . . .  PUBLIC   CODE   ARRAY    0000H  16
    anim_roz . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
      n. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0007H  1
    pam_obr. . . . . . . . . . . . . . . .  EXTERN   IDATA  ARRAY    -----  32
    z0_ss. . . . . . . . . . . . . . . . .  EXTERN   DATA   U_CHAR   -----  1
    xy . . . . . . . . . . . . . . . . . .  EXTERN   DATA   U_CHAR   -----  1
    
    
    MODULE INFORMATION:   STATIC OVERLAYABLE
       CODE SIZE        =    176    ----
       CONSTANT SIZE    =     16    ----
       XDATA SIZE       =   ----    ----
       PDATA SIZE       =   ----    ----
       DATA SIZE        =   ----       6
       IDATA SIZE       =   ----    ----
       BIT SIZE         =   ----    ----
    END OF MODULE INFORMATION.
    

    Dzięki takim statystykom szybko odczytuje to co potrzeba.

    Oczywiście ktoś mógłby powiedzieć że jak mi się coś nie podoba to powinienem kupić sobie inny kompilator, ale przecież nie o to tu chodzi.

    Chciałbym się zapytać kolegów czy istnieje jakiś sposób wygenerowania podobnych raportów w WinAvr może po prostu są już jakieś narzędzia wyciągające z piku *.elf
    klarowne statystyki?
  • #7 7010641
    tmf
    VIP Zasłużony dla elektroda
    Nie czytasz odpowiedzi:
    
    avr-nm --size-sort MasterHeaterCntrl.elf
    
    000000b0 T free
    000000b6 T _ZN11TMFSerialFS4ReadEP6HandlePcj
    000000b8 T _ZN9OW_DS182014GetTemperatureEb
    000000be T _ZN7OneWire13GetNextDeviceEPhhP7OWDevID
    000000be T __vector_21
    000000c0 T _ZN16TemperatureClass14GetTemperatureEPc
    000000c6 T _ZN16SolarSetUpWindow5SetUpEv
    000000c6 T main
    000000ca T _ZN6TMFApp15DispatchMessageEv
    000000ca T _ZN9TMFObject5PaintEP9LCDDriver
    000000cc T _ZN7OneWire9SetROMPosEPKhh
    000000dc T _ZN13RotaryEncoder16EncoderInterruptEv
    000000de T _ZN9LCDDriver8DrawRectER5TRecthjj
    000000e2 T _ZN7TMFMenu5SetUpEv
    000000e6 T _ZN7TMFMenu15DispatchMessageEP8TMFEvent
    000000ec T _ZN9LCDDriver6DrawToEhh
    000000f2 T _ZN3LOG10GetNextMsgER11LogMemEntry
    000000f8 T _ZN3LOG10GetPrevMsgER11LogMemEntry
    000000f8 T __vector_15
    000000fe T _ZN9TMFWindow5PaintEP9LCDDriver
    00000100 T _ZN7TMFMenu14SelectMenuItemEv
    00000108 T _ZN8TMFFontsC1EP6Handleh
    00000108 T _ZN8TMFFontsC2EP6Handleh
    00000118 T _ZN3LOG8EraseMsgEl
    0000012c T _ZN11TMFSerialFS11GetDirEntryEPPv
    00000136 T _ZN11TMFSerialFS4OpenEPKc
    00000136 T _ZN6TMFAppC1Ev
    00000136 T _ZN6TMFAppC2Ev
    00000138 T _ZN11TMFDateTime5PaintEP9LCDDriver
    00000142 T _ZN12TMFEEPROMReg11AddRegEntryEPKcPvj
    0000015a T malloc
    00000164 T _ZN8TMFFonts10GetCharAdrEPccRhS1_
    00000182 T _ZN9TMFButton5PaintEP9LCDDriver
    00000186 T _ZN10TMFMenuBar5PaintEP9LCDDriver
    0000019a T _ZN9LCDDriver7LCDInitEv
    000001ba T _ZN7TMFMenu5PaintEP9LCDDriver
    000001ce T _ZN9LCDDriver9WriteTextEPKc
    000001ea T _ZN9TMFBitmap14RenderToScreenEP9LCDDriverR5TRect
    000001ea T _ZN9TMFSlider5PaintEP9LCDDriver
    0000021a T _ZN10TMFSpinBox5PaintEP9LCDDriver
    000002ae T _ZN3LOGC1EP9I2CMemoryll
    000002ae T _ZN3LOGC2EP9I2CMemoryll
    0000039c T _ZN3LOG3AddEP11LogMemEntry
    000003b6 T _ZN16SolarSetUpWindow13CreateWidgetsEv
    000027d0 t _ZL4font
    


    Nazwy sa dziwnie przemanglowane bo to c++, ale bez problemu mozna je automatycznie zdemanglowac. Poczytaj manual do narzedzi gcc.
REKLAMA