在非抢占式系统中,ISR完成执行后,即使激活了优先级更高的任务,中断的任务还会继续执行吗?
此答案特定于FreeRTOS,可能与其他RTOS无关。
默认情况下,FreeRTOS是抢占式的。但是,也可以通过FreeRTOSConfig.h中的配置选项将其配置为非抢占式
#define configUSE_PREEMPTION 0
通常,ISR的返回不会触发上下文切换。但在抢占式系统中,这通常是可取的,因此在大多数FreeRTOS示例中,您可以在ISR的末尾看到portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
,如果xHigherPriorityTaskWoken
是pdTRUE
,则会触发上下文切换。
在ISR开始时(由用户手动(将xHigherPriorityTaskWoken
初始化为pdFALSE
,并且可能导致上下文切换的操作,如vTaskNotifyGiveFromISR()
、xQueueSendToBackFromISR()
等,将其作为自变量,如果系统调用后需要上下文切换,则将其设置为pdTRUE
。
在非抢占配置中,只需将NULL
而不是xHigherPriorityTaskWoken
传递给此类系统调用,并在ISR结束时执行而不是调用portYIELD_FROM_ISR()
。在这种情况下,即使ISR唤醒了优先级更高的任务,执行也会返回到当前正在运行的任务,并保持不变,直到该任务产生或进行阻塞系统调用。
您可以将ISR收益机制与抢占方法混合使用。例如,即使configUSE_PREEMPTION
为0,您也可以强制ISR进行上下文切换(抢占(,但如果中断/抢占的任务不希望发生这种情况,这可能会导致问题,所以我不建议这样做