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

Freertos任务切换

一、操作系统进行任务切换的时机:

在这里插入图片描述采用信号量实现任务的互斥:
在这里插入图片描述

二、FreeRTOS 任务切换场合

PendSV 中断的时候提到了上下文(任务)切换被触发的场合:
● 可以执行一个系统调用
● 系统滴答定时器(SysTick)中断。

1、执行系统调用
执行系统调用就是执行 FreeRTOS系统提供的相关API函数,比如任务切换函数 taskYIELD(),
FreeRTOS 有些 API 函数也会调用函数 taskYIELD(),这些 API 函数都会导致任务切换,这些 API 函数和任务切换函数 taskYIELD()都统称为系统调用。

在这里插入图片描述
2、系统滴答定时器(SysTick)中断
在这里插入图片描述(1)、关闭中断
(2)、通过向中断控制和壮态寄存器 ICSR 的 bit28 写入 1 挂起 PendSV 来启动 PendSV 中断。这样就可以在 PendSV 中断服务函数中进行任务切换了。
(3)、打开中断。

在这里插入图片描述
在这里插入图片描述

三、查找下一个要运行的任务

在这里插入图片描述
在这里插入图片描述
(1)、如果调度器挂起那就不能进行任务切换。
(2)、调用函数 taskSELECT_HIGHEST_PRIORITY_TASK()获取下一个要运行的任务。
taskSELECT_HIGHEST_PRIORITY_TASK()本质上是一个宏,在 tasks.c 中有定义。
FreeRTOS 中查找下一个要运行的任务有两种方法:一个是通用的方法,另外一个就是使用
硬件的方法,这个在我们讲解 FreeRTOSCofnig.h 文件的时候就提到过了,至于选择哪种方法通
过宏 configUSE_PORT_OPTIMISED_TASK_SELECTION 来决定的。当这个宏为 1 的时候就使
用硬件的方法,否则的话就是使用通用的方法
在这里插入图片描述

四、任务的状态

在 FreeRTOS 中,当一个任务就绪后会自动插入就绪列表。
任务状态和就绪列表的概念
FreeRTOS 中的任务有多种状态,如就绪(Ready)、运行(Running)、阻塞(Blocked)和挂起(Suspended)。就绪状态的任务是已经准备好运行,等待调度器分配 CPU 时间来执行。就绪列表是一个数据结构,用于保存所有处于就绪状态的任务。
调度器会从就绪列表中选择一个任务来运行,这个选择过程是基于调度算法的,比如抢占式优先级调度算法,它会选择优先级最高的就绪任务来运行。
任务就绪的触发机制和插入过程
当一个任务创建成功并且其状态变为就绪时,例如任务创建函数xTaskCreate创建一个任务后,如果任务的初始状态是就绪(没有被阻塞或挂起),它会被自动插入就绪列表。
另外,当一个任务从阻塞状态(如等待一个信号量、消息队列或者定时器超时等情况)恢复到就绪状态时,系统也会自动将该任务插入就绪列表。这个过程是由 FreeRTOS 的内核机制来处理的,对于开发者来说是透明的。例如,一个任务因为等待一个信号量而阻塞,当信号量被释放后,等待该信号量的任务就会从阻塞状态转换为就绪状态,然后自动插入就绪列表,等待调度器调度运行。
所以,FreeRTOS 很好地管理了任务的状态转换和就绪列表的维护,确保就绪任务能够按照调度策略有机会得到执行。

五、Freertos时间片调度

