一个好用的fifo

改造的Nordic库中的 E:\nRF52_SDK_0.9.2_dbc28c9\components\libraries\fifo

sensor_fifo.c

#include "sensor_fifo.h"

static __INLINE uint32_t fifo_length(sensor_t * p_fifo)
{
  uint32_t tmp = p_fifo->read_pos;
  return p_fifo->write_pos - tmp;
}

#define FIFO_LENGTH fifo_length(p_fifo)  

uint32_t sensor_init(sensor_t * p_fifo, int16_t * p_buf, uint16_t buf_size)
{
    if (p_buf == NULL)
    {
        return 0;
    }

    p_fifo->p_buf         = p_buf;
    p_fifo->buf_size_mask = buf_size - 1;
    p_fifo->read_pos      = 0;
    p_fifo->write_pos     = 0;

    return 1;
}

uint32_t sensor_put(sensor_t * p_fifo, int16_t byte)
{
    if (FIFO_LENGTH <= p_fifo->buf_size_mask)
    {
        p_fifo->p_buf[p_fifo->write_pos & p_fifo->buf_size_mask] = byte;
        p_fifo->write_pos++;
        return 1;
    }

    return 0;
}

uint32_t sensor_get(sensor_t * p_fifo, int16_t * p_byte)
{
    if (FIFO_LENGTH != 0)
    {
        *p_byte = p_fifo->p_buf[p_fifo->read_pos & p_fifo->buf_size_mask];
        p_fifo->read_pos++;
        return 1;
    }

    return 0;

}

uint32_t sensor_flush(sensor_t * p_fifo)
{
    p_fifo->read_pos = p_fifo->write_pos;
    return 1;
}

sensor_fifo.h

#ifndef SENSOR_FIFO_H__
#define SENSOR_FIFO_H__

#include <stdint.h>
#include <stdlib.h>

typedef struct
{
    int16_t *          p_buf;
    uint16_t           buf_size_mask;
    volatile uint32_t  read_pos;
    volatile uint32_t  write_pos;
} sensor_fifo_t;

uint32_t sensor_fifo_init(sensor_fifo_t * p_fifo, uint8_t * p_buf, uint16_t buf_size);

uint32_t sensor_fifo_get(sensor_fifo_t * p_fifo, uint8_t * p_byte);

uint32_t sensor_fifo_flush(sensor_fifo_t * p_fifo);

#endif 
时间: 2024-11-05 01:48:58

一个好用的fifo的相关文章

练习--LINUX进程间通信之有名管理FIFO

从FIFO中读取数据: 约定:如果一个进程为了从FIFO中读取数据而阻塞打开FIFO,那么称该进程内的读操作为设置了阻塞标志的读操作. 如果有进程写打开FIFO,且当前FIFO内没有数据,则对于设置了阻塞标志的读操作来说,将一直阻塞.对于没有设置阻塞标志读操作来说则返回-1,当前errno值为EAGAIN,提醒以后再试. 对于设置了阻塞标志的读操作说,造成阻塞的原因有两种:当前FIFO内有数据,但有其它进程在读这些数据:另外就是FIFO内没有数据.解阻塞的原因则是FIFO中有新的数据写入,不论信

FIFO管道探索历程

刚开始代码的实现如下: void CreateFIFO(){    if((mkfifo(FIFOPATH,O_CREAT|O_EXCL|O_RDWR)<0)&&(errno!=EEXIST))    {        printf(strerror(errno));    }   } int OpenFIFO(){    fd=open(FIFOPATH,O_RDWR|O_NONBLOCK);    return fd;} 觉得非常的不优雅,毕竟需要调用两个函数,而且写函数又有一个

【UNIX网络编程】FIFO

