Qualcuno ha portato il framework dello stato QP per Arduino?


12

Nel rivedere possibili approcci per il mio progetto di registrazione dei dati, ho trovato il libro "Statechart UML pratici in C / C ++" molto interessante per un lavoro più serio con Arduino. QP è una famiglia di framework ultra-leggeri, open source, basati su macchine a stati per sistemi embedded e distribuiscono codice e porte per i loro framework (GNU GPL2) su http://www.state-machine.com/ dove hanno un porta per AVR e AVR mega usando il set di strumenti WinAVR / Gnu C ++.

Sebbene le intestazioni specifiche del chip siano appropriate, qualcuno ha creato un file BSP della scheda o ha avuto esperienza con questi framework? Ho appena iniziato con il libro, quindi ogni commento è molto apprezzato.


+1 sul commento di Jason S sul dare +1 per menzionare i caratteri di stato QP. Oh, anche Star e +1 uno sull'argomento ... perché suona groovy e non vedo l'ora di rispondere: P (scusate lo spam, oggi sono di umore divertente;))
cyphunk

Risposte:


4

Eviterei questo genere di cose come la peste.

La maggior parte dei software "seri" di basso livello che ho incontrato è stata una macchina a stati in questa forma:

#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;
}

Ci sono molti altri buoni approcci in C / C ++, ma non sono i miei preferiti.

Il grosso problema con strumenti come QP è che spesso è molto difficile fare cose che non vogliono che tu faccia. Se scegli di armeggiare manualmente con il codice, dovrai conservare il caso speciale per sempre.

Direi che gli statechart UML sono uno strumento fantastico per la documentazione, l'insegnamento e l'analisi. Ma non per la vera programmazione - ci sono strumenti molto migliori per questo :)


1
Non dimenticare le tasse di licenza per QP se il tuo codice è proprietario.
mjh2007,

1
Miglioramento minore del codice della macchina a stati: spesso aiuta l'affidabilità a mettere in coda i cambiamenti di stato e cambia sempre e solo lo stato effettivo prima dell'istruzione switch. In questo modo non devi preoccuparti che un interrupt cambi il tuo stato in STATE_INIT subito dopo aver pensato di averlo modificato in STATE_COMPLETE.
AngryEE,

3

Personalmente non ho usato il framework / libreria QP, a causa della licenza GPL. All'epoca, non pensavo che il mio datore di lavoro fosse pronto a tossire l'impasto per farmi sperimentare con le macchine a stato gerarchico di HSM usando QP. Ho dovuto implementare il mio che era simile al QP quando stavo eseguendo il refactoring di una terribile macchina a stati che occupava centinaia di righe di codice come l'esempio di Joby ma volte 1000. Il vecchio design che è stato preso in prestito per ottenere funzioni funzionanti in una scadenza serrata è stato un dolore terribile da mantenere. Temevo di aggiungere qualcosa di nuovo per paura di rompere qualcos'altro.

Ho riprogettato il codice in un HSM che aveva molto più senso per me personalmente su come il sistema dovrebbe comportarsi. Ha funzionato molto meglio di quanto potessi immaginare. È stato molto più facile da modificare e mantenere che avrei mai potuto sognare. Ho anche dovuto quasi rifare gran parte della macchina a stati, a causa di comportamenti imprevisti nel sistema. È stato molto più facile risolvere con il framework che avevo realizzato, e sono sicuro che sarebbe stato altrettanto facile in QP. Il framework che ho creato è diventato popolare e si è diffuso ad altre macchine a stati complessi all'interno della nostra base di codice.

Avevo un amico implementare il framework quantico usando Java in un robot che funzionava abbastanza bene. Faceva parte dell'algoritmo decisionale del robot basato su determinati input. Era naturale, date le decisioni che doveva prendere in base allo stato del robot.

Quello che capisco della bellezza di QP è la capacità di avere un framework pronto per una progettazione di macchine a stati che è ottimizzato per il tuo processore e non deve fare affidamento su strumenti CASE che emettono codice di caldaia inefficiente. Ma utilizzerei QP solo se hai implementato una serie complessa di macchine a stati per implementare quella descrizione del tuo progetto.

Se tutto ciò che hai è qualcosa di semplice come l'esempio di Joby, fallo come ha spiegato. Ma se trovi che la tua macchina a stati cresce e cresce con tutti i tipi di dichiarazioni "if else" avvolte in condizioni diverse ... allora potrebbe essere il momento di provare qualcosa come QP per scomporlo in HSM.


1

Espandere sull'esempio di Joby un modo più pulito per implementare una macchina a stati molto grande è sostituire l'istruzione case con una matrice di puntatori a funzione. Quindi è possibile isolare tutto il codice per uno stato particolare all'interno di una funzione. Ho scoperto che implementarlo in questo modo richiede molta meno memoria del programma.


1

sostituire l'istruzione case con una matrice di puntatori a funzione

Ecco come funziona il materiale QP. La rappresentazione di uno stato è solo un puntatore a funzione (alla funzione per lo stato corrente). In C ++ potrebbe essere un puntatore alla funzione membro, ma sostanzialmente lo stesso. La funzione di stato corrente viene chiamata con eventi, nonché con alcuni pseudo-eventi (entrata, uscita), uno dei quali è sempre non gestito e viene utilizzato per determinare la nidificazione dello stato quando si eseguono transizioni nidificate (QP supporta macchine a stati gerarchiche).

Miro Samek dice che presto realizzerà una porta con destinazione Arduino.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.