Quando si implementa un protocollo di comunicazione multilivello, i livelli sono comunemente implementati come macchine di stato?
Ho un'implementazione di PMBus su cui sto attualmente lavorando per un dispositivo incorporato. Ho un'interfaccia basata su interrupt per la gestione di come l'I2C utilizza il driver H / W per ricevere e trasmettere byte su e fuori da un buffer, essenzialmente serializzando i dati.
Una macchina a stati implementa quindi il livello SMBus "medio" prendendo i dati dal buffer e formando messaggi da esso in base a come il protocollo impone cosa aspettarsi per un messaggio di tipo generico, questa macchina a stati può anche aggiungere informazioni basate sull'input da linee I / O aggiuntive.
Una seconda macchina a stati quindi blocca lo stack con il livello PMBus controllando il messaggio generico come si applica a tipi specifici di messaggi, aggiungendo di nuovo alcune ulteriori informazioni dalle linee di I / O e successivamente cerca un gestore di comandi in base al messaggio e passa i dati dal messaggio.
L'intero caboodle funziona quindi al contrario per trasmettere le risposte dal gestore di comandi o richieste da altre parti del sistema (che funziona da una macchina a stati terzi) per modificare l'output sulle linee di I / O, come la registrazione di uno stato di errore che richiede una richiesta di segnale di servizio.
Vengo da uno sfondo embedded di basso livello con poca esperienza di programmazione del lavoro reale, di conseguenza ho solo una piccola idea dei modelli di progettazione previsti e accettati per problemi comuni. Quindi la mia domanda; è una tale macchina statale che mette a punto una soluzione comune o logicamente prevista per l'implementazione di protocolli stratificati?
Mi è sembrato efficace e robusto (un requisito morbido è che la funzionalità del livello sia incapsulata) quando l'ho pensato qualche tempo fa, ma ripensandoci su esso sembra che sia un po 'sovraingegnerizzato e che ci potrebbe essere un po' più semplice metodo.
EDIT: mi sono ricordato che la ragione principale per cui ho seguito questa rotta è che l'esecuzione degli strati superiori è disaccoppiata dall'interfaccia basata sull'interrupt. Questo è utile perché da un interrupt per i dati ricevuti fino al ritorno dal gestore di comandi per i dati trasmessi può (a seconda di come deve essere utilizzata l'implementazione) può costituire un tempo relativamente lungo rispetto alla logica di business principale del mio dispositivo che opera abbastanza velocemente e ha il requisito del tempo di esecuzione nel caso peggiore. Quindi la mia macchina a stati logici di business (la terza da sopra) è ciò che chiama le macchine dello stato del protocollo, dall'alto verso il basso, quando ha tempo. Ciò significa che mentre la ricezione e la trasmissione dei dati sono asincrone, l'elaborazione dei dati non è.