mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 11:10:54 +03:00
fix(i2c_master): yield from ISR when no matching device is found
`i2c_master_isr_handler_default()` may set HPTaskAwoken to pdTRUE via `xQueueSendFromISR()` (event_queue), `xSemaphoreTakeFromISR()` and `xSemaphoreGiveFromISR()` on `bus_lock_mux`. When the device list lookup returns no matching device, the function returned directly, skipping the `portYIELD_FROM_ISR()` at the bottom of the handler. A higher- priority task waiting on the bus mux or the event queue would then have to wait for the next scheduler tick instead of being preempted into immediately, inflating worst-case event latency. Replace the early return with a goto to the existing yield check at the end of the ISR. Merges https://github.com/espressif/esp-idf/pull/18569
This commit is contained in:
@@ -827,7 +827,10 @@ static void i2c_master_isr_handler_default(void *arg)
|
|||||||
}
|
}
|
||||||
xSemaphoreGiveFromISR(i2c_master->bus_lock_mux, &HPTaskAwoken);
|
xSemaphoreGiveFromISR(i2c_master->bus_lock_mux, &HPTaskAwoken);
|
||||||
if (i2c_dev == NULL) {
|
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 = {
|
i2c_master_event_data_t evt = {
|
||||||
.event = i2c_master->event,
|
.event = i2c_master->event,
|
||||||
@@ -865,6 +868,7 @@ static void i2c_master_isr_handler_default(void *arg)
|
|||||||
xSemaphoreGiveFromISR(i2c_master->cmd_semphr, &HPTaskAwoken);
|
xSemaphoreGiveFromISR(i2c_master->cmd_semphr, &HPTaskAwoken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
if (HPTaskAwoken == pdTRUE) {
|
if (HPTaskAwoken == pdTRUE) {
|
||||||
portYIELD_FROM_ISR();
|
portYIELD_FROM_ISR();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user