1.线程的概念
我们曾经编写的程序像是c语言或python等,执行方式都是这样子的
对于有些情况我们希望这样的主函数在多一点,像这样子
那我们有这么多的主函数有什么好处吗?那点分为一些情况:
程序简单,完成功能少的时候,就比如说我们只是想要运算1+1等于2运算,对我来说一个主函数就够用了,所有这时候过多的主函数反而会成为负担。
程序中等,完成功能较多,比如说我要完成一个寻迹、避障等这类单一的任务,那么有一个主函数我可以完成,有更多的主函数也很不错,对于这种情况大概所有人都会选择一个主函数,因为多个主函数还点在学东西,难道不是吗?所有这种情况下还是选择单一主函数的人多。
程序庞大,完成功能十分的多,比如一个心电仪、智能家居等这类庞大的项目,一个主函数需要实现的东西太多太多,多到让编写者头疼脑胀,等到之后编写完毕,在调试过程和之后的维护过程,你会为你程序而崩溃。在这种情况使用多个主函数同时运行,会大幅度节省你的开发时间和调试时间。
而对于我们平日常见的项目来说,如此简单或中等的项目少之又少(ps:这么简单还赚钱哪会轮的到你?)所以我们平日常见的项目就是庞大的项目,所以学习多个主函数来使得代码变得更简单这是非常有必要的。当你学会这种方法你会对之前的项目嗤之以鼻。
那我为什么多个主函数会使得编写者节省很多时间呢?大家可能有学过单片机,有些人也做过一些小项目,但大家都注意到了一个问题吗?那就是**时序,当我们做一个大项目时,首先第一个问题就是时序,那什么需要时序呢?传感器的采集、信号的分析和运算、结果的输出等等,这些都需要时序**。(ps:时序就是完成特定任务的时间)
当只有一个主函数时,我举个简单的例子:程序既要执行按键扫描,又要执行跑马灯,而且两者之间还要有联系,比如
- 第一个按键按下—第一个灯开始闪烁,第二个灯不闪烁
- 第二个按键按下—第二个灯开始闪烁,第一个灯不闪烁
- 第三个按键按下—第一个灯和第二个灯同时开始闪烁
对于按键来说,我需要每20ms检测那个按键按下。对于灯来说我需要500ms进行交替闪烁(20ms闪烁人眼看不见)。所以这就出现时间的矛盾,有些人就会说,我用定时器中断不好吗?但一个单片机又有几个定时器供你这么用呢?所以大多数人都会这么用:
但是如果这样写:
- 理想情况:按键需要20ms,跑马灯需要500ms.
- 实际情况:按键需要520ms,跑马灯需要520ms
所以单纯的累加是不行的,那难道没有其他的办法吗?答案是有!我在下提供代码但不给解析(ps:跟本章节内容不相干所以不讲)
1 | int main (void) |
但如果是多个主函数呢?那程序是这样执行的:
可以看到这不就是很简单,因为每一个都是一个主函数,所以没有那些时序的干扰,编写的时候就像编写一个简单的项目那么简单。
对于这种多个主函数,我们把每个主函数都叫做一个线程,线程和每个主函数在理念上是等价的。
2.操作系统的概念
我们知道了每个主函数都可以称之为一个线程,那实现这种多个主函数的方式我们称之为**操作系统**,操作系统很常见,像你正在使用的Windows,我们称之为Windows操作系统。还有Linux等,这些都是对于运算力足够的芯片和电脑上,那我们常见的单片机都用什么操作系统呢?有以下
ucosIII/ucosII 操作系统,这是在过去很盛行的操作系统
freeRTOS 操作系统,开源的操作系统
Threadx 操作系统,微软推出开源的完备的操作系统(我们主讲)
还有很多我就不一一列举了,大家可以上网站上查找。
可能有些人有疑问,就是我就一个核心的单片机,电脑是多个核心的芯片,多个核心有多个线程,但一个核心?怎么能有多个线程呢?这就涉及到调度算法,具体的调度算法可以查看下一章的讲解。
我在这里也可以简要的说明和讲解一下,你可以回想一下,你的程序,是延时时间长还是实际执行的时间长呢?的确在我们写一个大型工程中,使用延时都是成ms级别的,实际运行功能代码的时候估计也就20us以内,所以很大一部分核心都在延时上浪费了,而操作系统就是可以将这种浪费运用起来。
-------------本文结束感谢您的阅读-------------
本文链接: http://1ywd1.github.io/2021/02/06/Theardx%E7%AC%AC%E4%B8%80%E7%AB%A0%E8%AE%B2%E8%A7%A3/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!