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


 

 

 

posted @ 2019-07-31 19:54  WCW的故事  阅读(547)  评论(0编辑  收藏  举报