此方式使用到了单向链表,写的时候实时分配空间,读了之后释放空间,代码还有不足之处,比如说未加锁机制。
.C文件
/**********************************************************************
* Copyright (c), 2012~2016 All Rights Reserved
* @file
* @brief
* @author
* @date 2016/05/23
* @version 1.0.0
* @par Revision History:
* Date Author Notes
* 2015/5/23 wangzhenghui file created
********************************************************************/
#include "ring_buffer.h"
#include "string.h"
/********************************************************************
** Function Name : ring_buffer_init
** Description : NONE
** Input para : NONE
** Output para : NONE
** Return Value : NONE
** Version : V0.1
** Author : wangzhenghui
*******************************************************************/
void buffer_queue_init(struct buffer_queue_t *queue,unsigned short max_size)
{
queue->max_size = max_size;
queue->p_head = NULL;
queue->p_last = NULL;
}
/********************************************************************
** Function Name : buffer_queue_write
** Description : 填充队列
** Input para :
** Output para : NONE
** Return Value : NONE
** Version : V0.1
** Author : wangzhenghui
*******************************************************************/
unsigned short buffer_queue_write(struct buffer_queue_t *queue,unsigned char *psrc,unsigned short wr_len)
{
struct buffer_packet_t *packet = (struct buffer_packet_t *)malloc(sizeof(struct buffer_packet_t));
if(queue->p_last == NULL)
{
queue->p_head = packet;
}
else
{
queue->p_last->next = packet;
}
queue->p_last = packet;
if(queue->size >= queue->max_size)
{
return 0;
}
packet->buffer_ptr = (unsigned char *)malloc(sizeof(unsigned char)*wr_len);
memcpy(packet->buffer_ptr,psrc,wr_len);
packet->buffer_size = wr_len;
packet->next = NULL;
queue->size += packet->buffer_size;
return wr_len;
}
/********************************************************************
** Function Name : buffer_queue_read
** Description : 从队列中读出数据
** Input para :
** Output para : NONE
** Return Value : NONE
** Version : V0.1
** Author : wangzhenghui
*******************************************************************/
unsigned short buffer_queue_read(struct buffer_queue_t *queue,unsigned char *pdest,unsigned short *rd_len)
{
struct buffer_packet_t *packet;
packet = queue->p_head;
if(packet)
{
queue->p_head = queue->p_head->next;
if(queue->p_head == NULL)
{
queue->p_last = NULL;
}
memcpy(pdest,packet->buffer_ptr,packet->buffer_size);
queue->size -= packet->buffer_size;
*rd_len = packet->buffer_size;
free(packet->buffer_ptr);
free(packet);
}
else
{
*rd_len = 0;
}
return *rd_len;
}
.h文件
/**********************************************************************
* Copyright (c), 2012~2016 xxx All Rights Reserved
* @file
* @brief
* @author
* @date 2016/05/23
* @version 1.0.0
* @par Revision History:
* Date Author Notes
* 2015/5/23 wangzhenghui file created
********************************************************************/
#ifndef _BUFFER_QUEUE_H_
#define _BUFFER_QUEUE_H_
#ifdef __cplusplus
extern "C"
{
#endif // __cplusplus
#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif
struct buffer_packet_t
{
unsigned char *buffer_ptr;
unsigned short buffer_size;
struct buffer_packet_t *next;
};
struct buffer_queue_t
{
struct buffer_packet_t *p_head,*p_last;
unsigned short max_size;
unsigned short size;
};
/********************************************************************
** Function Name : buffer_queue_init
** Description : NONE
** Input para : NONE
** Output para : NONE
** Return Value : NONE
** Version : V0.1
** Author : wangzhenghui
*******************************************************************/
extern void buffer_queue_init(struct buffer_queue_t *p_queue,unsigned short size);
/********************************************************************
** Function Name : buffer_queue_write
** Description : NONE
** Input para : NONE
** Output para : NONE
** Return Value : NONE
** Version : V0.1
** Author : wangzhenghui
*******************************************************************/
extern unsigned short buffer_queue_write(struct buffer_queue_t *p_queue,unsigned char *p_dest,unsigned short rd_len);
/********************************************************************
** Function Name : buffer_queue_read
** Description : NONE
** Input para : NONE
** Output para : NONE
** Return Value : NONE
** Version : V0.1
** Author : wangzhenghui
*******************************************************************/
extern unsigned short buffer_queue_read(struct buffer_queue_t *rb,unsigned char *pdest,unsigned short *rd_len);
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
#endif //_BUFFER_QUEUE_H_