PIC32,中断之间的差异
PIC32, Differences between Interrupts
INTDisableInterrupts() 和 INTEnableSystemMultiVectoredInt() 和 asm volatile ("di") 有什么区别
Pic32中有"normal"个中断和"Vectored"个中断。如果你不熟悉 Pic32,"vectored" 意味着每个中断都有它自己的中断处理函数。你可以有一个 UART 中断函数和另一个 RS232 (UART) 函数,...
您不必再将所有内容都放在 'high priority' 和 'low priority' 中断中。
所以:
INTDisableInterrupts() 将简单地禁用中断。这将调用 "di".
"di" : 在 assmebler 中简单地禁用中断。
INTEnableSystemMultiVectoredInt() 将让您的 PIC32 对所有中断使用不同的函数。如果您没有为每个中断提供中断处理程序函数,那么它们似乎被禁用了。但是,您的中断未被禁用,如果您为矢量中断编写处理程序,您的图片将使用它。
更新:
@newb7777
回答您的问题:
如果你只有一个中断(不是向量化的),那么你有一个大函数必须检查所有 "Interrupt Flag register" 以了解导致中断的原因并处理正确的代码。
如果您有 'vectored interrupts',那么 PIC 的行为与大多数处理器一样(它们几乎都有向量中断)。当发生会产生中断的事情时,寄存器会更改值。例如一个将被称为 "UART_1_Rx_Received"。在执行一条指令之前,处理器会发现这个标志是打开的,如果 'Interrupt enable register' 和 'global interrupt enable register' 都打开,那么中断函数将被调用。请注意,所有中断也有优先级。如果高优先级中断是 运行 那么它永远不会被 <= 优先级的中断打断。如果低优先级中断是 运行,则更高优先级中断可以中断它。
但是,您不应该丢失中断,因为如果来自 UART 的字节会生成低优先级中断,而高优先级中断是 运行,则该标志仍将被设置。当高优先级的中断结束后,再执行低优先级的中断。
那为什么要禁用中断呢?禁用中断的主要原因是:
- 中断改变变量的值。如果代码循环:
for(i=0;i==BufferSize;i++)
并且你的中断在这个循环执行时改变了 BufferSize 的值,然后循环可以永远执行(如果 BufferSize 从 100 变为 2 而我的值为 99 那么我很长一段时间都不会回到 2 ...)。在这种情况下,您可能希望在执行循环之前禁用中断。
另一个原因可能是您想在时间很重要的情况下执行某些操作。
另一个原因是,有时,MCU 需要您以特定顺序执行一些指令来解锁某些错误执行的危险指令,因此您不希望在过程中间出现中断。
如果您有一个从中断接收字节的循环缓冲区,并且您从代码中汇集该缓冲区,那么您要确保在从缓冲区中删除变量之前禁用中断,以确保变量在您读取它们时不会更改。
禁用中断的原因有很多,请记住,您还可以为中断内外使用的全局变量创建一个 "volatile" 变量。
最后一件事要回答你的问题:如果你的 UART 以 115,200 波特率进入的每个字节都有一个中断,并且你有一个需要很长时间才能执行的中断函数,那么可能会错过一两个字节。在那种情况下,如果你幸运的话,有一个硬件缓冲区可以让你获得它们,但也有可能没有,你会在你的通信端口中丢失字节。中断必须始终尽可能短。如果可能,在中断中设置一个标志并在中断之外的主循环中进行处理。当您有多个中断级别时,始终对可能经常触发的中断使用高优先级,如果中断处理时间较长,则始终使用低优先级。
INTDisableInterrupts() 和 INTEnableSystemMultiVectoredInt() 和 asm volatile ("di") 有什么区别
Pic32中有"normal"个中断和"Vectored"个中断。如果你不熟悉 Pic32,"vectored" 意味着每个中断都有它自己的中断处理函数。你可以有一个 UART 中断函数和另一个 RS232 (UART) 函数,... 您不必再将所有内容都放在 'high priority' 和 'low priority' 中断中。
所以: INTDisableInterrupts() 将简单地禁用中断。这将调用 "di".
"di" : 在 assmebler 中简单地禁用中断。
INTEnableSystemMultiVectoredInt() 将让您的 PIC32 对所有中断使用不同的函数。如果您没有为每个中断提供中断处理程序函数,那么它们似乎被禁用了。但是,您的中断未被禁用,如果您为矢量中断编写处理程序,您的图片将使用它。
更新:
@newb7777
回答您的问题: 如果你只有一个中断(不是向量化的),那么你有一个大函数必须检查所有 "Interrupt Flag register" 以了解导致中断的原因并处理正确的代码。
如果您有 'vectored interrupts',那么 PIC 的行为与大多数处理器一样(它们几乎都有向量中断)。当发生会产生中断的事情时,寄存器会更改值。例如一个将被称为 "UART_1_Rx_Received"。在执行一条指令之前,处理器会发现这个标志是打开的,如果 'Interrupt enable register' 和 'global interrupt enable register' 都打开,那么中断函数将被调用。请注意,所有中断也有优先级。如果高优先级中断是 运行 那么它永远不会被 <= 优先级的中断打断。如果低优先级中断是 运行,则更高优先级中断可以中断它。
但是,您不应该丢失中断,因为如果来自 UART 的字节会生成低优先级中断,而高优先级中断是 运行,则该标志仍将被设置。当高优先级的中断结束后,再执行低优先级的中断。
那为什么要禁用中断呢?禁用中断的主要原因是: - 中断改变变量的值。如果代码循环:
for(i=0;i==BufferSize;i++)
并且你的中断在这个循环执行时改变了 BufferSize 的值,然后循环可以永远执行(如果 BufferSize 从 100 变为 2 而我的值为 99 那么我很长一段时间都不会回到 2 ...)。在这种情况下,您可能希望在执行循环之前禁用中断。 另一个原因可能是您想在时间很重要的情况下执行某些操作。 另一个原因是,有时,MCU 需要您以特定顺序执行一些指令来解锁某些错误执行的危险指令,因此您不希望在过程中间出现中断。 如果您有一个从中断接收字节的循环缓冲区,并且您从代码中汇集该缓冲区,那么您要确保在从缓冲区中删除变量之前禁用中断,以确保变量在您读取它们时不会更改。
禁用中断的原因有很多,请记住,您还可以为中断内外使用的全局变量创建一个 "volatile" 变量。
最后一件事要回答你的问题:如果你的 UART 以 115,200 波特率进入的每个字节都有一个中断,并且你有一个需要很长时间才能执行的中断函数,那么可能会错过一两个字节。在那种情况下,如果你幸运的话,有一个硬件缓冲区可以让你获得它们,但也有可能没有,你会在你的通信端口中丢失字节。中断必须始终尽可能短。如果可能,在中断中设置一个标志并在中断之外的主循环中进行处理。当您有多个中断级别时,始终对可能经常触发的中断使用高优先级,如果中断处理时间较长,则始终使用低优先级。