0.线程创建与删除

117 阅读3分钟

动态线程创建

创建

/*
 * name:线程名字,entry:线程的入口函数,parameter:函数参数
 * stack_size:线程堆栈的大小,priority:优先级,tick:时间片(运行长短)(相同优先级的线程)
 * 返回值:线程控制块指针
 */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_t th1_ptr;
//创建一个线程入口函数
void th1_printf(void *parameter)
{
    while(1){
        //串口打印函数,__FILE__:打印所在目录及文件名
        //__FUNCTION__:打印函数名(th2_printf),__LINE__:打印这个语句在第几行
        rt_kprintf("In %s, the %s is runing the %d!\r\n", __FILE__, __FUNCTION__, __LINE__);    
        rt_thread_mdelay(1000); //延时
    }
}
//创建
th1_ptr = rt_thread_create("th1", th1_printf, NULL, 1024, 20, 10);
​
//判断线程是否创建成功
if(th1_ptr == RT_NULL)
{
    LOG_E("th1_printf rt_thread_create failed!\r\n");
    return -RT_ENOMEM;  //RT_ENOMEM:12
}
​
//使用
rt_thread_startup(th1_ptr);

启动线程

//定义 thread:要启动的线程
rt_err_t rt_thread_startup(rt_thread_t thread)//使用
rt_thread_startup(th1_ptr);

静态线程创建

创建

/*
 * thread:线程控制块指针(struct rt_thread类型结构体指针),name:线程名字
 * entry:线程的入口函数,parameter:函数参数,stack_start:线程栈的起始地址
 * stack_size:线程堆栈的大小,priority:优先级,tick:时间片(运行长短)(单位毫秒)
 * 返回值:
 */
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)
//创建struct rt_thread类型的结构体
struct rt_thread th2_ptr;
//创建一个数组用于存放线程执行时需要的空间
rt_uint8_t th2_stack[1024];
​
//创建一个线程入口函数
void th2_printf(void *parameter)
{
    while(1){
        //串口打印函数,__FILE__:打印所在目录及文件名
        //__FUNCTION__:打印函数名(th2_printf),__LINE__:打印这个语句在第几行
        rt_kprintf("In %s, the %s is runing the %d!\r\n", __FILE__, __FUNCTION__, __LINE__);
        rt_thread_mdelay(1000); //延时
    }
}
​
//创建
rt_thread_init(&th2_ptr, "th2", th2_printf, NULL, th2_stack, 1024, 20, 10);
​
//判断线程是否创建成功
if(ret == RT_EOK)
{
    LOG_E("th2_printf rt_thread_create failed!\r\n");
    return ret;
}
​
//运行
rt_thread_startup(&th2_ptr);

动态、静态线程删除

动态删除

//定义 thread:要删除的线程
rt_err_t rt_thread_delete(rt_thread_t thread)
    
rt_thread_delete(th1_ptr);

静态删除

//定义 thread:要删除的线程
rt_err_t rt_thread_delete(rt_thread_t thread)rt_thread_detach(&th2_ptr);  //删除线程

线程基础知识

线程状态

线程状态

优先级

RTOS通过线程的优先级来抢占调度线程

高优先级的任务先运行,低优先级任务会被高优先级任务打断,被抢占的任务会进入就绪态

线程中不能有死循环,必须有挂起操作(线程状态图中的1或延时)

时间片

在线程优先级相同的情况下,通过时间片来控制相同优先级线程执行时间