粉丝3072获赞9118

接下来我们来看一下我们如何来学习 rtos 呢,那么裸机编程和 atos 编程的风格呢,它是不一样的,而且呢有很多人说 aretos 的学习呢非常难, 那这样呢就会导致啊,我们听到别人这样一说,那可能啊,直接就劝退了啊,觉得啊,学习这个啊这么困难啊,估计我也学不会,所以呢啊,直接就不用学了 啊,这个呢啊,一定要注意,大家不要有这种心态,我们一定要心里一定要想着啊,我们一定要学习好这个啊,操作系统,只有你掌握了操作系统,那么你以后的职业规划呢,才是非常好的。 对于一个掌握了操作系统和啊使用裸机编程的来来说,相对来说啊,他的一个薪资待遇啊,以及以后的职业啊,路呢更长啊,更好啊,这是相对来说啊,所以呢,大家也不要跟钱过不去。 那么到底啊,我们如何来学习一个 rtws 呢?那么最简单的就是在别人移植好的系统之上啊,我们看 atws 里面的 api 使用的一些说明 啊,也就是掌握这些函数的一些功能来调用它,那我们可以不关心这个 api 函数内部的一些底层的一些操作,那么这是最简单且最快速的入门的 种方法,那么这种方法呢,他也有利弊啊,如果是你做做产品的时候,那当然是啊,要让这个产品更快的投入市场 啊,这个时候呢,你可以直接使用啊,这个操作系统 api 啊,来调用对的一些功能啊,让你的产品呢快速的推销市场,赢得先机。那弊端呢,就是当这个程序出现问题的时候啊,因为你对这个 rts 呢内部啊还不够了解, 这样呢就会导致调试起来啊,非常困难啊,这样呢 也是一种弊端,在这里呢,我们建议大家在初学 ats 的时候,我们可以先去使用 用它,也就是先掌握这个 rts 的 api 函数的一些使用,等到你会用了,那你可以再深入的去理解这个 rts 的一个底层实现的一个原理啊,这是我们一个建议的一个学习方法。 那如果说你是真正要想要学习这个 rqs 的话,那只会简单的调用这些 api, 那是不可取的,我们应该要深入的学习这个 aps 啊,那么阿 t u s 呢,他也有非常多 r t u s 呢,就是实时操作系统,刚才我们说过啊,那么实时操作系统呢,他有很多种,国外的有 few r t u s, 还有啊这个 mucos 以及啊 mu rtx 啊这些,那像我们国内的也有啊, rtc 的啊,华为的 lit 啊, litos 以及阿里的 os 啊这些很多各种各样的操作系统, 那么你要学习哪一种呢啊,我们可以建议大家啊,可以学习一款比较流行的啊,免费的,开源的这种操作系统,像我们的 furts 这一款, 那么学习完这一款之后,那么其他的操作系统啊,它的原理是一样的,你会用阿 ts, 那么你再转到其他的 操作系统,比如说阿迪出来的,那会非常轻松,它的底层实现原理基本上是一样的啊,你上手起来会很快啊,所以呢,我们只需要把一款啊,研究 后啊,其他的呢,都是差不多的啊,这是我们学习啊 rts 的一个啊方法和经验,那么啊,这里呢有一个最有效的,也就是最难的方法 啊,就是阅读 ats 的一个圆码啊,深究他的内核和每个组建的实验方式,那么这个过程呢,是非常枯燥的啊,因为底层的圆码啊,他的实线是相对来说比较难的 啊。大家呢,前期的话,还是按照我们刚才说的学会使用这个操作系统啊,通过调用它的 abi 函数来使用,这是第一步,先要上手使用 第二步使用好之后,那接下来我们就要了解这个 r qs 的内核它的实现过程啊,这是第二步,那么你通过 第一步和第二步的一个实现,那么你对这个操作系统呢,就会有一个非常深入的理解啊,当你在使用这个操作系统啊,开发你的项目的时候,遇到一些问题啊,你基本上也能找到这个问题啊,所以呢,大家可以按照这个方式啊,去学习它 啊,如果说你是在开发产品的时候,你的时间不够啊,那你可以快速的啊,通过 rts 的 aba 函数来了解它的一些功能啊,直接调用它的函数来实现 啊,这第一步就可以了啊,当然我们建议大家有时间啊,继续第二步,也就深入他的一个啊内核的一些学习啊。

