FreeRTOS 入门 知识

什么是FreeRTOS 

        FreeRTOS 是一个轻量级的实时操作系统(RTOS),由 Richard Barry 在 2003 年开发,并且由亚马逊的 FreeRTOS 项目(一个由 Amazon Web Services (AWS) 支持的开源项目)进一步推动和发展。FreeRTOS 专为嵌入式系统而设计,旨在提供任务管理、时间管理、同步(信号量、互斥锁等)、内存管理等功能,同时保持非常小的资源占用(包括RAM和ROM)。

FreeRTOS 的特点:

  • 轻量级:FreeRTOS 的内核代码非常精简,可以在非常有限的资源(如几KB的RAM和ROM)上运行。
  • 可配置:用户可以根据需要配置FreeRTOS,只包含所需的功能,从而进一步减少资源占用。
  • 跨平台:FreeRTOS 支持多种微控制器和处理器架构,包括 ARM Cortex-M、PIC、AVR、ESP32 等。
  • 实时性:FreeRTOS 提供了基于优先级的任务调度,确保高优先级任务能够尽快得到执行,满足实时性要求。
  • 丰富的功能:除了基本的任务调度和同步机制外,FreeRTOS 还提供了队列、定时器、事件标志组等高级功能。
  • 易于使用:FreeRTOS 的API设计直观,易于学习和使用,同时提供了丰富的文档和示例代码。

应用场景:

        FreeRTOS 广泛应用于各种嵌入式系统中,包括但不限于工业自动化、医疗设备、消费电子、汽车电子、无人机等领域。在这些应用中,FreeRTOS 的实时性和资源效率是关键因素,使得开发者能够构建出高效、可靠的嵌入式系统。

与其他RTOS的比较:

       与其他实时操作系统相比,FreeRTOS 的主要优势在于其轻量级和可配置性。然而,它也可能在功能丰富性和社区支持方面不如一些商业RTOS。因此,在选择RTOS时,需要根据具体的应用需求和资源限制进行权衡。

        总之,FreeRTOS 是一个功能强大、易于使用且资源占用极低的实时操作系统,非常适合用于资源受限的嵌入式系统开发。

FreeRTOS和STM32的区别

STM32不是裸机 

       FreeRTOS和STM32在嵌入式系统开发中扮演着不同的角色,它们之间存在明显的区别,主要体现在以下几个方面:

定义与性质

FreeRTOS

  • 定义:FreeRTOS是一个免费和开源的实时操作系统内核,专为嵌入式系统设计。
  • 性质:FreeRTOS是一个软件层面的解决方案,提供了一套用于任务管理、调度、同步和通信等功能的API。

STM32

  • 定义:STM32是意法半导体公司推出的一款基于ARM Cortex-M内核的32位微控制器系列。
  • 性质:STM32 是 一个硬件层面的产品,是一个集成了处理器核心、内存、接口和其他外设等功能的微处理器单元(MPU)。

功能与用途

  1. FreeRTOS
    • 功能:提供任务管理、时间管理、内存管理和通信机制等内核功能。
    • 用途:在嵌入式系统中实现多任务环境,管理多个独立功能的任务,提高系统的稳定性和效率。
  2. STM32
    • 功能:提供高性能、低功耗的计算能力,以及丰富的外设支持(如ADC、DAC、UART、SPI、I2C等)。
    • 用途:作为嵌入式系统的核心处理器,负责执行程序代码,控制外设,实现各种应用需求。

关系与配合

关系

       FreeRTOS可以运行在STM32等微控制器上,利用STM32提供的硬件资源来执行任务调度、同步和通信等功能。

配合

        在嵌入式系统开发中,STM32作为硬件平台,FreeRTOS作为软件框架,两者相互配合,共同实现系统的功能需求。

总的来说

        FreeRTOS和STM32在嵌入式系统开发中各有其独特的角色和用途。FreeRTOS作为软件层面的实时操作系统内核,提供了丰富的任务管理和同步通信功能;而STM32作为硬件层面的微控制器系列,提供了高性能、低功耗的计算能力和丰富的外设支持。在实际开发中,两者相互配合,共同构建出稳定、高效的嵌入式系统。

任务调度 

 抢占式调度(Preemptive Scheduling)

定义

       抢占式调度是一种基于任务优先级的调度方式。主要是针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务。

       当一个高优先级任务变为就绪状态时(例如,等待的事件发生或中断服务程序更改了任务优先级),调度器会暂停当前正在执行的低优先级任务,并将CPU控制权转交给高优先级任务。

       这种调度方式确保了紧急任务能够得到及时响应,提高了系统的实时性。

优点适用于实时性要求高的系统,能够确保高优先级任务及时响应。

缺点:上下文切换的开销较大,可能会影响系统的性能。

图解

  • 高优先级任务,优先执行
  • 高优先级任务不停止,低优先级任务无法执行 
  • 被抢占的任务将会进入就绪态

