Skip to content

Commit 1055b11

Browse files
committed
[utest][drivers][serial_v2] 增加单独的timeout测试,减少测试中的硬延时
1 parent 3f50c4f commit 1055b11

File tree

5 files changed

+270
-3
lines changed

5 files changed

+270
-3
lines changed

examples/utest/testcases/drivers/serial_v2/uart_blocking_rx.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ static rt_bool_t block_read(rt_device_t uart_dev)
5151

5252
rt_sprintf(log_buffer, "\nblock : %d bytes read , total: %d \n", recv_length, total_length);
5353
rt_device_write(uart_dev, 0, log_buffer, rt_strlen(log_buffer));
54-
rt_thread_mdelay(1000);
5554

5655
rt_sprintf(log_buffer, "BLOCKING READ END");
5756
rt_device_write(uart_dev, 0, log_buffer, rt_strlen(log_buffer));

examples/utest/testcases/drivers/serial_v2/uart_blocking_tx.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ static rt_bool_t block_write(rt_device_t uart_dev)
8383
for (i = 0; i < index; i++)
8484
{
8585
LOG_D("\nBLOCKING_MODE : write %d / %d bytes in %d ticks\n", write_num_array[i], total_write_num[i], tick_array[i]);
86-
rt_thread_mdelay(1000);
86+
rt_thread_mdelay(10);
8787
}
8888

8989
return RT_TRUE;

examples/utest/testcases/drivers/serial_v2/uart_nonblocking_tx.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ static rt_bool_t nonblock_write(rt_device_t uart_dev)
8888
for (i = 0; i < index; i++)
8989
{
9090
LOG_D("\nNONBLOCKING_MODE : write %d / %d bytes in %d ticks\n", write_num_array[i], total_write_num[i], tick_array[i]);
91-
rt_thread_mdelay(1000);
91+
rt_thread_mdelay(10);
9292
}
9393

