您好,马老师。有关对您AVR中断介绍的文章中一个说法的理解
您说:‘AVR中断嵌套处理是通过软件方式实现的。如在B中断服务中,如需要MCU能及时的响应A中断(不是等本次中断返回后再响应),B中断的服务程序应这样设计:(1)B中断的现场保护;(2)屏蔽除A以外其它的中断允许标志;(3)用指令SEI开放允许全局中断;(4)B中断服务;(5)用指令CLI禁止全局中断(6)恢复在本中断程序被屏蔽的中断允许标志;(7)B中断现场恢复;(8)B中断返回。’我想说,如果用c语言的话是否顺序(1)、(7)和(8)均可省略呢?还有顺序(4)B中断服务,是指中断后的相关处理程序吗?
还有一个例子,想请教您。假设我现在是用mega1280,我用了uart0和timer3,timer3我用了溢出中断,且1ms中断相应一次。
显然uart0的中断优先级要高于timer3的溢出中断。我一般写程序的习惯是在响应中断后,在中断处理过程的一开始加cli();在最末尾加sei();为的是排除其他中断的干扰。但现在我的程序要求最先保证uart0的中断响应,所以我在timer3的溢出中断响应处理中,去掉了cli()和sei()。这样就可以使即便程序正在运行在timer3的中断响应中,这时如果有uart0的中断来,就会先去执行uart0的中断。这样一来是否会造成我定时中断响应的不准确呢? 1。"如果用c语言的话是否顺序(1)、(7)和(8)均可省略呢?还有顺序(4)B中断服务,是指中断后的相关处理程序吗?"
答:使用C语言的话,(1)(7)(8)可以省掉,因为C语言的环境本身已经处理了这3个功能。而(4)就是指中断B本身的中断服务程序。
2。".......这样一来是否会造成我定时中断响应的不准确呢?"
答:这个问题应该这样分析:
a)timer3是1ms一次。如果你的uart0中断服务加上timer3的中断服务程序执行时间小与1ms,则不会造成定时中断的响应的不准确,只是当有uart0产生是,本次time3的中断服务会拖后一点时间。
b)但当uart0中断申请稍微早于timer3的中断,或与time3的中断申请同时产生的话,time3的中断申请准确,但响应本次time3中断的时间要延后。
c)我已经讲过,中断服务程序的编写原则之一是“中断服务程序的执行时间仅可能的短”!
你的time3是1ms一次,但如果time3服务程序执行的时间>1ms的话,就是没有中断嵌套,你的time3响应也不准确了。
3)不管使用任何的语言,在中断处理过程的一开始加cli();在最末尾加sei()都是没有必要的。因为AVR的硬件已经自动处理了这些功能。加上这些语句,增加了中断服务程序的执行时间,反而有害。
4)“我在timer3的溢出中断响应处理中,去掉了cli()和sei()。这样就可以使即便程序正在运行在timer3的中断响应中,这时如果有uart0的中断来,就会先去执行uart0的中断。 ”
答:如果在你的系统中只使用了2个中断,这个说法是正确的。但系统中有3个以上的中断,那么在time3中断程序的执行过程中,任何其它的中断申请产生,都将会打断time3的中断。 我明白了,谢谢您这样详细的解释!
页:
[1]