MDK临界区
Keil臨界區
/********************************************************************************************************* ** Function name: __ENTER_CIRTICAL, __EXIT_CIRTICAL ** Descriptions: 臨界區代碼保護宏 ** input parameters: 返回總中斷標志 , 原總中斷標志 ** Descriptions: 必須成對調用,這對宏之間的操作將關閉總中斷,退出臨界區后恢復原總中斷設置 **-------------------------------------------------------------------------------------------------------- *********************************************************************************************************/ /* 對應KEIL/RVMDK */ __asm unsigned char __enterCirtical(void) {MRS R0, PRIMASK /* 返回原總中斷的狀態 */CPSID I /* 關閉總中斷 */BX LR } __asm void __intEnable() {CPSIE I /* 打開總中斷 */BX LR }#define __ENTER_CIRTICAL() __enterCirtical() /* 進入臨界區關閉總中斷 */ #define __EXIT_CIRTICAL(isEnable) if(isEnable == 0) {__intEnable();} /* 根據isEnable檢查是否開中斷 */ 有種類似于互斥鎖的感覺,就是這段代碼不能被中斷打斷。這兩個接口保證了代碼的原子性。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
/********************************************************************************************************* ** Function name: __ENTER_CIRTICAL, __EXIT_CIRTICAL ** Descriptions: 臨界區代碼保護宏 ** input parameters: 返回總中斷標志 , 原總中斷標志 ** Descriptions: 必須成對調用,這對宏之間的操作將關閉總中斷,退出臨界區后恢復原總中斷設置 **-------------------------------------------------------------------------------------------------------- *********************************************************************************************************/ /* 對應KEIL/RVMDK */ __asm unsigned char __enterCirtical(void) {MRS R0, PRIMASK /* 返回原總中斷的狀態 */CPSID I /* 關閉總中斷 */BX LR } __asm void __intEnable() {CPSIE I /* 打開總中斷 */BX LR }#define __ENTER_CIRTICAL() __enterCirtical() /* 進入臨界區關閉總中斷 */ #define __EXIT_CIRTICAL(isEnable) if(isEnable == 0) {__intEnable();} /* 根據isEnable檢查是否開中斷 */ 有種類似于互斥鎖的感覺,就是這段代碼不能被中斷打斷。這兩個接口保證了代碼的原子性。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
- 上一篇: Matplotlib——创建散点图
- 下一篇: PLSQL修改表字段长度报ORA-251