FreeRTOS学习笔记2:FreeRTOS的基础知识

1.FreeRTOS介绍

FreeRTOS是一个免费的嵌入式实时操作系统,同时它在市面上也是一款主流的操作系统,是工作上必不可少的技能。它具有以下六种特点:

1.免费开源:在商业产品中使用,无潜在商业风险,无需担心。

2.可裁剪:可以在小的芯片上使用,FreeRTOS的核心代码9000行左右。

3.简单:简单易用,可移植性强。

4.优先级不限:任务优先级分配没有限制,多任务可同一优先级(软件/通用优先级上没有限制,硬件上的优先级受限于芯片的架构如STM32单片机是32位的,优先级范围只有[0-31],优先级的数字越大,优先级越高)。

5.任务不限:可创建的实时任务数量没有软件限制。

6.抢占/协程/时间片:支持抢占式,协程式,时间片流转任务调度


2.任务调度器简介

任务调度器就是使用相关的调度算法来决定当前需要执行哪个任务,FreeRTOS一共支持三种任务调度方式,分别为:

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

2.时间片调度:主要针对优先级相同的任务,当多个任务的优先级相同时,任务调度器会在每一次系统时钟节拍到的时候切换任务。

3.协程式调度:当前执行任务将会一直运行,同时高优先级的任务不会抢占低优先级任务(官方已经表示不再更新协程式调度)。

2.1抢占式调度

在FreeRTOS中创建了三个任务,分别是Task1、Task2、Task3,它们的优先级分别为1、2、3,优先级的数值越大,优先级越高,所以Task3的优先级越高。

运行过程如下:

1.首先Task1在运行中,在这个过程中Task2就绪了,在抢占式调度器的作用下Task2会抢占Task1的运行,如上图所示,Task1被Task2抢占后,会从运行态变为就绪态。

2.Task2运行过程中,Task3就绪了,在抢占式调度器的作用下Task3会抢占Task2的运行,如上图所示,如上图所示,Task2被Task3抢占后,会从运行态变为就绪态。

3.Task3运行过程中,Task3阻塞了(系统延时(delay)或等待信号量等),此时就绪态中,优先级最高的任务Task2执行。

4.Task3阻塞解除了(延迟到了或者是接收到信号量),此时Task3恢复到就绪态中,抢占Task2的运行。

总结:

1.高优先级任务,优先执行

2.高优先级任务不停止,低优先级任务无法执行

3.被抢占的任务会进入就绪态

2.2时间片调度

同等优先级任务轮流享有相同CPU时间(可设置),叫时间片,在FreeRTOS中,一个时间片的大小由SysTick(滴答定时器)中断周期来决定。

在FreeRTOS中创建了三个任务,分别是Task1、Task2、Task3,它们的优先级相同,均为1。

运行过程如下:

1.当Task1运行完一个时间片后,切换至Task2运行。

2.当Task2运行完一个时间片后,切换至Task3运行。

3.Task3运行过程中(还不到一个时间片),Task3阻塞了(系统延时或等待信号量等),此时直接切换到下一个任务Task1运行。

4.当Task1运行完一个时间片后,切换至Task2运行。

总结:

1.同等优先级任务,轮流执行,时间片流转。

2.一个时间片大小,取决于滴答定时器中断周期。

3.没有用完的时间片不会再使用,下次任务Task3得到执行后还是按照一个时间片的时钟节拍运行。


3.任务状态

FreeRTOS中任务共存在4种状态,分别为:

1.运行态:正在执行的任务,该任务就处于运行态,在STM32中,同一个时间只有一个任务处于运行态。

2.就绪态:如果该任务已经能被执行,但当前还未被执行,那么该任务处于就绪态,只有就绪态才会变成运行态。

3.阻塞态:如果一个任务因延时或等待外部事件发生,那么这个任务就处于阻塞态。当延时结束或等待外部事件结束才能变为就绪态。

4.挂起态:类似于暂停,调用函数vTaskSuspend()进入挂起态,需要调用解挂函数vTaskResume()才可以进入就绪态。

四种任务状态之间的转换图:

总结:

1.仅就绪态可转变成运行态

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

3.1任务状态列表

FreeRTOS无非就四种状态,运行态,就绪态,阻塞态,挂起态,这四种状态,除了运行态,其他三种任务状态都有其对应的任务状态列表(这里的列表就是链表,数据结构的链表)。

