InfiLee 发表于 2013-1-17 21:17:01

请教一个计数器中断执行的小问题,谢谢~

假设定时器计数是从0到100

有一中断是在30发生

中断处理需要10个计数

现在由于关全局中断,攒了一个中断标志位

当开全局中断时,计数为25,此时中断发生,标志位清0

在中断执行的过程中,标志位又置位

那么在这次中断执行完后会立即执行下一次中断吗?还是要等到计数先到100再变0后才执行?

看完手册后,我个人倾向于会连续执行第二次中断,不知道对不对,请指教,谢谢啦~!

xinhoujue 发表于 2013-1-17 21:36:34

你说的是 中断嵌套,一般要看中断级别的。

InfiLee 发表于 2013-1-17 21:42:10

xinhoujue 发表于 2013-1-17 21:36 static/image/common/back.gif
你说的是 中断嵌套,一般要看中断级别的。

我的意思是假设只有一个中断

程序正在执行中断函数时,匹配值又满足了,则这时候标志位又置位

但由于AVR默认关闭中断嵌套,所以第二次中断必须等第一次中断执行完成后才可以执行

那么第二次执行的时间呢?第一次是25开始,35结束,第二次是35之后几个计数就立即开始执行?还是要等到计数先翻到100,清0后再开始执行?

yklstudent 发表于 2013-1-17 22:51:48

我感觉完美听不懂 我真是太菜了

MiniCat 发表于 2013-1-18 09:16:46

我也感觉听着云里雾里的,在仔细研究下楼主的逻辑

InfiLee 发表于 2013-1-18 12:57:19

yklstudent 发表于 2013-1-17 22:51 static/image/common/back.gif
我感觉完美听不懂 我真是太菜了

再整理一下。。。

整个程序有且只有 计数器t 的 匹配中断a,对应的中断函数是 aF

程序开始关掉了全局中断,但是 t 仍然在跑,那么 a 的 标志位f 一直处于置位状态

到这里没问题吧?

这个时候打开了全局中断,那么甭管现在 t 跑到什么计数了,由于 f 置位,应该立即发生一次 a ,执行 aF

这里也没问题吧?

假设 t 的计数是从0加到100再清0, a 的匹配值是30,从开始执行 aF 到执行完毕 t 能够跑10个计数

aF 在执行的时候 t 仍然在跑,即若正常来讲,计数为30的时候 aF 开始执行, 40的时候 aF 执行完

这里没问题吧?

进一步假设,前面开全局中断的时候,计数跑到了25,这个时候必须得执行 aF 吧,

但是 aF 要跨10个计数啊,那在它执行的时候,t 继续跑到了 30,则刚刚被清0的 f 又置位了

对不对?

那么第一次中断应该是从25执行到了35结束,问题来了,第二次呢?是从大概36、37亦或是再往后几个计数开始,还是要等到 t 先跑到100(走完这一趟之后)再发生中断?

啊。。。貌似又讲不清楚了。。。郁闷。。。

InfiLee 发表于 2013-1-18 12:58:12

MiniCat 发表于 2013-1-18 09:16 static/image/common/back.gif
我也感觉听着云里雾里的,在仔细研究下楼主的逻辑

给上面的朋友写了个再整理,麻烦这位朋友也看下,不过可能还是云里雾里。。。

InfiLee 发表于 2013-1-18 12:58:45

jswd0810 发表于 2013-1-18 11:56 static/image/common/back.gif
我的理解也是执行第二次中断,因为你没有清标志位

对的,但是观察到的现象很奇怪,解释不通,郁闷。。。

yw1213 发表于 2013-1-19 04:45:55

好吧,手册写的有

要么你手动 tccn =0,要么计数器溢出后再从0开始计数到匹配值才产生中断。

或者说我理解有误?

yw1213 发表于 2013-1-19 05:03:26

yw1213 发表于 2013-1-19 04:45 static/image/common/back.gif
好吧,手册写的有

要么你手动 tccn =0,要么计数器溢出后再从0开始计数到匹配值才产生中断。


好吧,刚刚又看了下手册,
任一中断发生时全局中断使能位 I 被清零,从而禁止了所有其他的中断。用户软件可以在 中断程序里置位 I 来实现中断嵌套。此时所有的中断都可以中断当前的中断服务程序。执 行 RETI 指令后 I 自动置位。
AVR 退出中断后总是回到主程序并至少执行一条指令才可以去执行其他被挂起的中断。

yw1213 发表于 2013-1-19 05:08:49

就是说,也就是你开全局中断后的第一,二次不正常,后面的就正常了,除非你还开了其它中断或者说在中断程序里开了全局中断造成中断嵌套。

InfiLee 发表于 2013-2-2 13:44:50

yw1213 发表于 2013-1-19 05:08 static/image/common/back.gif
就是说,也就是你开全局中断后的第一,二次不正常,后面的就正常了,除非你还开了其它中断或者说在中断程序 ...

握手,理解是一致的,用白话讲第一次不正常是因为憋了好久;第二次不正常是因为本该正常的时候被第一次影响了~~~
页: [1]
查看完整版本: 请教一个计数器中断执行的小问题,谢谢~