简单介绍下 free r t o s 的内存管理,我们在移植 free r t o s 时,在 port 文件夹里复制了这些 hit 文件,这些文件都是内存管理文件,可是为什么我们在工程里只用到了 hip 四点 c 呢?我们先来介绍下为什么需要内存管理。 在我们创建任务时,有两种方式,动态创建和静态创建。在动态创建中,只需要提供一个任务对战大小和一个聚丙指针,不需要我们提供对战空间和任务控制快。这是因为动态创建任务时, freertos 会自动的帮我们动态分配这些资源, 而自动的动态分配空间就是内存管理。内存管理可以实现内存用到时分配,不使用时释放,在之后使用队列信号量等也都涉及内存分配。 使用内存的动态管理功能就不再需要自己提前规划各类对象和对战,简化了我们的程序设计。分配内存的方法就在这些 hip 文件中, hip 一到五这几个文件是不同的内存分配方法, 这张表就是他们的区别。我们先来看一下 hip 一, hip 一是指实现了 meleck 功能,没有实现 free 功能,所以它是只能分配内存,不能释放内存。它的实现原理就是先定义一个大数组,然后将合适的空间静态的分配给每一个任务, 如果某个任务或对列信号量等删除了,那么这个空间也没办法释放,所以它适用于只创建不删除的系统中。接下来我们再看一下 hip 二, hip 二也是在数组上分配内存,跟 hip 一不一样的地方 在于 keep 二使用最佳匹配算法来分配内存,并且支持了 free 功能。最佳匹配算法就是,假如我要创建一个任务,他需要十七字节空间。对,这里有这几块空闲内存, 算法就可以找出最小的能满足十七字结的内存,也就是二十字结这块空闲内存,然后会把这二十字结内存中的十七字结分配给任务,剩下的三字结仍然是空闲内存,可以被申请剩下的内存,情况就是这样的了。 之后在申请内存时,如果一直没有小于等于三字节,那么这个三字节空闲内存就一直不会被申请,就变成了内存碎片,这就是 hip 二产生内存碎片的原因了。我们再来看一下 hip 三, hip 三是直接调用的标准 c 库的 mylik 和 free 函数,由于标准西库的 malak 和 free 函数的实现过于复杂,占据的代码空间太大,不适合用在资源紧缺地嵌入式系统中, 所以我们一般不用 hip 三,这里就不过多介绍了。我们再来说一下 hip 四,跟 hip 一、 hip 二一样, hip 四也是使用大数组来分配内存, hip 四使用首次适应算法来分配内存,他还会把相邻的空闲内存合并为一个更大的空闲内存,这有助于较少内存的碎片问题。 首次试营算法就是,假如我们需要申请一个十二字结的内存,那么算法就会找到第一个符合大小的空闲内存块,也就是二十字结,而不会像 hip 二那样找到最小符合的内存块。十五字结,他把二十字结分为十二字结和 八字结,将十二字结分配给我们申请的剩下的八字结仍然是空闲内存可以被申请,当我们经过很多次申请释放后,内存可能就会成这样, 如果内存不能合并,此时再申请一个十五字节的任务空间就不能申请成功。而这里的十二八字节空闲内存就会称为内存碎片, keep 四会将相邻空闲的内存给合并到一起, 这样再申请一个十五字节的任务空间就能申请成功,也减少了内存碎片。与 hips 相比, hip 二不会合并相邻的空闲内存,所以 hip 二会导致严重的碎片化问题。我们都会使用 hip 四,而不使用 hip 二。最后我们再来看一下 hip 五。 hip 五分配内存释放内存的算法跟 hip 四是一样的, hip 五相比于 hip 四, hip 五可以管理多快分隔开的内存,在嵌入式系统中,内存的地址可能并不连续,这种场景下就可以使用 hip 五。 总的来说,我们在很多场景下都是使用 hip 四有多快内存会使用 hip 五,其他都很少用。到了今天的视频就到这里了,欢迎留言评论,我们下期见!

