[RK3568] RINGBUFFER

#define  RING_BUFFER_LEN  (1024*1024)

#define  RING_BUFFER_LEN  (1024*1024)

typedef struct {
    uint64_t _total_write_size;
    uint64_t _total_read_size;
    uint32_t _readp;
    uint32_t _writep;
    uint8_t  _full_flag;
    uint8_t  _buff[RING_BUFFER_LEN];
} ring_buffer;

ring_buffer g_rb;
 
static int g_full_flag=0;

void ring_buffer_init(ring_buffer* rb) {
    rb->_full_flag=0; 
	rb->_total_write_size=0;
	rb->_total_read_size=0;
	g_full_flag=0;
	rb->_readp=0;
	rb->_writep=0;
	memset((void*)rb->_buff,0,sizeof(rb->_buff));
}


unsigned int ring_buffer_write(ring_buffer* rb, const uint8_t* data, unsigned int count) {
	uint32_t i;
	rb->_total_write_size+=count;
	for(i=0;i<count;i++)
	{
		if (((rb->_writep + 1) % RING_BUFFER_LEN) == rb->_readp)
		{
			rb->_full_flag = 1;
			g_full_flag = 1;
			rb->_readp = ((rb->_readp + 1) % RING_BUFFER_LEN);
		}
		memcpy(&rb->_buff[rb->_writep], &data[i], sizeof(uint8_t));
		//printk(KERN_ERR"rb->_buff[rb->_writep]=%d\n",rb->_buff[rb->_writep]);
		rb->_writep = ((rb->_writep + 1) % RING_BUFFER_LEN);
	}
	return i;
}

unsigned int GetBuffAvailableSize(ring_buffer* rb)
{
    if (rb->_readp > rb->_writep)
    {
        return (rb->_writep + RING_BUFFER_LEN - rb->_readp);
    }
    else
    {
        return (rb->_writep - rb->_readp);
    }
}


unsigned int ring_buffer_read(ring_buffer* rb, uint8_t* data, unsigned int count) {
	uint32_t i,g_buf_num = 0;
	g_buf_num = GetBuffAvailableSize(rb);
	if((count > g_buf_num)){
		count = g_buf_num ;
	}
	
	for(i=0;i<count;i++)
	{
		if (((rb->_readp) % RING_BUFFER_LEN) == rb->_writep)
			return i;
		memcpy((void*)&data[i], (void*)&rb->_buff[rb->_readp], sizeof(uint8_t));
		//printk(KERN_ERR"data[i]=%x,%d\n",data[i],rb->_readp);
		if(true)
			rb->_readp = ((rb->_readp + 1) % RING_BUFFER_LEN);
		rb->_total_read_size++;
	}
	//printk(KERN_ERR"i=%d\n",i);
	return i;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值