- 简述:
- 临界段也叫临界域,是一段不可分割的代码;
- 如何临界段可以被中断,那么就需要关中断以保护临界段;
- 如果临界段可能被任务级代码打断,那么需要锁调度器保护临界段;
- 什么时候用临界段?
- 你认为这段代码不希望被中断的时候;
- 临界段的本质就是开(进入临界段)、关(退出临界段)系统中断;
- 实现方式
- 简单直接:CPSID / CPSIE (在临界段嵌套中就会出现问题)
- 程序状态字保存在寄存器中
- cpu_sr1 = CPU_SR_Save();//关中断
- CPU_SR_Restore(cpu_sr1);//开中断
- 例程:
/* ************************************************************************************************************************ * 临界段处理 ************************************************************************************************************************ */ #define OS_CRITICAL_ENTER() CPU_CRITICAL_ENTER() //开启临界段 #define OS_CRITICAL_ENTER_CPU_CRITICAL_EXIT() #define OS_CRITICAL_EXIT() CPU_CRITICAL_EXIT() //退出临界段 #define OS_CRITICAL_EXIT_NO_SCHED() CPU_CRITICAL_EXIT() /* ********************************************************************************************************* * 临界段配置 ********************************************************************************************************* */ #define CPU_CFG_CRITICAL_METHOD CPU_CRITICAL_METHOD_STATUS_LOCAL typedef CPU_INT32U CPU_SR; #if (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL) /* 定义一个局部变量,用于保存CPU中断状态 */ #define CPU_SR_ALLOC() CPU_SR cpu_sr = (CPU_SR)0 #else #define CPU_SR_ALLOC() #endif /* Save CPU 状态 & 失能中断 */ #define CPU_INT_DIS() do { cpu_sr = CPU_SR_Save(); } while (0) /* Restore CPU 状态 */ #define CPU_INT_EN() do { CPU_SR_Restore(cpu_sr); } while (0) /* 失能中断 */ #define CPU_CRITICAL_ENTER() do { CPU_INT_DIS(); } while (0) /* 重新使能中断 */ #define CPU_CRITICAL_EXIT() do { CPU_INT_EN(); } while (0) ;************************************************************************************************************************ ; 临界段 关闭 打开中断 ;************************************************************************************************************************ CPU_SR_SAVE MRS R0, PRIMASK CPSID I BX LR CPU_SR_Restore MRS PRIMA /* ********************************************************************************************************* * 临界段配置 ********************************************************************************************************* */ #define CPU_CRITICAL_METHOD_NONE 0u #define CPU_CRITICAL_METHOD_INT_DIS_EN 1u /* DIS/EN 中断*/ #define CPU_CRITICAL_METHOD_STATUS_STK 2u /* Push/Pop 中断状态到任务堆栈 */ #define CPU_CRITICAL_METHOD_STATUS_LOCAL 3u /* Save/Restore 中断状态到局部变量*/
- 总结:无