0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FreeRTOS任务调度器的三种调度算法讲解(下)

瑞萨MCU小百科 来源:瑞萨嵌入式小百科 2024-03-21 13:46 次阅读

2.配置调度算法

2.2

不带时间片的抢占式调度

配置如下时,调度算法就会变成不带时间片的抢占式调度

configUSE_PREEMPTION 1

configUSE_TIME_SLICING 0

和前面的唯一区别就是相同优先级的任务之间不会随时间自动切换。

如果不使用时间片,那么调度程序只会在发生这两种情况时,进行任务切换:

1

优先级更高的任务进入“就绪”态。

2

运行态任务变为阻塞态或被挂起。

很显然,不使用时间片时,任务切换的情况会变少,所以关闭时间切片可以减少调度器的处理开销。但是关闭时间切片也可能导致具有相同优先级的任务获得的处理时间相差很大。因此,一定要慎重使用。

524f3520-e740-11ee-a297-92fbcf53809c.png

task1为最高优先级的事件驱动任务,task2和Idle task有相同的优先级。但是由于关闭了时间片,任务切换只会在空闲任务阻塞或者挂起或者task1抢占后发生,所以空闲任务和task2虽然优先级相同,但是明显空闲任务占有的时间长很多。

2.3

协同调度

configUSE_PREEMPTION 0

configUSE_TIME_SLICING 随便

当使用协同调度时,只有当运行态任务进入阻塞态,或者运行态任务通过调用taskYIELD()主动让出,才会发生任务切换。

任务永远不会被抢占,不能使用时间片,时间片配置的值随便,无所谓。

525ff298-e740-11ee-a297-92fbcf53809c.png

task1、2、3优先级依次变低,刚开始task3运行,虽然task1和2优先级高,并且没有阻塞,但是也无法抢占,task3调用taskYIELD(),主动让出,因为task1优先级比task2高,task1就运行了,task1运行够了进入阻塞态,由于task2比task3优先级高,task2就运行了。

2.4

优缺点

多任务访问问题

在多任务程序中,应用程序编写人员必须注意一个资源不能被多个任务同时访问,因为同时访问可能会破坏资源。例如,考虑以下场景,其中正在访问的资源是UART(串口)。两个任务是向UART写入字符串,任务1写“abcdefghijklmnop”,任务2写“123456789”:

1

Task 1处于运行态,开始写它的字符串。它将“abcdefg”写入UART,然后离开运行态。

2

Task 2进入运行态,并在离开运行态之前向UART写入“123456789”。

3

任务1重新进入运行态,并将其字符串的剩余字符写入UART。

在该场景中,实际写入UART的内容是“abcdefg123456789hijklmnop”。Task 1写入的字符串没有按照预期的连续顺序写入UART,而是被损坏了,因为Task 2写入UART的字符串出现在UART中。

通常,使用协同调度比使用抢占调度更容易避免同时访问引起的问题。

当使用抢占式调度时,运行状态任务可以在任何时候被抢占,包括当它与另一个任务共享的资源处于不一致状态时。正如刚才UART示例所演示的,让资源处于不一致的状态可能导致数据损坏。

当使用协同调度时,应用程序编写人员控制何时可以切换到另一个任务(干完想干的再阻塞,或者让出)。因此,应用程序编写人员可以确保在资源处于不一致状态时不会发生切换到另一个任务的情况。在上面的UART示例中,应用程序编写人员可以确保Task 1在将其整个字符串写入UART之前不会离开运行态,这样做可以消除字符串被另一个任务的激活破坏的可能性。

很明显,协同调度比抢占调度响应要慢。

当使用协同调度时,最高优先级任务进入就绪态时并不一定会立即执行,必须等到运行态任务进入阻塞态或调用taskYIELD()才会被执行。

使用抢占调度时,当一个比运行态任务优先级更高的任务进入就绪态时,这个任务会立即执行。这一点对于必须在一定时间内响应高优先级任务的实时系统是非常重要的。至于多任务访问问题(其实也就是操作系统中的多线程问题),有其他手段去解决。

在RZ/T2L上做的实验

如果两个参数设置为:configUSE_PREEMPTION =0,configUSE_TIME_SLICING= 0或者1(随便) 称之为协同调度,当使用协同调度时,只有当运行态任务进入阻塞态,或者运行态任务通过调用taskYIELD()主动让出,才会发生任务切换。

任务永远不会被抢占,不能使用时间片,时间片配置的值随便。我做了一个实验截图如下:

526ccee6-e740-11ee-a297-92fbcf53809c.png

527466c4-e740-11ee-a297-92fbcf53809c.png

上面的实验说明 “只有当运行态任务进入阻塞态,或者运行态任务通过调用taskYIELD()主动让出,才会发生任务切换”,此时与时间片1 ms已经没有什么关系了。

如果两个参数设置为 configUSE_PREEMPTION =1,configUSE_TIME_SLICING=1, 此时只有两个任务并且优先级相同,每个任务都持续做一件事就会出现时间征为1ms的轮转情况:

5297b5ca-e740-11ee-a297-92fbcf53809c.png

52b641b6-e740-11ee-a297-92fbcf53809c.png

