Strona g?ówna Artyku?y News distortos - 7 miesi?cy i 0x3FF commitów!

Menu g?ówne

Ocena użytkownikĆ³w: / 2
SłabyŚwietny 
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