一个线程要成为可执行的对象就必须由操作系统的内核来为它创建(初始化)一个线程句柄。可以通过如下的函数接口来创建一个线程。
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);
调用这个函数时,系统会从动态堆内存中分配一个线程句柄(即TCB,线程控制块)以及按照参数中指定的栈大小从动态堆内存中分配相应的空间。分配出来的栈空间是按照rtconfig.h中配置的RT_ALIGN_SIZE方式对齐。
线程安全
安全
中断例程
不可调用
函数参数
参数 描述
name 线程的名称;线程名称的最大长度由rtconfig.h中定义的
RT_NAME_MAX宏指定,多余部分会被自动截掉。
entry 线程入口函数
parameter 线程入口函数参数;
stack_size 线程栈大小,单位是字节。在大多数系统中需要做栈空间地址对齐(例如ARM体系结构中需要向4字节地址对齐)。
priority 线程的优先级。优先级范围根据系统配置情况(rtconfig.h中的RT_THREAD_PRIORITY_MAX宏定义),如果支持的是256级优先级,那么范围是从0 ~ 255,数值越小优先级越高,0代表最高优先级。
tick 线程的时间片大小。时间片(tick)的单位是操作系统的时钟节拍。当系统中存在相同优先级线程时,这个参数指定线程一次调度能够运行的最大时间长度。这个时间片运行结束时,调度器自动选择下一个就绪态的同优先级线程进行运行。
函数返回
创建成功返回线程句柄;否则返回RT_NULL。
注:确定一个线程的栈空间大小,是一件令人头痛的事情。在RT-Thread中,可以先指定一个稍微大的栈空间,例如指定大小为1024或2048,然后在FinSH shell中通过list_thread()命令查看线程运行的过程中线程所使用的栈的大小,通过此命令,能够看到从线程启动运行时,到当前时刻点,线程使用的最大栈深度,从而可以确定栈空间的大小并加以修改)。
下面举例创建一个线程加以说明:
#include <rtthread.h>
#define THREAD_PRIORITY 25
#define THREAD_STACK_SIZE 512
#define THREAD_TIMESLICE 5
static rt_thread_t tid1 = RT_NULL;
static rt_thread_t tid2 = RT_NULL;
/* 线程入口 /
static void thread_entry(void parameter)
{
rt_uint32_t count = 0;
rt_uint32_t no = (rt_uint32_t) parameter; /* 获得线程的入口参数 */
while (1)
{
/* 打印线程计数值输出 */
rt_kprintf("thread%d count: %d\n", no, count ++);
rt_thread_delay(10);
}
}
int rt_application_init()
{
/* 创建线程1 /
tid1 = rt_thread_create("t1",
thread_entry, (void)1, /* 线程入口是thread_entry, 入口参数是1 */
THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
if (tid1 != RT_NULL)
rt_thread_startup(tid1);
else
return -1;
/* 创建线程2 /
tid2 = rt_thread_create("t2",
thread_entry, (void)2, /* 线程入口是thread_entry, 入口参数是2 */
THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
if (tid2 != RT_NULL)
rt_thread_startup(tid2);
else
return -1;
return 0;
}
原作者:书栈网