好,那我们下面就来看到这个操作系统的一个任务状态啊,他的这个状态是五种对吧?这五种状态怎么样来切换,怎么样来实现?这我们要去知道的一点。比如我们来画一个图啊, 呃,我这里一个图来体现出他五种状态啊。首先最开始的啊,比如我们现在呢,这是第一种状态。我我以框图的形式来体现啊, 他是一个什么?停止或者休眠的状态,这是我们任务的第一种状态对吧?也在这里写的停止或休眠。那这个状态呢?停止就像这个任务还没有产生嘛,对吧?如果说这个任务一旦被产生,那么他就会到这来下一个状态。这个状态就是什么呢?就是那 这个状态怎么来的吧?怎么来?你可以再理解啊。如果说我从停止态切换到这个所谓的就绪来,那么他是怎么样来,怎么样来过来的,对吧?怎么样从这个状态到这个状态来的啊?有两种状态,两种情况。第一种呢,任务被创建。我们一个任务一旦被创建出来,他肯定是默 默认,就是一种状态,叫做就绪状态啊,默认就处于就绪的状态了啊。那么如果说还有一种状态是休眠的情况啊,就任务在休眠,然后呢,被唤醒,那么他都会切换的一个状态,叫做就绪态。那么只有在就绪态的任务呢,他才有资格到我们 cpu 执行那一步。也就什么呢? 运行切换到一个运行的状态,就绪的时候呢,他怎么样切换到运行呢?从这到这,他只有通过什么呢?得到一个什么呢?得到 cpu, 也就我在系统调度的过程中,给我这一个所谓的一个就绪,他的任务呢,分配了一个什么 cpu 啊,所以这个呢是任务呢,得到 cpu, 那么他就会切换到我们的一个运行态啊, 切换到运行态。那么当在运行态的过程中,我这个任务,如果说什么产生了一个中断,那么他就会从一个运行态切换到一个什么呢?中断状态切换到中断对吧?这个时候怎么样切换过来呢?如果说发生了一 件事情叫做中断,产生什么对应的中断请求,就在运行的过程中对吧?这个任务啊,在运行状态中,这个状态叫做什么呢?切换对吧,就会切换到中断,中断的一个状态对吧,然后并且保护。中断完成以后就是回来这条路啊,我们再捋对吧, 来,那回来呢,他也一样的,会有几件事情回来,就有一个情况对吧?中断吗?执行结束吧,中断处理完成。这几个状态之间切换要很清楚啊,这是一个情况对吧?那运行态我同样也会回到就绪态。什么情况会回到就绪态呢?当任务的 cpu 被其他任务抢走了, 或者呢发生任务切换对吧?就我这个任务呢,切换到别的任务中去了,那么这个时候我这个运行中的任务呢,他就会把 cpu 交出去,交出去以后,他就回到这个状态,就是就绪态,就绪态。那么同样的就绪态的时候,如果说你这个任务啊,他处于就绪态对吧?那么他是一个什么呢?像那些任人宰割的一个羔羊一样啊,如果 在这个过程中,他被某些人对吧啊,某些不法分子啊,假设啊啊,被某些人进行什么呢?删除,就是我这个任务被干掉了对吧?被干掉了,那么他就回到什么停止拍了这个任务也就什么消亡了啊, 这是一条路。那么还有一条路呢,是从运行态会到这这个上面,你可以理解为这不是正常的路对吧?那这里也就是我们在这个位置所标的等 带或者挂起状态。而我们这个任务管理函数呢,有一种叫做挂起函数啊,就是可以把这个任务挂起来,就是我在运行的过程中,可以把自己给挂起来。所以呢,在运行态的时候,如果说如果遇到了一件事情,他要切换到这个状态, 有两种情况。两种情况,第一种情况就是调用什么化钱术。呃被就调用什么调用化钱术,化钱术啊。因为此时呢,我是自己就处于这个运行态的啊,等于我现在假设我是 a 任务对吧?那我这个 a 任务呢,我 自己就处于运行态。那我处于运行态的过程中,我自己切换到挂起状态。所以呢,这种只有什么呢?自己调用对应的挂起函数,把自己挂起来啊,这叫自己挂自己啊。还有一种掉。 第二种就什么呢?我在运行的时候,我调用什么呢?延时函数。但这个延时呢,有点有点奇怪啊,他是什么呢?会放弃 cpu。 比如我这里呢,延时一个 延时多久呢?延时五百毫秒对吧?五百毫秒。那么这个五百毫秒的过程中,这个任务呢,他不会占用这 cpu 的。那我这五百呢? 其他的任务,他会去抢占的,抢用的 cpu。 当我五百毫秒结束以后,那么他才会回来的,清楚吧。所以呢,这是什么呢?这个叫做操作系统,你可以利用操作系统的延长是吧?跟我们普通的延时是不一样的。那这种情况呢,他就会切换到什么?等待或者挂起状态。通过这两种情况切换呢,所以大家清楚啊。那么这里切换 过来以后呢?在等待状态呢,他是没办法直接回来的。所以这个方向呢,你可以理解,理解为是单向的。只有说我从运行来切换到等待或者挂机状态,不可能说存在这一个状态切换回这个状态的。那么在这个状态呢?如果说我挂起了自己,那我就只有等待什么呢?别人来唤醒我啊, 只有等待别人唤醒我。所以这里还有过程对吧?有两种状态切换到就绪来啊,有两种情况对吧?第一种,别的人唤醒我对吧? 唤醒别人会来唤醒我。这第一种。第二种呢,就是延时结束对吧?延时结束了,那我同样的会回到什么?回到这个就绪态。注意啊,这里是回到这个就绪态,不是说回到运行态啊,因为我们是从运行态走的对吧?但是你不能直接回到运行态的, 需要重新由就绪态由得到 cpu, 然后再切换到我们一起来。可以再理解同样的原理。在这个过程中,如果被 什么被其他任务删除了吧,那么他就回到什么停止状态。这里也有两种情况嘛,对吧?第一种被其他任务删除,删除他就直接停止状态了嘛。第二种,调用什么被休眠。被调用那个休眠函数,把我这个任务呢休眠了啊,那么他就会回到什么停止 的休眠状态啊。可以这样去理解。那这就是我们这个操作系统中的呃,这个五种状态之间的一个切换。这个关系图啊,一定要搞清楚啊,为什么从头 开始发一遍啊,因为我们待会是要一步一步推理的,哪个任务能运行,哪个任务能拿 cpu 对吧,哪个任务能参与系统调度,这都是我们要在运行之前就要清楚的一些点。所以这个就是一个重点内容。
粉丝1618获赞2763

