Browse Source

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

ryancw 1 month ago
parent
commit
5c23485006

+ 0 - 1
bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart_v2.c

@@ -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)

+ 8 - 45
components/drivers/serial/dev_serial_v2.c

@@ -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);