Freertos学习日志(1)-基础知识

目录

1.什么是Freertos?

2.为什么要学习RTOS?

3.Freertos多任务处理的原理

1.什么是Freertos?

      RTOS,即(Real Time Operating System 实时操作系统)是一种体积小巧、确定性强的计算机操作系统。 RTOS 通常用于需要在严格时间限制内对外部事件做出反应的嵌入式系统,如医疗设备和汽车电子控制单元 (ECU)。 通常,此类嵌入式系统中只有一两项功能需要确定性时序,即使嵌入式系统不需要严格的实时反应,使用 RTOS 仍能提供诸多优势。Freertos是RTOS的一种,常用的 RTOS 有国外的FreeRTOS、 μC/OS、RTX 和国内的 FreeRTOS、Huawei LiteOS 和 AliOS-Things 等,其中尤以国外开源 且免费的 FreeRTOS 的市场占有率最高。

2.为什么要学习RTOS?

    第一:从一个学生竞赛搞项目的角度而言,掌握RTOS可以使编程更加简单,从学习角度来看RTOS通常比通用操作系统体积更小,重量更轻,更加适用于内存、计算和功率受限的设备,如:STM32。学习RTOS也可以让我们加深对OS(操作系统)的理解。

    第二:从一个即将从事嵌入式方向的软件工程师而言,仅仅将所有操作放在一个大循环里,轮询实现问题,当遇到一些轮询机制解决不了的问题时,如果不会RTOS时一定会感到手足无措,而学习RTOS就是解决这类问题的关键!

   第三:从本人了解的信息而言,几乎每一个大公司有使用RTOS,有些是使用市面上占有率高的,比如RT-Thread。有些是自己写一套操作系统,所以熟练掌握一套典型的RTOS对于我们至关重要!

3.Freertos多任务处理的原理

   1)内核是操作系统的核心组件。Linux 等通用操作系统采用的内核 允许多个用户看似同时访问计算机的处理器。这些用户可以各自执行多个程序,看起来像是并发运行。

每个执行的程序由操作系统控制下的一个或多个线程实现。如果操作系统能够以这种方式执行多个线程,则称为多任务处理。 像 FreeRTOS 这样的小型 RTOS 通常将线程称为任务,因为它们不支持虚拟内存,因此进程和线程之间没有区别。

上面是我从Freertos官网复制的一段话,用我的话来说,RTOS就像是一拳超人动漫中的男主,用自己超强的速度制造出残影,变成影分身一样,RTOS(实时操作系统)就是利用计算机强大的处理能力来处理各种“任务”,也就是制造“影分身”。但是其实“影分身”并不是实体而是“残影”,所以就有了并发运行的说法。

   2)调度器是内核中负责决定在特定时间应执行什么任务的部分。内核 可以在任务的生命周期内多次暂停并恢复该任务。 如果任务 B 取代任务 A 成为当前执行的任务 (即任务 A 暂停,任务 B 恢复),我们就可以称任务 A “换出”,任务 B “换入”。

调度策略是调度器用来决定何时执行哪个任务的算法。在(非实时)多用户系统中, 调度策略通常会确保每个任务获得“公平”的处理器时间。实时嵌入式系统中使用的策略详见下文。

只有当调度算法决定执行不同的任务时,任务才会换出。这种切换可能在当前 执行的任务不知情的情况下发生,例如调度算法响应外部事件或定时器到期时; 还可能 发生在执行任务显式调用某个导致其让出休眠(也称为延迟)或阻塞的 API 函数时。

如果某任务让出,调度算法可能会再次选择同一任务执行。如果某任务休眠, 则在指定的延迟时间到期前不可被选择。 同样,如果某任务阻塞, 则在特定事件发生(例如,数据到达 UART)或超时期满之前将不可被选择。

操作系统内核负责管理这些任务状态和转换, 确保根据调度算法和每个任务的当前状态在给定时间选择适当的任务执行。

参考上图中的数字标记:

在标记 (1) 处,任务 1 正在执行。

在标记 (2) 处,内核将任务 1 换出……

……并在标记 (3) 处将任务 2 换入。

在任务 2 执行期间,在标记 (4) 处,任务 2 锁定了处理器外设以进行独占访问(图中不可见)。

在标记 (5) 处,内核将任务 2 换出……

……并在标记 (6) 处将任务 3 换入。

任务 3 试图访问之前被任务 2 锁定的处理器外设,发现其被锁定,在标记 (7) 处阻塞以等待外设解锁。

在标记 (8) 处,内核将任务 1 换入。

如此往复。

在标记 (9) 处,任务 2 再次执行,完成对外设的操作并解锁。

在标记 (10) 处,任务 3 再次执行,发现外设可用,继续执行直到再次被换出。

实时操作系统 (RTOS) 利用与通用(非实时)系统相同的原理来实现多任务处理, 但两者的目标截然不同。这一差异主要体现在调度策略上。实时嵌入式系统 旨在对现实世界的事件作出及时响应。这些事件通常有截止时间, 实时嵌入式系统必须在此之前响应,RTOS 调度策略必须确保遵守这些截止时间要求。

为在小型 RTOS(如 FreeRTOS)中实现这一目标,软件工程师必须为每个任务分配优先级。RTOS 的调度策略 就是确保能够执行的最高优先级任务获得处理时间。如果存在多个能够运行的同等最高优先级任务(既没有延迟也没有阻塞),则调度策略可以选择在这些任务之间“公平”地分配处理时间。

这种基本形式的实时调度并非万能,无法改变时间的快慢,应用程序编写者必须确保设定的时序约束在所选任务优先级安排下是可行的。

上面的文章也是我从官方文档中复制的,其实从上面的文章中可以看出来,RTOS与通用的系统都使用相同的原理来实现多任务处理,都是抢占式调度采用快速切换机制,都有优先级的排序。但是他们所要实现的目标完全不同,从而导致RTOS有一个特别的特点——每一个事件都有截止时间。

比如涉及一个带有键盘、LCD 和控制算法的实时系统:

用户每次按键后, 必须在合理的时间内获得视觉反馈,如果用户在此期间无法看到按键已被接受, 则该软件产品的使用感会很差(软实时)。如果最长可接受的响应时间是 100 毫秒,则接受任何介于 0 和 100 毫秒之间的响应。

所以RTOS要求我们软件工程师为控制任务分配最高优先级,因为:

1.控制任务的截止时间比按键处理任务更严格。

2.错过截止时间对控制任务的后果比对按键处理任务更严重。

下图演示了实时操作系统如何调度这些任务。RTOS 会自行创建一个任务,即空闲任务, 仅当没有其他任务能够执行时,该任务才会执行。RTOS 空闲任务总是处于 可以执行的状态。

请参阅上图:

起初,两个任务都不能运行:vControlTask 等待合适的时间来开始新的控制周期, 而 vKeyHandlerTask 则在等待按键操作。处理器时间分配给了 RTOS 空闲任务。

在时间 t1 处,发生按键事件。vKeyHandlerTask 可以执行,其优先级高于 RTOS 空闲任务, 因此获得了处理器时间。

在时间 t2 处,vKeyHandlerTask 已完成按键处理并更新 LCD。在按下另一个键之前该任务无法继续执行, 因此将自己挂起,RTOS 空闲任务恢复执行。

在时间 t3 处,定时器事件指示执行下一个控制循环的时间到了。vControlTask 现在可以执行, 因为优先级最高的任务被立刻分配了处理器时间。

在时间 t3 和 t4 之间,vControlTask 仍在执行时,发生了按键事件。vKeyHandlerTask 可以执行, 但由于其优先级低于 vControlTask,因此未获得任何处理器时间。

在 t4 处, vControlTask 完成了控制周期的处理,并且直到下一次定时事件的发生前不能重新开始运行, 进入阻塞态。vKeyHandlerTask 现在成为可以运行的最高优先级的任务, 因此获得处理器时间以处理先前的按键事件。

