FreeRtos实时系统: 四.中断
FreeRtos实时系统: 四.中断
- 一.FreeRtos的中断管理介绍
- 1.什么是中断?
- 2.中断优先级分组设置
- 3.中断相关寄存器
- 4.FreeRTOS如何配置PendSV和Systick中断优先级?
- 二.FreeRtos的中断管理实验
一.FreeRtos的中断管理介绍
1.什么是中断?
让CPU打断正常运行的程序,转而去处理紧急的事件(程序),就叫中断。
2.中断优先级分组设置
ARM Cortex-M使用了8位宽的寄存器来配置中断的优先等级,这个寄存器就是中断优先级配置寄存器但STM32,只用了中断优先级配置寄存器的高4位[7:4],所以STM32提供了最大16级的中断优先等级。
STM32的中断优先级分为抢占优先级和子优先级:
抢占优先级:抢占优先级高的中断可以打断正在执行但抢占优先级低的中断。
子优先级:当同时发生具有相同抢占优先级的两个中断时,子优先级数值小的优先执行。
举例:当两个任务抢占优先级都为2,第一个任务子优先级为1,第二个任务子优先级为0,第一个任务在运行时不会被第二个任务打断,因为抢占优先级相同不会抢占,会等待第一个任务执行完再执行第二个任务。
注意:中断优先级数值越小越优先。
一共有5种分配方式,对应中断优先级分组的5个组:
FreeRtos为了方便管理,采用NVIC_PriorityGroup_4分组,将所有优先级设置为抢占优先级。
通过调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PriorityGroup_4)可以完成配置,在HAL_Init()中可以设置。
特点:
1、低于configMAX_SYSCALL_INTERRUPT_PRIORITY优先级(5)的中断里才允许调用FreeRTOS的API函数(5~15)。
2、建议将所有优先级指定为抢占式优先级为,方便FreeRTOS管理。(调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4))
3、中断优先级数值越小越优先,任务优先级数值越大越优先。
3.中断相关寄存器
三个系统中断优先级配置寄存器,分别为SHPR1、SHPR2、SHPR3
SHPR1寄存器地址:0xE000ED18
SHPR2寄存器地址:0xE000ED1C
SHPR3寄存器地址:0xE000ED20
三个中断屏蔽寄存器,分别为PRIMASK、FAULTMASK、BASEPRI。
PRIMASK:置1关中断,置0开中断。
FAULTMASK:置1关中断,置0开中断。(比PRIMASK彻底)
BASEPRI:优先级号大于或等于设置值中断都关,0不关闭任何中断。
比如:BASEPRI设置为0x50,代表中断优先级在5~15内的都被屏蔽,0到4正常执行。
FreeRTOS所使用的中断管理利用了BASEPRI这个寄存器。
关中断程序示例:
在中断优先级函数中调度FreeRTOS的API函数需注意:
1、中断服务函数的优先级需在FreeRTOS所管理的范围内。
2、在中断服务函数里边需调用FreeRTOS的API函数,需使用带“FromISR”后缀的函数。
开中断程序示例:
FreeRTOS中断管理就是利用BASEPRI寄存器实现的。
4.FreeRTOS如何配置PendSV和Systick中断优先级?
PendSV表示任务切换优先级,SysTick表示时钟优先级,设置优先级为最低可以使中断能打断任务,而任务不会阻塞系统其他中断响应。
二.FreeRtos的中断管理实验
本实验会使用两个定时器,一个优先级为4,一个优先级为6,注意∶系统所管理的优先级范围:5~15,现象:两个定时器每1s,打印一段字符串,当关中断时,停止打印,开中断时持续打印。
btim.c设置两个定时器优先级:
回调函数:
实现功能:
注意此处不能使用vTaskDelay,因为这个函涉及到操作BASEPRI寄存器,会使得关闭的中断开启,故使用delay_ms延时。
main.c函数:
第一个值为arr: 自动重装值,第二个值为psc: 时钟预分频数。因为STM32F1系列芯片主频为72M,先7200分频为1M,之后设置自动重装值为10000,使得定时器一秒中断一次。
串口接收结果: