【FreeRTOS学习笔记 】临界段


结论:
用户能关的中断有限制,这个值在 FreeRTOSConfig_user.h 设置;
用户退出临界区时,得等所有用户都退出了临界区,才会开中断;

系统能关所有中断,这个值可以在使用的时候设置;
系统开关中断都不会影响FreeRTOS的软件实现的中断嵌套计数器

代码,注释为对应效果:

/* 声明进入临界段 */
/* 
	basepri == configMAX_SYSCALL_INTERRUPT_PRIORITY
	uxCriticalNesting ++
	断言 if uxCriticalNesting == 1 && SCB_ICSR 的低 8 位不等于 0,......
*/
#define taskENTER_CRITICAL()				portENTER_CRITIVAL()

/* basepri == configMAX_SYSCALL_INTERRUPT_PRIORITY	*/
#define taskENTER_CRITICAL_FROM_ISR()		portSET_INTERRUPT_MASK_FROM_ISR()

/* 声明退出临界段 */

/*
断言 if uxCriticalNesting == 0,......
uxCriticalNesting --
if uxCriticalNesting == 0,basepri == 0
*/
#define taskEXIT_CRITICAL()					portEXIT_CRITICAL()
/*	basepri == x	*/
#define taskEXIT_CRITICAL_FROM_ISR( x )		portCLEAR_INTERRUPT_MASK_FROM_ISR( x )

先忽略断言的功能;
1.任务用临界
a.关中断(进入临界区)会立刻设置 basepri 为最大可屏蔽中断的值,并在 uxCriticalNesting ++
b.开中断(离开临界区)必须先判断 uxCriticalNesting -- 的值是否等于0,是的话才设置 basepri 为0

2.中断用临界
a.关中断(进入临界区)会立刻设置 basepri 为最大可屏蔽中断的值
b.开中断(离开临界区)可以手动设置 basepri 为传参