打印
[STM32L4]

【转】临界区和开关中断的区别

[复制链接]
2687|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一代掌门|  楼主 | 2016-11-6 21:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本篇**是为了说明进入临界段与普通的禁止和使能中断的区别。
普通的禁止和使能中断,在禁止中断时有触发中断的事件发生,当使能中断时该中断不会在响应,说明普通的禁止中断是阻止了中断的发生。
而在进入临界段时,有中断发生,在退出临界段时中断会得到响应,说明临街段只是延迟了中断的响应时间,并没有真正的阻止中断。
看下面这段测试代码:
[cpp] view plain copy


  • 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   
  • }  

沙发
mypczhou| | 2017-2-12 10:53 | 只看该作者
长经验,点赞

使用特权

评论回复
板凳
heisexingqisi| | 2017-2-12 20:41 | 只看该作者
在进入临界段时,有中断发生,在退出临界段时中断会得到响应

使用特权

评论回复
地板
huangcunxiake| | 2017-2-13 11:49 | 只看该作者
临界段是个什么概念、

使用特权

评论回复
5
huangcunxiake| | 2017-2-13 11:50 | 只看该作者
代码的临界段代码的临界段表示在运行过程中不能分割的代码段,一旦这部分代码开始执 行,系统将不会响应任何中断打入,临界段代码通过在代码首尾处加入关中断和 开中断指令来实现不被中断

使用特权

评论回复
6
sanfuzi| | 2017-2-13 12:57 | 只看该作者
临界区和开关中断?

使用特权

评论回复
7
sanfuzi| | 2017-2-13 13:01 | 只看该作者
STM32有这个临界区和开关中断吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

69

主题

191

帖子

4

粉丝