再学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.优先级规则:中断优先级数值越小优先级越高,任务优先级数值越大优先级越高。