OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2589|回复: 2

忘了中断优先级,谁给解释下吧

[复制链接]

84

主题

347

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2015
金钱
2015
注册时间
2014-7-1
在线时间
190 小时
发表于 2018-5-11 09:52:03 | 显示全部楼层 |阅读模式
20金钱
举个例子吧外部中断初始化
//外部中断初始化程序
void EXTI_Init(void)
{

        Ex_NVIC_Config(GPIO_B,6,RTIR);                 //上升沿触发
        Ex_NVIC_Config(GPIO_B,7,RTIR);               
        Ex_NVIC_Config(GPIO_B,8,RTIR);
        Ex_NVIC_Config(GPIO_B,9,RTIR);
        MY_NVIC_Init(2,1,EXTI9_5_IRQn,2);          //抢占2,子优先级1,组2
}




//外部中断9~5服务程序
void EXTI9_5_IRQHandler(void)
{                       
        temp=EXTI->PR;
        switch(temp)
        {
                case EXTI_PR_PR6:                //判断引脚电平,然后干嘛干嘛
break;       

                case EXTI_PR_PR7:                //判断引脚电平,然后干嘛干嘛
                               
                                                break;                                               
                case EXTI_PR_PR8:                //判断引脚电平,然后干嘛干嘛
                                               
                                                break;
                case EXTI_PR_PR9:                //判断引脚电平,然后干嘛干嘛
                                               
                                                break;
                default:break;
        }


        EXTI->PR=1<<9;     //清除LINE5上的中断标志位
        EXTI->PR=1<<8;     //清除LINE5上的中断标志位
        EXTI->PR=1<<7;     //清除LINE5上的中断标志位
        EXTI->PR=1<<6;     //清除LINE5上的中断标志位
}



极端情况下,问题如下
1、如果一个中断A发生,另外一个中断B同时来到,会不会B打断A?
2、在1的基础上,B不会打断A,那中断A执行结束后,中断B会来到吗?
3、在2的基础上,中断B不会来到,那怎样设计,让在中断A执行结束后,中断B也能正常执行?
4、在3的基础上,把清除中断标志位放到对应的发生源下,是不是就可以不会漏掉中断了?

最佳答案

查看完整内容[请看2#楼]

1、5~9是共用同一个中断的,只有高优先级的才能抢占低优先级中断,你这属于相同的中断,所以不会打断的, 2-4、如果你不清除标志位,B中断会在A结束后继续触发,清除中断标志位放到对应的发生源是可以避免漏掉中断, 这个理解没错的,不过这里其实还有风险,就是在你执行过程中如果同一个中断触发了两次,还是有漏中断的风险。如A,B同时触发,在你执行A的时候,B再次触发,此时B的中断就被漏掉了,考虑到这种情况,这样写是较完 ...
做一个相信自己的人
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2015-6-11
在线时间
313 小时
发表于 2018-5-11 09:52:04 | 显示全部楼层
本帖最后由 zc123 于 2018-5-11 22:13 编辑

1、5~9是共用同一个中断的,只有高优先级的才能抢占低优先级中断,你这属于相同的中断,所以不会打断的,
2-4、如果你不清除标志位,B中断会在A结束后继续触发,清除中断标志位放到对应的发生源是可以避免漏掉中断, 这个理解没错的,不过这里其实还有风险,就是在你执行过程中如果同一个中断触发了两次,还是有漏中断的风险。如A,B同时触发,在你执行A的时候,B再次触发,此时B的中断就被漏掉了,考虑到这种情况,这样写是较完善的:
void EXTI9_5_IRQHandler(void)
{                       
        UINT32 temp=EXTI->PR;
        EXTI->PR |= (temp&0x3E0);  //清除当前的标志位

        if(temp&EXTI_PR_PR6)
        {
                //do something
        }

        if(temp&EXTI_PR_PR7)
        {
                //do something
        }
       if(temp&EXTI_PR_PR8)
        {
                //do something
        }

        if(temp&EXTI_PR_PR9)
        {
                //do something
        }
}
其实到这里大部分应用(连续中断时间比较短)都不会有问题了,但在特殊情况下也有连续多次的情况,这种软件逻辑层面上无解,只能尽可能的简化中断代码(中断仅做计数), 后续由应用循环处理。
回复

使用道具 举报

84

主题

347

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2015
金钱
2015
注册时间
2014-7-1
在线时间
190 小时
 楼主| 发表于 2018-5-13 15:01:13 | 显示全部楼层
zc123 发表于 2018-5-11 09:52
1、5~9是共用同一个中断的,只有高优先级的才能抢占低优先级中断,你这属于相同的中断,所以不会打断的,
...

ok,谢了
做一个相信自己的人
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-18 08:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表