STM32H750之FreeRTOS学习--------(五)临界段代码保护

FreeRTOS

文章目录

  • FreeRTOS
      • 五、临界段代码保护
          • 临界段代码保护函数
            • 任务级进入临界段
            • 任务级退出临界段
            • 中断级进入临界段
            • 中断级退出临界段
          • 任务调度器的挂起和恢复
            • 挂起任务调度器
            • 恢复任务调度器
            • 挂起任务调度器
            • 恢复任务调度器

五、临界段代码保护

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

为什么程序会被打断?因为在freeRTOS中任务与任务之间是通过任务调度器实现并发执行的

什么可以打断当前任务的执行?中断,任务调度

需要应用临界区的场合

  • IIC,SPI需要严格按照时序的任务
  • 创建任务的任务,该任务通常不能被打断
临界段代码保护函数
任务级进入临界段
taskENTER_CRITICAL()

套了两层宏

image-20231108164511459

image-20231108164559890

void vPortEnterCritical( void )
{portDISABLE_INTERRUPTS();//关闭中断uxCriticalNesting++;/* This is not the interrupt safe version of the enter critical function so* assert() if it is being called from an interrupt context.  Only API* functions that end in "FromISR" can be used in an interrupt.  Only assert if* the critical nesting count is 1 to protect against recursive calls if the* assert function also uses a critical section. */if( uxCriticalNesting == 1 ){configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );}
}
任务级退出临界段
taskEXIT_CRITICAL()
void vPortExitCritical( void )
{configASSERT( uxCriticalNesting );uxCriticalNesting--;if( uxCriticalNesting == 0 ){portENABLE_INTERRUPTS();}
}

调用格式

taskENTER_CRITICAL() ;
{/* 临界区 */
}
taskEXIT_CRITICAL()	;
中断级进入临界段
taskENTER_CRITICAL_FROM_ISR()
中断级退出临界段
taskEXIT_CRITICAL_FROM_ISR()

调用格式

uint32_t  save_status;
save_status  = taskENTER_CRITICAL_FROM_ISR(){/* 临界区 */
}
taskEXIT_CRITICAL_FROM_ISR(save_status );
  • 成对使用
  • 支持嵌套
  • 尽量保持临界段耗时短
任务调度器的挂起和恢复

挂起任务调度器, 调用此函数不需要关闭中断

挂起任务调度器
vTaskSuspendAll()

调用一次挂起调度器,该变量uxSchedulerSuspended就加一 ,变量uxSchedulerSuspended的值,将会影响Systick触发PendSV中断,即影响任务调度

恢复任务调度器
xTaskResumeAll()

调用一次恢复调度器,该变量uxSchedulerSuspended就减一

如果等于0,则允许调度

1、将所有在xPendingReadyList中的任务移到对应的就绪链表中

2、移除等待就绪列表中的列表项,恢复至就绪列表,直到xPendingReadyList列表为

  1. 与临界区不一样的是,挂起任务调度器,未关闭中断;
  2. 它仅仅是防止了任务之间的资源争夺,中断照样可以直接响应;
  3. 挂起调度器的方式,适用于临界区位于任务与任务之间;既不用去延时中断,又可以做到临界区的安全

闭中断

挂起任务调度器
vTaskSuspendAll()

调用一次挂起调度器,该变量uxSchedulerSuspended就加一 ,变量uxSchedulerSuspended的值,将会影响Systick触发PendSV中断,即影响任务调度

恢复任务调度器
xTaskResumeAll()

调用一次恢复调度器,该变量uxSchedulerSuspended就减一

如果等于0,则允许调度

1、将所有在xPendingReadyList中的任务移到对应的就绪链表中

2、移除等待就绪列表中的列表项,恢复至就绪列表,直到xPendingReadyList列表为

  1. 与临界区不一样的是,挂起任务调度器,未关闭中断;
  2. 它仅仅是防止了任务之间的资源争夺,中断照样可以直接响应;
  3. 挂起调度器的方式,适用于临界区位于任务与任务之间;既不用去延时中断,又可以做到临界区的安全

image-20231108165822662

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式-状态模式 golang实现

一 什么是有限状态机 有限状态机,英⽂翻译是 Finite State Machine,缩写为 FSM,简称为状态机。 状态机不是指一台实际机器,而是指一个数学模型。说白了,一般就是指一张状态转换图。 已订单交易为例: 1.…