那首先我们要讲的是一个操作系统,对吧?那么我们在嵌入式中他也叫操作系统,但是呢这个操作系统跟我们平时所理解的操作系统是有出路的。 首先我们先来谈一下,就在我们计算机中的操作系统,那他这种是为了什么呢?控制和管理什么?整个计算机的,就我们的应届软件资源都由他来调控的,比如说我们在电脑上,对吧?我现在插一个 u 盘或者插一个扩展物进去,那这个扩展物是由我们的操作系统自动去搜寻他的一个驱动,然后安装驱动,直接就可以用的,对不对? 那像我们这个最明显的是什么呢?在温七里面,温七里面你一般用一个什么气垫,对吧?或者你用鼠标用个什么都需要安装它的一个驱动版, 对不对?那温时间呢?这这是一种一个升级版的操作系统,可以这样理解,对吧?那么它这里面呢就有操作系统可以实现什么呢?软硬件之间一个对接啊,这是可以说我们一个大的操作系统,对吧?大的操作系统它分为这么一些部分,它是介于什么呢? 介于这个用户和这个硬件之间的,就下面我们底层的纯硬件,对吧?像我们电脑都是什么英特处理器啊,内容的,对吧?就他负责管理这个电脑上的硬件和他之间的一个通信吧。你这样去理解啊,我们要调入哪些音频设备?比如我现在播放视频,对吧?视频是我一个软件或浏览器里面播放的, 那么这个浏览器里面播放的视频是需要调用我的扬声器和我的一个什么屏幕来进行播放啊?这种就是都是通过什么软件,通过我们这个操作系统来调用这对应的一些接口去处理我们这个硬件的资源啊, 可以再理解。但是呢这种操作系统他是有一个什么呢?有个单元叫做 mmumu 呢?叫做 memory, 什么?就一个内存的一个什么管理单元嘛,对吧? mm 就这种所谓的内存管理单元呢?他的一个作用就是什么呢?或者他是区分,区分我们所讲的这个温池操作系统,跟我们今天要讲的这 嵌入式操作系统的一个本质,一个本质啊,那么这个 m m u 呢?它是能够负责将我们这个设备之间,对吧?设备之间,比如我现在运行了很多个进程,比如我现在随便打开很多个文件,假设我在这里我建立很多个 tst 文件,比如我现在有个一,对吧一号,然后这个一文件呢,我可以给他打开很多个,比如这打开了一个,然后我再给他打开一个,好这两个了,对吧?我再开一个,再开一个,开三个,对吧?那么这三个进程,这个在我们这个运行的过程中,我们将它称作为进程,对吧?运行中的程序嘛,对吧?那比如我在这个程序里面写个一, 然后呢?我在这个程序里面写个写个二,然后在这个程序里面写个三啊?我,我对应的我这三个窗口,但是这三个窗口呢?我们编辑的都是什么?都是同一个进程啊?都是同一个进程,所以我们这个保存之前他们这个对应的操作的空间呢?或者我这个一二三,对吧?一二三, 呃,或者说我们这个一二三呢,他们应该都是什么都分别是要写到是一这个文 dst 文本的什么这个第一个字符的位置吧,啊?都在写到这个位置了,所以说啊,我们这三个字符他写到的都是一个位置,但是我们是不同的内容,而且是同一时间操作的,对吧? 那像这种呢,就相当于是一个进程呢,每一个进程都在我的内存中啊,就是我们的运行内存啊,分配了一块进程空间给他,那么这块进程空间是彼此独立的,但是最终 如果说我什么按了 ctrl s, 并且把它关掉了以后,那么这个所谓的进程呢,就会把我这个写的数据呢,最终的真正的写入到内存中去啊, 像这个时候他只是写在我们的预计内存中啊,可以再理解啊,如果说你最终保存他是会写到我们的硬盘空间中的啊,那这是一个一个保存的过程,对吧?那这个过程呢,就需要我们的什么呢?这个东西 映射啊,我这三个进程,对吧?不同的进程我要操作到不同的空间啊,就有个这样的单元来管理的啊,所以这也是什么呢?我们这个操 操作系统啊,温石的操作系统,他区别于什么呢?区别于我们嵌入式操作系统的一个本质,因为他有这个单元,我们在嵌入式中是没有他的啊,没有他的,他这里这个多进程能协调关系,是由 m u 来实现的 的,各个进程之间的空间管理啊,内存分配啊,都有这个来操作的哈,所以这这个点,但我们在切入式操作系统之后,就是因为他没有这个 mu, 所以我们在我们的 sgm 三二上面是没有办法跑这个 windows 或者跑尼尼斯的啊, 他是需要一个这样内存管理单元的啊,管理你每个进程之间的硬设关系,来确保每个多个进程之间能够协调的运转,可以这样去理解啊。

