zoukankan      html  css  js  c++  java
  • FreeRTOS 中断配置和临界段

    中断屏蔽寄存器
    PRIMASK、FAULTMASK和BASEPRI

    1.PRIMASK:这是个只有1个位的寄存器。当它置1时, 就关掉所有可屏蔽的异常,只剩下 NMI和硬fault可以响应。它的缺省值是0,表示没有关中断
    2.FAULTMASK:这是个只有1个位的寄存器。当它置1时,只有NMI才能响应,所有其它的异常,包括中断和fault,通通闭嘴。它的缺省值也是0,表示没有关异常
    3.BASEPRI:这个寄存器最多有9位(由表达优先级的位数决定)。它定义了被屏蔽优先级的阈值。当它被设成某个值后,所有优先级号大于等于此值的中断都被关闭(优先级号越大,优先级越低)。但若被设成0,则不关闭任何中断,0也是缺省值

    法一:CM3 还专门设置了一条CPS指令

    CPSID I ;PRIMASK=1 ;关中断
    CPSIE I ;PRIMASK=0 ;开中断
    CPSID F ;FAULTMASK=1 ;关异常
    CPSIE F ;FAULTMASK=0 ;开异常

    法二:使用MRS/MSR指令

    MRS R0, BASEPRI   ;读取 BASEPRI 到 R0 中
    MRS R0, FAULTMASK ;似上
    MRS R0, PRIMASK   ;似上
    
    MOVS R0, #1
    MSR BASEPRI,   R0 ;写入 R0 到 BASEPRI 中
    MSR FAULTMASK, R0 ;似上
    MSR PRIMASK,   R0 ;似上

    临界段代码
    临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段,比如有的外设的初始化需要严格的时序,初始化过程中不能被打断

    //进入临界段
    #define taskENTER_CRITICAL()        portENTER_CRITICAL() //任务级临界段代码保护
    #define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR()
    
    //退出临界段
    #define taskEXIT_CRITICAL()         portEXIT_CRITICAL() //中断级临界段代码保护
    #define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x )
    #define portENTER_CRITICAL()        vPortEnterCritical();
    #define portEXIT_CRITICAL()         vPortExitCritical();
    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 );
        }
    }
    
    void vPortExitCritical( void )
    {
        configASSERT( uxCriticalNesting );
        uxCriticalNesting--;
        if( uxCriticalNesting == 0 )
        {
            portENABLE_INTERRUPTS();
        }
    }
  • 相关阅读:
    glib 库 hash table 使用
    git 使用
    centos6.5 下安装 sqlplus
    Oracle tns 协议
    unix环境高级编程附录 B 通用代码
    centos6.5安装gtk开发环境
    linux 下定位程序假死
    Kotlin与Android SDK 集成(KAD 05)
    Kotlin的android扩展:对findViewById说再见(KAD 04)
    Kotlin类:功能更强、而更简洁(KAD 03)
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709535.html
Copyright © 2011-2022 走看看