Strona główna
Witaj na stronie Chopina!
Pierwsza wersja distortos wydana!
Wpisany przez Freddie Chopin   
Czwartek, 10 Marzec 2016 16:39

Niecałe dwa tygodnie temu, po 584 dniach od rozpoczęcia pracy nad systemem distortos, w końcu opublikowałem pierwszą wersję - 0.1.0. Listę funkcjonalności zawartych w tym wydaniu można znaleźć w change logu, natomiast paczki z kodem źródłowym można znaleźć na stronie http://distortos.org/ w dziale Downloads. W tym samym miejscu można również pobrać opublikowane tego samego dnia paczki z szablonem projektu oraz z przykładowymi aplikacjami. Ta druga paczka zawiera na razie jedynie "nieśmiertelne" miganie LEDami przy użyciu statycznych lub dynamicznych wątków. Nawet nagrałem filmik z działania tej aplikacji (;

Na zachętę - poniżej zamieszczam "magiczny" kod, który w asynchroniczny sposób oblicza wynik funkcji sinus dla czterech różnych liczb w czterech osobnych wątkach. Jest to kompletny i działający kod aplikacji - nie trzeba nic więcej dodawać!

#include "distortos/board/leds.hpp"
#include "distortos/chip/ChipOutputPin.hpp"
#include "distortos/StaticThread.hpp"

void sinWrapper(const double operand, double& result)
{
  result = sin(operand);
}

int main()
{
  const double operands[4] {0.9867816015, 0.4641984149, 0.4665572273, 0.8926178650};
  double results[4] {};
  auto sinThread0 = distortos::makeAndStartStaticThread<512>(1, sinWrapper, operands[0], std::ref(results[0]));
  auto sinThread1 = distortos::makeAndStartStaticThread<512>(1, sinWrapper, operands[1], std::ref(results[1]));
  auto sinThread2 = distortos::makeAndStartStaticThread<512>(1, sinWrapper, operands[2], std::ref(results[2]));
  auto sinThread3 = distortos::makeAndStartStaticThread<512>(1, sinWrapper, operands[3], std::ref(results[3]));

  // do something while the threads are calculating results...
  distortos::board::leds[0].set(true);

  // make sure the threads are done
  sinThread0.join();
  sinThread1.join();
  sinThread2.join();
  sinThread3.join();

  // results are ready!
  distortos::board::leds[0].set(false);
}
Zmieniony: Czwartek, 10 Marzec 2016 17:55
 
distortos - oficjalna strona i wsparcie dla wszystkich układów STM32F4
Wpisany przez Freddie Chopin   
Sobota, 26 Grudzień 2015 13:57

Kilka tygodni temu projekt distortos - zaawansowany system operacyjny czasu rzeczywistego - dostał swoją własną stronę internetową, dostępną pod adresem http://distortos.org/. Na razie znajduje się tam jedynie kilka krótkich newsów, kilka przydatnych linków oraz dokumentacja kodu źródłowego wygenerowana przy użyciu narzędzia doxygen, jednak ilość przydatnych materiałów będzie sukcesywnie wzrastać.

Natomiast do kodu źródłowego i do systemu konfiguracji Kconfig projektu dodane zostało pełne wsparcie dla wszystkich 115 układów z serii STM32F4. Pojawiły się również dwie nowe przykładowe konfiguracje dla płytek z mikrokontrolerami STM32F4, tak więc na chwilę obecną dostępne są trzy sprawdzone i gotowe do uruchomienia konfiguracje:

Wszystkie konfiguracje uruchamiają aplikację testową z maksymalną możliwą częstotliwością zegara systemowego. Cała konfiguracja modułu zegarowego i kilku detali z modułu zasilania możliwa jest do wykonania poprzez system konfiguracji Kconfig, przedstawiony na poniższych screenshotach.

