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

【STM32】入门(十四):FreeRTOS-任务

1、简述

FreeRTOS应用程序由一组独立的任务构成。
在任何时间点,应用程序中只能执行一个任务,FreeRTOS调度器负责决定所要执行的任务。
每个任务在自己的上下文中执行,不依赖于系统内的其他任务或 FreeRTOS的调度器本身。
FreeRTOS调度器负责确保任务调入时的处理器上下文(寄存器值、堆栈内容等)与任务调出时的处理器上下文完全相同。为实现这一点,每个任务都分配有自己的堆栈。当任务调出时,执行上下文被保存到该任务的堆栈中,以便以后再调入相同的任务时可以准确地恢复其执行上下文。

2、任务状态

任务状态有四种:运行Running、准备就绪Ready、阻塞Blocked、挂起Suspended
在这里插入图片描述

1)运行状态
任务正在使用处理器,执行实际任务。
如果运行 FreeRTOS 的处理器只有一个内核, 那么在任何给定时间内都只能有一个任务处于运行状态。

2)准备就绪
准备就绪任务指那些能够执行(它们不处于阻塞或挂起状态),但目前没有执行,因为同等或更高优先级的不同任务已经处于运行状态。

3)阻塞
如果任务当前正在等待时间或外部事件,则该任务被认为处于阻塞状态。
例如,如果一个任务调用vTaskDelay(),它将被阻塞(被置于阻塞状态), 直到延迟结束-一个时间事件。 任务也可以通过阻塞来等待队列、信号量、事件组、通知或信号量 事件。 处于阻塞状态的任务通常有一个"超时"期, 超时后任务将被超时,并被解除阻塞, 即使该任务所等待的事件没有发生。

“阻塞”状态下的任务不使用任何处理时间,不能被选择进入运行状态。

4)挂起
与“阻塞”状态下的任务一样, “挂起”状态下的任务不能 被选择进入运行状态,但处于挂起状态的任务 没有超时。 相反,任务只有在分别通过 vTaskSuspend() 和 xTaskResume() API 调用明确命令时 才会进入或退出挂起状态。

3、任务优先级

1)优先级高的先执行
FreeRTOS 调度器总是将优先级高的已就绪的任务,转为运行状态。换句话说,被置于运行状态的任务 始终是可运行的最高优先级任务。

低优先级数字表示低优先级任务。 空闲任务的优先级为零 (tskIDLE_PRIORITY)。

2)相同优先级的任务
任意数量的任务可共用相同的优先级。 如果 configUSE_TIME_SLICING 未经定义, 或者如果 configUSE_TIME_SLICING 设置为 1,则相同优先级的就绪状态任务将使用时间切片轮询调度方案共享可用的处理时间 。

3)有多少个优先级?
每个任务均被分配了从 0 到 ( configMAX_PRIORITIES - 1 ) 的优先级
其中 configMAX_PRIORITIES 在 FreeRTOSConfig.h 中定义。

4)configMAX_PRIORITIES设置为多大?
如果正在使用的端口实现了端口优化的任务选择机制,该机制使用 “前导零计数”类指令(用于单个指令中的任务选择)且 在 FreeRTOSConfig.h 中将 configUSE_PORT_OPTIMISED_TASK_SELECTION 设置为 1,则 configMAX_PRIORITIES 不得大于 32。 在所有其他情况下,configMAX_PRIORITIES 可以采取任何合理范围内的值,但出于 RAM 使用效率的原因,应保持在实际需要的最小值。

4、任务调度

FreeRTOS 调度算法, 主要针对单核、非对称多核 (AMP)、和对称多核 (SMP) RTOS 配置。调度算法是决定哪个 RTOS 任务应处于运行状态的软件程序。在任何给定时间, 每个处理器核心只能有一个任务处于运行状态。在 AMP 中, 每个处理器核心运行自身的 FreeRTOS 实例。在 SMP 中, 存在一个 FreeRTOS 实例,可以跨多核调度 RTOS 任务 。

