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