**循环缓冲fifo是先进先出的。生产者和消费者都只有一个,linux系统下使用提供了一种免锁的机制,处理时不用加锁。**UART下收发fifo主要是解决收发中断过于频繁,会导致CPU效率不高。

#include<stdio.h>struct  cycle_fifo_t{int *fifo_ptr;//数据缓冲的起始位置volatile int rd;//读指针的地址volatile int wr;//写指针的地址int fifo_buffer;//数据区的大小};enum isr_name_t{second = 0,//秒任务的中断button,    //按键的中断};enum isr_name_t isr_name;//中断向量名struct cycle_fifo_t isr_fifo;//中断向量的双向循环fifo//void fifo_init(struct cycle_fifo_t *fifo, void *buffer, int len){fifo->fifo_ptr = buffer;//指向同一片内存地址fifo->rd = 0;fifo->wr = 0;fifo->fifo_buffer = len;}  //往fifo里面存放中断向量名void fifo_put_byte(struct cycle_fifo_t *fifo, int isr_name){//首先判断下fifo还有没有空间可以写if (fifo_get_free_byte(fifo)){fifo->fifo_ptr[fifo->wr] = isr_name;}if (++fifo->wr == fifo->fifo_buffer)//fifo缓存的内容写到头了,需要从头开始写{fifo->wr = 0;}}//从fifo里面读存放的数据int fifo_get_byte(struct cycle_fifo_t *fifo ,int *read_data,int read_len){if ( read_len  > fifo_get_used_byte(fifo)){read_len = fifo_get_used_byte(fifo);//最多只能将存入的数据全部读出来}while (read_len--){read_data[read_len] = fifo->fifo_ptr[fifo->rd++]; //采用先进先出的原则if (fifo->rd > fifo->fifo_buffer){fifo->rd = 0;//则从数据的起始地址重新读return 1;}}}//获取读和写指针长度的差值 int fifo_get_used_byte(struct cycle_fifo_t *fifo){int num = 0;//要考虑两种情况,一种是读的地址大于写的地址,说明写已经反转从头开始了,一种是正常的读指针小于写指针if(fifo->wr >= fifo->rd){num = fifo->wr - fifo->rd;}else{num = fifo->fifo_buffer - (fifo->rd - fifo->wr);}return num;}//求剩余多少fifo空间还可以使用int fifo_get_free_byte(struct cycle_fifo_t *fifo){return   fifo->fifo_buffer - fifo_get_used_byte(fifo);//总的fifo长度资源 - 已经使用过的资源}int isr_fifo_buffer[100] = { 0 };//中断向量的缓存int main(){//int buf[50] = { 0 };int get_data = 0 ;//获取fifo中存入的数据fifo_init(&isr_fifo, isr_fifo_buffer, 100);//申请fifo空间的大小//isr_name = button;isr_name = 8;fifo_put_byte(&isr_fifo, isr_name);//将按键的中断号写入到fifo中fifo_get_byte(&isr_fifo, &get_data, 1);printf("%d\n", get_data);system("pause");}

C语言实现循环缓冲fifo及总结相关推荐

  1. 使用c语言实现的fifo程序,C语言实现标准FIFO

    C语言实现标准FIFO 说明: 本文在C语言中实现了标准FIFO,可以存储任意类型的数据.FIFO返回给应用模块的是一个int类型的索引值,本质是一个指针.通过这层封装,可以简化提供给应用模块的接口. ...

  2. c语言队列实现FIFO

    //队列的链表式实现 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include &l ...

  3. 操作系统实验七 磁盘调度算法的模拟与实现(C语言)

    实验七 磁盘调度算法的模拟与实现 1 .实验目的 (1) 了解磁盘结构以及磁盘上数据的组织方式. (2) 掌握磁盘访问时间的计算方式. (3) 掌握常用磁盘调度算法及其相关特性. 2 .实验基本知识及 ...

  4. 微语录(2011-03-14---2011-03-20)

    我这周发布了101条微博,下面是我通过博客微语录应用筛选出来的微博 2011/0320 // @Huihoo :物联网应用,这样的毕业设计很不错 期待分享更多细节. 22:49 何朝阳Ubiquito ...

  5. 操作系统课程设计---实验七 磁盘调度算法的模拟与实现

    实验七 磁盘调度算法的模拟与实现 完整课程设计源码及其报告查看:陈陈的操作系统课程设计 1.实验目的 (1) 了解磁盘结构以及磁盘上数据的组织方式. (2) 掌握磁盘访问时间的计算方式. (3) 掌握 ...

  6. linux c语言fifo例程,FIFO在C语言中的应用

    FIFO在C语言中的应用 1.FIFO介绍 FIFO(First Input First Output),即先进先出队列. 这里介绍如何使用C语言对数据进行FIFO操作的方法. 首先建立一个队列,将待 ...

  7. 09 嵌入式C语言如何实现多级队列缓存(Queue、FIFO)

    C语言如何实现多级队列缓存(Queue.FIFO) 作者 将狼才鲸 日期 2022-03-20 1.各种缓存结构: 基础:指针.链表.内存.数组. 数据结构基础:表.树.图(多对多). 缓冲区/buf ...

  8. 先进先出(FIFO)页面置换算法 C语言实现

    广东工业大学 操作系统实验 实验内容 假设每个页面中可存放10条指令,分配给作业的内存块数为4.用C语言模拟一个作业的执行过程,该作业共有320条指令,即它的地址空间为32页,目前它的所有页都还未调入 ...

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

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

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

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

最新文章

  1. linux java 构建工具有哪些,Linux ant --强大的Java开发构建工具
  2. 【Flutter】FutureBuilder 异步编程 ( FutureBuilder 构造方法 | AsyncSnapshot 异步计算 )
  3. 使用xmanager连接centos5.5
  4. 如何断开mongodb数据库连接_如何连接远程mongodb数据库
  5. 线程基本编程——线程函数大全
  6. Leet Code OJ 7. Reverse Integer [Difficulty: Easy]
  7. Java命令行界面(第6部分):JOpt简单
  8. 【POJ - 1028】 Web Navigation( 栈 or 模拟队列 )
  9. 高校各部门老师真实生活图鉴,哈哈哈哈哈哈哈
  10. C#LeetCode刷题之#884-两句话中的不常见单词(Uncommon Words from Two Sentences)
  11. 通过AFNetworking获取服务器时间
  12. WinForm主窗口框架的设计
  13. 2021-2027全球与中国3D 动作捕捉解决方案市场现状及未来发展趋势
  14. 如何将pdf文件转换成图片格式,插入到word中
  15. Photoshop CS2 视频教程-PS合并图层(转)
  16. 处理反走样常用的四种技术
  17. 单词快速记忆day 1
  18. HiveSqlSparkSql —— 使用left semi join做in、exists类型子查询优化
  19. 互联网晚报 | 8月16日 星期一 | 李宁上半年营收破百亿;微博视频打赏功能测试上线;我国银行理财产品投资者数量超6000万...
  20. 换三张麻将源代码php,理论先行:麻将换三张攻略大全

热门文章

  1. php 统计fasta 序列长度和GC含量
  2. AutoCAD 2018安装教程
  3. PS修改图片尺寸和大小
  4. Testin云测:深耕企业应用服务
  5. 【手把手教程】uniapp + vue 从0搭建仿斗鱼虎牙直播App:腾讯云MLVB移动直播实践连麦PK+带货
  6. 软件测试面试题(等待解答)
  7. Vue人资中台--打包上线
  8. Some file crunching failed, see logs for details
  9. 分享一些做课题调查的方法
  10. java将文件移动到另一个目录