默认 RTOS 调度策略(单核)
FreeRTOS 默认使用固定优先级的抢占式调度策略,对同等优先级的任务执行时间片轮询调度:

“固定优先级” 是指调度器不会永久更改任务的优先级, 尽管它可能会因优先级继承而暂时提高任务的优先级。
“抢占式调度” 是指调度器始终运行优先级最高且可运行的 RTOS 任务, 无论任务何时能够运行。例如, 如果中断服务程序 (ISR) 更改了优先级最高且可运行的任务, 调度器会停止当前正在运行的低优先级任务 并启动高优先级任务——即使这发生在同一个时间片内 。此时,据说高优先级任务 “抢占”了低优先级任务。
“轮询调度” 是指具有相同优先级的任务轮流进入运行状态。
“时间片” 是指调度器会在每个 tick 中断上在同等优先级任务之间进行切换, tick 中断之间的时间构成一个时间片。tick 中断是 RTOS 用来衡量时间的周期性中断。

使用优先排序的抢占式调度器,避免任务饥饿
总是运行优先级最高且可运行的任务的后果是, 永远不会进入“阻塞”或 “挂起”状态的高优先级任务会让所有任意执行时长的低优先级任务永久饥饿 。这就是为什么通常最好创建事件驱动型任务的原因之一 。例如,如果一个高优先级任务正在等待一个事件, 那么它就不应处于该事件的循环(轮询)中,因为如果处于轮询中,它会一直运行,永远不进入“阻塞”或“挂起”状态。 反之,该任务应进入“阻塞” 状态来等待事件。可以使用众多 FreeRTOS 任务间通信和同步原语之一将事件发送给任务。接收到 事件后, 优先级更高的任务会自动解除“阻塞”状态。高优先级任务处于“阻塞”状态时, 低优先级任务会运行。

配置 RTOS 调度策略
以下 FreeRTOSConfig.h 设置更改了默认调度 行为:

configUSE_PREEMPTION
如果 configUSE_PREEMPTION 设置为 0,则关闭“抢占”, 只有当运行状态的任务进入“阻塞”或“挂起”状态, 或运行状态任务调用 taskYIELD(), 或中断服务程序 (ISR) 手动请求上下文切换时,才会发生上下文切换。

configUSE_TIME_SLICING
如果 configUSE_TIME_SLICING 设置为 0,则表示时间切片已关闭, 因此调度器不会在每个 tick 中断上在同等优先级的任务之间切换 。

FreeRTOS AMP 调度策略
使用 FreeRTOS 的非对称多处理 (AMP) 是指多核设备的每个核心都单独运行自己的 FreeRTOS 实例。这些 核心并不都需要具有相同架构, 但如果 FreeRTOS 实例之间需要进行通信,则需要共享一些内存。

每个核心都会运行自己的 FreeRTOS 实例, 因此任何给定核心上的调度算法与上文的单核系统调度算法完全相同 。您可以使用流缓冲区或消息缓冲区作为核间通信原语, 这样一来,一个核心上的任务可以进入“阻塞”状态, 以等待另一个核心发来的数据或事件。

FreeRTOS SMP 调度策略
使用 FreeRTOS 的对称多处理 (SMP) 是指 一个 FreeRTOS 实例可以跨多个处理器核心调度 RTOS 任务。由于 只有一个 FreeRTOS 实例在运行,一次只能使用 FreeRTOS 的一个端口, 因此每个核心必须具有相同的处理器架构并共用 相同的内存空间。

