Skip to content

Commit bf558ac

Browse files
committed
[componnents][drivers][serial_v2] 增加获取config接口,使用rt_tick_get_delta替代内部的时间绕回判断,写满丢弃策略rx接收数据错乱修复,clang-tidy和cppcheck审查优化
1 parent 3826031 commit bf558ac

File tree

2 files changed

+60
-63
lines changed

2 files changed

+60
-63
lines changed

components/drivers/include/drivers/dev_serial_v2.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@
210210
#define RT_SERIAL_CTRL_RX_FLUSH 0x45 /* clear rx buffer. Discard all data */
211211
#define RT_SERIAL_CTRL_TX_FLUSH 0x46 /* clear tx buffer. Blocking and wait for the send buffer data to be sent. not supported in poll mode */
212212
#define RT_SERIAL_CTRL_GET_UNREAD_BYTES_COUNT 0x47 /* get unread bytes count. not supported in poll mode */
213+
#define RT_SERIAL_CTRL_GET_CONFIG 0x48 /* get serial config */
213214

214215
#define RT_SERIAL_ERR_OVERRUN 0x01
215216
#define RT_SERIAL_ERR_FRAMING 0x02

components/drivers/serial/dev_serial_v2.c

Lines changed: 59 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ static int serial_fops_ioctl(struct dfs_file *fd, int cmd, void *args)
125125
fd->flags &= ~mask;
126126
fd->flags |= flags;
127127
break;
128+
default:
129+
break;
128130
}
129131

