创建方式有两种:
一是动态创建,有操作系统运行时动态分配内存。
二是静态创建,静态线程是指线程控制块、线程运行栈一般都设置为全局变量, 在编译时就被确定、被分配处理,内核不负责动态分配内存空间。
动态创建:使用rt_thread_create()函数
void demo1_thread_task_entry(void *parameter)
{
while(1)
{
rt_kprintf("demo1 task runing...\n");
rt_thread_mdelay(1000);
}
}
rt_thread_t th_id1 = NULL;
th_id1 = rt_thread_create("demo1", demo1_thread_task_entry, NULL, 1024, 20, 5);
if(th_id1 == RT_NULL)
{
LOG_E("rt_thread_create demo1 failed...\n");
return 0;
}
LOG_D("rt_thread_create demo1 successed ....\n");
rt_thread_startup(th_id1);
rt_thread_create函数最后一个参数tick,表示当有相同优先级的任务时,轮流执行tick的时间
对于一些使用 rt_thread_create() 创建出来的线程,当不需要使用,或者运行出错时,我们可以使用下面的函数接口来从系统中把线程完全删除掉:
rt_err_t rt_thread_delete(rt_thread_t thread);
静态创建:使用rt_thread_init()函数
struct rt_thread th3; //全局变量,线程控制
u_char rt3_stack[512] = {0};//全局变量,线程栈空间
void demo3_thread_task_entry(void *parameter)
{
int i = 1;
for (i=1;i<10;i++)
{
LOG_D("demo3_thread runing...");
rt_thread_mdelay(1000);
}
}
int ret;
ret = rt_thread_init(&th3, "demo3", demo3_thread_task_entry, NULL, rt3_stack, sizeof(rt3_stack), 19, 5);
if(ret <0){
LOG_E("rt_thread_init demo3 failed...\n");
return ret;
}
rt_thread_startup(&th3);
对于用 rt_thread_init() 初始化的线程,使用 rt_thread_detach() 将使线程对象在线程队列和内核对象管理器中被脱离。
rt_err_t rt_thread_detach (rt_thread_t thread);