Skip to content

Commit 797b9a4

Browse files
committed
add thread mbox test code
1 parent 2a6baf8 commit 797b9a4

File tree

1 file changed

+192
-0
lines changed

1 file changed

+192
-0
lines changed
Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
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+
17+
#define PERF_COUNT 1000
18+
#define TIME_OUT_TIME 10
19+
#define OUTTIME_TICK (RT_TICK_PER_SECOND * TIME_OUT_TIME)
20+
static rt_sem_t sem1 = RT_NULL;
21+
static rt_mailbox_t perf_thread_mbox = RT_NULL;
22+
volatile static uint16_t thread_event_count = 0;
23+
#define THREAD_STACK_SIZE 1024
24+
#define THREAD_PRIORITY 10
25+
#define THREAD_TIMESLICE 5
26+
27+
struct perf_time
28+
{
29+
rt_uint32_t start_time;
30+
rt_uint32_t end_time;
31+
rt_uint32_t use_time;
32+
};
33+
static struct perf_time use_time[PERF_COUNT];
34+
35+
#ifdef USING_HWTIME_AS_TIME_REF
36+
static rt_device_t hw_dev = RT_NULL;
37+
static rt_hwtimerval_t timer_val;
38+
39+
static rt_uint32_t get_timer_us(void)
40+
{
41+
if (hw_dev && rt_device_read(hw_dev, 0, &timer_val, sizeof(rt_hwtimerval_t)))
42+
{
43+
return (rt_uint32_t)(timer_val.sec * 1000000 + timer_val.usec);
44+
}
45+
return 0;
46+
}
47+
#endif
48+
49+
static void perf_thread_mbox1(void *parameter)
50+
{
51+
rt_ubase_t recv = 0;
52+
rt_uint32_t total_time = 0;
53+
while (1)
54+
{
55+
rt_mb_recv(perf_thread_mbox, &recv, RT_WAITING_FOREVER);
56+
#ifdef USING_HWTIME_AS_TIME_REF
57+
use_time[thread_event_count].end_time = get_timer_us();
58+
use_time[thread_event_count].use_time = use_time[thread_event_count].end_time - use_time[thread_event_count].start_time;
59+
#else
60+
use_time[thread_event_count].end_time = rt_tick_get();
61+
use_time[thread_event_count].use_time = (use_time[thread_event_count].end_time - use_time[thread_event_count].start_time) / RT_TICK_PER_SECOND;
62+
use_time[thread_event_count].use_time += ((use_time[thread_event_count].end_time - use_time[thread_event_count].start_time) % RT_TICK_PER_SECOND) * (1000000u / RT_TICK_PER_SECOND);
63+
#endif
64+
if (recv != 1)
65+
{
66+
LOG_E("mbox recv value error!\n");
67+
rt_mb_delete(perf_thread_mbox);
68+
return;
69+
}
70+
71+
recv = 0;
72+
total_time += use_time[thread_event_count].use_time;
73+
thread_event_count ++;
74+
if (thread_event_count >= PERF_COUNT)
75+
{
76+
LOG_I("Mbox test completed: %d iterations, total time = %lu us, average = %lu us per mbox",
77+
PERF_COUNT, total_time, total_time / PERF_COUNT);
78+
79+
rt_mb_delete(perf_thread_mbox);
80+
rt_sem_delete(sem1);
81+
return;
82+
}
83+
rt_sem_release(sem1);
84+
}
85+
}
86+
87+
static void perf_thread_mbox2(void *parameter)
88+
{
89+
rt_err_t ret = RT_EOK;
90+
while (1)
91+
{
92+
if (thread_event_count >= PERF_COUNT)
93+
{
94+
return;
95+
}
96+
ret = rt_sem_take(sem1, OUTTIME_TICK);
97+
if(ret == -RT_ETIMEOUT)
98+
{
99+
LOG_W("Timeout when waiting for sem1");
100+
rt_sem_delete(sem1);
101+
return;
102+
}
103+
#ifdef USING_HWTIME_AS_TIME_REF
104+
use_time[thread_event_count].start_time = get_timer_us();
105+
#else
106+
use_time[thread_event_count].start_time = rt_tick_get();
107+
#endif
108+
rt_mb_send(perf_thread_mbox, 1);
109+
}
110+
}
111+
112+
static void rt_perf_thread_mbox(void)
113+
{
114+
rt_thread_t thread1 = RT_NULL;
115+
rt_thread_t thread2 = RT_NULL;
116+
117+
perf_thread_mbox = rt_mb_create("perf_thread_mbox", 1, RT_IPC_FLAG_PRIO);
118+
if (perf_thread_mbox == RT_NULL)
119+
{
120+
LOG_E("perf thread mbox create failed.");
121+
return;
122+
}
123+
124+
sem1 = rt_sem_create("sem1", 1, RT_IPC_FLAG_FIFO);
125+
126+
thread1 = rt_thread_create("perf_thread_mbox1", perf_thread_mbox1, RT_NULL,
127+
THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
128+
if (thread1 == RT_NULL)
129+
{
130+
LOG_E("perf_thread_mbox1 create failed.");
131+
return;
132+
}
133+
134+
thread2 = rt_thread_create("perf_thread_mbox2", perf_thread_mbox2, RT_NULL,
135+
THREAD_STACK_SIZE, THREAD_PRIORITY + 1, THREAD_TIMESLICE);
136+
if (thread2 == RT_NULL)
137+
{
138+
LOG_E("perf_thread_mbox2 create failed.");
139+
return;
140+
}
141+
142+
rt_thread_startup(thread1);
143+
rt_thread_startup(thread2);
144+
}
145+
146+
static rt_err_t utest_tc_init(void)
147+
{
148+
#ifdef USING_HWTIME_AS_TIME_REF
149+
rt_hwtimerval_t timeout_s;
150+
int ret = RT_EOK;
151+
hw_dev = rt_device_find(UTEST_HWTIMER_DEV_NAME);
152+
if (hw_dev == RT_NULL)
153+
{
154+
ret = RT_ERROR;
155+
LOG_E("hwtimer sample run failed! can't find %s device!", UTEST_HWTIMER_DEV_NAME);
156+
return ret;
157+
}
158+
159+
ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);
160+
if (ret != RT_EOK)
161+
{
162+
LOG_E("open %s device failed!", UTEST_HWTIMER_DEV_NAME);
163+
return ret;
164+
}
165+
166+
timeout_s.sec = TIME_OUT_TIME; /* s */
167+
timeout_s.usec = 0; /* us */
168+
if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(rt_hwtimerval_t)) != sizeof(rt_hwtimerval_t))
169+
{
170+
ret = RT_ERROR;
171+
LOG_E("set timeout value failed");
172+
return ret;
173+
}
174+
#endif
175+
176+
return RT_EOK;
177+
}
178+
179+
static rt_err_t utest_tc_cleanup(void)
180+
{
181+
#ifdef USING_HWTIME_AS_TIME_REF
182+
if (hw_dev) rt_device_close(hw_dev);
183+
#endif
184+
return RT_EOK;
185+
}
186+
187+
static void testcase(void)
188+
{
189+
UTEST_UNIT_RUN(rt_perf_thread_mbox);
190+
}
191+
192+
UTEST_TC_EXPORT(testcase, "testcase.pref.mbox", utest_tc_init, utest_tc_cleanup, 10);

0 commit comments

Comments
 (0)