野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8771|回复: 14

两个线中断相互打断问题

[复制链接]
发表于 2018-1-2 15:43:40 | 显示全部楼层 |阅读模式
中断配置如下:

  NVIC_InitTypeDef NVIC_InitStructure;
//key4中断优先级配置
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);                                                                                                         
  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;   
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 10;   
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;             
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
//key5中断优先级配置
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;          
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;             
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);                                   


中断处理程序:
EXTI_Line9:
        //key4
        if ( EXTI_GetITStatus(EXTI_Line9) != RESET )
        {
                EXTI_ClearITPendingBit(EXTI_Line9);
                while(isToPause && !isToResume){
                        RGB_yellow();
                        RGB1_red();
                        int cnt = 5000000;
                        while(cnt --);
                        RGB1_yellow();
                        RGB_red();
                        cnt = 5000000;
                        while(cnt --);
                        printf("key4 is Pressed\r\n");
                        if(isToResume) break;
                }
            //printf("key4 is Press\r\n");
        }

EXTI_Line15:
//key5
        if (EXTI_GetITStatus(EXTI_Line15) != RESET)
        {
                EXTI_ClearITPendingBit(EXTI_Line15);
                isToResume = 1;
                while(1){
                        int cnt = 5000000;
                        while(cnt --);
                        printf("key5 Button is Press\r\n");
                }
        }


如果中断优先级生效的话,key5应该是可以打断key4的,debug中看NVIC中断优先级key5是高于key4的,但是实际操作中不能实现效果,请问有哪位知道这是为什么,怎么才能实现想要的效果??
回复

使用道具 举报

 楼主| 发表于 2018-1-2 15:48:44 | 显示全部楼层
这里想要实现的效果是:使用一个低优先级的按键中断使系统进入暂停状态,使用一个高优先级的按键中断打断低优先级按键中断,然后恢复程序的正常运行,也就是想要实现两个外部中断的中断处理嵌套,实际实现怎么不是那么回事啊,使用的时STM32F1系列的处理器。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-2 16:37:47 | 显示全部楼层
已经变相地把问题解决了,解决思路:把想被打断的中断的清零操作放到打断的中断中去,即key4的中断清零操作放到key5的中断程序中去,改后中断处理程序如下:
//key4
if ( EXTI_GetITStatus(EXTI_Line9) != RESET )
        {
                //EXTI_ClearITPendingBit(EXTI_Line9);
                        RGB_yellow();
                        RGB1_red();
                        DelayS(1);
                        RGB1_yellow();
                        RGB_red();
                        DelayS(1);
                        //printf("key4 is Pressed\r\n");
        }

//key5
void EXTI15_10_IRQHandler(void)
{               
        //key5
        if (EXTI_GetITStatus(EXTI_Line15) != RESET)
        {
                EXTI_ClearITPendingBit(EXTI_Line15);
                EXTI_ClearITPendingBit(EXTI_Line9);
        }       
}

总算是实现了效果了,之前程序不能打断可能是while死循环吧。各位大神怎么看。
回复 支持 反对

使用道具 举报

发表于 2018-1-2 21:58:21 | 显示全部楼层

回帖奖励 +10 火花

你这个 是不是设置优先级组 不对啊
你这个是4组 只有相应属性 没有抢占属性啊 你分配了 0级和10级 的话 只有16种也就是0组才行
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-3 11:14:56 | 显示全部楼层
s724595701 发表于 2018-1-2 21:58
你这个 是不是设置优先级组 不对啊
你这个是4组 只有相应属性 没有抢占属性啊 你分配了 0级和10级 的话 只 ...

这个跟组没多大关系吧,主要是抢占优先级和次优先级决定了中断的优先级,这个配置形成中断嵌套应该是没问题的啊
回复 支持 反对

使用道具 举报

发表于 2018-1-4 12:05:36 | 显示全部楼层
在配置优先级的时候,还要注意一个很重要的问题,中断种类的数量。NVIC只可以配置16种 中断向量的优先级,也就是说,抢占优先级和响应优先级的数量由一个4位的数字来决定,把这个4位数字的位数 分配成抢占优先级部分和响应优先级部分。有5组分配方式:
第0组: 所有4位用来配置抢占优先级,即NVIC配置的24 =16种中断向量都是只有抢占属性,没有响应属性。
第1组:最高1位用来配置抢占优先级,低3位用来配置响应优先级。表示有21=2种级别的抢占优先级(0级,1级),有23=8种响应优先级,即在16种中断向量之中,有8种中断,其抢占优先级都为0级,而它们的响应优先级分别为0~7,其余8种中断向量的抢占优先级则都为1级,响应优先级别分别为0~7。
第2组:2位用来配置抢占优先级,2位用来配置响应优先级。即22=4种抢占优先级,22=4种响应优先级。
第3组:高3位用来配置抢占优先级,最低1位用来配置响应优先级。即有8种抢占优先级,2种响应2优先级。
第4组:所有4位用来配置响应优先级。即16种中断向量具有都不相同的响应优先级。
要配置这些优先级组,可以采用库函数NVIC_PriorityGroupConfig(),可输入的参数为NVIC_PriorityGroup_0 ~ NVIC_PriorityGroup_4,分别为以上介绍的5种分配组。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-4 16:55:05 | 显示全部楼层
s724595701 发表于 2018-1-4 12:05
在配置优先级的时候,还要注意一个很重要的问题,中断种类的数量。NVIC只可以配置16种 中断向量的优先级, ...