朋友们大家好,在上期视频中我还讨论了操作系统的基本工作原理,那么在这期视频中,我将介绍下如何把 free r t o s 实时操作系统移植到 st m 三二单片机上面。 其实把属于 itos 操作系统已知到 stm 三二单飞机上,本身是一件比较简单的工作,但很多开发者在决定是否要使用 itos 操作系统以及用什么 itos 操作系统的时候会非常的纠结, 那我们在这里就讨论下这个问题。第一个问题就是是否要使用操作系统,使用操作系统的好处什么?以及什么时候适合使用操作系统,什么时候不适合使用操作系统。然后就是我们要使用哪一种操作系统,这里 以我们的开发版为例来回答下这些问题。我们来看这个板子他在这个软件上面都需要实现哪些功能,我们大致的看一下,他有八个舵机接口,这个八个舵机他是互相独立的,可以以不同的速度转到不同的角度,而且每个舵机他转动的范围都是可以不一样的, 它可以控制两个编码电机,而且这两个编码电机是可以测速的。然后有无线通信,然后有 flash 的存储,然后看通信接口,有串口,有 o l e d 的屏幕, 然后有这个串口转 usb 对外通信,然后有可以打开关闭的这个电源接口,有按键蜂鸣器,电源,电源的检测。各种各样功能其实非常多的。在没有操作系统的时候,裸机程序正常流程是先进行各种舒适化,然后会 进入一个 ys 循环,各种程序堆叠在一起,按照顺序循环往复的执行,依次执行,就是后边的程序只有等前面的程序执行完才有机会被执行,而且所有程序执行的频次是一样的,那这就会产生一些不利的因素。 在实际的项目开发中,不同的功能的重要性是不一样的,有些功能需要实时的被响应,有些则不需要。有些程序需要以尽可能高的频率去执行,在一秒内执行的次数越多越好。而有些程序执行的频次却无关紧要,可以在单飞机空闲的时候去执行,都不会产生太大的影响。 这些问题在逻辑上面就是不使用操作系统的时候要去解决,他们会花费比较多的时间和精力去进行特殊的设计,但是在福瑞 r t o s。 上面解决这些问题就会变得非常简单。在福瑞 r t o s。 中, 我还可以把不同的功能写成不同的任务,然后给他们赋予不同的优先级,优先级高的任务可以优先被执行,优先级低的任务在带飞机空闲的时候被执行,这样我就可以保证重要功能的实施性, 也可以让一部位程序以尽可能高的频次去执行。一部位程序在单片地空闲的时候才执行。 另外,在裸机程序中容易遇到的一个很大的问题就是当我使用延时程序的时候,会让单片机执行空操作,就让单片机在当前程序的位置停下来,不往下执行,这就会导致单片机的算力被浪费,而且后边的程序没有机会被执行。 最明显的结果就是使我的主循环执行的时间变得非常长,使程序整体执行的频率变得非常低,有些对实性要求比较严格的功能就 没有办法去实现。在属于 r t o s。 中则不存在这个问题,因为属于 r t o s 中的延时函数为 task d 类,会触发任务切换,把 c p u 腾出来给其他任务使用。 既然当前任务需要等待延时,那就把 cpu 腾出来给其他任务使用,提高整体执行的频次,也可以大大提升 cpu 的使用率。 那么什么时候是不适合使用 i t o s 的?根据我有限的经验,就是当单片机它的这个运行内存小于四 k 四节,闪存小于八 k 四节的时候,大部分的 i t o s 操作系统是难以运行的,即使是移植成功,资源基本上也被耗尽了。 举个例子,就以 s t m 三二的 f 零三零 s 四 p 六这个型号来说,它只有四 k 的这个 ram 和十六 k 的 flash 退出空间。当我们把 free r t s。 一直在它上面的时候,我们需要把这个 free r t y s。 的堆占调的特别小,勉强可以一直在这个单片地上边, 而且最多只能开三个任务和两个对列。如果我在写更多的功能,它的 ram 和这个 flash 存储空间就常在不了,就没有办法在这个单片机上面运行。所以当我在考虑是否用这个 rts 的时候,我要看单片机的 ram 还有这 flash 它是否足够用。 我在决定的时候,就可以把这个 s t m 三 f 零三零 f 四 p 六这个型号做一个指标,拿你用的单片机和它来对比,看你用的单片机的这个 ram 和 fly 是否比较大?如果比它大的话,就可以考虑使用这个 r t s, 如果比它还小,那就不 太合适了。 r t o s 的种类有很多,在这里比较推荐大家使用的就是这个 free r t o s, 第一是因为它是免费的,而且是开源的,可以在商业中使用,没有费用。第二就是它上手的速度非常快,在开发的过程中也比较节省时间,不需要用户去实现很多复杂的接口。 最新版的 freertos 也支持这个 posix 的接口,而且它的用户群体也是非常庞大的,如果在开发的过程中遇到问题,很容易在网上找到答案。总之就是使用它来开发一个项目,会比较节省时间。 这个就是 r t three 的,它是一个国产的 r t o s, 这些年在国内发展的还是很好的,它的核心和很多组件都是可以免费使用的,大家感兴趣可以去了解一下。然后是 micro c o s 和这个 v x works, 这两个也是很 好的 itos 操作系统,但他们都是收费的,据说这个 vxo works 的费用是比较高的。然后就是这个 auttx 操作系统,它是一个风格类似 linix 的一个 itos 系统,它需要在 linix 操作系统下进行开发,对没有 linix 开发经验的用户来说,入手的难度是比较大的, 他需要用户去实现一套他要求的驱动程序的接口,比如说打开设备 open, 关闭设备 close, 读取设备 read, 写入设备 rat, 还有 i o ctrl, 这一点和 unique 的操作系统是非常相像的,把设备当做一个文件来操作, 然后他还需要像操作系统中去注册这个驱动程序。对于我个人来说,使用这个操作系统去开发功能明显会比使用 freertys 花更多的时间,而且在国内 nuttx 的用户群体相对来说比较少,如果, 如果你遇到什么问题,很有可能在网上搜不到现场答案需要靠自己去解决。不过对于从事 linex 驱动程序开发的用户来说,使用 aotts 可能会比较简单,尤其是把 litex 上面的驱动程序往 itos 上面迁移的时候, aotts 获取是一个不错的选择。 其他的 itos 这里就不一一介绍了,大家感兴趣的话可以自己去了解。综上所述,还是比较推荐大家去使用这个 crtos, 尤其是没有 itos 经验的用户。下边说一下如何把 crtos 移植到 stm 三二上面。假设大家已经装好了开发工具,并且已经创建好的项目, 如果不会创建项目,大家可以上网搜一下,这一步非常简单。然后我们需要把 freert 完成原码从网上下载下来,这里也可以使用我们开源项目中的原码,开源项目的原码的下载链接就放在视频下边的简介, 这里边大家可以自行去下载。在开完项目的文件夹里边找到 src 这个文件夹,打开它,这里边是这个项目所有的连载码,然后这里边有个文件夹叫做 freertos 文件夹,它里边存放的就是 freertos 操作系统的所有的原文件。 我打开它看一下,我可以看到 freertos 虽然被称为一个操作系统,但它的文件只有区区几个,说明它还是非常经典的,它的代码量非常少。在这个 podbo 文件夹里面还有四个文件,它们分别对应不同的内存管理方式, 这些文件加起来就是属于 r t o s 的全部内容,是不是非常经典。然后我们把属于 r t o s 文件夹整体的复制到玩的项目录像,把我们所需要的文件添加进来,这里我们只需要添加这题文件就可以了。内存管理方式我选了黑布斯,同时不要忘记在开发环境 中添加 freertos 的图文件滤镜。然后如果在程序中需要调用 freertos 的接口,一定要在程序中包含这个图文件。然后我们打开中段配置文件,把这个方框圈住的代码全部删掉,或者注视掉。 c c m t。 中断函数需要换成我们的代码, 我需要把随身即可的中断服务程序换成下边这段程序。然后就是延时函数处理,在进入操作系统之前,我还可以使用裸机上面的循环等待延时。在进入操作系统之后,我就需要通过操作系统的任务角度来实现延时,所以我还需要把延时程序换成这段代码。 然后我需要打开下边这个文件,对操作系统进行一系列的设置,比如说 cpu 的频率,内存对战的大小,还有其他很多可以选的配置。做完这些之后,我就可以在内涵柱中启动我们的 vrt os 操作 系统呢。首先我们需要创建任务,然后我们开启调度器之后,就会有 crt os 操作系统来接管整个系统。在这里我要把不同的功能写成不同任务,给他们分配合适大小的内存空间及优先级,然后交给操作系统来进行调度, 这就是属于 itos 移植的过程以及它的基本的用法。这期视频我本来打算是周六发出来的,结果周六没有剪完,周日又整整剪了一个晚上,现在是晚上凌晨三点, 然后我需要做字幕,大概早上四点或者五点左右能发出来。在这里特别感谢大家的观看,感谢大家的投币点赞加收藏,尤其是给我充电的这些朋友们,那么这期视频就到这里了,谢谢大家!

