OpenEdv-开源电子网

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

关于NVIC抢占优先级以及响应优先级问题

[复制链接]

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-5-3
在线时间
18 小时
发表于 2016-9-30 12:07:09 | 显示全部楼层 |阅读模式
6金钱

若内核正在执行 C 的中断服务函数,则它能被抢占优先级更高的中断 A 打断,由于 B
和 C 的抢占优先级相同,所以 C 不能被 B 打断。但如果 B 和 C 中断是同时到达的,内核
就会首先响应响应优先级别更高的 B 中断。

这里有几个问题:(对应上表)

1、c中断在执行中,B中断发生了,那么B中断不会立即执行(因为b中断抢占优先级和c中断的抢占优先级一样大),那么问题来了,,c中断执行完之后,b中断还会执行吗?

2、a中断正在执行过程中,突然发生了b或者c中断,(b,c抢占优先级低于a),肯定不会产生中断嵌套,那么请问a中断执行完了,b、c中断还会继续执行吗?

3、b、c抢占优先级相同,响应优先级b为0 等级高于c的响应中断1 那么会先执行b中断。问题来了,b中断执行完成之后,c中断还会执行吗?


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

250

主题

1370

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
7528
金钱
7528
注册时间
2015-10-15
在线时间
2758 小时
发表于 2016-9-30 12:17:43 | 显示全部楼层
楼主这个问题提得好。
不过为了让自己理解更加透彻。。。楼主可以这样做:
写三个外部中断函数A,B,C  ...对应KEY0,KEY1,KEY2触发
每个中断函数都在里面延时大约5s后控制不同led的状态,然后按按键,看看他们的执行结果即可解决楼主所有问题。
1,按KEY2触发C中断,然后过了2秒,按下KEY1触发B中断,查看KEY1控制的LED状态(如果没有变,那么就不会执行B中断,如果变了就执行了)
2,同理
3,同理
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-5-3
在线时间
18 小时
 楼主| 发表于 2016-9-30 12:25:12 | 显示全部楼层
openedvadmin 发表于 2016-9-30 12:17
楼主这个问题提得好。
不过为了让自己理解更加透彻。。。楼主可以这样做:
写三个外部中断函数A,B,C  . ...

谢谢啦~确实应该这样做,我写个试试~
回复

使用道具 举报

250

主题

1370

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
7528
金钱
7528
注册时间
2015-10-15
在线时间
2758 小时
发表于 2016-9-30 12:32:04 | 显示全部楼层
墨染青衫 发表于 2016-9-30 04:25
谢谢啦~确实应该这样做,我写个试试~

很多问题,我们都可以自己来解决,解决的结果就是自己理解更加深入。。。。
并且提升自己解决问题的思维。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

250

主题

1370

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
7528
金钱
7528
注册时间
2015-10-15
在线时间
2758 小时
发表于 2016-9-30 12:33:18 | 显示全部楼层
墨染青衫 发表于 2016-9-30 04:25
谢谢啦~确实应该这样做,我写个试试~

这里注意,延时函数不要使用我们的。
直接用程序指令执行延时。。
void delay(u32 nus){
while(--nus);
}

上面代码不一定正确,只是个思路。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-5-3
在线时间
18 小时
 楼主| 发表于 2016-9-30 16:41:52 | 显示全部楼层
openedvadmin 发表于 2016-9-30 12:33
这里注意,延时函数不要使用我们的。
直接用程序指令执行延时。。
void delay(u32 nus){

我知道  你说的  为啥不要用delay_ms(),延时了。。。刚刚中招,,排查出来了
回复

使用道具 举报

250

主题

1370

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
7528
金钱
7528
注册时间
2015-10-15
在线时间
2758 小时
发表于 2016-9-30 16:54:29 | 显示全部楼层
墨染青衫 发表于 2016-9-30 08:41
我知道  你说的  为啥不要用delay_ms(),延时了。。。刚刚中招,,排查出来了

中断里面最好不要用我们的delay。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-5-3
在线时间
18 小时
 楼主| 发表于 2016-9-30 16:55:27 | 显示全部楼层
实验结果对应如下::
问题1、c中断在执行中,B中断发生了,那么B中断不会立即执行(因为b中断抢占优先级和c中断的抢占优先级一样大),那么问题来了,,c中断执行完之后,b中断还会执行吗?
实验过程:b、c抢占优先级相同,抢占优先级b高于c(战舰板子上的 key2【PE2 外部中断线 2】亮红灯 约5s后灭灯,key1【PE3外部中断线3】亮绿灯 约5s然后 灭灯),首先按下key2 红灯亮 接着按下key1  此时还是红灯亮,等几秒后,绿灯亮起。

说明c中断执行完成后,b中断会继续执行

2、a中断正在执行过程中,突然发生了b或者c中断,(b,c抢占优先级低于a),肯定不会产生中断嵌套,那么请问a中断执行完了,b、c中断还会继续执行吗?

答案是肯定的,也会继续执行

3、b、c抢占优先级相同,响应优先级b为0 等级高于c的响应中断1 那么会先执行b中断。问题来了,b中断执行完成之后,c中断还会执行吗?
这个测试起来不是特别容易,,,因为基本上无法做到 bc同时发生(我认为最少都差1条c语言所需时间),不过我分析  感觉 答案应该也是肯定的。
回复

使用道具 举报

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-5-3
在线时间
18 小时
 楼主| 发表于 2016-9-30 16:59:16 | 显示全部楼层
openedvadmin 发表于 2016-9-30 16:54
中断里面最好不要用我们的delay。。。

你们的delay函数,我很少用的,除非不得已,,我连按键消抖,使用的都是  定时器中断消抖。因为我感觉 delay用多了,单片机会一直停在那,造成资源浪费,浪费时间,运行速度。

不过我还没认真看过,你们delay函数的实现原理,我等会瞅瞅,自己改写一遍。。

用别人的代码很不爽,不如用自己的,好把握
回复

使用道具 举报

250

主题

1370

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
7528
金钱
7528
注册时间
2015-10-15
在线时间
2758 小时
发表于 2016-9-30 17:03:55 | 显示全部楼层
墨染青衫 发表于 2016-9-30 08:55
实验结果对应如下::
问题1、c中断在执行中,B中断发生了,那么B中断不会立即执行(因为b中断抢占优先级 ...

第三个不难测试。。不用测试他们同时,已经毫无疑问的是,谁先发生谁先执行。只用测试,A发生过程中B发生,执行完A,B是否还执行。。。。

三个实验只用改下优先级,其他基本都是一样的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

250

主题

1370

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
7528
金钱
7528
注册时间
2015-10-15
在线时间
2758 小时
发表于 2016-9-30 17:04:19 | 显示全部楼层
相信测试之后,你对这个优先级的理解就很清晰了。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-5-3
在线时间
18 小时
 楼主| 发表于 2016-9-30 17:06:28 | 显示全部楼层
openedvadmin 发表于 2016-9-30 17:03
第三个不难测试。。不用测试他们同时,已经毫无疑问的是,谁先发生谁先执行。只用测试,A发生过程中B发生 ...

嗯嗯,对的。谢谢啦~
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-5-24 07:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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