【学习FreeRTOS】第6章——FreeRTOS中断管理

【本篇文章的也可参考STM32中断文章http://t.csdn.cn/foF9I,结合着学习效果更好】

1.什么是中断

中断:让CPU打断正常运行的程序,转而去处理紧急的事件(程序),就叫中断中断执行机制,可简单概括为三步:

  • 中断请求:外设产生中断请求(GPIO外部中断、定时器中断等)
  • 响应中断:CPU停止执行当前程序,转而去执行中断处理程序(ISR)
  • 退出中断:执行完毕,返回被打断的程序处,继续往下执行
    在这里插入图片描述

2.中断优先级分组设置

ARM Cortex-M 使用了8 位宽的寄存器来配置中断的优先等级,这个寄存器就是中断优先级配置寄存器,但STM32只用了中断优先级配置寄存器的高4位 [7 : 4],所以STM32提供了最大16级的中断优先等级,STM32 的中断优先级可以分为抢占优先级和子优先级。

  • 抢占优先级: 抢占优先级高的中断可以打断正在执行但抢占优先级低的中断
  • 响应优先级:当同时发生具有相同抢占优先级的两个中断时,子优先级数值小的优先执行
    【注意:中断优先级数值越小越优先】
    在这里插入图片描述

中断优先级分组一共有 5 种分配方式,对应着中断优先级分组的 5 个组,FreeRTOS建议将优先级分组设为4【见链接】,通过调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)即可完成设置(在HAL_Init中设置)

  • 低于configMAX_SYSCALL_INTERRUPT_PRIORITY优先级的中断里才允许调用FreeRTOS 的API函数
  • 建议将所有优先级位指定为抢占优先级位,方便FreeRTOS管理(HAL_NVIC_SetPriorityGrouping)
  • 中断优先级数值越小越优先,任务优先级数值越大越优先
    在这里插入图片描述

3.中断相关寄存器

3.1.系统中断优先级寄存器

三个系统中断优先级配置寄存器,分别为 SHPR1、 SHPR2、 SHPR3
SHPR1寄存器地址:0xE000ED18
SHPR2寄存器地址:0xE000ED1C
SHPR3寄存器地址:0xE000ED20
在这里插入图片描述

PendSV和SysTick设置最低优先级,保证系统任务切换不会阻塞系统其他中断的响应
在这里插入图片描述

  • 图1为设置PendSV和SysTick的语句,对portNVIC_SHPR3_REG进行置位操作。
  • 图2为portNVIC_SHPR3_REG的宏定义,地址指向portNVIC_SHPR3_REG的首地址。
  • 图3为将configKERNEL_INTERRUPT_PRIORITY分别偏移16位和24位,偏移至PendSV和SysTick寄存器所在的位置
  • 图4为configKERNEL_INTERRUPT_PRIORITY的定义,将中断管理的最低级优先级左移4位(STM32只用了中断优先级的高四位),也就是说,PendSV和SysTick的优先级设置为STM32管理的最低中断优先级位(15)

3.2.中断屏蔽寄存器

ARM Cortex-M有三个用于屏蔽中断的寄存器,分别为 PRIMASK、 FAULTMASK 和BASEPRI
在这里插入图片描述

FreeRTOS使用的中断管理就是利用BASEPRI,用于屏蔽优先级低于某一个阈值的中断【当设置为0时,则不关闭任何中断】,举例: BASEPRI设置为0x50,代表中断优先级在5-15内的均被屏蔽,0-4的中断优先级正常执行,如下图所示:
在这里插入图片描述
在中断服务函数中调度FreeRTOS的API函数需注意:

  1. 中断服务函数的优先级需在FreeRTOS所管理的范围内
  2. 在中断服务函数里边需调用FreeRTOS的API函数,必须使用带“FromISR”后缀的函数
  • BASEPRI关中断程序示例—— portDISABLE_INTERRUPTS()(中断优先级在5 ~ 15的全部被关闭)
#define portDISABLE_INTERRUPTS() 						vPortRaiseBASEPRI()
#define configMAX_SYSCALL_INTERRUPT_PRIORITY            ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    5      /* FreeRTOS可管理的最高中断优先级 */ 

static portFORCE_INLINE void vPortRaiseBASEPRI( void ) 
{ 
	uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; 
	__asm 
	{
		msr basepri, ulNewBASEPRI 
		dsb 
		isb
	} 
}
  • BASEPRI开中断程序示例——portENABLE_INTERRUPTS()
#define portENABLE_INTERRUPTS()		 vPortSetBASEPRI( 0 )
static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI ) 
{ 
	__asm
	{
		msr basepri, ulBASEPRI
	} 
}

