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


相关推荐

  • open 函数[通俗易懂]

    open 函数[通俗易懂]open函数用来打开一个文件open返回值为一个文件句柄,从操作系统托付给你的python程序,一旦处理完文件,需要归还句柄,只有这样你的程序不会超过一次能打开的文件句柄的数量上限withopen(‘photo.jpg’,’r+’)asf: jpgdata=f.read()open的第⼀个参数是⽂件名。第⼆个(mode打开模式)决定了这个⽂件如何被打开。如果你想读…

    2022年5月25日
    42
  • 白帽子讲web安全 pdf_白帽子讲web安全适合初学者看吗

    白帽子讲web安全 pdf_白帽子讲web安全适合初学者看吗第一篇:世界观安全第一章:我的安全世界观一个网站的数据库,在没有任何保护的情况下,数据库服务端口是允许任何人随意连接的;在有了防火墙的保护后,通过ACL可以控制只允许信任来源的访问。这些措施在很大程度上保证了系统软件处于信任边界之内,从而杜绝了绝大部分的攻击来源。1.1.3Web安全的兴起常见攻击:SQL注入,XSS(跨站脚本攻击)“破坏往往比建设容易”,但凡事都不是绝对的。一般来说,白帽子选择的方

    2025年11月22日
    3
  • 【深度学习入门】——亲手实现图像卷积操作[通俗易懂]

    【深度学习入门】——亲手实现图像卷积操作[通俗易懂]深度学习中有一个很重要的概念就是卷积神经网络CNN,卷积神经网络中又有卷积层、池化层的概念。尤其是卷积层,理解难度比较大,虽然书中或者是视频中都有详细介绍过它的基础概念,但对于求知欲望很强烈的我,我总心里痒痒的,总想亲手实现,看看效果,怕的就是自己会眼高手低,做技术人最可怕的就是眼高手低。所以,我打算用python来亲自验证一遍。什么是卷积?卷积(convolution)是数学知…

    2022年5月8日
    74
  • 数据结构面试题之位图查找

    1.思路有的人一看到这个题,很简单嘛最麻烦的就是从头遍历一遍的事情嘛. 不过要看清楚题! 40亿个无符号整数.我们生活中1G内存占用的字节数1024*1024*1024为10

    2021年12月28日
    53
  • Ant类型之FilterChain

    Ant类型之FilterChainFilterChain 是一组 FilterReader 用户可以通过继承 java io FilterReader 类来定义自己的 FilterReader 通过使用 filterreader 元素可以轻松的将自定义的 FilterReader 做为嵌套元素插入到 filterchain 中 通过 FilterChain ant 可以灵活的进行数据的转换 支持 FilterChain 的 task 有 concat copy loadfile loadproperti move 过滤器链是通过嵌套 0 到多个过滤器形成的

    2025年7月15日
    3
  • 微信小程序跳转到其他网页(外部链接)

    微信小程序跳转到其他网页(外部链接)个人类型和海外类型的小程序不支持web-view标签也就是说个人申请的小程序,就别想跳转了!!!!1.开发的时候,我们难免碰到要跳转到其他网页中去那该怎么实现呢?2.例如我想点击一个按钮,跳转到百度(百度的网页还是在小程序中打开)3.wxml1.index.wxml(按钮页面)&lt;viewclass=’wrapper’&gt;&lt;b…

    2022年5月26日
    480

发表回复

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

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