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

Duży kod wynikowy przy pustej funkcji main w STM32F103 na Linuxie - czy to normalne?

amostom 10 Mar 2017 21:26 1314 14
REKLAMA
  • #1 16336740
    amostom
    Poziom 9  
    Posty: 144
    Ocena: 76
    Witam
    Zaczynam moje starcia z stm32f103 na linuxie. Poprzednio pracowałem a avr. Zainstalowałem środowisko AC6 głównie z powodu że jest na eclipsie. Mimo że używam AC6 bazuje na rejestrach bez używania bibliotek. Jedyne co mnie zaciekawiło to duży kod wynikowy na samym początku. Sama funkcja main i while i kod wynikowy ma 2440 bajtów ? Czy to jest prawidłowe ? Ustawienie jednego rejestru zabiera kolejne 100 bajtów ? Wydaje mi się troszkę za dużo ? Pomoże ktoś ? Pozdrawiam.
  • REKLAMA
  • #3 16336826
    Badmaneq
    Poziom 23  
    Posty: 567
    Pomógł: 76
    Ocena: 23
    Strzelam - startup inicjuje pamięć ustawia wektory, itd., itp.
  • #4 16336870
    amostom
    Poziom 9  
    Posty: 144
    Ocena: 76
    Oto projekt:
    #
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    A tutaj log:
    
    21:57:39 **** Incremental Build of configuration Debug for project HelloStm32 ****
    make all 
    Building file: ../src/main.c
    Invoking: MCU GCC Compiler
    /home/cybertom/ARM_workspace/HelloStm32/Debug
    arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -mfloat-abi=soft -DSTM32F1 -DNUCLEO_F103RB -DSTM32F103RBTx -DSTM32 -DDEBUG -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD -I/home/cybertom/ARM_workspace/HelloStm32/inc -I/home/cybertom/ARM_workspace/HelloStm32/CMSIS/device -I/home/cybertom/ARM_workspace/HelloStm32/CMSIS/core -I/home/cybertom/ARM_workspace/HelloStm32/StdPeriph_Driver/inc -I/home/cybertom/ARM_workspace/HelloStm32/Utilities/STM32F1xx-Nucleo -O0 -g3 -Wall -fmessage-length=0 -ffunction-sections -c -MMD -MP -MF"src/main.d" -MT"src/main.o" -o "src/main.o" "../src/main.c"
    Finished building: ../src/main.c
    
    Building target: HelloStm32.elf
    Invoking: MCU GCC Linker
    arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -mfloat-abi=soft -T"/home/cybertom/ARM_workspace/HelloStm32/LinkerScript.ld" -Wl,-Map=output.map -Wl,--gc-sections -lm -o "HelloStm32.elf" @"objects.list" 
    Finished building target: HelloStm32.elf
    
    make --no-print-directory post-build
    Generating binary and Printing size information:
    arm-none-eabi-objcopy -O binary "HelloStm32.elf" "HelloStm32.bin"
    arm-none-eabi-size "HelloStm32.elf"
    text	 data	 bss	 dec	 hex	filename
    1076	 1076	 288	 2440	 988	HelloStm32.elf
    
    
    21:57:39 Build Finished (took 211ms)
    
    


    Zapewne coś spaprałem tylko nie wiem co.
  • #5 16336891
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    To z pewnością nie jest PEŁNY log kompilacji. Tak jak już Badmaneq napisał, pewnie dokompilowywuje Ci połowę HALa czy nie wiadomo czego i tak jest efekt.

    Zresztą. Wejdź sobie do folderu gdzie jest ten wygenerowany plik elf i wpisz w konsoli:

    arm-none-eabi-nm --print-size --size-sort --reverse-sort --demangle HelloStm32.elf

    Dostaniesz informację o rozmiarze każdego obiektu (funkcji i zmiennych), posortowaną malejąco po rozmiarze.
  • REKLAMA
  • #6 16336963
    amostom
    Poziom 9  
    Posty: 144
    Ocena: 76
    To może tak proszę o info ile mniej więcej powinien zajmować taki kod po kompilacji ? Będę kombinował bo ona razie nie ogarniam tego ARM i kompilatora
    A może ktoś zna tutek gdzie znajdę czysty toolchain i jak to powiązać z Eclipse bez żadnych dodatkowych bibliotek ?
    Pozdrawiam
  • #8 16338506
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #9 16338706
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Piotrus_999 napisał:
    832 bajty startup-u

    Przy porównywaniu weź pod uwagę, że powyżej specjalnie zostawiłem zerową optymalizację <: Przy -O2 jest 744, a przy -Os - 716 <: I to włącznie z miganiem LEDem i ustawianiem PLL w mało optymalny sposób (parametry się automatycznie wyliczają w run-time).
  • #10 16338906
    Konto nie istnieje
    Konto nie istnieje  
  • #11 16339508
    amostom
    Poziom 9  
    Posty: 144
    Ocena: 76
    Dziękuję za odpowiedź. Po prostu przechodzę z avr a tam przy pustej main bylo nieco ponad 100 bajtów. Liczyłem że będzie coś więcej bo to przecież inne próbki ale takiego się nie spodziewałem Ale dziękuję za odpowiedź.
  • REKLAMA
  • #12 16339620
    Konto nie istnieje
    Konto nie istnieje  
  • #13 16339635
    rb401
    Poziom 39  
    Posty: 3002
    Pomógł: 750
    Ocena: 984
    amostom napisał:
    Po prostu przechodzę z avr a tam przy pustej main bylo nieco ponad 100 bajtów.


    Bez sensu to Twoje porównanie. To przecież dwa różne światy.
    Sama tablica wektorów przerwań w F103 to 200bajtów (ok. 50 wektorów * 32 bitowy adres). Plus inicjalizacja rejestrów i samego C, plus ustawienie zegara. Wychodzi 1k, jest bardzo dobrze.
    Nie ma się co tym przejmować, szkoda życia. Tym bardziej że jak piszesz dopiero wchodzisz w ARM. Takie analizy zostaw sobie na później.
    To przecież tylko 1k ze 128k które masz do dyspozycji.

    Jeśli mógłbym coś zasugerować, to właśnie porzucenie pewnych lęków i przyzwyczajeń z 8-bitowców AVR, tego, za przeproszeniem, permanentnego dziadowania i kompromisów.
    A to dyktatura dwóch różnych pamięci i makro "F" czy jakieś dziwadło progmem. Ciasnota 16bitowej przestrzeni adresowej. Strach przed używaniem zmiennego przecinka i dłuższych integerów. I tym podobne liczne "atrakcje". Tego w STM32 nie ma. Ciesz się przestrzenią i wolnością, nie szukaj problemów gdzie ich nie ma, bo i tak, przy poznawaniu STM32, problemy (tyle że innego rodzaju) znajdą Ciebie :P .
  • #14 16339673
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    rb401 napisał:
    Sama tablica wektorów przerwań w F103 to 200bajtów (ok. 50 wektorów * 32 bitowy adres).

    Nawet więcej, bo jest 16 wektorów rdzenia, a STM32F1 mają przynajmniej 60 swoich własnych (max 68 w connectivity) - razem więc jest 76-84, co daje przynajmniej 304 bajty. Do tego często dochodzą osobne handlery dla każdego przerwania (sam zacząłem tam jakiś czas temu robić, ponieważ ułatwia to debuggowanie gdy wiadomo które przerwanie się wywołało, a nie "Default_Handler"), a więc jeszcze MINIMUM 2 bajty na każde (rozmiar "wąskiej" wersji instrukcji skoku bezwarunkowego [nieskończona pętla]).

    W każdym razie taka naprawdę PUSTA funkcja main(), bez żadnej inicjalizacji GPIO, zegarów itd, a wiec mamy tylko i wyłącznie startup, wektory i pusty main (optymalizacja -Os, w przykładowym projekcie jest jeden wspólny Default_Handler):

    Kod: text
    Zaloguj się, aby zobaczyć kod

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik zadał pytanie dotyczące dużego rozmiaru kodu wynikowego (2440 bajtów) przy pustej funkcji main w projekcie STM32F103 na systemie Linux, korzystając z środowiska AC6. Odpowiedzi wskazują, że duży rozmiar kodu jest normalny, ponieważ startup inicjuje pamięć i ustawia wektory przerwań, co zajmuje znaczną ilość pamięci. Użytkownicy sugerują sprawdzenie pełnego logu kompilacji oraz użycie narzędzi do analizy rozmiaru plików ELF, aby zrozumieć, które elementy zajmują najwięcej miejsca. Wskazano również, że porównania z platformą AVR mogą być mylące, ponieważ architektury różnią się znacznie pod względem zarządzania pamięcią i struktury kodu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA