ISR在非抢占式系统中执行



在非抢占式系统中,ISR完成执行后,即使激活了优先级更高的任务,中断的任务还会继续执行吗?

此答案特定于FreeRTOS,可能与其他RTOS无关。

默认情况下,FreeRTOS是抢占式的。但是,也可以通过FreeRTOSConfig.h中的配置选项将其配置为非抢占式

#define configUSE_PREEMPTION 0

通常,ISR的返回不会触发上下文切换。但在抢占式系统中,这通常是可取的,因此在大多数FreeRTOS示例中,您可以在ISR的末尾看到portYIELD_FROM_ISR(xHigherPriorityTaskWoken);,如果xHigherPriorityTaskWokenpdTRUE,则会触发上下文切换。

在ISR开始时(由用户手动(将xHigherPriorityTaskWoken初始化为pdFALSE,并且可能导致上下文切换的操作,如vTaskNotifyGiveFromISR()xQueueSendToBackFromISR()等,将其作为自变量,如果系统调用后需要上下文切换,则将其设置为pdTRUE

在非抢占配置中,只需将NULL而不是xHigherPriorityTaskWoken传递给此类系统调用,并在ISR结束时执行而不是调用portYIELD_FROM_ISR()。在这种情况下,即使ISR唤醒了优先级更高的任务,执行也会返回到当前正在运行的任务,并保持不变,直到该任务产生或进行阻塞系统调用。

您可以将ISR收益机制与抢占方法混合使用。例如,即使configUSE_PREEMPTION为0,您也可以强制ISR进行上下文切换(抢占(,但如果中断/抢占的任务不希望发生这种情况,这可能会导致问题,所以我不建议这样做

相关内容

  • 没有找到相关文章

最新更新