RTOS之Freertos的操作系统原理

2023-05-16

任务调度机制的实现

任务调度机制是嵌入式实时操作系统的一个重要概念,也是其核心技术。对于可剥夺型内核,优先级高的任务一旦就绪就能剥夺优先级较低任务的CPU使用权,提高了系统的实时响应能力。

FreeRTOS 支持的调度方式

FreeRTOS 操作系统支持三种调度方式:抢占式调度,时间片调度和合作式调度。 实际应用主要是
抢占式调度和时间片调度,合作式调度用到的很少(ps: 在最新的FreeRTOS中,合作式调度也就是协程式调度已被舍弃)。

抢占式调度

每个任务都有不同的优先级,任务会一直运行直到被高优先级任务抢占或者遇到阻塞式的 API 函数,比如
vTaskDelay执行不同优先级任务之间的任务切换

时间片调度

每个任务都有相同的优先级,任务会运行固定的时间片个数或者遇到阻塞式的 API 函数,比如
vTaskDelay,才会执行同优先级任务之间的任务切换。

什么是调度器

简单的说,调度器就是使用相关的调度算法来决定当前需要执行的任务。所有的调度器有一个共同的特性:

  • 调度器可以区分就绪态任务和挂起任务(由于延迟,信号量等待,邮箱等待,事件组等待等原因而使得任务被挂起)。

  • 调度器可以选择就绪态中的一个任务,然后激活它(通过执行这个任务)。 当前正在执行的任务是运行态的任务。

  • 不同调度器之间最大的区别就是如何分配就绪态任务间的完成时间。

嵌入式实时操作系统的核心就是调度器和任务切换调度器的核心就是调度算法。任务切换的实现在不同的嵌入式实时操作系统中区别不大,基本相同的硬件内核架构,任务切换也是相似的。调度算法就有些区别了。

抢占式调度器和时间片调度器

抢占式调度器

使用抢占式调度器,使得最高优先级的任务什么时候可以得到 CPU 的控制权并运行是可知的,同时使得任务级响应时间得以最优化。
总的来说,学习抢占式调度要掌握的最关键一点是:每个任务都被分配了不同的优先级,抢占式调度器会获得就绪列表中优先级最高的任务,并运行这个任务。

如果用户在 FreeRTOS 的配置文件 FreeRTOSConfig.h 中
禁止使用时间片调度, 那么每个任务必须配置不同的优先级。

举例说明:
前提:创建 3 个任务 Task1,Task2 和 Task3。

  1. Task1 的优先级为 1,Task2 的优先级为 2,Task3 的优先级为 3。 FreeRTOS 操作系统是设置的数值越小任务优先级越低,故 Task3 的优先级最高,Task1 的优先级最低。
  2. 此框图是 FreeRTOS 操作系统运行过程中的一部分。
    在这里插入图片描述

运行过程描述如下:

  • 此时任务 Task1 在运行中,运行过程中由于 Task2 就绪,在抢占式调度器的作用下任务 Task2 抢占Task1 的执行。 Task2 进入到运行态,Task1 由运行态进入到就绪态。

  • 任务 Task2 在运行中,运行过程中由于 Task3 就绪,在抢占式调度器的作用下任务 Task3 抢占 Task2的执行。 Task3 进入到运行态,Task2 由运行态进入到就绪态。

  • 任务 Task3 运行过程中调用了阻塞式 API 函数,比如 vTaskDelay,任务 Task3 被挂起,在抢占式调度器的作用下查找到下一个要执行的最高优先级任务是 Task2,任务 Task2 由就绪态进入到运行态。

  • 任务 Task2 在运行中,运行过程中由于 Task3 再次就绪,在抢占式调度器的作用下任务 Task3 抢占Task2 的执行。 Task3 进入到运行态,Task2 由运行态进入到就绪态。

上面就是一个简单的不同优先级任务通过抢占式调度进行任务调度和任务切换的过程。