在 t5 处,按键事件处理完成,并且 vKeyHandlerTask 进入阻塞态等待下一次按键事件。再一次, 两个任务都未进入就绪态,RTOS 空闲任务获得处理器时间。

在 t5 与 t6 之间,定时事件发生并处理,没有进一步的按键事件发生。

在 t6 处发生按键事件,但在 vKeyHandlerTask 完成按键处理之前,发生了定时事件。 此时两个任务都可以执行。由于 vControlTask 具有更高的优先级, 因此 vKeyHandlerTask 在完成按键操作之前被挂起,vControlTask 获得处理器时间。

在 t8 处,vControlTask 完成控制周期的处理,然后进入阻塞态等待下一次事件。vKeyHandlerTask 再次 成为运行的最高优先级任务,因此获得处理器时间,以便完成按键处理 。

 这里值得一提的是,当最高优先级定时事件到来时,正在执行的事件会被抢占,而当完成了控制周期的处理,并且直到下一次定时事件的发生前不能重新开始运行,进入阻塞态时,会根据优先级继续分配任务。就像落入荒野时,吃喝拉撒成为第一重要的事一样,其他的恩怨情仇都放在一边,当回归都市时,恩怨情仇又占据了日常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/59095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2. Flink快速上手

文章目录 1. 环境准备1.1 系统环境1.2 安装配置Java 8和Scala 2.121.3 使用集成开发环境IntelliJ IDEA1.4 安装插件2. 创建项目2.1 创建工程2.1.1 创建Maven项目2.1.2 设置项目基本信息2.1.3 生成项目基本框架2.2 添加项目依赖2.2.1 添加Flink相关依赖2.2.2 添加slf4j-nop依赖2…

TIA 中用 GSD 方式组态 ET200SP 安全模块时如何用 S7-FCT 分配安全目标地址

1 概述 用 GSD 方式组态的 ET200SP 的分布式从站上,现在可以使用安全模块(早期 是无法支持),这种用法对 ET200SP 接口模块的版本和编程软件的版本都有要求。 ET200SP 故障安全模块可通过 GSD 文件用于以下接口模块: …

0,国产FPGA(紫光同创)-新建PDS工程

国产FPGA正在蓬勃发展,紫光同创FPGA是大家竞赛时经常遇到的一款国产FPGA,本专栏从IP核开始一直到后续图像处理等。 开发板:盘古50K标准板 1,新建PDS工程 点击File(1),然后是New Projects&#…

视频Qoe测量学习笔记(一)

目录 流媒体协议详解 RTSP:实时流式协议 RTCP:实时运输控制协议 RTP:实时运输协议 H.264 流媒体协议详解 RTSP:实时流式协议 由IETF MMusic小组开发,已成为互联网建议标准[RFC 2326]。RTSP本身并不传送数据&…

计算机视觉常用数据集Foggy Cityscapes的介绍、下载、转为YOLO格式进行训练

我在寻找Foggy Cityscapes数据集的时候花了一番功夫,因为官网下载需要用公司或学校邮箱邮箱注册账号,等待审核通过后才能进行下载数据集。并且一开始我也并不了解Foggy Cityscapes的格式和内容是什么样的,现在我弄明白后写下这篇文章&#xf…

单向函数、单向陷门函数、困难问题

1、单向函数 设函数 yf(x) , 对于给定的x,计算出y很容易;对于给定的y,计算出x很难。 2、单向陷门函数 设函数 yf(x) ,且f有陷门, 对于给定的x,计算出y很容易;对于给定的y&#…

js 获取当前时间与前一个月时间

// 获取当前时间的毫秒数 var currentTimeMillis new Date().getTime();// 获取前一个月的Date对象 var dateLastMonth new Date(); dateLastMonth.setMonth(dateLastMonth.getMonth() - 1);// 获取前一个月的毫秒数 var timeMillisLastMonth dateLastMonth.getTime();conso…

Linux_02 Linux常用软件——vi、vim

