zoukankan      html  css  js  c++  java
  • FreeRTOS临界保护

    下面的是个人笔记,所有的话都适用于我本人理解,可能存在不对的地方。

    进入临界保护(支持嵌套):taskENTER_CRITICAL();
    退出临界保护(支持嵌套):taskEXIT_CRITICAL();
     
    中断里进入临界保护(支持嵌套):  taskENTER_CRITICAL_FROM_ISR();
    中断里退出临界保护(支持嵌套):   taskEXIT_CRITICAL_FROM_ISR( x );
     
    进入临界保护的定义代码:
    从中可以看出,uxCriticalNesting++,正因为该变量的处理,才支持了嵌套。
    退出临界保护的定义代码大同小异。

    void vPortEnterCritical( void )
    {
        portDISABLE_INTERRUPTS();
        uxCriticalNesting++;
     
        /* This is not the interrupt safe version of the enter critical function so
        assert() if it is being called from an interrupt context.  Only API
        functions that end in "FromISR" can be used in an interrupt.  Only assert if
        the critical nesting count is 1 to protect against recursive calls if the
        assert function also uses a critical section. */
        if( uxCriticalNesting == 1 )
        {
            configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
        }
    }

     
    继续深入,可以看到,实际上是操作了 basepri寄存器来实现开关中断的机理,而要关闭的中断是哪些优先级的中断,则是由 configMAX_SYSCALL_INTERRUPT_PRIORITY所决定。
    configMAX_SYSCALL_INTERRUPT_PRIORITY = configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << 4,所有小于该优先级的中断都会被关断。

    static portFORCE_INLINE void vPortRaiseBASEPRI( void )
    {
    uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;
     
        __asm
        {
            /* Set BASEPRI to the max syscall priority to effect a critical
            section. */
            msr basepri, ulNewBASEPRI
            dsb
            isb
        }
    }

     
    在裸机中,开关中断是下面两个语句:
    使能全局中断: __set_PRIMASK(0);
    禁止全局中断: __set_PRIMASK(1);
     
    要注意,因为 FreeRTOS 存在不受其控制的更高优先级中断,用户需要根据实际情况进行特别处理,可以不采用 FreeRTOS 的开关中断函数,而是直接使用__set_PRIMASK 实现全局中断的开关。
     
    还要注意一点:使用临界保护时,在调度器没开始工作时,使用无效。有效的使用是在调度器开始工作后的任务里选择使用的。
  • 相关阅读:
    Xamarin Andro教程搭建Xamarin Androidid开发环境(一)
    判断密文加密类型hash-identifier
    Xamarin Android教程如何使用Xamarin开发Android应用
    分享Kali Linux 2016.2第48周虚拟机
    Xamarin Android教程Android基本知识版本介绍与系统介绍
    iOS10 UI教程视图的生命周期
    iOS10 UI教程视图的绘制与视图控制器和视图
    卡尔曼滤波的原理说明
    Bresenham算法
    Stm32 Bootloader整理
  • 原文地址:https://www.cnblogs.com/KeeganLu/p/11492933.html
Copyright © 2011-2022 走看看