【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 为传参