数据缓存-fifo算法(c语言)

在通讯场景下,两端的数据处理能力不同,或者受传输单次数据传输量的的限制,很多时候我们都需要将数据进行缓存,然后在进行处理,fifo就是一种很好的数据缓存模型,下面我写了一个实例,可直接移植使用

注意,当数据长度大于fifo缓存大小的时候,会直接覆盖,请合理设置fifo的buf大小,可以通过fifo_create设置缓存大小

typedef unsigned char uint8;
typedef unsigned short uint16;
#define MAX_FIFO_BUFFER_LEN	21
typedef struct _fifo_t
{
	uint8 *buff;
	uint16 fifo_len;
	uint16 data_len;
	uint16 read_index;
	uint16 write_index;
}fifo_t;

fifo_t *g_user_fifo;

/***********************************************************************************************
*函数名 : write_fifo
*函数功能描述 : 向fifo中写入数据
*函数参数 : fifo;data,待写入数据;len,待写入数据长度
*函数返回值 : 实际写入数据长度
*作者 :layne
***********************************************************************************************/
uint16 write_fifo(fifo_t *fifo, uint8 *data, uint16 len)
{
	uint16 w_len = len;
	if(len >= fifo->fifo_len) {
		memcpy(fifo->buff, data + len - fifo->fifo_len, fifo->fifo_len);
		fifo->read_index = 0;
		fifo->write_index = fifo->fifo_len;
		fifo->data_len = fifo->fifo_len;
		w_len = fifo->fifo_len;
	} else {
		if(fifo->write_index + len > fifo->fifo_len) {
			uint16 tail_len = (fifo->write_index + len) % fifo->fifo_len;
			memcpy(fifo->buff + fifo->write_index, data, len - tail_len);
			memcpy(fifo->buff, data + len - tail_len, tail_len);
			fifo->write_index = tail_len;
		} else {
			memcpy(fifo->buff + fifo->write_index, data, len);
			fifo->write_index += len;
		}

		if(fifo->data_len + len > fifo->fifo_len) {
			fifo->read_index = (fifo->read_index + fifo->data_len + len - fifo->fifo_len) % fifo->fifo_len;
			fifo->data_len = fifo->fifo_len;
		} else {
			fifo->data_len += len;
		}
	}

	return w_len;
}

/***********************************************************************************************
*函数名 : read_fifo
*函数功能描述 : 从fifo中读取数据
*函数参数 : fifo;data,读取数据缓存;len,读取长度
*函数返回值 : 实际读出数据长度
*作者 :layne
***********************************************************************************************/
uint16 read_fifo(fifo_t *fifo, uint8 *data, uint16 len)
{
	uint16 r_len = len;
	if(fifo->data_len < len)
		r_len = fifo->data_len;
	if(fifo->read_index + r_len > fifo->fifo_len) {
		uint16 tail_len = (fifo->read_index + r_len) % fifo->fifo_len;
		memcpy(data, fifo->buff + fifo->read_index, r_len - tail_len);
		memcpy(data + r_len - tail_len, fifo->buff, tail_len);
		fifo->read_index = tail_len;
	} else {
		memcpy(data, fifo->buff + fifo->read_index, r_len);
		fifo->read_index += r_len;
	}

	fifo->data_len -= r_len;
	if(0 == fifo->data_len) {
		fifo->read_index = 0;
		fifo->write_index = 0;
	}

	return r_len;
}

/***********************************************************************************************
*函数名 : fifo_create
*函数功能描述 : 创建一个fifo
*函数参数 : fifo_buf_len,fifo缓存buf的大小
*函数返回值 : fifo_t *,fifo指针
*作者 :layne
***********************************************************************************************/
fifo_t *fifo_create(uint16 fifo_buf_len)
{
	fifo_t *m_fifo;
	m_fifo = (fifo_t *)malloc(sizeof(fifo_t));
	m_fifo->buff = (uint8 *)malloc(fifo_buf_len);
	if(NULL == m_fifo->buff){
		free(m_fifo);
		return NULL;
	}
	m_fifo->fifo_len = fifo_buf_len;
	m_fifo->data_len = 0;
	m_fifo->read_index = 0;
	m_fifo->write_index = 0;

	return m_fifo;
}

/***********************************************************************************************
*函数名 : fifo_release
*函数功能描述 : 释放一个fifo
*函数参数 : fifo,待释放函数指针
*函数返回值 : void
*作者 :layne
***********************************************************************************************/
void fifo_release(fifo_t *fifo)
{
	free(fifo->buff);
	free(fifo);
}

/***********************************************************************************************
*函数名 : test_func
*函数功能描述 : 测试函数,控制台输入0为写入测试,1为读取测试,其他值退出
*函数参数 : void
*函数返回值 : void
*作者 :layne
***********************************************************************************************/
void test_func()
{
	uint8 w[5] = {0x45, 0x34, 0x53, 0x12, 0x11};
	uint8 r[7];
	int i=0;
	int read_len=0;
	g_user_fifo = fifo_create(MAX_FIFO_BUFFER_LEN);
	while(i<2){
		if(0 == i) {
			write_fifo(g_user_fifo,w,5);
		} else if(1 == i){
			read_len = read_fifo(g_user_fifo,r,7);
			for(int j=0;j<read_len;j++)
				printf("%02x ",r[j]);
			printf("\n");
		}else
			break;
		printf("input operation:");
		scanf("%d",&i);

	}

	fifo_release(g_user_fifo);
}

 

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
下面是FIFO算法和LRU算法C语言实现: FIFO算法实现: ```c #include <stdio.h> #include <stdlib.h> #define MAXSIZE 3 int queue[MAXSIZE]; int front = 0, rear = 0; void enqueue(int data) { if ((rear + 1) % MAXSIZE == front) { printf("队列已满,无法插入!\n"); return; } queue[rear] = data; rear = (rear + 1) % MAXSIZE; } int dequeue() { if (front == rear) { printf("队列为空,无法删除!\n"); return -1; } int data = queue[front]; front = (front + 1) % MAXSIZE; return data; } int main() { enqueue(1); enqueue(2); enqueue(3); printf("队列中的元素为:"); while (front != rear) { printf("%d ", dequeue()); } printf("\n"); return 0; } ``` LRU算法实现: ```c #include <stdio.h> #include <stdlib.h> #define MAXSIZE 3 typedef struct { int key; int value; } Node; Node cache[MAXSIZE]; int count = 0; void add(int key, int value) { if (count == MAXSIZE) { printf("缓存已满,需要进行替换!\n"); int min_index = 0; for (int i = 1; i < MAXSIZE; i++) { if (cache[i].key < cache[min_index].key) { min_index = i; } } cache[min_index].key = key; cache[min_index].value = value; } else { cache[count].key = key; cache[count].value = value; count++; } } int get(int key) { for (int i = 0; i < count; i++) { if (cache[i].key == key) { int value = cache[i].value; for (int j = i; j > 0; j--) { cache[j].key = cache[j - 1].key; cache[j].value = cache[j - 1].value; } cache[0].key = key; cache[0].value = value; return value; } } printf("缓存中不存在该元素!\n"); return -1; } int main() { add(1, 100); add(2, 200); add(3, 300); printf("缓存中的元素为:\n"); for (int i = 0; i < count; i++) { printf("%d: %d\n", cache[i].key, cache[i].value); } printf("获取元素2的值为:%d\n", get(2)); printf("缓存中的元素为:\n"); for (int i = 0; i < count; i++) { printf("%d: %d\n", cache[i].key, cache[i].value); } return 0; } ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在云巅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值