diff options
| author | RyanCW <[email protected]> | 2025-08-16 11:51:57 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-08-16 11:51:57 +0800 |
| commit | e0243e87c0230f2afcdce3e1070755f78dfee9c7 (patch) | |
| tree | e1aff5d61d6231fee568b371fcb9a1864e93bdd8 /examples | |
| parent | 329cffd77e203ab73f098188b0ec02b6ef6af0ed (diff) | |
[component][drivers][serial_v2] 优化serial_v2 (#10603)
* [bsp][stm32][drv_usart_v2] uart_isr不再使用链式调用,RXNE内循环读空,一些细节优化
* [componnents][drivers][serial_v2] 增加获取config接口,使用rt_tick_get_delta替代内部的时间绕回判断,写满丢弃策略rx接收数据错乱修复,clang-tidy和cppcheck审查优化
* [utest][drivers][serial_v2] 测试例程进行优化
* [bsp][stm32][drv_usart_v2] 撤回DMAMUX1修改
* [componnents][drivers][serial_v2] read和write不再返回-RT_ETIMEOUT改为已发送或读取的字节数,细节优化
* [utest][drivers][serial_v2] 增加单独的timeout测试,减少测试中的硬延时
* [utest][drivers][serial_v2] 漏提交的posix下标志位
* [utest][drivers][serial_v2] 优化测试例程
* [bsp][stm32][drv_usart_v2] transmit返回错误值,RXNE增加超时逻辑
* [componnents][drivers][serial_v2] 增加transmit错误处理,增加超时退出机制显式的避免死循环
* [componnents][drivers][serial_v2] 适配serial_v2和posix非libc标准库下的console和shell
Diffstat (limited to 'examples')
17 files changed, 409 insertions, 28 deletions
diff --git a/examples/utest/testcases/drivers/serial_v2/posix/uart_posix_echo_block.c b/examples/utest/testcases/drivers/serial_v2/posix/uart_posix_echo_block.c index 1a0a8ec1ee..bb273f1328 100644 --- a/examples/utest/testcases/drivers/serial_v2/posix/uart_posix_echo_block.c +++ b/examples/utest/testcases/drivers/serial_v2/posix/uart_posix_echo_block.c @@ -115,7 +115,7 @@ static void uart_rec_entry(void *parameter) rev_len = *(rt_uint16_t *)parameter; rt_uint8_t *uart_write_buffer; - uart_write_buffer = (rt_uint8_t *)rt_calloc(1, sizeof(rt_uint8_t) * (rev_len + 1)); + uart_write_buffer = (rt_uint8_t *)rt_calloc(1, rev_len + 1); rt_int32_t cnt, i; rt_uint8_t last_old_data; rt_bool_t fisrt_flag = RT_TRUE; diff --git a/examples/utest/testcases/drivers/serial_v2/posix/uart_posix_nonblock.c b/examples/utest/testcases/drivers/serial_v2/posix/uart_posix_nonblock.c index 3159f2d6cd..943b47b345 100644 --- a/examples/utest/testcases/drivers/serial_v2/posix/uart_posix_nonblock.c +++ b/examples/utest/testcases/drivers/serial_v2/posix/uart_posix_nonblock.c @@ -108,7 +108,7 @@ static rt_err_t uart_api() goto __exit; } - uart_write_buffer = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * 100); + uart_write_buffer = (rt_uint8_t *)rt_malloc(100); for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++) { diff --git a/examples/utest/testcases/drivers/serial_v2/uart_blocking_rx.c b/examples/utest/testcases/drivers/serial_v2/uart_blocking_rx.c index 432181c031..1d2ab4e586 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_blocking_rx.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_blocking_rx.c @@ -51,7 +51,6 @@ static rt_bool_t block_read(rt_device_t uart_dev) rt_sprintf(log_buffer, "\nblock : %d bytes read , total: %d \n", recv_length, total_length); rt_device_write(uart_dev, 0, log_buffer, rt_strlen(log_buffer)); - rt_thread_mdelay(1000); rt_sprintf(log_buffer, "BLOCKING READ END"); rt_device_write(uart_dev, 0, log_buffer, rt_strlen(log_buffer)); diff --git a/examples/utest/testcases/drivers/serial_v2/uart_blocking_tx.c b/examples/utest/testcases/drivers/serial_v2/uart_blocking_tx.c index a5893536ed..51eda0feb9 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_blocking_tx.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_blocking_tx.c @@ -83,7 +83,7 @@ static rt_bool_t block_write(rt_device_t uart_dev) for (i = 0; i < index; i++) { LOG_D("\nBLOCKING_MODE : write %d / %d bytes in %d ticks\n", write_num_array[i], total_write_num[i], tick_array[i]); - rt_thread_mdelay(1000); + rt_thread_mdelay(10); } return RT_TRUE; diff --git a/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c b/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c index 7411eeaa84..3d529d7f46 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c @@ -31,10 +31,26 @@ static rt_err_t uart_find(void) return RT_EOK; } -static rt_err_t test_item(rt_uint8_t *uart_write_buffer, rt_uint32_t size) +static rt_err_t test_item(rt_uint8_t *uart_write_buffer, rt_uint32_t send_size) { - rt_device_write(&serial->parent, 0, uart_write_buffer, size); - rt_thread_mdelay(size * 0.0868 + 5); + rt_uint8_t readBuf[16] = {0}; + rt_uint32_t readSize = 0; + if (send_size >= sizeof(readBuf)) + { + readSize = sizeof(readBuf); + } + else + { + readSize = send_size; + } + + rt_ssize_t size = rt_device_write(&serial->parent, 0, uart_write_buffer, send_size); + if (size != send_size) + { + LOG_E("size [%4d], send_size [%4d]", size, send_size); + return -RT_ERROR; + } + rt_thread_mdelay(send_size * 0.0868 + 5); if (1 != rt_device_read(&serial->parent, 0, uart_write_buffer, 1)) { LOG_E("read failed."); @@ -48,6 +64,25 @@ static rt_err_t test_item(rt_uint8_t *uart_write_buffer, rt_uint32_t size) return -RT_ERROR; } + /* Resend the data and check for any discrepancies upon reception */ + if (readSize > 0) + { + rt_device_write(&serial->parent, 0, uart_write_buffer, readSize); + rt_thread_mdelay(readSize * 0.0868 + 5); + rt_device_read(&serial->parent, 0, readBuf, readSize); + + for (rt_uint32_t i = 0; i < readSize; i++) + { + if (readBuf[i] != uart_write_buffer[i]) + { + LOG_E("index: %d, Read Different data -> former data: %x, current data: %x.", i, uart_write_buffer[i], readBuf[i]); + return -RT_ERROR; + } + } + } + + LOG_I("flush rx send_size [%4d]", send_size); + return RT_EOK; } @@ -80,7 +115,11 @@ static rt_bool_t uart_api() rt_uint8_t *uart_write_buffer; rt_uint32_t i; - uart_write_buffer = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (RT_SERIAL_TC_TXBUF_SIZE * 5 + 1)); + uart_write_buffer = (rt_uint8_t *)rt_malloc(RT_SERIAL_TC_RXBUF_SIZE * 5 + 1); + for (rt_uint32_t count = 0; count < (RT_SERIAL_TC_RXBUF_SIZE * 5 + 1); count++) + { + uart_write_buffer[count] = count; + } srand(rt_tick_get()); for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++) diff --git a/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c index 567fe3740a..2bc45a3250 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c @@ -37,18 +37,34 @@ static rt_err_t test_item(rt_uint8_t *uart_write_buffer, rt_uint32_t send_size) rt_tick_t tick_diff; rt_tick_t expect_time = send_size * 0.0868; + rt_uint8_t readBuf[16] = {0}; + rt_uint32_t readSize = 0; + if (send_size >= sizeof(readBuf)) + { + readSize = sizeof(readBuf); + } + else + { + readSize = send_size; + } + /* In interrupt mode, ticks may be inaccurate; compensation should be applied*/ if (send_size > 384) { expect_time -= send_size / 384; } - old_tick = rt_tick_get(); - rt_device_write(&serial->parent, 0, uart_write_buffer, send_size); + old_tick = rt_tick_get(); + rt_ssize_t size = rt_device_write(&serial->parent, 0, uart_write_buffer, send_size); + if (size != send_size) + { + LOG_E("size [%4d], send_size [%4d]", size, send_size); + return -RT_ERROR; + } rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); tick_diff = rt_tick_get() - old_tick; - if (tick_diff < expect_time || tick_diff > expect_time + 10) + if (tick_diff < expect_time || tick_diff > (expect_time + 10)) { LOG_E("send_size [%4d], time required for TXB mode transmission to complete [%3d], expect_time [%3d]", send_size, tick_diff, expect_time); return -RT_ERROR; @@ -58,6 +74,24 @@ static rt_err_t test_item(rt_uint8_t *uart_write_buffer, rt_uint32_t send_size) LOG_I("send_size [%4d], time required for TXB mode transmission to complete [%3d], expect_time [%3d]", send_size, tick_diff, expect_time); } + /* Resend the data and check for any discrepancies upon reception */ + if (readSize > 0) + { + rt_device_control(&serial->parent, RT_SERIAL_CTRL_RX_FLUSH, RT_NULL); + rt_device_write(&serial->parent, 0, uart_write_buffer, readSize); + rt_device_read(&serial->parent, 0, readBuf, readSize); + + for (rt_uint32_t i = 0; i < readSize; i++) + { + if (readBuf[i] != uart_write_buffer[i]) + { + LOG_E("index: %d, Read Different data -> former data: %x, current data: %x.", i, uart_write_buffer[i], readBuf[i]); + return -RT_ERROR; + } + } + } + + return RT_EOK; } @@ -81,7 +115,7 @@ static rt_bool_t uart_api() #endif rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); - result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); + result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); if (result != RT_EOK) { LOG_E("Open uart device failed."); @@ -90,8 +124,12 @@ static rt_bool_t uart_api() rt_uint8_t *uart_write_buffer; rt_uint32_t i; - rt_int32_t tx_timeout = 1; - uart_write_buffer = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (RT_SERIAL_TC_TXBUF_SIZE * 5 + 10)); + rt_int32_t tx_timeout = 10 * 1000; + uart_write_buffer = (rt_uint8_t *)rt_malloc(RT_SERIAL_TC_TXBUF_SIZE * 5 + 10); + for (rt_uint32_t count = 0; count < (RT_SERIAL_TC_TXBUF_SIZE * 5 + 10); count++) + { + uart_write_buffer[count] = count; + } rt_device_control(&serial->parent, RT_SERIAL_CTRL_SET_TX_TIMEOUT, (void *)&tx_timeout); diff --git a/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c b/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c index aa086a8679..1fcfc2b99d 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c @@ -36,6 +36,16 @@ static rt_err_t test_item(rt_uint8_t *uart_write_buffer, rt_uint32_t send_size) rt_uint32_t old_tick; rt_tick_t tick_diff; rt_tick_t expect_time = send_size * 0.0868; + rt_uint8_t readBuf[16] = {0}; + rt_uint32_t readSize = 0; + if (send_size >= sizeof(readBuf)) + { + readSize = sizeof(readBuf); + } + else + { + readSize = send_size; + } /* In interrupt mode, ticks may be inaccurate; compensation should be applied */ if (send_size > 384) @@ -43,11 +53,18 @@ static rt_err_t test_item(rt_uint8_t *uart_write_buffer, rt_uint32_t send_size) expect_time -= send_size / 384; } - old_tick = rt_tick_get(); - rt_uint32_t size = rt_device_write(&serial->parent, 0, uart_write_buffer, send_size); + old_tick = rt_tick_get(); + rt_ssize_t size = rt_device_write(&serial->parent, 0, uart_write_buffer, send_size); + if (size != send_size) + { + LOG_E("size [%4d], send_size [%4d]", size, send_size); + return -RT_ERROR; + } + rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); tick_diff = rt_tick_get() - old_tick; - if (tick_diff < expect_time) + + if (tick_diff < expect_time || tick_diff > (expect_time + 10)) { LOG_E("send_size [%4d], time required for TXNB mode transmission to complete [%3d], expect_time [%3d]", send_size, tick_diff, expect_time); return -RT_ERROR; @@ -57,6 +74,23 @@ static rt_err_t test_item(rt_uint8_t *uart_write_buffer, rt_uint32_t send_size) LOG_I("send_size [%4d], time required for TXNB mode transmission to complete [%3d], expect_time [%3d]", send_size, tick_diff, expect_time); } + /* Resend the data and check for any discrepancies upon reception */ + if (readSize > 0) + { + rt_device_control(&serial->parent, RT_SERIAL_CTRL_RX_FLUSH, RT_NULL); + rt_device_write(&serial->parent, 0, uart_write_buffer, readSize); + rt_device_read(&serial->parent, 0, readBuf, readSize); + + for (rt_uint32_t i = 0; i < readSize; i++) + { + if (readBuf[i] != uart_write_buffer[i]) + { + LOG_E("index: %d, Read Different data -> former data: %x, current data: %x.", i, uart_write_buffer[i], readBuf[i]); + return -RT_ERROR; + } + } + } + return RT_EOK; } @@ -80,7 +114,7 @@ static rt_bool_t uart_api() #endif rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); - result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_NON_BLOCKING); + result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_TX_NON_BLOCKING); if (result != RT_EOK) { LOG_E("Open uart device failed."); @@ -90,7 +124,11 @@ static rt_bool_t uart_api() rt_uint8_t *uart_write_buffer; rt_uint32_t i; rt_int32_t tx_timeout = 1; - uart_write_buffer = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (RT_SERIAL_TC_RXBUF_SIZE * 5 + 10)); + uart_write_buffer = (rt_uint8_t *)rt_malloc(RT_SERIAL_TC_RXBUF_SIZE * 5 + 10); + for (rt_uint32_t count = 0; count < (RT_SERIAL_TC_TXBUF_SIZE * 5 + 10); count++) + { + uart_write_buffer[count] = count; + } rt_device_control(&serial->parent, RT_SERIAL_CTRL_SET_TX_TIMEOUT, (void *)&tx_timeout); diff --git a/examples/utest/testcases/drivers/serial_v2/uart_get_unread_bytes_count.c b/examples/utest/testcases/drivers/serial_v2/uart_get_unread_bytes_count.c index fc4323cc98..f63f663ad3 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_get_unread_bytes_count.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_get_unread_bytes_count.c @@ -92,7 +92,7 @@ static rt_bool_t uart_api() rt_uint8_t *uart_write_buffer; rt_uint32_t i; - uart_write_buffer = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (RT_SERIAL_TC_TXBUF_SIZE * 5 + 1)); + uart_write_buffer = (rt_uint8_t *)rt_malloc(RT_SERIAL_TC_TXBUF_SIZE * 5 + 1); srand(rt_tick_get()); for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++) diff --git a/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_tx.c b/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_tx.c index 7723ef56b1..cd1297d919 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_tx.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_tx.c @@ -88,7 +88,7 @@ static rt_bool_t nonblock_write(rt_device_t uart_dev) for (i = 0; i < index; i++) { LOG_D("\nNONBLOCKING_MODE : write %d / %d bytes in %d ticks\n", write_num_array[i], total_write_num[i], tick_array[i]); - rt_thread_mdelay(1000); + rt_thread_mdelay(10); } return RT_TRUE; diff --git a/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c index 912d1ecd7c..e5a354f75a 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c @@ -70,7 +70,7 @@ static void uart_rec_entry(void *parameter) rt_uint8_t *uart_write_buffer; rt_int32_t cnt, i; rev_len = *(rt_uint32_t *)parameter; - uart_write_buffer = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (rev_len + 1)); + uart_write_buffer = (rt_uint8_t *)rt_malloc(rev_len + 1); while (1) { diff --git a/examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c index 40702e8fb2..b844cc05b2 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c @@ -69,13 +69,12 @@ static void uart_rec_entry(void *parameter) rev_len = *(rt_uint16_t *)parameter; rt_uint8_t *uart_write_buffer; - uart_write_buffer = (rt_uint8_t *)rt_calloc(1, sizeof(rt_uint8_t) * (rev_len + 1)); + uart_write_buffer = (rt_uint8_t *)rt_calloc(1, rev_len + 1); rt_int32_t cnt, i; rt_uint8_t last_old_data; rt_bool_t fisrt_flag = RT_TRUE; rt_uint32_t all_receive_length = 0; - while (1) { cnt = rt_device_read(&serial->parent, 0, (void *)uart_write_buffer, rev_len); diff --git a/examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c b/examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c index c2e6be8205..b5e4fe6e86 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c @@ -83,7 +83,7 @@ static void uart_rec_entry(void *parameter) rev_len = *(rt_uint16_t *)parameter; rt_uint8_t *uart_write_buffer; - uart_write_buffer = (rt_uint8_t *)rt_calloc(1, sizeof(rt_uint8_t) * (rev_len + 1)); + uart_write_buffer = (rt_uint8_t *)rt_calloc(1, rev_len + 1); rt_int32_t cnt, i; rt_uint8_t last_old_data; rt_bool_t fisrt_flag = RT_TRUE; diff --git a/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c index a1efcc7315..6dc7f68346 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c @@ -79,7 +79,7 @@ static void uart_rec_entry(void *parameter) rev_len = *(rt_uint16_t *)parameter; rt_uint8_t *uart_write_buffer; - uart_write_buffer = (rt_uint8_t *)rt_calloc(1, sizeof(rt_uint8_t) * (rev_len + 1)); + uart_write_buffer = (rt_uint8_t *)rt_calloc(1, rev_len + 1); rt_int32_t cnt, i; rt_uint8_t last_old_data; rt_bool_t fisrt_flag = RT_TRUE; diff --git a/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c b/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c index edc66e2be8..66c40c103d 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c @@ -89,7 +89,7 @@ static void uart_rec_entry(void *parameter) rev_len = *(rt_uint16_t *)parameter; rt_uint8_t *uart_write_buffer; - uart_write_buffer = (rt_uint8_t *)rt_calloc(1, sizeof(rt_uint8_t) * (rev_len + 1)); + uart_write_buffer = (rt_uint8_t *)rt_calloc(1, rev_len + 1); rt_int32_t cnt, i; rt_uint8_t last_old_data; rt_bool_t fisrt_flag = RT_TRUE; diff --git a/examples/utest/testcases/drivers/serial_v2/uart_timeout_rxb.c b/examples/utest/testcases/drivers/serial_v2/uart_timeout_rxb.c new file mode 100644 index 0000000000..7c936bbfe8 --- /dev/null +++ b/examples/utest/testcases/drivers/serial_v2/uart_timeout_rxb.c @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2006-2024 RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * + */ + +#include <rtthread.h> +#include "utest.h" +#include <rtdevice.h> +#include <stdlib.h> + + +#ifdef UTEST_SERIAL_TC + +static struct rt_serial_device *serial; + +static rt_err_t uart_find(void) +{ + serial = (struct rt_serial_device *)rt_device_find(RT_SERIAL_TC_DEVICE_NAME); + + if (serial == RT_NULL) + { + LOG_E("find %s device failed!\n", RT_SERIAL_TC_DEVICE_NAME); + return -RT_ERROR; + } + + return RT_EOK; +} + +static rt_err_t rx_timeout_test_item(rt_uint8_t *uart_write_buffer, rt_uint32_t send_size) +{ + rt_uint32_t readSize = 0; + rt_int32_t rx_timeout_send_size = send_size - send_size / 3; + rt_int32_t rx_timeout = rt_tick_from_millisecond(0.0868 * rx_timeout_send_size + 1); + + rt_device_control(&serial->parent, RT_SERIAL_CTRL_SET_RX_TIMEOUT, (void *)&rx_timeout); + + rt_ssize_t size = rt_device_write(&serial->parent, 0, uart_write_buffer, send_size); + if (size != send_size) + { + LOG_E("size [%4d], send_size [%4d]", size, send_size); + return -RT_ERROR; + } + + readSize = rt_device_read(&serial->parent, 0, uart_write_buffer, size); + if (readSize < (rx_timeout_send_size - 70) || readSize > (send_size - 80)) + { + LOG_E("readSize [%4d], rx_timeout_send_size [%4d]", readSize, rx_timeout_send_size); + return -RT_ERROR; + } + + rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); + /* Waiting for rx to complete reception */ + rt_thread_mdelay(0.0868 * (send_size / 3)); + + LOG_I("rx timeout send_size [%4d]", send_size); + return RT_EOK; +} + +static rt_bool_t uart_api() +{ + rt_err_t result = RT_EOK; + + result = uart_find(); + if (result != RT_EOK) + { + return RT_FALSE; + } + + /* Reinitialize */ + struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + config.baud_rate = BAUD_RATE_115200; + config.rx_bufsz = RT_SERIAL_TC_RXBUF_SIZE; + config.tx_bufsz = 2048; +#ifdef RT_SERIAL_USING_DMA + config.dma_ping_bufsz = RT_SERIAL_TC_RXBUF_SIZE / 2; +#endif + rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); + + result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_TX_NON_BLOCKING); + if (result != RT_EOK) + { + LOG_E("Open uart device failed."); + return RT_FALSE; + } + + rt_uint8_t *uart_write_buffer; + rt_uint32_t i; + uart_write_buffer = (rt_uint8_t *)rt_malloc(2048); + + + for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++) + { + srand(rt_tick_get()); + if (RT_EOK != rx_timeout_test_item(uart_write_buffer, 1024 + (rand() % 1024))) + { + LOG_E("test_item failed."); + result = -RT_ERROR; + goto __exit; + } + } + +__exit: + rt_free(uart_write_buffer); + rt_device_close(&serial->parent); + rt_thread_mdelay(5); + return result == RT_EOK ? RT_TRUE : RT_FALSE; +} + +static void tc_uart_api(void) +{ + uassert_true(uart_api() == RT_TRUE); +} + +static rt_err_t utest_tc_init(void) +{ + LOG_I("UART TEST: Please connect Tx and Rx directly for self testing."); + return RT_EOK; +} + +static rt_err_t utest_tc_cleanup(void) +{ + rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME); + while (rt_device_close(uart_dev) != -RT_ERROR); + return RT_EOK; +} + +static void testcase(void) +{ + UTEST_UNIT_RUN(tc_uart_api); +} + +UTEST_TC_EXPORT(testcase, "testcases.drivers.uart_timeout_rxb", utest_tc_init, utest_tc_cleanup, 30); + +#endif /* TC_UART_USING_TC */ diff --git a/examples/utest/testcases/drivers/serial_v2/uart_timeout_rxb_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_timeout_rxb_txb.c index ae42ee5d05..7defec6803 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_timeout_rxb_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_timeout_rxb_txb.c @@ -75,7 +75,7 @@ static void uart_rec_entry(void *parameter) rt_ssize_t recv_len; rt_uint32_t i; rt_int32_t timeout = 0; - uart_write_buffer = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (RT_SERIAL_TC_RXBUF_SIZE * 10 + 1)); + uart_write_buffer = (rt_uint8_t *)rt_malloc(RT_SERIAL_TC_RXBUF_SIZE * 10 + 1); timeout = 100; rt_device_control(&serial->parent, RT_SERIAL_CTRL_SET_RX_TIMEOUT, (void *)&timeout); diff --git a/examples/utest/testcases/drivers/serial_v2/uart_timeout_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_timeout_txb.c new file mode 100644 index 0000000000..9af3f40b3e --- /dev/null +++ b/examples/utest/testcases/drivers/serial_v2/uart_timeout_txb.c @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2006-2024 RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * + */ + +#include <rtthread.h> +#include "utest.h" +#include <rtdevice.h> +#include <stdlib.h> + +#ifdef UTEST_SERIAL_TC +#ifndef BSP_UART2_TX_USING_DMA + +static struct rt_serial_device *serial; + +static rt_err_t uart_find(void) +{ + serial = (struct rt_serial_device *)rt_device_find(RT_SERIAL_TC_DEVICE_NAME); + + if (serial == RT_NULL) + { + LOG_E("find %s device failed!\n", RT_SERIAL_TC_DEVICE_NAME); + return -RT_ERROR; + } + + return RT_EOK; +} + +static rt_err_t tx_timeout_test_item(rt_uint8_t *uart_write_buffer, rt_uint32_t send_size) +{ + rt_uint32_t readSize = 0; + rt_int32_t tx_timeout_send_size = send_size - send_size / 3; + rt_int32_t tx_timeout = rt_tick_from_millisecond(0.0868 * tx_timeout_send_size + 1); + rt_device_control(&serial->parent, RT_SERIAL_CTRL_SET_TX_TIMEOUT, (void *)&tx_timeout); + + rt_ssize_t size = rt_device_write(&serial->parent, 0, uart_write_buffer, send_size); + if (size < (tx_timeout_send_size - 70) || size > (send_size - 80)) + { + LOG_E("size [%4d], send_size [%4d]", size, tx_timeout_send_size); + return -RT_ERROR; + } + + rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); + /* Waiting for rx to complete reception */ + rt_thread_mdelay(0.0868 * (send_size / 3)); + + LOG_I("tx timeout send_size [%4d]", send_size); + + return RT_EOK; +} + +static rt_bool_t uart_api() +{ + rt_err_t result = RT_EOK; + + result = uart_find(); + if (result != RT_EOK) + { + return RT_FALSE; + } + + /* Reinitialize */ + struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + config.baud_rate = BAUD_RATE_115200; + config.rx_bufsz = RT_SERIAL_TC_RXBUF_SIZE; + config.tx_bufsz = RT_SERIAL_TC_TXBUF_SIZE; + + rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); + + result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); + if (result != RT_EOK) + { + LOG_E("Open uart device failed."); + return RT_FALSE; + } + + rt_uint8_t *uart_write_buffer; + rt_uint32_t i; + uart_write_buffer = (rt_uint8_t *)rt_malloc(2048); + for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++) + { + srand(rt_tick_get()); + if (RT_EOK != tx_timeout_test_item(uart_write_buffer, 1024 + (rand() % 1024))) + { + LOG_E("test_item failed."); + result = -RT_ERROR; + goto __exit; + } + } + +__exit: + rt_free(uart_write_buffer); + rt_device_close(&serial->parent); + rt_thread_mdelay(5); + return result == RT_EOK ? RT_TRUE : RT_FALSE; +} + +static void tc_uart_api(void) +{ + uassert_true(uart_api() == RT_TRUE); +} + +static rt_err_t utest_tc_init(void) +{ + LOG_I("UART TEST: Please connect Tx and Rx directly for self testing."); + return RT_EOK; +} + +static rt_err_t utest_tc_cleanup(void) +{ + rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME); + while (rt_device_close(uart_dev) != -RT_ERROR); + return RT_EOK; +} + +static void testcase(void) +{ + UTEST_UNIT_RUN(tc_uart_api); +} + +UTEST_TC_EXPORT(testcase, "testcases.drivers.uart_timeout_txb", utest_tc_init, utest_tc_cleanup, 30); + +#endif /* BSP_UART2_TX_USING_DMA */ +#endif /* TC_UART_USING_TC */ |
