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 //可以点最后一个任务切到哪里去
再配合各个中断的位置点灯

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

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

相关文章

【硬件测试】基于FPGA的4FSK调制解调通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.Verilog核心程序 4.开发板使用说明和如何移植不同的开发板 5.完整算法代码文件获得 1.算法仿真效果 本文是之前写的文章: 《基于FPGA的4FSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR》 的…

【Vue2+Element-ui】el-dialog宽度适配

1、不适配问题 分辨率100%-页面 分辨率150%-页面 在项目中,我开发分辨率一直是100%,但是客户使用的分辨率不相同,所以宽度要适配 2、解决-封装mixins.js 1)、封装的mixins 我将宽度设置成动态的,因为我的项目中需求不同。 expor…

Tr0ll: 1 Vulnhub靶机渗透笔记

Tr0ll: 1 本博客提供的所有信息仅供学习和研究目的,旨在提高读者的网络安全意识和技术能力。请在合法合规的前提下使用本文中提供的任何技术、方法或工具。如果您选择使用本博客中的任何信息进行非法活动,您将独自承担全部法律责任。本博客明确表示不支…

23. C++STL 9 (priority_queue的使用和适配实现详解)

⭐本篇重点: 1 priority_queue的使用与底层原理 2 使用容器来适配 priority_queue ⭐本篇代码:c学习 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) ⭐标⭐是比较重要的部分 目录 一. priority_queue(优先级队列)的…

十四、Pod的升级和回滚

当集群中的某个服务需要升级时,我们需要停止目前与该服务相关的所有Pod,然后下载新版本镜像并创建新的Pod。如果集群规模比较大,则这个工作变成了一个挑战,而且先全部停止然后逐步升级的方式会导致较长时间的服务不可用。Kubernetes提供了滚动升级功能来解决上述问题。 如…

中间件--MongoDB部署及初始化js脚本(docker部署,docker-entrypoint-initdb.d,数据迁移,自动化部署)

一、概述 MongoDB是一种常见的Nosql数据库(非关系型数据库),以文档(Document)的形式存储数据。是非关系型数据库中最像关系型数据库的一种。本篇主要介绍下部署和数据迁移。 在 MongoDB 官方镜像部署介绍中&#xff…

MES系统通过eDrawings Pro API开发图纸批量转换工具,实现3D在线查看

声明:部分代码来源于网络,如有疑问,请联系本人删除。 通过C#结合eDrawings API提供接口,实现图纸转换为换.jpg、.tif、.bmp、.stl、.exe、.html、.zip、.edrw、.eprt 和 .eas格式工具,尤其是.html格式,可以…

Java阶段三06

第3章-第6节 一、知识点 理解MVC三层模型、理解什么是SpringMVC、理解SpringMVC的工作流程、了解springMVC和Struts2的区别、学会使用SpringMVC封装不同请求、接收参数 二、目标 理解MVC三层模型 理解什么是SpringMVC 理解SpringMVC的工作流程 学会使用SpringMVC封装请求…

【计算机网络】期末速成(2)

部分内容来源于网络,侵删~ 第五章 传输层 概述 传输层提供进程和进程之间的逻辑通信,靠**套接字Socket(主机IP地址,端口号)**找到应用进程。 传输层会对收到的报文进行差错检测。 比特流(物理层)-> 数据帧(数据链路层) -> 分组 / I…

word poi-tl 表格功能增强,实现表格功能垂直合并

目录 问题解决问题poi-tl介绍 功能实现引入依赖模版代码效果图 附加(插件实现)MergeColumnData 对象MergeGroupData 类ServerMergeTableData 数据信息ServerMergeTablePolicy 合并插件 问题 由于在开发功能需求中,word文档需要垂直合并表格&…

记一次:使用C#创建一个串口工具

前言:公司的上位机打不开串口,发送的时候设备总是关机,因为和这个同事关系比较好,编写这款软件是用C#编写的,于是乎帮着解决了一下(是真解决了),然后整理了一下自己的笔记 一、开发…

LLama系列模型简要概述

LLama-1(7B, 13B, 33B, 65B参数量;1.4T tokens训练数据量) 要做真正Open的AI Efficient:同等预算下,增大训练数据,比增大模型参数量,效果要更好 训练数据: 书、Wiki这种量少、质量高…

【OpenCV】模板匹配

理论 模板匹配是一种在较大图像中搜索和查找模板图像位置的方法。为此,OpenCV 带有一个函数 cv.matchTemplate() 。它只是在输入图像上滑动模板图像(如在 2D 卷积中),并比较模板图像下的模板和输入图像的补…

从 Zuul 迁移到 Spring Cloud Gateway:一步步实现服务网关的升级

从 Zuul 迁移到 Spring Cloud Gateway:一步步实现服务网关的升级 迁移前的准备工作迁移步骤详解第一步:查看源码第二步:启动类迁移第三步:引入 Gateway 依赖第四步 编写bootstrap.yaml第五步:替换路由配置第六步&#…

网站中的QQ在线客服接入

1. 开通QQ通讯组件 QQ通讯组件官网:https://shang.qq.com 默认未开通通讯组件,登陆上QQ之后会提示开通,点击开通即可 2. 唤起QQ临时会话(对方不是自己的QQ好友也能唤起) 复制链接地址 http://wpa.qq.com/msgrd?v3&…

赋能加速AI应用交付,F5 BIG-IP Next for Kubernetes方案解读

随着AI工作负载的爆炸式增长,服务提供商和企业需要加速计算,以安全高效地在大规模云上交付高性能的AI应用。前段时间,F5公司宣布推出一项全新的创新AI应用交付和应用安全解决方案,即BIG-IP Next for Kubernetes。那么该方案有何性…

域内DNS信息收集

目录 一、查询域内DNS记录 1. 使用 PowerView.ps1 2. 使用 adidnsdump 二、添加域内DNS记录 1. 使用 Invoke-DNSUpdate.ps1 在默认情况下,域内所有用户 都有权限读取 Active Directory 数据库中的 DNS 信息,包括所有记录。这是因为: DNS 记录被视为公共信息,用于解析域…

Odoo :一款免费且开源的食品生鲜领域ERP管理系统

文 / 贝思纳斯 Odoo金牌合作伙伴 引言 提供业财人资税的精益化管理,实现研产供销的融通、食品安全的追踪与溯源,达成渠道的扁平化以及直面消费者的 D2C 等数字化解决方案,以此提升运营效率与核心竞争力,支撑高质量的变速扩张。…

在星闪W63/W63E开发板上运行第一个OpenHarmony程序

目录 引言 demolink示例 程序修改 修改任务堆栈的大小 修改示例程序的build.gn 修改App的build.gn 修改ohos.cmake 修改config.py 编译程序 烧写程序 程序运行 结语 引言 在前面的博文星闪WS63E开发板的OpenHarmony环境构建-CSDN博客中介绍了如何构建W63E开发板的…

Spring——@Autowired和@Configuration注解区别

摘要 本文主要介绍了Spring框架中Autowired和Configuration注解的区别。Autowired用于自动注入依赖,支持属性、构造器和方法注入。Configuration则用于定义配置类,允许在类中使用Bean注解声明Bean。文章详细解释了这两个注解的作用、使用场景和核心特性…