Macchina a Stati

di il
4 risposte

Macchina a Stati

C'è qualcuno che può spiegarmi il funzionamento della macchina a stati (FwSmDesc_t createMainStateMachine(void* smData)) in C++?

4 Risposte

  • Re: Macchina a Stati

    Che cosa e' quella signature che hai indicato?
    su che libro stai studiando?
    sai che cosa e' un grafo?
  • Re: Macchina a Stati

    Questa FwSmDesc_t createMainStateMachine(void* smData) è la funzione che inizializza la macchina a stati ti posto l'intero codice.

    FwSmDesc_t createMainStateMachine(void* smData)
    {
    const FwSmCounterU2_t STATE_IDLE = 1; ///< The identifier of state
    const FwSmCounterU2_t N_OUT_OF_STATE_IDLE = 2; ///< The number of transitions out of state
    const FwSmCounterU2_t STATE_CONNECTING = 2; ///< The identifier of state
    const FwSmCounterU2_t N_OUT_OF_STATE_CONNECTING = 2; ///< The number of transitions out of state
    const FwSmCounterU2_t STATE_PROGRAMMING = 3; ///< The identifier of state
    const FwSmCounterU2_t N_OUT_OF_STATE_PROGRAMMING = 1; ///< The number of transitions out of state

    /** Create state machine smDesc */
    FW_SM_INST(smDesc,
    3, ///< NSTATES - The number of states
    0, ///< NCPS - The number of choice pseudo-states
    6, ///< NTRANS - The number of transitions
    9, ///< NACTIONS - The number of state and transition actions
    0 ///< NGUARDS - The number of transition guards
    );
    FwSmInit(&smDesc);

    /** Configure the state machine smDesc */
    FwSmSetData(&smDesc, smData);
    FwSmAddState(&smDesc, STATE_IDLE, N_OUT_OF_STATE_IDLE, &enter_StateIdle, &exit_StateIdle, &do_StateIdle, NULL);
    FwSmAddState(&smDesc, STATE_CONNECTING, N_OUT_OF_STATE_CONNECTING, &enter_StateConnecting, &exit_StateConnecting, NULL, NULL);
    FwSmAddState(&smDesc, STATE_PROGRAMMING, N_OUT_OF_STATE_PROGRAMMING, &enter_StateProgramming, &exit_StateProgramming, &do_StateProgramming, NULL);
    FwSmAddTransIpsToSta(&smDesc, STATE_IDLE, NULL);
    FwSmAddTransStaToSta(&smDesc, TriggerEnterProgrammingMode, STATE_IDLE, STATE_PROGRAMMING, NULL, NULL);
    FwSmAddTransStaToSta(&smDesc, TriggerTimeIsUp, STATE_IDLE, STATE_CONNECTING, NULL, NULL);
    FwSmAddTransStaToSta(&smDesc, TriggerConnectionSucceded, STATE_CONNECTING, STATE_IDLE, NULL, NULL);
    FwSmAddTransStaToSta(&smDesc, TriggerConnectionFailed, STATE_CONNECTING, STATE_IDLE, NULL, NULL);
    FwSmAddTransStaToSta(&smDesc, TriggerExitProgrammingMode, STATE_PROGRAMMING, STATE_IDLE, NULL, NULL);

    return &smDesc;
    }
  • Re: Macchina a Stati

    A parte il fatto che devi usare i tag Code altrimenti non si capisce nulla, e che un pezzo di codice messo li, senza il contesto, senza tutte le parti mancanti, serve relativamente a poco, e' relativamente facile capire che cosa e' una macchina a stati

    Una macchina a stati o anche automa a stati finiti e' un grafo in cui i nodi sono gli stati (in questo caso STATE_IDLE, STATE_CONNECTING, STATE_PROGRAMMING), una serie di archi diretti che collegano i vari nodi, ed uno stato corrente

    In generale c'e' un nodo iniziale ed uno o piu' nodi finali.

    Si parte dallo stato iniziale, quindi si passa da uno stato all'altro in base a qualche evento (che dipende dall'implementazione), fino ad arrivare allo stato finale.

    In questo caso gli eventi sono: TriggerEnterProgrammingMode, TriggerTimeIsUp, TriggerConnectionSucceded, TriggerConnectionFailed, TriggerExitProgrammingMode

    Questa e' la spiegazione veloce e minimale (devi sapere che cosa e' un grafo).

    Inoltre, se leggi il codice, in base a quello che ho scritto, puoi facilmente ricostruire su carta il grafo.

    Per la versione un po' piu' completa leggi qui':



    Per la versione approfondita ci sono interi corsi alla facolta' di Scienze dell'Informazione e un sacco di libri (e' il pane degli informatici )

    Ad esempio, le espressioni regolari sono un modo di descrivere un automa a stati finiti in cui l'evento e' la lettura di un carattere e gli stati rappresentano i prefissi della stringa che si sta' leggendo e che soddisfano parte della RE
  • Re: Macchina a Stati

    Una macchina a stati la puoi creare anche tu senza entrare in librerie complciate , visto che poi non le conosci .Progetta una bella struttura dati con i tuoi dati in formato booleano
    
    typedef struct sStati
    {
    	unsigned int stato1:1 ;
    	unsigned int stato2:1 ;
    	unsigned int stato3:1 ;
    	unsigned int stato4:1 ;
    	.........................
    	unsigned int stato16:1 ;
    }msf;
    
    typedef union u_Stati
    {
    	unsigned int W;
    	msf       val;
    };
    

    la union puo' servir eper valutare lo stato in generale o inm forma numerica , azzerarlo ect.
    Quando hai una certa condizione parti con gli stati tutti azzerati , e setti il primo .
    Nel ramo switch o in statements if valuti all'interno del primo stato le condizioni che passano al secondo stato e resettano il primo oppur estartano altri passi e lasciano vivo il primo passo ....
    Se vuoi azzerare tutto basta che usi il campo W della union .....
    Pensa sempre alle attività che svolgi quando sei seduto e vuoi uscire da una stanza.....sono seduto , mi devo alzare, sono alzato ? si vado avanti nella direzione giusta , arrivo davanti alla porta , verifico se e' gia aperta , seno la apro ect ect .......
    S epoi invece la macchina a stati finiti e' applciata a qualcosa di tipo comunicazione o condivisa tra piu processi i threads allora devi implementare i mutes , i semafori , i lock per sincronizzare le operazioni ma la macchina a stati e' sempre quella .Ovviamente se invece di chiamare ogni stato come ho fatto io , gli dai un nome con un senso pratico all'pplicazione è meglio
    ciao
    Walter
Devi accedere o registrarti per scrivere nel forum
4 risposte