finish uart ring buffer

This commit is contained in:
yelvlab 2025-08-12 00:07:49 +08:00
parent 1c3c688cc2
commit ddb2dfbd2a
2 changed files with 198 additions and 23 deletions

View File

@ -1,14 +1,119 @@
/**
* @file uart_ring_buffer.h
* @brief
* @details / API
*
*/
#ifndef UART_RING_BUFFER_H #ifndef UART_RING_BUFFER_H
#define UART_RING_BUFFER_H #define UART_RING_BUFFER_H
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#define UART_RX_BUFFER_SIZE 128 /**
* @def UART_RX_BUFFER_SIZE
* @brief
* @note / UART_RX_BUFFER_SIZE-1
*/
#define UART_RX_BUFFER_SIZE 64
/**
* @defgroup RingBuffer
* @brief
* @{
*/
/**
* @section RingBuffer_Usage 使
*
*
* 1)
* @code{.c}
* uart_ring_buffer_init();
* @endcode
*
* 2) 使RBNE USART0
* @code{.c}
* usart_interrupt_enable(USART0, USART_INT_RBNE);
* nvic_irq_enable(USART0_IRQn, 2, 0); // 根据工程需要设置优先级
* @endcode
*
* 3)
* @code{.c}
* void USART0_IRQHandler(void) {
* if (RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) {
* uint8_t data = usart_data_receive(USART0);
* (void)uart_ring_buffer_put(data); // 缓冲满时丢弃并计数
* }
* }
* @endcode
*
* 4)
* @code{.c}
* while (uart_ring_buffer_available() > 0) {
* int b = uart_ring_buffer_get();
* if (b >= 0) {
* // 处理字节 b
* }
* }
* @endcode
*
* @note uart_ring_buffer_drop_count()
* @note / UART_RX_BUFFER_SIZE-1
*/
/**
* @brief
* @details /
* @note 使
* @ingroup RingBuffer
*/
void uart_ring_buffer_init(void); void uart_ring_buffer_init(void);
uint16_t uart_rx_available(void);
int uart_rx_get(void); /**
void uart_rx_put(uint8_t data); * @brief
void uart_rx_clear(void); * @details [0, UART_RX_BUFFER_SIZE-1]
* @return uint8_t
* @note / UART_RX_BUFFER_SIZE-1
* @ingroup RingBuffer
*/
uint8_t uart_ring_buffer_available(void);
/**
* @brief
* @details -1
* @return 0..255 -1
* @retval -1
* @ingroup RingBuffer
*/
int uart_ring_buffer_get(void);
/**
* @brief
* @param data
* @return
* @retval true
* @retval false
* @note
* @ingroup RingBuffer
*/
bool uart_ring_buffer_put(uint8_t data);
/**
* @brief
* @details /
* @ingroup RingBuffer
*/
void uart_ring_buffer_clear(void);
/**
* @brief
* @details init/clear
* @return
* @ingroup RingBuffer
*/
uint32_t uart_ring_buffer_drop_count(void);
/** @} */
#endif // UART_RING_BUFFER_H #endif // UART_RING_BUFFER_H

View File

@ -1,34 +1,104 @@
/**
* @file uart_ring_buffer.c
* @brief
* @details
* / UART_RX_BUFFER_SIZE-1
* @ingroup RingBuffer
*/
#include "uart_ring_buffer.h" #include "uart_ring_buffer.h"
static volatile uint8_t uart_rx_buffer[UART_RX_BUFFER_SIZE]; static volatile uint8_t uart_rx_buffer[UART_RX_BUFFER_SIZE];
static volatile uint16_t uart_rx_write = 0; static volatile uint8_t write_index = 0;
static volatile uint16_t uart_rx_read = 0; static volatile uint8_t read_index = 0;
static volatile uint32_t dropped_bytes = 0;
/**
* @brief
* @details
* @note 使 uart_ring_buffer_init()/uart_ring_buffer_clear()
* @ingroup RingBuffer
*/
static void uart_ring_buffer_reset_state(void) {
write_index = 0;
read_index = 0;
dropped_bytes = 0;
}
/**
* @brief
* @details
* @note 使
* @ingroup RingBuffer
*/
void uart_ring_buffer_init(void) { void uart_ring_buffer_init(void) {
uart_rx_write = 0; uart_ring_buffer_reset_state();
uart_rx_read = 0;
} }
uint16_t uart_rx_available(void) { /**
return (uart_rx_write + UART_RX_BUFFER_SIZE - uart_rx_read) % UART_RX_BUFFER_SIZE; * @brief
* @details / [0, UART_RX_BUFFER_SIZE-1]
* @return uint8_t
* @note / UART_RX_BUFFER_SIZE-1
* @ingroup RingBuffer
*/
uint8_t uart_ring_buffer_available(void) {
/* 使用快照减少并发不一致窗口 */
uint8_t w = write_index;
uint8_t r = read_index;
return (uint8_t)((w + UART_RX_BUFFER_SIZE - r) % UART_RX_BUFFER_SIZE);
} }
int uart_rx_get(void) { /**
if (uart_rx_read == uart_rx_write) return -1; // 空 * @brief
uint8_t data = uart_rx_buffer[uart_rx_read]; * @details -1
uart_rx_read = (uart_rx_read + 1) % UART_RX_BUFFER_SIZE; * @return int 0..255 -1
* @ingroup RingBuffer
*/
int uart_ring_buffer_get(void) {
if (read_index == write_index) return -1; // 空
uint8_t data = uart_rx_buffer[read_index];
read_index = (read_index + 1) % UART_RX_BUFFER_SIZE;
return data; return data;
} }
void uart_rx_put(uint8_t data) { /**
uint16_t next = (uart_rx_write + 1) % UART_RX_BUFFER_SIZE; * @brief
if (next != uart_rx_read) { // 缓冲区未满 * @details
uart_rx_buffer[uart_rx_write] = data; * @param data
uart_rx_write = next; * @return bool
* @retval true
* @retval false
* @note
* @ingroup RingBuffer
*/
bool uart_ring_buffer_put(uint8_t data) {
uint8_t next = (write_index + 1) % UART_RX_BUFFER_SIZE;
if (next != read_index) { // 缓冲区未满
uart_rx_buffer[write_index] = data;
write_index = next;
return true;
} else {
/* 缓冲区已满,丢弃新字节并计数 */
dropped_bytes++;
return false;
} }
} }
void uart_rx_clear(void) { /**
uart_rx_write = 0; * @brief
uart_rx_read = 0; * @details
* @ingroup RingBuffer
*/
void uart_ring_buffer_clear(void) {
uart_ring_buffer_reset_state();
}
/**
* @brief
* @details init/clear
* @return uint32_t
* @ingroup RingBuffer
*/
uint32_t uart_ring_buffer_drop_count(void) {
return dropped_bytes;
} }