臨界區和開關中斷的區別
阿新 • • 發佈:2019-01-10
本篇文章是為了說明進入臨界段與普通的禁止和使能中斷的區別。
普通的禁止和使能中斷,在禁止中斷時有觸發中斷的事件發生,當使能中斷時該中斷不會在響應,說明普通的禁止中斷是阻止了中斷的發生。
而在進入臨界段時,有中斷髮生,在退出臨界段時中斷會得到響應,說明臨街段只是延遲了中斷的響應時間,並沒有真正的阻止中斷。
看下面這段測試程式碼:
unsigned int CPU_SR_Save(void); void CPU_SR_Restore(unsigned int cpu_sr); unsigned int cpu_sr,j; unsigned char i; int main() { RCC_Init(); System_Init(); #if 0 Disable_Mac_EXT_Interrupts();//禁止按鍵中斷 delay_ms(10000);//定時器延時10S,在延時過程中按下按鍵 Enable_Mac_EXT_Interrupts();//延時退出時,中斷得不到響應 #else cpu_sr = CPU_SR_Save();//進入臨界段 for (i=0;i<200;i++){//延時一定時間,在延時過程中按下按鍵 for (j=0;j<50000;j++); } CPU_SR_Restore(cpu_sr);//延時退出時,中斷得到響應 #endif while (1){ } } //下面是進入臨界段程式,是MDK中內嵌彙編的用法 __asm unsigned int CPU_SR_Save(void) { MRS R0, PRIMASK ; Set prio int mask to mask all (except faults) CPSID I BX LR } __asm void CPU_SR_Restore(unsigned int cpu_sr) { MSR PRIMASK, R0 BX LR }