69、FIFO缓存发送数据(先入先出)

本文件用于设备数据收发缓冲使用,本fifo采用申请2片内存区,交替使用,写0时1读,写1时0读,避免同时使用相同内存块
fifo区域采用头尾相连的方式循环覆盖,分别记录读和写的位置,相等则数据为空,否则说明有数据
此方法的弊端为,当FIFO输入数据速度大于输出,则会引起数据丢失,若只是短时间数据量大则可以通过分配较大空间避免此问题
内存区使用动态分配
fifo_driver.h

#ifndef _fifo_driver_H_
#define _fifo_driver_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "stdint.h"
#include "stdio.h"
#define dFIFO_LOG(...) printf(__VA_ARGS__) //日志输出typedef struct
{uint8_t state;//fifo状态:0--不可用,!0--可用uint32_t size;//fifo分配的缓冲大小uint32_t read[2];//读取位置uint32_t write[2];//写入位置uint8_t id;//当前使用的缓冲区uint8_t *pbuf[2];//缓冲区void (*SendData)(uint8_t *pData,uint32_t size);//FIFI输出数据函数
}fifo_StructDef;//数据缓冲句柄int fifo_init(fifo_StructDef *p,uint32_t size,void (*SendData)(uint8_t *pData,uint32_t size));
void fifo_DeInit(fifo_StructDef *p);
void fifo_clear(fifo_StructDef *p);
int fifo_in(fifo_StructDef *p,uint8_t *pdata,uint32_t size);
int fifo_out(fifo_StructDef *p);#ifdef __cplusplus
}
#endif
#endif

fifo_driver.c

/**********************************************************************
*file:FIFO先入先出队列驱动文件
*author:残梦
*versions:V1.0
*date:2024.3.22
*note:
本文件用于设备数据收发缓冲使用,本fifo采用申请2片内存区,交替使用,写0时1读,写1时0读,避免同时使用相同内存块
fifo区域采用头尾相连的方式循环覆盖,分别记录读和写的位置,相等则数据为空,否则说明有数据
此方法的弊端为,当FIFO输入数据速度大于输出,则会引起数据丢失,若只是短时间数据量大则可以通过分配较大空间避免此问题
使用方法:
#include "fifo_driver.h"
static fifo_StructDef fifo;
void SendData(uint8_t *pData,uint32_t size)
{//实现自己的底层发送数据//所有输入fifo的数据都通过此函数实际发送输出
}
void main(void)
{uint8_t data = 0xFF;if(fifo(&fifo,1024,SendData) < 0){printf("初始化失败\n");return}for(uint32_t i = 0;i < 1000;i++){fifo_in(&fifo,&data,1);//向fifo输入数据if(i%1024 == 0)fifo_out(&fifo);//发送数据}fifo_DeInit(&fifo);
}**********************************************************************/
#include "fifo_driver.h"
#include "string.h"
#include "stdlib.h"/****************************************
@function:fifo初始化资源
@param:p--fifo句柄size--分配fifo大小;注意实际消耗内存等于size*2字节SendData--数据发送函数
@return:0:成功-1:参数错误-2:分配内存失败
@note:
****************************************/
int fifo_init(fifo_StructDef *p,uint32_t size,void (*SendData)(uint8_t *pData,uint32_t size))
{if((p == NULL) || (size < 1) || (SendData == NULL))return -1;p->state = 0;p->pbuf[0] = (uint8_t *)malloc(size);p->pbuf[1] = (uint8_t *)malloc(size);if ((p->pbuf[0] == NULL) || (p->pbuf[1] == NULL)){fifo_DeInit(p);dFIFO_LOG("Error[%s-line:%d]:memory allocation failure\n", __func__, __LINE__);return -2;}p->size = size;p->read[0] = p->read[1] = 0;p->write[0] = p->write[1] = 0;p->id = 0;p->SendData = SendData;p->state = 1;return 0;
}/****************************************
@function:fifo资源销毁
@param:p--fifo句柄
@return:void
@note:
****************************************/
void fifo_DeInit(fifo_StructDef *p)
{if(p == NULL)return;p->state = 0;if(p->pbuf[0] != NULL)free(p->pbuf[0]);p->pbuf[0] = NULL;if(p->pbuf[1] != NULL)free(p->pbuf[1]);p->pbuf[1] = NULL;p->size = 0;p->read[0] = p->read[1] = 0;p->write[0] = p->write[1] = 0;p->id = 0;p->SendData = NULL;
}/****************************************
@function:fifo清空
@param:p--fifo句柄
@return:void
@note:
****************************************/
void fifo_clear(fifo_StructDef *p)
{if(p == NULL)return;p->state = 0;p->id = 0;    p->read[0] = p->read[1] = 0;p->write[0] = p->write[1] = 0;p->state = 1;
}/****************************************
@function:fifo数据输入
@param:p--fifo句柄pdata--数据size--字节数
@return:0:成功-1:参数错误-2:写入失败
@note:
****************************************/
int fifo_in(fifo_StructDef *p,uint8_t *pData,uint32_t size)
{uint32_t num = 0,pos = 0;uint8_t id = 0;if((pData == NULL) || (size == 0) || (p == NULL))return -1;if(p->state == 0)return -2;id = p->id;while(pos < size){num = (size > (p->size - p->write[id]))?(p->size - p->write[id]):(size-pos);memcpy(&(p->pbuf[id][p->write[id]]),(pData + pos),num);p->write[id] += num;pos += num;if(p->write[id] >= p->size)p->write[id] = 0;}return 0;
}/****************************************
@function:fifo数据输出
@param:p--fifo句柄
@return:void
@note:0:输出成功-1:参数错误-2:fifo状态不可用-3:fifo空
****************************************/
int fifo_out(fifo_StructDef *p)
{uint8_t id = 0;uint32_t len = 0;if(p == NULL)return -1;if(p->state == 0)return -2;if(p->read[p->id] == p->write[p->id])return -3;id = p->id;p->id = id?0:1;if(p->read[id] < p->write[id]){len = p->write[id] - p->read[id];p->SendData(&(p->pbuf[id][p->read[id]]),len);p->read[id] += len;}else if(p->read[id] > p->write[id]){len = p->size - p->read[id];p->SendData(&(p->pbuf[id][p->read[id]]),len);len = p->write[id];p->SendData(&(p->pbuf[id][0]),len);p->read[id] = len;}return 0;
}

