thread_event_tc.c 2.9 KB

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