本代碼整理自《30天自製作業系統》P135的整理FIFO緩衝區
寫的很好,所以記錄一下(增加了一個fifo8_free函數,用於查詢剩餘容量,覺得有用)。作者實現的是char類型的緩衝區,但是可以用你要傳的任意結構體來替換~~~
fifo8.h
/*溢出標誌:0-正常,-1-溢出*/#define FLAGS_OVERRUN 0x0001/* buf- 緩衝區地址 size- 大小 free- 空餘容量 putP- 下一個資料寫入位置 getP- 下一個資料獨處位置*/struct FIFO8{ unsigned char *buf; int putP,getP,size,free,flags;};void fifo8_init(struct FIFO8 *fifo,int size, unsigned char *buf);int fifo8_put(struct FIFO8 *fifo,unsigned char data);int fifo8_get(struct FIFO8 *fifo);int fifo8_status(struct FIFO8 *fifo);int fifo8_free(struct FIFO7 *fifo);
fifo8.c
#include "fifo8.h"void fifo8_init(struct FIFO8 *fifo,int size, unsigned char *buf)/*初始化*/{ fifo->buf=buf; fifo->flags=0; fifo->free=size; fifo->size=size; fifo->putP=0; fifo->getP=0; return;}int fifo8_putPut(struct FIFO8 *fifo,unsigned char data)/*向FIFO 中寫入資料 */{ if(fifo->free==0){ fifo->flags |= FLAGS_OVERRUN; return -1; } fifo->buf[fifo->putP] = data; fifo->putP++; //迴圈隊列緩衝區 if(fifo->putP == fifo->size){ fifo->putP = 0; } fifo->free--; return 0;}int fifo8_get(struct FIFO8 *fifo)/*從FIFO 中取出一個資料 */{ int data; if(fifo->free == fifo->size){ return -1; } data = fifo->getP; fifo->getP++; if(fifo->getP == fifo->size){//用來實現迴圈 fifo->getP = 0; } fifo->free++; return data;}int fifo8_status(struct FIFO8 *fifo)/*緩衝區被使用容量*/{ return fifo->size-fifo->free;}int fifo8_free(struct FIFO8 *fifo)/*緩衝區剩餘容量*/{ return fifo->free;}
學習的地方:傳回值為void時可以return;迴圈緩衝區的構造;溢出標誌設定;