打印
[STM32F1]

关于stm32中断里面嵌套中断的遇到的奇葩现象(原因从12楼看

[复制链接]
10724|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
本帖最后由 摩天轮1111 于 2015-8-10 12:07 编辑

又遇到一个奇葩的事情,我有两个中断,一个EXTI1一个systick,我再EXTI1的中断服务函数里面采用了delay,然后delay里面又使用了systick的中断服务函数,然后我设置了systick的主优先级0,从也是0,而EXTI1的主1,从1,照理说,这里在执行EXTI的中断函数时候,进入delay之后delay会使能systick开始计数,然后一直while(flag)等待(flag默认1),直到systick中断发生了,进入该中断函数,会使得flag变成1,然后出中断,然后while就出去了,然后delay就出去了,然后接着执行EXTI1里面的下面的句子,但是为什么实际情况是进不去systick的中断服务函数,程序就停在while(flag)上面,flag这里是main.c的全局变量,中断服务函数全部写在main.c里面的



源码附上 13 外部触发 PA1 中断实现 USART3重映射打印(FLASH版本).rar (306.54 KB) 呢?


32
john_lee| | 2018-8-8 23:00 | 只看该作者
w542964028 发表于 2018-8-8 20:47
那问题又来了,STM32固件库里默认设置成15的用意是什么呢?让其他中断都可以抢占系统时钟? ...

是的,在绝大多数应用场景中,systick 的优先级比其它中断都低。

使用特权

评论回复
31
w542964028| | 2018-8-8 20:47 | 只看该作者
那问题又来了,STM32固件库里默认设置成15的用意是什么呢?让其他中断都可以抢占系统时钟?

使用特权

评论回复
30
o(╯□╰)o| | 2016-9-10 14:14 | 只看该作者
为什么我改了优先级为0还是不行,有没有和我一样的?求解答

使用特权

评论回复
29
liuyuxiier| | 2016-4-28 15:33 | 只看该作者
中断里不是不可以用延时,只是不建议这样做。另外个人认为,不仅仅是中断不建议用延时,其他地方也尽量能少用就少用,毕竟延时是在空耗CPU,应该省下CPU的时间去做别的任务。

使用特权

评论回复
28
summy0633| | 2016-3-24 11:22 | 只看该作者
谢谢了。楼主!我也遇到你这个问题了!

使用特权

评论回复
27
axc| | 2016-2-19 23:44 | 只看该作者
楼主能否赏个QQ号?

使用特权

评论回复
26
axc| | 2016-2-19 23:40 | 只看该作者
楼主高手,关于SYS的中断优先级我也是郁闷了好久,看到楼主这个帖子后,完全明白了,楼主的探究精神值得我们学习,楼主把知识拿出来分享的精神也值得我们学习,拜谢楼主又让我解决了一个疑惑。

使用特权

评论回复
25
wuqingfan| | 2015-9-15 13:57 | 只看该作者
mark

使用特权

评论回复
24
摩天轮1111|  楼主 | 2015-8-10 12:06 | 只看该作者
kamen588 发表于 2015-8-9 17:20
.楼主,你前面的解释我看的一头雾水,systick属于内核中断,他的优先级设定不是常规的设置NVIC ...

前面的解释是错误的,我后面说了,最后给的解释,就是你说的这样的

使用特权

评论回复
23
kamen588| | 2015-8-9 17:20 | 只看该作者
.楼主,你前面的解释我看的一头雾水,systick属于内核中断,他的优先级设定不是常规的设置NVIC

使用特权

评论回复
22
zchong| | 2015-8-9 16:15 | 只看该作者
如果是我,我就用IO高低电平通过示波器来观察嵌套情况,比较直观。
中断优先级,首先搞清楚抢占优先级和子优先级的概念,也就是优先级分组
之后就是正确设置中断优先级,楼主已经发现了内核的中断优先级和外设的中断优先级设置的寄存器是不一样的

使用特权

评论回复
21
摩天轮1111|  楼主 | 2015-8-7 14:39 | 只看该作者
本帖最后由 摩天轮1111 于 2015-8-7 21:15 编辑
sjnh 发表于 2015-8-7 14:31
不是你找到了问题,使用了其它方**好避免了
中断里用:while(flag),flag要用volatile定义 ...

我的理解是和flag无关的,我这个flag是全局变量,它并不是寄存器的某一位表示的值,他是个变量,通过中断服务函数来改变他的值,不应该定义成volatile,因为不存在“不能优化”,“flag是实时的”等等的问题,定义volatile显然也不会有问题,但是我感觉这并不是volatile的用途,不然你可以试试看,,

使用特权

评论回复
20
摩天轮1111|  楼主 | 2015-8-7 14:35 | 只看该作者
caosix 发表于 2015-8-7 10:41
这才是 正确的 。。。

中断 服务 只负责 【登记 一个 事件 或者 变量】

请注意我帖子的核心思想:
现象:我本设置了systick中断优先级最高,但是在EXTI1中断内部发生systick中断之后,却无法进入systick中断服务函数去执行,
处理:我探寻了各种可能的原因,想了各种可能导致的原因,最后发现了是systick的中断优先级的设置不是和EXTI用同一个函数设置,也就是我本以为我systick设置了最高优先级,实际上没有,才导致了我程序出现了和我预想的不一样的现象。
提示:回帖也请认真看别人的发帖内容,扫两眼,主观大篇长论,(就因为中断里面用延时了?呵呵,我是用这个延时是为了试验优先级设置这个问题,也就是如果我systick优先级低就执行不出来结果,如果我systick优先级高于EXTI就会出结果,这是我这个实验的初衷)不仔细阅读,妄下评论,是一种不尊敬,(换句话说,就是没法和你聊,你根本不会理会别人的思想,太自我,还聊什么呢)

使用特权

评论回复
19
sjnh| | 2015-8-7 14:31 | 只看该作者
不是你找到了问题,使用了其它方**好避免了
中断里用:while(flag),flag要用volatile定义

使用特权

评论回复
18
摩天轮1111|  楼主 | 2015-8-7 14:20 | 只看该作者
lzhyqq 发表于 2015-8-7 14:07
不是,实际是他关于中断优先级按着两级抢占式分配的,那抢占式优先级只有0和1,2和1的抢占优先级是一样的 ...

不是你理解的这样的,systick的默认是1111,也就是15,不论怎么分组,他都是最低的优先级,不同的外设中断,不论哪个寄存器高四位怎么设置的,只要一分组,你改了分组,前面设置过的那个中断优先级的那个寄存器的高四位不变,但是按照分组重新来算优先级,见我这篇帖子https://bbs.21ic.com/icview-1037576-1-1.html

使用特权

评论回复
17
摩天轮1111|  楼主 | 2015-8-7 14:17 | 只看该作者
Dick00 发表于 2015-8-7 10:11
学习了,Systick是内部中断,默认是最低的,所以LZ一开始会出现嵌套不了的状况,所以要用NVIC_SetPriority ...

是的,就是你这个意思,设置systick的优先级不是使用和设置外设中断优先级一样的办法,应为他是系统的东西,有他的设置办法,就是你说的这个函数去设置,但是设置外设的那个中断优先级用的函数里面填那个外设名称的部分,库函数它没有列表,所以也许有时候会犯错,也用他来设置系统部分的中断了,我就不知道这里面哪来的一堆人瞎嚷嚷那个中断嵌套里面不该用延时这个问题,真不懂这些人脑子里想啥,都跑偏了我发这个帖子的初衷了,尽给无关痛痒的东西揪着说,就好像我不知道中断里面用延时不好一样,看到这样的人真烦,我再说中断的设置的问题,他在说延时,就好像我出的这个现象的问题就是因为我用了延时的原因,真不明白这些人怎么学习的

使用特权

评论回复
16
lzhyqq| | 2015-8-7 14:07 | 只看该作者
本帖最后由 lzhyqq 于 2015-8-7 14:19 编辑
Dick00 发表于 2015-8-7 10:11
学习了,Systick是内部中断,默认是最低的,所以LZ一开始会出现嵌套不了的状况,所以要用NVIC_SetPriority ...

应该是这样的。

使用特权

评论回复
15
zhixin15| | 2015-8-7 10:56 | 只看该作者
stm32解密,加密技术交流,QQ:2424720092.15313166207.李明阳。

使用特权

评论回复
14
Dick00| | 2015-8-7 10:11 | 只看该作者
学习了,Systick是内部中断,默认是最低的,所以LZ一开始会出现嵌套不了的状况,所以要用NVIC_SetPriority()函数去设置其优先级,当其优先级高于EXIT中断优先级时就可以嵌套了,是这个意思不?

使用特权

评论回复
13
摩天轮1111|  楼主 | 2015-8-7 00:35 | 只看该作者
松哥无敌 发表于 2015-8-6 23:27
我觉得你有点蛇精病了

呵呵,是因为之前的那种逻辑的理解还是有对实验现象有解释不通的地方,这下好了,最后的这个结论什么地方都解释通了,供借鉴

使用特权

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

本版积分规则

38

主题

224

帖子

15

粉丝