FreeRTOS基础(七):临界段代码保护及调度器挂起与恢复

      上一篇博客我们详细介绍了FreeRTOS是怎么管理中断的,其实,从本质上来讲就是将就是利用的BASEPRI这个寄存器,来屏蔽优先级低于某一个阈值的中断,当设置为0的时候,就是打开所有中断,所有中断都可以响应。这样就实现了对所有中断的管理!(中断的管理就是关闭某一个范围的中断和打开中断)。这一篇博客,我们介绍一个另外一个重要的概念,这在实际开发也有非常多的应用。

目录

一、临界段代码保护简介(熟悉)

1.1 什么是临界段代码

1.2 适用场合

1.3 什么可以打断当前程序的运行(打断临界段)?

1.3.1 中断

1.3.2  任务调度

1.4 如何避免打断临界段?

1.5 临界段代码保护API函数介绍

1.5.1 调用格式示例

​1.5.2 特点

1.5.3 总结 

二、任务调度器的挂起和恢复

2.1 概念

2.2 任务调度器的挂起和恢复API函数

2.2.1 任务调度器挂起函数

2.2.2 任务调度器恢复函数

2.3 与使用关闭中断和打开中断实现临界段代码保护的区别

2.4 挂起和恢复任务调度器适用场合

2.5 使用格式示例

2.6 任务挂起与恢复内部实现(了解)


一、临界段代码保护简介(熟悉)

1.1 什么是临界段代码

         临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段。

1.2 适用场合

1.3 什么可以打断当前程序的运行(打断临界段)?

1.3.1 中断

        当中断发生的时候,当前运行的程序就会被暂停,转而去执行中断。

1.3.2  任务调度

       当前任务正在运行,出现一个更高优先级的任务,那么当前运行的程序就会被阻塞住。

1.4 如何避免打断临界段?

       通过上面,我们知道打断临界段的原因有哪些,那么我们就可以对症下药了,解决问题了。

      首先,关闭中断,则中断就不会打断我的运行,其次,任务调度也打断不了我,因为:PendSV是实现任务调度的一个内核中断,并且这个中断的优先级被设置成最低15,这里的关闭中断指的是:在管理的中断优先级范围内(FreeRTOS所能管理的最高中断)的中断都不会响应,那么自然优先级最低的PendSV中断也会被关闭,那么就无法进行任务切换调度,也就无法打断当前程序的运行!

1.5 临界段代码保护API函数介绍

        通过上面的分析,我们就不谋而合了,FreeRTOS 在进入临界段代码的时候需要关闭中断(管理范围内的中断),当处理完临界段代码以后再打开中断,进行正常的中断响应和任务调度。这就是临界段代码保护的方法!

     中断级的临界区函数会返回之前中断屏蔽寄存器的值,我们需要用一个变量接收,保存下来,然后关闭中断,退出临界区时将之前的中断屏蔽寄存器的值写回去。

1.5.1 调用格式示例

1.5.2 特点

1、成对使用。

2、支持嵌套。

3、尽量保持临界段耗时短。因为:在临界区屏蔽了中断,并且也不会发生任务调度了,中断一般是紧急的事,任务调度是可以满足实时性的,如果时间太长,可想而知,会带来什么后果!因此需要注意临界区代码的执行时间不宜过长,否则可能导致系统中断响应的延迟。

1.5.3 总结 

        临界段代码保护是直接屏蔽了中断(管理范围内),系统任务调度靠中断,ISR也靠中断,因此它的影响还是非常大的!!!

二、任务调度器的挂起和恢复

2.1 概念

        挂起就是暂停的意思,任务调度器挂起就是:任务不能再进行切换/调度,恢复就是任务调度器可以重新进行任务的切换。仅仅针对的是任务调度器,就是是否可以发生任务切换!

2.2 任务调度器的挂起和恢复API函数

