Autor Tema: Implementación de Buffer Circular  (Leído 5868 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado darklord

  • PIC10
  • *
  • Mensajes: 16
    • Tech Freaks
Implementación de Buffer Circular
« en: 25 de Noviembre de 2008, 21:10:14 »
Buen día a todos.

Mientras realizaba un proyecto me di cuenta de que necesitaba emplear un buffer circular para guardar de forma temporal los datos que llegan de una memoria serial. Así que me dispuse a crear un juego de funciones que permitiera la gestión del buffer, Estas funciones deberían permitir crear el buffer, leer elementos, agregar elementos, etc. Lo que quiero (y ya voy logrando) es que este conjunto de funciones se apliquen por igual a varios buffers o "instancias", de tal forma que no dependan del tipo de datos que guardamos en ese buffer. Por ejemplo, para crear un buffer de enteros y otro de flotantes la cosa sería mas o menos así.

Código: [Seleccionar]
printf("Intentando crear buffer de enteros...\n\r");
xBufferHandle myCircularBuffer = xCircularBufferCreate( 5, sizeof( unsigned int ));

printf("Intentando crear buffer de chars...\n\r");
xBufferHandle myCircularBuffer = xCircularBufferCreate( 10, sizeof( unsigned char ));

printf("Intentando crear buffer de float...\n\r");
xBufferHandle myCircularBuffer = xCircularBufferCreate( 10, sizeof( unsigned char ));

De igual forma hay otras funciones de C que permiten "sacar" los datos del buffer circular o "agregarlos". En este fragmento de código se ve como funciona esta idea. El objetivo de esto es que con las mismas funciones se pueda actuar sobre uno, dos o más buffers, que guardan datos de distintas funetes (UART, SPI, I2C, etc.).

Código: [Seleccionar]
printf("Attempting to create a buffer...\n\r");
xBufferHandle myRingBuffer = xCircularBufferCreate( 10, sizeof( unsigned int ));
if( myRingBuffer != NULL )
{
printf("Buffer Successfully Created\n\r");
printf("Initializing Buffer Elements\n\r");
for(i=10; i<20; i++) // Añadir enteros
{
printf("Added to buffer: %d\n\r", i);
temp = i;
if( !xCircularBufferAdd( myRingBuffer, &temp ) )
break; // Hasta que este lleno
}
printf("Buffer is Now Full...\n\r");
printf("Reading from buffer...\n\r");

while( xCircularBufferGet( myRingBuffer, &temp ) )
{
printf("Read from buffer: %d\n\r", temp);
}

}
for(;;) // Bucle infinito
{
}

El compilador que estoy usando es C30 y el soft va destinado a micros de la serie PIC24F y dsPIC30F o 33F (aunque el programa deberia compilarse en cualquier otro compilador).  Me gustaría saber su opinión, que funciones deberían estar disponibles, ¿sería seguro usar esto en para guardar datos recibidos de una interrupción y procesarlos después?. El objetivo es crear una librería que sea confiable y que nos sea de utilidad a todos para nuestros programas en C. La idea básica ya esta, solo hay que pulirla y para eso necesito de la experiencia de uds. ;)

Aquí adjunto los archivos que estoy usando para no poner el código completo en el foro. Espero sus comentarios. ;)

rings.c
rings.h
cpu.hcpu.h
Visita mi blog: http://tech-freaks.net

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18269
    • MicroPIC
Re: Implementación de Buffer Circular
« Respuesta #1 en: 26 de Diciembre de 2009, 01:45:35 »
Recién descubro este hilo, Darklord. Es muy útil, seguro que me vendrá bien en alguna ocasión.

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: Implementación de Buffer Circular
« Respuesta #2 en: 13 de Enero de 2010, 09:39:21 »
Muy buen aporte darklord:

Cuando tenga un poco de tiempo libre lo pruebo en CCS para ver si funciona...ya que intenté realizar lo mismo que tú pero en vez de un buffer circular una lista enlazada sin tamaño predeterminado (dinámica) pero el CCS daba errores en direccionamientos de punteros (no sé que le pasa a los compiladores que los buffer dinámicos no les gusta mucho).

Por otro lado, mi curiosidad me llava a preguntarte el porqué usas un buffer circular en vez de una lista enlaza dinámica que te permite mayor versatilidad.

Un saludete.


 

anything