当前位置: 首页 > news >正文

一个fifo工程简单模板

一个fifo工程简单模板

gen_fifo.h文件

#ifndef GEN_FIFO_H
#define GEN_FIFO_H#ifdef __cplusplus
extern "C" {
#endiftypedef struct kfifo {unsigned int in;unsigned int out;unsigned int mask;unsigned int esize;unsigned char *buffer;
} gen_fifo_t;/*** @brief  获取FIFO内当前元素个数(内联实现)* @param  fifo 指向FIFO结构体的指针* @return FIFO内有效元素个数*/
static inline unsigned int gen_fifo_len(gen_fifo_t *fifo) {return fifo->in - fifo->out;
}/*** @brief  获取FIFO内空闲元素个数(内联实现)* @param  fifo 指向FIFO结构体的指针* @return FIFO内空闲元素个数*/
static inline unsigned int gen_fifo_unused(gen_fifo_t *fifo) {return ((fifo->mask + 1) / fifo->esize) - gen_fifo_len(fifo);
}/*** @brief  判断FIFO是否为空(内联实现)* @param  fifo 指向FIFO结构体的指针* @return 1-空,0-非空*/
static inline unsigned char gen_fifo_is_empty(gen_fifo_t *fifo) {return gen_fifo_len(fifo) == 0;
}/*** @brief  判断FIFO是否为满(内联实现)* @param  fifo 指向FIFO结构体的指针* @return 1-满,0-非满*/
static inline unsigned char gen_fifo_is_full(gen_fifo_t *fifo) {return gen_fifo_unused(fifo) == 0;
}unsigned int gen_fifo_out(gen_fifo_t *fifo, void *buf, unsigned int len);
unsigned int gen_fifo_in(gen_fifo_t *fifo, const void *buf, unsigned int len);
void gen_fifo_init(gen_fifo_t *fifo, unsigned char *buffer, unsigned int size, unsigned int esize);#ifdef __cplusplus
}
#endif#endif /* GEN_FIFO_H */

gen_fifo.c文件

#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include "gen_fifo.h"/*** @brief  FIFO初始化函数* @param  fifo 指向FIFO结构体的指针* @param  buffer 指向静态缓冲区的指针* @param  size 缓冲区总字节数* @param  esize 单个元素大小*/
void gen_fifo_init(gen_fifo_t *fifo, unsigned char *buffer,unsigned int size, unsigned int esize)
{if (fifo == NULL || buffer == NULL || size == 0 || esize == 0)return;if ((size & (size - 1)) != 0 || (size % esize) != 0)return;fifo->buffer = buffer;fifo->esize = esize;fifo->in = 0;fifo->out = 0;fifo->mask = size - 1;
}// 内部数据入队拷贝
static void gen_fifo_copy_in(gen_fifo_t *fifo, const void *src,unsigned int len, unsigned int off)
{unsigned int size = fifo->mask + 1;unsigned int esize = fifo->esize;unsigned int l;off &= fifo->mask;if (esize != 1) {off *= esize;size *= esize;len *= esize;}l = len < (size - off) ? len : (size - off);memcpy(fifo->buffer + off, src, l);memcpy(fifo->buffer, (const unsigned char *)src + l, len - l);
}/*** @brief  FIFO入队函数* @param  fifo 指向FIFO结构体的指针* @param  buf  指向待入队数据的缓冲区* @param  len  待入队元素个数* @return 实际入队元素个数*/
unsigned int gen_fifo_in(gen_fifo_t *fifo, const void *buf, unsigned int len)
{unsigned int l;if (fifo == NULL || buf == NULL || len == 0)return 0;l = gen_fifo_unused(fifo);if (len > l)len = l;gen_fifo_copy_in(fifo, buf, len, fifo->in);fifo->in += len;return len;
}// 内部数据出队拷贝
static void gen_fifo_copy_out(gen_fifo_t *fifo, void *dst,unsigned int len, unsigned int off)
{unsigned int size = fifo->mask + 1;unsigned int esize = fifo->esize;unsigned int l;off &= fifo->mask;if (esize != 1) {off *= esize;size *= esize;len *= esize;}l = len < (size - off) ? len : (size - off);memcpy(dst, fifo->buffer + off, l);memcpy((unsigned char *)dst + l, fifo->buffer, len - l);
}/*** @brief  FIFO出队函数* @param  fifo 指向FIFO结构体的指针* @param  buf  指向存放出队数据的缓冲区* @param  len  待出队元素个数* @return 实际出队元素个数*/
unsigned int gen_fifo_out(gen_fifo_t *fifo, void *buf, unsigned int len)
{unsigned int l;if (fifo == NULL || buf == NULL || len == 0)return 0;l = gen_fifo_len(fifo);if (len > l)len = l;gen_fifo_copy_out(fifo, buf, len, fifo->out);fifo->out += len;return len;
}
http://www.jsqmd.com/news/314481/

相关文章:

  • mysql CVE-2023-22084、CVE-2023-22015、CVE-2023-22026 、CVE-2023-22028
  • Spring AOP 详解
  • 钟楼映江波,旧迹载新声,亭子码头的城市序章
  • 大数据架构中的自动化测试:数据质量与管道验证
  • 用知识图谱提升虚拟品牌的“认知能力”:AI架构师的实战经验
  • 条形码和文档采集中的人工智能:从炒作走向可验证的价值
  • 为什么数字产品护照需要DPM条形码—以及如何实现精准扫描
  • 从初级到资深:提示工程架构师的5阶晋升路径+每个阶段的核心能力
  • UDP协议
  • IP协议及以太网协议
  • 让AI成为你的品牌代言人:训练内部大模型,实现内容规模化与风格一致性
  • 大数据领域 OLAP 在农业领域的应用探索
  • jsp高校实验课表管理系统vy32g(程序+源码+数据库+调试部署+开发环境)
  • jsp高校社团管理系统dzbn0--(程序+源码+数据库+调试部署+开发环境)
  • jsp高校评教系统9o38i(程序+源码+数据库+调试部署+开发环境)
  • ssm电竞酒店管理o51zb(程序+源码+数据库+调试部署+开发环境)
  • jsp高校图书管理系统15pca程序+源码+数据库+调试部署+开发环境
  • jsp高校宿舍管理系统9yuo0--程序+源码+数据库+调试部署+开发环境
  • AI技术对传统编程的颠覆
  • 【Linux系统编程】(二十三)从块到块组:Ext2 文件系统核心架构的初步认识
  • 吐血推荐!继续教育10款AI论文软件深度测评
  • 【课程设计/毕业设计】基于springboot的智能校园点餐管理系统设计小程序【附源码、数据库、万字文档】
  • 【毕业设计】基于Android的高校教室预约管理平台(源码+文档+远程调试,全bao定制等)
  • 小程序计算机毕设之基于springboot的智能校园点餐管理系统设计小程序(完整前后端代码+说明文档+LW,调试定制等)
  • 小程序计算机毕设之基于安卓的教室预约管理系统基于Android的高校教室预约管理平台(完整前后端代码+说明文档+LW,调试定制等)
  • 小程序毕设项目:基于springboot的智能校园点餐管理系统设计小程序(源码+文档,讲解、调试运行,定制等)
  • 【计算机毕业设计案例】基于springboot的智能校园点餐管理系统设计小程序(程序+文档+讲解+定制)
  • 【计算机毕业设计案例】基于Android的高校教室预约管理平台基于Android大学教室预约管理系统(程序+文档+讲解+定制)
  • 两版本锁抛出异常测试
  • 【毕业设计】基于springboot的智能校园点餐管理系统设计小程序(源码+文档+远程调试,全bao定制等)