¿Está configurando los indicadores de software un uso efectivo de las interrupciones?

2

Actualmente estoy trabajando en un proyecto de microcontrolador (Arduino) en el que deseo usar interrupciones generadas por pulsadores y temporizadores. Sin embargo, no estoy seguro de si estoy "efectivamente" usando las interrupciones. Aquí está mi siguiente enfoque de arquitectura:

Digamos que tengo tres fuentes de interrupción: una vinculada a una entrada digital y dos vinculadas a temporizadores internos. Cuando se establezca un indicador de interrupción de hardware, se ejecutarán los ISR asociados.

También implemento un 'bucle principal'. Este bucle principal no tiene tiempo en el sentido de que se ejecutará de forma continua lo más rápido que permita el procesador. Dentro de este bucle, hay una serie de indicadores de software que están marcados. Estos indicadores de software se establecen en los ISR. Este bucle se muestra en el siguiente pseudo código:

/* main loop */
while(1)
{
    // Check digital input flag
    if(digi_in_flag)
        // do some routine

    //check timer 1
    if(timer1_flag)
        // do something routine

    //check timer 2
    if(timer2_flag)
        // do something routine
}

Ahora, la razón por la que hago esto es para mantener los ISR cortos. Esencialmente, mis ISR solo establecen una marca de software que luego se verifica en el ciclo principal. Algunas de estas rutinas conducen a las comunicaciones SPI / I2C, por lo que no quería colocar esas comunicaciones en un ISR.

Entonces mi pregunta: ¿tiene sentido esto? ¿Esto realmente crea un programa más eficiente? Siento que todavía estoy 'sondeando' al verificar las marcas de software. Como alternativa al uso de interrupciones, podría haber escrito un bucle que solo verifica una entrada digital (a diferencia de un indicador de software establecido por una interrupción), o podría haber hecho una función para verificar la duración del tiempo (es decir, curr_time - prev_time) en lugar de confiar en una interrupción de temporizador para establecer una marca de software.

¿Alguna idea sobre esto? Además, estoy limitado a un solo hilo en este diseño.

Gracias

    
pregunta Izzo

2 respuestas

2

Para hablar de eficiencia, necesitas identificar qué significa para ti.

Su diseño está bien, pero como usted cree, hay otras opciones disponibles, como poner la ejecución en ISR en lugar de hacerlo en el ciclo principal. Consideremos lo siguiente:

  • en su diseño actual, cuando ocurre una interrupción, solo se establece el indicador; la ejecución, relacionada con el indicador "siguiente" se realizará solo cuando el hilo principal termine de procesar el indicador actual, y su aplicación recordará que habrá al menos una interrupción relacionada (el indicador está establecido = la interrupción relacionada ocurre al menos una vez). Este es un enfoque más o menos lineal , que separa lógicamente y físicamente el procesamiento de las banderas;
  • ahora considere que coloca el procesamiento de bandera / interrupción en ISR. Entonces debe tener mucho cuidado con la activación / desactivación de interrupciones. Si llega una nueva interrupción, puede interrumpir el servicio de la "bandera" actual y comenzar a dar servicio a la nueva "bandera". ¿Qué proceso (externo), unido al servicio de primera marca, lo pensará? A continuación, si se producen dos interrupciones iguales mientras no se completó el servicio anterior, ¿el procesamiento se superpondrá y el dispositivo externo no funcionará correctamente?

Verá: hay una serie de opciones (vemos 2 arriba), y debe seleccionar la estrategia que mejor se adapte a los protocolos de los dispositivos adjuntos y su sincronización. No hay formas incorrectas de hacer las cosas, hay formas que lo llevan a situaciones en las que (a) simplemente no puede implementar lo que quiere de manera específica y (2) la solución no es escalable (en tiempo o capacidad).

    
respondido por el Anonymous
0

Creo que su pregunta real es: "¿Sondear una bandera más rápido que sondear un pin directamente?" Si ese es el caso, se hizo la siguiente prueba:

Puse un Arduino encuestando un pin directamente (manipulación directa del puerto):

if (readPIN == 1)

luego incrementa un contador y verifica (sondeos) si alcanza los 100 000 conteos. Si es así, imprime el tiempo que pasó.

Luego, cambio el sondeo a una bandera (int):

if (flag == 1)

Y los resultados son *:

  • Encuestando el pin directamente: 277ms

  • Encuestando la bandera: 264ms

* este no es el tiempo real que se tarda en sondear 100 000 veces. Es el tiempo que se tarda en ejecutar el software, alterando solo esta línea. Por lo tanto, lo que importa es la diferencia (277 - 264 = 13ms)

Para concluir, el sondeo de la bandera es más rápido.

    
respondido por el Sunnytec Automação

Lea otras preguntas en las etiquetas