/****************************************Copyright (h)****************************************************
**
**---------------------------------------文件信息---------------------------------------------------------
** 文 件 名: os_fifo.h
** 最后日期: 2017-7-29
** 描 述: 环形缓冲队列的实现
**
*********************************************************************************************************/
#ifndef __OS_FIFO1_H
#define __OS_FIFO1_H
#include "stdio.h"
//#include "BTP02_HEAD.h"
typedef struct _buflink {
unsigned char *buf;
struct _buflink *nextbuflink;
}buflink_t;
typedef struct fifo {
buflink_t *outlink; // 队头 出 front
buflink_t *Inlink; // 队尾 入 rear
}fifo_t;
extern void OsFifoIn (fifo_t *FifoBuf, unsigned char *buf, unsigned char arrlen);
extern unsigned char *OsFifoOut (fifo_t *FifoBuf);
extern void Fifo_Init (fifo_t **fifobuf);
#endif
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
/****************************************Copyright (c)****************************************************
**
**---------------------------------------文件信息---------------------------------------------------------
** 文 件 名: os_fifo.c
** 最后日期: 2017-7-29
** 描 述: 环形缓冲队列的实现
**
*********************************************************************************************************/
#include "stdlib.h"
#include "string.h"
#include "os_fifo1.h"
/*********************************************************************************************************
* 函数名称: SetFifoNull
* 说 明: 置空队
* 输入参数: FifoBuf 待操作的链队列
* 返 回 值: 无
* 注意事项:
*********************************************************************************************************/
void SetFifoNull (fifo_t *FifoBuf)
{
FifoBuf-> outlink = (buflink_t *)malloc(sizeof(buflink_t)); /* 分配头节点的空间 */
FifoBuf-> outlink = NULL; /* 队列头节点的尾指针指向NULL */
FifoBuf-> outlink = FifoBuf-> Inlink; /* 尾指针和头指针重合 */
}
unsigned int GetLength (fifo_t *FifoBuf)
{
unsigned int length = 0;
buflink_t *p1 = FifoBuf-> outlink;
buflink_t *p2 = FifoBuf-> Inlink;
while(p1 != p2) {
p1 = p1->nextbuflink;
length++;
}
return length;
}
/*********************************************************************************************************
* 函数名称: Empty
* 说 明: 判队空
* 输入参数: FifoBuf 待操作的链队列
* 返 回 值: 1 队空 0 非队空
* 注意事项:
*********************************************************************************************************/
unsigned char Empty (fifo_t *FifoBuf)
{
if (FifoBuf->outlink == FifoBuf->Inlink) {
return 1;
} else {
return 0;
}
}
/*********************************************************************************************************
* 函数名称: OsFifoIn
* 说 明: 链队入队, 将buf[arrlen]数组 在前面加上待写入数据个数组成buf[arrlen+1]写入到新的节点的数据区域中,
同时开辟新节点, 将入队节点指向空
* 输入参数: FifoBuf 待操作的链队列, buf[arrlen]: 待入队的数据
* 返 回 值: 无
* 注意事项:
*********************************************************************************************************/
void OsFifoIn (fifo_t *FifoBuf, unsigned char *buf, unsigned char arrlen)
{
unsigned char i = 0;
unsigned char *dbuf;
/* 开辟节点用来保存新入队的链表 */
FifoBuf->Inlink->nextbuflink = (buflink_t *)malloc(sizeof(buflink_t));
/* 给刚开辟的节点赋值待写入的数据 */
FifoBuf->Inlink->buf = (unsigned char *)malloc(sizeof(unsigned char)*(arrlen+1));
dbuf = FifoBuf->Inlink->buf;
*dbuf++ = arrlen + 1;
/* 给原buf[arrlen]加上字节长度变成dbuf[arrlen+1] */
for (i = 0; i < arrlen; i++) {
*dbuf++ = *buf++;
}
FifoBuf->Inlink = FifoBuf->Inlink->nextbuflink; /* 队尾指针指向新开辟的节点 */
FifoBuf->Inlink->nextbuflink = NULL; /* 队尾节点指针指向NULL */
}
unsigned char *OsFifoOut (fifo_t *FifoBuf)
{
buflink_t *FifoOutBuf;
unsigned char *pbuf;
/* 判队空则直接返回0 */
if (Empty(FifoBuf)) {
return 0;
}
FifoOutBuf = FifoBuf->outlink; /* 新链队指向头节点 */
FifoBuf->outlink = FifoOutBuf->nextbuflink; /* 头指针指向原对头节点 */
pbuf = FifoOutBuf -> buf; /* 获取原队头节点的数据 */
free(FifoOutBuf); /* 释放原头节点 */
return (pbuf);
}
void Fifo_Init (fifo_t **fifobuf)
{
(*fifobuf) = (fifo_t *)malloc(sizeof(fifo_t));
(*fifobuf) -> outlink = (*fifobuf)->Inlink = (buflink_t *)malloc(sizeof(buflink_t));
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/