diff --git a/components/esp_driver_i2c/i2c_master.c b/components/esp_driver_i2c/i2c_master.c index 2f83918a0e7..44ae103373b 100644 --- a/components/esp_driver_i2c/i2c_master.c +++ b/components/esp_driver_i2c/i2c_master.c @@ -765,7 +765,10 @@ static void IRAM_ATTR i2c_master_isr_handler_default(void *arg) } xSemaphoreGiveFromISR(i2c_master->bus_lock_mux, &HPTaskAwoken); if (i2c_dev == NULL) { - return; + // HPTaskAwoken may have been set by xQueueSendFromISR / xSemaphoreTakeFromISR / + // xSemaphoreGiveFromISR above; fall through to the yield check at the end of + // the ISR rather than returning directly. + goto out; } i2c_master_event_data_t evt = { .event = i2c_master->event, @@ -803,6 +806,7 @@ static void IRAM_ATTR i2c_master_isr_handler_default(void *arg) xSemaphoreGiveFromISR(i2c_master->cmd_semphr, &HPTaskAwoken); } +out: if (HPTaskAwoken == pdTRUE) { portYIELD_FROM_ISR(); }