下面呢,我们来以 a few rts 为例,来给大家介绍这个 few rts 的一个操作系统。 那么我们首先来看一下 feel rts 这个名字,这个名字呢,可以分成两部分,第一部分是 f r e e feel 啊,第二部分呢是 rts, 那 feel 啊,就是免费的,自由的,不受约束的这个意思。那么阿 qs 呢,就我们前面说的一个实时操作系统啊,他的一个首字母的一个缩写, 那么可以看出啊,从名字就可以看出啊, feelrts 啊,他就是一个免费的 rts 的一个系统。那么这里要注意哈, itos, 他并不是指一个某一个确定的系统, 而是指一类系统实时操作系统,那比如 mucose 啊, mucose 啊,还有我们的现在学的 i feel itos, 或者是 it straight 等等啊,他是指一类十操作系统,那么操作系统啊,他是允许多个任务同时运行的, 那这个呢,叫做多任务,实际上一个处理器核心呢,在某一时刻只能运行一个任务, 这跟我们裸机执行是一个道理。我们的 cbu 在执行我们的工人的时候,我们一个时刻只能执行一件事啊,他只能干一件事。 那么操作系统中的任务调度器啊,他的责任呢,就是决定在某一时刻究竟运行哪一个任务,那么任务调度啊,在各个任务之间进行一个切换,这个速度呢,非常快, 这样就给我们造成同一时刻会有多个任务同时运行的一种错解啊,学过啊,动态数码馆的啊,朋友应该知道,利用我们人的一个余晖效应啊,来来, 让我们感知啊,他是同时显示啊,他是这个是一个道理啊,就是说他的一个切换任务切换的速度啊,非常快,让我们感觉到这个些东,这些任务啊,是同时进行运行的啊,同时运行的,那么操作系统的分类方式啊,可以由 任务调度器的这个工作方式来决定。比如有的操作系统啊,给每个任务分配同样的运行时间,那么时间到了就轮到下一个任务执行, 那么 unni 啊,这种操作系统啊,他就是这种啊。而 ts 的十任务调度器呢,被设计为可预测的, 而这正是嵌入是实时操作系统啊,所需要的实时环境中,要求我们的操作系统呢,必须对某一个事件做出实时的一种响应,因此啊,系统任务调入器的行为必须是可以预测的。 那么像 furts 这种传统的 rts 类操作系统呢,是给由用户来给每个任务分配一个任务优先级, 那么任务调度器呢,可以根据这个优先级来决定下一个啊,运行的是哪一个任务,根据你的优先级的高低啊, 那么 furts 啊,它是一个,呃,是 rts 的一种,那它的一个是一种十分小巧,可以在资源有限的微控制器当中进进行一个运行。当然 furts 不仅局限于微控制性当中使用, 那他在一些啊,其他的一些大型的这种啊, mcu 或者是一些啊 mpu, 他也可以运行 furts 啊。 那么如果你学习过,在学习服用 rts 之前,学习过没有 cos 这种操作系统的话,你会发现 furts 的它的文件数量啊,远低于没有 cos 二或者是三啊,没有 cos 啊,我们在我们的这个资料里面也有他的一些啊历程啊,你可以后续对比一下他的工程啊,他的一个 呃圆码的一个数量啊,相差是非常大的,那么 feel rts 的特点呢?我们来看一下 furts, 它是一个可裁剪的小型的 rqs 的一个系统,那么它的特点呢,包含这么多啊, furts 的内核支持抢占式 啊,还有合作室和时间片的一个调度,那么抢占时啊,是我们实时操作系统当中啊,必须要的啊,因为我们要让我们的一个啊,高优先级的任务啊,优先执行啊,抢占低优先级的啊,随便的 资源来执行。那么还有 sf rts 的衍生字,我们的这个 furts, 那 sf 这个 rts 在代码完整性上呢,要比 furts 的更胜一筹,但是这个系统呢是要收费的啊,所以呢啊,我们 在嵌入式当中啊,基本上用 furts 已经足够,还有我们的 furts 提供了一个用于低工号的一个 tylus 的这种模式 啊,这种模式呢是在啊,我们的低功耗需要我们的产品需要低功耗的时候,我们可以应用啊,他其实呢,就是对我们的一个 空闲任务的时候,把我们的这些外设时钟不需要使用的外设时钟啊给关闭啊,如果说退出的空闲模式的时候,那我们可以打开 对应的一些外设时钟,从而降低我们的工号啊。系统的组建呢,在创建的时候可以选择动态或者是静态的 rem 啊,这个呢,在我们后面 啊学习这个呃任务创建的时候我们就会接触到啊,可以通过我们动态的一个创动态内存或者是静态内存来创建我们的任务啊,比如我们的任务的创建消息对电,还有信号量软件定时器等等 啊,这都是我们的一些操作系统内部的一些啊,资源啊资源。那么还有已经在这个超过三十种架构的芯片上面呢,进行了移植 啊,在 furts 的官方啊,提供给了我们一些啊,一字号的一些工程啊,相对于我们的这个 stm 四二啊, 还有幺零三四零七四二九等等七六七啊,都给我们移植好了,所以呢,我们可以啊,把这些县城的一些工程啊应用到我们的工程哎,芯片当中来啊,非常简单,这官方已经给我们移植好了,我们直接使用就可以 啊, vrtsmpu 支持这个 criticsm 内核的一些 mpo 的一些单元啊,像我们有 mpo 的话是 f 四, f 四以上的一些系列芯片啊,他都可以拥有 mpmpo 啊,当然 mfurqs 他也对这个支持 furts 的系统呢,简单小巧易用啊,通常情况下呢,占内核内核占用呢四到九 k 的一个自洁空间啊,对于我们 stm 三来说啊,这个远远啊,远远已经足够了啊,我们的一个 芯片的内核啊文件,我们芯片的 ram 啊,已经足够啊,满足这个 furts 的一个运行。 然后呢,他有一个特点啊,非常高的可移植性啊,因为它采用的是 c 元,纯 c 元来编写的,所以呢啊,对于移植性来说啊,服用 rts 是非常方便移植的啊,移植到各种 平台啊,然后呢,还支持实时任务和携程啊,这里也叫合作式协同程序,那么我们这里呢,携程的话,我们这里 fmrts 现在已经不用他了啊,不用他了, 这是我们的 furts 的这些特点。还有就是在任务与任务,任务与中段之间可以 直使用任务通知消息队列二直信号量,数字型信号量,还有地规互次信号量以及互次信号量进行通信和同步啊,这些呢,我们后续都会学习到啊,都会学习到的 啊,创新的试验组啊,试验组我们也会学习到,以及我们优先级继承,这是在互资信号量当中会使用到,因为通过这种优先级继承的话,可以实现啊, 必尽量的避免他的一个啊,优先及翻转的这一种啊特性。 还有高效的软件定时器,这种呢是纯软件的一种定时器,和我们硬件定时器呢,功能是类似啊,但是我们 atm 上他有硬件啊,硬件的一个定时器啊,这里 furtis 呢,是提供我们的软件定时器,当我们硬件定时不够的时候,我们可以通过软件定时器来实现一些啊,时间上的一些定时的一些功能 啊,还有强大的跟踪执行功能啊,还有堆占溢出检测功能,通过他的一些红定义来设置啊,如果设置了一些这种检测功能的话,那么你需要编写一些啊啊,回调函数,也就是钩子函数之类的 啊,还有任务数量呢,它不限啊,理论上这些任务数量是可以不限制的,但实际上受限于我们的 ram 啊,我们的芯片 ram 不可能说无限大的啊,你的任务数量越多,你的 ram 呢?占用的也就越多啊,任务 优先级不限啊。同样同样的一个道理啊。这是我们的这个 furts 的一个。呃,特点的一个介绍啊?特点的一个介绍。

