06_FreeRTOS临界区代码保护

news2024/9/28 21:29:46

目录

临界段代码保护简介

临界段代码保护函数介绍

任务级临界区函数详解

中断级临界区函数详解


临界段代码保护简介

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

适用场合如:

1.外设:需严格按照时序初始化的外设:IIC、SPI等等

2.系统:系统自身需求

3.用户:用户自身需求

什么时候可以打断当前程序的运行?

中断、任务调度

临界段代码保护函数介绍

FreeRTOS 在进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中断(注意是FreeRTOS管理的中断)

本质上和就是调用中断管理的开关中断那2个函数,只不过多了一个嵌套计数器

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

 

 中断级临界区调用格式示例:

 特点:

1.成对使用

2.支持嵌套

3.尽量保持临界段耗时短

4.强悍:临界区是直接屏蔽了中断,系统任务调度靠中断,ISR也靠中断

任务级临界区函数详解

进入临界区

#define taskENTER_CRITICAL()		portENTER_CRITICAL() //任务级进入临界区
#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR()//中断级进入临界区
#define portENTER_CRITICAL()					vPortEnterCritical()
void vPortEnterCritical( void )
{
	/*关中断(关FreeRTOS管理的中断)*/
	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 );
	}
}

退出临界区

#define taskEXIT_CRITICAL()			portEXIT_CRITICAL()
#define portEXIT_CRITICAL()						vPortExitCritical()
void vPortExitCritical( void )
{
	/*提示语句*/
	configASSERT( uxCriticalNesting );
	/*临界区嵌套变量*/
	uxCriticalNesting--;
	/*变量等于0的时候开中断*/
	if( uxCriticalNesting == 0 )
	{	
		/*开中断*/
		portENABLE_INTERRUPTS();
	}
}

中断级临界区函数详解

进入临界区

#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR()
#define portSET_INTERRUPT_MASK_FROM_ISR()		ulPortRaiseBASEPRI()
static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void )
{
uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;

	__asm
	{
		/* Set BASEPRI to the max syscall priority to effect a critical
		section. */
		/*读取中断屏蔽寄存器*/
		mrs ulReturn, basepri
		/*关中断*/
		msr basepri, ulNewBASEPRI
		dsb
		isb
	}

	return ulReturn;
}

退出临界区

#define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x )
#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x)	vPortSetBASEPRI(x)
static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI )
{
	__asm
	{
		/* Barrier instructions are not used as this function is only used to
		lower the BASEPRI value. */
		/*把进入临界区返回的值,写入到屏蔽寄存器里*/
		msr basepri, ulBASEPRI
	}
}

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

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

相关文章

国家发明专利:基于改进型黏菌优化算法的业务资源分配方法

国家发明专利:基于改进型黏菌优化算法的业务资源分配方法 摘要 本发明公开了一种基于改进型黏菌优化算法的业务资源分配方法,其步骤包括:1将生产任务分成若干个环节,构建有向环状分配网络;2构建工厂参数矩阵并归一化&…

力扣98.验证二叉搜索树

文章目录力扣98.验证二叉搜索树题目描述算法思路代码实现力扣98.验证二叉搜索树 题目描述 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 …

领域驱动设计(DDD)的几种典型架构介绍

我们生活中都听说了DDD,也了解了DDD,那么怎么将一个新项目从头开始按照DDD的过程进行划分与架构设计呢? 一、专业术语 各种服务 IAAS:基础设施服务,Infrastructure-as-a-service PAAS:平台服务&#xff0c…

【Java寒假打卡】JavaWeb-Servlet基础

【Java寒假打卡】JavaWeb-Servlet基础介绍servlet快速入门servlet的执行过程servlet关系视图Servlet实现方式-继承HTTPSERVLETServlet的生命周期线程安全问题servlet的映射方式案例-多路径映射问题-指定名称的方式Servlet的创建时机默认Servlet介绍 servlet是运行在Java服务器…

免费分享一套 SpringBoot + Vue + ElementUI 的人力资源管理系统,挺漂亮的

大家好,我是锋哥,看到一个不错的SpringBoot Vue ElementUI 的人力资源管理系统,分享下哈。 项目介绍 项目背景 人力资源管理是企业运营中必不可少的一环,它关系到企业的前途与发展。尤其对于中小微企业来说,对企业…

积分分离PID控制算法及仿真-1

在普通 PID 控制中引入积分环节的目的,主要是为了消除静差,提高控制精度。但在过程的启动、结束或大幅度增减设定时,短时间内系统输出有很大的偏差,会造成PID运算的积分积累,致使控制量超过执行机构可能允许的最大动作…

Vue项目基础环境搭建完整步骤

使用vue官方脚手架(vue-cli) vue-cli简介 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,是一个官方脚手架,可以帮助我们快速创建vue项目工程目录,目前最新版本4.x。 Vue CLI 致力于将 Vue 生态中的工具基础标准化。它确保了各种构建…

