Thread.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. */
  9. #include "Thread.h"
  10. using namespace rtthread;
  11. Thread::Thread(rt_uint32_t stack_size,
  12. rt_uint8_t priority,
  13. rt_uint32_t tick,
  14. const char *name)
  15. : _entry(RT_NULL), _param(RT_NULL), started(false)
  16. {
  17. rt_event_init(&_event, name, 0);
  18. _thread = rt_thread_create(name,
  19. (thread_func_t)func,
  20. this,
  21. stack_size,
  22. priority,
  23. tick);
  24. }
  25. Thread::Thread(void (*entry)(void *p),
  26. void *p,
  27. rt_uint32_t stack_size,
  28. rt_uint8_t priority,
  29. rt_uint32_t tick,
  30. const char *name)
  31. : _entry(RT_NULL), _param(p), started(false)
  32. {
  33. rt_event_init(&_event, name, 0);
  34. _thread = rt_thread_create(name,
  35. (thread_func_t)func,
  36. this,
  37. stack_size,
  38. priority,
  39. tick);
  40. }
  41. Thread::~Thread()
  42. {
  43. rt_thread_delete(_thread);
  44. }
  45. bool Thread::start()
  46. {
  47. if (rt_thread_startup(_thread) == RT_EOK)
  48. {
  49. started = true;
  50. }
  51. return started;
  52. }
  53. void Thread::sleep(int32_t millisec)
  54. {
  55. rt_int32_t tick;
  56. if (millisec < 0)
  57. tick = 1;
  58. else
  59. tick = rt_tick_from_millisecond(millisec);
  60. rt_thread_delay(tick);
  61. }
  62. void Thread::func(Thread *pThis)
  63. {
  64. if (pThis->_entry != RT_NULL)
  65. {
  66. pThis->_entry(pThis->_param);
  67. }
  68. else
  69. {
  70. pThis->run();
  71. }
  72. rt_event_send(&pThis->_event, 1);
  73. }
  74. void Thread::run()
  75. {
  76. /* please overload this method */
  77. }
  78. void Thread::wait(int32_t millisec)
  79. {
  80. join(millisec);
  81. }
  82. void Thread::join(int32_t millisec)
  83. {
  84. if (started)
  85. {
  86. rt_int32_t tick;
  87. if (millisec < 0)
  88. tick = -1;
  89. else
  90. tick = rt_tick_from_millisecond(millisec);
  91. rt_event_recv(&_event, 1, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, tick, RT_NULL);
  92. }
  93. }