Ho una macchina di tabella/stato di verità (piuttosto) grande che devo implementare nel mio codice (C incorporato). Prevedo che le specifiche di comportamento di questa macchina a stati cambino in futuro e quindi mi piacerebbe mantenerlo facilmente modificabile in futuro.Tabelle di verità nel codice? Come strutturare la macchina a stati?
La mia tabella di verità ha 4 ingressi e 4 uscite. Ho tutto in un foglio di calcolo di Excel, e se potessi semplicemente incollarlo nel mio codice con un po 'di formattazione, sarebbe l'ideale.
pensavo mi piacerebbe accedere al mio tabella di verità in questo modo:
u8 newState[] = decisionTable[input1][input2][input3][input4];
E poi ho potuto accedere ai valori di uscita con:
setOutputPin(LINE_0, newState[0]);
setOutputPin(LINE_1, newState[1]);
setOutputPin(LINE_2, newState[2]);
setOutputPin(LINE_3, newState[3]);
Ma al fine di ottenere ciò, sembra che dovrei fare una tabella abbastanza confusa in questo modo:
static u8 decisionTable[][][][][] =
{{{{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 }},
{{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 }}},
{{{ 0, 0, 1, 1 },
{ 0, 1, 1, 1 }},
{{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 }}}},
{{{{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 }},
{{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 }}},
{{{ 0, 1, 1, 1 },
{ 0, 1, 1, 1 }},
{{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 }}}};
Quelle parentesi annidate n essere un po 'confuso - qualcuno ha un'idea migliore di come posso mantenere una tabella carina nel mio codice?
Grazie!
Edit in base alla risposta del HUAGHAGUAH:
Utilizzando un amalgama di ingresso di tutti (grazie - vorrei poter "accettare" 3 o 4 di queste risposte), penso che ho intenzione di provarlo come una matrice bidimensionale. Io indice nel mio array usando un po 'piccolo-shifting macro:
#define SM_INPUTS(in0, in1, in2, in3) ((in0 << 0) | (in1 << 1) | (in2 << 2) | (in3 << 3))
E che lasciare che la mia matrice di tabella verità simile a questa:
static u8 decisionTable[][] = {
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 1, 1 },
{ 0, 1, 1, 1 },
{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 },
{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 },
{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 },
{ 0, 1, 1, 1 },
{ 0, 1, 1, 1 },
{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 }};
e posso quindi accedere alla mia tabella di verità come so:
decisionTable[ SM_INPUTS(line1, line2, line3, line4) ]
Darò uno scatto e vedrò come funziona. Sostituirò anche gli 0 e gli 1 con #defaggi più utili che esprimono ciò che ogni stato significa, insieme a/**/commenti che spiegano gli input per ogni linea di output. Grazie per l'aiuto a tutti!
Dal momento che è incorporato, l'utilizzo della memoria deve essere una limitazione delle risorse? – EvilTeach
@EvilTeach: Grazie per la domanda. Anche se è incorporato, stiamo lavorando su un ferro piuttosto pesante con un sacco di flash e RAM da buttare in giro (entro limiti ragionevoli). La leggibilità del codice è il fattore più importante qui. – HanClinto
Ancora uno. Hai una chiamata API che ti consente di impostare tutti e 4 i pin allo stesso tempo? – EvilTeach