首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PIC32,中断之间的差异

PIC32,中断之间的差异
EN

Stack Overflow用户
提问于 2017-05-17 08:49:51
回答 1查看 328关注 0票数 1

INTDisableInterrupts()、INTEnableSystemMultiVectoredInt()和asm ("di")之间有什么区别?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-07 17:57:33

在Pic32中,有“正常”中断和“向量化”中断。如果您不熟悉Pic32,“向量”意味着每个中断都有自己的中断处理程序功能。您可以有一个用于UART中断的函数和另一个用于RS232 (UART)的函数,你不必再把所有事情放在“高优先级”和“低优先级”中断中了。

因此: INTDisableInterrupts()将简单地禁用中断。这就叫"di“。

"di“:简单地禁用中断,以assmebler表示。

INTEnableSystemMultiVectoredInt()将允许告诉您的PIC32对所有中断使用不同的函数。如果您没有为每个中断提供中断处理程序函数,那么它们似乎被禁用了。但是,您的中断并没有被禁用,如果您为向量化中断编写了一个处理程序,则您的pic将使用它。

更新:

@newb7777 7777

要回答您的问题:如果您只有一个中断(而不是向量化的),那么您就有一个大函数,它必须检查所有的“中断标志寄存器”,以了解造成中断的原因并处理正确的代码。

如果您有“向量化中断”,那么PIC的行为就像大多数处理器一样(它们几乎都有向量化中断)。当发生会产生中断的事件时,寄存器就会更改值。例如,会被称为"UART_1_Rx_Received“的。在执行指令之前,处理器将看到此标志已打开,如果“中断启用寄存器”和“全局中断启用寄存器”都已打开,则将调用中断函数。请注意,所有中断也有优先级。如果一个高优先级的中断正在运行,那么它将永远不会被具有<=优先级的中断所中断。如果一个低优先级的中断正在运行,那么一个较高优先级的中断可能会中断它。

但是,您不应该丢失中断,因为如果一个字节来自UART,该字节将生成一个低优先级的中断,并且正在运行一个较高优先级的中断,那么仍然会设置该标志。当较高优先级的中断结束时,将执行较低的优先级。

那我们为什么要禁用中断呢?禁用中断的主要原因是:-中断更改变量的值。如果代码循环:

代码语言:javascript
复制
for(i=0;i==BufferSize;i++)

当这个循环执行时,您的中断改变了BufferSize的值,那么这个循环就可以永远执行(如果BufferSize从100变为2,而我的值是99,那么在很长一段时间内我不会返回到2)。在这种情况下,在执行循环之前,您可能需要禁用中断。另一个原因可能是你想要执行一些时间是重要的事情。另一个原因是,有时候,MCU需要您以特定的顺序执行几条指令,以解锁错误执行可能会带来危险的东西,因此您不希望在进程中间出现中断。如果有一个循环缓冲区从中断接收字节,并且从代码中池出该缓冲区,那么在从缓冲区中删除变量之前,要确保禁用中断,以确保在读取变量时变量不会更改。

禁用中断有很多原因,请记住,您也可以为在中断内外使用的全局变量创建一个“易失性”变量。

最后一件事要回答你的问题:如果你的UART中的每个字节的中断值为115,200波特,并且有一个中断函数需要很长时间才能执行,那么就有可能遗漏一两个字节。在这种情况下,如果幸运的话,有一个硬件缓冲区可以让您获得它们,但也有可能没有,而且您将丢失通信端口中的字节。中断必须尽可能短。如果可能,在中断中设置一个标志,并在中断外的主循环中进行处理。当您有许多中断级别时,请始终对可能经常触发的中断使用高优先级,如果中断处理时间较长,则使用低优先级。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44019921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档