UART recibe escritura y lectura de búfer

2

Estoy haciendo una comunicación simple entre un Mcu ARM y un módulo GSM.

El problema al que me estoy enfrentando es cómo lidiar con la escritura y la lectura simultáneas desde y hacia el búfer FIFO.

Debido a la escala del programa, tengo una gran matriz de búfer de 1000 bytes de longitud.

En el momento en que se activa una interrupción cada vez que se recibe un byte en el registro de datos de UART y la rutina de la interrupción está llenando mi FIFO de 1KB.

Mi rutina de lectura calcula los datos disponibles en FIFO y copia algunos de los datos en un segundo búfer para su posterior procesamiento.

La rutina de interrupción se detiene para colocar más datos cuando no queda más espacio en el búfer FIFO, para evitar sobrescribir el puntero de lectura en los casos en que mi programa principal no tuvo tiempo para procesar los datos.

Ahora estoy tratando de encontrar la mejor solución para evitar que se sobrescriba el indicador de lectura mientras que la rutina de interrupción nunca se detiene para poner datos. ¿Hay alguna solución para esto o la sobrescritura es inevitable?

    
pregunta MrBit

2 respuestas

3

En UART recibir evento:

    FIFO[Wr_pointer]= UART_Char;
    WR_Pointer++;
    WR_Pointer & = 3FF;// FIFO[1024] roll over 1022..1023...0...1...2
    if WR_Pointer==RD_Pointer then
        Overrun= true;
    else
    {
        SizeFIFO = (WR_Pointer - RD_Pointer);
        SizeFIFO & = 3FF;
    }

Ejemplo de buffer circular. No es necesario copiar datos de FIFO a otra ubicación, ya que los datos solo se sobrescriben.

En la aplicación:

SizeFIFO_temp = SizeFIFO; //you don't want a bug when ISR will insert new data while processing the buffer
for i=0 to SizeFIFO_temp  do
{
   Data[i]=FIFO[RD_Pointer]; //it's all up to you how you process the FIFO's data
   RD_Pointer++;
   RD_Pointer &= 3FF; 
}
SizeFIFO = (WR_Pointer - RD_Pointer);
SizeFIFO & = 3FF;
    
respondido por el Marko Buršič
0
  

El problema al que me estoy enfrentando es cómo lidiar con la escritura y la lectura simultáneas desde y hacia el búfer FIFO.

Secuencial No paralelo.

  

Ahora estoy tratando de encontrar la mejor solución para evitar la sobrescritura en el puntero de lectura, mientras que la rutina de interrupción nunca se detiene para poner datos

El código nunca debe existir siempre en el ISR (generalmente, depende de la aplicación). Necesita tiempo para copiar datos, procesar datos, restablecer marcas y varios estados, etc. antes de poder procesar una nueva solicitud. Si siempre estás recibiendo datos, ¿cuándo harás el resto?

1. Cuando se produce una interrupción: deshabilite la interrupción (muchos se olvidan de hacer esto)

2.Desde que tiene un búfer 1K (pérdida de memoria, implementar un búfer circular de menor longitud), copie los datos a un búfer y observe un contador cuando se reciba el número mínimo de bytes necesarios para el procesamiento. No olvide habilitar el ISR nuevamente y reinicie el contador antes de salir de ISR.

3.Cuando se reciba el número mínimo de bytes necesarios para el procesamiento, procese los datos.

Alternativamente, puede hacer que la unidad de control sea el maestro que consulta los datos del GSM cuando sea necesario para que usted tenga el control, en lugar de que el GSM le envíe datos siempre.

    
respondido por el Akshay Immanuel D

Lea otras preguntas en las etiquetas