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

news/2024/7/5 10:12:23

【本篇文章的也可参考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:中断测试任务,任务中将调用关中断和开中断函数来体现对中断的管理作用
    在这里插入图片描述

http://lihuaxi.xjx100.cn/news/1436053.html

相关文章

新华三超融合态势感知标准版

产品概述&#xff1a; H3C SecCenter CSAP-XS 超融合态势感知一体机产品集合了态势感知和安全流量分析探针设备能无需复杂配置&#xff1b;态势感知平台具备强大的安全分析和可视化呈现功能&#xff1b;同时具备远程专家会诊功能&#xff0c;通过云端协同实现外部安全服务资源的…

1323:【例6.5】活动选择

【题目描述】 学校在最近几天有nn个活动&#xff0c;这些活动都需要使用学校的大礼堂&#xff0c;在同一时间&#xff0c;礼堂只能被一个活动使用。由于有些活动时间上有冲突&#xff0c;学校办公室人员只好让一些活动放弃使用礼堂而使用其他教室。 现在给出nn个活动使用礼堂的…

el-table :span-method=“arraySpanMethod“ 合并单元格 vue3

垂直方向上合并单元格 // 具体使用data就是接口获取的值表格数据 state.rowMergeArrs rowMergeHandle(state.needMergeArr, data) ); // :span-method"arraySpanMethod"const state reactive({needMergeArr: [{colName: "riskAreaId",mergeCheckNames…

kubernetes的存储卷使用

目录 一、为什么使用存储卷 二、emptyDir存储卷 1.概念 2.创建Pod emptyDir 3. 验证emptyDir存储卷 三、hostPath存储卷 1.概念 2.创建Pod hostPath 3.验证hostPath存储卷 三、nfs共享存储卷 1.概念 2.安装nfs&#xff0c;配置nfs服务 3.创建Pod 4.验证nfs存储卷 一、…

[QT编程系列-42]: QT定时器

目录 第1章 QT下的定时器 1.1 主要的对象 1.2 QTTimer定时的特点 1.3 QT高精度定时器QElapsedTimer: 计时 第2章 Windows操作系统下的高性能定时器 2.1 时钟分辨率 2.2 两种来实现高性能定时器&#xff1a; 2.3 timeSetEvent用法 第3章 timeSetEvent和QTimer比较 3.1…

Leetcode.2789 合并后数组中的最大元素

题目链接 Leetcode.2789 合并后数组中的最大元素 rating : 1485 题目描述 给你一个下标从 0 0 0 开始、由正整数组成的数组 n u m s nums nums 。 你可以在数组上执行下述操作 任意 次&#xff1a; 选中一个同时满足 0 ≤ i < n u m s . l e n g t h − 1 0 \leq i &l…

SAP AIF-Application Interface Framework基本介绍

AIF-Application Interface Framework基本介绍 SAP AIF-应用程序接口框架特性&#xff1a; 通知业务用户出错的自动警报&#xff1b; 用户友好的事务&#xff0c;用于界面监控、错误处理和直接从应用系统内纠正错误&#xff1b; SAP GUI 和基于 Web 的用户界面&#xff1b; 使…

flutter开发实战-MethodChannel实现flutter与iOS双向通信

flutter开发实战-MethodChannel实现flutter与iOS双向通信 最近开发中需要iOS与flutter实现通信&#xff0c;这里使用的MethodChannel 如果需要flutter与Android实现双向通信&#xff0c;请看 https://blog.csdn.net/gloryFlow/article/details/132218837 这部分与https://bl…