¿La interrupción de los datos de un microcontrolador se recibe con una pérdida de datos de causa de interrupción de mayor prioridad?

1

Me gustaría saber qué pasaría si una Terminal Serial enviara una gran cantidad de datos a un PIC / AVR, por ejemplo, a través de una interrupción de USART, que luego fue interrumpida por una interrupción de mayor prioridad como un temporizador, lo que posponer la transferencia de datos. ¿Se perderían los datos? ¿O es que la Terminal Serial tiene un búfer antes de enviarlo, y se aferra a los datos hasta que volvamos a la interrupción de recepción?

Por ejemplo, estoy usando un atxmega128a1, y estoy usando esta interrupción para recibir bytes:

//interrupt to receive a byte 
ISR(USARTC0_RXC_vect){                      //ISR for when receive flag is set
if(FIFO_Put(&RxFIFO, USARTC0_DATA)){        //put data into receive FIFO
    USARTC0_STATUS |= USART_RXCIF_bm;       //write 1 to clear bit
}
}

Si envío una gran cantidad de bytes a través de un terminal serie a la vez, esta interrupción se activará muchas veces para recibir cada byte.

También tengo una interrupción de temporizador de una prioridad más alta que puede tardar mucho tiempo en completarse:

ISR(TCC0_OVF_vect){
    AXISid n = X;
    static BOOL cycle;
    TimerAxisInterrupt(n, &cycle);
} 

Para repetir, mi pregunta es si la interrupción de prioridad más alta ocurre durante una transferencia de recepción de datos grande, ¿se perderán datos?

Si es relevante: estoy enviando los datos de USART a través de rs232 usando un convertidor lógico max3232. Tengo las líneas de reconocimiento y las líneas RTS CTS en bucle, de modo que solo estoy usando las líneas Rx y Tx.

    
pregunta Sam Bucca

1 respuesta

2

Suponiendo que no hay intercambio, no perderá ningún dato si la interrupción de UART se repara con la frecuencia suficiente para evitar que el búfer de hardware que tiene se desborde. Normalmente, es al menos un carácter, pero puede haber muchos caracteres según el chip (los chips más potentes tienden a tener más bytes de búfer).

En mi experiencia, no puede depender del protocolo de XON / XOFF cuando el tamaño del búfer es pequeño y el remitente es una PC; puede enviar bastantes caracteres antes de que se agote el flujo.

Entonces, si la profundidad del búfer es de un carácter, y la velocidad de transmisión es tal que un personaje toma 1 ms, no debe quitar más de 1 ms en su interrupción de prioridad más alta o podría perder datos (un poco menos porque debe cuenta el tiempo en el UART ISR para responder y arranca el carácter entrante del búfer, y también debes tener en cuenta la situación en la que la interrupción de UART está en curso cuando se interrumpe (mira que ocurrió justo antes y justo después de que el carácter entrante leer)

Hay varias formas de lidiar con la situación en la que tiene que tener dos interrupciones con una respuesta rápida. Una forma (generalmente la mejor) sería no hacer tanto en su rutina de servicio de interrupción-interrupción de temporizador que es mejor usar para entrar y salir enérgicamente). Otra opción sería implementar un búfer en la memoria y establecer la interrupción de UART en la prioridad más alta (solo coloque el carácter recibido en una cola circular, aumente el tamaño del búfer del módulo del puntero de escritura y vuelva). ver si la cola está vacía). Todavía hay otros enfoques que dependen de los requisitos y el procesador. Tal vez no necesite tener la rutina del temporizador con una prioridad tan alta, o tal vez cambie la prioridad de manera dinámica una vez que haya terminado con las tareas críticas y luego vuelva a cambiarla a prioridad alta. , permitiendo que sea interrumpido por el UART ISR.

Los procesadores más potentes tendrán búferes más grandes o DMA que permitirán que el procesador se desplace por muchos caracteres antes de que se produzca la pérdida de datos.

TL; DR. Puede predecir esto perfilando la interrupción del temporizador y el código ISR para encontrar el tiempo máximo de ejecución y comparando con el tiempo mínimo para llenar el búfer (a la velocidad máxima en baudios).

    
respondido por el Spehro Pefhany

Lea otras preguntas en las etiquetas