打印
[开发资料]

mcu短时间内发生多次中断,如何解决中断丢失问题?

[复制链接]
2847|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jcky001|  楼主 | 2024-2-6 16:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题
嵌入式开发中,如果中断A的处理函数执行时间长,某段时间内,快速来了2个中断A(例如:外部管脚输入信号变化),则会导致第2个中断丢失。

我有几个疑问:
1.目前市面上的芯片,是否支持缓存中断标志?例如:中断A在短时间内触发了3次,但是CPU来不及响应(中断A的执行函数时间长,或者正在执行更高优先级的中断),CPU能否记住这3次中断?如果有,目前最多支持缓存几次中断标志?

2.如果没有中断标志位缓存机制,必须保证下一次中断到来之前,处理完本次中断?

3.能否在中断A响应的最初阶段,清除中断A的标志(芯片自动清除or中断处理函数中清除)。此时如果再来一次中断A,芯片会置位中断A的标志位,则理论上可以缓存2次中断标志?

网友的回复总结:
使用异步处理的方式

——中断来了之后,只做中断的记录,不做中断服务的处理。


就好比我们写单片机程序,在中断服务程序里面有一个变量不断增加,然后另外有一个主程序在不断的while 判断处理。

测量中断服务函数执行时间,是否足够小,比如小于5us,如果中断处理程序占用的耗时太大,就必须要优化。

在Linux里面有中断的上半部和下半部,上半部就是处理比较及时的事情,下半部处理比较耗时的操作。

还有在使用中断的时候,如果是已经在处理中,进入中断的第一件事情就是关闭中断,避免中断处理过程中又被中断打断代码执行。

——中断有没有必要增加一个缓存?

缓存是一个好东西,但是缓存了就一定会导致中断的不足够及时,比如中断的思想是,我要上厕所,我现在就必须现在上厕所。前面说的我,就是「中断」,那如何设计一个中断缓存,成了一个有意思的话题,中断服务程序需要做的事情就是不断的往这个缓存里面扔东西,另外需要一个线程不断的从缓存里面拿东西来处理,直到缓存为空。

——当然,缓存也有缓存的问题,所以看到有人在回复

「--- 目前没有芯片实现缓存,中断只有已触发标志和已清除标志,并没有触发了几次的信息」

缓存是软件的思想,CPU部分可不想考虑这么低级的事情。

———如果没有中断标志位缓存机制,必须保证下一次中断到来之前,处理完本次中断?

上面提到一个做法是,在进入中断的时候关闭中断,那还有就是,在进入中断的时候,先清除当前的中断标识位,然后去做处理,如果在处理过程中又有中断产生了,中断标志位就会置位,那在退出中断后又会重新进入中断。

通过上面的方法,就可以起到缓存 1 个中断的目的,相当于有一个buff,可以处理2次中断。



使用特权

评论回复
沙发
中国龙芯CDX| | 2024-2-16 13:49 | 只看该作者
中断优先级加嵌套计数

使用特权

评论回复
板凳
jf101| | 2024-2-18 08:50 | 只看该作者
中断丢失应该有一个确认中断的情况,这样才能确认是否丢失

使用特权

评论回复
地板
AdaMaYun| | 2024-2-18 13:50 | 只看该作者
在进入中断的时候,先清除当前的中断标识位,然后去做处理

使用特权

评论回复
5
小夏天的大西瓜| | 2024-2-21 22:12 | 只看该作者
缓存是软件的思想,CPU部分可不想考虑这么低级的事情

使用特权

评论回复
6
星辰大海不退缩| | 2024-2-21 22:38 | 只看该作者
在中断服务程序里面有一个变量不断增加,然后另外有一个主程序在不断的while 判断处理。

使用特权

评论回复
7
小小蚂蚁举千斤| | 2024-2-22 10:21 | 只看该作者
中断缓存的服务程序需要做的事情就是不断的往这个缓存里面扔东西,另外需要一个线程不断的从缓存里面拿东西来处理,直到缓存为空。

使用特权

评论回复
8
szt1993| | 2024-2-25 16:26 | 只看该作者
嵌入式开发中,如果中断A的处理函数执行时间长,某段时间内,快速来了2个中断A(例如:外部管脚输入信号变化),则会导致第2个中断丢失。

使用特权

评论回复
9
p0gon9y| | 2024-5-18 07:56 | 只看该作者
确保中断的优先级设置正确。如果多个中断同时发生,优先级较高的中断会被优先处理,以避免较低优先级的中断被丢失

使用特权

评论回复
10
q1d0mnx| | 2024-5-18 09:06 | 只看该作者
某些MCU支持中断嵌套功能,即在一个中断处理程序中允许发生更高优先级的中断。通过合理设置中断嵌套,可以确保高优先级中断的及时处理,避免中断丢失

使用特权

评论回复
11
ex7s4| | 2024-5-18 10:17 | 只看该作者
在中断处理程序中,及时清除中断标志位。这样可以确保下一个中断事件发生时,中断标志位已经被清除,从而不会丢失中断

使用特权

评论回复
12
suw12q| | 2024-5-18 11:25 | 只看该作者
对于需要处理大量中断的情况,可以使用中断缓冲区。当中断发生时,将中断信息存储在缓冲区中,然后在主循环中逐个处理中断。这样可以避免中断处理程序过于繁忙,导致中断丢失

使用特权

评论回复
13
l1uyn9b| | 2024-5-18 12:26 | 只看该作者
在某些情况下,可以通过屏蔽一些不必要的中断来减少中断的数量,从而降低中断丢失的风险

使用特权

评论回复
14
lamanius| | 2024-5-19 08:00 | 只看该作者
你说的中断丢失就是你中断处理的数据时间太长了,优化一下代码吧

使用特权

评论回复
15
q1ngt12| | 2024-5-19 09:13 | 只看该作者
感觉可以实现中断嵌套,可能会好点

使用特权

评论回复
16
g0d5xs| | 2024-5-19 10:28 | 只看该作者
用操作系统OS的啊,可以解决你说的问题

使用特权

评论回复
17
su1yirg| | 2024-5-19 12:07 | 只看该作者
一般丢失的话,是不是你中断等待时间太长了啊?

使用特权

评论回复
18
LOVEEVER| | 2024-5-21 17:00 | 只看该作者
中断丢失是不有其他的问题导致中断无法进行吧

使用特权

评论回复
19
forgot| | 2024-5-22 15:12 | 只看该作者
中断优先级设计好

使用特权

评论回复
20
逢dududu必shu| | 2024-8-17 01:09 | 只看该作者
如果中断频率过高,可以通过硬件或软件去抖动技术减少伪中断。

使用特权

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

本版积分规则

1506

主题

4536

帖子

6

粉丝