时间片调度器

    在小型的嵌入式 RTOS 中,最常用的的时间片调度算法就是 Round-robin 调度算法。
    这种调度算法可以用于抢占式或者合作式的多任务中。另外,时间片调度适合用于不要求任务实时响应的情况。实现 Round-robin 调度算法需要给同优先级的任务分配一个专门的列表,用于记录当前就绪的任务,并为每个任务分配一个时间片(也就是需要运行的时间长度,时间片用完了就进行任务切换)。

FreeRTOSConfig.h 文件中使能宏定义:
#define configUSE_TIME_SLICING 1

时间片调度使用举例说明:
在这里插入图片描述

创建 4 个同优先级任务 Task1,Task2,Task3 和 Task4。
每个任务分配的时间片大小是 5 个系统时钟节拍。

运行过程描述如下

  • 先运行任务 Task1,运行够 5 个系统时钟节拍后,通过时间片调度切换到任务 Task2。
  • 任务 Task2 运行够 5 个系统时钟节拍后,通过时间片调度切换到任务 Task3。
  • 任务 Task3 在运行期间调用了阻塞式 API 函数,调用函数时,虽然 5 个系统时钟节拍的时间片大小还没有用完,此时依然会通过时间片调度切换到下一个任务 Task4。 (注意,没有用完的时间片不会再使用,下次任务 Task3 得到执行还是按照 5 个系统时钟节拍运行)
  • 任务 Task4 运行够 5 个系统时钟节拍后,通过时间片调度切换到任务 Task1。

上面就是一个简单的同优先级任务通过时间片调度进行任务调度和任务切换的过程。

