标题:
关于单片机的中断嵌套执行的问题
[打印本页]
作者:
Heddea—
时间:
2022-8-20 12:02
标题:
关于单片机的中断嵌套执行的问题
我遇到了一个问题:
按照中断优先级来说,中断的执行会先比较“抢占优先级”,如果前者相同再比较“子优先级”,如果“子优先级”也相同在比较各自的“序号”。
那么如果一个中断函数执行时,该中断又被触发了,两者的优先级都是相同的,此时该如何执行呢?
我了解到的一种说法是虽然两者的优先级相同,但是还是会发生“中断的嵌套”,即前一个同优先级的中断会被后一个中断打断。
如果是这样的话,对于按照一定时间进入一次中断函数的中断一定是无法执行的了,因为该中断会被无限的嵌套下去。
但是如果在以下的使用情景中,中断嵌套还会很大的影响程序的运行吗?
即:通过IO口检测外部的上升沿,进而触发中断,而该上升沿由按键按下产生,按键按下时会产生抖动,如果不进行消抖的话,可能会导致单片机的IO口接收到很多的上升沿信号,进而产生多个中断,但是该种中断的数量是有限的,中断函数也比较简单(这里中断函数的内容即使执行多次对程序也无任何不良影响),所以此时即使产生了多个中断的嵌套,单片机应该也可以快速的将这些嵌套处理完毕,即此时可以将中断嵌套的影响忽略不计。
请问我上面的想法对吗?
作者:
yzwzfyz
时间:
2022-8-22 17:05
本帖最后由 yzwzfyz 于 2022-8-23 08:23 编辑
有头脑,善于思考问题。汝子可教也!
1、中断是不是响应,取决于中断源自己的标记:F。(其它的中断允许、屏蔽不在此讨论,并假设中断源标记是 F)。
对于 F的清除有两种方式(具体看手册):
其一、响应后CPU硬件自动清除。其二响应后需人工清除。
2、在你进入中断程序后(已响应),就不会再响应本源的中断。假如你已清除了F,而这时中断源又动作了,它只能将F置1,无法做任何事,中断N次,也只是将F置1而矣,一次与N次都一样。
3、当你退出中断服务程序后(以RETI为标志),CPU硬件会再次识别F是否为1。是1则再次响应。CPU并不识别中断源动作了多少次,而只识别F是否为1。
4、在你进入中断程序后(已响应),中断源又动作了N次,它只能将F置1,而你在退出中断之前,又做了一个【缺德】的事,清F清0了!这时,你再退出中断服务程序后。程序不会再进入中断,因为CPU看不见F了。
CPU响应中断有以下条件:
1、本源F标记=1。
2、中断被允许。
3、无更高级或同级中断已被响应。
4、当前指令已执行结束(当前指令未执行完不响应)。
5、RETI 的一条指令已被执行(看手册,是否有这一条。一些单片机需要RETI后再执行1-2条指令才能识别到F)。
总结:
1、中断源动作只能使 F=1,并不能让CPU立即响应中断。
2、中断源动作N次,在未被CPU响应之前,只有最后一个起作用,CPU不识别动作次数。
3、中断源动作N次,而中断已被CPU响应,是否再次被响应,取决于本次中断服务程序退出时,F是否为1。当然如果有更高级的中断发生,即使未退出,也被抢了。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1