FreeRTOS 支持多个任务同时拥有一个优先级,这些任务的调度是一个值得考虑的问题。在 FreeRTOS 中允许一个任务运行一个时间片(一个时钟节拍的长度)后让出 CPU 的使用权,让拥有同优先级的下一个任务运行,至于下一个要运行哪个任务?FreeRTOS 中的这种调度方法就是时间片调度。展示了运行在同一优先级下的执行时间图,在优先级 N 下有 3 个就绪的任务。
在这里插入图片描述
1、任务 3 正在运行。
2、这时一个时钟节拍中断(滴答定时器中断)发生,任务 3 的时间片用完,但是任务 3 还
没有执行完。
3、FreeRTOS 将任务切换到任务 1,任务 1 是优先级 N 下的下一个就绪任务。
4、任务 1 连续运行至时间片用完。
5、任务 3 再次获取到 CPU 使用权,接着运行。
6、任务 3 运行完成,调用任务切换函数 portYIELD()强行进行任务切换放弃剩余的时间片,
从而使优先级 N 下的下一个就绪的任务运行。
7、FreeRTOS 切换到任务 1。
8、任务 1 执行完其时间片。
要使用时间片调度的话宏 configUSE_PREEMPTION 和宏 configUSE_TIME_SLICING 必须
为 1。时间片的长度由宏 configTICK_RATE_HZ 来确定,一个时间片的长度就是滴答定时器的
中断周期,比如本教程中 configTICK_RATE_HZ 为 1000,那么一个时间片的长度就是 1ms。时
间片调度发生在滴答定时器的中断服务函数中,前面讲解滴答定时器中断服务函数的时候说了
在中断服务函数 SysTick_Handler()中会调用 FreeRTOS 的 API 函数 xPortSysTickHandler(),而函
数 xPortSysTickHandler() 会 引 发 任 务 调 度 , 但 是 这 个 任 务 调 度 是 有 条 件 的 , 函 数
xPortSysTickHandler()如下:
在这里插入图片描述
上述代码中红色部分表明只有函数 xTaskIncrementTick()的返回值不为 pdFALSE 的时候就
会进行任务调度!查看函数 xTaskIncrementTick()会发现有如下条件编译语句:
在这里插入图片描述
(1)、当宏 configUSE_PREEMPTION 和宏 configUSE_PREEMPTION 都为 1 的时候下面的
代码才会编译。所以要想使用时间片调度的话这这两个宏都必须为 1,缺一不可!
(2)、判断当前任务所对应的优先级下是否还有其他的任务。
(3)、如果当前任务所对应的任务优先级下还有其他的任务那么就返回 pdTRUE。
从上面的代码可以看出,如果当前任务所对应的优先级下有其他的任务存在,那么函数
xTaskIncrementTick() 就 会 返 回 pdTURE , 由 于 函 数 返 回 值 为 pdTURE 因 此 函 数
xPortSysTickHandler()就会进行一次任务切换。

五、Freertos 查找watchdog 卡在哪个任务

在vTaskSwitchContext函数中
在taskSELECT_HIGHEST_PRIORITY_TASK()后面
点灯 uxTopReadyPriority //可以点最后一个任务切到哪里去
再配合各个中断的位置点灯

六、可重入函数

如果一个函数可以从多个任务调用,或者从任务和中断调用是安全的,那么这个函数就是“可重入的”。可重入函数被称为“线程安全的”,因为它们可以从多个线程访问,而不会有数据或逻辑操作损坏的风险。
每个任务维护自己的堆栈和自己的处理器(硬件)寄存器集。如果函数不访问存储在堆栈上或保存在寄存器中的数据以外的任何数据,那么函数是可重入的,并且是线程安全的。

不可重入的,使用了全局变量,用了static修饰,保存在数据段上。每个去访问的任务访问到的都是同一份。都有可能被覆盖的风险。
在这里插入图片描述
数据类型参考:在这里插入图片描述

相关文章:

Freertos任务切换

一、操作系统进行任务切换的时机: 采用信号量实现任务的互斥: 二、FreeRTOS 任务切换场合 PendSV 中断的时候提到了上下文(任务)切换被触发的场合: ● 可以执行一个系统调用 ● 系统滴答定时器(SysTick)中断。 1、执行系统调用 执行系统…...

go开发中interface和方法接收器的使用

Go 语言中的接口和方法接收器学习 Go 中的 interface 就像是一个神奇的魔法杖,能让你轻松地将不同的类型拉到同一个阵营里。与其他语言的接口不同,Go 的接口无需显式声明“我实现了你”,只要你满足了接口规定的方法,Go 就会自动认…...

vue3-tp8-Element:对话框实现

效果 参考框架 Dialog 对话框 | Element Plus 具体实现 一、建立view页面 /src/views/TestView.vue 二、将路径写入路由 /src/router/index.js import { createRouter, createWebHistory } from vue-router import HomeView from ../views/HomeView.vueconst router create…...

高中数学:随机变量-正态分布

文章目录 一、连续性随机变量二、大致图像三、正态分布图像及解析式图像特点均值与方差公式正态分布各区域概率 一、连续性随机变量 二、大致图像 三、正态分布图像及解析式 图像特点 均值与方差公式 正态分布各区域概率...

游戏引擎学习第47天

仓库: https://gitee.com/mrxiao_com/2d_game 昨天我们花了一点时间来修复一个问题,但基本上是在修复这个问题的过程中,我们决定添加一个功能,那就是在屏幕上控制多个实体。所以如果我有一个手柄,我可以添加另一个角色&#xff0…...

Git 仓库托管教程

git远程仓库 常用的远程仓库-->托管服务:github、码云、gitlab等 github需要魔法上网,速度较慢因为在国外且仅仅支持Git,如果不是Git项目是不支持的;码云--gitee国内的代码托管平台,服务器在国内速度快一些&#…...

