Skip to content

Commit fbc8719

Browse files
committed
ringbuf tested
1 parent 77cd93a commit fbc8719

File tree

11 files changed

+59
-65
lines changed

11 files changed

+59
-65
lines changed

ports/mimxrt10xx/common-hal/busio/UART.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -198,17 +198,18 @@ void common_hal_busio_uart_construct(busio_uart_obj_t *self,
198198
claim_pin(self->tx_pin->pin);
199199

200200
if (self->rx_pin != NULL) {
201-
ringbuf_alloc(&self->rbuf, receiver_buffer_size, true);
201+
// The LPUART ring buffer wastes one byte to distinguish between full and empty.
202+
self->ringbuf = gc_alloc(receiver_buffer_size + 1, false, true /*long-lived*/);
202203

203-
if (!self->rbuf.buf) {
204+
if (!self->ringbuf) {
204205
LPUART_Deinit(self->uart);
205206
mp_raise_msg(&mp_type_MemoryError, translate("Failed to allocate RX buffer"));
206207
}
207208

208209
LPUART_TransferCreateHandle(self->uart, &self->handle, LPUART_UserCallback, self);
209210
// Pass actual allocated size; the LPUART routines are cognizant that
210211
// the capacity is one less than the size.
211-
LPUART_TransferStartRingBuffer(self->uart, &self->handle, self->rbuf.buf, self->rbuf.size);
212+
LPUART_TransferStartRingBuffer(self->uart, &self->handle, self->ringbuf, receiver_buffer_size + 1);
212213

213214
claim_pin(self->rx_pin->pin);
214215
}
@@ -225,9 +226,7 @@ void common_hal_busio_uart_deinit(busio_uart_obj_t *self) {
225226

226227
LPUART_Deinit(self->uart);
227228

228-
gc_free(self->rbuf.buf);
229-
self->rbuf.size = 0;
230-
self->rbuf.iput = self->rbuf.iget = 0;
229+
gc_free(self->ringbuf);
231230

232231
// reset_pin_number(self->rx_pin);
233232
// reset_pin_number(self->tx_pin);

ports/mimxrt10xx/common-hal/busio/UART.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ typedef struct {
4040
mp_obj_base_t base;
4141
LPUART_Type *uart;
4242
lpuart_handle_t handle;
43-
ringbuf_t rbuf;
43+
uint8_t* ringbuf;
4444
bool rx_ongoing;
4545
uint32_t baudrate;
4646
uint8_t character_bits;

ports/nrf/common-hal/_bleio/CharacteristicBuffer.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ uint32_t common_hal_bleio_characteristic_buffer_read(bleio_characteristic_buffer
102102
uint64_t start_ticks = supervisor_ticks_ms64();
103103

104104
// Wait for all bytes received or timeout
105-
while ( (ringbuf_avail(&self->ringbuf) < len) && (supervisor_ticks_ms64() - start_ticks < self->timeout_ms) ) {
105+
while ( (ringbuf_num_filled(&self->ringbuf) < len) && (supervisor_ticks_ms64() - start_ticks < self->timeout_ms) ) {
106106
RUN_BACKGROUND_TASKS;
107107
// Allow user to break out of a timeout with a KeyboardInterrupt.
108108
if ( mp_hal_is_interrupted() ) {
@@ -125,7 +125,7 @@ uint32_t common_hal_bleio_characteristic_buffer_read(bleio_characteristic_buffer
125125
uint32_t common_hal_bleio_characteristic_buffer_rx_characters_available(bleio_characteristic_buffer_obj_t *self) {
126126
uint8_t is_nested_critical_region;
127127
sd_nvic_critical_region_enter(&is_nested_critical_region);
128-
uint16_t count = ringbuf_avail(&self->ringbuf);
128+
uint16_t count = ringbuf_num_filled(&self->ringbuf);
129129
sd_nvic_critical_region_exit(is_nested_critical_region);
130130
return count;
131131
}

ports/nrf/common-hal/_bleio/PacketBuffer.c

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ STATIC void write_to_ringbuf(bleio_packet_buffer_obj_t *self, uint8_t *data, uin
5151
uint8_t is_nested_critical_region;
5252
sd_nvic_critical_region_enter(&is_nested_critical_region);
5353
// Make room for the new value by dropping the oldest packets first.
54-
while (ringbuf_capacity(&self->ringbuf) - ringbuf_avail(&self->ringbuf) < len + sizeof(uint16_t)) {
54+
while (ringbuf_capacity(&self->ringbuf) - ringbuf_num_filled(&self->ringbuf) < len + sizeof(uint16_t)) {
5555
uint16_t packet_length;
5656
ringbuf_get_n(&self->ringbuf, (uint8_t*) &packet_length, sizeof(uint16_t));
5757
for (uint16_t i = 0; i < packet_length; i++) {
@@ -202,10 +202,7 @@ void common_hal_bleio_packet_buffer_construct(
202202
}
203203

204204
if (incoming) {
205-
// This is a macro.
206-
ringbuf_alloc(&self->ringbuf, buffer_size * (sizeof(uint16_t) + characteristic->max_length), false);
207-
208-
if (self->ringbuf.buf == NULL) {
205+
if (!ringbuf_alloc(&self->ringbuf, buffer_size * (sizeof(uint16_t) + characteristic->max_length), false)) {
209206
mp_raise_ValueError(translate("Buffer too large and unable to allocate"));
210207
}
211208
}
@@ -250,7 +247,7 @@ void common_hal_bleio_packet_buffer_construct(
250247
}
251248

252249
int common_hal_bleio_packet_buffer_readinto(bleio_packet_buffer_obj_t *self, uint8_t *data, size_t len) {
253-
if (ringbuf_avail(&self->ringbuf) < 2) {
250+
if (ringbuf_num_filled(&self->ringbuf) < 2) {
254251
return 0;
255252
}
256253

@@ -315,25 +312,25 @@ void common_hal_bleio_packet_buffer_write(bleio_packet_buffer_obj_t *self, uint8
315312
}
316313

317314
uint16_t common_hal_bleio_packet_buffer_get_packet_size(bleio_packet_buffer_obj_t *self) {
318-
uint16_t mtu;
319-
if (self->conn_handle == BLE_CONN_HANDLE_INVALID) {
320-
return 0;
321-
}
322-
bleio_connection_internal_t *connection;
323-
for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
324-
connection = &bleio_connections[i];
325-
if (connection->conn_handle == self->conn_handle) {
326-
break;
315+
// First, assume default MTU size.
316+
uint16_t mtu = BLE_GATT_ATT_MTU_DEFAULT;
317+
318+
// If there's a connection, get its actual MTU.
319+
if (self->conn_handle != BLE_CONN_HANDLE_INVALID) {
320+
bleio_connection_internal_t *connection;
321+
for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
322+
connection = &bleio_connections[i];
323+
if (connection->conn_handle == self->conn_handle) {
324+
if (connection->mtu != 0) {
325+
mtu = connection->mtu;
326+
}
327+
break;
328+
}
327329
}
328330
}
329-
if (connection->mtu == 0) {
330-
mtu = BLE_GATT_ATT_MTU_DEFAULT;
331-
}
332-
if (self->characteristic->max_length > mtu) {
333-
mtu = self->characteristic->max_length;
334-
}
335-
uint16_t att_overhead = 3;
336-
return mtu - att_overhead;
331+
332+
// 3 is bytes of ATT overhead.
333+
return MIN(mtu - 3, self->characteristic->max_length);
337334
}
338335

339336
bool common_hal_bleio_packet_buffer_deinited(bleio_packet_buffer_obj_t *self) {

ports/nrf/common-hal/busio/UART.c

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ static void uart_callback_irq (const nrfx_uarte_event_t * event, void * context)
9999

100100
switch ( event->type ) {
101101
case NRFX_UARTE_EVT_RX_DONE:
102-
ringbuf_put_n(&self->rbuf, event->data.rxtx.p_data, event->data.rxtx.bytes);
102+
ringbuf_put_n(&self->ringbuf, event->data.rxtx.p_data, event->data.rxtx.bytes);
103103

104104
// keep receiving
105105
(void) nrfx_uarte_rx(self->uarte, &self->rx_char, 1);
@@ -113,7 +113,7 @@ static void uart_callback_irq (const nrfx_uarte_event_t * event, void * context)
113113
// Possible Error source is Overrun, Parity, Framing, Break
114114
// uint32_t errsrc = event->data.error.error_mask;
115115

116-
ringbuf_put_n(&self->rbuf, event->data.error.rxtx.p_data, event->data.error.rxtx.bytes);
116+
ringbuf_put_n(&self->ringbuf, event->data.error.rxtx.p_data, event->data.error.rxtx.bytes);
117117

118118
// Keep receiving
119119
(void) nrfx_uarte_rx(self->uarte, &self->rx_char, 1);
@@ -191,9 +191,7 @@ void common_hal_busio_uart_construct(busio_uart_obj_t *self,
191191
// pointers like this are NOT moved, allocating the buffer
192192
// in the long-lived pool is not strictly necessary)
193193
// (This is a macro.)
194-
ringbuf_alloc(&self->rbuf, receiver_buffer_size, true);
195-
196-
if ( !self->rbuf.buf ) {
194+
if (!ringbuf_alloc(&self->ringbuf, receiver_buffer_size, true)) {
197195
nrfx_uarte_uninit(self->uarte);
198196
mp_raise_msg(&mp_type_MemoryError, translate("Failed to allocate RX buffer"));
199197
}
@@ -227,10 +225,7 @@ void common_hal_busio_uart_deinit(busio_uart_obj_t *self) {
227225
reset_pin_number(self->rx_pin_number);
228226
self->tx_pin_number = NO_PIN;
229227
self->rx_pin_number = NO_PIN;
230-
231-
gc_free(self->rbuf.buf);
232-
self->rbuf.size = 0;
233-
self->rbuf.iput = self->rbuf.iget = 0;
228+
ringbuf_free(&self->ringbuf);
234229
}
235230
}
236231

@@ -243,7 +238,7 @@ size_t common_hal_busio_uart_read(busio_uart_obj_t *self, uint8_t *data, size_t
243238
uint64_t start_ticks = supervisor_ticks_ms64();
244239

245240
// Wait for all bytes received or timeout
246-
while ( (ringbuf_avail(&self->rbuf) < len) && (supervisor_ticks_ms64() - start_ticks < self->timeout_ms) ) {
241+
while ( (ringbuf_num_filled(&self->ringbuf) < len) && (supervisor_ticks_ms64() - start_ticks < self->timeout_ms) ) {
247242
RUN_BACKGROUND_TASKS;
248243
// Allow user to break out of a timeout with a KeyboardInterrupt.
249244
if ( mp_hal_is_interrupted() ) {
@@ -255,7 +250,7 @@ size_t common_hal_busio_uart_read(busio_uart_obj_t *self, uint8_t *data, size_t
255250
NVIC_DisableIRQ(nrfx_get_irq_number(self->uarte->p_reg));
256251

257252
// Copy as much received data as available, up to len bytes.
258-
size_t rx_bytes = ringbuf_get_n(&self->rbuf, data, len);
253+
size_t rx_bytes = ringbuf_get_n(&self->ringbuf, data, len);
259254

260255
NVIC_EnableIRQ(nrfx_get_irq_number(self->uarte->p_reg));
261256

@@ -312,13 +307,13 @@ void common_hal_busio_uart_set_timeout(busio_uart_obj_t *self, mp_float_t timeou
312307
}
313308

314309
uint32_t common_hal_busio_uart_rx_characters_available(busio_uart_obj_t *self) {
315-
return ringbuf_avail(&self->rbuf);
310+
return ringbuf_num_filled(&self->ringbuf);
316311
}
317312

318313
void common_hal_busio_uart_clear_rx_buffer(busio_uart_obj_t *self) {
319314
// prevent conflict with uart irq
320315
NVIC_DisableIRQ(nrfx_get_irq_number(self->uarte->p_reg));
321-
ringbuf_clear(&self->rbuf);
316+
ringbuf_clear(&self->ringbuf);
322317
NVIC_EnableIRQ(nrfx_get_irq_number(self->uarte->p_reg));
323318
}
324319

ports/nrf/common-hal/busio/UART.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ typedef struct {
4141
uint32_t baudrate;
4242
uint32_t timeout_ms;
4343

44-
ringbuf_t rbuf;
44+
ringbuf_t ringbuf;
4545
uint8_t rx_char; // EasyDMA buf
4646

4747
uint8_t tx_pin_number;

ports/stm/common-hal/busio/UART.c

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -211,8 +211,7 @@ void common_hal_busio_uart_construct(busio_uart_obj_t *self,
211211

212212
// Init buffer for rx and claim pins
213213
if (self->rx != NULL) {
214-
ringbuf_alloc(&self->rbuf, receiver_buffer_size, true);
215-
if (!self->rbuf.buf) {
214+
if (!ringbuf_alloc(&self->ringbuf, receiver_buffer_size, true)) {
216215
mp_raise_ValueError(translate("UART Buffer allocation error"));
217216
}
218217
claim_pin(rx);
@@ -248,21 +247,18 @@ void common_hal_busio_uart_deinit(busio_uart_obj_t *self) {
248247
reset_pin_number(self->rx->pin->port,self->rx->pin->number);
249248
self->tx = NULL;
250249
self->rx = NULL;
251-
gc_free(self->rbuf.buf);
252-
self->rbuf.size = 0;
253-
self->rbuf.iput = self->rbuf.iget = 0;
250+
ringbuf_free(&self->ringbuf);
254251
}
255252

256253
size_t common_hal_busio_uart_read(busio_uart_obj_t *self, uint8_t *data, size_t len, int *errcode) {
257254
if (self->rx == NULL) {
258255
mp_raise_ValueError(translate("No RX pin"));
259256
}
260257

261-
size_t rx_bytes = 0;
262258
uint64_t start_ticks = supervisor_ticks_ms64();
263259

264260
// Wait for all bytes received or timeout, same as nrf
265-
while ( (ringbuf_avail(&self->rbuf) < len) && (supervisor_ticks_ms64() - start_ticks < self->timeout_ms) ) {
261+
while ( (ringbuf_num_filled(&self->ringbuf) < len) && (supervisor_ticks_ms64() - start_ticks < self->timeout_ms) ) {
266262
RUN_BACKGROUND_TASKS;
267263
//restart if it failed in the callback
268264
if (errflag != HAL_OK) {
@@ -277,7 +273,7 @@ size_t common_hal_busio_uart_read(busio_uart_obj_t *self, uint8_t *data, size_t
277273
// Halt reception
278274
HAL_NVIC_DisableIRQ(self->irq);
279275
// Copy as much received data as available, up to len bytes.
280-
size_t rx_bytes = ringbuf_get_n(&self->rbuf, data, len);
276+
size_t rx_bytes = ringbuf_get_n(&self->ringbuf, data, len);
281277
HAL_NVIC_EnableIRQ(self->irq);
282278

283279
if (rx_bytes == 0) {
@@ -317,7 +313,7 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *handle)
317313
if ((HAL_UART_GetState(handle) & HAL_UART_STATE_BUSY_RX) == HAL_UART_STATE_BUSY_RX) {
318314
return;
319315
}
320-
ringbuf_put_n(&context->rbuf, &context->rx_char, 1);
316+
ringbuf_put_n(&context->ringbuf, &context->rx_char, 1);
321317
errflag = HAL_UART_Receive_IT(handle, &context->rx_char, 1);
322318

323319
return;
@@ -376,13 +372,13 @@ void common_hal_busio_uart_set_timeout(busio_uart_obj_t *self, mp_float_t timeou
376372
}
377373

378374
uint32_t common_hal_busio_uart_rx_characters_available(busio_uart_obj_t *self) {
379-
return ringbuf_avail(&self->rbuf);
375+
return ringbuf_num_filled(&self->ringbuf);
380376
}
381377

382378
void common_hal_busio_uart_clear_rx_buffer(busio_uart_obj_t *self) {
383379
// Halt reception
384380
HAL_NVIC_DisableIRQ(self->irq);
385-
ringbuf_clear(&self->rbuf);
381+
ringbuf_clear(&self->ringbuf);
386382
HAL_NVIC_EnableIRQ(self->irq);
387383
}
388384

ports/stm/common-hal/busio/UART.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ typedef struct {
4747
const mcu_periph_obj_t *tx;
4848
const mcu_periph_obj_t *rx;
4949

50-
ringbuf_t rbuf;
50+
ringbuf_t ringbuf;
5151
uint8_t rx_char;
5252

5353
uint32_t baudrate;

py/ringbuf.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ bool ringbuf_alloc(ringbuf_t *r, size_t capacity, bool long_lived) {
3737
return r->buf != NULL;
3838
}
3939

40+
void ringbuf_free(ringbuf_t *r) {
41+
gc_free(r->buf);
42+
r->size = 0;
43+
ringbuf_clear(r);
44+
}
45+
4046
size_t ringbuf_capacity(ringbuf_t *r) {
4147
return r->size - 1;
4248
}
@@ -72,12 +78,12 @@ void ringbuf_clear(ringbuf_t *r) {
7278
}
7379

7480
// Number of free slots that can be written.
75-
size_t ringbuf_free(ringbuf_t *r) {
81+
size_t ringbuf_num_empty(ringbuf_t *r) {
7682
return (r->size + r->iget - r->iput - 1) % r->size;
7783
}
7884

7985
// Number of bytes available to read.
80-
size_t ringbuf_avail(ringbuf_t *r) {
86+
size_t ringbuf_num_filled(ringbuf_t *r) {
8187
return (r->size + r->iput - r->iget) % r->size;
8288
}
8389

py/ringbuf.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,13 @@ typedef struct _ringbuf_t {
4545
// ringbuf_t buf = {buf_array, sizeof(buf_array)};
4646

4747
bool ringbuf_alloc(ringbuf_t *r, size_t capacity, bool long_lived);
48+
void ringbuf_free(ringbuf_t *r);
4849
size_t ringbuf_capacity(ringbuf_t *r);
4950
int ringbuf_get(ringbuf_t *r);
5051
int ringbuf_put(ringbuf_t *r, uint8_t v);
5152
void ringbuf_clear(ringbuf_t *r);
52-
size_t ringbuf_free(ringbuf_t *r);
53-
size_t ringbuf_avail(ringbuf_t *r);
53+
size_t ringbuf_num_empty(ringbuf_t *r);
54+
size_t ringbuf_num_filled(ringbuf_t *r);
5455
size_t ringbuf_put_n(ringbuf_t* r, uint8_t* buf, size_t bufsize);
5556
size_t ringbuf_get_n(ringbuf_t* r, uint8_t* buf, size_t bufsize);
5657

0 commit comments

Comments
 (0)