简单使用下 freertos 队列,队列是 freertos 数据传输方式的一种,可以用于任务间数据传输,也可用于任务与中断间数据传输。在之前的视频中,我们使用串口打印信息,在每个任务中都有使用,也就是这种结构。 这种结构中每个任务既需要产生数据,比如处理传感器数据等,又需要关心数据的显示,导致任务逻辑层次不清晰。每个任务都有显示程序,我们就可以使用对列,将程序分层一下,把显示相关程序单独拿出来,组成一个显示任务, 其他几个任务只需要将各自要显示的数据都写入队列。显示任务只需要从队列中读取数据进行显示,这样整体结构就变得很清晰。 任务一到三就可以专注自己的数据产生,而不需要关心怎么显示数据。显示任务就只关心怎么显示数据,而不需要关心数据怎么产生的。下面我们就使用对列简单实现一下这种结构。这是之前多任务视频的代码,我们先删除多余的程序, 每个任务只保留打印程序,然后保存编译一下没有错误,就可以开始本期实验了。 我们需要使用队列,所以要先包含一下队列的头文件。本次实验实现一下任务一任务二写队列,任务三读数据并打一显示。 首先我们需要创建一个队列,使用 x q create 可以动态创建一个队列。我们右键转到定义,看 下他的参数,这里他是使用了一个红定义,定义了一下这个函数,方便了我们的使用。第一个参数就是对列的长度,也就是对列可以存放多少个数据。第二个参数是每个数据的大小,单位是字节, 所以这里的参数就可以这样写。上面有两个任务需要写数据,对列长度我们就设置为二,而每个任务要写的数据是一个字符串,我们就设置二十个字节的数据大小吧。 现在创建队列参数已经写好了,可是创建的队列我们去哪里找呢?其实这个函数的返回值就是我们创建的队列,我们可以看一下函数原形,右键跳转过去,这里返回值是这种类型,我们也要定义这样一个变量,用来接收创建好的队列句柄, 复制一下回到我们的代码,在上方定义一个变量,随便起一个对列名字, 用这个变量接收一下返回值,这样一个队列就创建好了。更严谨的写法,还需要在下方判断一下返回值是否为空为空,队列创建失败,我这里就不写了。队列创建好后就可以写队列了, 现在开始修改任务函数,将打印程序注释掉,写对列。我们使用 xq 三的函数,可以右键转到定义,看下参数, 也是一个红定义函数。第一个参数是堆列句柄,第二个参数是数据的地址,这个数据的值会被复制进堆列。第三个参数是阻塞时间, 对列满无法写入新数据时,会阻塞我们设定的时间,回到我们的代码。第一个参数我们填入对列句柄, 第二个参数是数据地址,我们要先定义一下数据,在上方定义一个字符数组,数组大小就是创建对列时指定的数据大小,二十字节,不能随便定义大小。 我们初始化为这个字符串,将数组名填入第二个参数,第三个参数是组色时间,我这里写零,也就是无法写入数据时,函数会立刻返回,这样写入对列就完成了。我们把任务二同样的操作修改一下, 这里字符串改为任务二,写入对列完成后,就开始读对列并显示数 据了。我们修改一下任务三,读对列,使用 xq receive 函数,同样转到定义看下参数,这里和写对列参数基本一致,就不过多介绍了。回到我们的代码,直接写参数,第一个是对列句柄, 第二个是读取的数据存放地址。我们也定义一个二十字节字符数组,用来接收读取的数据。将数组名填入参数, 第三个阻塞,我们填入一个 port max delay, 也就是读不到数据就一直阻塞在这里。这样做的目的是没有数据时,就等在这里有数据才会继续执行下方的显示程序,这样就不执行无用代码,提高效率。 现在读对列已经完成了,我们开始写显示程序。显示之前要先判断一下是否读取成功。 右键转到定义,看下返回之类型。我们定义一个这种类型的变量,用来接收返回的状态。回到代码,在这里定义一下, 用这个变量接收一下返回值,读取成功会返回 p d two。 在下方判断一下返回值, 这里应该是 p d 处,写 p d pass 也没问题。然后把下方的显示代码放到 f 判断里面,修改一下,打印函数,打印接收数据 data 数组中的字符串, 这样就可以了,由于独对列没有数据是一直阻塞的,下方的 delay 也可以不需要了,现在我们编译一下,没有错误,我们点击进入 debug 看下现象,点击全速运行,可以看到串口是正常打 音数据的,这样就实现了任务键传输字符串。那要是需要传输很多不同类型的数据该怎么办呢? 大家可以暂停思考下,我这里告诉大家答案,可以使用结构体,具体怎么做,我们现在来写一下代码。首先我们要定义一下要传输数据的结构体类型,在上方定义一下结构体, 结构体中定义要传输的数据,我这里传输一下这个字符串和一个 int 变量。定义好结构体后,要修改一下创建对列,这里的数据大小,数据大小我们使用 size of 来计算一下结构体大小, 这样修改后再修改一下任务函数,先定义一个结构体变量,再 初始画一下结构题的字符串参数,下方这里数据要取地址这里我们再让变量艾字加下方的任务二,同样的方法修改一下, 然后修改一下显示任务,这里也要定义一个结构体变量,用来接收读对列数据,这里别忘了要取地址, 下方这里我们就打印一下读取的结构题数据,这样修改就可以使用对列传递结构题数据了。我们编译一下,进入 debug 看下现象,点击全速运行, 可以看到现象是正确的,这样就实现了任务间依次传递多种阐述了。本期的视频就到这里了,欢迎留言评论,我们下期见。

