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