[components][serial_v2] 写满丢弃策略对dma_ping_buf的处理有误、细节调整

This commit is contained in:
ryancw 2025-05-22 16:53:36 +08:00 committed by Rbb666
parent d64ce335fc
commit 5c23485006
2 changed files with 8 additions and 46 deletions

View File

@ -411,7 +411,6 @@ static void dma_recv_isr(struct rt_serial_device *serial, rt_uint8_t isr_flag)
RT_ASSERT(serial != RT_NULL);
uart = rt_container_of(serial, struct stm32_uart, serial);
recv_len = 0;
counter = __HAL_DMA_GET_COUNTER(&(uart->dma_rx.handle));
if (counter <= uart->dma_rx.remaining_cnt)

View File

@ -320,36 +320,6 @@ static void rt_serial_update_read_index(struct rt_ringbuffer *rb,
static void rt_serial_update_write_index(struct rt_ringbuffer *rb,
rt_uint16_t length)
{
#ifdef RT_SERIAL_BUF_STRATEGY_DROP
rt_uint16_t space_length;
RT_ASSERT(rb != RT_NULL);
/* whether has enough space */
space_length = rt_ringbuffer_space_len(rb);
/* no space */
if (space_length == 0)
return;
/* drop some data */
if (space_length < length)
length = space_length;
if (rb->buffer_size - rb->write_index > length)
{
/* this should not cause overflow because there is enough space for
* length of data in current mirror */
rb->write_index += length;
return;
}
/* we are going into the other side of the mirror */
rb->write_mirror = ~rb->write_mirror;
rb->write_index = length - (rb->buffer_size - rb->write_index);
return;
#else
rt_uint16_t space_length;
RT_ASSERT(rb != RT_NULL);
@ -387,7 +357,6 @@ static void rt_serial_update_write_index(struct rt_ringbuffer *rb,
rb->read_index = rb->write_index;
}
return;
#endif /* RT_SERIAL_BUF_STRATEGY_DROP */
}
#endif /* RT_SERIAL_USING_DMA */
@ -512,11 +481,11 @@ static rt_ssize_t _serial_fifo_rx(struct rt_device *dev,
if (dev->open_flag & RT_SERIAL_RX_BLOCKING)
{
rt_size_t data_len = 0;
rt_size_t data_len;
rt_tick_t now_tick;
rt_size_t rx_bufsz_third = serial->config.rx_bufsz / 2;
rt_int32_t base_rx_timeout = rt_atomic_load(&rx_fifo->rx_timeout);
rt_int32_t rx_timeout = base_rx_timeout;
rt_tick_t now_tick = 0;
rt_tick_t begin_tick = rt_tick_get();
while (1)
@ -548,7 +517,6 @@ static rt_ssize_t _serial_fifo_rx(struct rt_device *dev,
break;
}
rt_completion_wait(&rx_fifo->rx_cpt, rx_timeout);
if (rx_timeout != RT_WAITING_FOREVER)
{
@ -668,7 +636,6 @@ static rt_ssize_t _serial_fifo_tx_blocking_buf(struct rt_device *dev,
struct rt_serial_device *serial;
struct rt_serial_tx_fifo *tx_fifo;
rt_base_t level;
rt_size_t send_size = 0;
if (size == 0) return 0;
RT_ASSERT(dev != RT_NULL && buffer != RT_NULL);
@ -690,10 +657,11 @@ static rt_ssize_t _serial_fifo_tx_blocking_buf(struct rt_device *dev,
return 0;
}
rt_tick_t now_tick;
rt_int32_t base_tx_timeout = rt_atomic_load(&tx_fifo->tx_timeout);
rt_int32_t tx_timeout = base_tx_timeout;
rt_tick_t now_tick = 0;
rt_tick_t begin_tick = rt_tick_get();
rt_size_t send_size = 0;
while (send_size != size)
{
@ -1967,8 +1935,8 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event)
case RT_SERIAL_EVENT_RX_IND:
case RT_SERIAL_EVENT_RX_DMADONE: {
struct rt_serial_rx_fifo *rx_fifo;
rt_size_t rx_length = 0;
rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
rt_size_t rx_length;
rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
#ifdef RT_SERIAL_USING_DMA
@ -1985,16 +1953,15 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event)
rt_size_t space_len;
/* UART_IT_IDLE and dma isr */
level = rt_spin_lock_irqsave(&serial->spinlock);
rt_serial_update_write_index(&rx_fifo->dma_ping_rb, rx_length);
do
{
space_len = rt_ringbuffer_space_len(&rx_fifo->rb);
if (space_len == 0)
break;
rt_serial_update_write_index(&rx_fifo->dma_ping_rb, rx_length);
size = rt_ringbuffer_peek(&rx_fifo->dma_ping_rb, &ptr);
if (size == 0)
break;
space_len -= rt_ringbuffer_put(&rx_fifo->rb, ptr, size);
if (space_len == 0)
@ -2006,8 +1973,6 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event)
rt_ringbuffer_put(&rx_fifo->rb, ptr, size);
} while (0);
if (space_len == 0)
rt_serial_update_read_index(&rx_fifo->dma_ping_rb, rt_ringbuffer_get_size(&rx_fifo->dma_ping_rb));
rt_spin_unlock_irqrestore(&serial->spinlock, level);
#else
rt_uint8_t *ptr;
@ -2018,8 +1983,6 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event)
do
{
size = rt_ringbuffer_peek(&rx_fifo->dma_ping_rb, &ptr);
if (size == 0)
break;
rt_ringbuffer_put_force(&rx_fifo->rb, ptr, size);