2.2.1 任务调度器挂起函数

  • vTaskSuspendAll() 函数用于暂停任务调度器。调用这个函数后,任务切换将不会发生,系统会保持当前正在运行的任务。挂起调度器不会关闭中断,中断服务程序(ISR)仍然可以运行。
  • 这个函数通常用于临界区代码保护,确保一段代码在执行过程中不会被任务切换打断。

2.2.2 任务调度器恢复函数

  • xTaskResumeAll() 函数用于恢复任务调度器。恢复后,如果有较高优先级的任务被挂起期间解锁,那么这些任务将会立即执行。如果没有优先级更高的任务,当前任务将继续执行。
  • 在恢复任务调度时,系统会检查任务是否需要进行上下文切换,以确保高优先级任务能及时执行。

2.3 与使用关闭中断和打开中断实现临界段代码保护的区别

FreeRTOS提供了两种主要的临界段代码保护方法:

关闭和打开中断(portENTER_CRITICAL() 和 portEXIT_CRITICAL()):

  • portENTER_CRITICAL() 函数关闭中断,确保在临界区代码执行期间不会被管理范围内的中断打断。也不会发生任务的切换。
  • portEXIT_CRITICAL() 函数重新打开中断,允许系统恢复正常中断处理。
  • 优点:
    • 提供了最高级别的临界区保护,因为它完全阻止了中断
    • 适用于非常短且时间敏感的代码段
  • 缺点:
    • 关闭中断会影响整个系统的中断响应时间,可能会导致高优先级中断的延迟处理。
    • 不适用于长时间执行的代码,因为这会严重影响系统的实时性。

挂起和恢复任务调度器(vTaskSuspendAll 和 xTaskResumeAll):

  • vTaskSuspendAll() 暂停任务调度,但不会影响中断。这意味着ISR仍然可以执行,且ISR可以发起上下文切换(如果在ISR中调用了Yield函数)
  • xTaskResumeAll() 恢复任务调度,并在必要时进行上下文切换。
  • 它仅仅是防止了任务之间的资源争夺,中断照样可以直接响应;中断可以抢占当前任务的资源,但是其他任务无法抢占当前任务资源
  • 优点:
    • 保持中断响应能力,因为中断不会被禁用
    • 适用于需要保护不被任务切换打断的长时间执行代码,但又不需要完全禁止中断的场景。
  • 缺点:
    • 不适用于极端时间敏感的代码保护,因为ISR仍然可以打断执行。
    • 任务调度恢复时需要检查并可能进行任务切换,增加了一些开销。

   总结一下就是:利用任务调度器的挂起和恢复实现的临界段代码保护只是不会发生任务的切换,但是中断并未关闭,在临界区,中断依然可以响应,然而,利用关中断和开中断实现的临界段代码,它直接关闭了管理范围内的中断,任务切换也不会发生!它的力度是非常强的!

2.4 挂起和恢复任务调度器适用场合

挂起调度器的方式,适用于临界区位于任务与任务之间;既不用去延时中断,又可以做到临界区的安全。就是说:它不会受到任务切换而被打断,同时又能保证中断的及时响应!

  1. 任务与任务之间的临界区:

    • 在多任务操作系统中,多个任务之间可能需要访问共享资源(例如全局变量、硬件设备等)。为了防止任务之间的资源竞争,需要保护这些访问操作。
    • 临界区是指访问共享资源的代码段,需要确保这个代码段在一个任务执行时不会被其他任务打断。
  2. 不延时中断:

    • 挂起任务调度器 (vTaskSuspendAll()) 的方式不会关闭中断,这意味着系统中的中断服务程序(ISR)仍然可以正常执行。ISR的执行不会受到挂起任务调度器的影响。
    • 由于中断没有被关闭,系统的中断响应时间不会受到影响。这样可以保证系统的实时性,因为时间关键的中断仍然能够及时处理。
  3. 临界区的安全:

    • 当任务调度器被挂起时,当前任务可以独占CPU资源执行临界区代码,而不必担心在这个过程中会被其他任务打断。这样可以确保任务间临界区的代码安全执行。
    • 任务调度器挂起期间,虽然ISR可以执行,但ISR不会引起任务切换。因此,任务执行临界区代码的过程中,不会被其他任务打断。

