当前位置: 首页 > news >正文

FreeRTOS【3】任务调度算法

重要概念

在运行的任务,被称为"正在使用处理器",它处于运行状态。在单处理系统中,任何时间里只能有一个任务处于运行状态。
非运行状态的任务,它处于这 3 中状态之一:阻塞(Blocked)、暂停(Suspended)、就绪(Ready)。
就绪态的任务,可以被调度器挑选出来切换为运行状态,调度器永远都是挑选最高优先级的就绪态任务并让它进入运行状态。
阻塞状态的任务,它在等待"事件",当事件发生时任务就会进入就绪状态。
事件分为两类:时间相关的事件、同步事件。
所谓时间相关的事件,就是设置超时时间:在指定时间内阻塞,时间到了就进入就绪状态。使用时间相关的事件,可以实现周期性的功能、可以实现超时功能。
同步事件就是:某个任务在等待某些信息,别的任务或者中断服务程序会给它发送信息。怎么"发送信息"?方法很多,有:任务通知(task notification)、队列(queue)、事件组(event group)、信号量(semaphoe)、互斥量(mutex)等。这些方法用来发送同步信息,比如表示某个外设得到了数据。

配置调度算法

所谓调度算法,就是怎么确定哪个就绪态的任务可以切换为运行状态。
通 过 配 置 文 件 FreeRTOSConfig.h 的 两 个 配 置 项 来 配 置 调 度 算 法 :

  • configUSE_PREEMPTION、
  • configUSE_TIME_SLICING。
  • configUSE_TICKLESS_IDLE,它是一个高级选项,用于关闭 Tick中断来实现省电,后续单独讲解。 现在configUSE_TICKLESS_IDLE 设为 0,先不使用这个功能。
    调度算法的行为主要体现在两方面:高优先级的任务先运行、同优先级的就绪态任务如何被选中。调度算法要确保同优先级的就绪态任务,能"轮流"运行,策略是"轮转调度"(Round Robin Scheduling)。轮转调度并不保证任务的运行时间是公平分配的,我们还可以细化时间的分配方法。

从 3 个角度统一理解多种调度算法:

  1. 可否抢占?高优先级的任务能否优先执行(配置项: configUSE_PREEMPTION)
    • 可以:被称作"可抢占调度"(Pre-emptive),高优先级的就绪任务马上执行,下面再细化。
    • 不可以:不能抢就只能协商了,被称作"合作调度模式"(Co-operativeScheduling) ,这种模式下:当前任务执行时,更高优先级的任务就绪了也不能马上运行,只能等待当前任务主动让出 CPU 资源。 其他同优先级的任务也只能等待(更高优先级的任务都不能抢占,平级的更应该老实点)。
  2. 可抢占的前提下,同优先级的任务是否轮流执行(配置configUSE_TIME_SLICING)
    • 轮流执行:被称为"时间片轮转"(Time Slicing),同优先级的任务轮流执行,你执行一个时间片、我再执行一个时间片
    • 不轮流执行:英文为"without Time Slicing",当前任务会一直执行,直到主动放弃、或者被高优先级任务抢占。(如果任务1一直执行直到高任务抢占,高任务放弃执行时候,就会执行任务1同级别的其他任务了)
  3. 在"可抢占"+"时间片轮转"的前提下,进一步细化:空闲任务是否让步于用户任务(配置项: configIDLE_SHOULD_YIELD)
    • 空闲任务低人一等,每执行一次循环,就看看是否主动让位给用户任务
    • 空闲任务跟用户任务一样,大家轮流执行,没有谁更特殊。

以下是整理后的 Markdown 表格格式:

配置项A (常用)B (很少用)C (很少用)D (很少用)E (几乎不用)
模式可抢占+时间片轮转+空闲任务让步可抢占+时间片轮转+空闲任务不让步可抢占+非时间片轮转+空闲任务让步可抢占+非时间片轮转+空闲任务不让步合作调度
configUSE_PREEMPTION11110
configUSE_TIME_SLICING1100x
configIDLE_SHOULD_YIELD1010x
http://www.xdnf.cn/news/119161.html

相关文章:

  • Qt —— 在Linux下试用QWebEngingView出现的Js错误问题解决(附上四种解决办法)
  • React 与 Vue:两大前端框架的深度对比
  • 4月份最新---Meta发明了一种很新的Transformer
  • 【AI】基于OllamaSharp与.NET Core API的高效LLM查询实现
  • Langchain_Agent+数据库
  • 从对数变换到深度框架:逻辑回归与交叉熵的数学原理及PyTorch实战
  • ssh启动不了报错
  • 3台CentOS虚拟机部署 StarRocks 1 FE+ 3 BE集群
  • React19源码阅读之commitRoot
  • OpenBMC:BmcWeb login创建session
  • Spring Boot + MyBatis-Plus 的现代开发模式
  • 基于 EFISH-SBC-RK3588 的无人机通信云端数据处理模块方案‌
  • QT构建即时通讯应用--WebSocket全面解析与实战指南
  • 3. pandas笔记之:创建
  • 助力网站优化利用AI批量生成文章工具提升质量
  • 【QT网络】构建简单Udp回显服务器
  • ArrayList与顺序表详解
  • C# 结构(Struct)
  • 【AI News | 20250424】每日AI进展
  • 文件操作、流对象示例
  • Spring AI简介
  • vscode vue文件单行注释失效解决办法
  • 基于Keras3.x使用CNN实现简单的猫狗分类
  • WAMP设置外网访问
  • servlet-优化
  • ASP.NET Core 主机模型详解:Host、WebHost与WebApplication的对比与实践【代码之美】
  • 实现优雅的分页导航:从原理到最佳实践
  • Java查询数据库表信息导出Word
  • C++ STL priority_queue 详解:从基础到自定义类型
  • Spring Boot YML配置值“011“在代码中变为9的问题解析