js:React中使用classnames实现按照条件将类名连接起来

参考文档 https://www.npmjs.com/package/classnameshttps://github.com/JedWatson/classnames 安装 npm install classnames示例 import classNames from "classnames";// 字符串合并 console.log(classNames("foo", "bar")); // foo bar//…

助听器不仅能帮你听到,还有另外一个功能……

你是否有过这样的经历,走在路上突然感觉脚下一软,差点摔倒? 在黑暗的环境中行走时,总是觉得不稳,需要借助外物来保持平衡?…… 如果你有这样的困扰,那么你可能不知道,你的听力可能…

ElementUI之el-progress动态修改进度条里面文本颜色与进度条色块统一

1.效果&#xff1a; 2.实现方式 通过行内style样式动态给整个progress赋颜色 再在样式里给进度条文字单独设置颜色为默认继承父级颜色就ok啦 <el-progress class"custom-progress" stroke-linecap"square" :style"{color:item.color}" :colo…

[极客大挑战 2019]Http 1

题目环境&#xff1a; 看起来挺花里胡哨的 F12查看源代码寻找隐藏文件 这是啥子呀&#xff0c;果然防不胜防 点击隐藏文件Secret.php 它不是来自这个地址的请求 报头&#xff1a;https://Sycsecret.buuoj.cn 需要抓包&#xff0c;在抓包前了解部分数据包参数 GET:到 Host:来自 …

2014年亚太杯APMCM数学建模大赛C题公共基础课教师专业化培养方式研究求解全过程文档及程序

2014年亚太杯APMCM数学建模大赛 C题 公共基础课教师专业化培养方式研究 原题再现 近年来&#xff0c;世界基础工业、信息产业、服务业的跨越式发展引发了大量人才需求&#xff0c;导致了职业教育的飞速发展&#xff0c;除原有专科层次高等职业教育院校外&#xff0c;大量普通…

工程车云管家|叉车智能管家安卓主板方案

工程车云管家是一款功能强大的设备管理和调度系统&#xff0c;它可以实时追踪工程车或机械设备的地理位置、视频、行驶轨迹、油位油耗、工作时长和地点、以及运行状况等信息&#xff0c;并将这些数据通过云平台存储、分析&#xff0c;并发送到管理者的手机上。这使得管理者能够…

第十八章:Swing自述

18.1 Swing概述 18.2&#xff1a;Swing常用窗体 18.2.1&#xff1a;JFrame窗体 package eightth; import java.awt.*; //导入AWT包 import javax.swing.*; //导入Swing包 public class JFreamTest { public static void main(String args[]) { // 主方法 JFr…

我是这样发布成绩的

作为一名老师&#xff0c;每当到了期中或者期末考试后&#xff0c;总是有那么些时刻&#xff0c;想要快点把成绩发布出去&#xff0c;让学生知道他们的努力得到了多少回报。但如何发布成绩呢&#xff1f;传统的纸质方式&#xff1f;太慢&#xff01;一个个发短信&#xff1f;太…

Visual Studio 2022 + OpenCV 4.5.2 安装与配置教程

目录 OpenCV的下载与配置Visual Studio 2022的配置新建工程新建文件新建项目属性表环境配置测试先写一个输出将OpenCV的动态链接库添加到项目的 x64 | Debug下测试配置效果 Other OpenCV的下载与配置 参考这个OpenCV的下载与环境变量的配置&#xff1a; Windows10CLionOpenCV4…

windows 下 QT Android 环境搭建(QGC 4.2.x + Qt 5.15.2)

文章目录 1. QT Creator 环境搭建2. JDK1&#xff09;官网途径&#xff1a;2) 360 安装&#xff1a;配置 3. SDK1) 通过 Android Studio2&#xff09;QT 配置中安装 姊妹篇&#xff1a; win10下新版QGC地面站环境搭建全面攻略&#xff08;v4.x.x QGroundControl地面站搭建&…

关于卷积神经网络的池化层(pooling)

了解池化层 池化层又称“下采样层”或“子采样层”&#xff0c;池化层可以大大降低特征的维度&#xff0c;减少计算量&#xff0c;同时可以避免过拟合问题。 顾名思义&#xff0c;最大池化层就是从输入的矩阵中某一范围内&#xff0c;选择最大的元素进行保留&#xff1b;平均池…