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