跟着野火从零开始手搓FreeRTOS(4)临界段的概念及应用

本文详细解释了在FreeRTOS中如何使用CPS指令管理和控制中断,以保护临界段,包括关中断、开中断函数,以及进入和退出临界段的宏及其嵌套处理。特别强调了中断保护版本和非保护版本的区别。

临界段

        临界段就是一段在执行的时候不能被中断的代码段。在FreeRTOS最常用的情况是对全局变量的操作。

        基本上只有和系统调度,外部中断能打断临界段。在FreeRTOS中,系统调度也就是 PendSV 中断,所以对临界段的保护还是在于对中断的开和关的控制。中断被关闭之后,临界段就无法响应中断,从而做到保护临界段。

        Cortex-M 内核专门设置了一条 CPS 指令来实现快速开关中断,PRIMASK 和 FAULTMAST 是 Cortex-M 内核 里面三个中断屏蔽寄存器中的两个,还有一个是 BASEPRI。用法如下。

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

         通过对这三个寄存器的操作,使内核能够实现中断的开关。

关中断

        关中断的函数在 portmacro.h 中定义, 分不带返回值和带返回值两种。

        下面是不带返回值的。

/* 不带返回值的关中断函数 */
#define portDISABLE_INTERRUPTS()				vPortRaiseBASEPRI()

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    //值为11,大于11的一律不能响应
		dsb
		isb
	}
}

        因为不带返回值,即返回值为空,因此不能嵌套。

        configMAX_SYSCALL_INTERRUPT_PRIORITY 是一个在

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pQAQqa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值