我给妹子讲了一晚上的RTOS Task的原理

↑点击上方蓝色字体,关注“嵌入式软件实战派”获得更多精品干货。


“师兄,不好意思,又打扰你一下。”

此时的我刚解了一个bug,正闭目养神缓解一下疲惫的精神。听到妹子在叫我,忽然又精神百倍了。

“没事,你说。”

“自从你上次给我讲解了RTOS的一些概念原理,我没那么困惑了,我也查阅了很多资料,但是我还有些关于'Task'的疑问……”

“找个时间我再给你详细讲解下吧。”热情的我没等她说完我就答应她了。

于是,我约她在晚上……我当时又恰恰只有晚上比较有空(我真不是故意的)

顺着上次没讲完的问题点(见《妹子要我教她学RTOS这次打算给她讲个透彻。因为我们项目用了FreeRTOS,以下内容也是基于FreeRTOS做讲解。

多任务概念

内核是操作系统的核心组件,像Linux或者Windows,用户可以运行多个程序,多个程序又像是在同时运行。 每个程序都可以是一个或者多个Task(或者Thread)。 可以处理多个Task的系统,我们称其为多任务处理。 在程序设计上,将软件应用根据不同功能分别设计成多个Task,然后实现其内部交互,非常方便。

上面提到多个程序像是同时运行的,真的可以同时运行?

程序看起来像同时运行的


实际上程序是分时间片运行的



任务调度

此时,妹子很好奇,既然多个程序不是真的同时运行,系统是怎么实现按时间片运行的?
以下,我就给她讲解了“任务调度”的概念。
1 . 调度策略
调度器或者说调度程序,是内核的一部分,它负责确定在任何特定时间应执行哪个任务。内核可以在任务生命周期中挂起( Suspend)许多任务,然后在适当的时候恢复并执行( Resume)任务。
这里就涉及到一个调度算法了,它是在任何时刻决定执行哪个任务的算法。用户可以根据任务的需要给每个任务分配或者设定其运行时刻。系统中的任务,不仅自己会挂起,用户也可以决定一个任务什么时候让其挂起,然后系统就会去寻找下一个就绪的任务运行。
以下,举例说明任务切换过程。

  1. 在1处Task 1在运行,运行到2处,被系统挂起了;

  2. 在第3处,系统切换到Task 2,第4处在运行;

  3. 第5处,Task 2被挂起,同时第6处是恢复Task 1运行;

  4. 第7处,挂起Task 1,在第8处切换到Task 3运行;

  5. 以此类推,第9/10处分别是Task 2和Task 3在运行。

以上,讲到的挂起,就有可能是用户设置让Task挂起(即Sleep或休眠),系统就将运行权交给其他的Task,也有可能是因为另外一个Task优先级更高,逼迫之前的Task挂起,即发生了抢占行为。
“师兄,以上过程比较容易理解,但是这Task是怎么切换走的,又是怎么切换回来的?”
细心的妹子还是提出了这个细节疑问。同时我也毫不吝啬地赞扬她提了个好问题。
2 . 上下文
这里就涉及到另一个概念了——上下文切换。
程序在运行的时候,会用到CPU系统的资源,例如寄存器、栈空间等等。当前用到的这些资源,我们称之为上下文( Context)。
举例说明,当一个Task程序在运行1+1运算的时候,在CPU运行应该像这样的:

这里面的资源就是当前Task运行时的Context。
妹子是个优秀的妹子,她的问题总是直击要害。我从她犀利的眼神中可以看出,对于我讲解的过程她是理解的,同时还具有打破砂锅问到底的程序员特质。
这次她问的是,“如果一个task在运行计算这个1+1的程序时,被系统打断了或挂起了,恢复回来怎么继续?例如,mov R1, 1此处被打断了,系统切换到另一个task了,也有可能用这个R1和R2寄存器,并且这些寄存器在cpu上只有一份,系统切换不会搞乱套了么?”
看得出,她期待我给她讲解Context切换的过程。于是,我就准备了个例子,系统在Task A和Task B之间切换的过程。
1. 假设Task A是在当前运行的任务

2. 保存Task A的Context

3. 恢复或者加载Task B的Context

4. 运行Task B

以上提到了个保存Context和恢复Context, 这个是怎么实现的呢?

我从FreeRTOS.org官网找到了个例子(针对AVR的),不同内核的IC实现还不一样,和具体的寄存器组有关,和编译环境有关。另外,这两个函数运行要求越快越好,这个会影响系统任务切换的性能,所以,这俩函数一般都是用汇编实现的。

对于这个例子的代码实现我在这里就不讲解了(我也没给妹子讲解这些细节,对于RTOS入门可以暂时跳过这个内容),有兴趣的可以参考FreeRTOS官网,里面有解释。


任务状态

上文提到了Task的状态,妹子问,“Task是不是只有挂起和运行两个状态?”突然,我觉得这个问题有点难回答Yes or No。她静静地看着我,一时语塞,我的答案总是姗姗来迟。
我勇敢果断地说了声“是”。然后还给她解释了下面一大堆内容。
实际上,确实可以认为一个Task只有运行和不运行 (或者叫挂起 状态。

当任务处于运行状态时,处理器将执行任务的代码。 当任务处于“未运行”状态时,该任务处于休眠状态,其状态已保存,准备好在计划程序下次决定进入“运行”状态时恢复执行。 当任务恢复执行时,它会从上一次离开运行状态之前要执行的指令开始执行。

FreeRTOS.org

但是呢,“幸福总是相似的,而不幸却又各不一样。”Running只有一个,而Not Running却又各不相同。就FreeRTOS来说,Not Running分好几种状态:

以下根据FreeRTOS官网内容解释下:

  • Running

    实际执行任务时,据说它处于Running状态。当前正在使用处理器。如果运行RTOS的处理器只有一个内核,则在任何给定时间只能有一个任务处于“运行”状态。


  • Ready

    Ready任务是那些能够执行的任务(它们不处于Blocked或Suspended状态),但当前却不执行,因为具有相同或更高优先级的其他任务已经处于Running状态。


  • Blocked

    如果任务当前正在等待临时事件或外部事件,则称该任务处于Blocked状态。例如,如果任务调用vTaskDelay(),它将一直阻塞(置于Blocked状态),直到延迟时间到期为止–这是一个时间事件。任务也可以阻塞以等待队列,信号量,事件组,通知或信号量事件。处于Blocked状态的任务通常有一个“超时”时间段,此后该任务将超时并被解除阻止,即使未发生任务正在等待的事件也是如此。

    处于Blocked状态的任务不使用任何处理时间,并且不能选择进入Running状态。


  • Suspended

    与处于Blocked状态的任务一样,处于Suspended状态的任务无法选择进入Running状态,但是处于Suspended状态的任务没有超时。相反,只有在分别通过vTaskSuspend()和xTaskResume()API调用明确命令这样做时,任务才进入或退出Suspended状态。


怎么实现几个task轮流执行呢,直接给他们写个死循环行不行。

void task1(void){ while(1) {     // doing something    }}void task2(void){ while(1) { // doing something }}

这个问题,我让妹子想了好一会。她犹犹豫豫回答说不行。然后又向我投来期待的眼神。

我不慌不忙地给她说,确实不行,因为优先级高的,根本就没给机会优先级低的任务运行。那么,怎么做呢?

void task1(void){ while(1) {     // doing something     vTaskDelay(10);    }}void task2(void){ while(1) { // doing something vTaskDelay(10); }}

最简单直接的办法,就是给每个Task一个delay,即让其没运行一次循环就睡一会,把机会留给其他任务。但是,这里有点死板,每次都要等10(ms)?能不能有事情就执行,没事情就休息呢?

答案是有的。这要用到信号量或者事件组这些东西了。在此暂不展开讨论,怕扯太远了,妹子会一路问下去。

讲到这里,妹子基本上理解我说的“是”的回答的含义了……但是这上面又提到了很多新概念,如信号量、队列等等。也许我只能再约她在另外一个晚上了(讲解RTOS概念)。


任务优先级

这里有必要提一下的是,这个任务的优先级,即Priority。其实也没很高深的知识,我是想让妹子知道,在人类创建RTOS的世界,任务并非个个平等的。因为人类有各种喜好或要求,总是希望有些任务设计成紧急处理的,其应该拥有高优先级。如果你要设计一个无关紧要的任务为最高优先级,那它只会“占着茅坑不拉屎”。Oh,我不能跟妹子做这么恶心的比喻。
话说回来,如果你认为你的RTOS是平等的大同世界,你可以设计每个任务的优先级一样,让他们佛系切换,我想bug也会少很多。但是你要掂量着,这是不是你想要的设计功能。当然,也有非抢占式的RTOS,其只能是等一个任务运行完才能轮到另一个任务的。我们在此不讨论这种情形,这种OS也很少使用。
好了,这个章节,无非是想告诉你,优先级的配置,是很重要的,影响功能体验甚至性能。

任务间通信

讲了那么多,回到应用来,我们将许多应用设计成多个不同的Task,它们是怎么交互或者通信的?
聪明的我,没等妹子反应过来,我就给她解释了。

一般情况下,RTOS都会提供一个叫mailbox的东西给两个Task之间通信,可以简单理解为,异地恋双方通过写信交流……(,虽然我好想打探妹子有没有男朋友,但是这个比喻我只能生硬地讲到这了

引用FreeRTOS官网里面的图来解释:

很明显,FreeRTOS的这个mailbox实际上就是个队列(First In First Out, FIFO),此处我没跟妹子讲解这个结构,而推荐了个文章《图解栈(Stack)与队列(Queue)》给她看。

她问,“不用mailbox,还有没有其他方法,例如直接共享全局变量,如果两个Task传输大量数据,mailbox不是很好吧……”

妹子总是这么好学,我又给她讲解了处理mailbox以外的方式。例如她提的全局变量。我笑着点了点头,但她不是很满意,似乎觉得过于简单了。因为,我们之前讲到过,Context切换时有备份的,但这个全局变量,是没有备份的。假如两个Task都同时更改这全局变量,会发生什么?假如一个Task正在更改变量,另一个Task却正在读取这个变量又会怎样?

我很想给她做以下这个比喻,但是始终没有。

“我跟你在讲解RTOS的知识,有时候需要用笔在纸上画一些图示来说明问题,你也会用笔来把问题指出来。如果只有一支笔,在讨论激烈的时候,我们可能会同时伸手去拿这支笔,然后……”

我很想出这个bug,可项目不能出啊。言归正传,以上这样做是会出问题的,而且问题会变得很复杂,bug也不好找。

怎么办?加锁啊。一个task在用这个变量的时候,另一个task就只能静静地待着。RTOS有锁?锁是啥东西?你姑且认为信号量可以实现这个锁,后续再详细讨论。好了,先给你安利一个文章《我在马路上遇到一个死锁问题》。


空任务

好像,这个RTOS的Task概念基本讲完了,但是问题妹子又提问了,“如果所有我们定义的Task都在挂起,那系统在干嘛?”我听得出来,就好像她天真可爱地问“如果所有人都睡觉了,这个世界是不是都在睡觉?”
设计RTOS的,就好像在设计这个世界,世界怎么会睡觉呢?天和地怎么会睡觉呢?我跟她说“天行健,君子以自强不息!”说的我有点豪气,又有点装逼,似乎比喻不怎么恰当。慌忙地解释,RTOS还隐藏着另外一个Task——IDLE_Task。它拥有最低优先级,与世无争,就像水一样。然后,我顺口念出了一句:
“上善若水。水善利万物而不争,处众人之所恶, 故几于道。”
老子

我又怕装逼装过头了,慢慢地跟她解释这个IDLE Task,它的优先级是最低的,只有其他task不运行的时候,它才运行。

但是,你知不知道,这个IDLE Task在系统运行中,运行时间或次数最多的,正所谓“色即是空,空即是色”……


关注“ 嵌入式软件实战派”,我给你讲更多关于 我和她RTOS的故事。

往期精彩内容推荐>>>

妹子要我教她学RTOS

我在马路上遇到一个死锁问题


嵌入式软件实战派 专注嵌入式软件开发领域知识传授,包括C语言精粹,RTOS原理与使用,MCU驱动开发,AUTOSAR搭建,软件架构方法设计等。
评论
  •  万万没想到!科幻电影中的人形机器人,正在一步步走进我们人类的日常生活中来了。1月17日,乐聚将第100台全尺寸人形机器人交付北汽越野车,再次吹响了人形机器人疯狂进厂打工的号角。无独有尔,银河通用机器人作为一家成立不到两年时间的创业公司,在短短一年多时间内推出革命性的第一代产品Galbot G1,这是一款轮式、双臂、身体可折叠的人形机器人,得到了美团战投、经纬创投、IDG资本等众多投资方的认可。作为一家成立仅仅只有两年多时间的企业,智元机器人也把机器人从梦想带进了现实。2024年8月1
    刘旷 2025-01-21 11:15 492浏览
  • 随着消费者对汽车驾乘体验的要求不断攀升,汽车照明系统作为确保道路安全、提升驾驶体验以及实现车辆与环境交互的重要组成,日益受到业界的高度重视。近日,2024 DVN(上海)国际汽车照明研讨会圆满落幕。作为照明与传感创新的全球领导者,艾迈斯欧司朗受邀参与主题演讲,并现场展示了其多项前沿技术。本届研讨会汇聚来自全球各地400余名汽车、照明、光源及Tier 2供应商的专业人士及专家共聚一堂。在研讨会第一环节中,艾迈斯欧司朗系统解决方案工程副总裁 Joachim Reill以深厚的专业素养,主持该环节多位
    艾迈斯欧司朗 2025-01-16 20:51 198浏览
  • 本文介绍瑞芯微开发板/主板Android配置APK默认开启性能模式方法,开启性能模式后,APK的CPU使用优先级会有所提高。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。源码修改修改源码根目录下文件device/rockchip/rk3562/package_performance.xml并添加以下内容,注意"+"号为添加内容,"com.tencent.mm"为AP
    Industio_触觉智能 2025-01-17 14:09 164浏览
  •     IPC-2581是基于ODB++标准、结合PCB行业特点而指定的PCB加工文件规范。    IPC-2581旨在替代CAM350格式,成为PCB加工行业的新的工业规范。    有一些免费软件,可以查看(不可修改)IPC-2581数据文件。这些软件典型用途是工艺校核。    1. Vu2581        出品:Downstream     
    电子知识打边炉 2025-01-22 11:12 58浏览
  • Ubuntu20.04默认情况下为root账号自动登录,本文介绍如何取消root账号自动登录,改为通过输入账号密码登录,使用触觉智能EVB3568鸿蒙开发板演示,搭载瑞芯微RK3568,四核A55处理器,主频2.0Ghz,1T算力NPU;支持OpenHarmony5.0及Linux、Android等操作系统,接口丰富,开发评估快人一步!添加新账号1、使用adduser命令来添加新用户,用户名以industio为例,系统会提示设置密码以及其他信息,您可以根据需要填写或跳过,命令如下:root@id
    Industio_触觉智能 2025-01-17 14:14 123浏览
  • 数字隔离芯片是一种实现电气隔离功能的集成电路,在工业自动化、汽车电子、光伏储能与电力通信等领域的电气系统中发挥着至关重要的作用。其不仅可令高、低压系统之间相互独立,提高低压系统的抗干扰能力,同时还可确保高、低压系统之间的安全交互,使系统稳定工作,并避免操作者遭受来自高压系统的电击伤害。典型数字隔离芯片的简化原理图值得一提的是,数字隔离芯片历经多年发展,其应用范围已十分广泛,凡涉及到在高、低压系统之间进行信号传输的场景中基本都需要应用到此种芯片。那么,电气工程师在进行电路设计时到底该如何评估选择一
    华普微HOPERF 2025-01-20 16:50 76浏览
  • 电竞鼠标应用环境与客户需求电竞行业近年来发展迅速,「鼠标延迟」已成为决定游戏体验与比赛结果的关键因素。从技术角度来看,传统鼠标的延迟大约为20毫秒,入门级电竞鼠标通常为5毫秒,而高阶电竞鼠标的延迟可降低至仅2毫秒。这些差异看似微小,但在竞技激烈的游戏中,尤其在对反应和速度要求极高的场景中,每一毫秒的优化都可能带来致胜的优势。电竞比赛的普及促使玩家更加渴望降低鼠标延迟以提升竞技表现。他们希望通过精确的测试,了解不同操作系统与设定对延迟的具体影响,并寻求最佳配置方案来获得竞技优势。这样的需求推动市场
    百佳泰测试实验室 2025-01-16 15:45 339浏览
  • 日前,商务部等部门办公厅印发《手机、平板、智能手表(手环)购新补贴实施方案》明确,个人消费者购买手机、平板、智能手表(手环)3类数码产品(单件销售价格不超过6000元),可享受购新补贴。每人每类可补贴1件,每件补贴比例为减去生产、流通环节及移动运营商所有优惠后最终销售价格的15%,每件最高不超过500元。目前,京东已经做好了承接手机、平板等数码产品国补优惠的落地准备工作,未来随着各省市关于手机、平板等品类的国补开启,京东将第一时间率先上线,满足消费者的换新升级需求。为保障国补的真实有效发放,基于
    华尔街科技眼 2025-01-17 10:44 221浏览
  • 高速先生成员--黄刚这不马上就要过年了嘛,高速先生就不打算给大家上难度了,整一篇简单但很实用的文章给大伙瞧瞧好了。相信这个标题一出来,尤其对于PCB设计工程师来说,心就立马凉了半截。他们辛辛苦苦进行PCB的过孔设计,高速先生居然说设计多大的过孔他们不关心!另外估计这时候就跳出很多“挑刺”的粉丝了哈,因为翻看很多以往的文章,高速先生都表达了过孔孔径对高速性能的影响是很大的哦!咋滴,今天居然说孔径不关心了?别,别急哈,听高速先生在这篇文章中娓娓道来。首先还是要对各位设计工程师的设计表示肯定,毕竟像我
    一博科技 2025-01-21 16:17 103浏览
  • 临近春节,各方社交及应酬也变得多起来了,甚至一月份就排满了各式约见。有的是关系好的专业朋友的周末“恳谈会”,基本是关于2025年经济预判的话题,以及如何稳定工作等话题;但更多的预约是来自几个客户老板及副总裁们的见面,他们为今年的经济预判与企业发展焦虑而来。在聊天过程中,我发现今年的聊天有个很有意思的“点”,挺多人尤其关心我到底是怎么成长成现在的多领域风格的,还能掌握一些经济趋势的分析能力,到底学过哪些专业、在企业管过哪些具体事情?单单就这个一个月内,我就重复了数次“为什么”,再辅以我上次写的:《
    牛言喵语 2025-01-22 17:10 60浏览
  • 2024年是很平淡的一年,能保住饭碗就是万幸了,公司业绩不好,跳槽又不敢跳,还有一个原因就是老板对我们这些员工还是很好的,碍于人情也不能在公司困难时去雪上加霜。在工作其间遇到的大问题没有,小问题还是有不少,这里就举一两个来说一下。第一个就是,先看下下面的这个封装,你能猜出它的引脚间距是多少吗?这种排线座比较常规的是0.6mm间距(即排线是0.3mm间距)的,而这个规格也是我们用得最多的,所以我们按惯性思维来看的话,就会认为这个座子就是0.6mm间距的,这样往往就不会去细看规格书了,所以这次的运气
    wuliangu 2025-01-21 00:15 188浏览
  •  光伏及击穿,都可视之为 复合的逆过程,但是,复合、光伏与击穿,不单是进程的方向相反,偏置状态也不一样,复合的工况,是正偏,光伏是零偏,击穿与漂移则是反偏,光伏的能源是外来的,而击穿消耗的是结区自身和电源的能量,漂移的载流子是 客席载流子,须借外延层才能引入,客席载流子 不受反偏PN结的空乏区阻碍,能漂不能漂,只取决于反偏PN结是否处于外延层的「射程」范围,而穿通的成因,则是因耗尽层的过度扩张,致使跟 端子、外延层或其他空乏区 碰触,当耗尽层融通,耐压 (反向阻断能力) 即告彻底丧失,
    MrCU204 2025-01-17 11:30 184浏览
  • 嘿,咱来聊聊RISC-V MCU技术哈。 这RISC-V MCU技术呢,简单来说就是基于一个叫RISC-V的指令集架构做出的微控制器技术。RISC-V这个啊,2010年的时候,是加州大学伯克利分校的研究团队弄出来的,目的就是想搞个新的、开放的指令集架构,能跟上现代计算的需要。到了2015年,专门成立了个RISC-V基金会,让这个架构更标准,也更好地推广开了。这几年啊,这个RISC-V的生态系统发展得可快了,好多公司和机构都加入了RISC-V International,还推出了不少RISC-V
    丙丁先生 2025-01-21 12:10 118浏览
  • 现在为止,我们已经完成了Purple Pi OH主板的串口调试和部分配件的连接,接下来,让我们趁热打铁,完成剩余配件的连接!注:配件连接前请断开主板所有供电,避免敏感电路损坏!1.1 耳机接口主板有一路OTMP 标准四节耳机座J6,具备进行音频输出及录音功能,接入耳机后声音将优先从耳机输出,如下图所示:1.21.2 相机接口MIPI CSI 接口如上图所示,支持OV5648 和OV8858 摄像头模组。接入摄像头模组后,使用系统相机软件打开相机拍照和录像,如下图所示:1.3 以太网接口主板有一路
    Industio_触觉智能 2025-01-20 11:04 156浏览
  • 80,000人到访的国际大展上,艾迈斯欧司朗有哪些亮点?感未来,光无限。近日,在慕尼黑electronica 2024现场,ams OSRAM通过多款创新DEMO展示,以及数场前瞻洞察分享,全面展示自身融合传感器、发射器及集成电路技术,精准捕捉并呈现环境信息的卓越能力。同时,ams OSRAM通过展会期间与客户、用户等行业人士,以及媒体朋友的深度交流,向业界传达其以光电技术为笔、以创新为墨,书写智能未来的深度思考。electronica 2024electronica 2024构建了一个高度国际
    艾迈斯欧司朗 2025-01-16 20:45 464浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