Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie

moscow18-1990 27 Dec 2016 17:59 3900 56
Computer Controls
  • #1
    moscow18-1990
    Level 8  
    Dzień Dobry,
    Mam pytanko odnośnie ewentualnego pisania programów w C++ i wykorzystania przy tym co najmniej standardu C++11. Posiadam "wzorcowe" projekty pod dwie płytki w Eclipse: STM32 F103RB i L053R8. Pytanie brzmi: czy należy podmienić coś w plikach makefile, żeby było możliwe korzystanie z samego języka C++ jak i co najmniej ze standardu C++11? Posiada ktoś jakieś doświadczenia w tej materii?
  • Computer Controls
  • Helpful post
    #2
    Freddie Chopin
    MCUs specialist
    Nie wiemy jakie są te Twoje projekty i co jest w Makefile które masz.

    C++11 na pewno da się używać. Nawet cały RTOS się da w tym napisać (; .

    http://distortos.org/

    W tym projekcie masz Makefile które możesz potraktować jako wzór, jednak zasadniczo w samych tych plikach zbyt dużo do samego standardu nie ma. Jakby co to pytaj konkretnie - sam używam C++11 odkąd jeszcze nazywał się C++0x (;
  • Computer Controls
  • #3
    moscow18-1990
    Level 8  
    Ok. Przeprowadziłem eksperyment. Jeżeli chodzi o Cortex M3 to dodałem plik z rozszerzeniem cpp i kompilacja przebiegła bez błędów. Tylko nie działa standard C++11 tylko jakiś starszy. Sprawdziłem to dodając słowo kluczowe auto, które podobno jest elementem języka od chwili pojawienia pojawienia się standardu C++11. Poniżej zdjęcie ilustrujące pewne mankamenty: Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie

    Jest tam -std=gnu++98. Wydaje mi się, że tutaj musi nastąpić zmiana. Tylko pytanie - gdzie dokładnie? W indekserze, pliku makefile a może jeszcze w jakimś innym miejscu?

    Jeżeli chodzi o Cortex M0+ to dodanie takiego pliku z rozszerzeniem cpp powoduje zawieszenie się Eclipse podczas kompilacji i generalnie są błędy. Porównałem dwa pliki makefile z obydwu projektów. Są różnice. Poniżej zdjęcia z kompilacji projektu z Cortex M0+:

    Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie

    Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie

    Plik makefile z projektu Cortex M3:
    Code: c
    Log in, to see the code


    Plik makefile z projektu Cortex M0+:

    Code: c
    Log in, to see the code



    Tutaj na obrazku przedstawiam różnice, które mogą mieć moim zdaniem jakieś znaczenie(chodzi o pola CXX_DEFS i C_DEFS):

    Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie



    Podsumowując, pytanie brzmi co trzeba zrobić, żeby wykorzystać co najmniej standard C++11. Czy jest to kwestia ustawień w indekserze, pliku makefile? To dość skomplikowane i potrzebowałbym rady w tym zakresie. Będę wdzięczny za jakąkolwiek pomoc.
  • Helpful post
    #4
    Freddie Chopin
    MCUs specialist
    Aby "używać" wystarczy zmienić standard w Makefile. Aby "używać wygodnie" warto również zmienić ustawienia indeksera w Eclipse, ponieważ bez tego Eclipse będzie się czepiał poprawnego kodu i będą problemy z generowanie podpowiedzi. Niemniej jednak na pewno nie ma znaczenia to czy zmienisz ustawienia indeksera dla kompilacji projektu.

    To że ten drugi projekt się nie kompiluje na 99% nie ma nic wspólnego z wyjątkowo nieistotnymi (na tym etapie) różnicami w Makefile. Na moje oko w tym drugim projekcie masz coś bardzo solidnie namieszane w systemowym PATH, albo po prostu toolchain którego używasz ma jakiś problem z działaniem przy takich opcjach (mało prawdopodobne). Aby zobaczyć co tam ciekawego jest w systemowym PATH, dodaj na samym początku Makefile'a coś takiego:

    $(info PATH: $(PATH))

    A następnie zrób clean + build i wrzuć tutaj pełny log z konsoli. Najlepiej zrób to dla obydwóch projektów, aby było widać różnice. No i spróbuj raczej nie używać dwóch Eclipse na raz, bo nikt nie wie co się wtedy będzie działo.
  • #5
    moscow18-1990
    Level 8  
    1. Dodałem linię w makefile i zrobiłem printscreen z konsoli zarówno dla projektu CortexM0+ jak i M3. Jeżeli chodzi o zmienną PATH to w sumie może być problem bo robiłem przywracanie systemu aczkolwiek mimo tego przywracania Eclipse skonfigurowany dla CortexM3 wydaje się działać normalnie. Próbowałem teraz dodać zmienną PATH w Eclipse w: Project->Properties->C/C++ -> build-> Environment a także
    w Window->Preferences->C/C++ -> build-> Environment uwzględniając niezmienione ścieżki do: gcc-arm-none-eabi-4_9-150324 i msys znajdujące się na moim dysku D, ale dalej jest ten sam problem. Być może to przywracanie systemu coś zrobiło. Poniżej zdjęcia:

    Console z projektu CortexM0+:

    Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie

    Console z projektu CortexM3:

    Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie

    2. Druga sprawa dotyczy samego standardu C++11. W projekcie, który mi się normalnie kompiluje zrobiłem zmiany w makefile. Próbowałem użyć słów kluczowych tego standardu i jest taki problem, że Ctrl+Spacja "nie reaguje" na niektóre słowa kluczowe po wpisaniu oczywiście ich kilku pierwszych liter. Pytanie brzmi czy po zmianach w makefile może być tak, że mimo wszytko niektóre słowa kluczowe nie będą dostępne z jakiś względów. Podobnie jest w atmel toolchain, niektóre słowa kluczowe działają a niektóre nie działają. Zmiany, które dokonałem w pliku makefile przedstawiam poniżej:

    Code: c
    Log in, to see the code
  • Helpful post
    #6
    Freddie Chopin
    MCUs specialist
    moscow18-1990 wrote:
    Dodałem linię w makefile i zrobiłem printscreen z konsoli

    Jak widzę ten printscreeny które ludzie z takim zapamiętaniem wrzucają, to po prostu ręce mi opadają... Nie zauważyłeś, że linia o którą się rozchodzi jest dużo dłuższa niż szerokość ekranu i dalej nic nie widać? Nie można po prostu wziąć i skopiować tekstu, żeby nie trzeba się było bawić w te durne obrazki? Zrozum - nam jest potrzebny TYLKO I WYŁĄCZNIE TEKST, a nie obrazki z Twojego pulpitu...

    Po co Ci "Eclipse skonfigurowany dla CortexM3"? Przecież w samym Eclipse nie ma ani jednego ustawienia które miałoby cokolwiek wspólnego z tym czy używasz ARM Cortex-M0 czy ARM Cortex-M3 (czy PC, czy MIPS, czy cokolwiek-byś-nie-chciał). Nawet w samym toolchainie dla M3 i M0 nie ma różnic, zakładając że masz jakiś normalny, w którym są wszystkie potrzebne biblioteki. Prosty test - skompiluj te dwa projekty z konsoli Windowsa - jeśli się kompilują, to znaczy że masz namieszane coś w Eclipse, a co dokładnie, to już nie wiem. Ja mam jedno Eclipse do wszystkiego i nie mam w nim ŻADNYCH opcji specyficznych dla danych układów. Na pewno też nie ustawiałbym w Eclipse zmiennych systemowych bez bardzo wyraźnej potrzeby, a wydaje się, że to właśnie zrobiłeś i to właśnie jest problemem.

    moscow18-1990 wrote:
    Druga sprawa dotyczy samego standardu C++11. W projekcie, który mi się normalnie kompiluje zrobiłem zmiany w makefile. Próbowałem użyć słów kluczowych tego standardu i jest taki problem, że Ctrl+Spacja "nie reaguje" na niektóre słowa kluczowe po wpisaniu oczywiście ich kilku pierwszych liter. Pytanie brzmi czy po zmianach w makefile może być tak, że mimo wszytko niektóre słowa kluczowe nie będą dostępne z jakiś względów.

    Przecież napisałem, że nie będzie działać bez poprawnej konfiguracji indeksera.

    http://stackoverflow.com/a/26094959/157344

    No i oczywiście projekt musi być typu C++, a nie C.
  • #7
    User removed account
    User removed account  
  • #8
    moscow18-1990
    Level 8  
    W sumie jest trochę zamieszania i to wynika z faktu, że sam nigdy nie robiłem template-u projektu tylko importowałem gotowy projekt. Pewnie stąd są problemy. Postaram się to uporządkować i zrobić projekty dla płytek ewaluacyjnych, które posiadam.
  • #9
    Freddie Chopin
    MCUs specialist
    Czyli dalej nie wiemy w czym dokładnie problem, bo nie wrzucasz wszystkich danych, nie odpowiadasz na pytania, a teraz zaś będziesz "robił projekty dla płytek ewaluacyjnych", choć jeden projekt który Ci nie działa i nie wiadomo czemu.

    EDIT: W tym Eclipse gdzie nie działa - albo w samym IDE, albo w projekcie - masz podefiniowane jeszcze inne zmienne środowiskowe. Musisz usunąć wszystkie definicje które dodałeś ręcznie - wejdź do odpowiednich zakładek w opcjach Eclipse i opcjach projektu i kliknij w "Restore Defaults".

    Inną rzeczą są spacje w ścieżkach, których należy się wystrzegać jak ognia, a u Ciebie w ścieżce jest "D:\eclipse mars stm32 F103\eclipse;" - akurat widać tym razem nie przeszkadza, ale i tak lepiej to zmienić. I naprawdę nie są Ci potrzebne dwa Eclipse do dwóch różnych rzeczy.
  • #10
    moscow18-1990
    Level 8  
    Ok. Działa ten projekt z M0+. Trzeba było zmienić "Replace native environment with specified one" na "Append variables to native enviroment" w C/C++ -> build i teraz kompilacja przebiega normalnie.

    Tylko teraz pytanie odnośnie tych słów kluczowych standardu. Jeżeli uporządkuje sobie wszystkie rzeczy związane Eclipse, wygeneruje sobie template w C++ wybierając makefile project i na końcu dokonam konfiguracji indexera w oparciu o ten link do stackoverflow podany wyżej to czy wtedy już np. Ctrl+Spacja "zareaguje" na wszystkie słowa kluczowe standardu C++11? Chciałbym jakoś sprawdzić czy mogę już używać tego standardu całkowicie.
  • #11
    Freddie Chopin
    MCUs specialist
    moscow18-1990 wrote:
    Tylko teraz pytanie odnośnie tych słów kluczowych standardu. Jeżeli uporządkuje sobie wszystkie rzeczy związane Eclipse, wygeneruje sobie template w C++ wybierając makefile project i na końcu dokonam konfiguracji indexera w oparciu o ten link do stackoverflow podany wyżej to czy wtedy już np. Ctrl+Spacja "zareaguje" na wszystkie słowa kluczowe standardu C++11?

    Tak, będzie działać. Choć akurat "auto" nie podpowiada tak czy siak, ale constexpr czy static_assert działają jak należy.

    Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie

    Quote:
    Chciałbym jakoś sprawdzić czy mogę już używać tego standardu całkowicie.

    Do używania tego standardu nie jest Ci potrzebne Eclipse, a już tym bardziej jego podpowiedzi.
  • #12
    moscow18-1990
    Level 8  
    Ok. Postawiłem eclipse już normalnie robiąc makefile project. Działa to, ale dwie sprawy.

    1. Pierwsza. Przy projekcie z STM32F103RB pojawiają się dziwne małe znaki przy plikach z rozszerzeniem .c lub .cpp. Chcę pisać w C++ i stworzyłem C++ project. Może to jest powód? Jeżeli chodzi o STM32L053R8 to takie znaki się nie pojawiają. W sumie kompilacja przebiega normalnie, ale chciałbym pozbyć się tych znaków. Zamieszczam je na rysunku.
    Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie

    2. Druga związana z trzecią płytką. Posiadam STM32L476VG i chciałbym zrobić trzeci projekt. Pobrałem plik en.stm32cubel4 ze strony STM. Generalnie przeglądałem ten plik i znjadę tam skrypt linkera, plik startup, tablicę wektorów przerwań to przerobię z M3. Tylko problem jest taki, że nie mogę znaleźć odpowiedników folderów "hdr" i "inc" w których są pliki nagłówkowe umożliwiające m.in. korzystanie z rejestrów. Ktoś "składał" kiedyś taki projekt i wie gdzie można znaleźć takie pliki nagłówkowe?
  • Helpful post
    #13
    tadzik85
    Level 38  
    1. to oznaczenia podczas kompilacji wystąpiły warningi.
    2. poszukaj głębiej w podkatalogu CMSIS
  • #14
    Freddie Chopin
    MCUs specialist
    1. Znaki "klucza sześciokątnego" oznaczają, że dla danego pliku indekser wykrył jego ustawienia kompilacji. Jest to 100% prawidłowy objaw, a jeśli w jakimś projekcie tych znaków nie masz, to znaczy, że tam indekser nie działa. Dokładnie chodzi o tzw. "build output parser"

    2. Pliki te są w folderze typu STM32Cube_FW_F0_V1.7.0/Drivers/CMSIS/Device/ST/STM32F0xx/Include/stm32f0xx.h
  • #15
    moscow18-1990
    Level 8  
    Ok. W zasadzie projekty z M0+ i M3 działają. Mam mały problem z M4(zestaw STM32L476 Discovery) a mianowicie jest połączenie openocd z uC:
    Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie

    Tylko problem jest jak chcę przejść do pracy krokowej. W poprzednich projektach automatycznie pojawia mi się breakpoint w mainie. Tutaj nie ma żadnego zatrzymania a jak postawię pułapkę to wyskakuje jakiś komunikat: "Breakpoint installation failed: Suspend operation timeout".
    Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie

    Pierwszy raz się z czymś takim spotykam. O co tu chodzi?
  • #16
    Freddie Chopin
    MCUs specialist
    Podstawową sprawą - poza pokazaniem problemu - jest pokazanie konfiguracji która do tego problemu doprowadziła. Chodzi o ustawienia samego OpenOCD oraz o ustawienia debuggera z zakładki "Debugger".

    No i przy okazji upewnij się, że przypadkiem nie rozmawiamy o problemie o którym już wcześniej pisałem -> https://www.elektroda.pl/rtvforum/topic3289255.html
  • #17
    moscow18-1990
    Level 8  
    Odpaliłem to jeszcze w eclipse luna, który mam na innym dysku i dalej lipa . Teraz dodatkowo pojawił się taki komunikat po postawieniu breakpoint-a:"No symbol table is loaded. Use the "file" command."

    Pokażę jak to skonfigurowałem:

    1. External Tools Configuration

    Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie

    2. Debug Configurations

    Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie


    Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie

    Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie


    Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie
  • Helpful post
    #18
    User removed account
    User removed account  
  • #20
    moscow18-1990
    Level 8  
    Może coś z tą płytką jest coś nie tak? W sumie STM wysłał mi ją za darmo. Może to jakaś lipa? Generalnie tam był już "wgrany" jakiś program. Wyczytałem gdzieś w necie, że to demo wgrane od STM na tej płytce ewaluacyjnej ustawiało pin PB3 jako wejście co powodowało zwarcie debugera. Przez to nie mogłem się połączyć openocd z uC. Dałem VCC na Boot0, wgrałem swój program i dopiero po takim zabiegu była możliwa komunikacja na linii openocd i uC. Po dodaniu "monitor reset halt" i odznaczeniu "Reset and Delay ...", dalej nie działa. Odnośnie plugina to pomyślę, ale generalnie też chciałbym ogarniać takie trudniejsze rzeczy.
  • #21
    User removed account
    User removed account  
  • #22
    Freddie Chopin
    MCUs specialist
    moscow18-1990 wrote:
    Po dodaniu "monitor reset halt" i odznaczeniu "Reset and Delay ...", dalej nie działa.

    Mam nadzieję, że wszystko to robiłeś w starszej wersji Eclipse, bo najnowsza nie zadziała z GDB 7.12.

    Na liście w zakładce Debug jak klikasz w uruchomiony proces OpenOCD i GDB, to na dole - w zakładce Console - pojawi się log z danego programu. Powtórz ten problem który masz i wrzuć tutaj zawartość jednego i drugiego logu.
    Dodano po 2 [minuty]:
    Piotrus_999 wrote:
    Po prostu nie słuchaj ludzi z chorym ego że jak nie DIY, to jesteś lamer, tylko użyj gotowego środowiska.

    Liczę na to, że to nie o mnie, bo nie przypominam sobie, abym kiedyś coś takiego napisał poważnie (; (niepoważnie też nie, ale w żartach to akurat możliwe). Szczerze mówiąc to nie pamiętam aby ktokolwiek tutaj coś takiego pisał, więc nie przesadzaj...
  • Helpful post
    #23
    User removed account
    Level 1  
  • #24
    User removed account
    User removed account  
  • #25
    moscow18-1990
    Level 8  
    Z tymi innymi środowiskami to pomyślę. Chciałbym jeszcze mimo wszytko spróbować rozwiązać ten problem. Generalnie "monitor reset halt" dodałem w pierwszej kolejności dla najnowszego eclipse. Teraz spróbowałem dla starszej wersji. Jeżeli chodzi o starszą wersję to nie wchodzi automatycznie do main, ale jak postawię breakpoint to jest inny komunikat. Poniżej dwa zdjęcia:
    Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie

    Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie

    Eclipse Neon:

    Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie
    Dodano po 3 [minuty]:
    np. Dla stm32F103RB normalnie wchodzi do main(w Eclipse Neon i bez "monitor reset halt"):
    Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie


    Dla STM32L053R8 czyli CortexM0+ też działa i wchodzi do maina "z automatu" w najnowszym Eclipse, ale tylko dla plików z rozszerzeniem ".c":

    Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie

    Generalnie jak main ma rozszerzenie ".cpp" w przypadku STM32L053R8 to jest mała lipka:
    Re: Nucleo F103RB/L053R8 - C++ 11 Eclipse makefile - pytanie

    Mimo wszytko dwie płytki działają i jest wejście do maina "z automatu" mimo wykorzystania najnowszej wersji Eclipse.
  • #26
    Freddie Chopin
    MCUs specialist
    Zaczynasz mieszać i zaczyna to być irytujące... Jak rozwiązujesz jakiś problem, to się sprawdza JEDNĄ rzecz na raz, a Ty sprawdzasz 10 na raz - różne wersje Eclipse, różne projekty, różne układy, różne opcje, różne rozszerzenia plików,... Tym sposobem możemy sobie tutaj pisać jeszcze bardzo długo, bo dopiero teraz dowiedziałem się, że problem jest w jakiś sposób związany z tym że plik ma rozszerzenie .cpp.

    Naprawdę możesz sobie darować próbowanie w Eclipse w wersji Neon.2, chyba że chcesz tracić czas, to proszę bardzo. Tam z pewnością nie zadziała Ci z GDB 7.12. Skoro Ci to działa, to znaczy że wcale nie używasz "najnowszej" wersji Neon.2, tylko np. Neon.1 albo Neon. Kolejny problem komunikacyjny, bo w efekcie rozmawiamy o dwóch różnych rzeczach i z pewnością się nie dogadamy.

    Skoro GDB chce poszukiwać pliku main.c zamiast main.cpp, to nawet nie wiadomo czy Twój projekt poprawnie się skompilował, bo nie wiem w jaki inny sposób do pliku .elf mogłoby trafić info o jakimś pliku main.c którego nie masz. Chyba że masz w projekcie plik main.c i main.cpp, to w ogóle niezły chaos...
  • #27
    User removed account
    User removed account  
  • #28
    moscow18-1990
    Level 8  
    Ok. Poprawiłem poprzednie projekty. Popełniłem mały błąd przy dodawaniu plików z rozszerzeniem ".cpp".Wywaliłem eclipse neon z dysku. Mam pytanko. Generalnie przejrzałem skrypty linkera dla tych trzech projektów. Nie wiem czy to może być powód złego działania debugera, ale dla tego trzeciego projektu zaimportowałem skrypt linkera z tej paczki "stm32cubel4". Generalnie pytanie brzmi czy ewentualnie niewłaściwy skrypt linkera może powodować takie problemy z debugowaniem?
  • #29
    User removed account
    User removed account