时间片调度(Time-Slicing Scheduling)

定义

        时间片调度是一种特殊的抢占式调度方式。它将CPU时间划分为固定长度的时间片,每个任务在一个时间片内运行。主要针对优先级相同的任务,当多个任务的优先级相同时, 任务调度器会在每一次系统时钟节拍到的时候切换任务。

        当一个时间片结束时,无论任务是否完成,都会发生上下文切换,将CPU控制权转交给下一个任务(通常是具有相同优先级的下一个任务)。这种调度方式确保了每个任务都有机会在公平的时间段内运行,避免了某个任务长时间占用CPU。

优点:适用于多个任务优先级相近的场景,可以实现相对公平的CPU时间分配。防止了某个任务长时间占用CPU,保证了其他任务也有机会执行。

缺点:降低了系统的实时性(与抢占式调度相比)。

同等优先级任务轮流地享有相同的 CPU 时间(可设置), 叫时间片,在FreeRTOS中,一个时间片就等于SysTick 中断周期 

  1. 同等优先级任务,轮流执行;时间片流转
  2. 一个时间片大小,取决为滴答定时器中断周期
  3. 注意没有用完的时间片不会再使用,下次任务Task3得到执行 还是按照一个时间片的时钟节拍运行

协作式调度(Cooperative Scheduling)

定义

       协作式调度依赖于任务自行释放CPU控制权。在协作式调度中,一旦一个任务开始执行,它将持续运行直到自己主动放弃CPU(如通过调用特定的函数)或进入阻塞状态(如等待事件或资源)。

        当前执行任务将会一直运行,同时高优先级的任务不会抢占低优先级任务 FreeRTOS现在虽然还支持,但是官方已经表示不再更新协程式调度

 

任务状态 

 

运行态(Running)

       正在执行的任务,该任务就处于运行态,注意在STM32中,同一时间仅一个任务处于运行态。任务具有CPU的控制权,正在执行其任务函数中的代码。

就绪态(Ready)

       如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态。当所有更高优先级的任务都执行完毕或CPU空闲时,就绪态的任务将被调度执行。

阻塞态(Blocked)

       任务在等待某个外部事件(如信号量、消息队列、事件组、系统延时等)时,无法继续执行,此时的状态被称为阻塞态。任务因为等待某个资源或事件而无法继续执行。

       当等待的事件到达或超时时间结束时,任务将自动退出阻塞态,并进入就绪态,准备再次被调度执行。

 挂起态(Suspended)

       类似暂停,调用函数 vTaskSuspend() 进入挂起态,需要调用解挂函数vTaskResume() 才可以进入就绪态。 任务被挂起后,不会占用CPU资源,也不会被调度器调用执行。

总的来说

  1. 仅就绪态可转变成运行态 
  2. 其他状态的任务想运行,必须先转变成就绪态

       FreeRTOS的四种任务状态(运行态、就绪态、阻塞态、挂起态)共同构成了任务调度和管理的基础。这些状态之间的转换遵循一定的规则和逻辑,确保了任务能够按照预定的规则进行切换和执行,从而实现了实时操作系统的高效性和可靠性。在FreeRTOS中,任务的状态管理是通过调度器来实现的,调度器会根据任务的优先级和状态来决定哪个任务应该被执行。 

 

和正点原子一起学习FreeRTOS ,接下来一个系列跟随正点原子

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

顺序表算法 - 合并两个有序数组

88. 合并两个有序数组 - 力扣(LeetCode)https://leetcode.cn/problems/merge-sorted-array/description/思路: void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {int l1,l2,l3;l1 m-1;l2 n-1;l3 mn-1;//l1和l2大于…

DispatcherServlet懒加载带来的问题和思考

问题 DispatcherServlet的懒加载会导致在用户在进行第一次请求的时候会比正常慢很多,如果这个时候大量请求同时过来,那么阻塞和cpu的暴增就会显而易见。 背景 在回顾SpringMvc对servlet的增强的过程中,突然发现DispatcherServlet是懒加载的…

7.2 AQS原理

AQS 原理 概述 全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架。 特点: 用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和…

JAVA自定义注释

interface 声明 package test; public interface InProgress { } InProgress public void calculateInterest(float amount, float rate) { } 带成员 public interface TODO {String value(); } InProgress //只有成员变量名有value时,值有给value赋值时可以这…

redis源码分析之底层数据结构(一)-动态字符串sds

1.绪论 我们知道redis是由c语言实现的,c语言中是自带字符串的,但是为什么redis还要再实现自己的动态字符串呢,这种动态字符串的底层数据结构是怎样的呢?接下来我们带着这些问题来看一看redis中的动态字符串sds。 2.sds的组成 struct __at…

MySQL覆盖索引和索引跳跃扫描

