打印
[STM32F1]

到底执行哪个?

[复制链接]
393|40
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zwll|  楼主 | 2022-8-6 14:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
假设我有两个中断,a和b,a中断是200hz频率触发一次,b中断是10k频率触发一次,现在优先级a要高,那么但是a中断里面有对传感器读数,需要时间,700us多,现在a触发的时候中断函数没执行玩完,b就会触发的,而且在a还在执行的过程中,b会触发好几次,我问题是,b这个触发了肯定在排队,因为中断标志位没有清除,b是在a执行完之后,只执行一次最近的一次的那个呢,还是把排队的那好几个都执行了,还是执行最早触发的那个,到底执行哪个?

使用特权

评论回复
沙发
zwll|  楼主 | 2022-8-6 14:41 | 只看该作者
比如b自己在跑中断时候,一进中断清除中断标志位,但是b执行到一半,b的中断又触发了,譬如定时器中断就可以这样,那么这时候,由于一开始进中断清除了标志位,执行到一半该中断自身又来了,这时候标志位是不是又被置1了?如果想出中断不执行在b中断内部执行时候触发的b中断,是不是出中断时候再清一次中断标志位且延时一点点让硬件清除了中断,然后这样出中断就不会执行b中断发生中间时候触发的那个b中断了?

使用特权

评论回复
板凳
dengdc| | 2022-8-6 14:50 | 只看该作者

这个需要别人去给你做实验?
你自己不会亲自动手实验?

使用特权

评论回复
地板
andygirl| | 2022-8-6 14:51 | 只看该作者
我看蒙了

使用特权

评论回复
5
zwll|  楼主 | 2022-8-6 14:52 | 只看该作者
暂时手边没有条件

使用特权

评论回复
6
llljh| | 2022-8-6 14:55 | 只看该作者
什么意思?不是很明白你说的什么,能再解释一下这个现象吗

使用特权

评论回复
7
zwll|  楼主 | 2022-8-6 15:06 | 只看该作者
上面的话可能没有说清楚,不是让大家去实验我这个东西,就是大家有有过类似的情况的一些实验结果,不吝分享一下啊

使用特权

评论回复
8
diweo| | 2022-8-6 15:07 | 只看该作者
不管当前在执行什么代码,只要更高优先级的中断被触发(中断标志位悬起,且中断使能),就会执行更高优先级的代码。

假设你B中断执行到一半,中断标记位已经清除,A中断触发。
因为A中断优先级更高,但执行时间较长,有可能这期间B中断又触发多次,但标记位只能悬起,不能计数,所以不管多少次都只算一次。
A中断执行完成后,B中断从上次的位置继续执行,直至退出。刚退出,NVIC发现B的标志位还悬着,就立即再次执行B中断函数。

使用特权

评论回复
9
dingy| | 2022-8-6 15:09 | 只看该作者
如果中断发生时,正在处理同级或高优先级异常,或者被掩蔽,则中断不能立即得到响应。此时中断被悬起。中断的悬起状态可以通过“中断设置悬起寄存器(SETPEND)”和“中断悬起清除寄存器(CLRPEND)”来读取,还可以写它们来手工悬起中断。。
每个外部中断都有一个活动状态位。在处理器执行了其ISR的第一条指令后,它的活动位就被置1,并且直到ISR返回时才硬件清零。由于支持嵌套,允许高优先级异常抢占某个ISR。然而,哪怕中断被抢占,其活动状态也依然为1(请仔细琢磨前文讲到的“直到ISR返回时才清零)。。
相同的异常是不允许重入的。因为每个异常都有自己的优先级,并且在异常处理期间,同级或低优先级的异常是要阻塞的。因此对于同一个异常,只有在上次实例的服务例程执行完毕后,方可继续响应新的请求。

使用特权

评论回复
10
zwll|  楼主 | 2022-8-6 15:11 | 只看该作者
我记得原来有做过一次这样的实验,tim定时器中断内读传感器角度值,耗时长,没读完定时器中断又来了,最后仿真看主程序执行到开了定时器中断之后,就没再往下执行了

使用特权

评论回复
11
wyjie| | 2022-8-6 15:14 | 只看该作者
感觉就像是一直在排队执行中断

使用特权

评论回复
12
zwll|  楼主 | 2022-8-6 15:16 | 只看该作者
我中断服务函数是一进中断就清除标志位

使用特权

评论回复
13
morrisk| | 2022-8-6 15:18 | 只看该作者
我的理解是这样的:
高优先级a中断执行时,低优先级b中断触发,b中断就会悬起,以后再触发也没用了。因为悬起状态要么0要么1,不会往上加的。等到a处理完成后。b中断例程就会执行,同时硬件上解除悬起状态。

在b例程执行过程中,如果又来一个b中断,那么会再次悬起,等例程退出后,又会被执行次。所以如果要忽略这一次中断,在前一次例程结束前应该手动解悬。(清除标志位应该是没用的。)

使用特权

评论回复
14
zwll|  楼主 | 2022-8-6 16:50 | 只看该作者
谢谢大神,那我在b中断服务函数内结束时候手工加一句解悬挂程序,就可以保证b执行完之后不会又执行b过程中发生的b了,如果过程中没有b发生,加了这一句解悬程序也没有问题的对吧

使用特权

评论回复
15
supernan| | 2022-8-6 16:52 | 只看该作者
一个5ms,一个100us的中断,我的天,不能再硬件上做手脚,让中断次数少一点吗,如果不能,我也没办法了,最好是实践一把,这样处理起来,纠错的快一些

使用特权

评论回复
16
zwll|  楼主 | 2022-8-6 16:56 | 只看该作者
是啊,10k的那个是要控制电机的,得要这么快,现在就是在这些问题里面担心上了,其实个人更希望的是电机的那个中断不要被打断,

使用特权

评论回复
17
zwll|  楼主 | 2022-8-6 16:59 | 只看该作者
对dma接触的不多,只是用个dma的adc这块,感觉好像不占用cpu意思就是adc自己再传输数,cpu也在干自己的事,都是并行的,这里为什么用感觉这个词呢,我不确定dma是不是真的能并行在有些用途下

使用特权

评论回复
18
zwll|  楼主 | 2022-8-6 17:01 | 只看该作者
比如我现在的一个用途,下面正题
    iic传输传感器的数,读一次我实际测试过时间,需要700us之多,我现在想把iic这个读数放到dma中,意思把dma自己去把传感器的数传到一个指定的变量,那么我要用这个变量的频率是200hz,也就是cpu用这个变量,直接就从变量上取了,这样肯定更快,但是前提是,dma使用这个iic传输传感器的值的过程中,cpu会停止工作吗?

使用特权

评论回复
19
wyjie| | 2022-8-6 17:04 | 只看该作者
用dma控制过iic吗

使用特权

评论回复
20
zwll|  楼主 | 2022-8-6 17:06 | 只看该作者
清楚怎么个流程,但是我读传感器值我用cpu做的话,是有个函数的,我知道如果dma也是在中断里面读传感器值的话,跑了中断函数,那肯定是cpu不能干别的事了,这里就不清楚iic的dma是怎么个回事?

使用特权

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

本版积分规则

885

主题

11314

帖子

5

粉丝