thread_dynamic_simple.c 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. * 程序清单:动态线程
  3. *
  4. * 这个程序会初始化2个动态线程,它们拥有共同的入口函数,但参数不相同
  5. */
  6. #include <rtthread.h>
  7. #include "tc_comm.h"
  8. /* 指向线程控制块的指针 */
  9. static rt_thread_t tid1 = RT_NULL;
  10. static rt_thread_t tid2 = RT_NULL;
  11. /* 线程入口 */
  12. static void thread_entry(void* parameter)
  13. {
  14. rt_uint32_t count = 0;
  15. rt_uint32_t no = (rt_uint32_t) parameter; /* 获得正确的入口参数 */
  16. while (1)
  17. {
  18. /* 打印线程计数值输出 */
  19. rt_kprintf("thread%d count: %d\n", no, count ++);
  20. /* 休眠10个OS Tick */
  21. rt_thread_delay(10);
  22. }
  23. }
  24. int thread_dynamic_simple_init()
  25. {
  26. /* 创建线程1 */
  27. tid1 = rt_thread_create("t1",
  28. thread_entry, (void*)1, /* 线程入口是thread_entry, 入口参数是1 */
  29. THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
  30. if (tid1 != RT_NULL)
  31. rt_thread_startup(tid1);
  32. else
  33. tc_stat(TC_STAT_END | TC_STAT_FAILED);
  34. /* 创建线程2 */
  35. tid2 = rt_thread_create("t2",
  36. thread_entry, (void*)2, /* 线程入口是thread_entry, 入口参数是2 */
  37. THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
  38. if (tid2 != RT_NULL)
  39. rt_thread_startup(tid2);
  40. else
  41. tc_stat(TC_STAT_END | TC_STAT_FAILED);
  42. return 0;
  43. }
  44. #ifdef RT_USING_TC
  45. static void _tc_cleanup()
  46. {
  47. /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */
  48. rt_enter_critical();
  49. /* 删除线程 */
  50. if (tid1 != RT_NULL && tid1->stat != RT_THREAD_CLOSE)
  51. rt_thread_delete(tid1);
  52. if (tid2 != RT_NULL && tid2->stat != RT_THREAD_CLOSE)
  53. rt_thread_delete(tid2);
  54. /* 调度器解锁 */
  55. rt_exit_critical();
  56. /* 设置TestCase状态 */
  57. tc_done(TC_STAT_PASSED);
  58. }
  59. int _tc_thread_dynamic_simple()
  60. {
  61. /* 设置TestCase清理回调函数 */
  62. tc_cleanup(_tc_cleanup);
  63. thread_dynamic_simple_init();
  64. /* 返回TestCase运行的最长时间 */
  65. return 100;
  66. }
  67. /* 输出函数命令到finsh shell中 */
  68. FINSH_FUNCTION_EXPORT(_tc_thread_dynamic_simple, a dynamic thread example);
  69. #else
  70. /* 用户应用入口 */
  71. int rt_application_init()
  72. {
  73. thread_dynamic_simple_init();
  74. return 0;
  75. }
  76. #endif