C语言 类面向对象 无锁 环形缓冲 ring_buffer

为类似面向对象,因为不能隐性传参,对象的方法必须把对象本身传入。
上代码
ring_buffer.c

/* File Info 
 * Author:      Holy.Han 
 * CreateTime:  2020/7/18 下午11:39:51 
 * LastEditor:  Holy.Han 
 * ModifyTime:  2020/7/18 下午11:39:54 
 * Description: 
*/
#include "ring_buffer.h"
#include <stdio.h>

typedef struct
{
	uint8_t *buffer;	   //存放实际的数据
	uint32_t read_offset;  //读取地址相对buffer的偏移量
	uint32_t write_offset; //写入地址相对buffer的偏移量
	uint32_t valid_size;   //buffer的有效size
	uint32_t total_size;   //buffer的总大小,即init时malloc的size
} ring_buf_t;

typedef struct
{
	ring_buf_t ring_buf;
	ring_t ring;
} ring_obj_t;

static void ring_destroy(ring_t *ring);
static void ring_write(ring_t *ring, void *write, uint32_t size);
static void ring_read(ring_t *ring, void *read, uint32_t size);
static uint32_t ring_valid(ring_t *ring);

static void ring_print(const char *str, uint8_t *data, uint32_t len)
{
	printf("%s:\r\n\t{ ", str);
	for (uint32_t i = 0; i < len; i++)
	{
		if (i == (len - 1))
		{
			printf("0x%02X", *(data + i));
		}
		else
		{
			printf("0x%02X, ", *(data + i));
		}
		if (i % 16 == 15 && i != (len - 1))
		{
			printf("\r\n\t  ");
		}
	}
	printf(" }\r\n");
}

ring_t *new_ring(uint32_t size)
{
	ring_obj_t *ring_obj = NULL;

	ring_obj = ring_alloc(sizeof(ring_obj_t));
	if (ring_obj == NULL)
	{
		return NULL;
	}
#if DBG_ENBALE
	printf("new ring addr=0x%p\r\n", ring_obj);
#endif
	ring_obj->ring_buf.buffer = ring_alloc(size);
	if (ring_obj->ring_buf.buffer == NULL)
	{
		ring_free(ring_obj);
		return NULL;
	}
#if DBG_ENBALE
	printf("ring 0x%p buffer addr=0x%p, size=%d\r\n", ring_obj, ring_obj->ring_buf.buffer, size);
#endif
	ring_obj->ring_buf.total_size = size;
	ring_obj->ring.destroy = ring_destroy;
	ring_obj->ring.write = ring_write;
	ring_obj->ring.read = ring_read;
	ring_obj->ring.valid = ring_valid;
#if DBG_ENBALE
	printf("ring 0x%p func addr=0x%p\r\n", ring_obj, ring_obj->ring);
#endif
	return &ring_obj->ring;
}

static void ring_destroy(ring_t *ring)
{
	if (ring == NULL)
	{
		return;
	}
	ring_obj_t *ring_obj = (ring_obj_t *)(((ring_buf_t *)ring) - 1);
	if (ring_obj->ring_buf.buffer != NULL)
	{
		ring_free(ring_obj->ring_buf.buffer);
	}
	ring_free(ring_obj);
#if DBG_ENBALE
	printf("destroy ring=0x%p\r\n", ring_obj);
#endif
}