管道作为进程间通信的最古老方式,它的缺点是没有名字,因此只能用在有亲缘关系的父子进程之间.对于无亲缘关系的进程间,无法用管道进行通信.FIFO可以完成无亲缘关系的进程间的通信,FIFO也被称为命名管道.它是一种特殊类型的文件,在文件系统中以文件名的形式存在,但它的行为却和上面提到的管道类似. 创建命名管道有两种方法: 1.在命令行上执行命令:mkfifo filename 来创建FIFO. 2.使用mkfifo函数创建FIFO. #include <sys/stat.h> #include &

FPGA学习笔记之FIFO IP核

FIFO总结文档 何为FIFO .? FIFO(First In First Out ) 先进先出是一个常用于数据缓存的一个数据缓冲器. fifo主要有WRREQ(写信号)WRclk(写时钟)data(写数据)wrfull(写满标志)wrempty(写空标志)wrusedw(告知里面还有多少数据) Rdreq(读信号)rdclk(读时钟)rdfull(读满标志)rdempty(读空标志)rdusedw(告知里面数据个数) 以上所有信号全是高电平有效. 为什么要用fifo? 在项目设计中,我们通常

Verilog基础知识7(FIFO深度计算)

需求说明:Verilog设计 内容       :第一部分 FIFO深度讨论                   第二部分 FIFO深度计算 来自       :时间的诗 第一部分 FIFO深度讨论 原文:http://comm.chinaaet.com/adi/blogdetail/37555.html 其实很惭愧,在这之前用FIFO都是直接用IP,因为应用场景很简单,因此FIFO深度的选择也比较随意,并没想很多.今天在网上看到一个异步FIFO深度计算的题目,发现对于这块并不熟悉,因此注意了下

用Verilog语言实现一个简单的MII模块

项目中要求简单地测试一下基于FPGA的模拟平台的RJ45网口,也就是需要实现一个MII或者RMII模块.看了一下官方网口PHY芯片的官方文档,还是感觉上手有点障碍,想在网络上找些参考代码看看,最后只在opencores找到了一些MAC层控制模块,代码庞大且复杂,对于初学者来说阅读起来很困难. 于是在此以一个初学者的角度记录一下我实现一个简单的MII模块的过程,并且指出一些实现过程中要注意的问题.希望可以帮助有需要的朋友. 为了便于测试,我选择了和我们平台使用相同物理芯片的FPGA开发板NEXYS

进程间通信(5) - 命名管道(FIFO)

1. 前言 本篇文章的所有例子,基于RHEL6.5平台.前一篇文章介绍了匿名管道.点此链接. 2.介绍 管道应用的一个重大限制是它没有名字,因此,只能用于具有亲缘关系的进程间通信,在有名管道(named pipe或FIFO)提出后,该限制得到了克服.FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中.这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,

Linux环境编程之IPC进程间通信(三):FIFO

管道是没有名字的,因此它只能在有亲缘关系的进程间使用,给管道加上名字,我们称之为有名管道FIFO,当然FIFO与管道之间不止有没有名字的区别,还有其他区别下面会提到.与管道类似的是,FIFO是一个单向(半双工)数据流.不同于管道的是,每个FIFO有一个路径名与之关联,从而允许无亲缘关系的进程之间访问同一个FIFO.FIFO是一种文件类型.stat结构成员st_mode的编码指明文件是否是FIFO类型,可以用S_ISFIFO宏对此进行测试. FIFO由mkfifo函数创建,它已经隐含指定了O_CR

Linux IPC之管道和FIFO

导言:管道是UNIX系统上最古老的IPC方法,管道提供了一种优雅的解决方案:给定两个运行不同程序的进程,在shell中如何让一个进程的输出作为另一个进程的输入?管道可以用来在相关(一个共同的祖先进程创建管道)进程之间传递数据.FIFO是管道概念的一个变体,它们之间的一个重要差别在于FIFO可以用于任意进程间的通信. 概述 每个shell用户都对在命令中使用管道比较熟悉,例如,统计一个目录中文件的数目: ls | wc -l 解释:为了执行上面的命令,shell创建了两个进程来分别执行ls和wc(