好,那我们下面要知道的一个点就是我们这个所谓的一个操作系统对吧?它分成了哪些部分?简单来说可以分为三类,实时的,分时的以及什么呢?半实时,半分时的啊,可以理解为有这么几类。那么这几类操作系统呢?像首先第一类, 那么我们这里所谓的实时啥意思呢?就是他的一个特性啊,也就突出这两个字对吧。实时啊,你可以准确的操作到你所有的所有的一个时间对吧?你想想要运行哪个地方,他就可以运行哪个地方。 呃,因为这种这种操作系统呢,在我们嵌入式中用的非常非常多啊,因为我们嵌入式的主屏不高对吧?如果说你按照什么呢?轮巡的方式对吧?轮巡啊,就是你要去啊,任务一到四对吧,就跟我们裸机一样,让它轮巡,它主屏才及一百多对吧,一百多兆赫兹,可能有的才几十兆赫兹啊。那这样轮巡的话,它的速度是比较慢 慢的啊,速度比较慢,所以这样的话实时性就不高。一般的话就会引入一个实时操作系统啊,那么他就可以管理什么每个任务实时的操作到哪个任务里面去,这样的话就能让你的这个 cpu 的响应啊,足够。 那像我们这个实时操作系统呢,他就一个特性啊,能够定期的发送一次系统调度。定期。这个所谓的定期呢,你可以理解为他就是我们这个操作系统的一个核心,叫做什么呢? 时间。那像我们等会讲明课时,我一般会搞个五毫秒的时机,啥意思呢?就是我不管说这个操作系统运行的结果怎么样?我每五毫秒钟,我一定要去让我这个 cpu 产生一次系统调度。那这一次系统调度的本质就是什么呢?让我的这个最高优先级的那个任务得到我的 cpu 运行。 你这样去理解啊,就这样的话,就防止你这个某一个时候任务响应不及时嘛,对吧?可以通过这个定期发生人群啊,定期发生系统调度对吧? 系统调度啊,这个词我们待会再细讲啊,这个系统调度就能够让你最高优先级任务得到 cpu 运行。这样能够规避一定的什么呢?一定的死战 cpu 的一个现象啊。可以这样去理解。那这种呢,也就说明了每一个任务执行的时间也是不 固定的啊。那么他们都是一个什么呢?以优先级为调度原则,先记住这个词啊,优先级我们待会啊。这个优先级我们是一个难点,也是个重点部分啊。 呃,那像我们这个目前的实时操作系统对吧?比如有 rtt 啊, mucas, 福瑞 rts 等等等等很多啊。像现在国产比较优秀的是什么?这个 rt 对吧,阿迪斯瑞对吧, 后还有什么福瑞亚 ts 吧,这都是目前我们这个国内比较优秀的。呃,一个操作系统对吧?因为 cos 呢,他一个好处对吧,就是稳定,非常稳定,但是他的一个特点就是你学习不收费,但是你商用对吧?如果说商用的话,是需要收费的。呃,那么这个福瑞亚 ts 和 rtt 呢?都是我们国产的操作系统对吧?而且 他们的好处呢,就是什么开元免费。那像这个啊,福利 rts, 其实目内目前国内用的也非常非常多了,对吧? 但是呢,虽然说是我们讲的是 micos, 但你后面学完 micos 去玩这两种操作系统啊,其实都差不多的,他们的 api 都是一样的。比如说创建一个任务对吧?那他有时候可能就名字不一样,但他实现的功能都一样的, 就是给这个内核多一个什么,多一个管理的任务嘛。呃,像阿提提呢,也是,我们现在可以理解为是一个后起之秀吧,对吧?现在慢慢的越来越多的芯片厂家开始去支持这个阿提提的一个一个操作系统,所以大家有兴趣客户也可以去看看。这个讲完一个,大家可以去处类团通的啊,很多机制都是一样的。

