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

[ARM] Jak skonfigurować semihosting w Eclipse z Linaro i OpenOCD?

alagner 03 Mar 2013 15:27 3510 17
REKLAMA
  • #1 12011439
    alagner
    Poziom 26  
    Posty: 768
    Pomógł: 85
    Ocena: 29
    Jak w temacie - miał ktoś z tym do czynienia, ma pomysł jak toto użreć? Bo czasem wysyłanie debuga na uart jest jednak mało wygodne i kusi żeby zrobić to wprost przez debuger. Póki co w ramach wprawki kombinuję z tym w CoIDE na ichnim gotowcu, docelowo chciałbym to jakoś odpalić na zestawie Eclipse+Linaro+OpenOCD. Jakieś doświadczenia?

    pzdr.
  • REKLAMA
  • #2 12011742
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Dawno temu użyłem tego na ARM7 (; Generalnie w źródłach OpenOCD jest przykładowy kod który taki semihosting demonstruje, potem jest chyba jeszcze jakaś opcja w OpenOCD która to włącza i tyle... Chyba [;

    4\/3!!
  • REKLAMA
  • #3 12011876
    alagner
    Poziom 26  
    Posty: 768
    Pomógł: 85
    Ocena: 29
    W OpenOCD uruchamia się toto parametrem -c "init; arm semihosting enable", tyle doczytałem w dokumentacji, teraz w konsoli komunikaty kończą się na semihosting. Bardziej chodzi mi o kod w C, ale jak jest w źródłach to poszukam, dzięki :)
  • #4 12012252
    imarszi
    Poziom 14  
    Posty: 150
    Pomógł: 6
    Ocena: 6
    Chodzi ci o tą funkcję z CMSIS
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    ?

    This function transmits a character via the ITM channel 0.
    It just returns when no debugger is connected that has booked the output.
    It is blocking when a debugger is connected, but the previous character send is not transmitted.

    \param [in] ch Character to transmit
    \return Character to transmit
    A potem w syscalls.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    I potem standardowo printf, ale nigdy tego nie próbowałem.

    Dodano po 1 [godziny] 49 [minuty]:

    Nie o to ci chodziło :)
    Doczytałem i zrobiłem tak jak jest to opisane w readme.txt linaro
    opcje dla linkera
    LD_FLAGS += --specs=rdimon.specs -Wl,--start-group -lgcc -lc -lc -lm -lrdimon -Wl,--end-group
    usunąłem plik syscals.c i wszystko ładnie się skompilowało
    Odpaliłem OpenOCD z opcjami openocd -f scripts/board/stm32f4discovery.cfg -c "init; arm semihos"
    OpenOCD odpisał "semihosting is enabled".

    ale printf nie działa :( a to chyba o to chodzi ?
  • #5 12013054
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Przecież napisałem, że kod który korzysta z semihostingu jest w źródłach OpenOCD (w folderze contrib). Nie wiem co rdimon ma z tym wspólnego, ale coś czuję że nic...

    4\/3!!
  • #6 12013368
    imarszi
    Poziom 14  
    Posty: 150
    Pomógł: 6
    Ocena: 6
    Chyba ma
    Z readme.txt dla Linaro

    ** semihosting
    You can add the following line to the linker script (e.g. a.ld) to include
    the semihosting library in a group (recommended).

    GROUP(libgcc.a libc.a libm.a librdimon.a)

    Then compile the programs like:
    $ arm-none-eabi-gcc --specs=rdimon.specs -T a.ld $(OTHER_OPTIONS)

    Or you can add -lrdimon in the cmd line and compile the programs like:
    $ arm-none-eabi-gcc --specs=rdimon.specs \
    -Wl,--start-group -lgcc -lc -lm -lrdimon -Wl,--end-group $(OTHER_OPTIONS)

    oraz

    https://answers.launchpad.net/gcc-arm-embedded/+question/212673

    A w contrib do OPenOCD masz komunikację po ITM pisałem o tym wyżej i komunikację przez DCC ale to hyba nie jest semihosting.
  • REKLAMA
  • #7 12013487
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Nastąpiło małe zamieszanie. Rdimon to kod, który pozwala na zaawansowaną komunikację debuggera z układem, dzięki czemu układ ma dostęp np. do systemu plików na komputerze PC. Za to oryginalne pytanie było tylko o to, w jaki sposób przekierować komunikaty z układu do OpenOCD, zamiast na przykład na UART (i terminal).

    4\/3!!
  • #8 12347672
    alagner
    Poziom 26  
    Posty: 768
    Pomógł: 85
    Ocena: 29
    Uruchomiłem. Z tym, że mam jedno pytanko jeszcze:

    w przykładach do najnowszego linaro jest kod dla semihostingu.
    Pytanie zasadnicze: gdzie w tym kodzie (nie wiem czy w startupie czy skrypcie linkera) jest wywołanie "initialise_monitor_handles"? Bo w swoim kodzie muszę to zrobić ręcznie, w tym linarowym jest z automatu.
  • #9 12348365
    imarszi
    Poziom 14  
    Posty: 150
    Pomógł: 6
    Ocena: 6
    Możesz napisać co i jak zrobiłeś ? Bo ja się trochę pogubiłem :)
  • #10 12348452
    alagner
    Poziom 26  
    Posty: 768
    Pomógł: 85
    Ocena: 29
    Bazując na przykładzie Freddiego:

    na początku programu dopisujemy funkcję:
    initialise_monitor_handles();
    dołączamy funkcję _sbrk_r (np. z syscallsów Freddiego albo dowolną inną która zadziała)

    do Makefile'a dodajemy:
    LIBS += -lrdimon
    LD_FLAGS += --specs=rdimon.specs

    Natomiast do wywołania gdb dopisujemy
    monitor arm semihosting enable

    To wszystko można jeszcze ładnie obudować przez #ifdef i ifeq zależnie od potrzeb.

    No i możemy cieszyć się printfem w konsoli openocd. ;)
  • #11 12348539
    imarszi
    Poziom 14  
    Posty: 150
    Pomógł: 6
    Ocena: 6
    Czyli robiłem wszystko poza initialise_monitor_handles();.
    A operacje na plikach działają ?
  • #12 12348613
    alagner
    Poziom 26  
    Posty: 768
    Pomógł: 85
    Ocena: 29
    Testowałem póki co fputs i fgets i jest ok
  • #13 13123782
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Próbuję z ciekawości uruchomić ten semihosting, i za żadne skarby nie dostaje nic w konsoli.
  • REKLAMA
  • #14 13124119
    alagner
    Poziom 26  
    Posty: 768
    Pomógł: 85
    Ocena: 29
    Nie chcę skłamać teraz, bo nie do końca pamiętam, ale chyba na dzień dobry startup nie powinien skakać do SystemInit i main, tylko bodajże do __start czy jakoś tak. Wtedy wszystko powinno dobrze wystartować.

    Pzdr.
  • #15 13124138
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Tak skacze do start
    zmodyfikowałem symbole w linkerze do cie pluł,
    dodałem rdimon
    to spec
    usunąłem w makefile flage nostartup, żeby skoczył do start
    monitor enable to gdb i d...

    Dodano po 13 [minuty]:

    OK działa.
    Dodałem całe syscallsy freddiego zamiast tylko sbrk_r
  • #16 13870238
    grzegorzn
    Poziom 13  
    Posty: 129
    Pomógł: 3
    Ocena: 5
    Próbuję zlinkować z rdimon, ale linker nie potrafi znaleźć tej biblioteki. Co powinienem doinstalować?

    arm-none-eabi-g++ -mcpu=cortex-m4 -mthumb -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -Wall -Wextra -g3 -T "C:\Users\Grzegorz\stm32_workspace\eth_test\ldscripts\STM32F437II_FLASH.ld" -Xlinker --gc-sections -L"../ldscripts" -Wl,-Map,"eth_test.map" -lrdimon --specs=rdimon.specs -o "eth_test.elf" [tutaj pliki .o]
    arm-none-eabi-g++: error: rdimon.specs: No such file or directory
  • #17 13870368
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Skorzystać z semihostingu od coocoxa.
    Mniej upierdliwy i lżejszy
  • #18 13870524
    grzegorzn
    Poziom 13  
    Posty: 129
    Pomógł: 3
    Ocena: 5
    Dzięki, działa.

    To jeszcze pytanie przy okazji: jak zrobić retargetowanie printfa na SH_SendString? Znalazłem trochę opisów, ale nie widzę dla zestawu GCC(Sourcery_CodeBench) + Eclipse. Gdy włączę opcję "Do not use default libraries (-nodefaultlibs)" wówczas linker czepia się braku syscalli. Umieszczam więc SH_SendString(ptr); w _write, ale funkcja ta nie jest wywoływana. Tekst nie jest wyrzucany, a program nie zatrzymuje się na breakpoincie ustawionym na _write.

    [edyta]
    OK, już wiem. printf() buforuje tekst jeśli nie ma przejścia do nowej linii. Z przejściem działa od razu, _write() się wykonuje.

Podsumowanie tematu

✨ W dyskusji poruszono temat konfiguracji semihostingu w środowisku Eclipse z użyciem Linaro i OpenOCD. Użytkownicy dzielili się doświadczeniami związanymi z włączaniem semihostingu w OpenOCD poprzez polecenie "arm semihosting enable" oraz implementacją funkcji _write do przesyłania danych. Wskazano na konieczność dodania odpowiednich flag do Makefile oraz użycia biblioteki rdimon. Uczestnicy wymienili się informacjami na temat kodu źródłowego, który umożliwia komunikację z debuggerem oraz testowali różne funkcje, takie jak fputs i fgets. Pojawiły się również pytania dotyczące inicjalizacji monitorów oraz retargetowania printf na SH_SendString.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA