Manejo de múltiples interrupciones dsPIC

3

He estado pensando en mi diseño por un tiempo pero no pude encontrar una mejor manera de lidiar con el desbordamiento de búfer en múltiples interrupciones.

Un chip dsPIC33EP está conectado a una pantalla TFT, un sensor UART, una tarjeta micro-SD y una cámara UART. La velocidad en baudios del sensor UART es 921600 y la cámara (50k por foto) es 57600 . El tiempo de escritura del sector de la tarjeta SD (512 bytes) es un poco menos de 2 ms. La pantalla (EVE FT800) tarda 20ms en actualizarse.

El objetivo es responder al sensor UART (al menos cada 30 ms) y actualizar la pantalla según corresponda (etiquetas de actualización) y al mismo tiempo escribir imágenes en la tarjeta SD.

Para desglosar la tarea, he guardado con éxito múltiples imágenes en la tarjeta SD usando interrupciones cuando solo la cámara y la tarjeta SD están funcionando.

La rutina de interrupción:

volatile unsigned char buff[512];
volatile unsigned int ptr=0;
volatile unsigned char EOF=0;
volatile unsigned char buffReady=0;
void ISR(){
    static unsigned char temp;
    temp=UART_Read();
    buff[ptr++]=temp;
    if(ptr==512){ptr=0;buffReady=1;}
    if(...){EOF=1;}
}

Mientras el programa está bloqueado en un bucle para comprobar el indicador de EOF

while(1){
   if(buffReady){SD_Write_Sector(buff);buffReady=0;}//write 512 bytes of image to SD card
   if(EOF){break;}//jump out if the image has been finished
}

Mi preocupación es, ¿cómo incorporo las rutinas para actualizar la pantalla mientras recibo datos del sensor UART? Parece que la bandera buffReady debe ser verificada constantemente. Cualquier retraso entre cada comprobación puede perder un par de bytes, ya que se sobrescriben con nuevos bytes.

Dado que el tamaño de la imagen es de alrededor de 50K y la velocidad en baudios es de 57600, habrá seis bytes provenientes de la cámara cada milisegundo. Si la pantalla presenta un retardo de 20 ms entre , la imagen se corromperá.

Pensé en usar un búfer más grande para almacenar imágenes, pero un búfer más grande necesita más tiempo para escribir en la tarjeta SD.

¿Cómo debo organizar la pantalla de actualización y escribir la imagen en la tarjeta SD?

    
pregunta Timtianyang

1 respuesta

3

El dsPIC33EP proporciona una interfaz DMA al UART (consulte el capítulo 8 de la hoja de datos ) . Si configura un búfer lo suficientemente grande para 20ms de datos, puede configurar el DMA para escribir en ese búfer y luego leer los resultados entre las actualizaciones de pantalla. Tenga en cuenta que: $$ 57.600 ~ bps \ cdot 0.02 ~ seg = 1152 ~ bits = 144 ~ bytes $$ Si está utilizando SPI para escribir en la tarjeta SD, DMA también se puede usar allí para limitar la carga de la CPU durante las escrituras más grandes (es posible que el controlador ya tenga soporte DMA incorporado).

Como alternativa, puede realizar la lectura del búfer real en la interrupción (en lugar de sondear una bandera). Esta es una mala idea en la mayoría de los casos, sin embargo, por múltiples razones:

  • El código más pequeño posible se debe colocar en interrupciones, para reducir la latencia del sistema;
  • Depende del método que se utilice para controlar la pantalla, pero es probable que las interrupciones de lectura recibidas durante la actualización de la pantalla produzcan errores visuales;
  • Las llamadas a funciones desde dentro de interrupciones rara vez son una buena idea, ya que generalmente aumentan el código anterior y posterior a la interrupción escrito por el compilador (para salvar registros, etc.) e introducen oportunidades para el interbloqueo que sería más obvio con código en línea.

En resumen, la DMA está hecha para la situación que describe. Por lo general, es un proceso doloroso para configurar y depurar múltiples transferencias de DMA, pero permitirá actualizaciones de visualización limpias debido a las lecturas y escrituras más largas sin la intervención de la CPU.

    
respondido por el Scott Winder

Lea otras preguntas en las etiquetas