深入理解FreeRTOS_学习笔记(9.中断管理)

**

文章大部分内容摘抄至B站的韦东山老师的深入了解FreeRTOS操作系统教程,若有不理解的地方,可点击链接学习韦老师的视频。

**

**

我们这一章学习一下FreeRTOS的中断管理机制

**



前言

我们都知道在FreeRTOS中几乎每个函数都有两个api,分别是用在任务之间的和中断之间的,在中断中使用的话,api函数就要加上后缀FromISR。我们这一章主要学习一下FreeRTOS的中断机制。


一、中断是什么

在FreeRTOS中,中断是指由外部设备或内部异常触发的事件,例如定时器到期、UART接收到数据或者硬件故障等。
FreeRTOS使用中断处理程序(ISR)来响应这些事件。当一个中断被触发时,ISR会立即调用,并在其中执行一些处理,例如将收到的数据存入缓冲区、启动一个任务或者清除故障标志。ISR必须很快执行完毕,以避免延迟其他优先级更高的中断响应或任务执行。
为了减少中断占用时间,FreeRTOS提供了基于优先级的中断控制器。通过配置中断的优先级,可以确保高优先级的中断能够立即响应,而低优先级的中断则可以在需要时等待。在FreeRTOS中,只有高优先级的中断能够打断当前正在执行的任务。
最后,需要注意的是,在使用FreeRTOS时,需要特别注意中断与任务之间的同步问题,以避免资源竞争和数据一致性问题。

二、Cortex-M4中断管理

ARM公司在设计M4内核时就配置了255个异常,其中又分为异常和中断。实际上,区分异常和中断比较简单,MCU提出的中断申请叫做异常(系统异常),若是外部端口或者芯片设计商挂载的外设提出的中断申请则成为中断。为了方便管理,ARM固化了部分异常。而芯片设计商根据已有的嵌套中断向量表(NVIC)并结合芯片使用的实际情况对中断进行裁剪后固化嵌套中断向量表(NVIC)。
在这里插入图片描述
通常我们的关中断操作就是关闭中断优先级大于5的中断。具体我们会查看原码。

3.源码分析

我们就从队列的发送函数xQueueGenericSendFromISR入手,进入到里面的源码分析:

    #define portENTER_CRITICAL()                      vPortEnterCritical()
    #define portEXIT_CRITICAL()                       vPortExitCritical()

这两个是我们最经常使用的开关中断的函数,我们点进去看看:

void vPortEnterCritical( void )
{
    portDISABLE_INTERRUPTS();
    uxCriticalNesting++;
    if( uxCriticalNesting == 1 )
    {
        configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
    }
}

可以看到真正关闭中断的函数其实是这个portDISABLE_INTERRUPTS();

#define portDISABLE_INTERRUPTS()                  vPortRaiseBASEPRI()
    static portFORCE_INLINE void vPortRaiseBASEPRI( void )
    {
        uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;
        __asm
        {
            msr basepri, ulNewBASEPRI
            dsb
            isb
        }
    }

发现这是用汇编写的代码,其中有个变量为configMAX_SYSCALL_INTERRUPT_PRIORITY,

#ifdef __NVIC_PRIO_BITS
 #define configPRIO_BITS         __NVIC_PRIO_BITS
#else
 #define configPRIO_BITS         4
#endif
//freertos系统可管理最高优先级5
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
//内核优先级
#define configKERNEL_INTERRUPT_PRIORITY 		( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
//内核最高的优先级
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

看到定义就知道了在freertos中,大于5的中断优先级在关闭中断之后就会被屏蔽掉,不会再触发。换句话说,就是大于5的中断优先级才可以调用freertos的api函数。

总结

FreeRTOS只能在任务内进行屏蔽中断操作,一旦任务产生调度,中断则会被重新打开。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值