打印

50分高分挖坟,STM32中断清标志问题

[复制链接]
楼主: NE5532
手机看帖
扫描二维码
随时随地手机跟帖
21
lxyppc| | 2012-11-21 16:13 | 只看该作者 回帖奖励 |倒序浏览
如果用POP {R0, PC}返回
那相应的会有PUSH{LR}的指令
编译器会维护寄存器中值的平衡的

10楼的说法和实验結果很像

使用特权

评论回复
22
xinzha| | 2012-11-21 16:41 | 只看该作者
push和pop这两个指令完成不了模式和特权级别的切换。如果只是简单的pop,怀疑程序并没有及时退出handler模式,所以给了硬件充分的时间去清理犯罪现场。

使用特权

评论回复
23
NE5532|  楼主 | 2012-11-21 19:19 | 只看该作者
明天发完整代码出来。谢谢这么多陪我研究底层的朋友们~!

使用特权

评论回复
24
Ryanhsiung| | 2012-11-22 08:20 | 只看该作者
关注一下 问题进展

使用特权

评论回复
25
bald| | 2012-11-22 10:41 | 只看该作者
pop {r0,pc} 的指令执行周期相当于

nop
nop
nop
bx lr
你甚至可以置编译器的BX LR 指令于不顾
嵌入一条 PUSH LR
清标志位后再嵌入一条 POP PC
应该可以达到同样的效果

使用特权

评论回复
26
NE5532|  楼主 | 2012-11-23 09:37 | 只看该作者
上传代码,欢迎大家研究。
MySTM32.rar (501 KB)

使用特权

评论回复
27
王小毛wxm| | 2013-5-13 20:57 | 只看该作者
我也遇到了类似问题  学习了
虽然还是有些不太懂  不过以后写程序清标志位放在刚进入中断了

使用特权

评论回复
28
grasswolfs| | 2013-5-13 21:58 | 只看该作者
NE5532 发表于 2012-11-23 09:37
上传代码,欢迎大家研究。

27楼的同学竟然把这么深的帖子挖出来。。

使用特权

评论回复
29
拿起书本| | 2013-5-15 20:14 | 只看该作者
楼上各位都是高人,初入行者进来看看这50分的贴,不能帮助楼主解决问题,但可以帮顶一下,让更多的高手看到,

使用特权

评论回复
30
香水城| | 2013-7-3 16:48 | 只看该作者
总结一下:这个帖子中的10楼、14楼已经正确回答了LZ和很多用户碰到的“连续进两次中断的典型问题”

若没有其余疑问,请LZ结贴~

使用特权

评论回复
31
hawksabre| | 2013-7-3 19:13 | 只看该作者
很不错的技术帖子   不错    看看先   谢谢了    楼主    顶一个

使用特权

评论回复
32
qingqiu647| | 2013-7-4 01:07 | 只看该作者

使用特权

评论回复
33
jerry_wtl| | 2013-7-4 10:27 | 只看该作者
NE5532 发表于 2012-11-21 15:08
最新测试结果通报:

1.将Timer的溢出周期设置为100uS,示波器观察到ISR在退出后1uS左右又进入了一次,就是 ...

POP {R0,PC}
和 BX LR两条指令的执行时间也不一样,pop要访问ram读两个word,比bx lr会慢很多,貌视也符合10楼和14楼说的情况。

使用特权

评论回复
34
seawwh| | 2013-7-4 11:20 | 只看该作者
这个问题应该和指令流水线有关,在返回指令执行完后,中断标志还没有被清除,导致再次进入中断。
可以做这样一个实验:


清中断动作不放在前面将其放到后面,然后在其后再加若干指令,工作就会正常。

使用特权

评论回复
35
NE5532|  楼主 | 2013-7-4 14:45 | 只看该作者
10L给出的说法跟我假设的一样,但是作为一个熟悉内核的公司,ST应该告诉使用者,至少需要延迟多少条指令或者使用什么指令等待硬件清除中断标志,但是ST没有提示,所以楼主还是没有得到答案。

使用特权

评论回复
36
乌月明星稀| | 2013-8-29 15:40 | 只看该作者
xinzha 发表于 2012-11-21 16:05
cortex-M3中不太应该使用POP {R0,PC}这样的指令来实现中断返回,因为在M系列架构中,中断返回的方式是根据 ...

如果不管是中断还是普通函数,它都会保证进入和退出时恢复原来PC调用点的。压栈和出栈字节是相等的。楼主问题可能就是FLASH的指令缓存问题了。因为FLASH速度相对较慢,在72M时钟下,每条执行一条指令就要插入2个NOP;楼主遇到问题的地方是没有初始化FLASH配置。默认FLASH配置为没有加NOP的;看一下参考手册。

使用特权

评论回复
37
jiayou0054| | 2013-8-29 17:56 | 只看该作者
1)猜的,STM's FMSC 时序中都有ns级别,所以,清除一个硬件标志过程应该比一条语句快吧。
2)STM的C例程中,都是判断一下是否if(xxxx != RESET)才进入清除标志的。你这个确实像12楼所说,应先判断一下呗。
3)我知道,上面两点都没有说到点子上。

使用特权

评论回复
38
xxiao6130| | 2013-8-29 18:14 | 只看该作者
学习路过,帮置顶

使用特权

评论回复
39
lwp513| | 2013-9-9 11:59 | 只看该作者
我觉得应该是这样的吧
内核里面有个轮询机构,检测中断标志位
如果你在进入中断的第一条指令没有清除中断的话,而且清除中断指令又在轮询的下一个周期之外,那么就会重新再进入中断

使用特权

评论回复
40
zzfei90| | 2013-9-9 12:27 | 只看该作者
清中断标志不应该一律的放在前面,也不应该一律的放在最后,这个应该看实际情况的,如果非常确定该次中断执行时间内不会再被请求,那么,标志位放哪儿都无所谓了,否则,是需要放在最前面的
我还是比较喜欢放在最后,因为我喜欢在事情做完后才告诉处理器,你可以再次使用这个中断了

使用特权

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

本版积分规则