[AVR单片机] AVR两个中断同时满足时如何工作?

[复制链接]
8262|20
 楼主| ZRL700424 发表于 2010-8-14 14:00 | 显示全部楼层 |阅读模式
比如:开了两个中断,一个定时器溢出中断,一个串口中断,当两个中断同时产生时,因为定时器溢出中断的级别较高,所以先执行定时器中断,那定时器中断结束后还会执行串口中断吗?
new1988 发表于 2010-8-14 14:29 | 显示全部楼层
当串口中断还有的话就会执行!
 楼主| ZRL700424 发表于 2010-8-14 16:25 | 显示全部楼层
实际是:当我把这两个都打开时,定时溢出中断中的功能会受到影响
 楼主| ZRL700424 发表于 2010-8-14 16:27 | 显示全部楼层
当时问过AVR的技术支持,他说这种情况可能会丢一个中断
123jj 发表于 2010-8-15 09:15 | 显示全部楼层
不会丢中断,先执行定时器中断,因为定时器溢出中断的级别较高,定时器中断结束返回后还执行串口中断。
渤海三叠浪 发表于 2010-8-15 10:03 | 显示全部楼层
普通51的话 不会丢  。

avr这样的 估计也不会丢  ,注意我是估计。

这个帖子你可以看一下  和你的情况不太一样 不过也差不多

https://bbs.21ic.com/viewthread.p ... ;highlight=%2Bxlsbz
望断云山 发表于 2010-8-15 12:09 | 显示全部楼层
事实上很难发生真正意义上的同时,一般都是一先一后,先产生的中断先执行,后产生的中断若级别高就要中断先前的低级中断,后产生的中断若比先前的中断低级,就只有乖乖等待了。若低级中断是一个周期性的中断,而高级中断处理时间超过了低级中断的周期,当然就会丢失低级中断。
sheriff 发表于 2010-8-15 13:29 | 显示全部楼层
6楼的帖子基本可以说明问题了,但有一点不同,51的中断优先级有抢占优先级的概念,而AVR没有抢占优先级概念,它的优先级完全是指当两个中断同时发生时先执行哪个。一旦响应了某个中断,全局中断会自动关闭,这时只要不人为打开全局中断,即使是高优先级中断到来也不可能抢占低优先级中断。如果在响应了某个中断后人为打开了全局中断,即使是低优先级中断到来也能抢占正在执行的高优先级中断。
楼主的问题:只要串口中断的标志没有被人为地清除,在执行完了定时器中断后就会执行串口中断,不会丢失。
mxh0506 发表于 2010-8-15 23:10 | 显示全部楼层
一般情况下不会丢失,未处理的中断会挂起,中断标记登记在相应的寄存器里,等待条件满足时再执行。
但是,如果你的定时器中断处理时间太长,以致其间发生了多次串行中断,那就是非丢不可的了。
 楼主| ZRL700424 发表于 2010-8-16 08:07 | 显示全部楼层
我现在的现象感觉是定时器中断丢了,串口中断正常,这是三年前的一个项目,由于当时时间比较紧,查了两天没查出什么原因,后来怀疑是不是定时器中断丢了,就把串口中断关掉,改在定时器中断中发送和查询,问题就解决了,因为项目很赶,就没有继续查找原因了,现在又在做类似的项目,所以想起来了。
sheriff 发表于 2010-8-16 09:26 | 显示全部楼层
“两个中断同时满足”这件事情本身不会造成中断丢失。如果一个isr时间过长导致关中断的时间过长,可能会造成中断事件overrun,但这跟“两个中断同时满足”没什么必然联系。即使程序中只有一个中断,如果在程序中有较长时间的关中断,同样可能会发生这种情况。如果怀疑是这种情况,可以在占用时间较长的isr的开头加一句SEI试试。
 楼主| ZRL700424 发表于 2010-8-16 11:03 | 显示全部楼层
定时中断250US中断一次,执行时间不超过50US
接收中断和发送中断约468US(波特率为119200),两个中断同一时间只有一个打开,执行时间都不会超过50US
xuyiyi 发表于 2010-8-16 11:27 | 显示全部楼层
按照LS的情形,两个中断全部打开,当同一时间两个中断全部申请中断,也不会丢失一个中断,只是,先响应一个执行一个,执行完了返回后再执行另一个中断。

假如先执行串口中断,延迟了定时器溢出中断的执行,定时溢出中断的精度会受到影响。

如想定时溢出中断的精度不受到影响,只有在定时溢出中断中用查询的方法执行串口数据的输入输出。
 楼主| ZRL700424 发表于 2010-8-16 12:02 | 显示全部楼层
单次定时精度是有些影响,但总和是不受影响的,执行串口中断时定时器溢出了,这次时间会长一点,但下次就会短一点,因为定时器并没有停,一直都在记数
123jj 发表于 2010-8-16 12:35 | 显示全部楼层
定时溢出中断的精度会受到影响。

应该是指其相对即时精度吧。
mxh0506 发表于 2010-8-16 22:05 | 显示全部楼层
如果是在中断服务程序中通过软件重载计数值的溢出定时方式肯定会影响精度的,这种情况下用CTC模式更合适,让硬件自动重载计数值。也许你的定时中断并没“丢”,只是每次延迟一点,积累起来,宏观上中断的总次数就少了。对于周期250us的中断,最坏情况下延迟50us不能忽略不计了。
 楼主| ZRL700424 发表于 2010-8-17 08:02 | 显示全部楼层
CTC模式是比较准确,但通过软件重载也一样能做到吧:
TCNT0 += (256-125);        //重装定时初值
mxh0506 发表于 2010-8-17 12:13 | 显示全部楼层
软件重载的延迟不确定
 楼主| ZRL700424 发表于 2010-8-19 08:47 | 显示全部楼层
软件重载的延迟不确定
mxh0506 发表于 2010-8-17 12:13


只要定时器的分频数足够大,和自动重载就是一模一样的。
xuyiyi 发表于 2010-8-19 09:20 | 显示全部楼层
只要定时器的分频数足够大,和自动重载就是一模一样的。
ZRL700424 发表于 2010-8-19 08:47



软件模拟和硬件自动重载还是有一点区别的,软件模拟易受中断等不确定因素影响。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

675

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部