-
Notifications
You must be signed in to change notification settings - Fork 1
/
FIFO.h
51 lines (46 loc) · 1.13 KB
/
FIFO.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/*
* FIFO.h
*
* Created: 11.09.2013 17:23:13
* Author: http://mainloop.ru/c-language/simple-fifo.html
*/
#ifndef FIFO__H
#define FIFO__H
//ðàçìåð äîëæåí áûòü ñòåïåíüþ äâîéêè: 4,8,16,32...128
#define FIFO( size )\
struct {\
unsigned char *buf[size];\
unsigned char tail;\
unsigned char head;\
}
//êîëè÷åñòâî ýëåìåíòîâ â î÷åðåäè
#define FIFO_COUNT(fifo) (fifo.head-fifo.tail)
//ðàçìåð fifo
#define FIFO_SIZE(fifo) ( sizeof(fifo.buf)/sizeof(fifo.buf[0]) )
//fifo çàïîëíåíî?
#define FIFO_IS_FULL(fifo) (FIFO_COUNT(fifo)==FIFO_SIZE(fifo))
//fifo ïóñòî?
#define FIFO_IS_EMPTY(fifo) (fifo.tail==fifo.head)
//êîëè÷åñòâî ñâîáîäíîãî ìåñòà â fifo
#define FIFO_SPACE(fifo) (FIFO_SIZE(fifo)-FIFO_COUNT(fifo))
//ïîìåñòèòü ýëåìåíò â fifo
#define FIFO_PUSH(fifo, byte) \
{\
fifo.buf[fifo.head & (FIFO_SIZE(fifo)-1)]=byte;\
fifo.head++;\
}
//âçÿòü ïåðâûé ýëåìåíò èç fifo
#define FIFO_FRONT(fifo) (fifo.buf[fifo.tail & (FIFO_SIZE(fifo)-1)])
//óìåíüøèòü êîëè÷åñòâî ýëåìåíòîâ â î÷åðåäè
#define FIFO_POP(fifo) \
{\
fifo.tail++; \
}
//î÷èñòèòü fifo
#define FIFO_FLUSH(fifo) \
{\
fifo.tail=0;\
fifo.head=0;\
}
#endif //FIFO__H
/* FIFO_H_ */