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

11

Al revisar los posibles enfoques para mi proyecto de registro de datos, he encontrado que el libro "Prácticas de estadísticas UML en C / C ++" es muy interesante para un trabajo más serio con Arduino. QP es una familia de marcos ultraligeros, de código abierto basados en máquinas de estado para sistemas integrados y distribuyen código y puertos para sus marcos (GNU GPL2) en enlace donde tienen un puerto para el mega AVR y AVR utilizando 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 es muy apreciado.

    
pregunta Harley Mackenzie

4 respuestas

4

Yo evitaría este tipo de cosas como la plaga.

El software de bajo nivel más "serio" que he encontrado ha sido una máquina de estados en 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 ellos no quieren que hagas. Si elige jugar manualmente con el código, tendrá que mantener el caso especial para siempre.

Diría que las estadísticas 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 :)

    
respondido por el Toby Jaffey
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 desechar la masa para que yo experimentara con las HSM (máquinas de estado jerárquicas) usando QP. Tuve que implementar el mío que era similar a QP cuando estaba refactorizando una máquina de estado horrible que ocupaba cientos de líneas de código como el ejemplo de Joby pero en 1000. El viejo diseño que se tomó prestado para que las funciones funcionaran en un plazo ajustado Fue un dolor terrible de mantener. Temía intentar 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 de modificar y mantener, de lo que jamás podría soñar. Incluso tuve que casi rehacer gran parte de la máquina de estado, debido a un comportamiento inesperado en el sistema. Fue mucho más fácil de arreglar con el marco que había hecho, y estoy seguro de que hubiera 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 nuestro código base.

Hice que un amigo implementara el marco cuántico utilizando Java en un robot que funcionó bastante bien. Era parte del algoritmo de toma de decisiones del robot basado en ciertas entradas. Era natural, dadas las decisiones que tenía que tomar según el estado del robot.

Lo que entiendo de la belleza de QP es la capacidad de tener un marco listo para el diseño de una máquina de estado que está optimizado para su procesador y no tener que depender de las herramientas CASE que escupen un código ineficaz. Pero, solo usaría QP si tiene un conjunto complejo de máquinas de estado para implementar que describan 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 estado está creciendo y creciendo con todo tipo de declaraciones "en caso contrario" en torno a diferentes condiciones ... entonces podría ser el momento de probar algo como QP para dividirlo en HSM's.

    
respondido por el Jay Atkinson
1

Al ampliar 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 serie 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.

    
respondido por el mjh2007
1
  

reemplazar la declaración del caso con un   matriz de punteros de función

Que es como funcionan las cosas 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 está sin manejar y se usa para determinar el estado de anidación cuando se realizan transiciones anidadas (QP admite máquinas de estado jerárquicas).

Miro Samek dice que pronto estará haciendo un puerto orientado a Arduino.

    
respondido por el Ned Konz

Lea otras preguntas en las etiquetas