uart_nonblocking_tx.c 3.6 KB

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