1.线程的概念
线程可以理解为一个个相互独立运行的单元任务。这些任务共同使用CPU和内存空间等系统资源,不过,每一时刻,只能有一个线程在运行。
各个线程的运行是相互独立,不断切换的,所以线程都要有自己的堆栈,从而再次运行时能够恢复运行环境。
2.线程的调度
RT-Thread提供的线程调度器是基于优先级的全抢占式调度,但中断函数和临界段程序是不可抢占的。
系统总共支持256个优先级,即0~255,数值越小,优先级越高,0为最高优先级,255是空闲线程的优先级,用户一般不会使用。当有比当前运行线程优先级更高的线程就绪时,当前线程将立刻被换出,高优先级线程抢占运行。
RT-Thread还支持创建相同优先级的线程。这些线程采用时间片轮转进行调度,但前提是没有更高优先级的线程出现。
所有准备好的线程都链接到了优先级队列中,选择优先级高的线程就是在优先级数组中寻找最高优先级线程对应的非空链表。
3.线程的状态
操作系统中的线程有的在执行,有的被抢占,还有的即将被运行,也就是说有多种运行状态。RT-Thread分5种运行状态:
①初始态:RT_THREAD_INIT,创建线程时设置为初始态;
②就绪态:RT_THREAD_READY,线程在就绪列表中,具备执行的条件,等待CPU运行;
③运行态:RT_THREAD_RUNNING,线程正在被CPU执行;
④挂起态:RT_THREAD_SUSPEND,线程正在等待某个信号量、消息队列、、事件或被延时等情况,不在就绪列表;
⑤关闭态:RT_THREAD_CLOSE,线程运行结束,等待系统回收资源。
线程的状态是不断转换的,用一张图来表示线程状态迁移:
4.建立线程实例
下面介绍一下线程创建的步骤,以下发生在main.c源文件中。
(1)定义线程控制块和声明线程函数
static rt_thread_t example_thread = RT_NULL; //初始化线程控制块
static void example_thread_entry(void *parameter); //线程函数声明
(2)在main函数中创建线程
example_thread = //线程控制块指针
rt_thread_create("example", //线程名字
example_thread_entry, //线程入口函数
RT_NULL, //线程入口函数参数
512, //线程栈大小
3, //线程的优先级
20); //线程时间片(单位tick)
// 启动线程,开启调度
if(example_thread != RT_NULL)
rt_thread_startup(example_thread);
else
return -1;
(3)编写线程函数内容
static void example_thread_entry(void *parameter)
{
while(1){ //无限循环,该线程不会被系统删除
//若无这个循环,则线程运行完毕后会被系统自动删除
// ....用户自定义线程操作
}
}
通过以上三个步骤,就能建立可运行的线程了。线程还有其他一些操作操作函数,如:
①线程删除函数:rt_thread_delete(rt_thread_t thread);
②线程挂起函数:rt_thread_suspend(rt_thread_t thread);
③线程恢复函数:rt_thread_resume(rt_thread_t thread);
④......