第一步操作,那我们先找到这个福瑞 f 在什么地方,那我们看在这个 q x 的这个界面里面,在他的最下侧 mini 中间键里面打开,上次课我们已经用了一个文件管理中间键,就是 fpt fs, 今天我们利用下一个中间键叫做福瑞阿 q s, 我们点一下这个中间键, 点一下,点一下之后,那么这里木的,首先第一个他没有打开我们的 a, 我们打开他,打开他之后稍等,然后会在底下啃这个瑞神里面,在底下这个窗口里面会出现一大堆财富配置 啊,出现一大堆彩虹为止。原来的福瑞阿特 s 的移植,他是一个开元的东西,就是说这个公,这是一个基金会,他们把这个福瑞阿特 s 原代码的他做了很多版本,然后这个版本呢他就免费发扬社会,然后你拿到这个版本呢,就像我们利用词一样,他是个是一个通用型版本, 然后你要是绑到某一个硬件上,比如说像我们的 s m 三二上,那你要对他叫做移植,要修改里面的一些参数,对吧?原来呢都是基于代码的形式,我们再代码一点点去改, 这个工作量还是有一定工作量。那么现在呢,这个一把公司呢?很牛,他从二零二零一,呃,一五年还是一六年,就是 qmax 出来之后,呃第二年,他现在呢就把这个福瑞 rts 呢,就把这个实时操作系统集成到他这可乐化鞋店里了。据说现在他的高端的产品, 那么他集成的这个实时操作系统越来越多,就是这种免费的,大部分都是免费的,那么大家都知道我们现在这款 mcu 现在主屏多少啊?主屏主屏频率多少啊?七十二、七十二兆特斯。昨天我们要做的东西,几个人,我们几个是调研,现在他的一把公司出了一款叫做 hhh 系列, hc 系列, h, 哎, hc 系列的这个内核主频到多少到多少兆赫兹了呢?你猜一猜。去年我们学那二四幺零 linuse 那个是二百二十兆,还记得吧?对吧?现在你说 f 三二 h 系列到多少呢?到了四百兆赫兹,那一个芯片,但多少钱呢?你猜多少钱的芯片 啊?多少钱?三十块钱。我们去年那栗子是多少钱呢?那一个芯片大概是四五百块钱,那一个板子两千多块钱 啊,所以说现在整个这个价格已经被拉的非常非常低了,知道主屏上的很很厉害。好了,这个东西得有速度,没有速度的话运行不起来。调用,调用,做这个调用, 然后接下来我们开始配置,那我们看在这里面的参数非常多,基本上我们把所有东西都要走一遍。首先第一个肯菲格瑞,呃,肯菲格牌是瑞特斯,这是对实时 操作系统福利 rts 的默认参数的配置,基本上他默认的,他基本上配的基本上比较 ok 了,基本上拿来就能用,大的不用改。首先这个版本是多少版本的?注意看这段版本啊,九点零点版本,你们的抓版本多少? 是不是有点这个,对吧?哎,这个版本还在升,他隔一段就升,隔一段就升,每个版本的兼容性还是有问题的。然后接下来 基本上是建名之意,你看他是蝌蚪腮艇,这就属于什么内核配置,内核配置里面基本上你什么都不用改,怎么什么都不用改啊?都不用动,第二个叫做 marry mand。 这边的腮艇什么意思啊? 内存管理,还记得我们上学期讲二四幺零的时候,我们一再强调就是对于这个嵌入系统,之所以能挂第六个词和不能挂第六个词,主要差在什么地? 孩子们还不知道,考试有考过类题,就是什么内存管理,通气,对吧?有个 mm 字那个东西,那么我们现在讲的 xm、 三二这些东西是没有内存管理这个硬件的,所以说 但是你跑操作系统你就要内存,对吧?该内肯定有吧,对吧?那么由谁来做内存管理?没有硬件用谁来做? 用软件来做?他要写算法,他一共写了几种算法呢?他一共写了五种算法。五种的,原来我的是四种,我去,去年看还是四种的,现在搞成五种了。 那这个如果你们有兴趣的话去研究一下,尤其比如说有同学考研究生要做这方面研究。这个他里面算法是很牛的,他里面大量的对列的处理算法,代法很简单。呃,原来我去参加一次这个福瑞阿杰的培训,然后有一个公司的,他们几个小小年轻的去,然后参加他们公司干什么? 他们要自己做这个任务。调度算法就是把福瑞 rts 里的调度算法给修改了,他们实现一个更高效的算法。当时他们去请教这个福瑞阿 ds, 这个在中国的代理是北航的一个教授开的公司,然后请教人家的一些问题, 就是感觉就说在实际应用中他们又有很多的变化,就是更加优化这个算法了。这很牛啊,那帮人就是搞算法的出身了啊。默认 你可以查资料,我默认呢用的就是第四种。那所谓这个内存管理,想一想怎么叫内存管理?怎么叫内存管理? 那么所谓内存管理就是什么呢?你得有这个概念,比如说我们要形成一个任务,对吧? pass, 那么这个任务里面是不是有很多变量,对不对?那这个任务有很多变量和过程值,但是当时间片轮巡时间到的时候,这个任务是不是要停掉啊? 要把 cpu 资源让给另外一个任务,对吧?但这就有个问题,当前的这个任务假定是 a 任务,那么他 a 任务的过程值哪去了? a 任务过程值哪去了? 你想象一下,过程值是不是都拿 cpu 在算的呀?对不对?那 cpu 这个时候跑别人那去了,那这值是不是丢失了呀?所以应该怎么办?存起来怎么存? 哎?存在什么对战区里面?就是我们讲 c 语言的对战区,所以说所谓的他这个内存就是这个卖卖卖,那什么卖那什么的内存管理。在我们这个实操作系统里面,实质上就是利用对战区 来实现一个上下文的推送啊,上下文的保管读写读写功能,所谓上下文就是当前的这个任务的状态值,哎,存进来,所有的计算器存进来,存起来,然后 用的时候再还原回来,对吧?就这个概念,然后这个也不用动,这个地方很重要,叫做头,太阳可以晒。什么意思? 扣他屁股。屁股是什么单词?有的说这个单词我原来也是一直没搞明白,那么我在这个文档里面给大家写了这么一段话,在下面这个位置,在这个第二一点四这个位置, s t m 三二中关于堆战的含义,在 s t m 三二中有两个单词,一叫一个叫做 style, 也叫做 k, 叫什么呢?堆和战,那么其中 style 战是干什么用的?战是用来存放函数里面的局部音量的,这好理解吧? 而堆是什么东西啊?是我们说的不是全级面料,堆是让程序员来动态申请和分配的,这就是我们 c 语言里面所谓是传统军人啊。对战,这不准确, c 语言我们的写那个教材写的不准确,应该严格的定义应该叫什么堆曲, 他不是战区,我们在 c 园里面升起的动态内存空间是堆区,不是战区,明白意思吧?战是由计算机自己管理的局部变量来管理的,对吧?那么这样的话,我们有了这概念之后,他们就可以知道。那么在我们这个配置参数里面,在我们这个配置参数里面,这个嘿股是什么东西啊? 这个黑布就是什么呀?哎,就是堆渠,就是用户程序申请和释放的东西,对吧?这个现在默认多少呢?三零七二大概多少呢?三 k 就是三 k 的空间,你先不动,待会咱们看错误啊,待会会报错,先记住你的,你的区是三 k, 算法是 h 四,然后底下这些 单数呢?都可以不用管他,现在基本上默认都有了啊,这个要有。那么我们在做定时器的时候,大家都知道我们 f 三二有硬件定时,对吧?太 像我们这个板子档次比较低,只有几个呢?只有四个太,对吧?如果是用最牛的那个板子,他应该是八个太太木一到太木八,对吧?但是有些比如我们的需求很很复杂,太木还不够,怎么办?硬件的太木没了,怎么办?有什么改作啊?软件, 所以说这里提供的这个骚特盖开门第三个是什么东西啊?软件定时器,就是他也是个软件定时中段服务,我们把这个引 ab 把这个启用起来,这是个很好玩的东西,反正我个人特别喜欢用定时器来做东西,所以说每次我做所有程序我都把定时器带了,是吧?所以说我都每次都给大家是定时器的程序啊。然后这是 这是这个,这是这个,这是这个碳,然后还没完,还有这个东西 底下这个啊,这个可以不留吧?这个 time 的在这不管了,他的这个内对战区不管了,这是第一个参数配完了,对吧?好了,第一个基本的内核参数我们配完了,我们实际上就启用了一个胎门,对吧?别没动。

