uart_nonblocking_tx.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #include <rtthread.h>
  2. #include <rtdevice.h>
  3. #include "utest.h"
  4. #define UART_SEND_TIMES 100
  5. #define UART_TEST_NUMBER 6
  6. #ifdef UTEST_SERIAL_TC
  7. static rt_bool_t nonblock_write(rt_device_t uart_dev)
  8. {
  9. rt_size_t wr_sz = 0, tmp = 0, i, write_num_array[UART_TEST_NUMBER], total_write_num[UART_TEST_NUMBER], index;
  10. rt_tick_t tick1, tick2, tick_array[UART_TEST_NUMBER];
  11. rt_uint8_t uart_write_buffer[1024];
  12. for (i = 0; i < 1024; i++)
  13. uart_write_buffer[i] = '0' + (i % 50);
  14. /* make sure device is closed and reopen it */
  15. while (rt_device_close(uart_dev) != -RT_ERROR);
  16. uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME);
  17. rt_device_open(uart_dev, RT_DEVICE_FLAG_TX_NON_BLOCKING | RT_DEVICE_FLAG_RX_NON_BLOCKING);
  18. LOG_D("\nNONBLOCKING WRITE BEGIN\n");
  19. index = 0;
  20. tmp = 0;
  21. tick1 = rt_tick_get();
  22. for (i = 0; i < UART_SEND_TIMES; i++)
  23. {
  24. wr_sz = 0;
  25. while (wr_sz < 1024)
  26. wr_sz += rt_device_write(uart_dev, 0, &uart_write_buffer[wr_sz], 1024 - wr_sz);
  27. tmp += wr_sz;
  28. }
  29. tick2 = rt_tick_get();
  30. total_write_num[index] = UART_SEND_TIMES * 1024;
  31. tick_array[index] = tick2 - tick1;
  32. write_num_array[index++] = tmp;
  33. wr_sz = 0;
  34. tick1 = rt_tick_get();
  35. while (wr_sz < 8)
  36. wr_sz += rt_device_write(uart_dev, 0, &uart_write_buffer[wr_sz], 8 - wr_sz);
  37. tick2 = rt_tick_get();
  38. total_write_num[index] = 8;
  39. tick_array[index] = tick2 - tick1;
  40. write_num_array[index++] = wr_sz;
  41. wr_sz = 0;
  42. tick1 = rt_tick_get();
  43. while (wr_sz < 32)
  44. wr_sz += rt_device_write(uart_dev, 0, &uart_write_buffer[wr_sz], 32 - wr_sz);
  45. tick2 = rt_tick_get();
  46. total_write_num[index] = 32;
  47. tick_array[index] = tick2 - tick1;
  48. write_num_array[index++] = wr_sz;
  49. wr_sz = 0;
  50. tick1 = rt_tick_get();
  51. while (wr_sz < 128)
  52. wr_sz += rt_device_write(uart_dev, 0, &uart_write_buffer[wr_sz], 128 - wr_sz);
  53. tick2 = rt_tick_get();
  54. total_write_num[index] = 128;
  55. tick_array[index] = tick2 - tick1;
  56. write_num_array[index++] = wr_sz;
  57. wr_sz = 0;
  58. tick1 = rt_tick_get();
  59. while (wr_sz < 512)
  60. wr_sz += rt_device_write(uart_dev, 0, &uart_write_buffer[wr_sz], 512 - wr_sz);
  61. tick2 = rt_tick_get();
  62. total_write_num[index] = 512;
  63. tick_array[index] = tick2 - tick1;
  64. write_num_array[index++] = wr_sz;
  65. wr_sz = 0;
  66. tick1 = rt_tick_get();
  67. while (wr_sz < 1024)
  68. wr_sz += rt_device_write(uart_dev, 0, &uart_write_buffer[wr_sz], 1024 - wr_sz);
  69. tick2 = rt_tick_get();
  70. total_write_num[index] = 1024;
  71. tick_array[index] = tick2 - tick1;
  72. write_num_array[index++] = wr_sz;
  73. LOG_D("\nNONBLOCKING_TX END\n");
  74. for (i = 0; i < index; i++)
  75. {
  76. LOG_D("\nNONBLOCKING_MODE : write %d / %d bytes in %d ticks\n", write_num_array[i], total_write_num[i], tick_array[i]);
  77. rt_thread_mdelay(1000);
  78. }
  79. return RT_TRUE;
  80. }
  81. static void uart_test_nonblocking_tx(void)
  82. {
  83. rt_device_t uart_dev;
  84. uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME);
  85. uassert_not_null(uart_dev);
  86. uassert_true(nonblock_write(uart_dev));
  87. }
  88. static rt_err_t utest_tc_init(void)
  89. {
  90. return RT_EOK;
  91. }
  92. static rt_err_t utest_tc_cleanup(void)
  93. {
  94. rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME);
  95. while (rt_device_close(uart_dev) != -RT_ERROR);
  96. return RT_EOK;
  97. }
  98. static void testcase(void)
  99. {
  100. UTEST_UNIT_RUN(uart_test_nonblocking_tx);
  101. }
  102. UTEST_TC_EXPORT(testcase, "uart_nonblocking_tx", utest_tc_init, utest_tc_cleanup, 10);
  103. #endif