FreeRTOS中断管理(03)

什么是中断?

让CPU打断正常运行的程序, 转而去处理紧急的事件 (程序 ) , 就叫中断

中断执行机制, 可简单概括为三步:

1, 中断请求: 外设产生中断请求 (GPIO外部中断、定时器中断等 )
2, 响应中断: CPU停止执行当前程序, 转而去执行中断处理程序 (ISR )
3, 退出中断: 执行完毕, 返回被打断的程序处, 继续往下执行

中断优先级分组设置

ARM Cortex-M 使用了 8 位宽的寄存器来配置中断的优先等级, 这个寄存器就是中断优先级配置寄存器

但STM32, 只用了中断优先级配置寄存器的高4位 [7 : 4], 所以STM32提供了最大16级的中断优先等级
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

STM32 的中断优先级可以分为抢占优先级子优先级

抢占优先级: 抢占优先级高的中断可以打断正在执行但抢占优先级低的中断

子优先级: 当同时发生具有相同抢占优先级的两个中断时, 子优先级数值小的优先执行

注意: 中断优先级数值越小越优先

中断优先级分组设置

一共有 5 种分配方式, 对应着中断优先级分组的 5 个组

优先级分组抢占优先级子优先级优先级配置寄存器高 4 位
NVIC_PriorityGroup_00 级抢占优先级0-15 级子优先级0bit 用于抢占优先级 4bit 用于子优先级
NVIC_PriorityGroup_10-1 级抢占优先级0-7 级子优先级1bit 用于抢占优先级 3bit 用于子优先级
NVIC_PriorityGroup_20-3 级抢占优先级0-3 级子优先级2bit 用于抢占优先级 2bit 用于子优先级
NVIC_PriorityGroup_30-7 级抢占优先级0-1 级子优先级3bit 用于抢占优先级 1bit 用于子优先级
NVIC_PriorityGroup_40-15 级抢占优先级0 级子优先级4bit 用于抢占优先级 0bit 用于子优先级

在HAL_Init中通过调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)即可完成设置

中断优先级分组设置

特点:

  1. 低于configMAX_SYSCALL_INTERRUPT_PRIORITY优先级的中断里才允许调用 FreeRTOS 的API函数
  2. 建议将所有优先级位指定为抢占优先级位, 方便FreeRTOS管理
  3. 中断优先级数值越小越优先, 任务优先级数值越大越优先

在这里插入图片描述

中断相关寄存器

三个系统中断优先级配置寄存器, 分别为 SHPR1. SHPR2. SHPR3

SHPR1寄存器地址: 0xE000ED18

SHPR2寄存器地址: 0xE000ED1C

SHPR3寄存器地址: 0xE000ED20

在这里插入图片描述

PendSV 和 SysTick 设置最低优先级的作用: 保证系统任务切换不会阻塞系统其他中断的响应

三个, 分别为 PRIMASK、 FAULTMASK 和BASEPRI

在这里插入图片描述

FreeRTOS所使用的中断管理就是利用的BASEPRI这个寄存器

BASEPRI: 屏蔽优先级低于某一个阈值的中断

比如: BASEPRI设置为0x50, 代表中断优先级在5~15内的均被屏蔽, 0~4的中断优先级正常执行

BASEPRI寄存器

屏蔽优先级低于某一个阈值的中断, 当设置为0时, 则不关闭任何中断

关中断程序示例:

#define portDISABLE_INTERRUPTS()         vPortRaiseBASEPRI()
static portFORCE_INLINE void vPortRaiseBASEPRI( void )
{
    uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;
    __asm
    {
        msr basepri, ulNewBASEPRI
        dsb
        isb
    }
}
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY     5   /* FreeRTOS可管理的最高中断优先级 */

中断优先级在5 ~ 15的全部被关闭

当BASEPRI设置为0x50时:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
在中断服务函数中调度 FreeRTOS 的API函数需注意:

  1. 中断服务函数的优先级需在 FreeRTOS 所管理的范围内
  2. 在中断服务函数里边需调用 FreeRTOS 的API函数, 必须使用带FromISR后缀的函数

开中断程序示例:

#define portENABLE_INTERRUPTS()         vPortSetBASEPRI( 0 )
static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI )
{
    __asm
    {
        msr basepri, ulBASEPRI
    }
}

FreeRTOS中断管理就是利用BASEPRI寄存器实现的

FreeRTOS是一个实时操作系统,它的中断管理是其核心功能之一。在FreeRTOS中,中断管理主要是围绕中断服务例程(ISR)和任务调度来实现的。以下是一些关于FreeRTOS中断管理的关键概念和特性: 1. 中断服务例程(ISR):在FreeRTOS中,当硬件中断发生时,中断服务例程会被调用。ISR应该尽可能简短和快速地执行,因为在其执行期间,中断通常是被禁用的。在ISR中,通常只做必要的硬件状态的保存和恢复,以及设置一个任务通知或信号量等,来通知一个或多个任务中断已经发生。 2. 任务通知:ISR通过FreeRTOS提供的API(例如xSemaphoreGiveFromISR(), xQueueSendFromISR())来通知任务。这些函数允许ISR将事件传递给任务,而不需要任务处于阻塞状态。 3. 中断优先级和FreeRTOS优先级:FreeRTOS可以运行在具有多种中断优先级的硬件上。通常,FreeRTOS会为自己的任务分配高于或等于最低硬件中断优先级的优先级,以确保中断不会被低优先级的任务阻塞。 4. 响应中断:当中断发生时,FreeRTOS的任务调度器会根据当前的中断处理和系统状态来决定是否进行任务切换。如果有必要,调度器会在ISR完成后切换到适当的高优先级任务。 5. 中断和上下文切换:FreeRTOS的上下文切换是由中断触发的,特别是由系统时钟中断触发,它允许调度器周期性地检查是否有更高优先级的任务准备运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值