呃,然后第二种是分时操作系统,对吧?所谓的分时是啥意思呢?就是我们在这个操作系统中呢,比如说我有一个任务,对吧?我给他分配呢,分配 n 个时间片,这个时间片呢,由你的操作系统来决定,那么我在这个过程中呢,我的任务,对吧?每一个任务执行呢?假设这有这么多份,对吧? 我这个任务执行我这份时间完了以后,我就退出,不管执行到哪一步,直接退出,下一个任务也是一样的,下个任务也是一样的,对吧?比如我这里有个立场,我比如把一千一秒钟分成了什么呢?一千份,那么这个每一份就是我指的是我一个时间,骗人,对吧?比如我 a 一百个,一百份,对吧? d, 两百份, c, 三百份啊, 很多很多份吗?那么在这样的过程中呢,我 a 执行这个,对吧?就是一百分之一啊,就是一百乘以一千分之一为一千分之一秒吗?对吧?他执行的时长就这么长, b 就这么长,两百份,对吧? c 就三百份,那么他们都只执行 自己指定的时间,像这种叫做分时操作系统,像在我们早期的操作系统中呢,对吧?比如我们温九五啊,九八,对吧?温两千,这些都是指的是分时操作系统啊,这里有操作系统 负责分配指定的一段时间给每一个进程啊,每个进程呢,执行完这段时间呢,自己把这个 cpu 主权交出来啊,然后让他去执行其他程序。而其次呢,还有在妮妮是二点六的内核,对吧?如果玩妮妮是应该知道,二点六内核之前,其实也是一种分十多个系统, 但是这种分时操作系统他肯定是有弊端的嘛,对吧?就是我如果的 a 任务还没执行完呢,对吧?那你退掉了,反正我某些操作肯定不是我想要的结果,对吧?所以分时肯定是注定会被淘汰的一种系统。


freertos 和 ucos 的区别?先从那个入手好? freertos 一直在演进,一直在发展,且周边的组建丰富,另外就是 mcu 厂家基本上标配,因为开源, 所以他的生命力足够强,也很包容。目前作者已经加入亚马逊 iot 事业部,相信在互联网时代会大放光彩。刚好 我总结了一些嵌入式资料,放在视频结尾。 ucos 算是比较重规重矩的代表,靠版权挣钱。另外 oppo cia 过了足够多的安全认证,但实外围组建不需要额外授权费,比较吃力。 好处是国内中文资料足够多,元马分析的也多,所以比较适合学习。但是说到用,仅仅是个 kernel, 在今天能干嘛?我了解到去年 ucosm 的公司 micron 已经被 sickon app 收购回到 iot 相关部门, 所以未来怎么干还得观望。我个人推荐你用 freertos, 足够好用,也易用。第一步适用起来,后面才是感悟体会和深入其中。最近很多小伙伴找我说想要一些单片机学习资料, 然后我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份单片机入门到高级教程加工具包,点个关注,全部无偿共享给大家。大家可以查看我的主页简介信息就可以拿走,你过来呀。