FreeRTOS SMP 调度策略使用与单核调度策略相同的算法, 但与单核和 AMP 场景不同的是, SMP 在任何给定时间都会导致多个任务处于运行状态 (每个核心上都有一个运行状态的任务)。这意味着, 只有缺乏可运行的高优先级任务时,才会运行低优先级任务的假设不再成立 。要想了解其中的原因,请考虑一下, 若起初只有一个高优先级任务 和两个中等优先级任务处于 “就绪”状态,SMP 调度器会如何选择在双核微控制器上运行的任务。调度器需要选择两个任务,每个核心对应一个任务。 首先,高优先级任务是指可运行的最高优先级任务, 因此会选择将它用于第一个核心。 这样就剩下了两个中等优先级的任务 作为可运行的最高优先级任务,因此会将它们用于第二个核心 。结果是高优先级和中等优先级的任务同时运行。

配置 SMP RTOS 调度策略
以下配置选项有助于移动下述代码:将为单核或 AMP RTOS 配置编写的代码移动到 SMP RTOS 配置中, 且这些代码依赖于该假设——如果有一个可运行的高优先级任务,那么低优先级任务不会运行。

configRUN_MULTIPLE_PRIORITIES
如果在下述文件中将 configRUN_MULTIPLE_PRIORITIES 设置为 0: FreeRTOSConfig.h,则调度器只会同时运行 具有相同优先级的多个任务。这可能会修复基于“一次只运行一个任务”这一假设编写的代码, 但这就无法享受到 SMP 配置带来的一些好处。

configUSE_CORE_AFFINITY
如果在 中将 FreeRTOSConfig.hconfigUSE_CORE_AFFINITY 设置为 1, 则 vTaskCoreAffinitySet() API 函数可用于定义某个任务可以在哪些核心上运行 以及不可以在哪些核心上运行。使用该方法,应用程序编写者可以防止 同时执行假设了自身执行顺序的两个任务 。

FreeRTOS 内核开发者文档:https://www.freertos.org/zh-cn-cmn-s/features.html

相关文章:

【STM32】入门(十四):FreeRTOS-任务

1、简述 FreeRTOS应用程序由一组独立的任务构成。 在任何时间点,应用程序中只能执行一个任务,FreeRTOS调度器负责决定所要执行的任务。 每个任务在自己的上下文中执行,不依赖于系统内的其他任务或 FreeRTOS的调度器本身。 FreeRTOS调度器负责…...

apscheduler 的基本介绍和使用

APScheduler有四大组件: 1、触发器 triggers : 触发器包含调度逻辑。每个作业都有自己的触发器,用于确定下一个任务何时运行。除了初始配置之外,触发器是完全无状态的。 有三种内建的trigger: (1)date: 特定…...

Oracle中merge Into的用法

Oracle中merge Into的用法 使用场景 在操作数据库时,数据存在的情况下,进行update操作;不存在的情况下,进行insert操作;在Oracle数据库中,能够使用merge into来实现。 基本语法 merge into table_name …...

JDK19下载、安装与测试的完整图文教程

一、下载JDK 1、官网获取:https://www.oracle.com/ 1.1 点击“Products”; 1.2 选择“Java”; 1.3 选择“Download Java”; 1.4 选择“Java downloads”,这里以最新版(JDK19)为例&#xff…...

Vector - CAPL - 获取相对时间函数

在自动化开发中,无论是CAN通信测试,还是网络管理测试,亦或是休眠唤醒等等存在时间相关的,都可能会使用相关的时间函数;今天主要介绍的就是获取当前时间,我们知道vector工具的最大优势就是稳定和精确度高&am…...

C++编程语言STL之unordered_map介绍

本文主要介绍 C 编程语言的 STL(Standard Template Library) 中 unordered_map 的相关知识,同时通过示例代码介绍 unordered_map 的常见用法。1 概述C标准库提供了四个无序关联容器(unordered associated container)&a…...

【独家】华为OD机试 - 最快检测效率-核酸(C 语言解题)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明本期…...

【Redis应用】基于Redis实现共享session登录(一)

🚗Redis应用学习第一站~ 🚩本文已收录至专栏:数据库学习之旅 👍希望您能有所收获 👉相关推荐:使用短信服务发送手机验证码进行安全校验 一.引入 ​ 在开发项目过程中,我们常常能碰到需要登录注…...

