FreeRTOS之临界段保护

这一章主要是介绍临界段相关的知识,在项目中port.c文件添加中断相关代码。
说明一下:参考了这本书《FreeRTOS 内核实现与应用开发实战—基于STM32》

1、 预备知识
问1、什么是临界段
答:临界段用一句话概括就是一段在执行的时候不能被中断的代码段。

问2、Cortex-M内核快速关中断指令
答:
①在ucos快速地开关中断是如下操作

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

②在FreeRTOS快速地开关中断是通过操作BASEPRI寄存器

③Cortex-M 内核中断屏蔽寄存器组描述

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

2、 在port.c文件下添加如下代码。


/* 不带返回值,进入临界段时不能中断嵌套*/
__forceinline void vPortSetBASEPRI( uint32_t ulBASEPRI )
{
    __asm
    {
        msr basepri, ulBASEPRI
    }
}
/*-----------------------------------------------------------*/
/* 不带返回值,不能中断嵌套,默认设置为11 */ 
__forceinline void vPortRaiseBASEPRI( void )
{
    uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;

    __asm
    {
        msr basepri, ulNewBASEPRI /* 小于11的中断有效*/
        dsb
        isb
    }
}

/*-----------------------------------------------------------*/
 /* 带返回值,可以中断嵌套 */
__forceinline uint32_t ulPortRaiseBASEPRI( void ) 
{
    uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;

    __asm
    {
        mrs ulReturn, basepri
        msr basepri, ulNewBASEPRI
        dsb
        isb
    }

    return ulReturn;
}

3、 临界段代码应用
3.1、 在中断场合,临界段可以嵌套

{   
    uint32_t ulReturn;
    /* 进入临界段,临界段可以嵌套 */
    ulReturn = ulPortRaiseBASEPRI();
    /* 临界段代码 */
    /* 退出临界段 */
    vPortSetBASEPRI( ulReturn );
}

3.2、 在非中断场合,临界段不能嵌套

{   
    /* 进入临界段 */
    vPortRaiseBASEPRI();
    /* 临界段代码 */
    /* 退出临界段*/
    vPortSetBASEPRI(0);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值