ringbuffer的常规用法_wear ring

ringbuffer的常规用法_wear ring文章目录概述示例引用概述ringbuffer,或者说循环队列,是嵌入式开发中的一个基本模型,常用于命令队列,资源循环分配场合。示例ring_buffer.hringbuffer封装APItestringbuffer.c测试ringbufferapi.//ring_buffer.h#include<stdlib.h>typedefstructs_ring_buffer{ inttail; inthead; intsize; intitem_si

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

文章目录

概述

ring buffer,或者说循环队列,是嵌入式开发中的一个基本模型,常用于命令队列,资源循环分配场合。

示例

ring_buffer.h ring buffer 封装API
testringbuffer.c 测试ring buffer api.

//ring_buffer.h
#include <stdlib.h>

typedef struct s_ring_buffer{
	int tail;
	int head;
	int size;
	int item_size;
	void *buf;
} ring_buffer;

static ring_buffer* ring_buffer_create(int item_size, int size)
{
	size = size + 1;//alloc one more
	void* buf = malloc(item_size * size);
	if (NULL == buf)
		return buf;

	ring_buffer *p_ring_buf = (ring_buffer*)malloc(sizeof(ring_buffer)); 
	if (NULL == p_ring_buf)
		return p_ring_buf;

	p_ring_buf->head = 0; 
	p_ring_buf->tail = 0; 
	p_ring_buf->size = size;
	p_ring_buf->item_size = item_size;
	p_ring_buf->buf = buf;

	return p_ring_buf;
}
static void ring_buffer_free(ring_buffer *p_ring_buf)
{
	if (NULL != p_ring_buf->buf){
		free(p_ring_buf->buf);
		p_ring_buf->buf = NULL;
	
		free(p_ring_buf);
	}
}
static void* ring_buffer_get_tail(ring_buffer *p_ring_buf)
{
	void *item = NULL;
	int tail = p_ring_buf->tail;
	int size = p_ring_buf->size;
	int item_size = p_ring_buf->item_size;
	int n = (tail + 1) % size;
	if (n != p_ring_buf->head){
		item = p_ring_buf->buf + (item_size * tail);
		p_ring_buf->tail = n;
	}
	return item;
}
static void* ring_buffer_get_head(ring_buffer *p_ring_buf)
{
	if (p_ring_buf->head == p_ring_buf->tail)
		return NULL;
	
	int head = p_ring_buf->head;
	int size = p_ring_buf->size;
	int item_size = p_ring_buf->item_size;
	void *item = p_ring_buf->buf + (item_size * head);
	p_ring_buf->head = (head + 1) % size;
	return item;
}
static int ring_buffer_size(ring_buffer *p_ring_buf)
{
	int head = p_ring_buf->head;
	int tail = p_ring_buf->tail;
	int size = p_ring_buf->size;
	return (tail >= head) ? (size - 1 - tail + head) : (size - 1 - head + tail);
}
static int ring_buffer_capacity(ring_buffer *p_ring_buf)
{
	return p_ring_buf->size - 1;
}
//testringbuffer.c
#include "ring_buffer.h"
#include <stdio.h>

void test_get_tail(ring_buffer *ring_buf){
	void *item = ring_buffer_get_tail(ring_buf);
	printf("item %p\n", item);
	printf("buffer size %d, capacity %d\n", ring_buffer_size(ring_buf), ring_buffer_capacity(ring_buf));
	
	item = ring_buffer_get_tail(ring_buf);
	printf("item %p\n", item);
	printf("buffer size %d, capacity %d\n", ring_buffer_size(ring_buf), ring_buffer_capacity(ring_buf));

	item = ring_buffer_get_tail(ring_buf);
	printf("item %p\n", item);
	printf("buffer size %d, capacity %d\n", ring_buffer_size(ring_buf), ring_buffer_capacity(ring_buf));

}
void test_get_head(ring_buffer *ring_buf){
	void *item = ring_buffer_get_head(ring_buf);
	printf("item %p\n", item);
	printf("buffer size %d, capacity %d\n", ring_buffer_size(ring_buf), ring_buffer_capacity(ring_buf));
	
	item = ring_buffer_get_head(ring_buf);
	printf("item %p\n", item);
	printf("buffer size %d, capacity %d\n", ring_buffer_size(ring_buf), ring_buffer_capacity(ring_buf));

	item = ring_buffer_get_head(ring_buf);
	printf("item %p\n", item);
	printf("buffer size %d, capacity %d\n", ring_buffer_size(ring_buf), ring_buffer_capacity(ring_buf));

}

