Ho poche macchine a stati che girano "simultaneamente" in un super-ciclo.
do
{
state_one();
state_two();
state_three();
/* The point I want to deal with the error */
} while(1);
Ciascuna di queste macchine a stati potrebbe essere costituita da altre macchine a stati.
Sto cercando di capire come riuscirò a cogliere una situazione inaspettata e ad analizzarla direttamente al main.
Il che significa che l'errore dovrà passare attraverso tutti gli stati e che ogni stato deve affrontare questo errore. Ad esempio: il microcontrollore che sto utilizzando è un ATSAM4S Cortex-M4 e che si occupa dell'errore potrebbe essere:
- Ripristino del sistema
- Non reimpostare il timer del watchdog
- Stampa un messaggio triste
- Lampeggia un led sul tabellone
- Scrivi qualcosa in una memoria esterna
- Disabilita un alimentatore
- Attiva una variabile
- Esegui un'altra macchina a stati
- Forza una macchina a stati per cambiarne lo stato
- Ignora l'errore
Le mie macchine a stati sono implementate con il metodo puntatore a funzione
typedef struct My_state_machine_t
{
uint32_t (*run)(struct My_state_machine_t * const This_state_p);
uint64_t entry_time_ms;
}My_state_machine_t;
state_one () potrebbe contenere:
My_state_machine_t my_state = {
.run = first_state;
};
uint32_t state_one(void)
{
if (my_state.run != NULL)
{
my_state.run(&my_state);
}
return 0;
}
uint32_t first_state(My_state_machine_t * const This_state_p)
{
/* run some functions */
// Now we are jumping to next state
This_state_p->run = &this_is_the_next_state;
This_state_p->entry_time_ms = system_get_ms();
return 0;
}
Inoltre, ogni stato darà un diverso tipo di errore. Diversi tipi di errore significano azioni diverse. Inoltre, alcuni errori potrebbero essere comuni tra gli stati e in questo caso il "gestore degli errori" dovrà prendere le stesse decisioni o simili (ad esempio, il ripristino del sistema).