组的意义只是给抢占优先级和次优先级规定了位数而已吧,如果两个中断要嵌套就不需要次优先级了,所以我把所有的位数都分配给了抢占优先级,次优先级是多少都被忽略了。
回复 支持 反对

使用道具 举报

发表于 2018-1-4 19:42:21 | 显示全部楼层
楼主是不是应该描述一下想要看到什么现象,以及看到了什么现象?

我来分析一下:key4按下进入EXTI_Line9中断,根据isToPause && !isToResume来判断是否继续循环,默认情况下应该是继续循环的,在循环内RGB和RGB1两灯的颜色互换显示,并一直发送"key4 is Pressed\r\n",直到key5按下,程序进入EXTI_Line15中断, isToResume 赋值为 1,程序一直循环发送"key5 Button is Press\r\n",此时灯RGB与RGB1的状态不再切换,EXTI_Line15中断内部一直处于死循环的状态,此时按下任何按键都不再起作用,但是根据灯的状态以及串口发送的信息是可以判断发生了中断嵌套的。

回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-4 20:38:44 | 显示全部楼层
飔箣 发表于 2018-1-4 19:42
楼主是不是应该描述一下想要看到什么现象,以及看到了什么现象?

我来分析一下:key4按下进入EXTI_Line9 ...

嗯,是的,就是想让key5打断key4,但是按照之前的写法key4按下后,key5再按下不起作用了,一直死在key4的中断里面,所以觉得在中断里面写死循环是不可行的做法
回复 支持 反对

使用道具 举报

发表于 2018-1-5 18:55:10 | 显示全部楼层
tiandijianji 发表于 2018-1-4 20:38
嗯,是的,就是想让key5打断key4,但是按照之前的写法key4按下后,key5再按下不起作用了,一直死在key4的 ...

我今天试了一下,你原本的想法是没有问题的,中断是可以嵌套的,你发一下原本的程序,我看一下!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-5 20:42:20 | 显示全部楼层
飔箣 发表于 2018-1-5 18:55
我今天试了一下,你原本的想法是没有问题的,中断是可以嵌套的,你发一下原本的程序,我看一下!

额,我在三楼发的程序也可以中断嵌套,原本的while死循环是不能嵌套的
回复 支持 反对

使用道具 举报

发表于 2018-1-6 10:24:24 | 显示全部楼层
tiandijianji 发表于 2018-1-5 20:42
额,我在三楼发的程序也可以中断嵌套,原本的while死循环是不能嵌套的

我按照你的想法在中断里面加了循环,循环嵌套是可以实现的,你没有实现一定是哪里设置错误了。如果你一楼的嵌套没办法实现,那么三楼的也不一定就是嵌套,因为你没有清除EXTI9_5的中断,所以中断会一直触发,但是两次中断之间应该是有一定的时间差,所以EXTI15_10的中断可能是在这中间执行了,这样的话或许说明两个中断的优先级应该都是0,所以没办法嵌套,具体的中断执行时序,我有一本讲解CM3内核的书,周一的时候看一下,就比较清楚了。

所以我想看一下你的程序,是哪里设置的和我不同。
回复 支持 反对

使用道具 举报

发表于 2018-1-6 11:09:29 | 显示全部楼层
tiandijianji 发表于 2018-1-5 20:42
额,我在三楼发的程序也可以中断嵌套,原本的while死循环是不能嵌套的

仿真也是没有问题的,不知道你是什么情况?

EXTI.rar

289.74 KB, 下载次数: 4

回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-6 17:12:04 | 显示全部楼层
飔箣 发表于 2018-1-6 11:09
仿真也是没有问题的,不知道你是什么情况?



出了一楼的死循环没改过来之外,其它都一样

BSP_DetectorBoardKeys.zip

1.67 KB, 下载次数: 6

回复 支持 反对

使用道具 举报

发表于 2018-1-6 21:46:16 | 显示全部楼层
tiandijianji 发表于 2018-1-6 17:12
出了一楼的死循环没改过来之外,其它都一样

我改了一下,软件模拟是没有问题的,再送你一个文件比对软件,你可以安装以后对比一下我改过的和你原本的有哪些地方不同。 BSP_DetectorBoardKeys.rar (1.57 KB, 下载次数: 4) BCompare.rar (5.46 MB, 下载次数: 3)
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-25 19:39 , Processed in 0.042305 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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