Skip to content

Commit b1dfdaf

Browse files
committed
py/ringbuf.h: Add reusable ring buffer class.
Features inline get/put operations for the highest performance. Locking is not part of implementation, operation should be wrapped with locking externally as needed.
1 parent f50d947 commit b1dfdaf

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

py/ringbuf.h

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/*
2+
* This file is part of the MicroPython project, http://micropython.org/
3+
*
4+
* The MIT License (MIT)
5+
*
6+
* Copyright (c) 2016 Paul Sokolovsky
7+
*
8+
* Permission is hereby granted, free of charge, to any person obtaining a copy
9+
* of this software and associated documentation files (the "Software"), to deal
10+
* in the Software without restriction, including without limitation the rights
11+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
* copies of the Software, and to permit persons to whom the Software is
13+
* furnished to do so, subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in
16+
* all copies or substantial portions of the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24+
* THE SOFTWARE.
25+
*/
26+
#ifndef __MICROPY_INCLUDED_PY_RINGBUF_H__
27+
#define __MICROPY_INCLUDED_PY_RINGBUF_H__
28+
29+
typedef struct _ringbuf_t {
30+
uint8_t *buf;
31+
uint16_t size;
32+
uint16_t iget;
33+
uint16_t iput;
34+
} ringbuf_t;
35+
36+
// Static initalization:
37+
// byte buf_array[N];
38+
// ringbuf_t buf = {buf_array, sizeof(buf_array)};
39+
40+
// Dynamic initialization. This creates root pointer!
41+
#define ringbuf_alloc(r, sz) \
42+
{ \
43+
(r)->buf = m_new(uint8_t, sz); \
44+
(r)->size = sz; \
45+
(r)->iget = (r)->iput = 0; \
46+
}
47+
48+
static inline int ringbuf_get(ringbuf_t *r) {
49+
if (r->iget == r->iput) {
50+
return -1;
51+
}
52+
uint8_t v = r->buf[r->iget++];
53+
if (r->iget >= r->size) {
54+
r->iget = 0;
55+
}
56+
return v;
57+
}
58+
59+
static inline int ringbuf_put(ringbuf_t *r, uint8_t v) {
60+
uint32_t iput_new = r->iput + 1;
61+
if (iput_new >= r->size) {
62+
iput_new = 0;
63+
}
64+
if (iput_new == r->iget) {
65+
return -1;
66+
}
67+
r->buf[r->iput] = v;
68+
r->iput = iput_new;
69+
return 0;
70+
}
71+
72+
#endif // __MICROPY_INCLUDED_PY_RINGBUF_H__

0 commit comments

Comments
 (0)