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