首页 > 其他分享 >FIFO in C

FIFO in C

时间:2024-06-20 11:58:46浏览次数:21  
标签:uint8 Fifo fifo data FIFO out

/*
fifo.c 
Description: Implements a FIFO buffer

License: Revised BSD License, see LICENSE.TXT file include in the project

Maintainer: Miguel Luis and Gregory Cristian
*/

#include "fifo.h"

static uint16_t FifoNext( Fifo_t *fifo, uint16_t index )
{
    return ( index + 1 ) % fifo->Size;
}

void FifoInit( Fifo_t *fifo, uint8_t *buffer, uint8_t queueCapcity, uint16_t size )
{
    fifo->Begin = 0;
    fifo->End = 0;
    fifo->Data = buffer;
    fifo->Size = size;
    fifo->Count = 0;
    fifo->QueueCapcity = queueCapcity;
}


uint8_t FifoPush( Fifo_t *fifo, uint8_t buf[] )
{
    bool rv = IsFifoFull(fifo);
    if (rv){
        //cm_printf("fifo full, cmd %02x\n", buf[6]);
        return false;
    }
    
    fifo->End = FifoNext( fifo, fifo->End );
    
    memcpy(fifo->Data + fifo->End * fifo->QueueCapcity, buf, buf[0] + 1 );
    fifo->Count++;
    
    return true;
}


uint8_t FifoPop( Fifo_t *fifo , uint8_t *out_data)
{
    uint8_t *p_data = NULL;
    uint8_t ret = IsFifoEmpty(fifo);
    
    if (ret){        
        return false;
    }
            
    p_data = fifo->Data + FifoNext( fifo, fifo->Begin ) * fifo->QueueCapcity;
    
    memcpy(out_data, p_data, p_data[0] + 1);

    fifo->Begin = FifoNext( fifo, fifo->Begin );
    
    fifo->Count--;    
    
    return true;
}


void FifoFlush( Fifo_t *fifo )
{
    fifo->Begin = 0;
    fifo->End = 0;
    fifo->Count = 0;
}

bool IsFifoEmpty( Fifo_t *fifo )
{
    
    return (fifo->Count == 0);
}

bool IsFifoFull( Fifo_t *fifo )
{    
    return (fifo->Count == fifo->Size);
}

fifo.c 

fifo.h

/*
fifo.h
Description: Implements a FIFO buffer

License: Revised BSD License, see LICENSE.TXT file include in the project

Maintainer: Miguel Luis and Gregory Cristian
*/
#ifndef __FIFO_H__
#define __FIFO_H__

#include <stdbool.h>
#include <stdint.h>
#include <string.h>

/*!
 * FIFO structure
 */
typedef struct Fifo_s
{
    uint16_t Begin;
    uint16_t End;
    uint8_t *Data;
    uint8_t  QueueCapcity;
    uint16_t Size;
    uint16_t Count;
}Fifo_t;

/*!
 * Initializes the FIFO structure
 *
 * \param [IN] fifo   Pointer to the FIFO object
 * \param [IN] buffer Buffer to be used as FIFO
 * \param [IN] size   Size of the buffer
 */
void FifoInit( Fifo_t *fifo, uint8_t *buffer, uint8_t queueCapcity, uint16_t size );

/*!
 * Pushes data to the FIFO
 *
 * \param [IN] fifo Pointer to the FIFO object
 * \param [IN] data Data to be pushed into the FIFO
 */
uint8_t FifoPush( Fifo_t *fifo, uint8_t buf[] );

/*!
 * Pops data from the FIFO
 *
 * \param [IN] fifo Pointer to the FIFO object
 * \retval data     Data popped from the FIFO
 */
uint8_t FifoPop( Fifo_t *fifo , uint8_t *out_data);

/*!
 * Flushes the FIFO
 *
 * \param [IN] fifo   Pointer to the FIFO object
 */
void FifoFlush( Fifo_t *fifo );

/*!
 * Checks if the FIFO is empty
 *
 * \param [IN] fifo   Pointer to the FIFO object
 * \retval isEmpty    true: FIFO is empty, false FIFO is not empty
 */
bool IsFifoEmpty( Fifo_t *fifo );

/*!
 * Checks if the FIFO is full
 *
 * \param [IN] fifo   Pointer to the FIFO object
 * \retval isFull     true: FIFO is full, false FIFO is not full
 */
bool IsFifoFull( Fifo_t *fifo );

#endif // __FIFO_H__

 

#define FIFO_SIZE    16
#define FIFO_QUE_CAPCAITY   255
   
static uint8_t g_fifo_buffer[FIFO_SIZE][FIFO_QUE_CAPCAITY] = {0};

