INTDisableInterrupts()和INTEnableSystemMultiVectoredInt()和asm volatile之间有什么区别(" di")
答案 0 :(得分:2)
在Pic32中,有#34;正常"中断和"向量"中断。如果你不熟悉Pic32,那么#34; vectored"表示每个中断都有自己的中断处理函数。你可以有一个UART中断功能和另一个RS232(UART)功能,...... 您无需将所有内容置于“高优先级”状态。和低优先级'中断了。
所以: INTDisableInterrupts()将简单地禁用中断。这将调用" di"。
"二" :简单地在assmebler中禁用中断。
INTEnableSystemMultiVectoredInt()将告诉PIC32对所有中断使用不同的函数。如果没有为每个中断提供中断处理函数,那么它们似乎被禁用了。但是,您的中断未被禁用,如果您为向量中断编写处理程序,您的图片将使用它。
更新:
@ newb7777
回答你的问题: 如果你只有一个中断(没有向量),那么你有一个大功能必须检查所有"中断标志寄存器"知道导致中断的原因并处理正确的代码。
如果你有#vectored中断',那么PIC的行为就像大多数处理器一样(它们几乎都有向量中断)。当发生会产生中断的事情时,寄存器会改变值。例如,一个将被称为" UART_1_Rx_Received"。在执行指令之前,处理器会看到此标志已打开,以及“中断使能寄存器”是否已打开。和全局中断使能寄存器'都是ON,然后将调用中断函数。请注意,所有中断也具有优先级。如果高优先级中断正在运行,则它将永远不会被具有< = priority的中断中断。如果低优先级中断正在运行,则优先级较高的中断可能会中断它。
但是,您不应该丢失中断,因为如果来自UART的字节会产生低优先级中断并且正在运行更高优先级的中断,那么该标志仍将被置位。当优先级较高的中断结束时,将执行较低优先级。
为什么我们禁用中断呢?禁用中断的主要原因是: - 中断改变变量的值。如果代码循环:
for(i=0;i==BufferSize;i++)
并且你的中断会在执行此循环时更改BufferSize的值,然后循环可以永久执行(如果BufferSize从100变为2,而我的值为99,那么我将不会长时间回到2)。 )。在这种情况下,您可能希望在执行循环之前禁用中断。 另一个原因可能是你想要执行时间很重要的事情。 另一个原因是,有时,MCU需要您按特定顺序执行一些指令,以解锁因错误执行而导致危险的事情,因此您不希望在过程中间发生中断。 如果你有一个从中断接收字节的循环缓冲区,你从代码中汇集了那个缓冲区,那么你要确保在从缓冲区中删除变量之前禁用中断,以确保在读取时变量不会发生变化它们。
禁用中断的原因有很多,请记住,您还可以创建一个" volatile"用于在中断之外和之外使用的全局变量的变量。
最后要回答你的问题:如果你的UART中的每个字节都有115,200波特的中断,并且你有一个需要很长时间才能执行的中断函数,那么就有可能错过一个字节或两个。在这种情况下,如果你很幸运,有一个硬件缓冲区允许你获取它们,但也可能没有,你会丢失通信端口中的字节。中断必须始终尽可能短。如果可能,在中断中设置一个标志,并在中断之外的主循环中进行处理。当你有许多中断级别时,总是对可能经常触发的中断使用高优先级,如果中断长时间处理则使用低优先级。