FreeRTOS学习笔记-基于stm32(3)中断管理
一、什么是中断
�� 通俗点讲就是让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