Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C++11][Cortex-M3/M4] - distortos - obiektowy RTOS dla mikrokontrolerów w C++

Freddie Chopin 26 Lip 2017 19:37 22251 178
  • #151 26 Lip 2017 19:37
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Wygląda na to, że brakuje po prostu odpowiedniego nagłówka - "distortos/ThisThread.hpp". Jeśli możesz to wrzuć cały plik main.cpp który powoduje problem oraz dwie konfiguracje (pliki distortosConfiguration.mk) o których piszesz. Być może jest tak, że w jednej konfiguracji ten nagłówek jest dołączany pośrednio "jakośtam", a w drugiej - nie.

  • #152 26 Lip 2017 19:37
    arcyimperator
    Poziom 11  

    Ok, prosty błąd, w template includy są wewnątrz #ifdef CONFIG_BOARD_LEDS_ENABLE:)

  • #153 26 Lip 2017 19:40
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Ten problem dotyczy któregoś z udostępnionych szablonów? Bo jeśli tak, to poprawię (;

  • #154 26 Lip 2017 20:06
    arcyimperator
    Poziom 11  

    Wygląda na problem który sam sobie stworzyłem.
    Dzieki za odpowiedź:)

  • #155 29 Lip 2017 12:03
    arcyimperator
    Poziom 11  

    Hej,
    znowu problem z includami:]
    Stworzyłem folder USB w głównym katalogu projektu i nie wiem czemu nie może znaleźć pliku stm32f4xx.h. przy kompilacji plików z tego katalogu
    Plik Rules.mk skopiowałem z katalogu "folderWithFunctions" -tam ten plik jest odnajdywany...
    Podawanie ścieżki distortos/external... też nie działa.
    Proszę o pomoc:]

  • #156 31 Lip 2017 08:21
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Czyli masz taki plik? https://github.com/DISTORTEC/distortosTemplat...lder/blob/master/folderWithFunctions/Rules.mk

    Generalnie przy tym pliku na 100% też by nie znalazło stm32f4xx.h - trzeba tam dodać takie dwie linijki:

    CXXFLAGS_$(d) := $(CXXFLAGS_$(d)) $(ARCHITECTURE_INCLUDES)
    CXXFLAGS_$(d) := $(CXXFLAGS_$(d)) $(CHIP_INCLUDES)

    (ta pierwsza być może jest niepotrzebna)

    Swoją drogą - polecam dołączać plik CMSIS-proxy.h zamiast (przykładowo) stm32f4xx.h - zawsze to o jeden poziom abstrakcji wyżej (;

  • #157 31 Lip 2017 12:38
    arcyimperator
    Poziom 11  

    Dzięki za odpowiedź. Generalnie jestem pewien na 99% że te linijki dodałem(trochę eksperymentowałem) -sprawdzę jak wrócę do domu. Dam znać wieczorem/jutro rano.

  • #158 02 Sie 2017 18:42
    Freddie Chopin
    Specjalista - Mikrokontrolery
  • #159 02 Sie 2017 19:10
    arcyimperator
    Poziom 11  

    Nie:) Nawet niewiele próbowałem - w tej chwil mogę powiedzieć jedynie że dodanie tych linijek w Rules.mk nie rozwiązuje (u mnie) problemu. Na razie jednak polecam się wstrzymać z szukaniem przyczyny -trochę majstrowałem i mój projekt pewnie nie jest "czysty".
    Więcej info dam w piątek - na razie jest 19:10 i siedzę w pracy -uroki deadline'a:]

  • #160 05 Sie 2017 23:02
    arcyimperator
    Poziom 11  

    Znalazłem tochę czasu.
    Będe pisał o konfiguracji dla F4Discovery
    Dodałem linijki o których pisałeś.
    Generalnie co do folderu "folder with functions" i kompilacji functionFromFolder.cpp to jest ok dla stm32fxx.h (btw. trzeba odkomentowac w nim linijkę, prawda ?) ale nie znajduje CMSIS-proxy.h. Nie pomaga dodanie do distortosConfiguration.mk (ręcznie) "distortos/source/chip/STM32/STM32F4/include/distortos/chip" w linijce z CONFIG_CHIP_INCLUDES.



    Za chwilę sprawdzę dla nowego folderu (USB) i zeedytuje posta.

    Dodano po 5 [godziny] 1 [minuty]:

    OK, problem zasadniczo rozwiązany: kompilowałem pliki *.c a nie cpp, brawo ja:] trzeba patrzyć na logi....

  • #161 06 Sie 2017 09:10
    Freddie Chopin
    Specjalista - Mikrokontrolery

    arcyimperator napisał:
    stm32fxx.h (btw. trzeba odkomentowac w nim linijkę, prawda ?)

    absolutnie nie (; wystarczy dołączać właśnie plik CMSIS-proxy.h, w którym odpowiednia definicja już jest.

    arcyimperator napisał:
    nie znajduje CMSIS-proxy.h. Nie pomaga dodanie do distortosConfiguration.mk (ręcznie) "distortos/source/chip/STM32/STM32F4/include/distortos/chip" w linijce z CONFIG_CHIP_INCLUDES.

    Może nie do końca jasno napisałem - do kodu dodajesz oczywiście linijkę:

    #include "distortos/chip/CMSIS-proxy.h"

    czyli ścieżkę + plik, a nie sam plik. Powyższy kod odnajdzie ten plik właśnie za pomocą CONFIG_CHIP_INCLUDES.

  • #162 07 Sie 2017 21:39
    arcyimperator
    Poziom 11  

    FYI generalnie działa, dzięki:]

  • #163 15 Sie 2017 18:42
    arcyimperator
    Poziom 11  

    Generalnie idea jest taka że chciałby miec klasę USB (używam virtual com) która miałaby wątki 'sender' i 'receiver' operujące na niskim priorytecie. Chcąc coś wysłać user jedynie wpsisywał by coś do bufora tej klasy ( np. USB.send("text"); ) Natomiast wątki w wolnym czasie zajmowałyby się odbieraniem/wysyłaniem.
    Proszę o komentarz czy robię jakiś podstawowy bład albo udziwniam koncepcję.

    Problem jak to zrobić. Próbuje w konstruktorze:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Niestety wątek wydaje się nie startować. Jakieś pomysły jak to zrobić, najlepiej elegancko i poprawnie?
    Czy wątek może być składnikiem klasy?

  • #164 15 Sie 2017 21:44
    Freddie Chopin
    Specjalista - Mikrokontrolery

    arcyimperator napisał:
    Niestety wątek wydaje się nie startować. Jakieś pomysły jak to zrobić, najlepiej elegancko i poprawnie?

    Wątek jako zmienna lokalna jest od razu kasowany po wyjściu z konstruktora. Jeśli chciałbyś to zrobić w ten sposób, to musiałbyś użyć wątków dynamicznych i zrobić im "detach" przed wyjściem z funkcji. Niemniej jednak nie ma to specjalnego sensu, ponieważ...

    arcyimperator napisał:
    Czy wątek może być składnikiem klasy?

    Może i jest to nawet wskazane (; W przypadku wątków statycznych składnia jest niestety (na tą chwilę) "niezbyt wygodna". W każdym razie przykładowo wygląda to tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W przypadku wątków dynamicznych sprawa jest nieco prostsza, ponieważ nie trzeba się bawić w deklarację typu (bo DynamicThread nie jest szablonem), tyle że oczywiście wtedy jest użyta dynamiczna alokacja.

    Mam pewien plan który sprawi że wątki statyczne będą dużo wygodniejsze do użycia - przekazywanie funkcji i argumentów odbywałoby się przez funkcje start(), a nie przez konstruktor - no ale na razie trzeba robić takie "cuda".

    Jakbyś miał jakieś pytania co do tych dziwacznych konstrukcji to pytaj, bo jestem świadomy że są one nieco "koślawe" i na pierwszy rzut oka nie wiadomo o co chodzi (; Istnieje szansa że do całości - poza oczywiście nagłówkiem distortos/StaticThread.hpp - trzeba dorzucić jeszcze jakieś inne, w których jest std::ref i std::declval, ale być może nie jest to potrzebne.

  • #165 16 Sie 2017 12:48
    arcyimperator
    Poziom 11  

    Freddie Chopin napisał:
    Wątek jako zmienna lokalna jest od razu kasowany po wyjściu z konstruktora.

    Heh, no nie może byc:]

    Super Freddie, dzięki za odpowiedź, działa. Składnia faktycznie dość skomplikowana:], więc przykład jak znalazł.

  • #166 14 Wrz 2017 22:38
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Pojawiła się właśnie kolejna, piąta już wersja - 0.5.0.

    Skrót najważniejszych nowości:
    - wsparcie dla całej rodziny STM32L0,
    - wsparcie dla płytki NUCLEO-L073RZ (STM32L0),
    - wsparcie dla płytki 32F769IDISCOVERY (STM32F7),
    - generator płytek bazujący na plikach devicetree (*.dts) zaimplementowany przy pomocy skryptów Pythona używających modułu ply (lexing/parsing) oraz Jinja2 (renderowanie plików),
    - zestaw "pretty-printers" dla GDB do wszystkich używanych w projekcie list i kolejek.

    News na stronie - http://distortos.org/news/distortos-0-5-0-released/

  • #168 15 Wrz 2017 00:33
    Grizzly16
    Poziom 13  

    Super! Dzięki za cały wysiłek jak poświęcasz swojemu projektowi. Już kompiluje najnowszego bleeding edge, a w weekend pierwsza próba odpalenia blinking LED na Distortos.
    Mam płytkę Nucleo-F411RE to mogę przy tej okazji przygotować konfigurację pod niego bo jest pewnie bardzo podobny do takiego 401RE.
    W pliku .ld pewnie wystarczy podmienić
    flash : org = 0x8000000, len = 524288
    sram : org = 0x20000000, len = 98304
    na prawidłowe rozmiary dla 411RE?
    A w pozostałych plikach to głównie nazwa MCU, bo same nucleo-64 są dość kompatybilne ze sobą.
    Jak by działało prawidłowo to przesłać tutaj paczkę?

    Wgryzam się w RTOS-y dopiero (trochę freeRTOS i trochę teorii) i to niestety ale jedynie w czasie wolnym od pracy.
    Śmiganie z RTOS-em jak i pisanie w embedded C++ to moje marzenie. Oby z Distortos-em i zapasem zapału się ziściło. :D

  • #169 15 Wrz 2017 07:48
    Freddie Chopin
    Specjalista - Mikrokontrolery

    uzi18 napisał:
    Czy ja dobrze widze F0xx tez ma wsparcie?

    Tak, już od dosyć dawna, bo od wersji 0.2.0 (maj 2016).

    Grizzly16 napisał:
    Już kompiluje najnowszego bleeding edge, a w weekend pierwsza próba odpalenia blinking LED na Distortos.

    Jakbyś natrafił na jakieś problemy - a wiadomo że zawsze się na jakieś natrafia - to pisz, na pewno pomogę (;

    Grizzly16 napisał:
    Mam płytkę Nucleo-F411RE to mogę przy tej okazji przygotować konfigurację pod niego bo jest pewnie bardzo podobny do takiego 401RE.
    W pliku .ld pewnie wystarczy podmienić
    flash : org = 0x8000000, len = 524288
    sram : org = 0x20000000, len = 98304
    na prawidłowe rozmiary dla 411RE?
    A w pozostałych plikach to głównie nazwa MCU, bo same nucleo-64 są dość kompatybilne ze sobą.

    Sprawa jest prostsza niż to co opisujesz. Generalnie kluczem jest aby _NIE_ próbować modyfikować żadnych plików źródłowych czy coś w tym stylu. Autentycznie jest to obecnie bardzo proste i procedura wygląda mniej-więcej tak.
    1. Stworzyć nowy folder o odpowiedniej nazwie w source/board/.
    2. Przegrać do niego plik *.dts z najbardziej podobnej płytki, a więc jak sam zauważyłeś source/board/ST_NUCLEO-F401RE/ST_NUCLEO-F401RE.dts, po czym zmienić mu nazwę na odpowiednią.
    3. Otworzyć sobie plik w edytorze tekstu i zmienić co trzeba (zapewne tylko ten jedyny "#include", nazwę płytki w "compatible" i w "model", nazwę układu w "compatible").
    4. Odpalić konsolę, wejść do głównego folderu projektu, wydać polecenie `make board CONFIG_FILE=source/board/ST_NUCLEO-F411RE/ST_NUCLEO-F411RE.dts`
    5. Poczekać z pół sekundy.
    6. Gotowe (;

    Jedynym urozmaiceniem całości mogą być te 3 bonusowe kroki które trzeba wykonać jednorazowo przed powyższymi:
    1. Zainstalować Pythona (wersja 2 lub 3, obojętne), wraz z narzędziem "pip" - na Windowsie jest "w komplecie" z instalatorem Pythona, na Linuxie jest na 100% w repo dystrybucji albo też w komplecie. NA Windowsie dodać plik główny python.exe do systemowego PATH.
    2. Zainstalować moduł "ply" do Pythona, na Linuxie z konsoli wystarczy komenda `pip install ply`, czasem paczka może być w repozytoriach dystrybucji, na Windowsie z konsoli wystarczy wpisać `python -m pip install ply`.
    3. Jak wyżej, tyle że zainstalować moduł o nazwie "Jinja2".

    Drobna uwaga dla użytkowników Linuxa - wersja "pip" musi być dopasowana do wersji Pythona. Często "pip" jest też dostępny jako dwie oddzielne paczki w repozytorium dystrybucji, np. w ArchLinux będzie to "python-pip" oraz "python2-pip" - interesuje nas ta "bardziej domyślna", czyli w tym przypadku byłby to "python-pip".

    No ale wracając do meritum... Po tym jak masz już płytkę (folder z plikami źródłowymi), wystarczy tylko stworzyć konfigurację. Nie ma co kombinować i po prostu można skopiować konfiga (czyli plik distortosConfiguration.mk) dla płytki na której się wzorowałeś do nowego folderu, wybrać tą konfigurację (`make configure CONFIG_PATH=configurations/ST_NUCLEO-F411RE/test'), włączyć narzędzie konfiguracyjne (`make menuconfig`) i sprawdzić/poprawić odpowiednie opcje - przede wszystkim wybraną płytkę (; oraz zapewne konfiguracja zegara będzie wyglądała minimalnie inaczej, bo STM32F411 może pracować na max 100 MHz.





    Grizzly16 napisał:
    Jak by działało prawidłowo to przesłać tutaj paczkę?

    Najlepiej pull-request bezpośrednio na githubie, ale możesz też przesłać same pliki dowolnym innym sposobem.

    Grizzly16 napisał:
    Śmiganie z RTOS-em jak i pisanie w embedded C++ to moje marzenie. Oby z Distortos-em i zapasem zapału się ziściło.

    Najgorzej zacząć, potem już idzie z górki (; Jak dla mnie używanie RTOSa w C++ jest prostsze niż dowolnego innego zrobionego w C. Powód jest taki, że jak tylko chcemy do wątku/timera przekazać jakiekolwiek inne argumenty niż "void*" (czy co tam akurat API pozwala przekazać), to już trzeba niemiłosiernie kombinować jak koń pod górę, a tutaj...?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Proponuję porównać ilość kodu który trzeba naklepać żeby to samo (_statyczna_ alokacja wszystkiego na stosie, wiele argumentów) osiągnąć w jakimś innym RTOSie typu FreeRTOS czy ChibiOS/RT. O porównaniu bezpieczeństwa rozwiązań nawet nie będę pisał, gdyż w API opartym na C można sobie do wątku przekazać co się chce, włącznie z niczym (choć wątek czegoś tam oczekuje) - w takiej sytuacji kompilatorowi C nawet nie zadrży powieka. Jakby się uprzeć, to jeszcze to czy przekazane zostało "coś" czy "nic" jakość się tam da sprawdzić, ale kontrola typów nie istnieje (nie ma najmniejszego problemu żeby przekazać literkę 'x' tam gdzie wątek oczekuje stubajtowej struktury) - w końcu wszystko jest zrzutowane na "void*". A tutaj?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Zgadza się, że jest to "typowy" błąd C++ dotyczący template'ów, czyli dosyć przydługawy i niekoniecznie czytelny (dla niewprawionego oka). Niemniej jednak lepszy taki niż żaden <:

  • #170 16 Wrz 2017 17:15
    arcyimperator
    Poziom 11  

    hmm nie jestem dobry w C++:) niestety nie mogę zrozumieć problemu:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Niestety błąd chyba linkowania:
    Kod: bash
    Zaloguj się, aby zobaczyć kod


    gdzie robię błąd? Podejrzewam że jest linijce:
    StaticFifoQueue <Message, 100> fifo;

    bo jak ją usunę to znika:) ale nie widzę co robię źle. Proszę o pomoc

  • #171 16 Wrz 2017 18:14
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Pierwsze pytanie byłoby takie - czy na pewno kompilujesz odpowiednie pliki źródłowe? Bo na tym zrzucie z konsoli nie ma pliku "Message.o", a podejrzewam że tak powinien się nazywać po skompilowaniu plik Message.cpp.

    Inną sprawą jest to, że powinieneś na 99% zapewnić klasie "Message" konstruktor kopiujący albo "move constructor", być może też operator przypisania (lub move assignment operator). - w innym przypadku operacje zapisywania obiektów do kolejki i wyciągania ich stamtąd albo nie będą w ogóle możliwe, albo kompilator wyczaruje sobie swój konstruktor, który niekoniecznie będzie robił to co trzeba. W przypadku klasy Message wręcz na 100% będzie robił nie to co trzeba, ponieważ klasa zarządza zasobami w postaci dynamicznie przydzielonej pamięci. Osobiście użyłbym tu std::unique_ptr i zdefiniował odpowiednie operacje "move".

  • #172 16 Wrz 2017 20:03
    arcyimperator
    Poziom 11  

    Freddie Chopin napisał:
    Pierwsze pytanie byłoby takie - czy na pewno kompilujesz odpowiednie pliki źródłowe?

    nie.
    SUBDIRECTORIES += Message rozwiązuje sprawę... dzięki!
    Freddie Chopin napisał:
    Inną sprawą jest to, że powinieneś na 99% zapewnić klasie "Message" konstruktor kopiujący albo "move constructor",

    Tak, zdałem sobie z tego sprawę jak już wysłałem posta. Dzięki za czujność

    Pozdrawiam

  • #173 16 Wrz 2017 21:01
    Freddie Chopin
    Specjalista - Mikrokontrolery

    arcyimperator napisał:
    SUBDIRECTORIES += Message rozwiązuje sprawę... dzięki!

    W projektach stosuję też "automatyczne" dołączanie odpowiednich podfolderów. Zamiast wypisywać wszystkie SUBDIRECTORIES można zrobić tak:

    Code:
    SUBDIRECTORIES += $(patsubst $(d)%/Rules.mk,%,$(wildcard $(d)*/Rules.mk))


    Tym sposobem dołączysz wszystkie bezpośrednie podfoldery w których jest plik Rules.mk. Podkreśliłem słowo "bezpośrednie" - jeśli po drodze masz jakieś dodatkowe ścieżki, to wystarczy na każdym poziomie dodać plik Rules.mk z tą jedną linijką oraz z "include $(DISTORTOS_PATH)footer.mk".

  • #174 19 Paź 2017 23:32
    arcyimperator
    Poziom 11  

    Co robię źle?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    void set_to_one się wywołuje, ale nie przechodzi while -t nie zmienia wartości

  • #175 20 Paź 2017 08:41
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Porada "na szybko", więc jeszcze tego nie sprawdziłem.

    Generalnie referencje są czasem nieco upierdliwe w przypadku obcowania z pewnymi standardowymi funkcjami, a właśnie te "pewne standardowe funkcje" są użyte wewnątrz timerów oraz wątków. Np. ta - http://en.cppreference.com/w/cpp/utility/functional/bind

    Szczególnie ciekawy jest w tym kontekście ten oto fragment:

    Cytat:
    Notes
    ...
    The arguments to bind are copied or moved, and are never passed by reference unless wrapped in std::ref or std::cref.


    Tak więc na szybko sprawdź taką zmianę i daj znać czy cokolwiek pomogło.

    Code:
    auto set1_timer = makeStaticSoftwareTimer(set_to_one, std::ref(t));


    Zapewne warto tą kwestię podkreślić bardziej w dokumentacji i/lub w artykułach dotyczących użytkowania, więc sobie to odnotowałem na swojej liście rzeczy do zrobienia.

  • #176 20 Paź 2017 08:47
    arcyimperator
    Poziom 11  

    Dzięki Freddie za szybką odpowiedź. Moje szybkie sprawdzenie będzie po 17, pozdrawiam!

  • #177 20 Paź 2017 09:22
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Nota bene - podobne użycia timerów są w aplikacji testowej, np. https://github.com/DISTORTEC/distortos/blob/0...r/SoftwareTimerFunctionTypesTestCase.cpp#L124

    Podobnie w przypadku używania przez wątek/timer bezpośrednio funkcji jakiegoś obiektu (tutaj przykładowo Semaphore::post()) również trzeba użyć std::ref() / std::cref() (lub używać wskaźników) - https://github.com/DISTORTEC/distortos/blob/b...emaphore/SemaphoreOperationsTestCase.cpp#L332

  • #178 20 Paź 2017 15:30
    rajszym
    Poziom 18  

    Freddie Chopin napisał:
    Code:
    auto set1_timer = makeStaticSoftwareTimer(set_to_one, std::ref(t));

    Można też zastosować wyrażenie lambda:
    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #179 20 Paź 2017 18:55
    arcyimperator
    Poziom 11  

    Sprawdziłem, działa
    Co do lambdy to tak, od tego zaczynałem ale nie chciałem zaciemniać sytuacji

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME