【学习FreeRTOS】第7章——FreeRTOS临界段代码保护及调度器挂起与恢复

news2024/11/24 20:31:09

1.临界段代码保护简介

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

  • 外设:需严格按照时序初始化的外设:IIC、SPI等等
  • 系统:系统自身需求
  • 用户:用户需求

什么可以打断当前程序的运行?——中断、任务调度(PendSV)

2.临界段代码保护函数介绍

FreeRTOS 在进入临界段代码的时候需要关闭中断(管理范围内),当处理完临界段代码以后再打开中断,以下是API函数:

  • taskENTER_CRITICAL()——任务级进入临界段
  • taskEXIT_CRITICAL()——任务级退出临界段
  • taskENTER_CRITICAL_FROM_ISR()——中断级进入临界段
  • taskEXIT_CRITICAL_FROM_ISR()——中断级退出临界段

系统任务调度靠中断,ISR也靠中断,临界区是直接屏蔽了中断,实现代码保护的目的,临界区保护的特点如下:

  • 成对使用
  • 支持嵌套(中断中临界代码保护不支持)
  • 尽量保持临界段耗时短

任务级临界区调用格式示例:

taskENTER_CRITICAL() ;
{
        … …	/* 临界区 */
}
taskEXIT_CRITICAL()	;	

中断级临界区调用格式示例(返回中断数值,方便恢复):

uint32_t  save_status;
save_status  = taskENTER_CRITICAL_FROM_ISR(){
        … …	/* 临界区 */
}
taskEXIT_CRITICAL_FROM_ISR(save_status );	
  • 中断中进入和退出临界区,会关闭中断,那为什么中断的内容还会顺利执行呢?
    当中断发生时,CPU会自动保存环境,进入中断服务函数。此时虽然在中断服务函数中执行了portENTER_CRITICAL()关闭了中断,该操作是对全局中断标志位的修改,对已经进入执行的中断没有影响,当前这个中断仍然会继续执行完成。
  • 为什么已经进入的中断不受影响呢?
    这是因为每个中断都有自己的堆栈空间,执行上下文环境。关闭中断只是修改了全局中断标志,而不会去修改每个中断栈内部的环境。

3.任务调度器的挂起和恢复

挂起任务调度器,即禁止任务切换,调用此函数不需要关闭中断,下面是API函数:

  • vTaskSuspendAll()——挂起任务调度器
  • xTaskResumeAll()——恢复任务调度器

任务调度器的挂起与恢复有以下特点:

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

使用格式示例:

vTaskSuspendAll() ;
{
        … …	/* 内容 */
}
xTaskResumeAll()	;	

3.1.挂起任务调度器的API函数解析

  • 调用一次挂起调度器,变量uxSchedulerSuspended就加一
  • uxSchedulerSuspended的值,将会影响Systick触发PendSV中断,即影响任务调度【PendSV函数内容】

3.2.恢复任务调度器的API函数解析

  • 调用一次挂起调度器,变量uxSchedulerSuspended就减一
  • uxSchedulerSuspended的值为0时,允许调度
  • 允许调度后,进行以下过程:
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

p7付费课程笔记7:G1 GC

目录 前言 什么是G1 GC? 重要语义讲解 标记过程 注意事项 适用场景分析 应用建议 问题 常用配置参数 前言 上次我们讲了CMS GC, 这次我们讲解G1 GC;在开始之前我们要思考下我们为什么学G1 GC?学习后有什么好处? 成为更好的Java开…

安达发APS|生产计划排产软件助力加工制造业智能化转型

随着全球经济一体化的不断深入,市场竞争日益激烈,加工制造企业面临着巨大的生存压力。在这种情况下,企业对于生产计划的精细化管理需求日益迫切。为了适应这一市场需求,安达发推出了专门针对加工企业的APS生产计划排产软件&#x…

四、Linux中cd、pwd以及相对/绝对路径和特殊路径符

1、cd命令: cd命令可以切换当前工作目录,基础语法是: cd [linux路径] (1)、打开Linux的命令提示行,当前工作目录是home,输入“cd /”,可以切换到根目录下,在根目录下输…

限制编辑下的PDF可以转换其他格式吗?这2个方法可行

我们知道,PDF可以通过设置“限制编辑”来保护文件不被随意更改,那PDF设置了“限制编辑”还可以转换其他格式吗? 如果PDF设置的是禁止任何更改的“限制编辑”,那PDF菜单【转换】界面下的格式选项就会呈现灰色状态,无法…

不要服务器和技术代码,怎么做新生录取查询系统?

作为一名老师,我了解学生和家长们对录取情况的关注和期待,所以学校公布录取情况表是一项至关重要的工作。在这篇文章中,我将与大家分享学校公布录取情况表的步骤和流程,以帮助大家更好地了解录取情况。 首先,学校会对…

JS代码混淆加密有什么用?

JS加密、JS混淆,有这些用: 1、前端JS代码,如果不加密,它人可以随便copy、任意修改。自己写的代码,可以轻易成为别人的成果。 对JS代码混淆加密,则可以防止这种他人随意白嫖的问题,代码是自己辛…

你知道什么是Curriculum Training模型吗

随着深度学习技术的飞速发展,研究人员在不断探索新的训练方法和策略,以提高模型的性能和泛化能力。其中,Curriculum Training(课程学习)模型作为一种前沿的训练方法,引起了广泛的关注和研究。本文将深入探讨…

Leetcode链表篇 Day2

203. 移除链表元素 - 力扣(LeetCode) 1.暴力移除:分删除的为头结点和不为头节点 while删除头节点时:直接从下一个结点开始,headhead->next while不是头节点时:从head开始遍历(需记录的为 前继结点pre) 虚…

Nature子刊 |肠道宏病毒组揭示百岁老人长寿秘诀

发表期刊:nature microbiology 发表时间:2023 影响因子:28.3 DOI: 10.1038/s41564-023-01370-6 研究背景 衰老是一种不可逆转的自然过程,随着年龄的增长,机体诸多方面出现功能性下降,与衰老相关的疾病&a…

uniapp一套代码实现多端运行

一、为何使用uniapp uni-app 是一个使用 Vue.js 开发所有前端应用的开源框架,开发者编写一套代码,可发布到 iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)等…

第5章:神经网络

神经元模型 上述定义的简单单元即为神经元模型。 多层网络 误差逆传播算法 标准BP算法:参数更新非常频繁,可能出现抵消现象。积累BP算法:下降到一定程度上,进行下一步会非常缓慢。 过拟合 早停:划分训练集和验证集…

运维监控学习笔记8

在服务器端,我们添加了nginx-server的主机: 在解决Error问题的过程中,我还通过zabbix_get这个命令进行了测试,发现是没有的,后来确认是在web页面配置的过程中,我输错了密码。 yum install zabbix-getzabbi…

电脑怎么修改图片大小尺寸?

电脑怎么修改图片大小尺寸?图片作为我们工作和办公中常用的文件,承载了许多元素和重要内容。而在一些软件和设备应用的过程中,可能会对图片的尺寸有一定的要求,需要我们将图片尺寸进行修改、调整。同时,我们经常在一些…

HDMI接口的PCB布局布线要求

高清多媒体接口(High Definition Multimedia Interface),简称:HDMI,是一种全数字化视频和声音发送接口,可以发送未压缩的音频及视频信号。随着技术的不断提升,HDMI的传输速率也不断的提升&#…

APFS 文件系统探究

本文的创作初衷是因为我发现从底层详解 APFS 的资料很少,所以自己来进行了一些探究和整理。 一点说明 如果你在看 APFS 的文档或者其他内容,不要把高层级的分区理解成 Windows 中的分区。因为 APFS 里卷(Volume)才是显示在“访达…

实战——OPenPose讲解及代码实现

一些前提 先思考下面几个问题; 1、什么是姿态估计? 参考:Point Detect任务,识别人体指定部分的关键点; 2、姿态估计中的难点是什么? 从干扰的角度,人体被遮挡对检测的影响很大;…

【枚举倍数+容斥】CF803 F

Problem - F - Codeforces 题意: 思路: 正难则反,考虑容斥 即考虑gcd ! 1的所有子序列个数 因为子序列内部无序,因此不算真正的子序列,考虑枚举倍数 根据经典套路,我们去枚举 gcd,然后去枚…

【枚举gcd】CF803 C

Problem - C - Codeforces 题意: 思路: 要使所有数的 gcd 尽可能大 设 gcd k 那么就是 k1 * k,k2 * k,k3 * k,.... 它们的和是n 那么(k1 k2 k3 ....) * k n 根据惯用套路,我们去枚举 n 的因子即…

Vue3 setup tsx 子组件向父组件传值 emit

需求:Vue3 setup 父组件向子组件传值,子组件接收父组件传入的值;子组件向父组件传值,父组件接收的子组件传递的值。 父组件:parent.tsx: import { defineComponent, ref, reactive } from vue; import To…

使用GUI Guider工具开发嵌入式GUI应用 (3) - 使用label组件

使用GUI Guider工具开发嵌入式GUI应用 (3) - 使用label组件 文章目录 使用GUI Guider工具开发嵌入式GUI应用 (3) - 使用label组件引言在GUI Guider工程中创建label组件编译MCU工程并下载到开发板 引言 本节讲述在GUI Guider中,应用各种UI的基本元素,并顺…