int main(){
	ring_buffer *ring_buf = ring_buffer_create(8, 2);
	printf("buffer size %d, capacity %d\n", ring_buffer_size(ring_buf), ring_buffer_capacity(ring_buf));

	test_get_tail(ring_buf);
	test_get_head(ring_buf);

	return 0;
}

测试结果

$ ./test.exe
buffer size 2, capacity 2
item 0x8000003c0
buffer size 1, capacity 2
item 0x8000003c8
buffer size 0, capacity 2
item 0x0
buffer size 0, capacity 2

item 0x8000003c0
buffer size 1, capacity 2
item 0x8000003c8
buffer size 2, capacity 2
item 0x0
buffer size 2, capacity 2

引用

Circular Queue

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195317.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基础:MVC三层架构

    基础:MVC三层架构MVC三层架构基于狂神说讲的MVC三层架构图,概述:mvc框架由model,view,controller组成,执行流程一般是:在controller访问model获取数据,通过view渲染页面。mvc模式是web开发中的基础模式,采用的是分层设计,各层之间职责分明。然而事与愿违,当我们日积月累的基于mvc模式开发之后,会逐渐的感受到层与层之间存在粘连和职责模棱两可的地方,这就是service层出现的重要原因。Dao:Dao层、设计模式(DataAccessObject),称为数据访问对象。它是

    2022年6月25日
    41
  • android换机备份,安卓手机备份迁移指南

    android换机备份,安卓手机备份迁移指南原标题:安卓手机备份迁移指南买了新手机,本来是一件非常开心的事情,但是如何将旧手机上的有用信息转移到新手机上,这可是一件让大家很犯愁的事情,今天就跟着小编一起来看看安卓手机的四种转移数据的方法吧。1、一键换机现在很多的手机都有一键换机的功能,能直接将旧手机上的所有数据转移到新手机上,非常的方便。下面我们用小米手机来看看具体的换机操作。首先在小米手机“设置—更多设置”中,找到“一键换机”功能。然后…

    2022年5月22日
    74
  • windows oracle rac集群搭建_linux集群管理工具

    windows oracle rac集群搭建_linux集群管理工具浅谈OracleRAC–集群管理软件GI今天周五,想想可以过周末,心情大好。一周中最喜欢过的就是周五晚上,最不喜欢过的是周日晚上和周一,看来我不是个热爱劳动的人啊。趁着现在心情愉悦,赶紧坐下来继续写我的博客吧。昨天的博客里,我介绍了什么是OracleRAC。还没有看过的同学可以回过头去参考一下。我们说从实现技术上来说OracleRAC是基于集群管理软件构建出的数据库。那么研究OracleRAC的基础则是要搞懂集群管理软件的原理。昨天的博客里我们介绍了现在甲骨文早已不再依托第三方集群

    2022年10月11日
    3
  • CompareNoCase

    CompareNoCaseCString::CompareNoCaseintCompareNoCase(LPCTSTRlpsz)const;返回值:如果字符串是一样的(不区分大小写)则返回零值;如果CString对象

    2022年7月4日
    22
  • vs2008中向项目(以C#为例)添加要求管理员权限的属性(为了兼容vista的UAC)

    vs2008中向项目(以C#为例)添加要求管理员权限的属性(为了兼容vista的UAC)

    2021年8月23日
    92
  • odrive入门教程(securecrt使用教程串口)

    ODrive官方入门指南中,采用的是USB连接控制模式(中文翻译版本链接)使用的是NativeProtocol。当我们需要尝试串口通信实现时,需要专程ASCII协议来进行串口通信实现相关的命令,结合着入门指南以及ODrive中的相关属性方法参数,将流程中用到的相关方法整理如下:importserialimporttimeted=serial.Serial(port=’/dev/tty.wchusbserial1470′,baudrate=115200)ted.writ

    2022年4月16日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号