uint8_t *p_fifo_data = g_fifo_buffer[0];

Fifo_t g_fifo = {0};
Fifo_t *p_fifo = &g_fifo;

static uint8_t g_trade_log[PORT_TOTAL_NUM][FIFO_QUE_CAPCAITY] = {0};


void fifo_init(void){
    
    FifoInit(p_fifo, p_fifo_data, FIFO_QUE_CAPCAITY, FIFO_SIZE);
}


void msg_enqueue(uint8_t port){
    
    //cm_printf("trade log enqueue %d\n", port);
    
    FifoPush(p_fifo, g_trade_log[port - 1]);
}


uint8_t msg_dequeue(uint8_t out_buf[], uint8_t *out_len){

   uint8_t rv = 0;
   
   rv = FifoPop(p_fifo, out_buf);
   if (rv){ 
       
       *out_len = out_buf[0];
       memcpy(out_buf, out_buf + 1, *out_len);
   }
   
   return rv;   
}

 

标签:uint8,Fifo,fifo,data,FIFO,out
From: https://www.cnblogs.com/wallywl/p/18258403

相关文章

  • 【操作系统】pipe&mkfifo|管道详解
     ......
  • 深入解析 Cognex VisionPro 的 CogAcqFifoTool
    深入解析CognexVisionPro的CogAcqFifoTool在现代工业自动化和机器视觉领域,图像获取是实现各种视觉检测、识别和分析的第一步。而CognexVisionPro提供了一系列强大的工具,其中CogAcqFifoTool是专门用于图像获取的重要工具。本文将深入解析CogAcqFifoTool,帮助您了解其功......
  • 用verilog/systemverilog 设计fifo (1)
    目录fifo的基本原理基于计数器的同步fifo实现(1)基于计数器的同步fifo实现(2)基于高位补偿法的fifo实现fifo的基本原理FIFO(firstinfirstout),即先进先出存储器,功能与数据结构中的队列相似。在IC设计中,FIFO常用来缓冲突发数据,流式数据与块数据的转换等等。比如上图中,在两个......
  • (4)跨时钟域设计(多bit+FIFO)
    一、引入 以上是多bit指示信号的传输与指示信号不同,多bit数据流具有连续性,即背靠背传输,同时要求信号具有较快的传播速度目前多bit数据流传输有两种,一种是借助SRAM,另一种是借助FIFO二、FIFO 如果FIFO内数据写满则生成满信号,反压上游结点,上游停止写入新......
  • ibatis-FifoCache
    核心代码Deque<Object>keyList=newLinkedList<>();为什么使用LinkedList?单向链表。使用LinkedList实现FIFO,支持头、尾节点的单向链表。添加时,判断数量大于初始化值时,删除头结点。源码:publicclassFifoCacheimplementsCache{privatefinalCachedelegate;pri......
  • S3-FIFO
    S3-FIFO本文作为下一篇缓存文章的预备知识。背景基于LRU和FIFO的驱逐FIFO和LRU都是经典的缓存驱逐算法,在过去几十年中也出现了很多追求更高效率的驱逐算法,如ARC,2Q,LIRS,TinyLFU。传统观点认为,基于LRU的缓冲未命中率要低于基于FIFO的算法,如CLOCK,这类高级算法通常都是基于LR......
  • FPGA入门笔记013——嵌入式块RAM使用之FIFO
    1、FIFO概述​ FIFO(FirstInFirstOut),即先进先出。FPGA或者ASIC中使用到的FIFO一般指的是对数据的存储具有先进先出特性的一个缓存器,常被用于数据的缓存或者高速异步数据的交互。它与普通存储器的区别是没有外部读写地址线,这样使用起来相对简单,但缺点就是只能顺序写入数据......
  • 关于异步FIFO的描述,错误的是()
    选项:A、异步FIFO是指读、写时钟完全独立且不一致,或者不同频率,或者同频但不同相B、异步FIFO地址产生最好采用2进制计数的方式,当读使能有效,在时钟作用下,读地址加1,写使能有效,写地址加1C、当读写指针相同时,异步FIFO为空D、异步FIFO会出现假满的情况,但数据不会出错,会损失些性能答......
  • 为什么以太网的接收需要cmd fifo而ddr3的native接口可以不需要?
    1.以太网存在crc校验和其他的校验,直到这一帧完全传递完才知道是否需要这些数据;2.ddr3每次处理的数据是固定的(安全起见,防止4k边界问题,暂不设置可变burstlength),所以只需要:写入:通过fifo的计数设置满足burst长度时读出fifo写入ddr3,然后根据突发的周期标志修改cmd提供的地址即可......
  • FIFO存储器选型参数,结构原理,工艺与注意问题总结
      ......