vi编辑器有三种主要模式,每种模式的功能和用途不同: 一、命令模式 (Command Mode): - 启动 vi 时默认进入此模式。 - 你可以在此模式下移动光标,输入各种命令(如删除、复制、粘贴等)。 yy:…

C++设计模式结构型模式———装饰模式

文章目录 一、引言二、装饰器模式三、总结 一、引言 装饰模式是一种结构型设计模式, 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 该模式展现出了运行时的一种扩展能力,以及比继承更强大和灵活的设计视角和设计能力&#x…

「iOS」——知乎日报一二周总结

知乎日报仿写 前言效果Manager封装网络请求线程冲突问题下拉刷新添加网络请求的图片通过时间戳和日期格式化获取时间 总结 前言 前两周内容的仿写,主要完成了首页的仿写,进度稍慢。 效果 Manager封装网络请求 知乎日报的仿写需要频繁的申请网络请求&am…

Profinet、Ethernet/IP 工业以太网无线通信解决方案

在工业现场,我们常常会面临这样的困扰:两个PLC之间、PLC 跟远程IO之间或者PLC 跟伺服之间由于种种原因不方便布线,严重影响了通讯效率和生产进程。为了解决这一难题,三格电子设计了一款工业以太网无线网桥,这款无线网桥…

【数据结构】二叉树——前中后序遍历

一、如何遍历二叉树 以图上这个二叉树作为例子,我们若想要访问二叉树中每一个元素 我们一般是采用递归的方式 比如我们要访问完整个二叉树,我们进行递归先访问根的左子树,然后因为递归再次调用,我们会先一直访问二叉树左子树&…

桑基图在医学数据分析中的更复杂应用示例

桑基图(Sankey Diagram)能够有效地展示复杂的流动关系,特别适合用于医学数据分析中的多种转归和治疗路径的可视化。接下来,我们将构建一个稍微复杂的示例,展示不同疾病患者在治疗过程中的流动,以及他们的治…

WPS 表格奇数行或偶数行填充颜色(Excel也适用)

今天在做项目测试用例,全都是白色底纹,日以继夜的赶项目 大家都头脑不清晰了,看着容易错行,看我一键更新 如本次测试用例,单元格区域的奇数行填充灰色。 点击单元格最左上角选定区域,然后依次点击【开始】…

RT-DETR:替代YOLO的更快实时对象检测模型(附代码)

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

JavaScript。—关于语法基础的理解—

一、程序控制语句 JavaScript 提供了 if 、if else 和 switch 3种条件语句&#xff0c;条件语句也可以嵌套。 &#xff08;一&#xff09;、条件语句 1、单向判断 &#xff1a; if... &#xff08;1&#xff09;概述 < if >元素用于在判断该语句是否满足特定条…

ComfyUI - ComfyUI 工作流中集成 SAM2 + GroundingDINO 处理图像与视频 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/143359538 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 SAM2 与…

Android13预置应用及授权开发

在android13中&#xff0c;要预置一个对讲应用&#xff0c;从预置和授权&#xff0c;梳理了一下&#xff0c;以便后续查询使用。在此记录 一放置应用 我的apk应用放在vendor下面&#xff0c; 路径&#xff1a;projectroot/vendor/fly/package/apps/DMR/flydmr.apk (vendor/fl…

【密码学】全同态加密基于多项式环计算的图解

全同态加密方案提供了一种惊人的能力 —— 能够在不知道数据具体内容的情况下对数据进行计算。这使得你可以在保持潜在敏感源数据私密的同时&#xff0c;得出问题的答案。 这篇文章的整体结构包括多项式环相关的数学介绍&#xff0c;基于多项式环的加密和解密是如何工作的&…

[java][框架]springMVC(1/2)

目标 知道SpringMVC的优点编写SpringMVC入门案例使用PostMan发送请求掌握普通类型参数传递掌握POJO类型参数传递掌握json数据参数传递掌握响应json数据掌握rest风格快速开发 一、SpringMVC简介 1 SpringMVC概述 问题导入 SpringMVC框架有什么优点&#xff1f; 1.1 Spring…