RTThread:静态线程&动态线程

一、静态线程创建 rt_thread_init


rt_err_t rt_thread_init	
(	struct rt_thread * 	thread,
    const char * 	name,
    void(*)(void *parameter) 	entry,
    void * 	parameter,
    void * 	stack_start,
    rt_uint32_t 	stack_size,
    rt_uint8_t 	priority,
    rt_uint32_t 	tick 
)

/**
初始化线程

此函数将初始化一个线程,通常用于初始化一个静态线程对象。

参数
thread	线程句柄。线程句柄由用户提供出来,并指向对应的线程控制块内存地址。
name	线程的名称;线程名称的最大长度由 rtconfig.h 中定义的 RT_NAME_MAX 宏指定,多余部分会被自动截掉。
entry	线程的入口函数
parameter	入口函数的传入参数
stack_start	线程堆栈的起始地址
stack_size	线程栈大小,单位是字节。在大多数系统中需要做栈空间地址对齐(例如 ARM 体系结构中需要向 4 字节地址对齐)。
priority	线程的优先级。优先级范围根据系统配置情况(rtconfig.h 中的 RT_THREAD_PRIORITY_MAX 宏定义),如果支持的是 256 级优先级,那么范围是从 0 ~ 255,数值越小优先级越高,0 代表最高优先级。
tick	线程的时间片大小。当系统中存在相同优先级线程时,这个参数指定线程一次调度能够运行的最大时间长度。
返回
成功返回 RT_EOK, 失败则返回 -RT_ERROR

**/

静态线程:

参数1:线程控制块的地址,所以事先得定义一个线程控制块。

参数2:名称,为线程起名字。

参数3:函数指针,指向线程的入口代码。

参数4:向线程代码中传入相关参数,不传入参数,设置为0。

参数5:线程栈空间的起始地址。

参数6:栈空间的大小。

参数7:线程的优先级,线程执行的优先顺序,数字越小,线程执行的优先级就会越高。

参数8:线程的时间片参数

二、动态线程创建 rt_thread_create


rt_thread_t rt_thread_create	
(	const char * 	name,
    void(*)(void *parameter) 	entry,
    void * 	parameter,
    rt_uint32_t 	stack_size,
    rt_uint8_t 	priority,
    rt_uint32_t 	tick 
)	

/***
创建线程

该函数将创建一个线程对象并分配线程对象内存和堆栈。

参数
name	线程的名称;线程名称的最大长度由 rtconfig.h 中的宏RT_NAME_MAX 指定,多余部分会被自动截掉。
entry	线程的入口函数
parameter	入口函数的传入参数
stack_size	线程堆栈的大小
priority	线程的优先级
tick	线程的时间片大小。当系统中存在相同优先级线程时,这个参数指定线程一次调度能够运行的最大时间长度。
返回
被创建的线程对象句柄
***/

动态线程:

参数1:线程的名称。

参数2:线程的入口代码。

参数3:向线程代码中传入相关参数,不传入参数,设置为0。

参数4:栈空间的大小。

参数5:线程的优先级,线程执行的优先顺序,数字越小,线程执行的优先级就会越高。

参数6:线程的时间片参数

使用动态定义方式rt_thread_create时,RT-Thread系统会动态申请线程控制块和堆栈空间。在编译时,编译器是不会感知到这段空间的,只有在程序运行时,RT-Thread才会从系统堆中申请分配这段内存空间,当不需要使用该线程时,调用rt_thread_delete函数将这段申请的内存空间重新释放到内存堆中。

三、两种方式的比较

静态定义方式会占用RW空间段,但是不需要动态分配内存,运行效率高;

动态定义方式不会占用额外的RW空间,占用空间小,但是运行时需要动态分配内存,效率没有静态方式高;

区别:

①动态线程不需要输入栈的起始地址,不需要定义线程的控制块,只要指出线程栈的大小。

②静态线程的线程控制块和线程栈都需要静态地定义出来,而动态线程则不需要提前定义出来,是运行的时候自动分配的。

运行效率上,静态线程的线程控制块和线程栈都在芯片的RAM中,速度没有区别,但是系统在外部RAM中的时候,创建的外部动态线程的线程栈和线程控制块的效率下降。
 

动态创建的线程,可以被delete(删除),并且delete之后会释放出空间;静态创建的线程,不能被delete,只能被detach(从线程队列中脱离),且detach之后不会释放空间。

具体使用哪种方式创建线程,根据实际情况选取。

你可能感兴趣的:(RTThread,线程,动态线程,静态线程,RTThread)