循环数组实现FIFO
2014-03-21 19:54
155 查看
涉及到数据通信的软件开发,不能回避的一点是,设计一个实用高效率的数据缓冲区,例如fifo。今天在做项目时候,需要缓存CAN总线上的数据,然后再需要的时候读这些数据。下边给出我自己设计的,采用循环数组实现的FIFO,未经过严格的测试,请您斟酌。需要指出的是,fifo的数组深度是256,采用的数组下标是unchar类型,当下标在0xff加1,到达数组末端时,刚好unchar类型的下标溢出为0,这样免去了手动修改下标。先看代码:
向fifo插入数据
(1)条件:任何条件下都允许插入数据;
(2)操作:data-->buf[in]; in++; 此时考虑2中情况,in==out?时,说明队列已经满了,此时将最“老”的数据丢掉,out++;若in!=out,则不需要操作。
(3)返回值:当(2)中发生丢数据时,报出返回值ff,指示数据溢出,fifo还可以正常工作;没有丢数,则正常返回00
从fifo中取数据
(1)条件:需满足,in!=out。
(2)操作:满足(1)时,执行buf[out]-->data, out++. 返回值说明取数据操作是否成功。
如果fifo数组长度BUF_MAX与数组下标(in,out)不满足2^8=256时,则需要增加修改下标的逻辑,在每次++的时候判断即可。
#pragma once #include <string.h> #include "afx.h" #define BUF_MAX 256 struct _fifo { int buf[BUF_MAX]; /* 预设最大深度256的fifo,这里元素是int,当然可以使其他自定义类型 */ unsigned char in; /* 下次插入fifo的数组下标 */ unsigned char out; /* 下次fifo出数据的下标 */ unsigned short num; /* fifo中数据元素的个数 */ CRITICAL_SECTION cs; /* 共享数据保护,在windows下采用临界区机制 */ }; /* 初始化fifo结构 */ static void __init_fifo(_fifo* pf) { memset(pf->buf, 0, sizeof(pf->buf)); pf->in=0; pf->out=0; pf->num=0; InitializeCriticalSection(&pf->cs); } static unsigned char __in_fifo(_fifo* pf, int data) { unsigned char rt; EnterCriticalSection(&pf->cs); pf->buf[pf->in]=data; pf->in++; if (pf->in==pf->out) { pf->out++; rt=0xFF; } else { pf->num++; rt= 0; } LeaveCriticalSection(&pf->cs); return rt; } static unsigned char __out_fifo(_fifo* pf, int* data) { unsigned char rt; EnterCriticalSection(&pf->cs); if (pf->in==pf->out) { rt= 0xFE; } else { *data=pf->buf[pf->out]; pf->out++; pf->num--; rt=0; } LeaveCriticalSection(&pf->cs); return rt; } static void _uninit_fifo(_fifo* pf) { DeleteCriticalSection(&pf->cs); }
向fifo插入数据
(1)条件:任何条件下都允许插入数据;
(2)操作:data-->buf[in]; in++; 此时考虑2中情况,in==out?时,说明队列已经满了,此时将最“老”的数据丢掉,out++;若in!=out,则不需要操作。
(3)返回值:当(2)中发生丢数据时,报出返回值ff,指示数据溢出,fifo还可以正常工作;没有丢数,则正常返回00
从fifo中取数据
(1)条件:需满足,in!=out。
(2)操作:满足(1)时,执行buf[out]-->data, out++. 返回值说明取数据操作是否成功。
如果fifo数组长度BUF_MAX与数组下标(in,out)不满足2^8=256时,则需要增加修改下标的逻辑,在每次++的时候判断即可。
相关文章推荐
- FIFO队列实现-------循环数组实现
- 使用不完全填满数组的实现的循环FIFO(队列)
- 队列(queue)的链表(list)实现及循环数组(circular array)实现 C++实现
- 一个循环实现新数组n位值是老数组前n位的和
- [算法] 循环有序数组查找递归实现
- 循环队列—数组实现
- 数组实现的简单循环队列
- c语言用简单数组实现循环队列
- 数据结构(一) -- 循环队列数组实现
- 现在需要多维数组的key 跟对应的数据内容,借助循环跟break实现,一层跳出
- Implement CircularArray class 实现循环数组
- C语言实现数组的循环左移,右移,翻转
- 队列的循环数组实现
- 循环队列的数组表示函数的实现
- 10,javase代码实战-循环控制——使用while与自增运算符实现遍历数组(一)
- 实现字符串循环右移n 位与左移n位(建立数组)
- 循环队列--数组实现
- C语言实现数组的循环左移,右移,翻转的示例
- 用数组实现FIFO队列
- java使用数组实现循环队列