通过上面的两个实验可以说明,时间片存的意义是相同优先级并且持续时间较长的处理任务,需要平等分享CPU使用权。但是如果一旦有一方主动放弃CPU或者阻塞或者更高优先级任务来了,调度器是不会等待一个时间片完全结束,再去调度就绪列表中的任务的,而是直接调用就绪列表里的第一个任务。这样的设计我认为是合理的,如果一定要等待时间片结束,是存在严重的资源浪费的。




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61349
  • UART接口
    +关注

    关注

    0

    文章

    123

    浏览量

    15068
  • 中断优先级
    +关注

    关注

    0

    文章

    22

    浏览量

    9268
  • 调度器
    +关注

    关注

    0

    文章

    95

    浏览量

    5161

原文标题:FreeRTOS任务调度器的三种调度算法和在RZ/T2L上的实践(下)

文章出处:【微信号:瑞萨MCU小百科,微信公众号:瑞萨MCU小百科】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    FreeRTOS任务调度器的三种调度算法讲解(上)

    RZ/T2L是一款高性能MPU,可通过EtherCAT实现高速、高精度的实时控制。
    的头像 发表于 03-21 13:43 587次阅读
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>任务</b><b class='flag-5'>调度</b>器的<b class='flag-5'>三种</b><b class='flag-5'>调度</b><b class='flag-5'>算法</b><b class='flag-5'>讲解</b>(上)

    改进的SEDF调度算法

    引入一比较机制来执行多处理间的负载平衡.当VCPU调度时,将就绪VCPU迁移到总运行时间最少的处理上.仿真实验结果表明:IEDF调度
    发表于 04-24 10:03

    转:第14章 任务调度—抢占式,时间片和合作式

    调度方式FreeRTOS操作系统支持三种调度方式:抢占式调度,时间片调度和合作式
    发表于 08-30 09:55

    转第16章 FreeRTOS调度锁,任务锁和中断锁

    任务锁函数,但是使用FreeRTOS现有的功能有两实现方法:(1)通过给调度加锁实现利用FreeR
    发表于 09-01 07:45

    FreeRTOS如何使用delay作为系统延时、任务调度

    请教一个问题,最近在学习使用FreeRTOS,想像原子一样在delay.c里添加RTOS的系统支持,即使用tick时钟作延时。现在有几个问题:1、在启动任务调度前,如果调用了dela
    发表于 06-10 04:37

    请问FreeRTOS是如何实现调度的?

    最近入门RTOS,首先看书了解了合作式调度的应用,其基本思想是在主循环中不断执行调度函数,在SysTick中断中更新任务状态,程序我也大致看懂了。之后到了入门
    发表于 07-30 07:40

    调度的原理及其任务调度代码实现

    一、介绍调度是常用的一编程框架,也是操作系统的拆分多任务的核心,比如单片机的裸机程序框架,网络协议栈的框架如can网关、485网关等等,使用场合比较多,是做稳定产品比较常用的编程技
    发表于 02-17 07:07

    FreeRTOS时间片调度概述

    一、FreeRTOS时间片调度概述FreeRTOS支持多个任务同时拥有一个优先级,这些任务调度
    发表于 02-18 06:10

    网格任务调度算法研究

    网格任务调度算法是影响网格成功与否的关键技术之一。本文总结了网格计算系统的体系结构和特征,分析了网格任务调度
    发表于 08-14 10:27 10次下载

    Hadoop中任务调度算法的改进

    针对Hadoop0.20.0中任务调度算法存在的不足,提出一种基于改进遗传算法(IGA)的任务调度
    发表于 12-17 10:57 0次下载
    Hadoop中<b class='flag-5'>任务</b><b class='flag-5'>调度</b><b class='flag-5'>算法</b>的改进

    基于遗传加差分算法的云计算任务调度

    基于遗传加差分算法的云计算任务调度
    发表于 01-07 21:28 0次下载

    任务阈值调度算法

    针对当前云任务调度算法在密码云环境中无法实现任务实时处理的问题,提出一种基于滚动优化窗口的实时阈值调度方法。首先,将密钥调用环节融入密码
    发表于 11-24 17:08 5次下载
    云<b class='flag-5'>任务</b>阈值<b class='flag-5'>调度</b><b class='flag-5'>算法</b>

    异构多核处理器任务调度算法

    任务调度响应实时性方面表现优异,但却不适用于异构多核处理器环境。为此,提出一种高实时性任务调度算法HRSA。在Min-Min
    发表于 02-07 11:07 1次下载

    FreeRTOS时间片进行任务调度

    注意:①任务切换会存在时间片开销;FreeRTOS支持时间片,每个优先级可以支持无限多个任务,这些任务调度就是时间片
    发表于 12-23 20:02 0次下载
    <b class='flag-5'>FreeRTOS</b>时间片进行<b class='flag-5'>任务</b><b class='flag-5'>调度</b>​

    FreeRTOS调度器中的三种调度算法实践(上)

    在优先级高于运行态任务任务进入就绪态时,调度器立即让这个高优先级的任务“抢占”运行态任务。被抢占意味着
    发表于 03-21 13:45 99次阅读
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>调度</b>器中的<b class='flag-5'>三种</b><b class='flag-5'>调度</b><b class='flag-5'>算法</b>实践(上)