就绪列表:pxReadyTasksLists[x],x代表任务优先级数值,软件/通用优先级上数值无限大,硬件上STM32是32位的,所以x的值为32

阻塞列表:pxDelayedTasksLists。

挂起列表:pxSuspendedTasksLists。


如果任务处于就绪态,FreeRTOS会将该任务挂到就绪列表(链表),如下图所示:

如果任务处于就阻塞态,FreeRTOS会将该任务挂到阻塞列表,任务处于挂起态,FreeRTOS会将该任务挂到挂起列表。


正在执行的任务状态为运行态,当处于运行态的任务执行结束(时间片到了/延时或等待外部事件发生),需要切换下一个任务执行,FreeRTOS就会在就绪列表中挑选优先级高的任务来执行,处于阻塞列表和挂起列表里的任务需要解除阻塞状态和解除挂起状态后成为就绪态,并且挂载到就绪列表,才会被执行。


就绪列表pxReadyTasksLists[x],x代表任务优先级数值,如果用硬件上的优先级就绪列表初始化后就有32个就绪列表(就绪链表),如下图所示:

如果创建3个任务,Task1、Task2、Task3,它们优先级分别为31,30,1。新创建的任务处于就绪态,FreeRTOS会将这3个任务按照优先级挂载到对应的就绪列表,如下图所示:

当处于运行态的任务执行完毕,FreeRTOS就会在就绪列表中选择优先级最高的Task1任务进行运行,Task1就会从就绪态转变为运行态。


如果Task1、Task2、Task3这三个任务的优先级相同,均为1,那么这三个任务会被连接到同一个就绪列表上,如下图所示:


FreeRTOS是怎么知道32个就绪列表中是否挂载有任务呢?用一个32位的变量,当就绪列表中挂载有任务时,变量对应的优先级位的bit位置一,如下图所示:

当32位的变量的某个位为1时,代表所对应的优先级列表有任务存在。任务调度器总是在所有处于就绪列表任务中选择具有最高优先级的任务来执行。

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

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

相关文章

TensorFlow 简单的二分类神经网络的训练和应用流程

展示了一个简单的二分类神经网络的训练和应用流程。主要步骤包括: 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与部署 加载和应用已训练的模型 1. 数据准备与预处理 在本例中,数据准备是通过两个 Numpy 数…

【B站保姆级视频教程:Jetson配置YOLOv11环境(四)cuda cudnn tensorrt配置】

Jetson配置YOLOv11环境(4)cuda cudnn tensorrt配置 文章目录 0. 简介1. cuda配置:添加cuda环境变量2. cudnn配置3. TensorRT Python环境配置3.1 系统自带Python环境中的TensorRT配置3.2 Conda 虚拟Python环境中的TensorRT配置 0. 简介 官方镜…

Python安居客二手小区数据爬取(2025年)

目录 2025年安居客二手小区数据爬取观察目标网页观察详情页数据准备工作:安装装备就像打游戏代码详解:每行代码都是你的小兵完整代码大放送爬取结果 2025年安居客二手小区数据爬取 这段时间需要爬取安居客二手小区数据,看了一下相关教程基本…

Electron使用WebAassembly实现CRC-8 MAXIM校验

Electron使用WebAssembly实现CRC-8 MAXIM校验 将C/C语言代码,经由WebAssembly编译为库函数,可以在JS语言环境进行调用。这里介绍在Electron工具环境使用WebAssembly调用CRC-8 MAXIM格式校验的方式。 CRC-8 MAXIM校验函数WebAssebly源文件 C语言实现CR…

DeepSeek-R1:通过强化学习激励大型语言模型(LLMs)的推理能力

摘要 我们推出了第一代推理模型:DeepSeek-R1-Zero和DeepSeek-R1。DeepSeek-R1-Zero是一个未经监督微调(SFT)作为初步步骤,而是通过大规模强化学习(RL)训练的模型,展现出卓越的推理能力。通过强…

pytorch基于FastText实现词嵌入

FastText 是 Facebook AI Research 提出的 改进版 Word2Vec,可以: ✅ 利用 n-grams 处理未登录词 比 Word2Vec 更快、更准确 适用于中文等形态丰富的语言 完整的 PyTorch FastText 代码(基于中文语料),包含&#xff1…