使用方法:

#include "fifo_driver.h"
static fifo_StructDef fifo;
void SendData(uint8_t *pData,uint32_t size)
{//实现自己的底层发送数据//所有输入fifo的数据都通过此函数实际发送输出
}
void main(void)
{uint8_t data = 0xFF;if(fifo(&fifo,1024,SendData) < 0){printf("初始化失败\n");return}for(uint32_t i = 0;i < 1000;i++){fifo_in(&fifo,&data,1);//向fifo输入数据if(i%1024 == 0)fifo_out(&fifo);//发送数据}fifo_DeInit(&fifo);
}

文件下载:
链接:https://pan.baidu.com/s/1-u8w19RiyPeCtVQjX8hzgw
提取码:zxo1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/764306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

脚本实现Ubuntu设置屏幕无人操作,自动黑屏

使用 xrandr 命令可以实现对屏幕的控制&#xff0c;包括调整分辨率、旋转屏幕以及关闭屏幕等。要实现 Ubuntu 设置屏幕在无人操作一段时间后自动黑屏&#xff0c;非待机&#xff0c;并黑屏后点击触摸屏可以唤醒屏幕&#xff0c;可以借助 xrandr 命令来实现。 首先&#xff0c;…

亚远景科技-ASPICE如何适配汽车电子电气产品特征与行业发展

随着当今汽车工业的蜕变&#xff0c;我们正迎来一个被誉为“软件定义汽车”的新时代。在这个时代&#xff0c;软件不仅是汽车的灵魂&#xff0c;更是其主导力量&#xff0c;它通过无形的代码赋予汽车各种突破性的特性与功能。昔日以硬件为重心的汽车行业&#xff0c;如今正在加…

计算机二级真题讲解每日一题:《format格式化》

描述 在右侧答题模板中修改代码&#xff0c;删除代码中的横线&#xff0c;填写代码&#xff0c;完成如下功能。 接收用户输入的一个小于 20的正整数&#xff0c;在屏幕上逐行递增显示从 01 到该正整数&#xff0c;数字显示的宽度为 2&#xff0c;不足位置补 0&#xff0c;后面追…

比一比gitee、gitlab、github

gitee、gitlab、github&#xff0c;哪个是目前国内大型公司使用最多的呢&#xff1f;共同点&#xff1a;三者都是基于git的代码托管工具&#xff0c;都支持版本管理。 gitee&#xff1a;适合国内开发者&#xff0c;更友好的本地化服务&#xff0c;形成了一个适合中国宝宝学习的…

计算机网络:分层体系结构

计算机网络&#xff1a;分层体系结构 基本分层概述各层次的任务物理层数据链路层网络层运输层应用层 数据传递过程分层体系常见概念实体协议服务 基本分层概述 为了使不同体系结构的计算机网络都能互联&#xff0c;国际标准化组织于 1977 年成立了专门机构研究该问题。不久他们…

算法体系-15 第十五节:贪心算法(下)

一 、贪心算法的解题套路实战 贪心的算法和排序和堆有关 1.1 描述 一些项目要占用一个会议室宣讲&#xff0c;会议室不能同时容纳两个项目的宣讲。 给你每一个项目开始的时间和结束的时间 你来安排宣讲的日程&#xff0c;要求会议室进行的宣讲的场次最多。 返回最多的宣讲场次…

centos docker 安装es

在CentOS上通过Docker安装Elasticsearch的步骤如下&#xff1a; 步骤1&#xff1a;安装Docker 在 CentOS 上安装 Docker 的步骤大致如下&#xff1a; 第一步&#xff1a;准备工作 确保你的 CentOS 系统已经更新到了最新状态&#xff1a; sudo yum update -y第二步&#xf…

【C++】1597. 买文具

问题&#xff1a;1597. 买文具 类型&#xff1a;基本运算、整数运算 题目描述&#xff1a; 花花去文具店买了 1 支笔和 1块橡皮&#xff0c;已知笔 x 元/ 支&#xff0c;橡皮 y元 / 块&#xff0c;花花付给了老板 n 元&#xff0c;请问老板应该找给花花多少钱&#xff1f; 输…

以前端角度来看序列化

1. what? why? 序列化&#xff1a;将数据结构或对象状态 转换成一个可以存储或传输的格式 的过程 意味着可以将复杂的数据结构转换成简单的字节流或字符串&#xff0c;以便于存储或传输 反序列化&#xff1a;将这些数据恢复成原始形式的过程&#xff0c;是序列化的逆过程 从…

pycharm安装插件

pycharm安装插件显示网络错误/无法安装 输入以下网址 https://plugins.jetbrains.com/ 然后重启pycharm就可以安装软件了

Spring Cloud Alibaba Sentinel 使用详解

一、Sentinel 介绍 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征: 丰富的应用场景&#xff1a; Sentinel 承接了阿里巴…

现代游戏引擎架构

一、并行编程 1.1 为什么需要并行编程 游戏的渲染计算对算力要求很高&#xff0c;所以我们需要把操作系统的资源利用到极致。 但是摩尔定律已经不在适用了&#xff0c;硬件的发展目前已经达到瓶颈。所以我们需要通过数量来提高计算效率。 1.2 并行编程基础 进程与线程&#…

MacOS - GCC 版本升级解决方案

Mac 中自带的 GCC 版本是 4.2.1&#xff0c;由于版本太低&#xff0c;在很多操作的时候会报错。因此需要对其进行升级&#xff0c;这里使用 Homebrew 来下载最新的 GCC。 安装 Homebrew MacOS 的终端中输入如下的命令来安装 Homebrew $ /usr/bin/ruby -e "$(curl -fsSL …

sqlite3 交叉编译

#1.下载源码并解压 源码路径如下&#xff0c;下载autoconf版本 SQLite Download Page 解压 tar -zxvf sqlite-autoconf-3450200.tar.gz cd sqlite-autoconf-3450200 mkdir build # 2. 配置源代码 # 假设你已经安装了交叉编译工具链&#xff0c;如gcc-arm-linux-gnueabih…

Tkinter 一文读懂

Tkinter 简介 Tkinter&#xff08;即 tk interface&#xff0c;简称“Tk”&#xff09;本质上是对 Tcl/Tk 软件包的 Python 接口封装&#xff0c;它是 Python 官方推荐的 GUI 工具包&#xff0c;属于 Python 自带的标准库模块&#xff0c;当您安装好 Python 后&#xff0c;就可…

基于python+vue的BBS论坛系统flask-django-nodejs-php

本系统为用户而设计制作BBS论坛系统&#xff0c;旨在实现BBS论坛智能化、现代化管理。本BBS论坛自动化系统的开发和研制的最终目的是将BBS论坛的运作模式从手工记录数据转变为网络信息查询管理&#xff0c;从而为现代管理人员的使用提供更多的便利和条件。使BBS论坛系统数字化、…

关于短群签名论文阅读

参考文献为2004年发表的Short Group Signatures 什么群签名&#xff1f; 群签名大致就是由一组用户组成一个群&#xff0c;其中用户对某条消息的签名&#xff0c;改签名不会揭示是哪一个用户签署的&#xff0c;签名只能表明该消息确实是来自该群的签名。对于群还有一个群管理者…

Spring Boot 3 极速搭建OAuth2认证框架

本篇环境 Java 17Spring Boot 3.2.3Spring Authorization Server 1.2.3开发工具 SpringToolSuite4Spring Boot 3.2.3 需要JDK 17及之上的版本。 项目初始化 项目可以使用Spring的初始化器生成, 也可以创建一个Maven类型的项目。 项目创建后的目录结构如下: 项目配置 使用 …

几个常用的控件(2)

目录 一、单选按钮Radiobutton和RadioButtonList 1、Radiobutton控件 &#xff08;1&#xff09;button控制方式 &#xff08;2&#xff09;Radiobutton控制方式 2、RadiobuttonList控件 二、列表框ListBox和下拉列表DropdownList 1、ListBox 2、DropdownList 三、面板…

【Java】二叉搜索树

文章目录 一、搜索树二、使用代码实现一棵二叉搜索树1.查找2.插入3.删除&#xff08;重点&#xff09; 总结 一、搜索树 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值…