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 实现全局中断的开关。
     
    还要注意一点:使用临界保护时,在调度器没开始工作时,使用无效。有效的使用是在调度器开始工作后的任务里选择使用的。
  • 相关阅读:
    IFNULL和isnull用法
    Python 进制转换 二进制 八进制 十进制 十六进制
    xhr是什么文件类型?
    from __future__ import unicode_literals
    sort is deprecated, use sort_values(inplace=True) for INPLACE sorting
    Autodesk View and Data API二次开发学习指南
    设置Mac 中保存对话框默认为扩展窗口
    [大数据学习研究] 错误排查,Hadoop集群部分DataNode不能启动
    IDEA 环境下更改Maven的仓库镜像提高下载速度
    [大数据学习研究] 4. Zookeeper-分布式服务的协同管理神器
  • 原文地址:https://www.cnblogs.com/KeeganLu/p/11492933.html
Copyright © 2011-2022 走看看