¿Alguien portó el marco de estado QP para Arduino?

12

Al revisar posibles enfoques para mi proyecto de registro de datos, he encontrado que el libro "Gráficos de estado prácticos de UML en C / C ++" es muy interesante para un trabajo más serio con Arduino. QP es una familia de frameworks ultraligeros, de código abierto, basados ​​en máquinas de estado para sistemas embebidos y distribuyen código y puertos para sus frameworks (GNU GPL2) en http://www.state-machine.com/ donde tienen un puerto para el AVR y AVR mega usando el conjunto de herramientas WinAVR / Gnu C ++.

Aunque los encabezados específicos del chip son apropiados, ¿alguien ha creado un archivo BSP de placa o ha tenido alguna experiencia con estos marcos? Estoy empezando con el libro, por lo que cualquier comentario será muy apreciado.

Harley Mackenzie
fuente
+1 en el comentario de Jason S sobre dar +1 por mencionar caracteres de estado QP. Ah, también Star y +1 son el tema ... porque suena maravilloso y espero respuestas: P (perdón por el spam, solo de humor gracioso hoy;))
cyphunk

Respuestas:

4

Evitaría este tipo de cosas como la peste.

La mayoría del software de nivel bajo "serio" que he encontrado ha sido una máquina de estado de esta forma:

#include <stdio.h>

typedef enum
{
    STATE_INIT,     // Description
    STATE_RUNNING,  // Description
    STATE_COMPLETE  // Description
} state_t;

int main(void)
{
    state_t state = STATE_INIT; // setup the initial state

    while(1)
    {
        os_run(); // call the OS services (poll the UART, check buttons, etc.)

        switch(state)
        {
            case STATE_INIT:
                state = STATE_RUNNING;
                puts("init");
                break;
            case STATE_RUNNING:
                state = STATE_COMPLETE;
                puts("running");
                break;
            case STATE_COMPLETE:
                puts("complete");
                break;
        }
    }
    return 0;
}

Hay muchos otros buenos enfoques en C / C ++, pero no son mis favoritos.

El gran problema con herramientas como QP es que a menudo es muy difícil hacer cosas que no quieren que hagas. Si elige jugar con el código manualmente, tendrá que mantener el caso especial para siempre.

Yo diría que los gráficos de estado UML son una herramienta fantástica para la documentación, la enseñanza y el análisis. Pero, no para la programación real, hay herramientas mucho mejores para eso :)

Toby Jaffey
fuente
1
No olvide las tarifas de licencia para QP si su código es propietario.
mjh2007
1
Mejora menor en el código de máquina de estado: a menudo ayuda a la confiabilidad a poner en cola los cambios de estado y solo cambia el estado real justo antes de la declaración del interruptor. De esa manera, no tiene que preocuparse de que una interrupción cambie su estado a STATE_INIT justo después de pensar que lo cambió a STATE_COMPLETE.
AngryEE
3

Personalmente no he usado el framework / biblioteca QP, debido a la licencia GPL. En ese momento, no creía que mi empleador estuviera listo para gastar la masa para que yo experimentara con HSM (máquinas de estado jerárquicas) usando QP. Tuve que implementar el mío que era similar a QP cuando refactorizaba una máquina de estado horrible que ocupaba cientos de líneas de código como el ejemplo de Joby, pero multiplicado por 1000. El diseño antiguo que se tomó prestado para poner en funcionamiento las características en un plazo ajustado Fue un dolor terrible de mantener. Temía tratar de agregarle algo nuevo por miedo a romper algo más.

Rediseñé el código en un HSM que tenía mucho más sentido para mí personalmente sobre cómo debería comportarse el sistema. Funcionó mucho mejor de lo que podía imaginar. Era mucho más fácil modificarlo y mantenerlo de lo que podría soñar. Incluso tuve que rehacer gran parte de la máquina de estado, debido a un comportamiento inesperado en el sistema. Fue mucho más fácil arreglarlo con el marco que había creado, y estoy seguro de que habría sido igual de fácil en QP. El marco que construí se hizo popular y se extendió a otras máquinas de estado complejas dentro de nuestra base de código.

Tuve un amigo que implementó el marco cuántico usando Java en un robot que funcionó bastante bien. Formaba parte del algoritmo de toma de decisiones del robot basado en ciertas entradas. Fue un ajuste natural, dadas las decisiones que tuvo que tomar en función del estado del robot.

Lo que entiendo de la belleza de QP es la capacidad de tener un marco listo para un diseño de máquina de estado que esté optimizado para su procesador y no tener que depender de las herramientas CASE que escupen código ineficiente. Pero, solo usaría QP si tiene un conjunto complejo de máquinas de estado para implementar que describa su diseño.

Si todo lo que tienes es algo tan simple como el ejemplo de Joby, entonces hazlo como él explicó. Pero si encuentra que su máquina de estados crece y crece con todo tipo de declaraciones "si no" envueltas en torno a diferentes condiciones ... entonces podría ser el momento de intentar algo como QP para descomponerlo en HSM.

Jay Atkinson
fuente
1

Ampliando el ejemplo de Joby, una forma más limpia de implementar una máquina de estado muy grande es reemplazar la declaración del caso con una matriz de punteros de función. Luego puede aislar todo el código para un estado particular dentro de una función. Descubrí que implementarlo de esta manera requiere mucha menos memoria de programa.

mjh2007
fuente
1

reemplace la declaración del caso con una matriz de punteros de función

Así es como funciona el material QP. La representación de un estado es solo un puntero de función (a la función para el estado actual). En C ++ podría ser un puntero a la función miembro, pero básicamente lo mismo. La función de estado actual se llama con eventos, así como con algunos pseudoeventos (entrada, salida), uno de los cuales siempre se controla y se utiliza para determinar el anidamiento de estado cuando se realizan transiciones anidadas (QP admite máquinas de estado jerárquicas).

Miro Samek dice que pronto hará un puerto dirigido a Arduino.


fuente