最近在深入学习MySQL,在学习最左匹配原则的时候,遇到了一个有意思的事情。请听我细细道来。 我的MySQL版本为8.0.32 可以通过 show variables like version; 查看使用的版本。 准备工作: 先建表,SQL语句如下: c…

ARM学习(29)NXP 双coreMCU IMX1160学习----NorFlash 启动引脚选择

ARM学习(28)NXP 双coreMCU IMX1160学习----NorFlash 启动引脚选择 1、多种启动方式介绍 IMX1166 支持多组flexSPI 引脚启动,FlexSPI1以及FlexSPI2,通过boot cfg可以切换FlexSPI得实例。 每个实例又支持多组引脚,总共…

Linux系统的用户组管理和权限以及创建用户

1.Linux是多用户的操作系统,正如在Windows系统中可以进行用户账号的切换,Linux同样允许多用户操作。在Linux服务器环境中,通常由多名运维人员共同管理,而这些运维人员各自拥有不同的权限和级别。因此,我们可以根据每个…

LeetCode 3011.判断一个数组是否可以变为有序

注:这个题目有序的意思是“升序” 解法一:bubblesort O(nlogn) 核心思想:冒泡每次会将一个数归位到最后的位置上,所以我们如果碰到无法向右交换的数字,即可return false class Solution { public:// 返回一个十进制…

《昇思25天学习打卡营第2天|02快速入门》

课程目标 这节课准备再学习下训练模型的基本流程,因此还是选择快速入门课程。 整体流程 整体介绍下流程: 数据处理构建网络模型训练模型保存模型加载模型 思路是比较清晰的,看来文档写的是比较连贯合理的。 数据处理 看数据也是手写体数…

提高项目透明度:有效的跟踪软件

国内外主流的10款项目进度跟踪软件对比:PingCode、Worktile、Teambition、Tower、Asana、Trello、Jira、ClickUp、Notion、Liquid Planner。 在项目管理中,确保进度跟踪的准确性与效率是每位项目经理面临的主要挑战之一。选用合适的项目进度跟踪软件不仅…

800 元打造家庭版 SOC 安全运营中心

今天,我们开始一系列新的文章,将从独特而全面的角度探索网络安全世界,结合安全双方:红队和蓝队。 这种方法通常称为“紫队”,集成了进攻和防御技术,以提供对威胁和安全解决方案的全面了解。 在本系列的第一篇文章中,我们将指导您完成以 100 欧元约800元左右的预算创建…

Sentinel-1 Level 1数据处理的详细算法定义(三)

《Sentinel-1 Level 1数据处理的详细算法定义》文档定义和描述了Sentinel-1实现的Level 1处理算法和方程,以便生成Level 1产品。这些算法适用于Sentinel-1的Stripmap、Interferometric Wide-swath (IW)、Extra-wide-swath (EW)和Wave模式。 今天介绍的内容如下: Sentinel-1 L…

zookeeper的shell操作

一:启动拽库的shell命令行 zkCli.sh -server localhost:2181 退出:quit 二:查询所有的命令 help 三:查询对应的节点 --查询zk上的根节点 ls / ls /zookeeper 四:查询对应节点的节点信息(节点的元数据&a…

idea启动ssm项目详细教程

前言 今天碰到一个ssm的上古项目,项目没有使用内置的tomcat作为服务器容器,这个时候就需要自己单独设置tomcat容器。这让我想起了我刚入行时被外置tomcat配置支配的恐惧。现在我打算记录一下配置的过程,希望对后面的小伙伴有所帮助吧。 要求…

React学习笔记02-----

一、React简介 想实现页面的局部刷新,而不是整个网页的刷新。AJAXDOM可以实现局部刷新 1.特点 (1)虚拟DOM 开发者通过React来操作原生DOM,从而构建页面。 React通过虚拟DOM来实现,可以解决DOM的兼容性问题&#x…

UNIAPP_ReferenceError: TextEncoder is not defined 解决

错误信息 1、安装text-decoding npm install text-decoding2、main.js import { TextEncoder, TextDecoder } from text-decoding global.TextEncoder TextEncoder global.TextDecoder TextDecoder

MySQL 进阶(三)【SQL 优化】

1、SQL 优化 1.1、插入数据优化 1.1.1、Insert 优化 1、批量插入 插入多条数据时,不建议使用单条的插入语句,而是下面的批量插入: INSERT INTO tb_name VALUES (),(),(),...; 批量插入建议一次批量 500~100 条,如果数据量比…

【CSS in Depth 2 精译】2.6 CSS 自定义属性(即 CSS 变量)+ 2.7 本章小结

文章目录 2.6 自定义属性(即 CSS 变量)2.6.1 动态变更自定义属性 2.7 本章小结 当前内容所在位置 第一章 层叠、优先级与继承第二章 相对单位 2.1 相对单位的威力2.2 em 与 rem2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性 …