临界区和开关中断的区别
2014-06-03 11:01
218 查看
本篇文章是为了说明进入临界段与普通的禁止和使能中断的区别。
普通的禁止和使能中断,在禁止中断时有触发中断的事件发生,当使能中断时该中断不会在响应,说明普通的禁止中断是阻止了中断的发生。
而在进入临界段时,有中断发生,在退出临界段时中断会得到响应,说明临街段只是延迟了中断的响应时间,并没有真正的阻止中断。
看下面这段测试代码:
普通的禁止和使能中断,在禁止中断时有触发中断的事件发生,当使能中断时该中断不会在响应,说明普通的禁止中断是阻止了中断的发生。
而在进入临界段时,有中断发生,在退出临界段时中断会得到响应,说明临街段只是延迟了中断的响应时间,并没有真正的阻止中断。
看下面这段测试代码:
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 }
相关文章推荐
- 关于uCOS-II进出临界区时使用开关中断方式的疑问
- uCOS-III开关中断进出临界区的三个宏
- 临界区,互斥量,信号量,事件的区别
- [OS]中断与陷阱的区别
- s3c2440对与ucosII的开关中断的处理
- ARM中断区别-LPC2142与S3C2440的区别
- (转)临界区,互斥量,信号量,事件的区别(线程同步)
- 中断处理函数与回调函数的区别与联系?
- 【转】临界区对象TCriticalSection(Delphi) 与 TRtlCriticalSection 的区别
- 异常与中断的区别
- 【转】临界区对象TCriticalSection(Delphi) 与 TRtlCriticalSection 的区别
- 开关电源和线性电源的区别
- 关于向量中断和非向量中断的区别!
- (转)临界区,互斥量,信号量,事件的区别(线程同步)
- 中断与异常的区别
- 转: 临界区,互斥量,信号量,事件的区别
- 临界区(Critical section)与互斥体(Mutex)的区别
- 未雨绸缪——临界区中断处理
- 互斥量、临界区、信号量和时间的作用与区别
- 磁珠,磁珠工作原理,与电感区别,磁珠的选型以及在开关电源中的应用(转)