第三天总结 之 商品管理界面的实现 之 模糊查询 与 数据在页面展示

商品管理界面的实现 模糊查询 第一步: 明确 查询时 需要的 条件 即sql语句中 where 后的条件 如 : 根据前端 可以发现 模糊查询可以通过 商品名称 日期 商品类型 来查询 所以在对应的controller层下的GoodsFuzzySelectServlet中首先要获取这三个属性的…

《深入浅出计算机组成原理》学习笔记 Day6

二进制编码1. “逢二进一”2. 字符串的表示参考1. “逢二进一” 把一个二进制数对应到十进制,就是把从右到左的第 N 位,乘上一个2 的 N 次方,然后加起来,就成了一个十进制数。从右到左的位置,是从 0 开始的。 例如&a…

初识C语言:IDE的选择与使用【C语言】

本文是本专栏【C语言】的第一篇文章,也是博主最近半年以来的更新第一篇文章,如果觉得有帮助,可以点赞支持一下!另外本专栏最后会做一篇类似于【python爬虫】专栏最后的那篇整合的文章,把C语言的所有基础知识用一篇文章…

深度学习 GNN图神经网络(三)模型思想及文献分类案例实战

如果你有一定神经网络的知识基础,想学习GNN图神经网络,可以按顺序参考系列文章: 深度学习 GNN图神经网络(一)图的基本知识 深度学习 GNN图神经网络(二)PyTorch Geometric(PyG&#x…

Nginx入门与应用

NginxNginx概述Nginx介绍Nginx下载和安装windowsLinuxNginx目录结构Nginx命令查看版本检查配置文件正确性启动和停止重新加载配置文件Nginx环境变量(Linux)Nginx配置文件结构Nginx具体应用部署静态资源反向代理负载均衡Nginx概述 Nginx介绍 Nginx是一款…

Linux系统——基础IO

要努力,但不要着急,繁花锦簇,硕果累累,都需要过程! 目录 1.文件基础必备概念 2.文件系统调用接口 1.open && close 2.write 3.read 3.文件描述符fd 3.1什么是文件描述符 3.2文件描述符意义 3.3文件描述符的分配…

【C++】map和set的模拟实现

​🌠 作者:阿亮joy. 🎆专栏:《吃透西嘎嘎》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉红黑树的…

一个线程如何处理多个连接?(非阻塞IO)

从BIO到NIO的转变 五种IO模型BIO的缺陷非阻塞非阻塞IO(NIO)非阻塞读非阻塞写非阻塞IO模型php NIO 实现适用场景什么是C10k问题?C10K问题的由来五种IO模型 在《UNIX 网络编程》一书中介绍了五种IO模型: 分别是 BIO,NIO…

无线电基础电路 > RLC阻尼系数计算仿真

随机搭建电路如下图所示&#xff1a; 阻尼系数的希腊字母符号“ ζ ”读作泽塔。 阻尼系数ζ (R/2) * √C/L 1000/2 * √0.00001 1.58 包括三种情况&#xff1a; ζ>1&#xff1a;过阻尼&#xff0c;频响不利落&#xff0c;需要较长时间才能消失。 ζ<1&#xff…

MinIO基本使用(实现上传、下载功能)

MinIO基本使用&#xff08;实现上传、下载功能&#xff09;1.简介2.下载和安装3.启动服务端4.创建User和Bucket4.1 创建User4.1.1 生成accessKey和secretKey4.2 创建Bucket5.在SpringBoot中使用MinIO5.1 引入依赖5.2 配置文件定义5.3 定义实体类5.4 定义业务类5.5 定义测试类5.…

vivado中block design遇到的error总结

Error1.[BD 41-1356] Address block </processing_system7_0/S_AXI_HP0/HP0_DDR_LOWOCM> is not mapped into </axi_vdma_0/Data_MM2S>. Please use Address Editor to either map or exclude it. 修改方法. a、点击Address Editor. b、在Address Editor页面右击失…

【Ajax】了解Ajax与jQuery中的Ajax

一、了解Ajax什么是AjaxAjax 的全称是 Asynchronous Javascript And XML&#xff08;异步 JavaScript 和 XML&#xff09;。通俗的理解&#xff1a;在网页中利用 XMLHttpRequest 对象和服务器进行数据交互的方式&#xff0c;就是Ajax。2. 为什么要学Ajax之前所学的技术&#xf…

使用MQTT fx测试云服务器的 mosquitto 通讯

文章目录一.MQTT.fx介绍二.MQTT.fx安装教程三.使用MQTT.fx测试云服务器的 mosquitto 通讯一.MQTT.fx介绍 MQTT.fx是一款基于Eclipse Paho&#xff0c;使用Java语言编写的MQTT客户端工具。支持通过Topic订阅和发布消息&#xff0c;用来前期和物理云平台调试非常方便。 二.MQTT…