3.3.中断控制状态寄存器

中断状态状态寄存器(ICSR)的地址为0OxE000ED04,用于设置和清除异常的挂起状态,以及获取当前系统正在执行的异常编号,各比特位的功能描述如下表所示。这个寄存器主要关注VECTACTIVE段[8:0],通过读取VECTACTIVE段就能够判断当前执行的代码是否在中断中。
在这里插入图片描述

4.FreeRTOS中断管理实验

  • 实验目的:学会使用FreeRTOS的中断管理,本实验会使用两个定时器,一个优先级为4(不受控制),一个优先级为6(受控制),系统所管理的优先级范围:5~15
  • 实验现象:两个定时器每1s,打印一段字符串。低优先级定时器关中断时,停止打印,开中断时持续打印。但是高优先级定时器不受影响
  • 实验设计:将设计2个任务:start_task、task1
    start_task:用来创建task1任务
    task1:中断测试任务,任务中将调用关中断和开中断函数来体现对中断的管理作用
    在这里插入图片描述

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

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

相关文章

【Flutter】【基础】CustomPaint 绘画功能(一)

功能&#xff1a;CustomPaint 相当于在一个画布上面画画&#xff0c;可以自己绘制不同的颜色形状等 在各种widget 或者是插件不能满足到需求的时候&#xff0c;可以自己定义一些形状 使用实例和代码&#xff1a; CustomPaint&#xff1a; 能使你绘制的东西显示在你的ui 上面&a…

新版PMP考试中,敏捷是怎么考的?

01新版考试中的敏捷是怎么考的&#xff1f; 接下来说一下大家最为关注的敏捷内容。这次改版后&#xff0c;题目中添加了大量的敏捷题型&#xff0c;总体比重还是很高的&#xff0c;主观感觉达到了1/3。但和ACP认证相比&#xff0c;PMP中对敏捷管理技术的考察相对来说比较简单&…

Canal+Kafka实现Mysql数据同步

Canal介绍 canal [kənl]&#xff0c;译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费 canal可以用来监控数据库数据的变化&#xff0c;从而获得新增数据&#xff0c;或者修改的数据。 canal是应阿里巴巴存在杭…

【笔记】树状数组

【笔记】树状数组 目录 简介引入1. 直接暴力2. 维护前缀和数组总结 定义前置知识&#xff1a; lowbit ⁡ \operatorname{lowbit} lowbit 操作区间的表示方法操作单点修改前缀和查询任意区间查询 例题1: 单点修改&#xff0c;区间查询例题2: 区间修改&#xff0c;单点查询例题3:…

Maven 生成(打包)带有依赖的可以直接执行的一个 jar 包

在pom中增加如下内容 <build><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><archive><manifest><mainClass>com.example.xxx.YourClass</mainClass></manifest></…

Android系统组件——AMS,App启动中的AMS流程

AMS&#xff08;Activity Manager Service&#xff09;是Android系统中非常重要的一个组件&#xff0c;负责管理应用程序的生命周期、进程调度以及任务栈的管理等任务。本文将从AMS的原理、数据结构、SystemServer加载AMS以及App启动中的AMS流程等方面进行详细介绍&#xff0c;…

Linux固件子系统的实现机制简介

一、Linux固件子系统概述 固件是硬件设备自身执行的一段程序。固件一般存放在设备flash内。而出于成本和便利性的考虑&#xff0c;通常是先将硬件设备的运行程序打包为一个特定格式的固件文件&#xff0c;存储到终端系统内&#xff0c;通过终端系统给硬件设备进行升级。Linux内…

C#使用EmguCV播放视频

目录 一、前言 1、简介 2、测试工程代码下载链接 3、EmguCV 库文件下载链接 二、工程环境配置 1、EmguCV控件添加引用 &#xff08;1&#xff09;窗口控件添加 &#xff08;2&#xff09;相关Dll文件添加添加引用 &#xff08;3&#xff09;工程运行基础文件夹添加 &a…

【Spring】(四)Bean 的作用域和生命周期

文章目录 前言一、Bean 的作用域1.1 被修改的 Bean 案例1.2 作用域的定义1.3 Bean 的六种作用域1.4 Bean 作用域的设置 二、Spring 的执行流程 和 Bean 的生命周期2.1 Spring 的执行流程2.2 Bean 的生命周期2.3 Bean 生命周期的演示 前言 Bean 是 Spring 框架中的一个核心概念…

从支付或退款之回调处理的设计,看一看抽象类的使用场景

