From e7e436affac5d40f62f3390e89a6db600d10ae9e Mon Sep 17 00:00:00 2001 From: Hector van der Aa Date: Tue, 2 Jun 2026 17:29:46 +0200 Subject: [PATCH] Updated ring buffer Updated ring buffer to match use case, one write head with negative read index --- STM32/CM7/CMakeLists.txt | 1 + STM32/CM7/Core/Inc/ring_buffer.h | 3 +-- STM32/CM7/Core/Src/ring_buffer.c | 15 ++------------- 3 files changed, 4 insertions(+), 15 deletions(-) diff --git a/STM32/CM7/CMakeLists.txt b/STM32/CM7/CMakeLists.txt index c9241eb..36b9eae 100644 --- a/STM32/CM7/CMakeLists.txt +++ b/STM32/CM7/CMakeLists.txt @@ -59,6 +59,7 @@ target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE # Add sources to executable target_sources(${CMAKE_PROJECT_NAME} PRIVATE # Add user sources here + Core/Src/ring_buffer.c ) # Link directories setup diff --git a/STM32/CM7/Core/Inc/ring_buffer.h b/STM32/CM7/Core/Inc/ring_buffer.h index 70e808e..17590d7 100644 --- a/STM32/CM7/Core/Inc/ring_buffer.h +++ b/STM32/CM7/Core/Inc/ring_buffer.h @@ -6,9 +6,8 @@ typedef struct ring_buffer_t { uint32_t buffer[256]; uint8_t w_head; - uint8_t r_head; } ring_buffer_t; inline void ringBufferPush(ring_buffer_t *rb, uint32_t value); -inline int ringBufferPop(ring_buffer_t *rb, uint32_t *output); +inline uint32_t ringBufferRead(ring_buffer_t *rb, uint8_t idx); diff --git a/STM32/CM7/Core/Src/ring_buffer.c b/STM32/CM7/Core/Src/ring_buffer.c index 22b904c..c55b86c 100644 --- a/STM32/CM7/Core/Src/ring_buffer.c +++ b/STM32/CM7/Core/Src/ring_buffer.c @@ -9,20 +9,9 @@ inline void ringBufferPush(ring_buffer_t *rb, uint32_t value) { rb->buffer[rb->w_head] = value; rb->w_head++; - if (rb->w_head == rb->r_head) { - // if write head catches up to read head, crash program as consumer task - // should keep up with write head - assert(false); - } return; } -inline int ringBufferPop(ring_buffer_t *rb, uint32_t *output) { - if (rb->w_head == rb->r_head) { - // if read head is at write head, buffer is empty so nothing to pop - return 1; - } - *output = rb->buffer[rb->r_head]; - rb->r_head++; - return 0; +inline uint32_t ringBufferRead(ring_buffer_t *rb, uint8_t idx) { + return rb->buffer[rb->w_head - 1 - idx]; }