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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1、Java简介+DOS命令+编译运行+一个简单的Java程序

Java类型&#xff1a; JavaSE 标准版&#xff1a;以前称为J2SE JavaEE 企业版&#xff1a;包括技术有&#xff1a;Servlet、Jsp&#xff0c;以前称为J2EE JavaME 微型版&#xff1a;以前称为J2ME Java应用&#xff1a; Android平台应用。 大数据平台开发&#xff1a;Hadoo…

PyTorch深度学习环境安装(Anaconda、CUDA、cuDNN)及关联PyCharm

1. 关系讲解 Tytorch&#xff1a;Python机器学习库&#xff0c;基于Torch&#xff0c;用于自然语言处理等应用程序 Anaconda&#xff1a;是默认的python包和环境管理工具&#xff0c;安装了anaconda&#xff0c;就默认安装了conda CUDA&#xff1a;CUDA是一种由显卡厂商NVIDI…

采用pycharm在虚拟环境使用pyinstaller打包python程序

一年多以前&#xff0c;我写过一篇博客描述了如何虚拟环境打包&#xff0c;这一次有所不同&#xff0c;直接用IDE pycharm构成虚拟环境并运行pyinstaller打包 之前的博文&#xff1a; 虚拟环境venu使用pyinstaller打包python程序_伊玛目的门徒的博客-CSDN博客 第一步&#xf…

Chrome浏览器导出插件并安装到其他电脑浏览器上的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

绽放趋势:Python折线图数据可视化艺术

文章目录 一 json数据格式1.1 json数据格式认识1.2 Python数据和Json数据的相互转换 二 pyecharts模块2.1 pyecharts概述2.2 pyecharts模块安装 三 pyecharts快速入门3.1 基础折线图3.2 pyecharts配置选项3.2.1 全局配置选项 3.4 折线图相关配置3.4.1 .add_yaxis相关配置选项3.…

【2023 华数杯全国大学生数学建模竞赛】 B题 不透明制品最优配色方案设计 39页论文及python代码

【2023 华数杯全国大学生数学建模竞赛】 B题 不透明制品最优配色方案设计 39页论文及python代码 1 题目 B 题 不透明制品最优配色方案设计 日常生活中五彩缤纷的不透明有色制品是由着色剂染色而成。因此&#xff0c;不透明制品的配色对其外观美观度和市场竞争力起着重要作用。…

【maven】通过profiles实现:怎样激活某个仓库、同时加载多个profile、不同环境加载不同依赖jar

文章目录 一. 基本用法二. 仓库激活方式1. 使用activeProfile激活2. 使用-P参数激活3. 使用-P参数不激活 三. 查看激活的仓库四. 不同环境依赖不同版本的jar Maven中的profile是一组可选的配置&#xff0c;可以用来设置或者覆盖配置默认值。有了profile&#xff0c;你就可以为不…

Do not access Object.prototype method ‘hasOwnProperty‘ from target object

调用 hasOwnProperty 报错&#xff1a;不要使用对象原型上的方法&#xff0c;因为原型的方法可能会被重写 if (this.formData.selectFields.hasOwnProperty(selectField)) {delete this.formData.selectFields[selectField];} else {this.formData.selectFields[selectField] …

一文走进时序数据库性能测试工具 TSBS

一、背景 在物联网、车联网等时序数据场景中&#xff0c;数据的高速写入能力至关重要&#xff0c;会对产品方案的可用性、可靠性和扩展性产生影响。 以物联网为例&#xff0c;当面临千万甚至上亿设备、平均每个设备采集几十个到几百个指标时&#xff0c;每秒生成的数据将达到…

简单认识ELK日志分析系统

一. ELK日志分析系统概述 1.ELK 简介 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 好处&#xff1a; &#xff08;1&#xff09;提高安全…

【观察者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

简介 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型模式。它定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 观察者模式使用三个类Subject、Observer和Client。Subject…

Go把Map转成对象

最近使用了Redis的Hash&#xff0c;把一个对象给存储到了hash里面&#xff0c;具体如下&#xff1a; 现在需要从RedisHash缓存里面把结果给取出来&#xff0c;同时赋值到一个对象上面 result, err : global.GVA_REDIS.HGetAll(context.Background(), key).Result() 问题是resul…