[STM32F1]

关于stm32中断的几个问题,求大神剖析

[复制链接]
7023|24
手机看帖
扫描二维码
随时随地手机跟帖
摩天轮1111|  楼主 | 2015-12-14 01:55 | 显示全部楼层 |阅读模式
本帖最后由 摩天轮1111 于 2015-12-14 01:57 编辑

有这样一个情况,stm32里面假设我有两个中断,a和b,a中断是200hz频率触发一次,b中断是10k频率触发一次,现在优先级a要高,那么但是a中断里面有对传感器读数,需要时间,700us多,现在a触发的时候中断函数没执行玩完,b就会触发的,而且在a还在执行的过程中,b会触发好几次,我问题是,b这个触发了肯定在排队,因为中断标志位没有清除,b是在a执行完之后,只执行一次最近的一次的那个呢,还是把排队的那好几个都执行了,还是执行最早触发的那个,到底执行哪个?
问题二,比如b自己在跑中断时候,一进中断清除中断标志位,但是b执行到一半,b的中断又触发了,譬如定时器中断就可以这样,那么这时候,由于一开始进中断清除了标志位,执行到一半该中断自身又来了,这时候标志位是不是又被置1了?如果想出中断不执行在b中断内部执行时候触发的b中断,是不是出中断时候再清一次中断标志位且延时一点点让硬件清除了中断,然后这样出中断就不会执行b中断发生中间时候触发的那个b中断了?
手机打的,谢谢各位大神,欢迎大家分享自己实验结果
yklstudent| | 2015-12-14 08:56 | 显示全部楼层
这个需要别人去给你做实验?
你自己不会亲自动手实验?

使用特权

评论回复
评论
cw876798173 2018-11-2 14:08 回复TA
666 
摩天轮1111|  楼主 | 2015-12-14 11:14 | 显示全部楼层
yklstudent 发表于 2015-12-14 08:56
这个需要别人去给你做实验?
你自己不会亲自动手实验?

暂时手边没有条件啊,帖子都是手机发的呢,就是突然想到的这个问题,欢迎有经验的朋友分享一下自己的观点大家讨论讨论一下啊,

使用特权

评论回复
摩天轮1111|  楼主 | 2015-12-14 11:15 | 显示全部楼层
上面的话可能没有说清楚,不是让大家去实验我这个东西,就是大家有有过类似的情况的一些实验结果,不吝分享一下啊

使用特权

评论回复
diweo| | 2015-12-14 12:38 | 显示全部楼层
本帖最后由 diweo 于 2015-12-14 12:50 编辑

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

更多内容请看《CM3权威指南》第7,8,9章



使用特权

评论回复
摩天轮1111|  楼主 | 2015-12-14 12:53 | 显示全部楼层
diweo 发表于 2015-12-14 12:38
如果中断发生时,正在处理同级或高优先级异常,或者被掩蔽,则中断不能立即得到响应。此时中断被悬起。中断 ...

谢谢大神的回复,现在正在高铁上,这块还不是十分了解,本人菜鸟一个,针对我描述的情况,大神可否通俗易懂的讲解一下?十分感谢啊,,就是我描述的二情况,我记得原来有做过一次这样的实验,tim定时器中断内读传感器角度值,耗时长,没读完定时器中断又来了,最后仿真看主程序执行到开了定时器中断之后,就没再往下执行了,感觉就像是一直在排队执行中断,我中断服务函数是一进中断就清除标志位

使用特权

评论回复
diweo| | 2015-12-14 13:08 | 显示全部楼层
摩天轮1111 发表于 2015-12-14 12:53
谢谢大神的回复,现在正在高铁上,这块还不是十分了解,本人菜鸟一个,针对我描述的情况,大神可否通俗易 ...

我的理解是这样的:
高优先级a中断执行时,低优先级b中断触发,b中断就会悬起,以后再触发也没用了。因为悬起状态要么0要么1,不会往上加的。等到a处理完成后。b中断例程就会执行,同时硬件上解除悬起状态。

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

使用特权