时间管理的实现

    FreeRTOS提供的典型时间管理函数是vTaskDelay(),调用此函数可以实现将任务延时一段特定时间的功能。在FreeRT0S中,若一个任务要延时xTicksToDelay个时钟节拍,系统内核会把当前系统已运行的时钟节拍总数(定义为xTickCount,32位长度)加上xTicksToDelay得到任务下次唤醒时的时钟节拍数xTimeToWake。然后,内核把此任务的任务控制块从就绪链表中删除,把xTimeToWake作为结点值赋予任务的xItemValue,再根据xTimeToWake的值把任务控制块按照顺序插入不同的链表。若xTimeToWake > xTickCount,即计算中没有出现溢出,内核把任务控制块插入到pxDelayedTaskList链表;若xTimeToWak e< xTickCount,即在计算过程中出现溢出,内核把任务控制块插入到pxOverflowDelayed-Taskust链表。

    每发生一个时钟节拍,内核就会把当前的xTick-Count加1。若xTickCount的结果为0,即发生溢出,内核会把pxOverflowDelayedTaskList作为当前链表;否则,内核把pxDelaycdTaskList作为当前链表。内核依次比较xTickCotlrtt和链表各个结点的xTimcToWake。若xTick-Count等于或大于xTimeToWake,说明延时时间已到,应该把任务从等待链表中删除,加入就绪链表。

    由此可见,不同于μC/OS—II,FreeRTOS采用“加”的方式实现时间管理。其优点是时间节拍函数的执行时间与任务数量基本无关,而μC/OS—II的OSTimcTick()的执行时间正比于应用程序中建立的任务数。因此当任务较多时,FreeRTOS采用的时间管理方式能有效加快时钟节拍中断程序的执行速度

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RTOS之Freertos的操作系统原理 的相关文章

  • 基于HAL库的FREERTOS----------一.任务

    FreeROTS 就是一个免费的 RTOS 类系统 这里要注意 RTOS 不是指某一个确定的系统 而是指一类系统 比如 UCOS FreeRTOS RTX RT Thread 等这些都是 RTOS 类操作系统 FreeRTOS 是 RTOS
  • FreeRTOS+CubeMX系列第一篇——初识FreeRTOS

    文章目录 一 关于FreeRTOS 二 FreeRTOS的特点 三 如何在CubeMX上配置FreeRTOS 四 FreeRTOS文档资料 五 同系列博客 一 关于FreeRTOS 1 什么是FreeRTOS FreeRTOS是一个迷你的实
  • FreeRTOS临界区

    FreeRTOS临界区是指那些必须完整运行 不能被打断的代码段 比如有的外设的初始化需要严格的时序 初始化过程中不能被打断 FreeRTOS 在进入临界区代码的时候需要关闭中断 当处理完临界区代码以后再打开中断 FreeRTOS 系统本身就
  • freeRTOS使用uxTaskGetStackHighWaterMark函数查看任务堆栈空间的使用情况

    摘要 每个任务都有自己的堆栈 堆栈的总大小在创建任务的时候就确定了 此函数用于检查任务从创建好到现在的历史剩余最小值 这个值越小说明任务堆栈溢出的可能性就越大 FreeRTOS 把这个历史剩余最小值叫做 高水位线 此函数相对来说会多耗费一点
  • OSAL

    OSAL为 Operating System Abstraction Layer 即操作系统抽象层 支持多任务运行 它并不是一个传统意义上的操作系统 但是实现了部分类似操作系统的功能 OSAL概念是由TI公司在ZIGBEE协议栈引入 他的意
  • 【FreeRTOS】任务通知的使用

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • FreeRTOS笔记(一)简介

    这个笔记主要依据韦东山freertos快速入门系列记录 感谢韦东山老师的总结 什么是实时操作系统 操作系统是一个控制程序 负责协调分配计算资源和内存资源给不同的应用程序使用 并防止系统出现故障 操作系统通过一个调度算法和内存管理算法尽可能把
  • Arduino IDE将FreeRTOS用于STM32

    介绍 适用于STM32F103C8的FreeRTOS STM32F103C是一种能够使用FreeRTOS的ARM Cortex M3处理器 我们直接在Arduino IDE中开始使用STM32F103C8的FreeRTOS 我们也可以使用K
  • FreeRTOS笔记(十)中断

    中断 当CPU在执行某一事件A时 发生另外一个更重要紧急的事件B请求CPU去处理 产生了中断 于是CPU暂时中断当前正在执行的事件A任务而对对事件B进行处理 CPU处理完事件B后再返回之前中断的位置继续执行原来的事件A 这一过程统称为中断
  • FreeRTOS学习---“定时器”篇

    总目录 FreeRTOS学习 任务 篇 FreeRTOS学习 消息队列 篇 FreeRTOS学习 信号量 篇 FreeRTOS学习 事件组 篇 FreeRTOS学习 定时器 篇 FreeRTOS提供了一种软件定时器 用来快速实现一些周期性的
  • FreeRTOS临界段

    1 临界段 在访问共享资源时不希望被其他任务或者中断打断的代码 这段要执行的代码称为临界段代码 2 设置临界段的目的 保护共享资源 例如 全局变量 公共函数 不可重入函数 函数里面使用 了一些静态全局变量 malloc 等 保护外设的实时性
  • 再论FreeRTOS中的configTOTAL_HEAP_SIZE

    关于任务栈和系统栈的基础知识 可以参考之前的随笔 FreeRTOS 任务栈大小确定及其溢出检测 这里再次说明 define configTOTAL HEAP SIZE size t 17 1024 这个宏 官方文档解释 configTOTA
  • 1-9 人机交互的角度

    操作系统的人机交互部分 OS改善人机界面 为用户使用计算机提供良好的环境 人机交互设备包括传统的终端设备和新型的模式识别设备 OS的人机交互部分用于控制有关设备运行和理解执行设备传来的命令 人机交互功能是决定计算机系统友善性的重要因素 是当
  • 像 PTLsim 这样的 CAS 模拟器如何实现 x86 硬件的周期精确模拟?

    谁能告诉我 CAS 软件怎么样http www ptlsim org 工作 如果不知道每条指令使用了多少个周期 也不知道 CPU 分支预测逻辑 那么它们如何实现周期精度 或者一切都可以通过保密协议获得吗 我想它们可能可以非常准确地命中或错过
  • FreeRTOS 配置TICK_RATE_HZ

    我使用的是带有 5 4 版 FreeRTOS 的 MSP430f5438 我有一个有趣的问题 我无法弄清楚 基本上 当我将 configTICK RATE HZ 设置为不同的值时 LED 闪烁得更快或更慢 它应该保持相同的速率 我将 con
  • 当一个任务写入变量而其他任务读取该变量时,我们是否需要信号量?

    我正在研究 freeRtos 并且我有一个名为 x 的变量 现在 每秒只有一个任务正在写入该变量 而其他任务正在读取该变量值 我需要用互斥锁来保护变量吗 如果变量为 32 位或更小 并且其值是独立的并且不与任何其他变量一起解释 则不需要互斥
  • 如何更改 FreeRTOS 中任务的最大可用堆大小?

    我通过以下方式在任务中创建元素列表 l dllist pvPortMalloc sizeof dllist dlllist 有 32 字节大 我的嵌入式系统有 60kB SRAM 所以我希望系统可以轻松处理我的 200 个元素列表 我发现在
  • FreeRTOS 匈牙利表示法 [重复]

    这个问题在这里已经有答案了 我是 RTOS 和 C 编程的新手 而且我仍在习惯 C 的良好实践 因此 我打开了一个使用 FreeRTOS 的项目 我注意到操作系统文件使用匈牙利表示法 我知道一点符号 但面临一些新的 标准 FreeRTOS
  • GNU Arm Cortex m4 上的 C++ 异常处理程序与 freertos

    2016 年 12 月更新现在还有一个关于此行为的最小示例 https community nxp com message 862676 https community nxp com message 862676 我正在使用带有 free
  • 开始使用 Real Time Linux 编程的最佳方式是什么?

    虽然我用C实现了很多项目 但我对操作系统完全陌生 我在 Discovery board STM32 上尝试了实时 Linux 并得到了闪烁 LED 的正确结果 但我并没有真正理解整个过程 因为我只是按照步骤操作 并且无法在互联网上找到每个步

