• FIFO


                       FIFO

    在数据结构中,有一项内容叫队列。它是先进先出的一种结构,在操作系统中普遍使用并形成了消息队列这样强大的功能,对于有些信息,CPU没办法及时处理,就可以通过队列来做为缓存。这里要说的是它最基本的结构——先进先出。用过STM32的人会发现,在硬件上有一个叫FIFO的数据缓冲区,其实就是个队列,只不过它是硬件上处理的,不需要CPU处理。而很多单片机并没有硬件FIFO资源,那我们可以用软件来写一个。

    一、这是我从一个官方例程中看到的fifo结构

     1 #include "fifo.h"
     2 
     3 static uint16_t FifoNext( tFifo *fifo, uint16_t index )
     4 {
     5     return ( index + 1 ) % fifo->Size;
     6 }
     7 
     8 void FifoInit( tFifo *fifo, uint16_t *buffer, uint16_t size )
     9 {
    10     fifo->Begin = 0;
    11     fifo->End = 0;
    12     fifo->Data = buffer;
    13     fifo->Size = size;
    14 }
    15 
    16 void FifoPush( tFifo *fifo, uint16_t data )
    17 {
    18     fifo->End = FifoNext( fifo, fifo->End );
    19     fifo->Data[fifo->End] = data;
    20 }
    21 
    22 uint16_t FifoPop( tFifo *fifo )
    23 {
    24     uint16_t data = fifo->Data[FifoNext( fifo, fifo->Begin )];
    25 
    26     fifo->Begin = FifoNext( fifo, fifo->Begin );
    27     return data;
    28 }
    29 
    30 void FifoFlush( tFifo *fifo )
    31 {
    32     fifo->Begin = 0;
    33     fifo->End = 0;
    34 }
    35 
    36 bool IsFifoEmpty( tFifo *fifo )
    37 {
    38     return ( fifo->Begin == fifo->End );
    39 }
    40 
    41 bool IsFifoFull( tFifo *fifo )
    42 {
    43     return ( FifoNext( fifo, fifo->End ) == fifo->Begin );
    44 }
     1 #ifndef __FIFO_H__
     2 #define __FIFO_H__
     3 
     4 #include <stdbool.h>
     5 
     6 
     7 typedef struct sFifo
     8 {
     9     uint16_t Begin;
    10     uint16_t End;
    11     uint16_t *Data;
    12     uint16_t Size;
    13 }tFifo;
    14 
    15 void FifoInit( tFifo *fifo, uint16_t *buffer, uint16_t size );
    16 
    17 void FifoPush( tFifo *fifo, uint16_t data );
    18 
    19 uint16_t FifoPop( tFifo *fifo );
    20 
    21 void FifoFlush( tFifo *fifo );
    22 
    23 bool IsFifoEmpty( tFifo *fifo );
    24 
    25 bool IsFifoFull( tFifo *fifo );
    26 
    27 #endif // __FIFO_H__

    二、这是我从网上见到的并修改正在使用的FIFO结构 1 #include "fifo.h"

     2 
     3 
     4 
     5 /************************************************************** 
     6 * 函数名  : FIFO_Init
     7 * 描述    : fifo初始化
     8 * 输入    : fifo寄存器
     9 * 输出    : None
    10 *************************************************************/
    11 void FIFO_Init(FifoTypedef *Fifo) 
    12 {
    13     Fifo->front = Fifo->rear;            //初始化时队列头尾相连
    14     Fifo->count = 0;                           //队列数为0
    15 }
    16 
    17 
    18 
    19 /************************************************************** 
    20 * 函数名  : FIFO_In
    21 * 描述    : 数据进fifo
    22 * 输入    : *Fifo:fifo寄存器
    23                         *sdat:队列内容
    24                         len:数据长度
    25 * 输出    : 操作结果
    26 *************************************************************/
    27 unsigned char FIFO_In(FifoTypedef *Fifo, unsigned char *sdat, unsigned int len)
    28 {
    29     unsigned int i;    
    30     
    31     if((Fifo->front == Fifo->rear) && (Fifo->count == FIFO_Size))
    32     {                   
    33         return FIFO_Full;       //队列已满
    34     }
    35     else
    36     {   
    37         memcpy(Fifo->dat[Fifo->rear], sdat, len);    //拷入队列41         Fifo->rear = (Fifo->rear + 1) % FIFO_Size;
    42         Fifo->count = Fifo->count + 1;
    43         return FIFO_OperateOk; 
    44     }
    45 }
    46 
    47 
    48 
    49 /************************************************************** 
    50 * 函数名  : FIFO_Out
    51 * 描述    : 读出fifo数据
    52 * 输入    : *Fifo:fifo寄存器
    53                         *sdat:读出数据存放地址
    54                         len:数据长度
    55 * 输出    : 操作结果
    56 *************************************************************/
    57 unsigned char FIFO_Out(FifoTypedef *Fifo, unsigned char *sdat, unsigned int len)   
    58 {
    59     unsigned int i;    
    60     
    61     if((Fifo->front == Fifo->rear) && (Fifo->count == 0))
    62     {
    63         return FIFO_Empty;        //队列为空
    64     }
    65     else
    66     {   

           memcpy(sdat, Fifo->dat[Fifo->rear], len);    //输出队列内容
           memset(Fifo->dat[Fifo->front], 0, len);
    72         Fifo->front = (Fifo->front + 1) % FIFO_Size;
    73         Fifo->count = Fifo->count - 1;
    74         return FIFO_OperateOk;
    75     }
    76 }
     1 #ifndef __FIFO_H      
     2 #define __FIFO_H
     3  
     4 
     5 #define FIFO_Dat       129             //fifo队列内容大小
     6 #define FIFO_Size      15                 //fifo队列大小
     7 #define FIFO_Full      0              //fifo已满
     8 #define FIFO_Empty     1        //fifo有空
     9 #define FIFO_OperateOk 2              //队列操作完成
    10 
    11 typedef struct 
    12 {
    13     unsigned short front;             //队列头
    14     unsigned short rear;            //队列尾
    15     unsigned short count;              //队列计数
    16     unsigned char dat[FIFO_Size][FIFO_Dat];    //队列内容
    17 }FifoTypedef;
    18 
    24 
    25 extern void FIFO_Init(FifoTypedef *Fifo);            //fifo初始化
    26 extern unsigned char FIFO_In(FifoTypedef *Fifo, unsigned char *sdat, unsigned int len);        //数据进fifo
    27 extern unsigned char FIFO_Out(FifoTypedef *Fifo, unsigned char *sdat, unsigned int len);    //数据出fifo
    28
    29
    #endif
    
    
    
    

     

  • 相关阅读:
    视频质量诊断之详解
    Leetcode 22.生成括号对数
    leetcode 19.删除链表的第n个节点
    Leetcode 11.盛最多水的容器
    Leetcode 6.Z字形变换
    Leetcode 4.两个排序数组的中位数
    Leetcode 3.无重复字符的最长子串
    Leetcode 1.两数之和
    RNN and Language modeling in TensorFlow
    Tensorflow word2vec+manage experiments
  • 原文地址:https://www.cnblogs.com/wcw12580/p/11277463.html
Copyright © 2020-2023  润新知