From b459a0ee1e682777900505d1e6550b43fdbed56d Mon Sep 17 00:00:00 2001 From: Alex Lisitsyn Date: Thu, 12 Jun 2025 06:46:48 +0100 Subject: [PATCH] fix serial port deadlock startup issue in specific conditions --- modbus/mb_ports/serial/port_serial.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modbus/mb_ports/serial/port_serial.c b/modbus/mb_ports/serial/port_serial.c index ed76a40..1f9459c 100644 --- a/modbus/mb_ports/serial/port_serial.c +++ b/modbus/mb_ports/serial/port_serial.c @@ -119,7 +119,7 @@ void mb_port_ser_enable(mb_port_base_t *inst) mb_port_ser_bus_sema_release(inst); ESP_LOGD(TAG, "%s, resume port.", port_obj->base.descr.parent_name); // Resume receiver task from known position - vTaskResume(port_obj->task_handle); + xTaskNotifyGive(port_obj->task_handle); } } @@ -142,9 +142,9 @@ static void mb_port_ser_task(void *p_args) (void)mb_port_ser_rx_flush(&port_obj->base); while(1) { // Workaround to suspend task from known place to avoid dead lock when resume - if (!atomic_load(&(port_obj->enabled))) { + while (!atomic_load(&(port_obj->enabled))) { ESP_LOGI(TAG, "%s, suspend port from task.", port_obj->base.descr.parent_name); - vTaskSuspend(NULL); + ulTaskNotifyTake(pdTRUE, portMAX_DELAY); } if (xQueueReceive(port_obj->uart_queue, (void *)&event, MB_SERIAL_RX_TOUT_TICKS)) { ESP_LOGD(TAG, "%s, UART[%d] event:", port_obj->base.descr.parent_name, port_obj->ser_opts.port);