¿Cuál es la mejor manera de implementar un retardo de no bloqueo para una máquina de estado para cada estado? Hasta ahora, lo mejor que encontré es algo así:
static uint8_t state = STATE_ONE;
if (state == STATE_ONE)
{
static uint64_t time_value_ms = (uint64_t)0;
if (time_value_ms == (uint64_t)0)
{
time_value_ms = system_get_ms() + delay_ms;
}
else
{
if (system_get_ms() > time_value_ms)
{
time_value_ms = (uint64_t)0;
state = STATE_TWO;
}
}
}
else if (state == STATE_TWO)
{
static uint64_t time_value_ms = (uint64_t)0;
if (time_value_ms == (uint64_t)0)
{
time_value_ms = system_get_ms() + delay_ms;
}
else
{
if (system_get_ms() > time_value_ms)
{
time_value_ms = (uint64_t)0;
state = STATE_ONE;
}
}
}
.
.
.
else
{
return;
}
Pero el problema en el código anterior es que cuando el estado cambia, la variable time_value_ms
tiene que establecerse en 0
para estar disponible para contar una demora nuevamente cuando el estado regrese en el STATE_ONE
después .
Por lo tanto, cuando necesita un retardo de no bloqueo en todos los estados de una máquina de estados grande con demasiados estados (por ejemplo, 10 estados), el código se vuelve complejo con una legibilidad muy mala.
El retraso se utiliza como temporizador de tiempo de espera para un interbloqueo o un temporizador de eventos.