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_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之后不会释放空间。
具体使用哪种方式创建线程,根据实际情况选取。