xref: /nrf52832-nimble/rt-thread/examples/kernel/thread_priority.c (revision 104654410c56c573564690304ae786df310c91fc)
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