1*10465441SEvalZero #include <rtthread.h>
2*10465441SEvalZero #include "tc_comm.h"
3*10465441SEvalZero
4*10465441SEvalZero static struct rt_thread thread1;
5*10465441SEvalZero static struct rt_thread thread2;
6*10465441SEvalZero static char thread1_stack[THREAD_STACK_SIZE];
7*10465441SEvalZero static char thread2_stack[THREAD_STACK_SIZE];
8*10465441SEvalZero
9*10465441SEvalZero volatile static rt_uint32_t t1_count = 0;
10*10465441SEvalZero volatile static rt_uint32_t t2_count = 0;
thread1_entry(void * parameter)11*10465441SEvalZero static void thread1_entry(void* parameter)
12*10465441SEvalZero {
13*10465441SEvalZero while (1)
14*10465441SEvalZero {
15*10465441SEvalZero t1_count ++;
16*10465441SEvalZero }
17*10465441SEvalZero }
18*10465441SEvalZero
thread2_entry(void * parameter)19*10465441SEvalZero static void thread2_entry(void* parameter)
20*10465441SEvalZero {
21*10465441SEvalZero while (1)
22*10465441SEvalZero {
23*10465441SEvalZero t2_count ++;
24*10465441SEvalZero }
25*10465441SEvalZero }
26*10465441SEvalZero
thread_same_priority_init()27*10465441SEvalZero rt_err_t thread_same_priority_init()
28*10465441SEvalZero {
29*10465441SEvalZero rt_err_t result;
30*10465441SEvalZero
31*10465441SEvalZero result = rt_thread_init(&thread1,
32*10465441SEvalZero "t1",
33*10465441SEvalZero thread1_entry, RT_NULL,
34*10465441SEvalZero &thread1_stack[0], sizeof(thread1_stack),
35*10465441SEvalZero THREAD_PRIORITY, 10);
36*10465441SEvalZero if (result == RT_EOK)
37*10465441SEvalZero rt_thread_startup(&thread1);
38*10465441SEvalZero else
39*10465441SEvalZero tc_stat(TC_STAT_END | TC_STAT_FAILED);
40*10465441SEvalZero
41*10465441SEvalZero result = rt_thread_init(&thread2,
42*10465441SEvalZero "t2",
43*10465441SEvalZero thread2_entry, RT_NULL,
44*10465441SEvalZero &thread2_stack[0], sizeof(thread2_stack),
45*10465441SEvalZero THREAD_PRIORITY, 5);
46*10465441SEvalZero if (result == RT_EOK)
47*10465441SEvalZero rt_thread_startup(&thread2);
48*10465441SEvalZero else
49*10465441SEvalZero tc_stat(TC_STAT_END | TC_STAT_FAILED);
50*10465441SEvalZero
51*10465441SEvalZero return result;
52*10465441SEvalZero }
53*10465441SEvalZero
54*10465441SEvalZero #ifdef RT_USING_TC
_tc_cleanup()55*10465441SEvalZero static void _tc_cleanup()
56*10465441SEvalZero {
57*10465441SEvalZero /* lock scheduler */
58*10465441SEvalZero rt_enter_critical();
59*10465441SEvalZero
60*10465441SEvalZero if (thread1.stat != RT_THREAD_CLOSE)
61*10465441SEvalZero rt_thread_detach(&thread1);
62*10465441SEvalZero if (thread2.stat != RT_THREAD_CLOSE)
63*10465441SEvalZero rt_thread_detach(&thread2);
64*10465441SEvalZero
65*10465441SEvalZero /* unlock scheduler */
66*10465441SEvalZero rt_exit_critical();
67*10465441SEvalZero
68*10465441SEvalZero rt_kprintf("t1_count=%d t2_count=%d\n",t1_count,t2_count);
69*10465441SEvalZero
70*10465441SEvalZero if (t1_count / t2_count != 2)
71*10465441SEvalZero tc_stat(TC_STAT_END | TC_STAT_FAILED);
72*10465441SEvalZero else
73*10465441SEvalZero tc_done(TC_STAT_PASSED);
74*10465441SEvalZero }
75*10465441SEvalZero
_tc_thread_same_priority()76*10465441SEvalZero int _tc_thread_same_priority()
77*10465441SEvalZero {
78*10465441SEvalZero t1_count = 0;
79*10465441SEvalZero t2_count = 0;
80*10465441SEvalZero
81*10465441SEvalZero /* set tc cleanup */
82*10465441SEvalZero tc_cleanup(_tc_cleanup);
83*10465441SEvalZero
84*10465441SEvalZero thread_same_priority_init();
85*10465441SEvalZero
86*10465441SEvalZero return 100;
87*10465441SEvalZero }
88*10465441SEvalZero FINSH_FUNCTION_EXPORT(_tc_thread_same_priority, a same priority thread test);
89*10465441SEvalZero #else
rt_application_init()90*10465441SEvalZero int rt_application_init()
91*10465441SEvalZero {
92*10465441SEvalZero thread_same_priority_init();
93*10465441SEvalZero
94*10465441SEvalZero return 0;
95*10465441SEvalZero }
96*10465441SEvalZero #endif
97