uart_driver_install(UART_NUM1, BUF_SIZE * 2, BUF_SIZE * 2, 20, NULL, 0);
}
+static volatile bool exit_flag;
+
+static void test_task(void *pvParameters)
+{
+ xSemaphoreHandle *sema = (xSemaphoreHandle *) pvParameters;
+ char* data = (char *) malloc(256);
+
+ while (exit_flag == false) {
+ uart_tx_chars(UART_NUM1, data, 256);
+ // The uart_wait_tx_done() function does not block anything if ticks_to_wait = 0.
+ uart_wait_tx_done(UART_NUM1, 0);
+ }
+
+ free(data);
+ xSemaphoreGive(*sema);
+ vTaskDelete(NULL);
+}
+
+static void test_task2(void *pvParameters)
+{
+ while (exit_flag == false) {
+ // This task obstruct a setting tx_done_sem semaphore in the UART interrupt.
+ // It leads to waiting the ticks_to_wait time in uart_wait_tx_done() function.
+ uart_disable_intr_mask(UART_NUM1, UART_TX_DONE_INT_ENA_M);
+ }
+ vTaskDelete(NULL);
+}
+
+TEST_CASE("test uart_wait_tx_done is not blocked when ticks_to_wait=0", "[uart]")
+{
+ uart_config(UART_BAUD_11520, false);
+
+ xSemaphoreHandle exit_sema = xSemaphoreCreateBinary();
+ exit_flag = false;
+
+ xTaskCreate(test_task, "tsk1", 2048, &exit_sema, 5, NULL);
+ xTaskCreate(test_task2, "tsk2", 2048, NULL, 5, NULL);
+
+ printf("Waiting for 5 sec\n");
+ vTaskDelay(5000 / portTICK_PERIOD_MS);
+ exit_flag = true;
+
+ if (xSemaphoreTake(exit_sema, 1000 / portTICK_PERIOD_MS) == pdTRUE) {
+ vSemaphoreDelete(exit_sema);
+ } else {
+ TEST_FAIL_MESSAGE("uart_wait_tx_done is blocked");
+ }
+ TEST_ESP_OK(uart_driver_delete(UART_NUM1));
+}
+
TEST_CASE("test uart get baud-rate","[uart]")
{
uint32_t baud_rate1 = 0;