Czy ktoś przenosił ramkę stanu QP dla Arduino?

12

Przeglądając możliwe podejścia do mojego projektu rejestrowania danych, odkryłem, że książka „Praktyczne statystyki UML w C / C ++” jest bardzo interesująca dla bardziej poważnej pracy z Arduino. QP to rodzina ultralekkich, opartych na otwartych źródłach platform opartych na automatach stanowych dla systemów wbudowanych, które dystrybuują kod i porty dla swoich platform (GNU GPL2) na stronie http://www.state-machine.com/, gdzie mają port dla AVR i AVR mega przy użyciu zestawu narzędzi WinAVR / Gnu C ++.

Chociaż nagłówki specyficzne dla układu są odpowiednie, to czy ktoś stworzył plik BSP płyty lub miał jakieś doświadczenie z tymi frameworkami? Zaczynam od książki, więc wszelkie komentarze są mile widziane.

Harley Mackenzie
źródło
+1 do komentarza Jasona S o dawaniu +1 za wzmiankę o znakach stanu QP. Och, także Star i +1 jeden temat ... bo to brzmi groovy i czekam na odpowiedzi: P (przepraszam za spam, dziś w zabawnym nastroju;))
cyphunk

Odpowiedzi:

4

Unikałbym takich rzeczy jak zarazy.

Najbardziej „poważne” oprogramowanie niskiego poziomu, jakie napotkałem, jest maszyną stanową w tej formie:

#include <stdio.h>

typedef enum
{
    STATE_INIT,     // Description
    STATE_RUNNING,  // Description
    STATE_COMPLETE  // Description
} state_t;

int main(void)
{
    state_t state = STATE_INIT; // setup the initial state

    while(1)
    {
        os_run(); // call the OS services (poll the UART, check buttons, etc.)

        switch(state)
        {
            case STATE_INIT:
                state = STATE_RUNNING;
                puts("init");
                break;
            case STATE_RUNNING:
                state = STATE_COMPLETE;
                puts("running");
                break;
            case STATE_COMPLETE:
                puts("complete");
                break;
        }
    }
    return 0;
}

Istnieje wiele innych dobrych podejść w C / C ++, ale nie są to moje ulubione.

Duży problem z narzędziami takimi jak QP polega na tym, że często bardzo trudno jest robić rzeczy, których nie chcą. Jeśli zdecydujesz się ręcznie manipulować kodem, będziesz musiał zachować wyjątkowy przypadek na zawsze.

Powiedziałbym, że statystyki UML są fantastycznym narzędziem do dokumentacji, nauczania i analiz. Ale nie do faktycznego programowania - są do tego znacznie lepsze narzędzia :)

Toby Jaffey
źródło
1
Nie zapomnij o opłatach licencyjnych za QP, jeśli Twój kod jest zastrzeżony.
mjh2007
1
Niewielkie udoskonalenie stanowego kodu maszynowego: często pomaga niezawodności w kolejce zmian stanu i zawsze zmienia rzeczywisty stan tuż przed instrukcją switch. W ten sposób nie musisz się martwić o przerwanie zmiany stanu na STATE_INIT zaraz po tym, jak pomyślałeś, że zmieniłeś go na STATE_COMPLETE.
AngryEE
3

Ja osobiście nie korzystałem z frameworka / biblioteki QP z powodu licencji GPL. W tamtym czasie nie sądziłem, że mój pracodawca jest gotowy wykrztusić ciasto, abym mógł eksperymentować z HSM (hierarchicznymi maszynami stanów) za pomocą QP. Musiałem wdrożyć własny, podobny do QP, kiedy refaktoryzowałem okropną maszynę stanową, która zajmowała setki wierszy kodu jak przykład Joby'ego, ale razy 1000. Stary projekt, który został zapożyczony, aby uruchomić funkcje w napiętym terminie było okropnym bólem do utrzymania. Bałem się, że spróbuję dodać do niej coś nowego z obawy przed zepsuciem czegoś innego.

Przeprojektowałem kod w HSM, który miał dla mnie znacznie więcej sensu w tym, jak powinien zachowywać się system. Działało o wiele lepiej, niż mogłem sobie wyobrazić. O wiele łatwiej było je modyfikować i utrzymywać, niż kiedykolwiek mogłem marzyć. Musiałem nawet prawie przerobić wiele maszyn stanowych z powodu nieoczekiwanego zachowania w systemie. O wiele łatwiej było to naprawić za pomocą stworzonego przeze mnie frameworka i jestem pewien, że w QP byłoby to równie łatwe. Frameworka, którą zbudowałem, stała się popularna i rozprzestrzeniła się na inne złożone maszyny stanu w naszej bazie kodu.

Miałem przyjaciela, który zaimplementował platformę kwantową przy użyciu Javy w robocie, który działał całkiem dobrze. Było to częścią algorytmu decyzyjnego robota opartego na pewnych danych wejściowych. To było naturalne dopasowanie, biorąc pod uwagę decyzje, które musiał podjąć w oparciu o stan robota.

Rozumiem, że piękno QP polega na tym, że mam gotowość do stworzenia szkieletu dla projektu maszyny stanów zoptymalizowanego pod kątem twojego procesora i nie musisz polegać na narzędziach CASE wyrzucających nieefektywny kod płytki. Ale użyłbym QP tylko wtedy, gdy masz zestaw złożonych maszyn stanów do implementacji, które opisują twój projekt.

Jeśli wszystko, co masz, to coś tak prostego jak przykład Joby'ego, zrób to tak, jak wyjaśnił. Ale jeśli zauważysz, że twoja maszyna stanowa rośnie i rośnie wraz z różnego rodzaju stwierdzeniami „jeśli inaczej” owiniętymi wokół różnych warunków ... to może nadszedł czas, aby wypróbować coś w rodzaju QP, aby rozbić ją na HSM.

Jay Atkinson
źródło
1

Rozszerzając przykład Joby'ego, czystszym sposobem na implementację bardzo dużej maszyny stanów jest zastąpienie instrukcji case tablicą wskaźników funkcji. Następnie możesz wyizolować cały kod dla określonego stanu wewnątrz funkcji. Przekonałem się, że wdrożenie go w ten sposób wymaga znacznie mniej pamięci programu.

mjh2007
źródło
1

zastąp instrukcję case tablicą wskaźników funkcji

Tak działa QP. Reprezentacja stanu jest tylko wskaźnikiem funkcji (do funkcji dla bieżącego stanu). W C ++ może to być wskaźnik do funkcji składowej, ale w zasadzie taki sam. Bieżąca funkcja stanu jest wywoływana ze zdarzeniami, a także z niektórymi pseudo-zdarzeniami (wejście, wyjście), z których jedno jest zawsze nieobsługiwane i służy do określania zagnieżdżenia stanu podczas wykonywania zagnieżdżonych przejść (QP obsługuje hierarchiczne maszyny stanów).

Miro Samek mówi, że wkrótce będzie robił port przeznaczony dla Arduino.


źródło