1. 程式人生 > >臨界區和開關中斷的區別

臨界區和開關中斷的區別

本篇文章是為了說明進入臨界段與普通的禁止和使能中斷的區別。

普通的禁止和使能中斷,在禁止中斷時有觸發中斷的事件發生,當使能中斷時該中斷不會在響應,說明普通的禁止中斷是阻止了中斷的發生。

而在進入臨界段時,有中斷髮生,在退出臨界段時中斷會得到響應,說明臨街段只是延遲了中斷的響應時間,並沒有真正的阻止中斷。

看下面這段測試程式碼:

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  
}