【hot100】刷题记录(8)-矩阵置零

题目描述: 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2…

PyTorch框架——基于深度学习YOLOv8神经网络学生课堂行为检测识别系统

基于YOLOv8深度学习的学生课堂行为检测识别系统,其能识别三种学生课堂行为:names: [举手, 读书, 写字] 具体图片见如下: 第一步:YOLOv8介绍 YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本…

Doki Doki Mods Maker小指南

-*- 做都做了,那就做到底吧。 -*- 前言: 项目的话,在莫盘里,在贴吧原帖下我有发具体地址。 这里是Doki Doki Mods Maker,是用来做DDLC Mods的小工具。 说是“Mods”,实则不然,这个是我从零仿…

nodejs:express + js-mdict 网页查询英汉词典

向 DeepSeek R1 提问: 我想写一个Web 前端网页,后台用 nodejs js-mdict, 实现在线查询英语单词 1. 项目结构 首先,创建一个项目目录,结构如下: mydict-app/ ├── public/ │ ├── index.html │ ├── st…

LabVIEW纤维集合体微电流测试仪

LabVIEW开发纤维集合体微电流测试仪。该设备精确测量纤维材料在特定电压下的电流变化,以分析纤维的结构、老化及回潮率等属性,对于纤维材料的科学研究及质量控制具有重要意义。 ​ 项目背景 在纤维材料的研究与应用中,电学性能是评估其性能…

dfs枚举问题

碎碎念:要开始刷算法题备战蓝桥杯了,一切的开头一定是dfs 定义 枚举问题就是咱数学上学到的,从n个数里面选m个数,有三种题型(来自Acwing) 从 1∼n 这 n个整数中随机选取任意多个,输出所有可能的选择方案。 把 1∼n这…

SOME/IP--协议英文原文讲解3

前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 Note: Thi…

leetcode——二叉树的中序遍历(java)

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root [] 输出:[] 示例 3: 输入:root [1] 输出…

91,【7】 攻防世界 web fileclude

进入靶场 <?php // 包含 flag.php 文件 include("flag.php");// 以高亮语法显示当前文件&#xff08;即包含这段代码的 PHP 文件&#xff09;的内容 // 方便查看当前代码结构和逻辑&#xff0c;常用于调试或给解题者提示代码信息 highlight_file(__FILE__);// 检…

Microsoft Power BI:融合 AI 的文本分析

Microsoft Power BI 是微软推出的一款功能强大的商业智能工具&#xff0c;旨在帮助用户从各种数据源中提取、分析和可视化数据&#xff0c;以支持业务决策和洞察。以下是关于 Power BI 的深度介绍&#xff1a; 1. 核心功能与特点 Power BI 提供了全面的数据分析和可视化功能&…

海外问卷调查,最常用到的渠道查有什么特殊之处

市场调研&#xff0c;包含市场调查和市场研究两个步骤&#xff0c;是企业和机构根据经营方向而做出的决策问题&#xff0c;最终通过海外问卷调查中的渠道查&#xff0c;来系统地设计、收集、记录、整理、分析、研究市场反馈的工作流程。 市场调研的工作流程包括&#xff1a;确…

《苍穹外卖》项目学习记录-Day10来单提醒

type&#xff1a;用来标识消息的类型&#xff0c;比如说type1表示来单提醒&#xff0c;type2表示客户催单。 orderId&#xff1a;表示订单id&#xff0c;因为不管是来单提醒还是客户催单&#xff0c;这一次提醒都对应一个订单。是用户下了某个单或者催促某个订单&#xff0c;这…

【全栈】SprintBoot+vue3迷你商城(10)

【全栈】SprintBootvue3迷你商城&#xff08;10&#xff09; 往期的文章都在这里啦&#xff0c;大家有兴趣可以看一下 后端部分&#xff1a; 【全栈】SprintBootvue3迷你商城&#xff08;1&#xff09; 【全栈】SprintBootvue3迷你商城&#xff08;2&#xff09; 【全栈】Sp…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.27 线性代数王国:矩阵分解实战指南

1.27 线性代数王国&#xff1a;矩阵分解实战指南 #mermaid-svg-JWrp2JAP9qkdS2A7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JWrp2JAP9qkdS2A7 .error-icon{fill:#552222;}#mermaid-svg-JWrp2JAP9qkdS2A7 .erro…