评论回复
摩天轮1111|  楼主 | 2015-12-14 13:51 | 显示全部楼层
diweo 发表于 2015-12-14 13:08
我的理解是这样的:
高优先级a中断执行时,低优先级b中断触发,b中断就会悬起,以后再触发也没用了。因为 ...

谢谢大神,那我在b中断服务函数内结束时候手工加一句解悬挂程序,就可以保证b执行完之后不会又执行b过程中发生的b了,如果过程中没有b发生,加了这一句解悬程序也没有问题的对吧

使用特权

评论回复
ywlzh| | 2015-12-14 16:13 | 显示全部楼层
一个5ms,一个100us的中断,我的天,不能再硬件上做手脚,让中断次数少一点吗,如果不能,我也没办法了,最好是实践一把,这样处理起来,纠错的快一些

使用特权

评论回复
摩天轮1111|  楼主 | 2015-12-15 12:28 | 显示全部楼层
ywlzh 发表于 2015-12-14 16:13
一个5ms,一个100us的中断,我的天,不能再硬件上做手脚,让中断次数少一点吗,如果不能,我也没办法了,最 ...

是啊,10k的那个是要控制电机的,得要这么快,现在就是在这些问题里面担心上了,其实个人更希望的是电机的那个中断不要被打断,

使用特权

评论回复
摩天轮1111|  楼主 | 2015-12-15 12:39 | 显示全部楼层
diweo 发表于 2015-12-14 13:08
我的理解是这样的:
高优先级a中断执行时,低优先级b中断触发,b中断就会悬起,以后再触发也没用了。因为 ...

     谢谢大神以及热心网友的回复,我现在具体说说应用,小弟这里也很犯难了,小弟对dma接触的不多,只是用个dma的adc这块,感觉好像不占用cpu意思就是adc自己再传输数,cpu也在干自己的事,都是并行的,这里为什么用感觉这个词呢,我不确定dma是不是真的能并行在有些用途下,比如我现在的一个用途,下面正题
    iic传输传感器的数,读一次我实际测试过时间,需要700us之多,我现在想把iic这个读数放到dma中,意思把dma自己去把传感器的数传到一个指定的变量,那么我要用这个变量的频率是200hz,也就是cpu用这个变量,直接就从变量上取了,这样肯定更快,但是前提是,dma使用这个iic传输传感器的值的过程中,cpu会停止工作吗?我没有用dma控制过iic不清楚怎么个流程,但是我读传感器值我用cpu做的话,是有个函数的,我知道如果dma也是在中断里面读传感器值的话,跑了中断函数,那肯定是cpu不能干别的事了,这里就不清楚iic的dma是怎么个回事?是不是和adc一样,它传它转化好的数,我cpu跑我该跑的东西,但是我好像还看到有说法,dma干活时候要占用总线的,这时候cpu就不能占用总线的,不知道是不是这样呢?意思dma哪怕做的事没用中断,直接操作的,而又因为它占用了总线,所以cpu虽然能运算,但是没法控制外设?要等dma释放了总线才能控制外设?,比如控制定时器改变输出的pwm?

使用特权

评论回复
john_lee| | 2015-12-15 14:56 | 显示全部楼层
DMA每次传输占用总线的时间,只有几个时钟周期而已,基本可以忽略。

使用特权

评论回复
diweo| | 2015-12-15 15:58 | 显示全部楼层
摩天轮1111 发表于 2015-12-15 12:39
谢谢大神以及热心网友的回复,我现在具体说说应用,小弟这里也很犯难了,小弟对dma接触的不多,只是 ...

你的理解有点问题。
以STM3210x 为例:
直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。
两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。

注意,是外设请求DMA,然后DMA控制器传输数据,而不是DMA去控制外设!DMA也不是内存,里面是放不进数据的。

IIC的DMA怎么个回事?
假设用IIC来发送一个数组。TxBuff[10];你可以先发送第一个数据,中断后再发送第二个,再中断再发送。。直到10个数据全发完。
假如配置好DMA之后。只要TxE位被置位,它会自己把10个数据全发完。(如果需要,全部发送完成后也可以产生中断)
在DMA传送期间,CPU该干嘛干嘛。