130132
return rt_device_control(device, cmd, args);
@@ -204,13 +206,10 @@ static ssize_t serial_fops_write(struct dfs_file *fd, const void *buf, size_t co
204206

205207
static int serial_fops_flush(struct dfs_file *fd)
206208
{
207-
rt_device_t device;
208-
struct rt_serial_device *serial;
209-
209+
rt_device_t device;
210210
device = (rt_device_t)fd->vnode->data;
211211
RT_ASSERT(device != RT_NULL);
212212

213-
serial = (struct rt_serial_device *)device;
214213
rt_device_control(device, RT_SERIAL_CTRL_TX_FLUSH, (void *)RT_NULL);
215214
rt_device_control(device, RT_SERIAL_CTRL_RX_FLUSH, (void *)RT_NULL);
216215

@@ -379,8 +378,8 @@ rt_ssize_t _serial_poll_rx(struct rt_device *dev,
379378
int getc_element; /* Gets one byte of data received */
380379
rt_uint8_t *getc_buffer; /* Pointer to the receive data buffer */
381380

382-
if (size == 0) return 0;
383381
RT_ASSERT(dev != RT_NULL && buffer != RT_NULL);
382+
if (size == 0) return 0;
384383

385384
serial = (struct rt_serial_device *)dev;
386385
getc_buffer = (rt_uint8_t *)buffer;
@@ -482,15 +481,16 @@ static rt_ssize_t _serial_fifo_rx(struct rt_device *dev,
482481
if (dev->open_flag & RT_SERIAL_RX_BLOCKING)
483482
{
484483
rt_size_t data_len;
485-
rt_tick_t now_tick;
484+
rt_tick_t delta_tick;
486485
rt_size_t rx_bufsz_third = serial->config.rx_bufsz / 2;
487486
rt_int32_t base_rx_timeout = rt_atomic_load(&rx_fifo->rx_timeout);
488-
rt_int32_t rx_timeout = base_rx_timeout;
487+
rt_int32_t rx_timeout_left = base_rx_timeout;
489488
rt_tick_t begin_tick = rt_tick_get();
490489

490+
491491
while (1)
492492
{
493-
if (rx_timeout != RT_WAITING_NO)
493+
if (rx_timeout_left != RT_WAITING_NO)
494494
{
495495
level = rt_spin_lock_irqsave(&serial->spinlock);
496496
data_len = rt_ringbuffer_data_len(&rx_fifo->rb);
@@ -512,26 +512,21 @@ static rt_ssize_t _serial_fifo_rx(struct rt_device *dev,
512512
level = RT_SERIAL_FIFO_LOCK(&serial->spinlock);
513513
recv_size += rt_ringbuffer_get(&rx_fifo->rb, (rt_uint8_t *)buffer + recv_size, size - recv_size);
514514
RT_SERIAL_FIFO_UNLOCK(&serial->spinlock, level);
515-
if (recv_size == size || rx_timeout == RT_WAITING_NO)
515+
if (recv_size == size || rx_timeout_left == RT_WAITING_NO)
516516
{
517517
break;
518518
}
519519

520-
rt_completion_wait(&rx_fifo->rx_cpt, rx_timeout);
521-
if (rx_timeout != RT_WAITING_FOREVER)
520+
rt_completion_wait(&rx_fifo->rx_cpt, rx_timeout_left);
521+
if (rx_timeout_left != RT_WAITING_FOREVER)
522522
{
523-
now_tick = rt_tick_get();
524-
if (now_tick - begin_tick >= base_rx_timeout)
523+
delta_tick = rt_tick_get_delta(begin_tick);
524+
if (delta_tick >= base_rx_timeout)
525525
{
526526
return -RT_ETIMEOUT;
527527
}
528-
else
529-
{
530-
if (now_tick > begin_tick)
531-
rx_timeout = base_rx_timeout - (now_tick - begin_tick);
532-
else
533-
rx_timeout = begin_tick + base_rx_timeout - now_tick + 1;
534-
}
528+
529+
rx_timeout_left = base_rx_timeout - delta_tick;
535530
}
536531
}
537532
}
@@ -595,7 +590,7 @@ static rt_ssize_t _serial_fifo_tx_blocking_nbuf(struct rt_device *dev,
595590
size,
596591
RT_SERIAL_TX_BLOCKING);
597592

598-
if (rt_atomic_load(&tx_fifo->tx_timeout) == RT_WAITING_NO)
593+
if (send_size == 0 || rt_atomic_load(&tx_fifo->tx_timeout) == RT_WAITING_NO)
599594
{
600595
return send_size;
601596
}
@@ -608,10 +603,8 @@ static rt_ssize_t _serial_fifo_tx_blocking_nbuf(struct rt_device *dev,
608603
{
609604
return ret;
610605
}
611-
else
612-
{
613-
return 0;
614-
}
606+
607+
return 0;
615608
}
616609

617610
/* Inactive tx mode flag */
@@ -657,9 +650,9 @@ static rt_ssize_t _serial_fifo_tx_blocking_buf(struct rt_device *dev,
657650
return 0;
658651
}
659652

660-
rt_tick_t now_tick;
653+
rt_tick_t delta_tick;
661654
rt_int32_t base_tx_timeout = rt_atomic_load(&tx_fifo->tx_timeout);
662-
rt_int32_t tx_timeout = base_tx_timeout;
655+
rt_int32_t tx_timeout_left = base_tx_timeout;
663656
rt_tick_t begin_tick = rt_tick_get();
664657
rt_size_t send_size = 0;
665658

@@ -686,27 +679,22 @@ static rt_ssize_t _serial_fifo_tx_blocking_buf(struct rt_device *dev,
686679

687680
send_size += tx_fifo->put_size;
688681

689-
if (tx_timeout == RT_WAITING_NO)
682+
if (tx_timeout_left == RT_WAITING_NO)
690683
{
691684
break;
692685
}
693686

694687
/* Waiting for the transmission to complete */
695-
rt_completion_wait(&tx_fifo->tx_cpt, tx_timeout);
696-
if (tx_timeout != RT_WAITING_FOREVER)
688+
rt_completion_wait(&tx_fifo->tx_cpt, tx_timeout_left);
689+
if (tx_timeout_left != RT_WAITING_FOREVER)
697690
{
698-
now_tick = rt_tick_get();
699-
if (now_tick - begin_tick >= base_tx_timeout)
691+
delta_tick = rt_tick_get_delta(begin_tick);
692+
if (delta_tick >= base_tx_timeout)
700693
{
701694
return -RT_ETIMEOUT;
702695
}
703-
else
704-
{
705-
if (now_tick > begin_tick)
706-
tx_timeout = base_tx_timeout - (now_tick - begin_tick);
707-
else
708-
tx_timeout = begin_tick + base_tx_timeout - now_tick + 1;
709-
}
696+
697+
tx_timeout_left = base_tx_timeout - delta_tick;
710698
}
711699
}
712700

@@ -732,9 +720,9 @@ static rt_ssize_t _serial_fifo_tx_nonblocking(struct rt_device *dev,
732720
{
733721
struct rt_serial_device *serial;
734722
struct rt_serial_tx_fifo *tx_fifo;
735-
rt_uint8_t *put_ptr;
723+
rt_uint8_t *put_ptr = RT_NULL;
736724
rt_base_t level;
737-
rt_size_t send_size = 0;
725+
rt_size_t send_size;
738726

739727
if (size == 0) return 0;
740728
RT_ASSERT(dev != RT_NULL && buffer != RT_NULL);
@@ -1252,15 +1240,14 @@ static rt_err_t _serial_get_unread_bytes_count(struct rt_serial_device *serial,
12521240
*unread_bytes = -1;
12531241
return -RT_EPERM;
12541242
}
1255-
else
1256-
{
1257-
rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
1258-
RT_ASSERT(rx_fifo != RT_NULL);
12591243

1260-
level = RT_SERIAL_FIFO_LOCK(&serial->spinlock);
1261-
*unread_bytes = rt_ringbuffer_data_len(&rx_fifo->rb);
1262-
RT_SERIAL_FIFO_UNLOCK(&serial->spinlock, level);
1263-
}
1244+
rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
1245+
RT_ASSERT(rx_fifo != RT_NULL);
1246+
1247+
level = RT_SERIAL_FIFO_LOCK(&serial->spinlock);
1248+
*unread_bytes = rt_ringbuffer_data_len(&rx_fifo->rb);
1249+
RT_SERIAL_FIFO_UNLOCK(&serial->spinlock, level);
1250+
12641251
return RT_EOK;
12651252
}
12661253

@@ -1384,6 +1371,17 @@ static rt_err_t rt_serial_control(struct rt_device *dev,
13841371
serial->ops->configure(serial, (struct serial_configure *)args);
13851372
}
13861373
break;
1374+
case RT_SERIAL_CTRL_GET_CONFIG:
1375+
if (args == RT_NULL)
1376+
{
1377+
ret = -RT_EINVAL;
1378+
}
1379+
else
1380+
{
1381+
struct serial_configure *pconfig = (struct serial_configure *)args;
1382+
*pconfig = serial->config;
1383+
}
1384+
break;
13871385
case RT_DEVICE_CTRL_NOTIFY_SET:
13881386
if (args == RT_NULL)
13891387
{
@@ -1944,21 +1942,17 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event)
19441942
#ifdef RT_SERIAL_BUF_STRATEGY_DROP
19451943
rt_uint8_t *ptr;
19461944
rt_size_t size;
1947-
rt_size_t space_len;
1945+
rt_size_t put_len;
19481946
/* UART_IT_IDLE and dma isr */
19491947
level = rt_spin_lock_irqsave(&serial->spinlock);
19501948
do
19511949
{
1952-
space_len = rt_ringbuffer_space_len(&rx_fifo->rb);
1953-
if (space_len == 0)
1954-
break;
1955-
19561950
rt_serial_update_write_index(&rx_fifo->dma_ping_rb, rx_length);
19571951

19581952
size = rt_ringbuffer_peek(&rx_fifo->dma_ping_rb, &ptr);
19591953

1960-
space_len -= rt_ringbuffer_put(&rx_fifo->rb, ptr, size);
1961-
if (space_len == 0)
1954+
put_len = rt_ringbuffer_put(&rx_fifo->rb, ptr, size);
1955+
if (put_len != size)
19621956
break;
19631957

19641958
size = rt_ringbuffer_peek(&rx_fifo->dma_ping_rb, &ptr);
@@ -1973,9 +1967,10 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event)
19731967
rt_size_t size;
19741968
/* UART_IT_IDLE and dma isr */
19751969
level = rt_spin_lock_irqsave(&serial->spinlock);
1976-
rt_serial_update_write_index(&rx_fifo->dma_ping_rb, rx_length);
19771970
do
19781971
{
1972+
rt_serial_update_write_index(&rx_fifo->dma_ping_rb, rx_length);
1973+
19791974
size = rt_ringbuffer_peek(&rx_fifo->dma_ping_rb, &ptr);
19801975

19811976
rt_ringbuffer_put_force(&rx_fifo->rb, ptr, size);
@@ -2022,8 +2017,8 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event)
20222017
/* Interrupt transmit event */
20232018
case RT_SERIAL_EVENT_TX_DONE: {
20242019
struct rt_serial_tx_fifo *tx_fifo;
2025-
rt_size_t tx_length = 0;
2026-
tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx;
2020+
rt_size_t tx_length;
2021+
tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx;
20272022
RT_ASSERT(tx_fifo != RT_NULL);
20282023

20292024
/* Get the length of the data from the ringbuffer */
@@ -2059,12 +2054,13 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event)
20592054
#ifdef RT_SERIAL_USING_DMA
20602055
case RT_SERIAL_EVENT_TX_DMADONE: {
20612056
struct rt_serial_tx_fifo *tx_fifo;
2062-
rt_size_t tx_length = 0;
2063-
tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx;
2057+
rt_size_t tx_length;
2058+
tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx;
20642059
RT_ASSERT(tx_fifo != RT_NULL);
2065-
if ((serial->parent.open_flag & RT_SERIAL_TX_BLOCKING) != RT_SERIAL_TX_BLOCKING || rt_ringbuffer_get_size(&tx_fifo->rb) != 0)
2060+
/* nonblock */
2061+
if ((serial->parent.open_flag & RT_SERIAL_TX_BLOCKING) != RT_SERIAL_TX_BLOCKING)
20662062
{
2067-
// 每次进来中断就说明之前的put_size已经被发送完毕了
2063+
/* Each interruption upon entry indicates that the previous `put_size` has already been sent completely */
20682064
rt_serial_update_read_index(&tx_fifo->rb, tx_fifo->put_size);
20692065

20702066
/* Get the length of the data from the ringbuffer */

0 commit comments

Comments
 (0)