4 votos

¿Que corresponden al código de máquina de estado finito de μC?

Cuando me enteré del micrcontrollers, los maestros me enseñaron a siempre final, el código con while(1); con no de código dentro de ese bucle.

Esto fue para asegurarse de que el software de "pegado" a mantener la interrupción del trabajo. Cuando les pregunté si era posible poner algo de código en este bucle infinito, me dijeron que era una mala idea. Sabiendo eso, yo ahora a intentar mi mejor esfuerzo para mantener este bucle vacío.

Ahora necesito implementar una máquina de estados finitos en un microcontrolador. A primera vista, parece que el código de pertenecer en este bucle. Que hace que la codificación sea más fácil.

Es una buena idea? ¿Cuáles son los pros y los contras?


Esto es lo que pienso hacer :

void main(void)
{
    // init phase

 while(1)
 {
    switch(current_State)
    {
    case 1:
        if(...)
        {
            current_State = 2;
        }
        else(...)
        {
            current_State = 3;
        }
        else
            current_State = 4;
        break;

    case 2:
        if(...)
        {
            current_State = 3;
        }
        else(...)
        {
            current_State = 1;
        }
        else
            current_State = 5;
        break;

Y este código va en...


Pido a la misma pregunta en stackOverflow para obtener algo más de detalle.

4voto

Martin Rosenau Puntos 196

Estoy trabajando en la industria de la automoción.

Es frecuente ver esos bucles interminables en situaciones en las que la CPU debe restablecer, como este:

if(some_error_occurred)
{
    while(1);
}

La electrónica del vehículo tienen un llamado de vigilancia. La CPU debe enviar una señal a la watchdog cada pocos millieseconds. De lo contrario, el watchdog reset de la CPU.

Debido a que la CPU está atrapado en el bucle sin fin en el ejemplo anterior, la señal ya no se envía y la CPU se pone a cero.

Sin embargo, normalmente el 99% de todas las Cpu en la industria de la automoción no tienen un "regular" final. Esto significa que el código entero de la CPU se podría escribir de la siguiente manera:

initialize_cpu();
perform_initial_actions();
while(1)
{
    perform_cyclic_actions_endlessly();
}

Porque no hay "final" del programa while de bucle en la "final" del programa no puede existir.

3voto

Bernd Puntos 61

La elección de la forma de manejar esto depende totalmente de cómo el sistema de control de la micro controlador está destinado a trabajar. Veo dos normales escenarios.

A. Si el control de flujo es uno de los que "se ejecuta hasta el final" y esperar a que un ciclo de encendido o reinicio del ciclo de reinicio, entonces la terminación apropiada es el "while(1)".

B. Si el control de flujo es aquel en el que el trabajo "se ejecuta continuamente" hasta que sea terminado en un reinicio o un ciclo de alimentación, a continuación, el diseño apropiado es tener el código son la FSM con sus variables de estado se activa dentro de un "while(1) {}" de la construcción. Tenga en cuenta que a menudo la mejor aplicación de la FSM es como una instrucción switch con los casos que corresponden a cada valor de la variable de estado.

El más simple de los dispositivos puede ser capaz de ser manejada mediante un único FSM. La mayoría de los sistemas más complejos se tienen múltiples FSMs implementado como interruptor/casos dentro de una subrutina. El principal para siempre "while(1) {}" construcción habría una secuencia de llamadas a cada uno de los estado de la FSM de la máquina de subrutinas. A veces, uno o más de temporizador o de e/S interrupciones también funcionará FSMs en el primer plano sobre el principal de la construcción.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X