thread_sem_tc.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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 semaphore
  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 perf_thread_sem = RT_NULL;
  17. static rt_event_t perf_thread_event = RT_NULL;
  18. static rt_sem_t complete_sem = RT_NULL;
  19. #define EVENT_FLAG (1 << 0)
  20. static void perf_thread_sem1(void *parameter)
  21. {
  22. rt_err_t ret = RT_EOK;
  23. rt_perf_t *perf = (rt_perf_t *)parameter;
  24. rt_event_send(perf_thread_event, EVENT_FLAG);
  25. while (1)
  26. {
  27. ret = rt_sem_take(perf_thread_sem, RT_WAITING_FOREVER);
  28. rt_perf_stop(perf);
  29. if(ret != RT_EOK)
  30. {
  31. LOG_E("Sem recv error!");
  32. rt_sem_delete(perf_thread_sem);
  33. return;
  34. }
  35. if (perf->count >= UTEST_SYS_PERF_TC_COUNT)
  36. {
  37. rt_event_delete(perf_thread_event);
  38. rt_sem_delete(perf_thread_sem);
  39. return;
  40. }
  41. rt_event_send(perf_thread_event, EVENT_FLAG);
  42. }
  43. }
  44. static void perf_thread_sem2(void *parameter)
  45. {
  46. rt_err_t ret = RT_EOK;
  47. rt_perf_t *perf = (rt_perf_t *)parameter;
  48. rt_uint32_t recv = 0;
  49. while (1)
  50. {
  51. if (perf->count >= UTEST_SYS_PERF_TC_COUNT)
  52. {
  53. rt_sem_release(complete_sem);
  54. return;
  55. }
  56. ret = rt_event_recv(perf_thread_event, EVENT_FLAG,
  57. (RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR),
  58. RT_WAITING_FOREVER, &recv);
  59. if(ret != RT_EOK)
  60. {
  61. LOG_E("Event reception failed");
  62. rt_event_delete(perf_thread_event);
  63. rt_sem_release(complete_sem);
  64. return;
  65. }
  66. rt_perf_start(perf);
  67. rt_sem_release(perf_thread_sem);
  68. }
  69. }
  70. rt_err_t rt_perf_thread_sem(rt_perf_t *perf)
  71. {
  72. rt_thread_t thread1 = RT_NULL;
  73. rt_thread_t thread2 = RT_NULL;
  74. # if __STDC_VERSION__ >= 199901L
  75. rt_strcpy(perf->name,__func__);
  76. #else
  77. rt_strcpy(perf->name,"rt_perf_thread_sem");
  78. #endif
  79. perf_thread_sem = rt_sem_create("perf_thread_sem", 0, RT_IPC_FLAG_FIFO);
  80. if (perf_thread_sem == RT_NULL)
  81. {
  82. LOG_E("perf_thread_sem create failed.");
  83. return -RT_ERROR;
  84. }
  85. perf_thread_event = rt_event_create("perf_thread_event", RT_IPC_FLAG_PRIO);
  86. complete_sem = rt_sem_create("complete", 0, RT_IPC_FLAG_FIFO);
  87. thread1 = rt_thread_create("perf_thread_sem1", perf_thread_sem1, perf,
  88. THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
  89. if (thread1 == RT_NULL)
  90. {
  91. LOG_E("perf_thread_sem1 create failed.");
  92. return -RT_ERROR;
  93. }
  94. thread2 = rt_thread_create("perf_thread_sem2", perf_thread_sem2, perf,
  95. THREAD_STACK_SIZE, THREAD_PRIORITY + 1, THREAD_TIMESLICE);
  96. if (thread2 == RT_NULL)
  97. {
  98. LOG_E("perf_thread_sem2 create failed.");
  99. return -RT_ERROR;
  100. }
  101. rt_thread_startup(thread1);
  102. rt_thread_startup(thread2);
  103. rt_sem_take(complete_sem, RT_WAITING_FOREVER);
  104. rt_perf_dump(perf);
  105. rt_sem_delete(complete_sem);
  106. return RT_EOK;
  107. }