Android framework系列2 - Init进程

1、源码 入口:system/core/init/main.cpp2 流程图 https://note.youdao.com/s/EtnCswft 3、代码详解 主入口共三步,如流程图所示,我们主要看下最后一步 入口在init.cpp下,这个阶段主要来解析init.rc并执行此文件下的命令 看到…...

2023年“网络安全”赛项江苏省淮安市选拔赛 任务书

任务书 一、竞赛时间 共计3小时。 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段单兵模式系统渗透测试 任务一 服务器内部信息获取 任务二 网站渗透测试 任务三 Linux系统渗透提权 任务四 Web渗透测试 第二阶段分组对抗 备战阶段 攻防对抗准备工作 系统加…...

2023年Wireshark数据包分析——wireshark0051.pcap

Wireshark数据包分析 任务环境说明: 服务器场景:FTPServer220223服务器场景操作系统:未知(关闭连接)FTP用户名:wireshark0051密码:wireshark0051从靶机服务器的FTP上下载wireshark0051.pcap数据包文件,找出黑客获取到的可成功登录目标服务器FTP的账号密码,并将黑客获…...

SpringMVC的自定义配置和自动化配置

SpringBoot的自动配置MVC处理加载逻辑基于Spring Boot的MVC自动化配置由WebMvcAutoConfiguration类完成,部分关键源码:AutoConfiguration(after { DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,ValidationAutoConf…...

画图说透 ZooKeeper如何保证数据一致性:选举和ZAB协议

1、zookeeper是什么? zookeeper能被各个牛逼的中间件项目中所依赖,已经说明了他的地位。一出手就是稳定的杀招。zookeeper是什么?官网中所说,zookeeper致力于开发和维护成为一个高度可靠的分布式协调器。 开局一张图,…...

错误异常捕获

1、React中错误异常捕获 在 React 中,可以通过 Error Boundaries(错误边界)来捕获错误异常。Error Boundaries 是一种 React 组件,它可以在其子组件树的渲染期间捕获 JavaScript 异常,并且可以渲染出备用 UI。React 提…...

js垃圾回收机制

内存的生命周期 ]S环境中分配的内存,一般有如下生命周期 1.内存分配:当我们声明变量、函数、对象的时候,系统会自动为他们分配内存 2.内存使用:即读写内存,也就是使用变量、函数等 3.内存回收: 使用完毕,由垃圾回收器自动回收不再…...

YApi分析从NoSQL注入到RCE远程命令执行.md

0x00 前提 这个是前几个月的漏洞,之前爆出来发现没人分析就看了一下,也写了一片 Nosql注入的文章,最近生病在家,把这个写一半的完善一下发出来吧。 0x01 介绍 YApi是一个可本地部署的、打通前后端及QA的、可视化的接口管理平台…...

【C++】stl_list介绍和实现,list和vector区别,list vector string 迭代器失效

本篇博客详细介绍list的实现&细节讲解,并且在文章末对list和vector,string进行区分和复习 list的基本结构就是双向带头循环链表,链表和顺序表的差别我们在前面数据结构的时候早就学过了,不再赘述 在使用stl库里面list时&…...

linux-kernel-ecmp-ipv4

当使用ip route add/del添加或者删除路由时,通过触发netlink发送信息到各协议路由系统注册的netlink处理函数,如add时调用函数为inet_rtm_newroute。Equal Cost Multi Path,在ip交换网络中存在到达同一目的地址的多条不同的路径,而且每条路径…...

蒙特卡洛树搜索(MTCS)

一、目标 一种启发式的搜索算法,在搜索空间巨大的场景下比较有效 算法完成后得到一棵树,这棵树可以实现:给定一个游戏状态,直接选择最佳的下一步 二、算法四阶段 1、选择(Selection) 父节点选择UCB值最…...

【Verilog】——Verilog简介

目录 1.简介 2.什么是HDL以及HDL的功能 3.Verilog和C语言的比较 4.Verilog的用途 5.数字系统的抽象层次 1.系统级 2.算法级 3.RTL级(寄存器变换级) 6.数字系统抽象层级 7.自顶向下的结构化设计方法 8.Verilog建模 9.Verilog概述 10.Verilog模块的基本…...

基于Vue的旅行社在线预定与评价系统[vue]-计算机毕业设计源码+LW文档

摘要:随着互联网技术的飞速发展和人们生活水平的提高,在线旅游预订市场呈现出蓬勃发展的态势。本文旨在设计并实现一个基于Vue的旅行社在线预定与评价系统,以满足用户便捷预订旅游产品和公平评价服务的需求,同时提升旅行社的管理效…...

如何通过YimMenu提升GTA5游戏体验与安全防护:从入门到精通

如何通过YimMenu提升GTA5游戏体验与安全防护:从入门到精通 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/…...

Mujoco 进阶指南:程序化模型编辑与动态场景构建实战

1. 为什么需要程序化模型编辑 当你第一次接触Mujoco时,可能和我一样都是从XML文件开始学习的。XML确实直观易懂,适合初学者快速上手。但当你需要构建复杂的动态场景时,手动编辑XML文件就会变得异常繁琐。比如要创建一个受风力影响的树林场景&…...

医疗、金融、反欺诈...实战解析知识图谱如何给大模型“治病”(减少幻觉提升可解释性)

知识图谱如何成为大语言模型的“特效药”:医疗、金融与反欺诈实战解析 当ChatGPT误将"阿司匹林"推荐给血友病患者时,当信贷审批系统无法解释拒贷原因时,当反洗钱模型将正常跨境交易标记为可疑时——这些正是当前大语言模型&#x…...

TranslateGemma部署避坑指南:解决CUDA错误与单卡识别问题

TranslateGemma部署避坑指南:解决CUDA错误与单卡识别问题 1. 为什么你的TranslateGemma部署总出问题? 最近在帮几个团队部署TranslateGemma时,我发现了一个有趣的现象:90%的部署失败都集中在两个问题上——CUDA错误和GPU识别异常…...

Snap.Hutao:原神玩家的智能桌面助手,让游戏管理变得简单高效

Snap.Hutao:原神玩家的智能桌面助手,让游戏管理变得简单高效 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 🧰 / Multifunctional Open-Source Genshin Impact Toolkit 🧰 项目地址: https://gitcode.com/GitHub_Tre…...

告别评论采集困扰:用TikTokCommentScraper解锁数据收集效率

告别评论采集困扰:用TikTokCommentScraper解锁数据收集效率 【免费下载链接】TikTokCommentScraper 项目地址: https://gitcode.com/gh_mirrors/ti/TikTokCommentScraper 作为内容运营者,你是否曾因需要整理上百条视频评论而熬夜加班&#xff1f…...

掌握QQ音乐加密格式转换:QMCDecode让你的音乐库重获自由

掌握QQ音乐加密格式转换:QMCDecode让你的音乐库重获自由 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默认…...

告别复杂配置:Phi-3-Mini-128K开箱即用,仿ChatGPT界面快速搭建对话工具

告别复杂配置:Phi-3-Mini-128K开箱即用,仿ChatGPT界面快速搭建对话工具 1. 项目简介 Phi-3-Mini-128K是一款基于微软Phi-3-mini-128k-instruct模型开发的轻量化对话工具,它彻底改变了传统大模型部署的复杂流程。这个工具最大的特点就是&quo…...

JamTools:一款免费开源的跨平台聚合工具软件,一站式解决多种办公需求

在数字化办公日益普及的今天,我们每天都需要使用各种工具来完成不同的任务。 从截图识字到视频转换,从鼠标录制到文件传输,每一项功能都可能需要单独安装一款软件。 这不仅会占用大量的系统资源,还会增加我们的学习成本和操作复杂…...