Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ARM GCC compiler problem z własnym skryptem linkera i plikiem .hex

03 Kwi 2019 14:08 609 9
  • Poziom 5  
    Witam.

    Aktualnie walczę z kompilatorem GCC non-eabi. Chcę utwożyć projekt w C++ używając własnego skryptu linkera, jednak po długiej walce nie mam już pomysłu na rozwiązanie. W jaki sposób skonfigurować kompilator, linkera oraz skrypt linkera tak abym mógł własne tablice zdefiniowane w plikach .cpp wstawić w wybrane prze zemnie miejsce w pamięci?

    Wersja:
    ARM GCC compiler problem z własnym skryptem linkera i plikiem .hex


    Compiler control string:
    -c
    -mcpu=cortex-m3
    -mthumb -gdwarf-2
    -MD -Wall -O0
    -mapcs-frame
    -mthumb-interwork
    -IC:/Keil_v5/ARM/CMSIS/Include
    -I"C:/Program Files (x86)/GNU Tools ARM Embedded/8 2018-q4-major/arm-none-eabi/include"
    -I"C:/Program Files (x86)/GNU Tools ARM Embedded/8 2018-q4-major/lib/gcc/arm-none-eabi/8.2.1/include"
    -I"C:/Program Files (x86)/GNU Tools ARM Embedded/8 2018-q4-major/arm-none-eabi/include/c++/8.2.1"
    -I"C:/Program Files (x86)/GNU Tools ARM Embedded/8 2018-q4-major/arm-none-eabi/include/c++/8.2.1/arm-none-eabi"
    -D__UVISION_VERSION="526"
    -D__GCC
    -D__GCC_VERSION="821"
    -DSTM32F10X_MD -DSTM32F10X_MD
    -o *.o


    Linker control script:
    -T ./linker_script.ls
    -mcpu=cortex-m3 -mthumb
    -mthumb-interwork
    -o ./Objects/TEST_GCC.elf
    *.o
    -nostartfiles
    -nodefaultlibs
    -lm


    Plik main.cpp
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Skrypt linkera:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Błędy wyświetlane przez generator hex:
    Rebuild target 'Target 1'
    compiling main.cpp...
    linking...
    creating hex file...
    C:\Program Files (x86)\GNU Tools ARM Embedded\8 2018-q4-major\bin\arm-none-eabi-objcopy.exe: ./Objects/TEST_GCC.hex 64-bit address 0x4b4fa308000000 out of range for Intel Hex file
    C:\Program Files (x86)\GNU Tools ARM Embedded\8 2018-q4-major\bin\arm-none-eabi-objcopy.exe:./Objects/TEST_GCC.hex: bad value
    ".\Objects\TEST_GCC.elf" - 0 Error(s), 0 Warning(s).
    Build Time Elapsed: 00:00:00

    Pozdrawiam
    Marcus
  • Specjalista - Mikrokontrolery
    Twój skrypt linkera jest prosty. Zbyt prosty. W nim naprawdę musi być dużo więcej rzeczy, dla projektów w C++ nawet jeszcze wiecej niż dla projektów w C. Znajdź sobie jakiś przykładowy, użyj skryptu z paczek CubeF1 albo popatrz na skrypt przykładowy kompilatora (w którym znów jest trochę za dużo bajerów a znów brak podziału na flash/RAM) - arm-none-eabi-gcc-8.3.0-190223/arm-none-eabi/lib/ldscripts/armelf.x
  • Poziom 1  
  • Poziom 38  
    użyj starszej wersji gcc
  • Specjalista - Mikrokontrolery
    tadzik85 napisał:
    użyj starszej wersji gcc

    Świetna sugestia. Problem jest w skrypcie linkera, który zawiera gdzieś 10% potrzebnych informacji. Co tu ma zmienić starsza wersja GCC?
  • Poziom 1  
  • Poziom 20  
    Marcus_Demoman napisał:
    C:\Program Files (x86)\GNU Tools ARM Embedded\8 2018-q4-major\bin\arm-none-eabi-objcopy.exe: ./Objects/TEST_GCC.hex 64-bit address 0x4b4fa308000000 out of range for Intel Hex file

    Wygląda na to, że używasz 32-bitowego kompilatora w środowisku 64-bitowym.
    Akurat ta wersja ma z tym problem. Proponuję zainstalować poprawiony toolchain: Link
    Wystarczy nawet użyć arm-none-eabi-objcopy.exe ze starszej wersji albo
    tadzik85 napisał:
    użyj starszej wersji gcc
  • Poziom 5  
    Witam i dziękuję za zainteresowanie tematem.

    Moim celem jest napisanie klasy która zarządzałaby umieszczoną w pamięci FLASH tablicą wektorów przerwań. Chodzi o to aby w tablicy znajdowały się wskaźniki na statyczne metody tej klasy. W momencie wystąpienia przerwania następowałby skok do funkcji obsługi przerwania (czyli do statycznej metody klasy), a z kolei metoda ta wywoływałaby metody innych klas.

    Jak na razie poczyniłem następujące kroki:

    Pobrałem 64 bitową wersję toolchain-a:

    ARM GCC compiler problem z własnym skryptem linkera i plikiem .hex

    Archiwum rozpakowałem i przeniosłem folder o nazwie "8.2.1-1.4-20190214-0604" do istniejącego już folderu z 32 bitową wersją GCC:
    ARM GCC compiler problem z własnym skryptem linkera i plikiem .hex

    Ustawiłem nową ścieżkę do kompilatora jako "C:\Program Files (x86)\GNU Tools ARM Embedded\8.2.1-1.4-20190214-0604",
    oraz ścieżkę "Tool Base Folder" jako "C:\Program Files (x86)\GNU Tools ARM Embedded\8.2.1-1.4-20190214-0604\arm-none-eabi":
    ARM GCC compiler problem z własnym skryptem linkera i plikiem .hex

    Po zamknięcu powyższej zakładki i ponownym jej otworzeniu pole "BIN" przestawiło się na nowy folder:
    ARM GCC compiler problem z własnym skryptem linkera i plikiem .hex

    Nasępnie wykonałem ponowną kompilację.

    Flagi kompilatora:
    -c -mcpu=cortex-m3
    -mthumb
    -gdwarf-2
    -MD
    -Wall
    -O0
    -mapcs-frame
    -mthumb-interwork
    -I"C:/Program Files (x86)/GNU Tools ARM Embedded/8.2.1-1.4-20190214-0604/arm-none-eabi/CMSIS/Include"
    -I"C:/Program Files (x86)/GNU Tools ARM Embedded/8.2.1-1.4-20190214-0604/arm-none-eabi/include"
    -I"C:/Program Files (x86)/GNU Tools ARM Embedded/8.2.1-1.4-20190214-0604/lib/gcc/arm-none-eabi/8.2.1/include"
    -I"C:/Program Files (x86)/GNU Tools ARM Embedded/8.2.1-1.4-20190214-0604/arm-none-eabi/include/c++/8.2.1"
    -I"C:/Program Files (x86)/GNU Tools ARM Embedded/8.2.1-1.4-20190214-0604/arm-none-eabi/include/c++/8.2.1/arm-none-eabi"
    -D__UVISION_VERSION="526"
    -D__GCC
    -D__GCC_VERSION="821"
    -DSTM32F10X_MD
    -DSTM32F10X_MD
    -o
    *.o


    Flagi linkera:
    -T ./linker_script.ls
    -mcpu=cortex-m3
    -mthumb
    -mthumb-interwork
    -o ./Objects/TEST_GCC.elf
    *.o
    -nostartfiles
    -nodefaultlibs
    -lm

    Rezultat:
    Rebuild target 'Target 1'
    compiling main.cpp...
    linking...
    creating hex file...
    ".\Objects\TEST_GCC.elf" - 0 Error(s), 0 Warning(s).
    Build Time Elapsed: 00:00:01

    Moim głównym celem jest poznanie procesora i sposobu jego działania. Chcę wiedzieć co gdzie trafia dlaczego i co o tym decyduję.

    Skoro hex się generuje to czas powalczyć ze skryptem linkera. Czy jesteś Freddie w stanie pokrótce wymienić elementy jakie musi zawierać skrypt linkera aby poprawnie działał z kodem źródłowym napisanym w C++ ?
  • Specjalista - Mikrokontrolery
    Marcus_Demoman napisał:
    Skoro hex się generuje to czas powalczyć ze skryptem linkera. Czy jesteś Freddie w stanie pokrótce wymienić elementy jakie musi zawierać skrypt linkera aby poprawnie działał z kodem źródłowym napisanym w C++ ?


    Freddie Chopin napisał:
    popatrz na skrypt przykładowy kompilatora (w którym znów jest trochę za dużo bajerów a znów brak podziału na flash/RAM) - arm-none-eabi-gcc-8.3.0-190223/arm-none-eabi/lib/ldscripts/armelf.x


    Albo dowolny skrypt z przykładowych projektów udostępnionych na mojej stronie domowej.
    Albo skrypt z distortos, np. https://github.com/DISTORTEC/distortos/blob/m...ce/board/ST_NUCLEO-F103RB/ST_NUCLEO-F103RB.ld
  • Poziom 38  
    Freddie Chopin napisał:
    tadzik85 napisał:
    użyj starszej wersji gcc

    Świetna sugestia. Problem jest w skrypcie linkera, który zawiera gdzieś 10% potrzebnych informacji. Co tu ma zmienić starsza wersja GCC?


    To, że wszem i wobec wiadomo, że są z nią problemy na maszynach 64-bit. Na co dokładnie wskazuje błąd kompilacji.