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í.
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.).
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.crings.hcpu.hcpu.h