串口环形缓冲区强化:单独单写及最小临界区修改
This commit is contained in:
@@ -6,12 +6,25 @@
|
||||
* @ingroup RingBuffer
|
||||
*/
|
||||
#include "uart_ring_buffer.h"
|
||||
#include "gd32e23x.h"
|
||||
|
||||
static volatile uint8_t uart_rx_buffer[UART_RX_BUFFER_SIZE];
|
||||
static volatile uint8_t write_index = 0;
|
||||
static volatile uint8_t read_index = 0;
|
||||
static volatile uint32_t dropped_bytes = 0;
|
||||
|
||||
static inline uint32_t irq_save(void) {
|
||||
uint32_t primask = __get_PRIMASK();
|
||||
__disable_irq();
|
||||
return primask;
|
||||
}
|
||||
|
||||
static inline void irq_restore(uint32_t primask) {
|
||||
if (primask == 0U) {
|
||||
__enable_irq();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 重置环形缓冲区状态。
|
||||
* @details 将读指针、写指针与丢弃计数清零,不清空数据区内容。
|
||||
@@ -31,7 +44,9 @@ static void uart_ring_buffer_reset_state(void) {
|
||||
* @ingroup RingBuffer
|
||||
*/
|
||||
void uart_ring_buffer_init(void) {
|
||||
uint32_t irq_key = irq_save();
|
||||
uart_ring_buffer_reset_state();
|
||||
irq_restore(irq_key);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -90,7 +105,9 @@ bool uart_ring_buffer_put(uint8_t data) {
|
||||
* @ingroup RingBuffer
|
||||
*/
|
||||
void uart_ring_buffer_clear(void) {
|
||||
uint32_t irq_key = irq_save();
|
||||
uart_ring_buffer_reset_state();
|
||||
irq_restore(irq_key);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user