一、背景 抽象类&#xff0c;包含抽象方法和实例方法&#xff0c;抽象方法待继承类去实例化&#xff0c;正是利用该特性&#xff0c;以满足不同支付渠道的差异化需求。 我们在做多渠道支付的时候&#xff0c;接收支付或退款的回调报文&#xff0c;然后去处理。这就意味着&…

JVM运行时五大数据区域详解

前言&#xff1a; java虚拟机再执行Java程序的时候把它所拥有的内存区域划分了若干个数据区域。这些区域有着不同的功能&#xff0c;各司其职。这些区域不但功能不同&#xff0c;创建、销毁时间也不同。有些区域为线程私有&#xff0c;如&#xff1a;每个线程都有自己的程序计数…

kubernetes基于helm部署gitlab

kubernetes基于helm部署gitlab 这篇博文介绍如何在 Kubernetes 中使用helm部署 GitLab。 先决条件 已运行的 Kubernetes 集群负载均衡器&#xff0c;为ingress-nginx控制器提供EXTERNAL-IP&#xff0c;本示例使用metallb默认存储类&#xff0c;为gitlab pods提供持久化存储&…

“算法详解”系列第3卷贪心算法和动态规划出版

“算法详解”系列图书共有4卷&#xff0c;目前1到3卷已经出版。最新出版的是第3卷—贪心算法和动态规划。 算法详解 卷3 贪心算法和动态规划 “算法详解”系列图书共有4卷&#xff0c;本书是第3卷—贪心算法和动态规划。其中贪心算法主要包括调度、最小生成树、集群、哈夫曼编…

centos7实现负载均衡

目录 一、基于 CentOS 7 构建 LVS-DR 集群。 1.1 配置lvs负载均衡服务 1.1.1 下载ipvsadm 1.1.2 增加vip 1.1.3 配置ipvsadm 1.2 配置rs1 1.2.1 编写测试页面 1.2.2 手工在RS端绑定VIP、添加路由 1.2.3 抑制arp响应 1.3 配置rs2 1.4 测试 二、配置nginx负载…

Jmeter命令行运行实例讲解

1. 简介 使用非 GUI 模式&#xff0c;即命令行模式运行 JMeter 测试脚本能够大大缩减所需要的系统资 本文介绍windows下以命令行模式运行的方法。 1.1. 命令介绍 jmeter -n -t <testplan filename> -l <listener filename> 示例&#xff1a; jmeter -n -t test…

【数学建模】-- Matlab中图的最短路径

前言&#xff1a; 图的基本概念&#xff1a; 若想简单绘制图可以利用此网站&#xff1a; 左上角Undirected/Directed是无向图/有向图 左边 0-index &#xff0c;1-index为0下标&#xff0c;1下标。 Node Count为节点个数 Graph Data&#xff1a;最初尾节点的名称&#xff…

【什么是应变波齿轮又名谐波驱动?机器人应用的完美齿轮组!?】

什么是应变波齿轮又名谐波驱动&#xff1f;机器人应用的完美齿轮组&#xff01;&#xff1f; 1. 什么是应变波齿轮&#xff1f;2. 工作原理3. 应变波齿轮 – 谐波驱动 3D 模型4. 3D 打印应变波齿轮 – 谐波驱动5. 总结 在本教程中&#xff0c;我们将学习什么是应变波齿轮&#…

第五次作业 运维高级 构建 LVS-DR 集群和配置nginx负载均衡

1、基于 CentOS 7 构建 LVS-DR 群集。 LVS-DR模式工作原理 首先&#xff0c;来自客户端计算机CIP的请求被发送到Director的VIP。然后Director使用相同的VIP目的IP地址将请求发送到集群节点或真实服务器。然后&#xff0c;集群某个节点将回复该数据包&#xff0c;并将该数据包…

ResUNet原理与实现

简述 ResNet是一种非常成功的深度卷积神经网络结构&#xff0c;其具有较强的特征表达能力和较浅的网络深度&#xff0c;使得其在图像分类等任务中表现出了出色的性能。因此&#xff0c;将ResNet作为encoder替换U-Net原始结构&#xff0c;可以使U-Net在图像分割任务中获得更好的…

python爬虫实战(1)--爬取新闻数据

想要每天看到新闻数据又不想占用太多时间去整理&#xff0c;萌生自己抓取新闻网站的想法。 1. 准备工作 使用python语言可以快速实现&#xff0c;调用BeautifulSoup包里面的方法 安装BeautifulSoup pip install BeautifulSoup完成以后引入项目 2. 开发 定义请求头&#xf…