fix serial port deadlock startup issue in specific conditions

This commit is contained in:
Alex Lisitsyn
2025-06-12 06:46:48 +01:00
parent 37b80d1702
commit b459a0ee1e

View File

@@ -119,7 +119,7 @@ void mb_port_ser_enable(mb_port_base_t *inst)
mb_port_ser_bus_sema_release(inst); mb_port_ser_bus_sema_release(inst);
ESP_LOGD(TAG, "%s, resume port.", port_obj->base.descr.parent_name); ESP_LOGD(TAG, "%s, resume port.", port_obj->base.descr.parent_name);
// Resume receiver task from known position // 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); (void)mb_port_ser_rx_flush(&port_obj->base);
while(1) { while(1) {
// Workaround to suspend task from known place to avoid dead lock when resume // 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); 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)) { 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); ESP_LOGD(TAG, "%s, UART[%d] event:", port_obj->base.descr.parent_name, port_obj->ser_opts.port);