随机推荐

  • Linux之/etc/fstab文件详解及实践

    转 https blog csdn net carefree2005 article details 125632867
  • Jenkins 上传文件到工作目录

    使用插件 xff1a File Parameter Plugin 之前写过一篇关于Jenkins 用户上传文件到工作目录的文章 xff0c 那时候还需要使用sharedlibraries 现在使用这个插件可以非常简单的上传文件 话不多说 x
  • Jenkins 在不同的agent之间传递文件/上传文件

    有时jenkins pipeline需要在不同的agent上执行不同的操作 xff0c 同时需要在不同的agent之间传递文件 方法如下 xff1a stage 39 上传文件 39 agent 39 label A 39 steps sc
  • 解决vscode编写go代码时提示过慢

    vscode的自动代码提示 xff0c 发现太慢了 xff0c 隔3 xff0c 4秒才会出提示 xff0c 所以换为Google推荐的 gopls来代替 下载过程 方案一 打开 VS Code 的setting 搜索 go useLang
  • windows server安装OpenSSH server

    右键powershell 选择以管理员运行 powershell 查看可安装的OpenSSH server版本 xff0c 在PowerShell中执行命令如下所示 Get WindowsCapability Online Name Ope
  • 表白密码:I Love you的42种密码表白方式

    字母表白数字密码 xff1a 9121522521 表白解密 xff1a 从1开始到26 xff0c 分别表示从A到Z xff0c 即 xff1a A xff08 1 xff09 B xff08 2 xff09 C xff08 3 xff0
  • C语言字符串结束标志

    为了测定字符串的实际长度 xff0c C语言规定了一个字符串结束标志 0 作为标志 xff0c 如果一个字符串为9个 xff0c 前面九个都不为空字符 xff0c 那么第十个字符为 0 xff0c 也就是说在遇到字符 0 时 xff0c 表
  • 用体光栅作角度滤波器

    体光栅由于其高光谱灵敏性和角度灵敏度 xff0c 可以设计成光谱滤波器或角度滤波器 根据K Bang等人的工作 xff0c 我们在VirtualLab Fusion中构造了这样的体光栅 xff0c 并分析了它们的角度响应 与传统的采用4 f
  • linux网络编程(完整版)

    之间在网上看到很多网络编程都是一个一个demo xff0c 今天我把之前学到的汇总起来 xff0c 希望大家可以进行补充 我理解的网络通信分为4种 1 xff0c udp客户端 2 xff0c udp服务端 3 xff0c tcp客户端 4
  • 一阶线性微分方程

    1 一阶线性微分方程概念 2 一阶线性齐次微分方程解法 例题 xff1a 例题 xff1a 3 一阶线性非齐次微分方程解法 例题 xff1a 4 伯努利方程 例题 xff1a
  • 集成学习(Bagging和Boosting)

    一 概念 集成学习就是组合这里的多个弱监督模型以期得到一个更好更全面的强监督模型 xff0c 集成学习潜在的思想是即便某一个弱分类器得到了错误的预测 xff0c 其他的弱分类器也可以将错误纠正回来 Baggging 和Boosting都是模
  • 传感器数据异常预测-实战篇

    好久没更新了 xff0c 记录一下近两年研究的一套算法吧 xff0c 只讲讲方法部分 xff0c 细节再更新吧 时序数据的异常检测我一般分成两类 xff0c 单信号和多信号 单信号 对于一条数据的异常检测 xff0c 我划分成两类 xff0
  • 天线基础知识(四)接收灵敏度

    1 接收灵敏度 接收灵敏度是指无线设备正常工作所需的天线口最小信号接收功率 系统间的干扰会导致无线设备灵敏度的下降 xff0c 影响信号的正常接收 xff0c 因此通常以无线设备灵敏度准则作为被干扰系统的保护准则 无线传输的接收灵敏度类似于
  • px4讲解(一)历史起源

    第一节 对于初次接触无人机行业的人来说一些无人机行业课外知识还是需要了解的 xff0c ardupilot和px4是目前无人机行业最受欢迎 也是最为先进的飞控软件 xff0c 他们又是如何诞生并一路走来的呢 xff0c 他们跟Droneco
  • px4讲解(二)软件硬件

    无人机 xff08 飞控 xff09 软硬件介绍 无人机 xff08 简称 飞控 xff09 的软件和硬件都是开源的 xff0c 飞控的硬件也是是 开源的 xff0c 硬件 xff1a PIXHAWK 其硬件可以根据自己的需要修改硬件 xf
  • PX4官方examples 发布与订阅 分析

    功能 xff1a 实现 订阅 sensor combined 消息 xff0c 将订阅的消息数据 通过发布主题 xff08 vehicle attitude xff09 发布出去 Copyright 2012 2019 PX4 Develo
  • FreeRTOS详解

    FreeRTOS 1 任务切换 xff1a 使用vTaskDelayUntil vTaskDelay xQueueSend函数可以引起任务切换从中断函数中退出后 xff0c 执行高优先级任务 xff1a span class token c
  • 通讯协议制定之常用校验的实现

    1 异或校验 span class token macro property span class token directive hash span span class token directive keyword include s
  • Linux终端下显示全部make信息的方法

    博主新开了个人站点 xff0c 你也可以在这看到这篇文章 xff0c 点击打开链接 我们编译较大的工程项目时 xff0c 总会遇到以下情况 xff1a 输入make命令后 xff0c 显示了很长的一段信息 xff0c 但是只能显示下面的一部
  • RTOS之Freertos的操作系统原理

    任务调度机制的实现 任务调度机制是嵌入式实时操作系统的一个重要概念 xff0c 也是其核心技术 对于可剥夺型内核 xff0c 优先级高的任务一旦就绪就能剥夺优先级较低任务的CPU使用权 xff0c 提高了系统的实时响应能力 FreeRTOS