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 messagequeue
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 static rt_sem_t sem1 = RT_NULL;
19 static rt_sem_t complete_sem = RT_NULL;
20 static rt_mq_t perf_thread_mq = RT_NULL;
21
perf_thread_mq1(void * parameter)22 static void perf_thread_mq1(void *parameter)
23 {
24 char recv = 0;
25 rt_perf_t *perf = (rt_perf_t *)parameter;
26 while (1)
27 {
28 rt_mq_recv(perf_thread_mq, &recv, 1, RT_WAITING_FOREVER);
29 rt_perf_stop(perf);
30 if (recv != 'A')
31 {
32 LOG_E("mq recv value error!");
33 rt_mq_delete(perf_thread_mq);
34 return;
35 }
36
37 if (perf->count >= UTEST_SYS_PERF_TC_COUNT)
38 {
39 rt_mq_delete(perf_thread_mq);
40 rt_sem_delete(sem1);
41 return;
42 }
43 rt_sem_release(sem1);
44 }
45 }
46
perf_thread_mq2(void * parameter)47 static void perf_thread_mq2(void *parameter)
48 {
49 rt_perf_t *perf = (rt_perf_t *)parameter;
50 char send = 'A';
51 while (1)
52 {
53 if (perf->count >= UTEST_SYS_PERF_TC_COUNT)
54 {
55 rt_sem_release(complete_sem);
56 return;
57 }
58 rt_sem_take(sem1, RT_WAITING_FOREVER);
59 rt_perf_start(perf);
60 rt_mq_send(perf_thread_mq, &send, 1);
61 }
62 }
63
rt_perf_thread_mq(rt_perf_t * perf)64 rt_err_t rt_perf_thread_mq(rt_perf_t *perf)
65 {
66 rt_thread_t thread1 = RT_NULL;
67 rt_thread_t thread2 = RT_NULL;
68
69 # if __STDC_VERSION__ >= 199901L
70 rt_strcpy(perf->name,__func__);
71 #else
72 rt_strcpy(perf->name,"rt_perf_thread_mq");
73 #endif
74
75 perf_thread_mq = rt_mq_create("perf_thread_mq", 1, 1, RT_IPC_FLAG_PRIO);
76 if (perf_thread_mq == RT_NULL)
77 {
78 LOG_E("perf_thread_mq create failed.");
79 return -RT_ERROR;
80 }
81
82 sem1 = rt_sem_create("sem1", 1, RT_IPC_FLAG_FIFO);
83 complete_sem = rt_sem_create("complete", 0, RT_IPC_FLAG_FIFO);
84
85 thread1 = rt_thread_create("perf_thread_mq1", perf_thread_mq1, perf,
86 THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
87 if (thread1 == RT_NULL)
88 {
89 LOG_E("perf_thread_mq1 create failed.");
90 return -RT_ERROR;
91 }
92
93 thread2 = rt_thread_create("perf_thread_mq2", perf_thread_mq2, perf,
94 THREAD_STACK_SIZE, THREAD_PRIORITY + 1, THREAD_TIMESLICE);
95 if (thread2 == RT_NULL)
96 {
97 LOG_E("perf_thread_mq2 create failed.");
98 return -RT_ERROR;
99 }
100
101 rt_thread_startup(thread1);
102 rt_thread_startup(thread2);
103
104 rt_sem_take(complete_sem, RT_WAITING_FOREVER);
105 rt_perf_dump(perf);
106 rt_sem_delete(complete_sem);
107 return RT_EOK;
108 }
109
110