RTT之理解线程

线程与任务等同。

可见,每个线程切换时都会将上下文保存到自己的栈中。

另外从编程手册的timeslice_sample.c这个例子来看,不同的线程调用同一个入口函数,实际上就是将函数的参数及局部变量复制到不同线程的堆栈中,这样就可以实现重入了。

线程控制块结构体rt_thread,也是在rtdef.h中定义。

线程状态转换图:

RTT的就绪态等同于运行态,实际上是不存在运行态的。

线程操作:

创建线程:rt_thread_create动态线程,是从系统自动从内存堆上分配栈空间和线程句柄。(初始化heap之后才能使用)

rt_thread_init():是用户分配栈空间和线程句柄。

删除线程:rt_thread_delete()对应动态线程删除。rt_thread_detach()对应动态线程删除。删除不应在本线程内调用。

启动线程:进入调度序列,并将线程状态改为就绪态。真正的程序运行,是调用调度rt_system_scheduler_start(),启动系统调度器,然后在就绪表中选择一个优先级最高的执行。

默认是启动了三个线程,main,tshell,tidel0,下面看一下,这三个线程的优先级分别是多少??

main线程定义在component.c中如下图:

其中RT_THREAD_PRIORITY_MAX是在rtconfig.h中定义的,最大优先级数,默认是32 ,32/3=10,所以main的优先级是10。

tshell线程定义在shell.c中

FINSH_THREAD_PRIORITY,也是定义在rtconfig.h中,默认值是20,可见main线程优先级高于FinSH线程.

最后看一下tidel0线程:

tidel0线程调用是在componet.c中启动函数rtthread_startup(void)中,如下图


定义在系统文件idle.c文件中,是静态创建的一个线程,如下图:

优先级为31级,是最小的。

 

获取当前执行的线程句柄:rt_thread_self(),可以知道是哪个线程在运行。

线程让出处理器使用资源:

rt_thread_yield():在就绪表中删除此线程,然后再挂到就绪表的尾部。

rt_schedule():切换最高优先级线程。

线程睡眠:使线程(主动)挂起指定的时间后,再恢复运行。

rt_thread_sleep():

rt_thread_delay():以上两个以系统tick为单位。

rt_thread_mdelay():以时间ms为单位。
线程挂起和恢复:rt_thread_suspend(),挂起,不推荐使用。

rt_thread_resume():恢复挂起的线程,重新进就绪表
控制线程:更改线程的优先级,开启/关闭线程。

设置和删除空闲钩子函数:执行空闲函数时要做的事情。

空闲函数永远不会被挂起。

设置调度器钩子函数:在系统切换时,会被调用的函数。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章