基于51单片机的简易时钟/定时器闹钟proteus仿真

地址: https://pan.baidu.com/s/1uez4cwZuXpchmihmRqnLEg 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectro…...

Jackson @JsonProperty 注解

1. 概述 Jackson 是一个流行的Java库,用于将Java对象转换为JSON格式以及从JSON反序列化回Java对象。一种常见的需求是在序列化为JSON或从JSON反序列化时自定义字段的命名。Jackson 的 JsonProperty 注解正好满足了这一需求。 JsonProperty 注解概览 JsonProperty…...

【Excel学习记录】02-单元格格式设置

1.单元格格式工具美化表格 单元格格式位置 选中单元格,右键→设置单元格格式 合并居中 跨越合并 字体类型、大小、颜色、填充底纹、边框 斜线 软回车:alt enter 格式刷 2.单元格数字格式 格式不影响数值,只是展示形式 日期本质也是数…...

支持自定义离线地图地理区域,查询组件及数据源功能增强,DataEase开源BI工具v2.10.3 LTS发布

2024年12月9日,人人可用的开源BI工具DataEase正式发布v2.10.3 LTS版本。 这一版本的功能变动包括:数据源方面,API数据源和Excel数据源支持对字段类型和长度进行设置;图表方面,离线类地图支持自定义地理区域设置&#…...

LF CRLF

这个提示的含义是:Git 检测到你当前的 file3.txt 文件中使用了 LF(换行符,Line Feed,\n) 作为换行符,但在你系统的 Git 配置中,指定要将其转换为 CRLF(回车换行,Carriage…...

【从零开始入门unity游戏开发之——C#篇01】理论开篇,理解什么是编程

文章目录 前言前置条件进制什么是十进制、二进制二进制有什么用?为什么计算机用二进制而不用十进制?二进制转十进制十进制转二进制二进制运算 计算机中的数据存储单位什么是编程?什么是代码?什么是编程语言?常见的编程…...

怎样提升企业网络的性能?

企业网络的稳定性和高效性直接影响员工的工作效率。以下从多维度分析了一些有效策略,帮助公司提升网络性能,营造更高效的办公环境。 1. 升级网络设备 采用性能更高的网络硬件是优化网络体验的重要基础。选择支持高吞吐量、低延迟的设备(如企业…...

1. 机器学习基本知识(2)——机器学习分类

1.4 机器学习分类 1.4.1 训练监督 1. 监督学习:已对训练数据完成标记 分类:根据数据及其分类信息来进行训练,使模型能够对新的数据进行分类 回归:给出一组特征值来预测目标数值 2. 无监督学习:没有对训练数据进行任…...

四叉树算法在游戏碰撞检测中的应用

简介 在游戏开发中,碰撞检测是一个非常重要但计算成本较高的环节。如果采用简单的暴力检测方法,需要对场景中的每个物体与其他所有物体进行碰撞检测,时间复杂度为O(n)。四叉树(Quadtree)算法通过空间划分的方式,可以显著降低碰撞…...

IDEA 打包普通JAVA项目为jar包

需求:普通java项目(有添加依赖的jar包),没有用maven管理依赖和打包,要打成jar包,包可以用“java -jar 包名” 启动程序。 讲如何打包前,先记录下普通项目的目录结构和怎么添加依赖包 1.目录结…...

Docker Compose 多应用部署 一键部署

介绍 Docker Compose通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署。 如:springbootmysqlnginx 如果一个个去部署他会非常的麻烦,这时候可以选择Docker …...

软件架构设计——通用表单UI—未来之窗行业应用跨平台架构

.东方仙盟_小世界 {margin-top: 2%;padding: 0 3%;background: #fff; } .东方仙盟_小世界 li span {width: 55px;padding-left: 0px; }.东方仙盟_小世界 li span {display: block;position: absolute;left: 0px;padding-left: 10px;width: 55px;font-size: 16px;background-siz…...

人工智能大语言模型起源篇(二),从通用语言微调到驾驭LLM

上一篇:《人工智能大语言模型起源篇(一),从哪里开始》 (5)Howard 和 Ruder 于2018年发表的《Universal Language Model Fine-tuning for Text Classification》,https://arxiv.org/abs/1801.06…...

VBA 连续打印多个内容成PDF

VBA 连续打印多个内容成PDF Dim wb As Workbook Dim sht1 As Worksheet Set sht1 ActiveSheet PT ThisWorkbook.PathApplication.ScreenUpdating FalseApplication.DisplayAlerts FalseApplication.Calculation xlCalculationManual For i [aa2] To [ab2][ad2] iSet wb …...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

12.找到字符串中所有字母异位词

🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...