近日话题,想学 phritis 实时操作系统的看过来实用的入门教程! phritis 是一个迷你的实时操作系统内核,作为一个轻量级的操作系统,功能包括任务管理、 时间管理、信号量、消息对列、内存管理、记录功能、软件定时器、携程等,可基本满足较小系统的需要。最近很多小伙伴找我说想要一些 free artist 学习资料, 然后我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份 freeaters 入门道高级教程加工具包,点个关注,全部无偿共享给大家!评论区回复八八八, 关注我之后私信回复六六六即可拿走。由于 toros 需占用一定的系统资源,尤其是烂资源,只有 mark o s e i m o s several, freyatis 等少数实时操作系统能在小 kim 单片机上运行。相对 mark o s e i m o s。 等商业操作系统, freitis 操作系统是完全免费的操作系统,具有源码公开、 可移植、可裁剪、调度策略灵活的特点,可以方便的移植到各种单片机上运行。在学习 freeatus 之前,先得了解了解他,一定要搞清楚 freeatis、 safertos 和 pantos 之间的关。

这个视频说一下 fleet r t o s 的任务料度,之前我们在前面的视频中介绍了 fleet r t o s 的时候,是不是遇到了新问题,什么问题呢? 就是 freetitos 这么多的任务中, cpu 是怎么知道哪一个任务是要先执行的,哪一个任务是后执行的呢?是这样的, freetitos 系统里面有一个东西叫任务调度器,我感觉嘛,就是这行 这行代码的功能吧,这个功能就是控制哪一个任务进行, cpu 被执行,哪一个任务要退出 cpu。 我们有我们有两种任务调度的方式,一个是潜藏式的调度,一个是时间片轮转 的调度方式。先说一下浅藏式调度,这里先记住一一句话,就是数,数字越大,优先级就越高,这是在 fleet rtos 里面的, 这个和我们裸机中的那个中段是不一样的,中段是相反的,如果你数字越大的话,他是入线级就越低。 我们在分任务的时候会把任会把任务的优先级,首先是设置好的高优先级的任务, 在抢占抢占式的调度中,高优先级的任务是可以打断低优先级的任务的运行,可以取得 cpu 的使用权的,这样就保证了那些紧急的任务可以得到优先的运行。比如这里是有两个任务, 一个是打游戏的任务,一个是回复信息的任务。你说为了让女朋友不生气的话,我们应该怎么去设置这个优先级呢?是不是?要 是不是要让这个任务二回复消消息的,这个任务的优先级要高一点呢?这里我们就设置这个回复信息的优先级是五吧, 这个是射程五,然后这个是射程优先级是三,那这样的话,无论我打游戏的紧急有多么的紧,我我打游戏的情况是有多么的紧急,比如我要五杀了,但是一旦 女朋友那边需要我回复信息了,如果这边要要我回复信息了,那我立刻的从这里从这个打游戏的这个 任务就切换到了回复回复信息的这个任务中。总结一句话就是在抢战士的调路中总是运行最高最高优先级的任务,最高优先级的任务, 对,这个时候就有可能有人会问,那中断,那之前裸机的那个中断方式还存在这个 fit r t o s 中吗?答案是存在的,这里的中断和裸机的中断一模一样。 中段是最高优先级的,无论你的你的任务的优的优先级,任务中的优先级有多高,中段一来,你这个 cpu 都要回到中段那里 去执行,用去执行那个中断的那个函数的总结就是这样,低优先级的任务会 被,会被高优先级的任务打断,但是这个最高优先级的任务也会被这个中断中断去打断低和高,这里就是这样, 就是就是这样的排序。然后接下来说一下的是时间片轮转掉路,这个这个掉路的方式的前提是 这个优是你所有的任务都是同优先级的,我们是这个前提就是同优先级的下的任务才有这个调度方式,比如这里打游戏和回复信息这两个优先级我们都设置为删吧, 然后这是任务一,这是任务二,然后我们这个如果你想一下就这些 任务,这个优先级相同的任务需不需要自己去控制一下自己?什么时候从 cpu 中说你要退出了?我要,我,我要进进去执行了,我要退出了,这个需要不需,不需要我们来控制他这个 这个退出和进进去呢?那是不需要的,在 freedios 中是不需要的,因为我们这个 freedidos 呢,是有那个时间片的这个轮转调度的。通俗来说就是我们 在这些相同的任务中,相同的任务中会设设置一个时钟,比如我们设置的是一毫秒什么的,如果你这个时间一到用这个相同的任务,比如相同的任务就会 切换吗?一秒钟一毫秒切换一次,就是这样的。然后比如这里我们先看一下这个例子吧,然后这个例子就是,比如这里的任务一是打游戏,他的优先级三,任务二是回复信息,优先级也是三, 你看到这里是没有了这个这个延时函数之前是有的,你看之前是不是有这个延 fit r t o s 的延时函数,现在的话这里是没有的。 然后我们之前也是说了,如果你一旦在这里延时的话,优先级一样的话,延时的话,如果你在执行这个打游戏的的时候, 一旦进入了延时,这个延时就会跳转到任务二中执行码,但现在没有了,那他是怎么跳的呢?他是会不会再跳到任务二呢? 会,会吗?这个就是时间片段轮转掉路的一个功能吧,就是他是这样的,如果我没有这个功能的话,那我是不是一直会会在这里打游戏?比如我们现在在在执行这个 cpu, 现在正执行的就是打游戏这个任务啊, 打游戏这个任务任务一吗?然后如果你不设置这个时间让他退出 cpu 的话,那是不是因为他是这里妙音是死循环,那永远都是在这个里占的 cpu, 是不是?那这样的会就会不合理,对,不合理。然后, 然后你,你现在就要设设置一个什么呢?一个时时间节拍,比如一毫秒,一毫秒这是什么?就我打游戏,打游戏 任务进入了 cpu, 一毫秒之后我就要退出 cpu 了,我这个打游戏的任务就要退出 cpu 了,就让下一个任务进来这里的任务就是回复信息嘛,就是任务二嘛,我们就 现在我一毫秒了之后,他这个打游戏就会退出,是吧?会退出,然后我们这个回复信息的时候就进入了 cpu, 一秒后我这个回复信息又退出,然后又到了打游戏进去就是一个反复循环,这这样这个就是时间片轮转调度的一个方式。 然后最后说一下,就是在 fleet i t o s 中,这两个这这里它是可以同时存在的。在 fleet i t o s 中,这两种调度方式是可以同时存在的。不同优先级之间的任务之间呢,就会使用的是 是潜藏式的这个优调度,然后同优先级任务之间呢,就用的是时间片段轮转轮转调度,就是大概对调度任务调度就是这样。

