临界段
临界段就是一段在执行的时候不能被中断的代码段。在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 是一个在

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

最低0.47元/天 解锁文章
544

被折叠的 条评论
为什么被折叠?



