四、FreeRTOS中断管理
中断的概念不再过多叙述,学习过逻辑的都知道
中断的执行过程
- 中断请求 外设产生中断请求(GPIO外部中断、定时器中断等)
- 响应中断 CPU停止执行当前程序,转而去执行中断处理程序(ISR)
- 退出中断 执行完毕,返回被打断的程序处,继续往下执行
中断的优先级分组
ARM Cortex-M 使用了 8 位宽的寄存器来配置中断的优先等级
stm32只用了中断优先级配置寄存器的高4位 [7 : 4],四位最多16级中断优先级
- STM32 的中断优先级可以分为抢占优先级和子优先级
- 分为两类优先级
- 抢占优先级: 抢占优先级高的中断可以打断正在执行但抢占优先级低的中断
- 子优先级:当同时发生具有相同抢占优先级的两个中断时,子优先级数值小的优先执行
- 中断优先级数值越小越优先
设置中断优先级分组
共4位所以只有这5种分组方式
- 在Hal库中通过调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)即可完成设置
- HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)在在HAL_Init()调用
中断优先级分组特点
- 只有低于configMAX_SYSCALL_INTERRUPT_PRIORITY优先级的中断里才允许调用FreeRTOS 的API函数
- 建议将所有优先级位指定为抢占优先级位,方便FreeRTOS管理(调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)
- 中断优先级数值越小越优先,任务优先级数值越大越优先
中断相关的寄存器
- SHPR1寄存器地址:0xE000ED18
- SHPR2寄存器地址:0xE000ED1C
- SHPR3寄存器地址:0xE000ED20
FreeRTOS配置PendSV和Systick中断优先级
中断屏蔽寄存器
- FreeRTOS所使用的中断管理就是利用的BASEPRI这个寄存器
- BASEPRI:屏蔽优先级低于某一个阈值的中断
- BASEPRI设置为0x50,代表中断优先级在515内的均被屏蔽,04的中断优先级正常执行
- BASEPRI屏蔽优先级低于某一个阈值的中断,当设置为0时,则不关闭任何中断
- 中断优先级在5 ~ 15的全部被关闭
当BASEPRI设置为0x50时:
在中断服务函数中调度FreeRTOS的API函数需注意:
- 中断服务函数的优先级需在FreeRTOS所管理的范围内
- 在中断服务函数里边需调用FreeRTOS的API函数,必须使用带“FromISR”后缀的函数
*设置为0x50,代表中断优先级在515内的均被屏蔽,04的中断优先级正常执行
- BASEPRI屏蔽优先级低于某一个阈值的中断,当设置为0时,则不关闭任何中断
[外链图片转存中…(img-3Bq4NEAv-1698820880665)]
- 中断优先级在5 ~ 15的全部被关闭
当BASEPRI设置为0x50时:
[外链图片转存中…(img-h5ZWihIx-1698820880665)]
在中断服务函数中调度FreeRTOS的API函数需注意:
- 中断服务函数的优先级需在FreeRTOS所管理的范围内
- 在中断服务函数里边需调用FreeRTOS的API函数,必须使用带“FromISR”后缀的函数