1、任务调度
任务调度对于电子类或者自动化类专业小伙伴最早接触一般都是在接触RTOS后了,然而对于计算机相关专业的小伙伴应该在学《计算机操作系统》老师对这一块讲解的非常清楚了,包括一些性能指标的定义与计算等等,不过作者这里仅仅只针对RTOS进行讲解,大家感兴趣可以找一下操作系统的书籍更加深入学习。
大家都知道我们的操作系统可以隐蔽底层实现,为用户提供API接口来供我们的应用程序服务,同时操作系统可以管理多个任务实现CPU的最大利用率,然而对于RTOS提供的最主要功能就是任务的调度来管理多个任务。
任务的调度简单一点的说就是确定任务该怎么执行的一种机制,这种涉及到策略的问题其实都可以归纳为算法问题,从而也就会出现了各种各样的任务调度算法,比如时间片轮转调度算法、优先级调度算法、短任务先行调度算法等等,当然肯定没有一种完美的调度算法,每种算法都有其特点,根据任务的自身特点匹配任务调度从而满足用户需求。
然而对于目前大部分的RTOS都是采用一种可剥夺方式的优先级抢占内核调度算法,通过为每个任务设置一个优先级来标记任务的紧急程度,优先级高的任务获得优先占用CPU的权利,当高优先级任务执行完毕进而寻找次高优先级来执行。(同时也存在优先级翻转问题)有阅读过1-2种RTOS内核的小伙伴应该都有一种感受:"这不都一样吗?",确实除了系统中实现的方式和效率有所差异之外,基本上都大同小异,不过大家在学习的过程应该多问一下为什么这样设计?这样设计的好处是什么?会带来什么问题?有没有自己觉得更好的设计方案?等等之类的。
2、"先来先服务调度"与“前后台架构”
1)先来先服务调度
先来先服务调度(FCFS: first come first service)该调度算法算是最简单的一种,先进入就绪的任务首先占用CPU被执行,而且是一种非抢占式的任务调度,非常类似于数据结构-队列的形式,一旦任务进入就绪状态便会进入FIFO就绪队列。
特点说明:
任务调度主要是存在任务的切换过程,需要进行现场的保存等等处理,而对于先到先服务调度,任务是不可剥夺的,每次都需要先进来的任务执行完毕主动的放弃CPU,进而执行下一个等待的任务。所以这样短任务的执行需要等待长任务执行完毕以后才能进行运行,这样对短任务的实时性大大降低,同时整体性能上也不是太好。
2)先来先服务VS前后台架构
之前很多小伙伴认为前后台的顺序执行架构和分时轮询架构都属于先进先服务调度,这里作者为大家分析一下他们之间的区别和关联:
区别与关联:
一般先来先服务调度都是通过任务主动休眠放弃CPU,然后从就绪队列取出新的任务进行执行,就绪FIFO里面的任务顺序是根据任务休眠时间结束的事件先后来进行排列的,如果我们能够控制FIFO中的任务排序便能够实现跟前后台顺序和分时轮询类似的效果。
然而对于前后台分时轮询架构其实和先进先服务调度还是存在一个优先级的概念在里面的,虽然说两者都不能实现任务上的抢占,不过对于分时轮询架构存在任务间的抢占,举个例子如下图所示:
一些小伙伴该问了,在使用前后台分时轮询没有使用设置优先级呀,怎么会有优先级的概念呢?通过看之前的架构程序你会发现,我们整个程序运行是存在顺序的,比如执行顺序为任务1-->任务2-->任务3依次排列,当任务1快执行完毕,而任务3定时任务已经准备就绪很久了,此时刚好任务2时间到进入就绪,此时对于前后台分时轮询是会先执行任务2,因为任务2在任务1代码后面,而对于先进先服务调度则还是会执行任务3,然后执行任务2。
那么其实我们可以对前后台分时轮询进行队列改造,其实可以达到先进先服务类似的效果,同样两者都是不可被抢断,每个任务都能够有执行的机会。
3、时间片调度-(也叫RR调度)
还记很久之前uC/OSIII没有出现的时候,uC/OSII并不支持同优先级任务的运行,很多小伙伴想办法改写调度机制,不过现在主流RTOS应该都支持时间片轮询调度。时间片轮询调度是一种非常公平的调度办法,系统中规定一个时间单元,同优先级的任务按照顺序执行该时间单元规定的时间,执行完一个时间片便会切换到其他任务再执行相同的时间单元,这样交替执行实现多任务。
解析一下:
我们可以通过上面的图看到时间片调度就是根据时间单元轮流切换执行时间,这样看来时间片的长度选择尤为关键,如果时间片过短,大部分的事件都浪费在了任务的切换上面,那么CPU的利用率较低;但是如果时间片时间过长又会导致该调度退化为类似于先进先服务调度模式,这样对于短任务的响应是大打折扣的。
所以时间片调度机制属于一种抢占式调度机制,如果有n个任务进行时间片调度,如果时间片的时间为t,那么每个任务得到执行的时间不会超过(n-1)t,一定要注意的是这里仅仅是得到执行,并不是执行结束,如果任务能够在一个时间片内执行完毕,则可以认为得到执行并执行完毕。
如果选择最优时间片呢?如果你想通过理论来进行计算的话就需要了解一下调度的性能指标比如完成时间,周转时间,带权时间,平均周转时间,平均带权周转时间等等,然后通过测试每个任务的执行时间来求出最优的时间片;不过在我们程序的运行中大部分运行时间都是动态的,且时间片的选择对我们的需求影响并不是特别大,只要不过分小或者过分大均合适,一般个人取值都是在任务切换时间的50~100倍之间进行取值,同时也会根据实际调试情况进行调整。
4、最后小结
通过上面的知识介绍大家应该明白前后台分时轮询和时间片的差异和联系了吧,其实叫做什么名字作者觉得并不是那么重要,关键是大家要达成共识,并且了解其中的区别,对于任务调度算法其实还有很多,大家平时可以对目前的RTOS进行调度机制的改造,并且通过对应的测试指标获得各个算法的性能。
上一篇:MCU--常用于单片机的接口适配器模式C语言实现
下一篇:新唐n76e003单片机遥控PWM信号检测控制航灯系统
推荐阅读最新更新时间:2024-11-11 11:49
设计资源 培训 开发板 精华推荐
- IDF真难用 之 ESP32S2 开发板
- 使用外部基准的 AD5324 12 位 DAC 的典型应用
- LTC3624EDD-23.3 3.3V 输出电压、2A 同步降压稳压器的典型应用,具有 800mA 突发钳位,fSW = 1MHz
- LTC1865 的典型应用 - MSOP 中的功率、16 位、250ksps 1 和 2 通道 ADC
- LTM8052AEV 5.6A、36Vin 为两个 2.5V 系列超级电容器充电的典型应用
- LT3970IDDB-3.3 3.3V 降压转换器的典型应用
- Spx432 精密大电流串联稳压器的典型应用,Vout = (1+R1/R2)Vref
- LT8495EUF 450kHz、5V 输出 SEPIC 转换器的典型应用电路
- 用于负电压的 48 伏热插拔控制器
- 使用 Analog Devices 的 LT1934EDCB 的参考设计
- 报名抽取京东卡|2021慕尼黑华南电子展观众注册进行中
- 西门子精彩视频限时免费|利用电子产品生命周期管理 (PLM) 更快地交付更多产品
- 家电新风尚,PI开启您的家电新生活!下载产品资料答题赢好礼!
- 有奖直播|安森美高能效产品在智能快充的应用
- STM32H7R/S 高性能MCU 开启全新的创新机遇!答题好礼~还有开发板等你拿!
- 新年芯币竞价第三期——图书竞价
- 显摆!我最得意的MSP430作品
- 阅读是德科技 Power Supply、汽车电子精彩专题,让您的设计更精准!参与答题赢好礼!
- TI 工业月阅读打卡计划
- 免费测评|ESP32-S2-Kaluga-1新型多媒体开发板,灵活拆装,满足多种需求