Strona główna
Witaj na stronie Chopina!
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
 
OpenOCD w wersji 0.8.0
Wpisany przez Freddie Chopin   
Poniedziałek, 28 Kwiecień 2014 08:45
Od wydania poprzedniej wersji OpenOCD minął prawie idealnie rok, a skompilowana paczka dla Windows zostałą pobrana prawie 20000 razy, więc czas na nową wersję. Wczoraj opublikowane zostały źródła wersji 0.8.0, a paczka z plikami wykonywalnymi dla systemu Windows już dziś jest dostępna na mojej stronce (Download > Programy > OpenOCD). Lista zmian względem wersji poprzedniej jest nieco przydługawa, wiec pozwolę sobie tylko podać link do oficjalnej informacji na stronie projektu... Z mojej strony tylko jedna istotna informacja - obecnie wszystkie interfejsy korzystające z biblioteki libftdi wymagają sterowników WinUSB (poprzednio wymagały sterowników libusb-win32) - zmiana ta związana jest z przejściem na nową wersję biblioteki - libftdi1. Sterownik oczywiście najlepiej instalować przy użyciu oprogramowania zadig, a krótką instrukcję jak tego dokonać można znaleźć w pliku "drivers\libusb-1.0 drivers.txt" znajdującym się w paczce.
Zmieniony: Poniedziałek, 28 Kwiecień 2014 09:00
 
Nowe wersje - OpenOCD 0.7.0 oraz bleeding-edge-toolchain-130503
Wpisany przez Freddie Chopin   
Niedziela, 05 Maj 2013 16:31

Pogoda nie dopisała w weekend majowy, ale za to "obrodziło" nowymi wersjami oprogramowania (;

W piątek, 03.05.2013, ~3 miesiące po poprzednim wydaniu, udostępniłem najnowszą kompilację bleeding-edge-toolchain, oznaczoną numerkiem 130503. Z ciekawostek warto chyba wymienić zestaw opcji konfiguracyjnych biblioteki newlib, część z nich jeszcze świeżych: --disable-newlib-fvwrite-in-streamio, --disable-newlib-fseek-optimization oraz --disable-newlib-wide-orient. Opcje te pozwalają zmniejszyć rozmiar kodu korzystającego z funkcji z nagłówka stdio.h. Dodatkowo - dzieki pozbyciu się opcji --enable-newlib-register-fini - jeśli kod nie korzysta z funkcji typu atexit() to obsługa tej funkcjonalności nie zostanie zlinkowana. Ze względu na ograniczenie transferu witryny wszystkie pliki bleeding-edge-toolchain zostały przeniesione na stronę sourceforge, w dziale Download > Programy > bleeding-edge-toolchain znajdują się linki do odpowiednich lokalizacji.

Natomiast dziś, 05.05.2013, wydane zostało OpenOCD w wersji 0.7.0. Od wydania poprzedniej wersji 0.6.1 minęło prawie 7 miesięcy, a paczka dla systemu Windows została pobrana ponad 11000 razy. Nowości nie jest zbyt wiele, warto jednak wymienić obsługę debuggera ICDI od Texas Instruments, poprawioną obsługę układów MIPS, wsparcie dla architektury Cortex-R4 (ARMv7R), wsparcie dla debuggowania ChibiOS/RT, obsługę układów LPC43xx i LPC18xx (zarówno z wewnętrznym flashem jak i z zewnętrznymi pamięciami podłączonymi przez interfejs SPIFI), EFM32, STM32W oraz i.MX6. Skompilowana paczka dla systemi Windows dostępna jak zwykle w dziale Download > Programy > OpenOCD.

Zapraszam więc do pobierania i korzystania!

Przy okazji - z racji monotonii spowodowanej ciągłym deszczem - postanowiłem na facebooku założyć stronę promującą moją firmę DISTORTEC, zapraszam więc do zaglądania i klikania w "Lubię to!" > https://www.facebook.com/Distortec

UPDATE 11.05.2013:

Powstała kolejna wersja bleeding-edge-toolchain, oznaczona numerkiem 130509. Są dokładnie dwie przyczyny powstania tej kompilacji. Pierwsza - okazało się, że opcja --disable-newlib-atexit-alloc nie istnieje, a zamiast niej powinno być --disable-newlib-atexit-dynamic-alloc - dzięki temu funkcjonalności związane z atexit() nie dokonują dynamicznej alokacji pamięci. Drugą przyczyną jest potrzeba zastosowania w aktualnie realizowanym projekcie modyfikatorów wprowadzonych przez standard C99 w funkcjach typu printf() / scanf(), czyli tych wszystkich dziwnych %hhx itp.. Efektem tej drugiej zmiany jest niewielki wzrost zapotrzebowania tychże funkcji na pamięć RAM, wynoszący ~80 bajtów - wiadomo, coś za coś (; .

Zmieniony: Sobota, 11 Maj 2013 08:23
 
«PoczątekPoprzednia12345678910NastępnaOstatnie»

Strona 2 z 10