如果我在其ISR中禁用中断会发生什么?

时间:2010-09-25 00:47:19

标签: microcontroller interrupt interrupt-handling

如果在该中断的ISR中禁用中断会发生什么? 例如,如果我通过USART从缓冲区传输数据并且该缓冲区用完了数据,那么我想暂时停止传输,因此在发送缓冲区中的最后一个字节后,我禁用了中断。

(这是在PIC18F4580上)

PIC18F4580的数据表指出,如果在ISR内部禁用了中断,则“可能会发生不稳定的行为”。

3 个答案:

答案 0 :(得分:4)

我不是特别了解PIC18F4580,而是作为一般规则
在ISR中禁用中断没有任何问题

基本上这将阻止ISR再次被调用(即直到中断以某种方式重新启用),但它不应该影响ISR的逻辑,导致它终止或其他可能有些奇怪的事情。
实际上,ISR通常可以通过禁用中断来启动,以免在服务第一个中断时被中断(从而避免各种重入问题,代价是可能丢失事件)。

当然,您需要计划如何/在何处重新启用中断,如果这对您的程序/逻辑的其余部分很重要。

答案 1 :(得分:1)

免责声明:从PIC32和dsPIC的经验谈到我从PIC18F4580数据表和勘误表(PIC18F4580 References)中读到的内容。

根据PIC18F4580数据手册的中断部分:

  

不要使用MOVFF指令进行修改   任何中断控制寄存器   任何中断都被启用。这样做可能   导致微控制器行为不稳定。

因此,要获得未知行为,您需要修改INTCONx寄存器。正如您指定要在处理程序内切换USART模块的中断启用一样,您不必担心该警告,因为您将更改PIE而不是INTCONx。请注意,PIE寄存器保持特定外设中断的使能。还有一个通用中断使能(GIE),可以一次性屏蔽 ALL 可屏蔽中断。你不想在中断中弄乱这个,因为它应该由处理程序的进入/退出程序(也在寄存器INTCON中)自动处理。

就像mjv所说的那样,在其处理程序中屏蔽USART外设中断是一件非常合理的事情。

答案 2 :(得分:0)

中断停止发生。但为什么这样呢?您是否有计划何时重新启用中断?

如果无事可做,你的ISR什么都不做。