主要是以下几个函数,
```rt_err_t rt_thread_init(struct rt_thread thread,
const char name,
void (entry)(void parameter),
void parameter,
void stack_start,
rt_uint32_t stack_size,
rt_uint8_t priority,
rt_uint32_t tick);
rt_err_t rt_thread_detach(rt_thread_t thread);
rt_thread_t rt_thread_create(const char name,
void (entry)(void parameter),
void parameter,
rt_uint32_t stack_size,
rt_uint8_t priority,
rt_uint32_t tick);
rt_thread_t rt_thread_self(void);
rt_thread_t rt_thread_find(char *name);
rt_err_t rt_thread_startup(rt_thread_t thread);
rt_err_t rt_thread_delete(rt_thread_t thread);
rt_err_t rt_thread_yield(void);
rt_err_t rt_thread_delay(rt_tick_t tick);
rt_err_t rt_thread_mdelay(rt_int32_t ms);
rt_err_t rt_thread_control(rt_thread_t thread, int cmd, void arg);
rt_err_t rt_thread_suspend(rt_thread_t thread);
rt_err_t rt_thread_resume(rt_thread_t thread);
void rt_thread_timeout(void parameter);```
可以看到作为继承于object的子类,rt_thread类基本上重写了object相关的所有函数,现在来逐一分析每个函数所做的操作:
一、首先是rt_thread_init()以及rt_thread_create()
rt_thread_init()与rt_thread_create()的差异同样是在一个是静态线程的初始化,一个是动态的创建线程,函数内部的差异仅仅是在rt_thread_create()会为创建的线程从堆中申请栈空间并为要实例化的rt_thread申请内存。
这两个函数可以看做C++中的构造函数。
```rt_thread_t rt_thread_create(const char name,
void (entry)(void parameter),
void parameter,
rt_uint32_t stack_size,
rt_uint8_t priority,
rt_uint32_t tick)
{
struct rt_thread thread;
void stack_start;
/**申请内存**/
thread = (struct rt_thread *)rt_object_allocate(RT_Object_Class_Thread,
name);
if (thread == RT_NULL)
return RT_NULL;
stack_start = (void *)RT_KERNEL_MALLOC(stack_size);
if (stack_start == RT_NULL)
{
/* allocate stack failure */
rt_object_delete((rt_object_t)thread);
return RT_NULL;
}
/*/
/**成员初始化*/
_rt_thread_init(thread,
name,
entry,
parameter,
stack_start,
stack_size,
priority,
tick);
/*/
return thread;
}
RTM_EXPORT(rt_thread_create);```
两个函数最终都在_rt_thread_init()这个私有函数中进行成员初始化。
_rt_thread_init主要执行以下操作:
1.双向链表指针指向自身。
2.赋值入口函数地址。
3.赋值入口函数参数。
4.线程栈相关的初始化:
赋值栈顶地址,赋值栈大小。
将栈空间所有ram设置为’#’(一般是用做检测栈的使用率)。
调用rt_hw_stack_init()对栈顶数据进行初始化(这个设计到线程切换时,保存当前线程的相应PC地址,临时变量,以及MCU寄存器的值等既保存线程的上下文),之后会详细介绍这个函数。
5.初始化优先级。
6.初始化init_tick,remaining_tick (作用上文提过)
7.初始化错误标志。
8.初始化线程状态。
9.初始化clean_up函数和user_data,这里直接初始化为0,默认不使用。
10.初始化定时器,将定时器的time_out回调设置为rt_thread_timeout(),这个函数会将线程从阻塞队列中移出,加入就绪队列,并将error成员置为RT_ETIMEOUT
11.调用rt_thread_inited_hook()钩子函数
```static rt_err_t _rt_thread_init(struct rt_thread *thread, |
给你点赞