FreeRTOS学习笔记-基于stm32(3)中断管理

小明 2025-05-07 09:59:31 16

一、什么是中断

��       通俗点讲就是让CPU停止当前在做的事,转而去做更紧急的事。

二、中断优先级分组

        这个紧急的事也有一个等级之分,优先级越高越先执行。stm32使用中断优先配置寄存器的高4位,共16级的中断优先等级。

        stm32的中断优先等级可以分为抢占优先级和子优先级。抢占优先级高的中断可以打断正在执行的抢占优先级低的中断;当抢占优先级相同时,子优先级高的优先执行。

eg:抢占优先级2,子优先级1的中断可以打断抢占优先级3,子优先级0的中断;但抢占优先级2,子优先级1的中断不能打断抢占优先级2,子优先级2的中断;虽然前者子优先级高于后者,但子优先级不能打断其他中断。

三、特征

        1、低于configMAX_SYSCALL_INTERRUPT_PRIORITY(一般默认设置为5)优先级的中断才允许调用FreeRTOS的API函数(带有“FromISR后缀的函数”);

        2、将所有优先级位指定为抢占优先级位,方便管理;

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4	 

        3、中断优先级越小越优先,任务优先级越大越优先;

四、FreeRTOS中断相关寄存器

        FreeRTOS 中,通过 SHPR3 寄存器,将 PendSV 和 Systick 中断优先级被设置为最低,因为要保证系统任务的切换不会阻塞系统其他中断的响应。

1、FreeRTOS关闭中断:

        FreeRTOS 中,通过 BASEPRI 寄存器,屏蔽优先级低于某一阈值的中断。

eg:BASEPRI 寄存器设置为0x50,表示中断优先级在5~15内的均被屏蔽,0~4的正常执行。(因为中断寄存器使用的是8位寄存器的高4位)也就是关闭FreeRTOS的中断  。

portDISABLE_INTERRUPTS();       //关闭中断

         经过此函数的一层层回调,会发现最终此函数还是对寄存器 basepri 写入0x50来关闭中断;

#define portDISABLE_INTERRUPTS()				vPortRaiseBASEPRI()
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY			15                      //中断最低优先级
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY	5                       //系统可管理的最高中断优先级
#define configKERNEL_INTERRUPT_PRIORITY 		( configLIBRARY_LOWEST_INTERRUPT_PRIORITY 
The End
微信