Kconfig, STM32F4
Kconfig, STM32F4
Kconfig, STM32F4
Kconfig, STM32F4
Kconfig, STM32F4
Kconfig, STM32F4

Weryfikacja poprawności wprowadzonej konfiguracji jest zapewniana częściowo przez narzędzie Kconfig, a częściowo w kodzie źródłowym przy użyciu metod działających tylko w trakcie kompilacji - static_assert(...) lub preprocesora.

Zmieniony: Sobota, 26 Grudzień 2015 23:47
 
distortos ma już rok!
Wpisany przez Freddie Chopin   
Czwartek, 23 Lipiec 2015 22:11

Minął już rok i jeden dzień od momentu w którym rozpocząłem tworzenie projektu swojego własnego RTOSa. Projekt distortos wciąż się rozwija i - na chwilę obecną - ma już 1542 commity. Względem poprzedniego newsa pojawiły się zasadniczo tylko dwie nowe rzeczy, choć obydwie są bardzo rzadko spotykane w innych RTOSach. Jedna to klasa OnceFlag wraz z funkcją callOnce() - czyli odpowiedniki klasy std::once_flag i funkcji std::call_once() ze standardu C++11 lub struktury pthread_once_t i funkcji pthread_once() z <pthread.h>.

Drugą nowością jest implementacja funkcjonalności POSIXowych sygnałów. Sygnały można obsługiwać zarówno poprzez synchroniczne oczekiwanie - przy użyciu funkcji ThisThread::Signals::wait(), ThisThread::Signals::tryWait(), ThisThread::Signals::tryWaitFor() oraz ThisThread::Signals::tryWaitUntil() - jak i poprzez asynchroniczne handlery sygnałów - używając funkcji ThisThread::Signals::setSignalAction(). Zgodnie z przyjętymi standardami, "doręczenie" sygnału powoduje przerwanie niektórych funkcji blokujących (np. Semaphore::wait() albo MessageQueue::pop()), które zwrócą wtedy kod EINTR. Patrząc od drugiej strony - czyli "źródła" sygnału - możliwe jest zarówno "generowanie" (ThreadBase::generateSignal()) jak i "kolejkowanie" sygnałów wraz z wartością (ThreadBase::queueSignal()). Sygnały można oczywiście maskować i ignorować.

Wszystko to jest możliwe - wciąż - bez użycia nawet jednego bajtu pamięci alokowanej dynamicznie! W przypadku tworzenia "statycznych" wątków (obiektów klasy StaticThread) konieczne jest zadeklarowanie czy wątek ten w ogóle przyjmuje sygnały, ile sygnałów może być dla niego maksymalnie zakolejkowanych i ile różnych SignalAction można użyć w nim jednocześnie.

Stay tuned!

██╗  ██╗ █████╗ ██████╗ ██████╗ ██╗   ██╗
██║  ██║██╔══██╗██╔══██╗██╔══██╗╚██╗ ██╔╝
███████║███████║██████╔╝██████╔╝ ╚████╔╝ 
██╔══██║██╔══██║██╔═══╝ ██╔═══╝   ╚██╔╝  
██║  ██║██║  ██║██║     ██║        ██║   
╚═╝  ╚═╝╚═╝  ╚═╝╚═╝     ╚═╝        ╚═╝   

██████╗ ██╗██████╗ ████████╗██╗  ██╗██████╗  █████╗ ██╗   ██╗
██╔══██╗██║██╔══██╗╚══██╔══╝██║  ██║██╔══██╗██╔══██╗╚██╗ ██╔╝
██████╔╝██║██████╔╝   ██║   ███████║██║  ██║███████║ ╚████╔╝ 
██╔══██╗██║██╔══██╗   ██║   ██╔══██║██║  ██║██╔══██║  ╚██╔╝  
██████╔╝██║██║  ██║   ██║   ██║  ██║██████╔╝██║  ██║   ██║   
╚═════╝ ╚═╝╚═╝  ╚═╝   ╚═╝   ╚═╝  ╚═╝╚═════╝ ╚═╝  ╚═╝   ╚═╝   

MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM::MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM::MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM:::MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM:::::MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM::::::MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM::::::MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM::::::::MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM::::::::MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM:::::~~:MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM:::~?~:MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM::~~?~MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM:~?~MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMD++++7ZDMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM+++I7$Z$I?++++MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM+++++++++++++++MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM++++++++++++++OMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM++++++++++++++MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM+++++++O+++++OMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM+++?7+O?I++I+8MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM+++?????I++ONMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM+++?????O++ZNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM++???????ZO?MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM7+??????????MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMO??????????MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMO??????????MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMO??????????MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMO??????????MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMZ??????????MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMZ??????????OOOOOOOO8NMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMM?,,,,,,,,,,,,,,,$??????????,,,,,,,,,,,,,,,,,,,,7DMMMMMMMMMMMMMMM
MMMMMMMMM8$,,,,,,,,,,,,,,,,,,,,:$??????????:,,,,,,,,,,,,,,,,,,,,,,,,MMMMMMMMMMMM
MMMMM~,,,,,,,,,,,,,,,,,,,,,,:=+?O??????????I?=~:,,,,,,,,,,,,,,,,,,,,,,=MMMMMMMMM
MMMD,,,,,,,,,,,,,,,,,,,,,,,,:=+?I$Z??????87I?=~:,,,,,,,,,,,,,,,,,,,,,,,,MMMMMMMM
MMM,,,,,,,,,,,,,,,,,,,,,,,,,,,,:~==+++++==~:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DMMMMMM
MMM,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,MMMMMM
MMM,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8MMMMM
MMM,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,MMMMM
MMM+,,,,,,,,~DD8O,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,MMMMM
MMM+,,,,,,,,DZZZZ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,MMMMM
MMM+,,,,,,,$DZZZZ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,MMMMM
MMM7,,,,,,,DOZZZZ,,,,,,,,,,,,,,,,,,,,,,,~DDDDD8,,,,,,,,,,,,,,,,,,,,,,,,,,,,MMMMM
MMMD,,=DOOZZZZZZZ+,,,,,,,,,,,DDD~,,,,,,DDZZZZZZZZ?,,,,,,,,,,,,,,,,,,,,,,,,,MMMMM
MMMM8DZZZZZZZZZZZZ,,,,,,,,,,D8ZZZD,,,=DOZZZZZZZZZZ8,,,,,,,,,,,ZNNNNN,,,,,,IMMMMM
MMMNOZZZZ88888ZZZZO,,,,,,,,ODZZZZZZDDZZZZZZZZZZZZZZZ,,,,,,,,,,DNNN8888,,,,OMMMMM
MMM8OZZZZ8888ZZZZZO,,,,,,,DDZZZZZZZZZZZZZZZZZZZZZZZZZ,,,,,,,,ONNND88888,,,DMMMMM
MMMDOOZZZZZZZZZZZZ$8,,,,D8OZZZZZZ888ZZ8888ZZZZZ8888OZZ8,,,,,7NN888888888O:MMMMMM
MMMMOOZZZZZZZZZZ$$$$$$$$$$$$$ZZZZ8888O888ZZZZZO88888ZZZZZZ8D8888888888888MMMMMMM
MMMMDOZZZZZZZZZZ$$$$$$88$$$$$$ZZZZZZZZZZZZZZZZZZ88888ZZZZZZO8888888888888MMMMMMM
MMMMMOOZZZZ88888$$$$$$8O$$$$$$ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ8888888888888MMMMMMM
MMMMMNOZZ888888ZZ$$$$$$$$$$$$ZZZZOZZZZZZZZZZZZZZZZZZZZZZZZZZ8888888888888MMMMMMM
MMMMMMOZZ8888OZZZZ$$$$$$$$$ZZZZZ8OZZZZZZZZZZZZZZZZZZZZZZZZZ88888888888888MMMMMMM
MMMMMMOZZZ88OZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ888888888888NMMMMMMM
MMMMMNOZZZZZZZZZZZZZZZZZZZZZZZZO888ZZZZ88888ZZZZZZZZZZZ88888888888888888MMMMMMMM
MMMMM8OOZZZZZZZZZZZZZZZZZZZZO88888ZZZZZ888888ZZZZZZZZZZ88888888888888888MMMMMMMM
MMMMM8OOOZZZZZZZZZZZZZZZZZZZ88888ZZZZZZZZZZZZZZZZZZZZZZZ88OO888888888888MMMMMMMM
MMMMMMOOZZZZZ88ZZZZZZZZZZZZZZ88ZZZZZZZZZZZZZZZZZZZZZZZZZO8O8888888888888MMMMMMMM
MMMMMMOOZZZZ88888ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ888888888888888MMMMMMMM
MMMMMMMOOOZZ8888OZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ8888888888888888MMMMMMMM
MMMMMMMMMMNOOOOOZZZZZZZZZ8ZZZZZZZZZZZZZZZZZZZZZZZZZ8888O8888888888888NMMMMMMMMMM
MMMMMMMMMMMMN8OOOOOZZZZZZZZZZZZZZZZZZO88ZZZZZZZZZZO8888888888888888DMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM888ZZZZZZZZZZZZZZZZ88ZZZZZZZZZZZZZO8888888888888MMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMN8ZZZZZZZZZZZZZZZZZZZZZZZZZOOO88888888888MMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNOZZZZZZZZZZO888888888888MMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