static void ring_write(ring_t *ring, void *write, uint32_t size)
{
	if (ring == NULL || write == NULL)
	{
		return;
	}
#if DBG_ENBALE
	ring_print("ring write", (uint8_t *)write, size);
#endif
	ring_buf_t *ring_buffer = (ring_buf_t *)(((ring_buf_t *)ring) - 1);

	uint32_t write_offset = ring_buffer->write_offset;
	uint32_t total_size = ring_buffer->total_size;
	uint32_t first_write_size = 0;

	if (ring_buffer->valid_size + size > total_size) //ring_buffer->buffer未使用的总大小比需要写入的size小
	{
		// todo printf
		return;
	}

	if (size + write_offset <= total_size) //ring_buffer->buffer的后段未写入的空间不小于size
	{
		memcpy(ring_buffer->buffer + write_offset, write, size);
	}
	else //ring_buffer->buffer的后段未写入的空间小于size,这时候需要先在后面写入一部分,然后返回头部,从前面接着写入
	{
		first_write_size = total_size - write_offset;
		memcpy(ring_buffer->buffer + write_offset, write, first_write_size);
		memcpy(ring_buffer->buffer, (const uint8_t *)write + first_write_size, size - first_write_size);
	}
	ring_buffer->write_offset += size;
	ring_buffer->write_offset %= total_size;
	ring_buffer->valid_size += size;
#if DBG_ENBALE
	ring_print("ring now", (uint8_t *)(ring_buffer->buffer), ring_buffer->valid_size);
#endif
}

static void ring_read(ring_t *ring, void *read, uint32_t size)
{
	if (ring == NULL || read == NULL || size == 0)
	{
		return;
	}
	ring_buf_t *ring_buffer = (ring_buf_t *)(((ring_buf_t *)ring) - 1);

	uint32_t read_offset = ring_buffer->read_offset;
	uint32_t total_size = ring_buffer->total_size;
	uint32_t first_read_size = 0;

	if (size > ring_buffer->valid_size)
	{
		//todo print
		return;
	}

	if (total_size - read_offset >= size)
	{
		memcpy(read, ring_buffer->buffer + read_offset, size);
	}
	else
	{
		first_read_size = total_size - read_offset;
		memcpy(read, ring_buffer->buffer + read_offset, first_read_size);
		memcpy((uint8_t *)read + first_read_size, ring_buffer->buffer, size - first_read_size);
	}
#if DBG_ENBALE
	ring_print("ring read", (uint8_t *)read, size);
#endif
	ring_buffer->read_offset += size;
	ring_buffer->read_offset %= total_size;
	ring_buffer->valid_size -= size;
#if DBG_ENBALE
	ring_print("ring now", (uint8_t *)(ring_buffer->buffer), ring_buffer->valid_size);
#endif
}
static uint32_t ring_valid(ring_t *ring)
{
	if (ring == NULL)
	{
		return 0;
	}
	ring_buf_t *ring_buffer = (ring_buf_t *)(((ring_buf_t *)ring) - 1);
	return ring_buffer->valid_size;
}

最重要的头文件
ring_buffer.h

/* File Info 
 * Author:      Holy.Han 
 * CreateTime:  2020/7/18 下午11:40:15 
 * LastEditor:  Holy.Han 
 * ModifyTime:  2020/7/18 下午11:40:18 
 * Description: 
*/
#ifndef _RING_BUFFER_H
#define _RING_BUFFER_H

#include <stdint.h>
#include <string.h>
#include <stdlib.h>

/*     */
#define ring_alloc(size) calloc(1, size)
#define ring_free(p) free(p)

#define DBG_ENBALE 1

struct ring
{
	void (*destroy)(struct ring *);
	void (*write)(struct ring *, void *, uint32_t);
	void (*read)(struct ring *, void *, uint32_t);
	uint32_t (*valid)(struct ring *);
};
typedef struct ring ring_t;

ring_t *new_ring(uint32_t size);

#endif /* _RING_BUFFER_H */

demo.c

#include <stdio.h>
#include "utils\ring_buffer.h"

int main(int argc, char **argv)
{
	uint8_t write[40];
	uint8_t read[100];
	for (size_t i = 0; i < 16; i++)
	{
		write[i] = i + '0';
	}

	ring_t *myring = new_ring(128);
	myring->write(myring, write, 16);
	for (size_t i = 0; i < 32; i++)
	{
		write[i] = i + 'a';
	}
	myring->write(myring, write, 32);
	uint32_t size = myring->valid(myring);
	myring->read(myring, read, size);
	myring->destroy(myring);
	return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值