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


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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Photoshop快捷键大全_alt快捷键大全常用

    Photoshop快捷键大全_alt快捷键大全常用察看图像类别  说明:: —Shift键  :—空格键       *—在Imageready中不适用  §—只在Imageready中可用动作结果双击工具箱::或Ctrl+0 使图像最大限度在当前窗口中完整显示双击工具箱::或Alt+Ctr

    2022年9月29日
  • icem搅拌器网格划分_搅拌器研究所的第六个开放电影项目[通俗易懂]

    icem搅拌器网格划分_搅拌器研究所的第六个开放电影项目[通俗易懂]icem搅拌器网格划分BlenderInstitute的第六个电影项目,代号为Gooseberry,已进入BlenderInstitute迄今为止最开放的制作中。如果您到目前为止一直在关注该项目,那么您已经对Blender的“开放式生产”(大量共享)的含义有所了解。艺术家和开发人员共享原始布局动画,开发中的艺术作品以及他们用来制作电影的文件,并每周为粉丝和关注者举办Google…

    2022年5月26日
  • 系统可用性「建议收藏」

    系统可用性「建议收藏」一个网站、系统的战术包括可用性战术、可修改性战术、性能战术、安全性战术、可测试性战术、易用性战术。质量需求指定了软件的响应,以实现业务目标,战术是影响质量属性响应的设计决策,构架策略是战术的集合,构架

    2022年6月30日
  • RPM安装命令总结[通俗易懂]

    RPM安装命令总结[通俗易懂]在Linux操作系统下,几乎所有的软件均通过RPM进行安装、卸载及管理等操作。RPM的全称为RedhatPackageManager,是由Redhat公司提出的,用于管理Linux下软件包的软件。Linux安装时,除了几个核心模块以外,其余几乎所有的模块均通过RPM完成安装。RPM有五种操作模式,分别为:安装、卸载、升级、查询和验证。1)用RPM安装软件包,最简单的

    2022年6月12日
  • 高数——多元函数的定义及极限

    高数——多元函数的定义及极限之前我们学习的导数、微分和积分都是针对一元函数的,也就是函数只依赖一个变量,但是在我们今后遇到的实际问题中,更多出现的却是要考虑多个变量的情况,这是我们就要用多元函数来表示它们之间的关系了。比如地球表面上一点的温度T同时依赖于纬度x和经度y,可以用一个二元函数T=f(x,y)来表示。和一元函数一样,二元函数也是有定义域和值域的,一元函数的定义域是轴上一个“线段”上的点的集合,而…

    2022年6月3日
  • Fiddler实现手机抓包——小白入门

    Fiddler实现手机抓包——小白入门手机用fiddler抓包电脑最好是笔记本,这样能和手机保持统一局域网内;其他不多说,直接说步骤了。一.对PC(笔记本)参数进行配置  1.配置fiddler允许监听到https(fiddler默认只抓取http格式的)        打开Fiddler菜单项Tools-&gt;TelerikFiddlerOptions-&gt;HTTPS,        勾选Capt…

    2022年4月20日

发表回复

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

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