米诺可在入门中发现自己对操作系统没有概, 在飞跃队上成功实现点灯和创口,这种成功的感觉真的好像回到最初。学习单片局,小伙伴们可以分享一下自己的学习过程,加油,继续保持热爱!


朋友们大家好,今天我来介绍属于 r t o s 操作系统的任务调度。之前的几期视频中,我们介绍了 r t o s 的概念,以及为什么要使用 r t o s 操作系统,然后介绍了如何在 free r t o s 中创建任务。 那么今天我来介绍 freert os 中任务调度的规则。一个单片机需要同时实现很多功能,比如屏幕显示、串口通信、电机控制、读取传感器数据等。这就如同一个人在同时做很多件事。 我们把单片机比作餐厅的大厨,他在忙碌的时候需要一个人操作好几个锅,同时炒好几道菜。如果让普通人去做这件事,难免会手忙脚乱,但是餐厅的大厨却可以轻松应对。同理, 我们在给单片机编程的时候,也希望一个单片机可以做尽可能多的事情,这样不仅可以简化硬件方案,也可以降低产品的成本,在市场上取得更大的竞争力。就比如一个厨师同时做几道菜这件事情 用裸机编程的思维该如何实现呢?大致流程会是下边这个样子,先进入闷函数,然后各种初始化,直到进入一个 vs 循环,在里边按照事先写死的顺序,一遍一遍重复执行。 这种操作方式的弊端在上期视频中我们已经讨论过,这里不再赘述,因为时间相隔久远,没有印象的同学可以去看之前的视频。如果把上边的代码移至到 freertos 中,则会是下边这样在经过一系列的初始化之后,把所需要的工 以任务的形式创建出来。这些任务在执行的时候没有固定的先后顺序,是通过一系列的规则来确定哪些任务先被执行,哪些任务暂时不能执行。 freerts 中的任务可以有以下几种状态,运行、就绪,阻塞、挂起。第一,运行。他是指当前任务正在执行,他处于运行状态,而且正在使用处理器。 如果运行 rtys 的处理器只有一个内核,那么在任何给定的时间都只能有一个任务处于运行状态。第二,就绪。指任务能够执行,但目前没有被执行, 因为同等或者更高优先级的不同任务已经处于运行状态,就绪状态不同于阻塞或者挂起状态。第三,阻塞。如果任务正在等待 时间或者外部时间,则任务处于阻塞状态。例如,如果一个任务调用 v 塔斯格迪丽函数,他将会被阻塞,直到设定的延时结束。任务也可以通过阻塞来等待队列信号量、事件组通知等。处于阻塞状态的任务通常有个超时时间, 超过这个时间后,任务将被解除阻塞状态,即使该任务所等待的事件没有发生。 阻塞状态下任务不使用处理器,时间也不能进入运行状态。第四,挂起。与阻塞状态下的任务一样,挂起状态下的任务不能被选择进入运行状态,但处于挂起状态的任务不会超时。 任务只有通过 spend 和 resume 函数才能进入或退出挂起状态。再知道一个任务可以处于的四种状态 之后,我们来看如何对任务进行调度。第一种调度方式,人群调度。我们规定一个非常短暂的时间为一个时间片,这里以一毫秒为例,假如有两个任务处于同一个优先级, 每个任务运行一个时间片之后,切换给另外一个任务运行,依次轮流运行,这种方式就是轮巡调度,就是处于同一个优先级的任务,他们依次轮流的执行每个任务,每次执行一个时间片。 第二种调度方式,抢占式调度是指调度器始终运行优先级最高,而且处于就绪状态的任务。当一个低优先级的任务正在执行时,发生外部中断,使一个处于阻塞状态但优先级更高的任务获得了 他正在等待的信号量,那么调度器就会停止当前正在运行的低优先级的任务,切换到高优先级的任务,即便当前任务的时间片并未结束。 freertos 默认使用强战士调度策略 会同等优先级的任务使用时间片。轮巡调度调度器不会永久更改任务的优先级,尽管他可能会因为优先级继承而暂时提高任务的优先级。 最近工作上的事情比较多,所以更新频率很低,后边有空的话会尽可能多做几期视频,那么这期视频就到这里了,谢谢大家。