Estoy haciendo una comunicación simple entre un mcu ARM y un módulo GSM.
El problema al que me enfrento es cómo lidiar con la escritura y la lectura simultáneas hacia y desde el búfer FIFO.
Debido a la escala del programa, tengo una gran matriz de búfer de 1000 bytes de longitud.
En este momento, 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 1 KB.
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 poner más datos cuando no queda más espacio en el búfer FIFO, para evitar sobrescribir en 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 sobrescribir en el puntero de lectura, mientras que la rutina de interrupción nunca se detiene para poner datos. ¿Hay alguna solución para esto o la sobreescritura es inevitable?
En el evento de recepción de UART:
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 búfer circular. No hay necesidad de copiar datos de FIFO a otra ubicación ya que los datos simplemente se sobrescriben.
En la aplicacion:
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;
El problema al que me enfrento es cómo lidiar con la escritura y la lectura simultáneas hacia y desde el búfer FIFO.
Secuencial No paralelo.
Ahora estoy tratando de encontrar la mejor solución para evitar sobrescribir 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 banderas y varios estados, etc. antes de que se pueda procesar una nueva solicitud. Si siempre estás recibiendo datos ¿cuándo harás el resto?.
1.Cuando ocurre una interrupción: deshabilite la interrupción (muchos se olvidan de hacer esto)
2. Dado que tiene un búfer de 1K (desperdicio de memoria, implemente un búfer circular de menor longitud), copie los datos en un búfer y observe un contador cuando se reciba la cantidad mínima de bytes necesarios para un procesamiento. No olvide habilitar el ISR nuevamente y restablecer el contador antes de salir del ISR.
3. Cuando se reciba el número mínimo de bytes necesarios para un procesamiento, procese los datos.
Alternativamente, puede hacer que el uC sea el maestro que sondea el GSM en busca de datos cuando sea necesario para que tenga el control, en lugar de que GSM le envíe datos siempre.
Andy alias
Trevor_G
turbo j
MrBit
Marko Bursic
Marko Bursic
Trevor_G
bruce abbott
MrBit
Sean Houlihane
usuario105652
KalleMP
Lundin