██████╗ ██╗███████╗████████╗ ██████╗ ██████╗ ████████╗ ██████╗ ███████╗
██╔══██╗██║██╔════╝╚══██╔══╝██╔═══██╗██╔══██╗╚══██╔══╝██╔═══██╗██╔════╝
██║  ██║██║███████╗   ██║   ██║   ██║██████╔╝   ██║   ██║   ██║███████╗
██║  ██║██║╚════██║   ██║   ██║   ██║██╔══██╗   ██║   ██║   ██║╚════██║
██████╔╝██║███████║   ██║   ╚██████╔╝██║  ██║   ██║   ╚██████╔╝███████║
╚═════╝ ╚═╝╚══════╝   ╚═╝    ╚═════╝ ╚═╝  ╚═╝   ╚═╝    ╚═════╝ ╚══════╝
Zmieniony: Czwartek, 23 Lipiec 2015 23:29
 
distortos - 7 miesięcy i 0x3FF commitów!
Wpisany przez Freddie Chopin   
Niedziela, 22 Luty 2015 20:52

Wspomniany w poprzednim newsie projekt distortos wciąż się rozwija. Dziś minęło dokładnie 7 miesięcy od pierwszego commita w repozytorium, a całkowita liczba tychże commitów osiągnęła sympatyczną wartość 1023. Wielu czytelników - przynajmniej tych którzy zorientowani są w RTOSach dla mikrokontrolerów - zastanawiać się będzie "po co komu kolejny projekt RTOSa?". Odpowiedź na to pytanie jest bardzo złożona i mógłbym na ten temat napisać osobny artykuł, jednak na razie musi wystarczyć link do pliku README, w którym starałem się opisać zasadnicze powody istnienia tego projektu. Myślę, że choćby z racji położenia dużego nacisku na wsparcie dla C++ i C++11 jest to projekt warty uwagi, choć cecha ta nie powinna umniejszać innych jego zalet (niektóre wciąż są oczywiście "przyszłe" (; ), ważnych dla osób które nie zamierzają używać C++ (ta cecha na pewno jest przyszła, na razie dostępne jest jedynie API w C++11).

Wciąż wiele pozostało do zrobienia, ale przez ten czas udało się zrealizować całkiem sporo rzeczy, które działają nadzwyczaj dobrze (;

Najważniejszą rzeczą są oczywiście wątki (klasy Thread, StaticThread oraz ThreadBase), które dzięki nowościom ze standardu C++11 mogą przyjmować dowolną ilość argumentów dowolnego typu, a nie tylko znane z innych RTOSów void* i nic poza tym. Co więcej - funkcja wątku może być klasyczną funkcją, funkcją z klasy ("member function"), funktorem albo lambdą.

Wszystkie powyższe cechy są również obecne w timerach programowych (klasa SoftwareTimer).

Scheduler obsługuje pełne wywłaszczanie wątków na podstawie priorytetów (których może być 256), natomiast jeśli istnieje kilka wątków o tym samym priorytecie, to będą one szeregowane według algorytmu FIFO lub round-robin (algorytm jest konfigurowalny dla każdego wątku indywidualnie).

Najbardziej bazowym obiektem synchronizacyjnym jest chyba semafor (klasa Semaphore). Możliwe jest skonfigurowanie maksymalnej wartości jaką "przyjąć" może semafor, dzięki czemu możliwe jest również używanie tego obiektu jak semafora binarnego. Semafor może być "sygnalizowany" z przerwania.

Bardziej zaawansowanym mechanizmem synchronizacji jest mutex (klasa Mutex). Tak jak w POSIXie, możliwe jest skonfigurowanie wszystkich trzech "trybów" - normalnego, "error-checking" oraz "recursive" - i wszystkich trzech "protokołów" - normalnego, "priority inheritance" oraz "priority protocol" (znanego również jako "priority ceiling"). W przeciwieństwie do wielu innych RTOSów, protokół "priority inheritance" działa bez żadnych ograniczeń: z dowolną ilością "poziomów" dziedziczenia, niezależnie od tego ile mutexów jest zablokowanych przez wątek i w jakiej kolejności (diagram i opis testu sprawdzającego tą właśnie cechę).

Mechanizmem bazującym na mutexach jest klasyczna "condition variable" (klasa ConditionVariable).

Do klasycznej komunikacji pomiędzy wątkami i przerwaniami (w dowolnej kombinacji) użyć można kolejek. Kolejki dostępne są w czterech wariantach:

Wiadomości dodawane do kolejki bez obsługi priorytetów (...FifoQueue) szeregowane są według algorytmu FIFO, natomiast kolejki obsługujące priorytety (...MessageQueue) umożliwiają dodawanie wiadomości o jednym z 256 priorytetów. Kolejki bez wsparcia dla obiektów (...Raw...) kopiują wiadomości przy pomocy funkcji memcpy(), natomiast kolejki wspierające obiekty obsługują wszystkie wymagane w takiej sytuacji operacje (konstruktor, destruktor, operatory przypisania, swap, emplace, ...).

Wszelkie operacje blokujące dostępne są też w wariantach nieblokujących oraz w wersji blokującej z timeoutem (względnym lub bezwzględnym), który dzięki wprowadzonemu w C++11 std::chrono może być wyrażany wygodnie w dowolnych jednostkach (np. w sekundach, minutach, godzinach, ... - link), a nie tylko w "tickach" systemowych.

Wszelkie błędy sygnalizowane są za pomocą kodów błędów - funkcje nie używają ani zmiennej errno, ani wyjątków C++.

Jedyną obsługiwaną obecnie architekturą jest ARMv7-M, czyli ARM Cortex-M3 (można użyć ARM Cortex-M4 bez uruchamiania FPU) (dodano 20.03.2015) i ARM Cortex-M4(F), a jedynym "oficjalnie" wspieranym układem jest STM32F407VG (znanym z płytki STM32F4Discovery), choć użycie dowolnego innego układu z odpowiednim rdzeniem będzie trywialne.

Na koniec chyba najlepsze - użycie wszystkich wymienionych powyżej funkcjonalności możliwe jest bez wykorzystania pamięci alokowanej dynamicznie. Wszystkie opisane wcześniej obiekty mogą zostać stworzone jako obiekty globalne lub jako obiekty na stosie.

Na pewno jeszcze kilka ciekawych rzeczy pominąłem...

Zachęcam do testów, pytań, komentarzy, sugestii i współpracy (; Stay tuned!

Zmieniony: Piątek, 20 Marzec 2015 09:47
 
Work in progress...
Wpisany przez Freddie Chopin   
Piątek, 29 Sierpień 2014 19:37

O tym, żeby coś takiego zrobić, myślałem już od dawna... Jak jednak wiadomo od zamiarów do konkretów droga jest dosyć daleka, szczególnie przy niedoborze czasu wolnego. W końcu się jednak zebrałem, więc poniżej mała "zajawka" tego czym obecnie (między innymi rzeczami oczywiście) się zajmuję.

bool ThreadFunctionTypesTestCase::run_() const
{
    using scheduler::makeStaticThread;

    // thread with regular function
    {
        uint32_t sharedVariable {};
        constexpr uint32_t magicValue {0x394e3bae};

        auto regularFunctionThread = makeStaticThread<testThreadStackSize>(UINT8_MAX,
                regularFunction, std::ref(sharedVariable), magicValue);
        regularFunctionThread.start();
        regularFunctionThread.join();

        if (sharedVariable != magicValue)
            return false;
    }

    // thread with state-less functor
    {
        uint32_t sharedVariable {};
        constexpr uint32_t magicValue {0x2c2b7c30};

        auto functorThread = makeStaticThread<testThreadStackSize>(UINT8_MAX, Functor{},
                std::ref(sharedVariable), magicValue);
        functorThread.start();
        functorThread.join();

        if (sharedVariable != magicValue)
            return false;
    }

    // thread with member function of object with state
    {
        constexpr uint32_t magicValue {0x33698f0a};
        Object object {magicValue};

        auto objectThread = makeStaticThread<testThreadStackSize>(UINT8_MAX,
                &Object::function, std::ref(object));
        objectThread.start();
        objectThread.join();

        if (object.getVariable() != magicValue)
            return false;
    }

    // thread with capturing lambda
    {
        uint32_t sharedVariable {};
        constexpr uint32_t magicValue {0x24331acb};

        auto capturingLambdaThread = makeStaticThread<testThreadStackSize>(UINT8_MAX,
                [&sharedVariable, magicValue]()
                {
                    sharedVariable = magicValue;
                });
        capturingLambdaThread.start();
        capturingLambdaThread.join();

        if (sharedVariable != magicValue)
            return false;
    }

    return true;
}

Intrygujące? Ciekawe? Interesujące? (;

Jest to fragment testów funkcjonalnych projektu open-source, który obecnie jest we wczesnej fazie alpha (pierwsza linijka kodu powstała zaledwie miesiąc temu), jednak podstawowe rzeczy - jak na przykład te pokazane we fragmencie kodu poniżej - działają (na STM32F4) i to całkiem dobrze (; Na razie nie ma jeszcze o czym więcej pisać, w zasadzie jedynym śladem istnienia tego projektu jest repozytorium na github i ten właśnie news... Jak w każdym projekcie open-source tak i w tym najważniejsi są użytkownicy i szeroko pojęta społeczność, więc wszelkie pomysły, uwagi, opinie itp. możecie wstawiać tu - w komentarzach - albo na github. Jakby ktoś miał ochotę pokodować, to oczywiście również zapraszam do współpracy - projekt jest otwarty. Prace trwają, więc "stay tuned" (;

Cały plik źródłowy z którego pochodzi powyższy fragment można obejrzeć pod tym linkiem.

Zmieniony: Niedziela, 22 Marzec 2015 21:18
 
«PoczątekPoprzednia12345678910NastępnaOstatnie»

Strona 2 z 10