线程属性
rtthread操作系统是多任务,多线程来操作,线程主要是由两类线程,(1)系统线程.(2)用户线程。rtthread的最小操纵单位就是线程,那么,线程由什么来设置的呢,答案就是线程结构体,一个名为rt_thread的结构体,该结构体如下
该结构体包含了结构体对象的信息,例如姓名,类型,标志等,还包含了内存空间等信息,例如指针、栈大小、地址,入口函数等信息,还包含状态码等信息
包含了优先级,事件集等信息。还包括一个默认的清除函数,当线程退出时,由idle线程回调这个函数,进行用户层面的清楚现场,这个函数由用户自己编写。
线程状态
rtthread线程状态主要由以下状态
(1)初始状态,线程初始化完成,未被调用状态
(2)就绪态,线程排队,等待被调用状态
(3)运行态,
(4)挂起状态,线程被挂起,阻塞,例如调用延时函数
(5)关闭状态。
注意:为了避免线程堵塞,导致低优先级线程得不到调用,必须在代码中调用延时函数等,让低优先级线程得到执行。
线程间状态切换如图:
创建线程,线程辅助函数
rtthread支持动态创建线程、静态创建线程两种创建线程的方式,分别调用的函数是,rt_thread_create("th_demo", th1_enrty, NULL,1024, 20, 5)
,该函数返回的是线程属性结构体;静态创建线程调用rt_thread_init(&th2, "th2_demo", th2_entry, NULL, th2_stack, 512, 19, 5);
,该函数返回的是调用状态rt_err_t
,这两个函数都能创建线程,区别在于creat线程是由系统自动分配线程内存,init函数是给出具体的内存地址,在内存地址上建立线程,注意返回值的不同。
线程辅助函数如下
(1)获得当前线程
rt_thread_t rt_thread_self`
返回线程句柄。
(2)让出处理器资源。
rt_err_t rt_thread_yield(void)
让出后进入就绪态,并未休眠
(3)线程睡眠。
rt_thread_mdelay();
(4)线程控制函数。
rt_err_t rt_thread_control(rt_thread_t thread,int cmd,void *arg)
(5)设置和删除idle线程的hook函数
钩子函数表示系统在没有到达线程处理函数时,函数对该线程调度之间信息的处理和截获,并且一直跟随该线程。
rt_err_t rt_thread_idle_delhook(void(*hook)(void))
空闲线程不允许处于挂起状态,比如delay,sleep函数
(6)调度器的hook函数
系统处于线程运行、中断触发、响应中断、切换线程的过程中,用户想知道在一个时刻发生了什么样的线程切换,可以通过设置相应的钩子函数,在系统线程切换时,这个钩子函数被调用。
void scheduler_hook(struct rt_thread *from, struct rt_thread *to)
{
rt_kprintf("from:%s --->to:%s\n",from->name,to->name);
}
rt_scheduler_sethook(scheduler_hook);