2.5 使用格式示例

2.6 任务挂起与恢复内部实现(了解)

至此,已经讲解完毕!初次学习,循序渐进,一步步掌握即可!以上就是全部内容!请务必掌握,创作不易,欢迎大家点赞加关注评论,您的支持是我前进最大的动力!下期再见!

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

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

相关文章

【VMware虚拟机中ubuntu系列】—— 在虚拟机中使用本机摄像头的详细教程与常见问题分析及解决

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、虚拟机调用本机摄像头(1) 启动VMware USB 服务(2) 连接本机摄像头(3) 测试摄像头的连接 二、安装usb驱动二、运行usb_cam.launch时出现select timeout的报错…

希捷硬盘怎么恢复数据? 5 个免费希捷数据恢复软件

希捷已迅速成为全球最大的数字存储提供商。许多人选择并使用希捷外置硬盘来存储他们的媒体文件、学校或工作文件以及其他重要数据。有时,希捷硬盘中的数据会丢失。 如果您丢失了希捷硬盘上的数据,请不要惊慌。在专业的希捷数据恢复软件的帮助下&#xf…

【c++进阶(一)】STL之string接口介绍

💓博主CSDN主页:Am心若依旧💓 ⏩专栏分类c从入门到精通⏪ 🚚代码仓库:青酒余成🚚 🌹关注我🫵带你学习更多c   🔝🔝 1.前言 本章重点 本章着重讲解string中一些重要的接口函数&…

SOUI Combobox 实现半透明弹出下拉框

SOUI默认情况下combobox的弹出框不是半透明的&#xff0c;这个时候如果背景透明时&#xff0c;滚动条会出现黑色背景&#xff0c;这个时候只需要在在combobox下添加一个子节点 <dropdownStyle translucent"1"></dropdownStyle> 这样一个窗口默认即实现…

Nature Communications|柔性自驱动仿生眼(离子凝胶/仿生眼/柔性电子)

