thread_mbox_tc.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /*
  2. * Copyright (c) 2006-2025, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2025-07-03 rcitach test case for mbox
  9. */
  10. #include <rtthread.h>
  11. #include <rthw.h>
  12. #include <rtdevice.h>
  13. #include <utest.h>
  14. #include <utest_assert.h>
  15. #include <perf_tc.h>
  16. static rt_sem_t sem1 = RT_NULL;
  17. static rt_sem_t complete_sem = RT_NULL;
  18. static rt_mailbox_t perf_thread_mbox = RT_NULL;
  19. static void perf_thread_mbox1(void *parameter)
  20. {
  21. rt_ubase_t recv = 0;
  22. rt_err_t ret = RT_EOK;
  23. rt_perf_t *perf = (rt_perf_t *)parameter;
  24. while (1)
  25. {
  26. ret = rt_mb_recv(perf_thread_mbox, &recv, RT_WAITING_FOREVER);
  27. rt_perf_stop(perf);
  28. if (ret != RT_EOK)
  29. {
  30. LOG_E("mbox recv value error!\n");
  31. rt_mb_delete(perf_thread_mbox);
  32. return;
  33. }
  34. if (perf->count >= UTEST_SYS_PERF_TC_COUNT)
  35. {
  36. rt_mb_delete(perf_thread_mbox);
  37. rt_sem_delete(sem1);
  38. return;
  39. }
  40. rt_sem_release(sem1);
  41. }
  42. }
  43. static void perf_thread_mbox2(void *parameter)
  44. {
  45. rt_perf_t *perf = (rt_perf_t *)parameter;
  46. rt_err_t ret = RT_EOK;
  47. while (1)
  48. {
  49. if (perf->count >= UTEST_SYS_PERF_TC_COUNT)
  50. {
  51. rt_sem_release(complete_sem);
  52. return;
  53. }
  54. rt_sem_take(sem1, RT_WAITING_FOREVER);
  55. rt_perf_start(perf);
  56. rt_mb_send(perf_thread_mbox, 1);
  57. }
  58. }
  59. rt_err_t rt_perf_thread_mbox(rt_perf_t *perf)
  60. {
  61. rt_thread_t thread1 = RT_NULL;
  62. rt_thread_t thread2 = RT_NULL;
  63. # if __STDC_VERSION__ >= 199901L
  64. rt_strcpy(perf->name,__func__);
  65. #else
  66. rt_strcpy(perf->name,"rt_perf_thread_mbox");
  67. #endif
  68. perf_thread_mbox = rt_mb_create("perf_thread_mbox", 1, RT_IPC_FLAG_PRIO);
  69. if (perf_thread_mbox == RT_NULL)
  70. {
  71. LOG_E("perf thread mbox create failed.");
  72. return -RT_ERROR;
  73. }
  74. sem1 = rt_sem_create("sem1", 1, RT_IPC_FLAG_FIFO);
  75. complete_sem = rt_sem_create("complete", 0, RT_IPC_FLAG_FIFO);
  76. thread1 = rt_thread_create("perf_thread_mbox1", perf_thread_mbox1, perf,
  77. THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
  78. if (thread1 == RT_NULL)
  79. {
  80. LOG_E("perf_thread_mbox1 create failed.");
  81. return -RT_ERROR;
  82. }
  83. thread2 = rt_thread_create("perf_thread_mbox2", perf_thread_mbox2, perf,
  84. THREAD_STACK_SIZE, THREAD_PRIORITY + 1, THREAD_TIMESLICE);
  85. if (thread2 == RT_NULL)
  86. {
  87. LOG_E("perf_thread_mbox2 create failed.");
  88. return -RT_ERROR;
  89. }
  90. rt_thread_startup(thread1);
  91. rt_thread_startup(thread2);
  92. rt_sem_take(complete_sem, RT_WAITING_FOREVER);
  93. rt_perf_dump(perf);
  94. rt_sem_delete(complete_sem);
  95. return RT_EOK;
  96. }