使用特权

评论回复
摩天轮1111|  楼主 | 2015-12-16 09:00 | 显示全部楼层
谢谢楼上大神的讲解,大概有点明白了,十分感谢,我先结贴,又不懂的再请教大神

使用特权

评论回复
摩天轮1111|  楼主 | 2015-12-16 21:39 | 显示全部楼层
diweo 发表于 2015-12-15 15:58
你的理解有点问题。
以STM3210x 为例:
直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储 ...

大神,今天看了点dma这块的介绍,感觉dma好像对我那个iic读传感器的值需要花费700us多的时间好像于事无补?是不是这样,我感觉的读花费700us是因为iic的频率我只做到了360khz,然而数据特别的多,所以传感器把数值发过来在iic总线上传播的时间就有好长好长,用dma也是传感器从总线上把数据传完了,dma可以控制将iic的数据寄存器的值给某一个变量,而这个过程用cpu操作,本身也占的时间在700us里面也是很少的一部分对吧?所以用iic的dma和用cpu来操作iic,这个700us不可能有啥变化,对吗?只是,如果用dma,传感器开始从总线上传数这个过程,cpu不用等待标志位,可以去干别的事情了?传感器传数到iic数据寄存器受到数,这个过程花费的时间最多是这样吗?

使用特权

评论回复
diweo| | 2015-12-17 11:01 | 显示全部楼层
摩天轮1111 发表于 2015-12-16 21:39
大神,今天看了点dma这块的介绍,感觉dma好像对我那个iic读传感器的值需要花费700us多的时间好像于事无补 ...

我一直没有太明白的你的描述。
是不是这样一个情况:
你用一个传感器,这个传感器大约每700us(也可能更短)就产生一个数据,然后它通过IIC接口把数据发送给CPU。
然后你觉得CPU每700us就去操作一下IIC接口,去读这一个数据,感觉太频繁?你想使用DMA,让传感器传过来比如10个数据之后,你(间隔7ms)再一下子处理那10个数据?

使用特权

评论回复
handleMessage| | 2015-12-17 14:46 | 显示全部楼层
对dma接触的不多,看看,学习学习了。。

使用特权

评论回复
摩天轮1111|  楼主 | 2015-12-17 19:13 | 显示全部楼层
diweo 发表于 2015-12-17 11:01
我一直没有太明白的你的描述。
是不是这样一个情况:
你用一个传感器,这个传感器大约每700us(也可能更短 ...

不是的,是这样,可能我没说明白,不好意思,传感器每5ms产生一个数,用iic读取一次数要花费700us,就是传输传感器的数据由于数据较大,光是传输的过程就要要花费700us,也就是每次收数iic通讯维持的时间700us,而就是这个700us时间我觉得太长了,因为你看,我还有别的东西要周期性操作,有个定时器输出pwm的中断是100us一次,如果每5ms内,收这个传感器的数,iic就要占用700us,这个如果是cpu操作读数,cpu就得一直等着iic总线读完了,这700us就不能做别的事情,也就是我希望那个pwm的那个100us这个周期不被打断,不想这个700us读数的时候,其他的事情都在等待,不能做,大概情况就是这样的,大神

使用特权

评论回复
ywlzh| | 2015-12-18 12:42 | 显示全部楼层
摩天轮1111 发表于 2015-12-15 12:28
是啊,10k的那个是要控制电机的,得要这么快,现在就是在这些问题里面担心上了,其实个人更希望的是电机 ...

我曾经用过无刷直流电机,PWM是16.3KHz的,采用霍尔换向,速度3~5m/s,用的触发换相,时间间隔也就30ms左右,没事啊,还能读RFID,其他传感器也行啊,不过用的是ucosii,如果容量够大,你可以考虑一下操作系统,好处就是不在用延时了,延时的时间去做别的事情

使用特权

评论回复
IC201505| | 2015-12-18 17:41 | 显示全部楼层
学习一下

使用特权

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

本版积分规则

38

主题

224

帖子

15

粉丝