2024年4月10日,黄维(Wei Huang)院士、南京工业大学刘举庆(Juqing Liu)教授和刘正东(Zhengdong Liu)副教授课题组,在《Nature Communications》上发布了一篇题为“A bionic self-driven retinomorphic eye with ionogel photosynaptic retina”的论文,罗旭(Xu Luo)、陈晨(…

vscode过滤器@modified(查看配置了哪些设置)

文档 visualstudio•docs•getstarted•settingshttps://code.visualstudio.com/docs/getstarted/settings 说明 使用modified可以过滤出&#xff1a; 配置过的设置&#xff08;和默认值不同&#xff09;&#xff1b; 在 settings.json 文件中配置了值的设置 步骤 1.打开…

Golang省市二级联动实现 从数据收集、清洗到数据存储

1.背景&#xff1a; 最近在写项目&#xff0c;在项目中有一个需求是获取用户的地理位置&#xff0c;一开始是打算让前端使用JSON包的形式去实现&#xff0c;但是考虑到后期可能需要对省市的数据做一些修改和控制操作&#xff0c;所以改为后端实现&#xff0c;并向后台暴露一套…

六一去哪儿,跟着蒙自源开启一段关于童年记忆与美味奇妙旅程

夏日微风轻拂&#xff0c;童心随风起舞。在这个充满欢声笑语的季节里&#xff0c;蒙自源诚挚地邀请您和您的家人&#xff0c;一同参加为六一儿童节精心准备的庆祝活动&#xff0c;共同开启一段关于童年记忆与美味的奇妙旅程。 从5月25日起&#xff0c;蒙自源的各大门店将化身为…

Vue3实战笔记(56)—实战:DefineModel的使用方法细节

文章目录 前言一、实战DefineModel二、思考原理总结 前言 今天写个小例子&#xff0c;实战DefineModel的使用方法细节 一、实战DefineModel 上文官方说的挺清楚&#xff0c;实战验证一下&#xff0c;新建DefineModel.vue&#xff08;这是儿子&#xff09;&#xff1a; <te…

mac油猴Safari浏览器插件:Tampermonkey for Mac下载

Tampermonkey 是一款用于浏览器的用户脚本管理器插件&#xff0c;它允许用户安装、管理和运行用户脚本&#xff0c;从而可以自定义网页的功能和外观。该插件支持在谷歌浏览器、火狐浏览器、Safari等主流浏览器上使用。提供了丰富的用户脚本管理和自定义功能&#xff0c;使用户可…

基于小波分析的一维时间序列多重分形分析(MATLAB R2018a)

分形与小波变换在尺度性能上具有很多相似性&#xff0c;因此小波变换被认为是分析、刻画分形现象一个有力的工具。在分析分形的一般方法中&#xff0c;需要按照“盒维数”的计算思想&#xff0c;首先要将研究序列进行不同长度的分割&#xff0c;然后建立起结构函数&#xff0c;…

【人工智能】第一部分:ChatGPT的基本概念和技术背景

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

【因果推断python】10_分组和虚拟变量回归1

目录 分组数据回归 分组数据回归 并非所有数据点都是一样的。 如果我们再次查看我们的 ENEM 数据集&#xff0c;相比小规模学校的分数&#xff0c;我们更相信规模较大的学校的分数。 这并不是说大型学校更好或什么&#xff0c; 而只是因为它们的较大规模意味着更小的方差。 i…

【CVE-2021-3156】——漏洞复现、原理分析以及漏洞修复

文章目录 前言1、漏洞概述2、漏洞复现2.1、漏洞复现测试环境2.2、漏洞复现具体步骤 3、漏洞原理3.1、前置知识3.1.1、sudo3.1.2、sudoedit3.1.3、转义字符 3.2、漏洞分析 4、漏洞修复5、参考文献总结 前言 2021年01月27日&#xff0c;RedHat官方发布了Sudo缓冲区/栈溢出漏洞的风…

数据中台设计方案(原版word获取)

通过中台建设实现企业能力复用&#xff0c;包括能力整合、业务创新、业务和数据闭环、组织模式演进等。 数字能力整合 企业的数字能力一般包括数字化营销、数字化产品、数字化供应链、数字化生产、数字化运营等。企业的数字化能力的充分利用&#xff0c;从而达到可持续发展。数…

vscode设置编辑器文件自动保存

步骤 1.打开vscode的设置 2.在搜索栏输入关键字“保存”&#xff1b; 在 Files: Auto Save 设置项&#xff0c;选择自动保存的模式

Java——处理键盘输入

在Java中&#xff0c;可以使用多种方式来处理键盘输入。最常用的一种方法是使用 Scanner 类&#xff0c;它位于 java.util 包中。 一、使用 Scanner 类处理键盘输入 1、具体操作步骤 1&#xff09;导入 Scanner 类 在开始编写代码之前&#xff0c;需要导入 java.util.Scann…

【LeetCode:575. 分糖果+ 哈希表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

基于jeecgboot-vue3的Flowable流程-我的任务(三)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 这一部分主要讲我的任务里的详情&#xff0c;看流程情况 1、主要调用record/index.vue&#xff0c;调用参数如下&#xff1a; /*** 详情*/function handleDetail(record: Recordable) {c…

基于Chisel的FPGA流水灯设计

Chisel流水灯 一、Chisel&#xff08;一&#xff09;什么是Chisel&#xff08;二&#xff09;Chisel能做什么&#xff08;三&#xff09;Chisel的使用&#xff08;四&#xff09;Chisel的优缺点1.优点2.缺点 二、流水灯设计 一、Chisel &#xff08;一&#xff09;什么是Chise…