什么是线程
之前几个篇幅我们已经成功让RT-Thread系统在我们的实体板卡上面奔跑起来了,那么下面我们就要开始学习如何把系统运用在我们的项目上面,让我们开发起来更加得心应手。
![494939b56cb56e981ed38939dfeb3fc8.png](https://i-blog.csdnimg.cn/blog_migrate/14ad8fe3260d73a7dc7637b7a3d8d392.jpeg)
图片来源网络
在最初介绍介绍RT-Thread系统中就有说过,一个嵌入式实时系统的核心就是系统调度器,而调度器的最小执行单位就是线程,也就是RT-Thread中的Thread,那么什么是线程呢
百度百科上面的解释如下:线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
我们把系统调度器比喻成为一个吊机,那么线程就像是吊机吊起来的货物,我们要完成货物的吊运,在同一时间只能吊一个货物到指定地点,那么我们就要根据货物的重要性来先后进行吊运,这就形成了系统的调度。
![245ab9f99fbce037e5e9c0f0d30828e8.png](https://i-blog.csdnimg.cn/blog_migrate/3f92050a03a7517ed65d4b2814553dda.jpeg)
图片来源网络
为什么需要线程调度
了解完成什么是线程后,当然要知道我们为什么需要线程调度,其实在最开始介绍系统的时候就有提到过,单片机在同一个时间只能做一件事情 ,就像我们写无系统的裸机程序时候,主要的执行程序都抛在main函数的while循环里面,然后一件一件的执行,这样就会有一个问题,在排队执行的过程中,后面的任务需要等待前面的任务执行,这样就导致任务执行的时效性变差,浪费单片机性能。
![8821c02c25effa02424c772a2f340e5a.png](https://i-blog.csdnimg.cn/blog_migrate/1060ac1f5779a4d2fd820cd6ed82fd2d.jpeg)
图片来源网络
我们来举一个简单的例子:我们需要一个系统运行指示灯1秒钟亮灭循环,还需要每500毫秒在串口打印一个耗时1~5毫秒的信息,如果我们用while循环来实现,那么我们写出来代码就是先让灯点亮并输出第一次串口信息,然后进行延时500毫秒,输出第二次串口信息,然后延时500毫秒关闭灯并输出第三次串口信息,如此循环下去。这样运行下来我们就会发现一个问题,那就是灯亮灭的时间不准确,因为串口占用了时间,如果一次串口打印需要5毫秒,那么灯的延时就会变成500+5+500=1005毫秒。对于运行灯而言这5毫秒的差距可以忽略,但是如果是其他的实时性要求高的任务呢,这就很严重了。
![cb6678f0a7077b09443bfad7d5db0a25.png](https://i-blog.csdnimg.cn/blog_migrate/a75047dd0ee3754ea3c4eff4feaef424.jpeg)
循环方式实现
下面我们来看下加入了任务调度的情况,我们还是根据上面的流程创建一个线程让系统运行指示灯亮起来,然后进行延时1秒,然后再让灯灭掉,如此循环,然后创建第二个线程开始使用串口发送数据,然后延时500毫秒,如此循环。这样看起来好像两个循环就冲突了,其实不然,他的秘密就隐藏在系统的延时函数中,当我们调用了延时函数后,这个线程就会被挂起,可以理解为暂时冻结它,让出了CPU的资源,在延时这段时间里,CPU就可以去执行串口打印数据的任务,这样就能实现了在系统指示灯延时中去执行串口打印任务,这样可以大大提高了CPU的运行效率。
![ff43c28dc05900e805b8d561bff023c5.png](https://i-blog.csdnimg.cn/blog_migrate/e74a1259875ee79ecada947262d5c5b7.jpeg)
任务实现