C语言下使用ringbuffer实现任意数据类型的FIFO

来源:互联网 发布:ps cs6 mac中文破解版 编辑:程序博客网 时间:2024/05/19 05:34

头文件

#ifndef__FIFO_H_#define__FIFO_H_#pragma pack(4)typedef struct FIFO_Type_STRU{unsigned intDepth;// Fifo深度volatile unsigned intHead;// Head为起始元素volatile unsigned intTail;// Tail-1为最后一个元素volatile unsigned intCounter;// 元素个数unsigned intElementBytes;// 每个元素的字节数elementvoid*Buff;// 缓存区}FIFO_Type;#pragma pack()/********************************************************************//** * @brief       FIFO初始化 * @param[in]   pFIFO: FIFO指针 * @param[in]pBuff: FIFO中缓存 * @param[in]elementBytes:FIFO每个元素的字节数 * @param[in]depth: FIFO深度 * @return      None *********************************************************************/void FIFO_Init(FIFO_Type *pFIFO, void *pBuff, unsigned int elementBytes, unsigned int depth);/********************************************************************//** * @brief       向FIFO添加一个元素 * @param[in]   pFIFO: FIFO指针 * @param[in]pValue: 要添加的元素 * @return      1-TRUE or 0-FALSE *********************************************************************/unsigned char FIFO_AddOne(FIFO_Type *pFIFO, void *pValue);/********************************************************************//** * @brief       向FIFO添加多个元素 * @param[in]   pFIFO: FIFO指针 * @param[in]pValues: 要添加的元素指针 * @param[in]bytesToAdd: 要添加元素的长度 * @return      实际添加的元素个数 *********************************************************************/unsigned int FIFO_Add(FIFO_Type *pFIFO, void *pValues, unsigned int bytesToAdd);/********************************************************************//** * @brief       从FIFO读取一个元素 * @param[in]   pFIFO: FIFO指针 * @param[in]pValue: 存放要读取的元素指针 * @return      1-TRUE or 0-FALSE *********************************************************************/unsigned char FIFO_GetOne(FIFO_Type *pFIFO, void *pValue);/********************************************************************//** * @brief       从FIFO读取多个元素 * @param[in]   pFIFO: FIFO指针 * @param[out]pValues: 存放要读取的元素指针 * @param[in]bytesToRead: 要读取的元素长度 * @return      实际读取的元素个数 *********************************************************************/unsigned int FIFO_Get(FIFO_Type *pFIFO, void *pValues, unsigned int bytesToRead);/********************************************************************//** * @brief       清空FIFO * @param[in]   pFIFO: FIFO指针 * @return      None *********************************************************************/void FIFO_Clear(FIFO_Type *pFIFO);#endif


程序主体

/*******************************************************************************文件名称:fifo.c作    者:启岩 QQ516409354     版    本:P1.0       日    期:2014/2/20文件描述:        使用ringbuffer实现的FIFO函数列表:        略修改历史:   <版本>  <日    期>  <作 者>  <改动内容和原因>   ----------------------------------------------------    1.0    2014/2/20   启岩  基本的功能完成1.1    2015/1/29   启岩  1、增加FIFO_Clear()函数                           2、优化FIFO结构体成员类型*******************************************************************************/#include <string.h>#include "fifo.h"/********************************************************************//** * @brief       FIFO初始化 * @param[in]   pFIFO: FIFO指针 * @param[in]pBuff: FIFO中缓存 * @param[in]elementBytes:FIFO每个元素的字节数 * @param[in]depth: FIFO深度 * @return      None *********************************************************************/void FIFO_Init(FIFO_Type *pFIFO, void *pBuff, unsigned int elementBytes, unsigned int depth){pFIFO->Buff = pBuff;pFIFO->ElementBytes = elementBytes;pFIFO->Depth = depth;pFIFO->Head = 0;pFIFO->Tail = 0;pFIFO->Counter = 0;}/********************************************************************//** * @brief       判断FIFO是否为空 * @param[in]   pFIFO: FIFO指针 * @return      1-TRUE or 0-FALSE *********************************************************************/unsigned char FIFO_IsEmpty(FIFO_Type *pFIFO){return (pFIFO->Counter == 0);}/********************************************************************//** * @brief       判断FIFO是否已满 * @param[in]   pFIFO: FIFO指针 * @return      TRUE or FALSE *********************************************************************/unsigned char FIFO_IsFull(FIFO_Type *pFIFO){return (pFIFO->Counter == pFIFO->Depth);}/********************************************************************//** * @brief       向FIFO添加一个元素 * @param[in]   pFIFO: FIFO指针 * @param[in]pValue: 要添加的元素 * @return      1-TRUE or 0-FALSE *********************************************************************/unsigned char FIFO_AddOne(FIFO_Type *pFIFO, void *pValue){unsigned char *p;if (FIFO_IsFull(pFIFO)){return 0;}p = (unsigned char *)pFIFO->Buff;memcpy(p + pFIFO->Tail * pFIFO->ElementBytes, (unsigned char *)pValue, pFIFO->ElementBytes);pFIFO->Tail ++;if (pFIFO->Tail >= pFIFO->Depth){pFIFO->Tail = 0;}pFIFO->Counter ++;return 1;}/********************************************************************//** * @brief       向FIFO添加多个元素 * @param[in]   pFIFO: FIFO指针 * @param[in]pValues: 要添加的元素指针 * @param[in]bytesToAdd: 要添加元素的长度 * @return      实际添加的元素个数 *********************************************************************/unsigned int FIFO_Add(FIFO_Type *pFIFO, void *pValues, unsigned int bytesToAdd){unsigned char *p;unsigned int cnt = 0;p = (unsigned char *)pValues;while(bytesToAdd --){if (FIFO_AddOne(pFIFO, p)){p += pFIFO->ElementBytes;cnt++;}else{break;}}return cnt;}/********************************************************************//** * @brief       从FIFO读取一个元素 * @param[in]   pFIFO: FIFO指针 * @param[in]pValue: 存放要读取的元素指针 * @return      1-TRUE or 0-FALSE *********************************************************************/unsigned char FIFO_GetOne(FIFO_Type *pFIFO, void *pValue){unsigned char *p;if (FIFO_IsEmpty(pFIFO)){return 0;}p = (unsigned char *)pFIFO->Buff;memcpy(pValue, p + pFIFO->Head * pFIFO->ElementBytes, pFIFO->ElementBytes);pFIFO->Head ++;if (pFIFO->Head >= pFIFO->Depth){pFIFO->Head = 0;}pFIFO->Counter --;return 1;}/********************************************************************//** * @brief       从FIFO读取多个元素 * @param[in]   pFIFO: FIFO指针 * @param[out]pValues: 存放要读取的元素指针 * @param[in]bytesToRead: 要读取的元素长度 * @return      实际读取的元素个数 *********************************************************************/unsigned int FIFO_Get(FIFO_Type *pFIFO, void *pValues, unsigned int bytesToRead){unsigned int cnt = 0;unsigned char *p;p = pValues;while(bytesToRead--){if (FIFO_GetOne(pFIFO, p)){p += pFIFO->ElementBytes;cnt++;}else{break;}}return cnt;}/********************************************************************//** * @brief       清空FIFO * @param[in]   pFIFO: FIFO指针 * @return      None *********************************************************************/void FIFO_Clear(FIFO_Type *pFIFO){pFIFO->Counter = 0;pFIFO->Head = 0;pFIFO->Tail = 0;}

