前言

通过该篇学习了嵌入式的任务调度(即时间片论法)后,了解到通过以1ms为调度时间单位轮询判断是否需要执行函数任务,那么下面介绍如何基于时间片论法的任务调度模式充分利用MCU的资源,姑且先称这种方式为时间片差分调度法

充分利用MCU的资源指的是在不影响原有的函数调度情况下合理进行分配,避免MCU大部分时间处于空跑状态(即大部分时间没有调度任何的功能函数,只是在不停地判断时间状态,从而造成的资源浪费),同时提高每个任务的调度周期的命中率(按时准点执行)

背景

时间片论法不比操作系统,操作系统可以通过任务优先级抢占当前正在执行的低优先级任务,或者高优先级任务主动睡眠释放MCU资源以便低优先级的任务可以正常执行;时间片论法必须等待当前任务执行完成后才能执行下一个任务(中断除外)。

因此,由于时间片论法的特性,很难保证某些任务能够及时得到调度运行,特别是所需要的调度任务多的情况下,常常出现不能及时调度的问题(虽然整体调度周期不变),从而影响所需要的功能,常见的做法可能通过定时中断触发的方式去执行,可是碰到一些任务函数执行时间稍微长的就会影响中断的响应等。

可以看下面的函数调度时长图,每个刻度为200us(以下称节拍),调度单位为1ms(以下称时间片),只以200us以上的任务举例,方便进行理解

从上述图中可知以下信息:

  1. 图中一共有五个任务函数,每个任务函数的执行时间不定

    - 任务1(黄色)周期为5ms

    - 任务2(红色)周期为6ms

    - 任务5(紫色)周期为5ms

    - 任务4(蓝色)周期为12ms

    - 任务5(绿色)周期为15ms
  2. 同一时刻触发任务调度的执行时的顺序(调度函数的顺序即可任务默认优先级):1>2>3>4>5
  3. 第25ms时任务1的调度慢了一个节拍,原因是任务2和4的调度总时长超过了时间片的时长
  4. 除了任务1大部分时间都能及时被调度,其他任务并不能被及时调度,虽然周期不变,但命中率不高(甚至等于0)
  5. 其中存在周期性的几个时间片大部分时间处于空跑状态
  6. ...等其他仔细观察的可知信息,这里就不多说了

从获取的信息可知,大部分任务虽然整体周期没变,但是几乎很少有低优先级的任务有较高的命中率,这样就导致某些功能需要较高的命中率同时执行时间相对较长(不能放在中断中的任务函数)就不能正常工作。

如何优化

在优化之前,首先看下面这个有一定规律的函数调度时长图

  1. 还是五个任务,而规律就是函数任务公约数=最小调度周期任务,即5ms(假设小于5ms的任务大都执行时间非常短,在此可忽略不计)

    - 任务1(黄色)周期为5ms

    - 任务2(红色)周期为10ms

    - 任务5(紫色)周期为20ms

    - 任务4(蓝色)周期为10ms

    - 任务5(绿色)周期为20ms
  2. 图中所展示的任务调度命中率也不高,也存在周期性的几个时间片大部分时间处于空跑状态

看一下优化前后的对比图,虽然还是存在大部分时间处于空跑状态,但是命中率提高到了100%

只要保证每个任务函数耗时小于调度单位,那么就能做到命中率 100%

如何实现的?

从优化后的图中可以了解到,第一个时刻调度的时候只有任务1,第二个时间调度只有任务2,以此类推,就可以在一定程度上避开同一时刻多个任务需要同时等待调度,从而引发的拥堵。

可以通过每个任务计时器的倒计时初值进行调整,从而达到每个时间调度只运行一个任务的目的,提高任务的命中率。

那么接下来按照上面提到的规律去优化刚开始的那个,主要有两点:

  1. 在可接受范围内调整任务的周期,尽量保证任务函数任务公约数=最小调度周期任务

可以理解称任务公约数等于多少就代表可以在初值上类推多少个任务进行错开初次执行;可以忽略部分函数耗时特别短的任务

  1. 调整每个任务倒计时器的初值,尽量错开拥堵时刻

任务多的情况下只能够尽量避免,从而提高命中率,通过每个任务调度周期和执行时长进行推算,得到每个任务的最佳的初值

根据以上两点对上述调度任务进行优化如下:

五个任务函数在可接受范围内调整任务周期后,同时调整初值

- 任务1(黄色)周期为5ms

- 任务2(红色)周期为5ms

- 任务5(紫色)周期为5ms

- 任务4(蓝色)周期为10ms

- 任务5(绿色)周期为15ms

得到对比图:

此次优化将充分地利用了每个时间片的资源,虽然某一段时间内的空跑时间总和一样,但是实际上将空跑的时间进行了分散,提高了资源的使用率,从而让每个任务的命中率提高到100%。

