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

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

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

相关文章

Android EditText 实现强制性弹出只能输入英文的键盘

如果 EditText 控件不做任何特殊处理,例如笔者手机默认弹出的是百度输入法的软键盘,可实现中英文切换,并且自带英文单词智能联想功能(与系统安装输入法和设置相关)。但在某些应用场景下,例如在英语APP里练习…

RabbitMQ(高级特性):限流

消费端限流 在rabbitmq中,使用消费端限流必须开启手动签收信息 过MQ可以对请求进行“削峰填谷”,即通过消费端限流的方式限制消息的拉取速度,达到保护消费端的目的。 生产者批量发送消息: Test public void testSendBatch() {…

DBever 连接trino时区问题 The datetime zone id ‘GMT+08:00‘ is not recognised

DBever连接trino 测试连接成功,但是执行sql报时区不对、如果你默认使用的是大于jdk8的版本 会存在这个问题,因为jdk版本 jdk8 和jdk17 版本默认时区是不同的 trino官网明确说明了时区默认跟jdk走 解决方案 可以先行查看JDK本地时区库版本,执…

Django初窥门径-自定义用户模型

前言 自定义用户模型在Django应用中是一个重要的话题,它涉及到如何根据您的项目需求以及特定的用户身份验证和授权需求来调整用户模型。在以下前言中,我将讲述为什么自定义用户模型是如此重要以及其潜在的优势: 随着Web应用的不断发展&…

工业路由器网关的网络协议之NAT技术

在物联网通讯领域,NAT技术能将内网的一个私有IP转换成一个公网IP去接入互联网,解决组建局域网络时私有IP地址无法在公网上进行路由的问题。 NAT(Network Address Translation)的三种方式: 静态NAT 1、一个私有IP对应…

在微信小程序中怎么实现刮刮卡抽奖活动

在当今的数字化时代,微信小程序已经成为一种广泛使用的营销工具。通过各种互动活动,企业可以吸引用户的关注,提升品牌影响力。其中,刮刮卡抽奖活动是一种特别受欢迎的形式。本文将为你详细介绍如何在微信小程序中实现刮刮卡抽奖活…

Python中通过socketserver库创建服务端

socketserver库是Python的标准库,提供了套接字服务端的框架,通过该框架可以简化服务端的创建流程。 1 socketserver库的导入 通过如图1显示的代码导入socketserver库。 图1 导入socketserver库 2 通过socketserver库创建TCP服务端 通过socketserver库…

SpringCloud——服务容错——Hystrix

1.现在的微服务存在哪些问题? 在大型的微服务项目中,肯定少不了服务之间多条链路调用,如果调用中有一个服务出现了问题,如果不做任何的处理,就会造成大量的阻塞,可能会导致整个服务雪崩。 2.要解决的问题 …

C盘清理指南(三)——文件目录更改

各位小伙伴你们好,今天的推送是C盘清理系列的第三期——文件路径更改,分为文件夹路径和软件默认路径两个模块。 一.文件夹路径更改 点击进入C盘,依次点击上方“查看——隐藏的项目”,可以看到C盘中各种隐藏目录。 单击…

深度图(Depth Map)

文章目录 深度图深度图是什么深度图的获取方式激光雷达或结构光等传感器的方法激光雷达RGB-D相机 双目或多目相机的视差信息计算深度采用深度学习模型估计深度 深度图的应用场景扩展阅读 深度图 深度图是什么 深度图(depth map)是一种灰度图像&#xf…

使用 curator 连接 zookeeper 集群 Invalid config event received

dubbo整合zookeeper 如图,错误日志 2023-11-04 21:16:18.699 ERROR 7459 [main-EventThread] org.apache.curator.framework.imps.EnsembleTracker Caller0 at org.apache.curator.framework.imps.EnsembleTracker.processConfigData(EnsembleTracker.java…

为机器学习算法准备数据(Machine Learning 研习之八)

本文还是同样建立在前两篇的基础之上的! 属性组合实验 希望前面的部分能让您了解探索数据并获得洞察力的几种方法。您发现了一些数据怪癖,您可能希望在将数据提供给机器学习算法之前对其进行清理,并且发现了属性之间有趣的相关性&#xff0c…

Mysql学习笔记--基础

一,SQL最重要的增删改命令格式 1,insert into 表名(不写这个括号里面的内容就默认所有字段都要添加) values() 插入单条数据 2,insert into 表名 (里面是列名) values(根据列名依次…

【qemu逃逸】华为云2021-qemu_zzz

前言 虚拟机用户名:root 无密码 设备逆向 经过逆向分析,可得实例结构体大致结构如下: 其中 self 指向的是结构体本身,cpu_physical_memory_rw 就是这个函数的函数指针。arr 应该是 PCI 设备类结构体没啥用,就直接用…

京东按关键词搜索商品列表接口:竞品分析,商品管理,营销策略制定

京东搜索商品列表接口是京东开放平台提供的一种API接口,通过调用该接口,开发者可以获取京东平台上商品的列表数据,包括商品的标题、价格、库存、月销量、总销量、详情描述、图片等信息。 接口的主要作用包括: 市场调研&#xff…

图形学及图形学进展

有段时间没有来CSDN了,最近一直忙于工作,最近图形学方面,特别是重建图形学方面有了比较大的进展,然后NeRF-SLAM向也有不少进展,但由于ChatGPT风光无限,光芒都没有发出来,后续还是继续创作&#…

华为MateBook X Pro笔记本录屏办法

现象:使用ev录屏软件时录不上耳机声音。在我自己的普惠、华硕笔记本上都没有这个问题。 解决办法,使用华为自己的录屏功能。具体如下: 1、找到‘华为控制中心’: 2、使用‘智慧快录’:

ideal一键部署SpringBoot项目jar包到服务器

一 简介 我们在开发环境部署项目一般通过ideal将项目打包成jar包,然后连接linux服务器,将jar手动上传到服务中,重启服务。 概括的说流程是这样的: 本地打包->上传到服务器->kill掉以前的服务->重新启动jar包服务 每次总是循环这一…

【c语言】贪吃蛇

当我们不想学习新知识的时候,并且特别无聊,就会突然先看看别人怎么写游戏的,今天给大家分享的是贪吃蛇,所需要的知识有结构体,枚举,以及easy-x图形库的一些基本函数就完全够用了,本来我想插入游…

Android选项卡TabHost

选项卡主要由TabHost(标签&#xff0c;主人)&#xff0c;TabWidget(微件)和FrameLayout3个组件组成&#xff0c;用于实现一个多标签页的用户界面。 1. TabHost在XML文件中添加&#xff1a; XML布局文件中添加选项卡时必须使用系统id来为各组件指定id属性。 <TabHostandro…