测试代码

void Tester(void){int i;FIFO_Typefifo;FIFO_Type*pfifo;intindex;floatfArray[10];floatfValue;charcArray[10];charcValue;pfifo = &fifo;printf("测试FIFO元素为float型的数据\r\n");printf("初始化FIFO值。\r\n");FIFO_Init(pfifo, fArray, sizeof(float), 10);for (i = 0; i < 10; i++){fValue = (100.0f+i*i);FIFO_AddOne(pfifo, &fValue);}printf("当前元数个数:%d\r\n", pfifo->Counter);index = 0;while(FIFO_GetOne(pfifo, &fValue)){index ++;printf("第%d个元素fValue = %0.3f\r\n",index, fValue);if (index == 5){printf("插入3个值。\r\n");fValue = 1.23f;FIFO_AddOne(pfifo, &fValue);fValue = 2.34f;FIFO_AddOne(pfifo, &fValue);fValue = 3.45f;FIFO_AddOne(pfifo, &fValue);}}printf("\r\n\r\n");printf("测试FIFO元素为char型的数据\r\n");FIFO_Init(pfifo, cArray, sizeof(char), 10);printf("初始化FIFO值。\r\n");FIFO_Add(pfifo, "ABCDEFGHIJ", 10);printf("当前元数个数:%d\r\n", pfifo->Counter);index = 0;while(FIFO_GetOne(pfifo, &cValue)){index ++;printf("第%d个元素cValue = %c\r\n",index, cValue);if (index == 5){printf("插入3个值。\r\n");cValue = 'X';FIFO_AddOne(pfifo, &cValue);cValue = 'Y';FIFO_AddOne(pfifo, &cValue);cValue = 'Z';FIFO_AddOne(pfifo, &cValue);}}}

运行结果







0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 高三学生受同学搔挠学习怎么办 烫完头发掉头发很厉害怎么办 烫头发后掉头发很厉害怎么办 十八岁了下门牙活动疼痛怎么办 烫完头发后掉头发很厉害怎么办 16岁的孩孑得了肺炎怎么办 我的头发掉的很厉害怎么办 八个月宝宝头后面没头发怎么办 生完孩子掉头发很厉害怎么办 生完孩子后掉头发很厉害怎么办 头发又细又软又卷怎么办 后颈部没有头发掉光了想植发怎么办 头发掉的厉害怎么办怎么拯救掉头发 头发可以种植吗 如果是秃顶怎么办 染头发把手指甲染黑了怎么办 怀孕两个月下体流褐色分泌物怎么办 头发总是大把大把的得掉 怎么办 严重脱发怎么办去问南宁肤康 脱发严重怎么办去看南宁肤康 前额头发少怎么办 如何使头发增多 生完宝宝头发一把一把的掉怎么办 生完宝宝后头发掉的厉害怎么办 生完宝宝头发掉的厉害怎么办 生了小孩后头发掉很多怎么办 生了孩子头发掉的很厉害怎么办 母乳期头发掉的很厉害怎么办 宝宝吃母乳头发掉的厉害怎么办 头发油腻头皮屑多还掉头发怎么办 头发剪了中分刘海弯了怎么办 头发掉了长出来的头发很细怎么办? 头皮损伤毛囊怎么办还会长头发吗 一岁宝宝头发稀少怎么办能刮光头么 前编头发长了怎么办怎么梳理 九个月宝宝头发稀少不长怎么办 前牙吃饭咬合很深吃饭就痛怎么办 吃了甜的冷的就牙疼怎么办 吃热的凉的甜的牙疼怎么办 头发太细了想让头发变粗点怎么办 我的头发又少又很油该怎么办 头发油掉发头顶头发稀疏怎么办 我的头发天生就少又细怎么办