时间片差分调度法-充分利用MCU的资源的更多相关文章

  1. 修改uCOS_II以实现“优先级+时间片”联合调度

    本文在uCOS II上增加时间片任务调度的的原理: 对设置为同优先级的任务使用时间片调度,不同优先级任务仍然使用uCOS II的优先级调度策略.在同优先级任务的时间片调度中,所有任务暂时时间片长度固定 ...

  2. kubernetes调度之pod优先级和资源抢占

    系列目录 Pod可以拥有优先级.优先意味着相对于其它pod某个pod更为重要.如果重要的pod不能被调度,则kubernetes调度器会优先于(驱离)低优先级的pod来让处于pending状态的高优先 ...

  3. Hadoop YARN 调度器(scheduler) —— 资源调度策略

    本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/hadoop_yarn_resource_scheduler 搜了 ...

  4. ucos操作系统的内核有哪些调度方法

    1)时间片轮番调度法 假设系统中有5个任务,T1,T2,T3,T4,T5,这个时候,操作系统为每一个任务分配时间,比如说我们为T1任务分配10毫秒,为T2任务分配20毫秒,为T3任务分配5毫秒,为T4 ...

  5. 从linux和ucos的比较中来看进程这个概念

    这种问题就要和ucos结合起来嘛. 程序和进程: 程序:存放在磁盘上的一些列代码和数据的可执行映像,是一个静止的实体. 进程:是一个执行中的程序,它是动态的实体. linux进程的四要素: 1. 有一 ...

  6. 建立一个属于自己的AVR的RTOS

    建立一个属于自己的AVR的RTOS(序) 建立一个属于自己的AVR的RTOS(第一篇:函数的运行) 建立一个属于自己的AVR的RTOS(第二篇:人工堆栈) 建立一个属于自己的AVR的RTOS(第三篇: ...

  7. xmake v2.3.2 发布, 带来和ninja一样快的构建速度

    这个版本重点重构优化了下内部并行构建机制,实现多个target间源文件的并行编译,以及并行link的支持,同时优化了xmake的一些内部损耗,修复影响编译速度的一些bug. 通过测试对比,目前的整体构 ...

  8. CPU 时间片 分时 轮转调度

    时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片,即该进程允许运行的时间,使各个程序从表面上看是同时进行的.如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进 ...

  9. 资源管理与调度系统-资源管理系统Mesos

    资源管理与调度系统-资源管理系统Mesos 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Mesos是诞生于UC Berkeley的一个研究项目,它的设计动机是解决编程模型和计算框 ...

  10. spark性能调优:资源优化

    在开发完Spark作业之后,就该为作业配置合适的资源了.Spark的资源参数,基本都可以在spark-submit命令中作为参数设置.很多Spark初学者,通常不知道该设置哪些必要的参数,以及如何设置 ...

随机推荐

  1. 使用 HammerDB 对 Citus 和 Postgres 进行 Benchmark,每分钟200万新订单处理测试(官方博客)

    在为 Postgres 运行性能基准测试时,主要建议是:"自动化!" 如果您正在测量数据库性能,您可能不得不一遍又一遍地运行相同的基准测试. 要么是因为你想要一个稍微不同的配置,要 ...

  2. .Net CLR GC plan_phase二叉树和Brick_table

    楔子 别那么懒,勤快点.以下取自CLR PreView 7.0. 主题 GC计划阶段(plan_phase)主要就两个部分,一个是堆里面的对象构建一颗二叉树(这颗二叉树的每个节点包含了诸如对象移动信息 ...

  3. C++ 使用栈求解中缀、后缀表达式的值

    1. 前言 表达式求值对于有知识积累的你而言,可以通过认知,按运算符的优先级进行先后运算. 但对计算机而言,表达式仅是一串普通的信息而已,需要通过编码的方式告诉计算机运算法则,这个过程中栈起到了至关重 ...

  4. 驱动开发:内核特征码扫描PE代码段

    在笔者上一篇文章<驱动开发:内核特征码搜索函数封装>中为了定位特征的方便我们封装实现了一个可以传入数组实现的SearchSpecialCode定位函数,该定位函数其实还不能算的上简单,本章 ...

  5. 简单将Springboot项目部署到linux服务器上

    1.使用springboot的jar包方式 直接使用maven工具按照步骤点击就可以直接打包 2.到target目录下找到 jar包 3.将jar包放到linux的任意文件夹下(此项目是之前的kafk ...

  6. react.js+easyui 做一个简单的商品表

    效果图:     import React from 'react'; import { Form, FormField, Layout,DataList,LayoutPanel,Panel, Lab ...

  7. 鼠标悬浮上去显示小手CSS

    鼠标悬浮上去显示小手CSS只需要添加一句css代码即可 cursor:pointer;

  8. goroutine&waitgroup下载文件

    0.1.索引 https://blog.waterflow.link/articles/1663078266267 当我们下载一个大文件的时候,会因为下载时间太久而超时或者出错.那么我么我们可以利用g ...

  9. TCP 序列号和确认号是如何变化的?

    大家好,我是小林. 在网站上回答了很多人的问题,我发现很多人对 TCP 序列号和确认号的变化都是懵懵懂懂的,只知道三次握手和四次挥手过程中,ACK 报文中确认号要 +1,然后数据传输中 TCP 序列号 ...

  10. 浅谈API和SDK的区别

    首先了解一下他们的定义 API:application program interface 应用程序接口 通常表示一些事先定义好的函数,为了向外部提供一组功能的实现,实现和其他软件的交互 SDK:so ...