flexPTP 1.0
An IEEE 1588 PTP implementation designed for microcontrollers
Loading...
Searching...
No Matches
fifo.c
Go to the documentation of this file.
1#include "fifo.h"
2#include <string.h>
3
4void fifo_init(Fifo *f, uint32_t len, uint32_t esize, uint8_t *data, FifoLockFn lockFn) {
5 f->len = len;
6 f->esize = esize;
7 f->data = data;
8 f->read = 0;
9 f->write = 0;
10 f->level = 0;
11 f->lockFn = lockFn;
12}
13
14#define FIFO_GET_ELEMENT_PTR(f, i) ((void *)(f->data + (f->esize * i)))
15#define FIFO_ADVANCE_INDEX(f, k) ((k) >= ((f)->len - 1)) ? 0 : ((k) + 1)
16
17bool fifo_push(Fifo * f, void const * item) {
18 // the storage is full
19 if (f->level == f->len) {
20 return false;
21 }
22
23 // enter critical section
24 f->lockFn(true);
25
26 // get destination pointer
27 void * dst = FIFO_GET_ELEMENT_PTR(f, f->write);
28
29 // store the data
30 memcpy(dst, item, f->esize);
31
32 // increment utilization
33 f->level++;
34
35 // advance write index
36 f->write = FIFO_ADVANCE_INDEX(f, f->write);
37
38 // leave critical section
39 f->lockFn(false);
40
41 return true;
42}
43
44uint32_t fifo_get_level(const Fifo * f) {
45 return f->level;
46}
47
48bool fifo_pop(Fifo * f, void * item) {
49 // the storage is full
50 if (f->level == 0) {
51 return false;
52 }
53
54 // enter critical section
55 f->lockFn(true);
56
57 // get source pointer
58 void * src = FIFO_GET_ELEMENT_PTR(f, f->read);
59
60 // read the data
61 memcpy(item, src, f->esize);
62
63 // decrement utilization
64 f->level--;
65
66 // advance read index
67 f->read = FIFO_ADVANCE_INDEX(f, f->read);
68
69 // leave critical section
70 f->lockFn(false);
71
72 return true;
73}
74
75void fifo_clear(Fifo * f) {
76 // enter critical section
77 f->lockFn(true);
78
79 // reset level and indices
80 f->level = 0;
81 f->read = 0;
82 f->write = 0;
83
84 // leave critical section
85 f->lockFn(false);
86}
bool fifo_pop(Fifo *f, void *item)
Definition: fifo.c:48
#define FIFO_GET_ELEMENT_PTR(f, i)
Definition: fifo.c:14
#define FIFO_ADVANCE_INDEX(f, k)
Definition: fifo.c:15
uint32_t fifo_get_level(const Fifo *f)
Definition: fifo.c:44
bool fifo_push(Fifo *f, void const *item)
Definition: fifo.c:17
void fifo_clear(Fifo *f)
Definition: fifo.c:75
void fifo_init(Fifo *f, uint32_t len, uint32_t esize, uint8_t *data, FifoLockFn lockFn)
Definition: fifo.c:4
void() FifoLockFn(bool lock)
FIFO lock function.
Definition: fifo.h:16
FIFO object.
Definition: fifo.h:21
uint32_t read
Next item to read.
Definition: fifo.h:25
FifoLockFn * lockFn
Locking function.
Definition: fifo.h:27
uint32_t level
FIFO utilization level.
Definition: fifo.h:22
uint32_t esize
Element size.
Definition: fifo.h:24
uint32_t len
Number of slots.
Definition: fifo.h:23
uint8_t * data
Pointer to the data pool.
Definition: fifo.h:28
uint32_t write
Next item to write.
Definition: fifo.h:26