如果在中断的 ISR 中禁用中断会发生什么?
例如,如果我通过 USART 从缓冲区传输数据并且该缓冲区用完数据,那么我想暂时停止传输,因此在发送缓冲区中的最后一个字节后,我禁用中断。
(这是在 PIC18F4580 上)
PIC18F4580 的数据表指出,如果在 ISR 内禁用中断,则“可能会出现异常行为”。
如果在中断的 ISR 中禁用中断会发生什么?
例如,如果我通过 USART 从缓冲区传输数据并且该缓冲区用完数据,那么我想暂时停止传输,因此在发送缓冲区中的最后一个字节后,我禁用中断。
(这是在 PIC18F4580 上)
PIC18F4580 的数据表指出,如果在 ISR 内禁用中断,则“可能会出现异常行为”。
我不具体了解 PIC18F4580,但作为一般规则,
在其 ISR 中禁用中断没有任何问题
本质上,这将阻止 ISR 被再次调用(即直到中断以某种方式重新启用),但它不应该影响 ISR 的逻辑,导致它终止或其他奇怪的事情。
实际上,may ISR 通常会从禁用中断开始,以免它们在服务第一个中断时被中断(从而避免各种重入问题,代价是可能丢失事件)。
当然,如果这对您的程序/逻辑的其余部分很重要,您需要计划如何/在何处重新启用中断。
免责声明:结合我从 PIC18F4580 数据表和勘误表(PIC18F4580 参考资料)中阅读到的 PIC32 和 dsPIC 经验。
根据 PIC18F4580 数据表的中断部分:
当任何中断被使能时,不要使用 MOVFF 指令修改任何中断控制寄存器。这样做可能会导致不稳定的微控制器行为。
因此,要获得这种未知行为,您需要修改 INTCONx 寄存器。当您指定要在处理程序内切换 USART 模块的中断启用时,您不必担心该警告,因为您将更改 PIE 而不是 INTCONx。请注意,PIE 寄存器保持特定外设中断的使能。还有一个通用中断启用 (GIE) 可以一次性屏蔽所有可屏蔽的中断。您不想在中断中弄乱这个,因为它应该由处理程序的进入/退出过程(也在寄存器 INTCON 中)自动为您处理。
所以就像 mjv 所说,在其处理程序中屏蔽 USART 外设中断是一件非常合理的事情。
中断停止发生。但为什么要这样做?您是否有计划何时重新启用中断?
如果无事可做,就让您的 ISR 什么都不做。