动态线程创建
创建
/*
* 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或延时)
时间片
在线程优先级相同的情况下,通过时间片来控制相同优先级线程执行时间