当前位置: 首页 > news >正文

再学FreeRTOS---(中断管理)

目录

一.什么是中断?

二.ARMCortex-M中断优先级设置

三.FreeRTOS中断管理中的关键寄存器

1.PRIMASK:全局屏蔽所有中断。

2.FAULTMASK:屏蔽除故障以外的所有中断。

3.BASEPRI:只屏蔽优先级低于某一设定值的中断。

四.中断优先级分组

注意事项


在嵌入式实时操作系统FreeRTOS中,中断管理是一项重要功能,它能让CPU在特定事件发生时打断当前任务,立即转向处理紧急任务。本篇博客将介绍FreeRTOS的中断管理机制,并通过示例展示如何在FreeRTOS中使用中断。

一.什么是中断?

中断是一种允许CPU在执行过程中暂停当前任务并立即处理突发事件的机制。其执行流程可以分为以下三个步骤:

1.中断请求:由外设或事件(如GPIO外部中断、定时器中断等)发起中断请求。
2.响应中断:CPU停止当前程序,转去执行相应的中断服务程序(ISR)。
3.退出中断:中断服务程序执行完毕,CPU返回被打断的程序继续执行。

二.ARMCortex-M中断优先级设置

ARMCortex-M处理器使用8位宽的寄存器来配置中断的优先级,范围为0~255。对于STM32来说,优先级配置只使用高4位(即[7:4]位),因此支持16个优先等级。

STM32的中断优先级划分为两类:

-抢占优先级:优先级高的中断可以打断优先级低的中断。
-子优先级:当两个相同抢占优先级的中断同时触发时,子优先级低的会优先执行。

在ARMCortex-M中,有三个系统中断优先级配置寄存器:SHPR1、SHPR2和SHPR3。其中,SHPR3常用于将PendSV和SysTick的优先级设置为最低,以确保任务切换时不阻塞其他中断的响应。

三.FreeRTOS中断管理中的关键寄存器

在ARMCortexM架构中,FreeRTOS使用了三个关键的中断屏蔽寄存器来管理不同优先级的中断。这些寄存器分别是PRIMASK、FAULTMASK和BASEPRI,每个寄存器的功能如下:

1.PRIMASK:全局屏蔽所有中断。


PRIMASK寄存器用于全局屏蔽所有可屏蔽中断(除非故障中断外),包括正常任务和大部分中断。
当PRIMASK设置为1时,所有可屏蔽中断都会被屏蔽,只有不可屏蔽中断(如NMI)和一些特定的故障中断仍然可以触发。
这个寄存器常用于需要临时阻止所有中断的情境,比如在系统进入关键区域或执行一些敏感操作时。

2.FAULTMASK:屏蔽除故障以外的所有中断。


FAULTMASK寄存器用于屏蔽所有故障以外的中断。
当FAULTMASK设置为1时,除了硬件故障中断(如硬故障)外,其他所有中断都被屏蔽。
该寄存器通常用于处理异常或故障时的特殊保护,以确保CPU可以优先处理严重的硬件故障,不受其他中断干扰。

3.BASEPRI:只屏蔽优先级低于某一设定值的中断。


BASEPRI寄存器可以动态屏蔽优先级低于某一特定阈值的中断。
通过设置BASEPRI的值,可以指定屏蔽某一优先级及以下的中断。例如,如果BASEPRI被设置为0x50,则优先级5及以下的中断会被屏蔽,而优先级高于5的中断仍然可以触发。
BASEPRI寄存器为FreeRTOS提供了较为灵活的中断管理方式,因为它允许系统在不完全关闭中断的情况下屏蔽低优先级中断,确保高优先级任务和中断可以及时响应。

这三个寄存器各司其职,共同帮助FreeRTOS实现对中断的高效管理。在实时系统中,根据不同的应用需求合理使用这些寄存器,可以显著提升系统的稳定性和实时响应能力。
 

在FreeRTOS中,中断管理主要依靠BASEPRI寄存器。比如,当BASEPRI设置为0x50时,表示屏蔽优先级5~15的中断,而优先级0~4的中断仍然能够正常执行。

四.中断优先级分组

在FreeRTOS中,中断优先级可以通过不同的分组方式来配置抢占和子优先级。STM32支持五种分组方式,具体如下:

-NVIC_PriorityGroup_0:0位用于抢占优先级,4位用于子优先级
-NVIC_PriorityGroup_1:1位用于抢占优先级,3位用于子优先级
-NVIC_PriorityGroup_2:2位用于抢占优先级,2位用于子优先级
-NVIC_PriorityGroup_3:3位用于抢占优先级,1位用于子优先级
-NVIC_PriorityGroup_4:4位用于抢占优先级,0位用于子优先级

注意事项

1.API调用限制:在中断优先级低于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断中才允许调用FreeRTOSAPI函数。
2.建议:将所有优先级位都指定为抢占优先级位,以便FreeRTOS能更好地管理中断。
3.优先级规则:中断优先级数值越小优先级越高,任务优先级数值越大优先级越高。

 

 


http://www.mrgr.cn/news/64527.html

相关文章:

  • GitHub | 发布到GitHub仓库并联文件夹的方式
  • 嵌入式linux跨平台基于mongoose的TCP C++类的源码
  • 什么是人工智能学习框架?——人工智能技术科普指南
  • Python 类和对象
  • 【Web前端】JavaScript 对象原型与继承机制
  • 使用PostgreSQL进行高效数据管理
  • 智能指针、移动语义、完美转发、lambda
  • 数字信号处理Python示例(3)生成三相正弦信号
  • 鸿蒙开发案例:分贝仪
  • Android中的Handle底层原理
  • 如何设置和使用低代码平台中的点击事件?
  • redis源码系列--(二)--eventlooop+set流程
  • 常用滤波算法(三)-算术平均滤波法
  • 【51蛋骗鸡单按键控制计数开始暂停复位】
  • 【ChatGPT】通过自定义参数让ChatGPT输出特定格式的文本
  • 同一局域网内A主机连接B主机的虚拟机中的服务
  • C++入门基础知识135—【关于C 库函数 - mktime()】
  • C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(1)
  • 非线性数据结构之树
  • 【Vue3】一文全览基础语法-案例程序及配图版
  • 【C++题解】1970. 判断是什么字符
  • DICOM标准:CT 模块及其在DICOM中的表示详解
  • 【星闪EBM-H63开发板】AT固件的接口简介
  • C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(2)
  • 文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《基于图注意力网络的配电网分布式光伏实时消纳能力评估方法 》
  • 高级 <HarmonyOS第一课>自由流转 的课后习题