9494
return RT_TRUE;
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
/*
2+
* Copyright (c) 2006-2024 RT-Thread Development Team
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*
6+
* Change Logs:
7+
* Date Author Notes
8+
*
9+
*/
10+
11+
#include <rtthread.h>
12+
#include "utest.h"
13+
#include <rtdevice.h>
14+
#include <stdlib.h>
15+
16+
17+
#ifdef UTEST_SERIAL_TC
18+
19+
static struct rt_serial_device *serial;
20+
21+
static rt_err_t uart_find(void)
22+
{
23+
serial = (struct rt_serial_device *)rt_device_find(RT_SERIAL_TC_DEVICE_NAME);
24+
25+
if (serial == RT_NULL)
26+
{
27+
LOG_E("find %s device failed!\n", RT_SERIAL_TC_DEVICE_NAME);
28+
return -RT_ERROR;
29+
}
30+
31+
return RT_EOK;
32+
}
33+
34+
static rt_err_t rx_timeout_test_item(rt_uint8_t *uart_write_buffer, rt_uint32_t send_size)
35+
{
36+
rt_uint32_t readSize = 0;
37+
rt_int32_t rx_timeout_send_size = send_size - send_size / 3;
38+
rt_int32_t rx_timeout = rt_tick_from_millisecond(0.0868 * rx_timeout_send_size + 1);
39+
40+
rt_device_control(&serial->parent, RT_SERIAL_CTRL_SET_RX_TIMEOUT, (void *)&rx_timeout);
41+
42+
rt_ssize_t size = rt_device_write(&serial->parent, 0, uart_write_buffer, send_size);
43+
if (size != send_size)
44+
{
45+
LOG_E("size [%4d], send_size [%4d]", size, send_size);
46+
return -RT_ERROR;
47+
}
48+
49+
readSize = rt_device_read(&serial->parent, 0, uart_write_buffer, size);
50+
if (readSize < (rx_timeout_send_size - 70) || readSize > (send_size - 80))
51+
{
52+
LOG_E("readSize [%4d], rx_timeout_send_size [%4d]", readSize, rx_timeout_send_size);
53+
return -RT_ERROR;
54+
}
55+
56+
rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL);
57+
/* Waiting for rx to complete reception */
58+
rt_thread_mdelay(0.0868 * (send_size / 3));
59+
60+
LOG_I("rx timeout send_size [%4d]", send_size);
61+
return RT_EOK;
62+
}
63+
64+
static rt_bool_t uart_api()
65+
{
66+
rt_err_t result = RT_EOK;
67+
68+
result = uart_find();
69+
if (result != RT_EOK)
70+
{
71+
return RT_FALSE;
72+
}
73+
74+
/* Reinitialize */
75+
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
76+
config.baud_rate = BAUD_RATE_115200;
77+
config.rx_bufsz = RT_SERIAL_TC_RXBUF_SIZE;
78+
config.tx_bufsz = 2048;
79+
#ifdef RT_SERIAL_USING_DMA
80+
config.dma_ping_bufsz = RT_SERIAL_TC_RXBUF_SIZE / 2;
81+
#endif
82+
rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config);
83+
84+
result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_TX_NON_BLOCKING);
85+
if (result != RT_EOK)
86+
{
87+
LOG_E("Open uart device failed.");
88+
return RT_FALSE;
89+
}
90+
91+
rt_uint8_t *uart_write_buffer;
92+
rt_uint32_t i;
93+
uart_write_buffer = (rt_uint8_t *)rt_malloc(2048);
94+
95+
96+
for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++)
97+
{
98+
srand(rt_tick_get());
99+
if (RT_EOK != rx_timeout_test_item(uart_write_buffer, 1024 + (rand() % 1024)))
100+
{
101+
LOG_E("test_item failed.");
102+
result = -RT_ERROR;
103+
goto __exit;
104+
}
105+
}
106+
107+
__exit:
108+
rt_free(uart_write_buffer);
109+
rt_device_close(&serial->parent);
110+
rt_thread_mdelay(5);
111+
return result == RT_EOK ? RT_TRUE : RT_FALSE;
112+
}
113+
114+
static void tc_uart_api(void)
115+
{
116+
uassert_true(uart_api() == RT_TRUE);
117+
}
118+
119+
static rt_err_t utest_tc_init(void)
120+
{
121+
LOG_I("UART TEST: Please connect Tx and Rx directly for self testing.");
122+
return RT_EOK;
123+
}
124+
125+
static rt_err_t utest_tc_cleanup(void)
126+
{
127+
rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME);
128+
while (rt_device_close(uart_dev) != -RT_ERROR);
129+
return RT_EOK;
130+
}
131+
132+
static void testcase(void)
133+
{
134+
UTEST_UNIT_RUN(tc_uart_api);
135+
}
136+
137+
UTEST_TC_EXPORT(testcase, "testcases.drivers.uart_timeout_rxb", utest_tc_init, utest_tc_cleanup, 30);
138+
139+
#endif /* TC_UART_USING_TC */
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
/*
2+
* Copyright (c) 2006-2024 RT-Thread Development Team
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*
6+
* Change Logs:
7+
* Date Author Notes
8+
*
9+
*/
10+
11+
#include <rtthread.h>
12+
#include "utest.h"
13+
#include <rtdevice.h>
14+
#include <stdlib.h>
15+
16+
#ifdef UTEST_SERIAL_TC
17+
#ifndef BSP_UART2_TX_USING_DMA
18+
19+
static struct rt_serial_device *serial;
20+
21+
static rt_err_t uart_find(void)
22+
{
23+
serial = (struct rt_serial_device *)rt_device_find(RT_SERIAL_TC_DEVICE_NAME);
24+
25+
if (serial == RT_NULL)
26+
{
27+
LOG_E("find %s device failed!\n", RT_SERIAL_TC_DEVICE_NAME);
28+
return -RT_ERROR;
29+
}
30+
31+
return RT_EOK;
32+
}
33+
34+
static rt_err_t tx_timeout_test_item(rt_uint8_t *uart_write_buffer, rt_uint32_t send_size)
35+
{
36+
rt_uint32_t readSize = 0;
37+
rt_int32_t tx_timeout_send_size = send_size - send_size / 3;
38+
rt_int32_t tx_timeout = rt_tick_from_millisecond(0.0868 * tx_timeout_send_size + 1);
39+
rt_device_control(&serial->parent, RT_SERIAL_CTRL_SET_TX_TIMEOUT, (void *)&tx_timeout);
40+
41+
rt_ssize_t size = rt_device_write(&serial->parent, 0, uart_write_buffer, send_size);
42+
if (size < (tx_timeout_send_size - 70) || size > (send_size - 80))
43+
{
44+
LOG_E("size [%4d], send_size [%4d]", size, tx_timeout_send_size);
45+
return -RT_ERROR;
46+
}
47+
48+
rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL);
49+
/* Waiting for rx to complete reception */
50+
rt_thread_mdelay(0.0868 * (send_size / 3));
51+
52+
LOG_I("tx timeout send_size [%4d]", send_size);
53+
54+
return RT_EOK;
55+
}
56+
57+
static rt_bool_t uart_api()
58+
{
59+
rt_err_t result = RT_EOK;
60+
61+
result = uart_find();
62+
if (result != RT_EOK)
63+
{
64+
return RT_FALSE;
65+
}
66+
67+
/* Reinitialize */
68+
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
69+
config.baud_rate = BAUD_RATE_115200;
70+
config.rx_bufsz = RT_SERIAL_TC_RXBUF_SIZE;
71+
config.tx_bufsz = RT_SERIAL_TC_TXBUF_SIZE;
72+
73+
rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config);
74+
75+
result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING);
76+
if (result != RT_EOK)
77+
{
78+
LOG_E("Open uart device failed.");
79+
return RT_FALSE;
80+
}
81+
82+
rt_uint8_t *uart_write_buffer;
83+
rt_uint32_t i;
84+
uart_write_buffer = (rt_uint8_t *)rt_malloc(2048);
85+
for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++)
86+
{
87+
srand(rt_tick_get());
88+
if (RT_EOK != tx_timeout_test_item(uart_write_buffer, 1024 + (rand() % 1024)))
89+
{
90+
LOG_E("test_item failed.");
91+
result = -RT_ERROR;
92+
goto __exit;
93+
}
94+
}
95+
96+
__exit:
97+
rt_free(uart_write_buffer);
98+
rt_device_close(&serial->parent);
99+
rt_thread_mdelay(5);
100+
return result == RT_EOK ? RT_TRUE : RT_FALSE;
101+
}
102+
103+
static void tc_uart_api(void)
104+
{
105+
uassert_true(uart_api() == RT_TRUE);
106+
}
107+
108+
static rt_err_t utest_tc_init(void)
109+
{
110+
LOG_I("UART TEST: Please connect Tx and Rx directly for self testing.");
111+
return RT_EOK;
112+
}
113+
114+
static rt_err_t utest_tc_cleanup(void)
115+
{
116+
rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME);
117+
while (rt_device_close(uart_dev) != -RT_ERROR);
118+
return RT_EOK;
119+
}
120+
121+
static void testcase(void)
122+
{
123+
UTEST_UNIT_RUN(tc_uart_api);
124+
}
125+
126+
UTEST_TC_EXPORT(testcase, "testcases.drivers.uart_timeout_txb", utest_tc_init, utest_tc_cleanup, 30);
127+
128+
#endif /* BSP_UART2_TX_USING_DMA */
129+
#endif /* TC_UART_USING_TC */

0 commit comments

Comments
 (0)