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

[AVR][C] Atomthreads RTOS, opinie

damiano713 17 Kwi 2011 12:37 1643 10
  • #1 9410240
    damiano713
    Poziom 15  
    Witam Panów i Panie,

    szukam alternatywy dla FreeRTOS. Głównie chodzi mi o licencjonowanie. FreeRTOS jest na licencji GPL, z którą nie przepadam. Znalazłem ostatnio RTOS o nazwie Atomthreads http://atomthreads.com/. Licencja BSD, dobrze okomentowany kod, dużo dokumentacji. Po prostu cudo.
    Tutaj pytanie do forumowiczów, czy ktokolwiek testował w praktyce to rozwiązanie?
    Chętnie zapoznam się z innymi scheduler'ami na prawdziwie wolnych licencjach.
  • #2 16984224
    Tytus Kosiarski
    Poziom 16  
    Witam

    Wiem, że trochę późno, ale może jeszcze się przyda.

    Ja testowałem AtomThreads na dwóch mikrokontrolerach: STM8L152 i STM8S207.
    Chodzi ładnie, nie ma problemów ze stabilnością (testowane ok. roku na STM8L152), implementacja jest też prosta. Jak na razie, brakuje mi możliwości zawieszania i wznawiania tasków, co zmusza do pisania kodu tak, by wykonywała się tylko pusta pętla, gdy task nie jest potrzebny.

    Pozdrawiam, KT
  • #3 16984326
    grko
    Poziom 33  
    @damiano713 FreeRTOS jest oparty o zmodyfikowaną licencję GPL. Nie obliguje ona do publikacji kodu źródłowego aplikacji. Więc śmiało można FreeRTOSa używać.

    Używam tego Atmothreads w jednym z projektów i działa to nawet nieźle ale według mnie ma kilka wad:
    - jest przeznaczony na mniejsze procesory AVR
    - nie ma takiego wsparcia jak FreeRTOS -> mniejsza ilość commitów na główne repozytorium,
    - mniej funkcjonalności niź FreeRTOS -> np brak wywłaszczania
    - miejscami kiepskie API (we FreeRTOS jest podobnie): złe typy danych w kolejkach, notoryczny brak const
    - sporo błędów, które nie są jeszcze poprawione

    IMO jak robisz coś na 8-bitowcu to można ten Athomthreads brać. Dla ARM brałbym zephyra/nuttx.

    PS: Jak się nauczę C++ to distortos ;)
  • #4 16985395
    Tytus Kosiarski
    Poziom 16  
    @grko, możesz mi powiedzieć, o co chodzi z tym brakiem const?

    Nie wiem, czy miałeś to samo, co ja zauważyłem, że jak deklarowałem zmienne w funkcji taska przed pętlą while(1), to gdy użyłem "const typ nazwa_zmiennej", to mimo wszystko miałem tą zmienną umieszczoną w stosie. Dopiero pomagała deklaracja "static const typ nazwa_zmiennej".

    Pozdrawiam, KT
  • #5 16985433
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Tytus Kosiarski napisał:
    @grko, możesz mi powiedzieć, o co chodzi z tym brakiem const?

    Pogoogluj za hasłem "const correctness".

    Tytus Kosiarski napisał:
    Nie wiem, czy miałeś to samo, co ja zauważyłem, że jak deklarowałem zmienne w funkcji taska przed pętlą while(1), to gdy użyłem "const typ nazwa_zmiennej", to mimo wszystko miałem tą zmienną umieszczoną w stosie. Dopiero pomagała deklaracja "static const typ nazwa_zmiennej".

    To zupełnie normalne - zmienna nie-static wewnątrz funkcji zawsze będzie na stosie. Niezależnie czy z RTOSem X, RTOSem Y czy też bez niego.
  • #6 16985587
    michalko12
    Specjalista - Mikrokontrolery
    Tytus Kosiarski napisał:
    "const typ nazwa_zmiennej"

    Nielogiczne. Po co definiować w funkcji "zmienną" której nie można modyfikować? No chyba, że mowa jest o stałej, ale stała musi być zainicjalizowana jakąś wartością.
    Freddie Chopin napisał:
    To zupełnie normalne - zmienna nie-static wewnątrz funkcji zawsze będzie na stosie.

    Jeśli mowa jest o stałej, to taka stała ( nawet nie static ) zdefiniowana w funkcji, raczej nie powinna lądować na stosie, no może co najwyżej w takich wynalazkach jak AVR. W przypadku ARMów ładowanie tej stałej na stos jest bez sensu.
  • #7 16985619
    Freddie Chopin
    Specjalista - Mikrokontrolery
    michalko12 napisał:
    Nielogiczne. Po co definiować w funkcji "zmienną" której nie można modyfikować? No chyba, że mowa jest o stałej, ale stała musi być zainicjalizowana jakąś wartością.

    Dla Ciebie nielogiczne, ja staram się używać praktycznie samych constów. Wg mnie znacząco zmniejsza to prawdopodobieństwo błedów - nie trzeba się zastanawiać jaka jest chwilowa wartość tych 100 modyfikowalnych w każdym miejscu funkcji zmiennych <:

    michalko12 napisał:
    Jeśli mowa jest o stałej, to taka stała ( nawet nie static ) zdefiniowana w funkcji, raczej nie powinna lądować na stosie, no może co najwyżej w takich wynalazkach jak AVR. W przypadku ARMów ładowanie tej stałej na stos jest bez sensu.

    Powiązane z poprzednim.

    void funkcja(const int argument1, const int argument2)
    {
    const int magicznyWspolczynnik = argument1 * argument2;
    ...
    }


    Wiadomo chyba dlaczego każdy z tych trzech constów wyląduje na stosie lub w rejestrze, a nie we flash (; To są po prostu takie "logiczne consty". Jednym taki styl programowania może pasować, innym nie.

    Żeby było jasne - nie ma to praktycznie nic wspólnego z "const correctness", które odnosi się do danych wskazywanych przez wskaźniki czy referencje. Tu jest przykład funkcji, w której "const correctness" jest zastosowane prawidłowo - http://en.cppreference.com/w/cpp/string/byte/memcpy
  • #8 16985630
    michalko12
    Specjalista - Mikrokontrolery
    OK, przyćmiło mnie. Myślałem raczej o czymś pokroju constexpr.
  • #9 16985726
    Tytus Kosiarski
    Poziom 16  
    Freddie Chopin - dzięki za podpowiedź, w wolnej chwili poczytam.

    Michałko12 - oczywiście masz rację, użyłem skrótu myślowego, chodziło mi o
    static const typ nazwa_zmiennej = wartość, by była to stała we Flash.

    Pozdrawiam, KT
  • #10 16985738
    grko
    Poziom 33  
    @Freddie Chopin Ja bardziej miałem na myśli to, że brakowało const tam gdzie naprawdę powinno być: czyli przy wskaźnikach. Co do używania const w stosunku do defacto kopii zmiennych ze stosu to nie jestem tego jakimś specjalnym zwolennikiem (zresztą nie tylko ja). Według mnie to trochę zaciemnia miejsca gdzie const powinno być:

    To jest OK:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    To już niebardzo:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    To już przegięcie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #11 16985813
    Freddie Chopin
    Specjalista - Mikrokontrolery
    W deklaracji (nie mylić z definicją) i tak te consty-do-wartości nie mają znaczenia (; Trzeci przykład nic nie zmienia względem drugiego - z punktu widzenia kompilatora akurat takie `const` jest bez znaczenia i nie służy absolutnie niczemu - nawet jeśli użyjesz `auto` (w C++11) do zapisania sobie wyniku tej funkcji, to tak czy siak ten `const` zostanie zignorowany.

    Już to chyba pisałem z kilka razy - `const` dodaję od czasu gdy kiedyś szukałem bardzo długo błędu którym okazała się modyfikacja zmiennej której modyfikować nie powinienem, a która również była wartością zwracaną przez funkcję. Teraz jak coś chcę modyfikować to musi to być świadome i zamierzone, bo najpierw muszę usunąć `const` (; Ideę tą zaadaptowałem sobie z języków funkcjonalnych, gdzie w zasadzie wszystko jest stałe i niemodyfikowalne. Ale jak mówię - nikogo nie zmuszam. Niemniej jednak w typowym programie zadziwiająco _mało_ zmiennych musi być tak naprawdę modyfikowalnych.
REKLAMA