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