在通讯场景下,两端的数据处理能力不同,或者受传输单次数据传输量的的限制,很多时候我们都需要将数据进行缓存,然后在进行处理,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");}elsebreak;printf("input operation:");scanf("%d",&i);}fifo_release(g_user_fifo);
}

数据缓存-fifo算法(c语言)相关推荐

  1. 2021-06-04 操作系统FIFO算法C语言实现

    操作系统FIFO算法C语言实现 前言 本机为微软Surface pro4,为64位,所用操作系统为Windos 10.本机虚拟机版本为Oracle VM VirtualBox 6.1.8,所用操作系统 ...

  2. Java:实现先进先出缓存FIFO算法(附完整源码)

    Java:实现先进先出缓存FIFO算法 import java.util.HashMap; import java.util.Map.Entry; public class FIFOCache {pu ...

  3. fifo算法c语言程序代码,c语言实现fifo算法及代码

    C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. 尽管C语言提供了许多低级处理的功 ...

  4. 缓存基础----LRU算法和FIFO算法的Java实现

    Java里面实现LRU缓存算法的通常有两种选择,一种是自己设计数据结构:链表+HashMap(链表用来表示位置,哈希表用来存储和查找),另一种是使用Java中的LinkedHashMap.我们这边文章 ...

  5. 用 js 实现 FIFO, LRU, LFU 缓存淘汰算法

    看了网上一些人写的缓存淘汰算法,大概明白了这三种淘汰算法的实现思路,然后自己在对这些算法的理解基础上用js语言实现如下 1. FIFO 先入先出 这个相对比较简单,使用一个数组存储,在没到达最大存储空 ...

  6. fifo算法_缓存算法FIFO、LFU、LRU

    阅读文本大概需要3分钟. 0x01:FIFO算法 FIFO(First in First out),先进先出.其实在操作系统的设计理念中很多地方都利用到了先进先出的思想,比如作业调度(先来先服务),为 ...

  7. 常用缓存淘汰算法(LFU、LRU、ARC、FIFO、MRU)

    缓存算法是指令的一个明细表,用于决定缓存系统中哪些数据应该被删去. 常见类型包括LFU.LRU.ARC.FIFO.MRU. 最不经常使用算法(LFU): 这个缓存算法使用一个计数器来记录条目被访问的频 ...

  8. 缓存淘汰策略:LRU、LFU、FIFO 算法原理

    通常来说,Redis 一共有 6 种缓存淘汰策略,其中,常用的 allkeys-lru 和 volatile-lru 里面都提到了 LRU 的概念,实际上 LRU 就是缓存淘汰策略的基础算法.现在,就 ...

  9. 操作系统学习之用C语言模拟FIFO算法

    前言 FIFO算法比较简单,没什么好说的,就是先进先出.不过我添加了3状态,不过也只有堵塞,没有将阻塞进程唤醒的过程. Buddy算法:操作系统学习之用C语言模拟伙伴(Buddy)算法 FIFO算法: ...

最新文章

  1. C#教程8:面向对象编程【02】
  2. 软件测试部分习题答案
  3. redis集群linux安装教程,linux下redis集群的原生安装方式部署
  4. ACL与磁盘配额结合应用小结
  5. Ajax.net中的Web服务
  6. 【优化求解】基于matlab差分进化算法求解函数极值问题【含Matlab源码 1199期】
  7. Restsharp 与 unity3D WWW
  8. android 解压相关问题,解压文件失败的情况
  9. Rose Blumkin
  10. 华为android9.1指令,华为手机进工程模式指令大全(新增EMUI9.0指令链接)
  11. 【WhatsApp营销】如何为企业构建WhatsApp聊天机器人
  12. 操作系统学习笔记——北京大学陈向群老师课后及习题答案(9)
  13. 使用PWM驱动L9110电机正转或者反转
  14. 欧科云链OKLink:Uniswap当前锁仓量达11亿美元,24h涨幅达115%
  15. 如何在Adobe DW CC2017中添加服务器行为、数据库和绑定面板
  16. java编程atm取款机实验报告_ATM自动取款机JAVA程序
  17. oracle ocp认证是什么,oracleocp指的是什么认证
  18. elasticsearch集群搭建记录
  19. 2019-一个基于CNN的多模式工具来保证视频的正确性A MULTIMODAL CNN- BASED TOOL TO CENSURE INAPPROPRIATE VIDEO SCENES
  20. CSS如何实现小箭头及模拟微信对话框样式

热门文章

  1. 三目运算符 java_Java三目运算符中的坑
  2. 【从零开始学习光流算法(0)】——基本假设及Lucas-Kanade(LK)光流法
  3. AndroidTV Wifi开发(一)
  4. 无线网卡显示无服务器,无线网卡连接不可用怎么办_无线显示连接不可用怎么解决-win7之家...
  5. 根据时间戳生成6位唯一邀请码
  6. 安卓计步器的简单实现
  7. 一看就会的保姆级教程,10分钟搭建个人博客
  8. 谷歌跟oracle_Oracle诉Google,我的甜心领主
  9. 蓝牙耳机哪个品牌最好?目前最值得入手性价比高的无线蓝牙耳机
  10. Linux网卡新增虚拟ip