From f2dfb0cf70feb6138287712e3a07f9f848780f5c Mon Sep 17 00:00:00 2001 From: Konstantin Kondrashov Date: Tue, 4 Jun 2019 12:17:55 +0800 Subject: [PATCH] driver: Add uart and i2c UTs to check ticks_to_wait in some functions --- components/driver/test/test_i2c.c | 64 ++++++++++++++++++++++++++++++ components/driver/test/test_uart.c | 50 +++++++++++++++++++++++ 2 files changed, 114 insertions(+) diff --git a/components/driver/test/test_i2c.c b/components/driver/test/test_i2c.c index 48aea2a4b..96c236dd9 100644 --- a/components/driver/test/test_i2c.c +++ b/components/driver/test/test_i2c.c @@ -506,3 +506,67 @@ static void i2c_slave_repeat_read() } TEST_CASE_MULTIPLE_DEVICES("I2C repeat write test", "[i2c][test_env=UT_T2_I2C][timeout=150]", i2c_master_repeat_write, i2c_slave_repeat_read); + +static volatile bool exit_flag; +static bool test_read_func; + +static void test_task(void *pvParameters) +{ + xSemaphoreHandle *sema = (xSemaphoreHandle *) pvParameters; + + uint8_t *data = (uint8_t *) malloc(DATA_LENGTH); + i2c_config_t conf_slave = i2c_slave_init(); + TEST_ESP_OK(i2c_param_config( I2C_SLAVE_NUM, &conf_slave)); + TEST_ESP_OK(i2c_driver_install(I2C_SLAVE_NUM, I2C_MODE_SLAVE, + I2C_SLAVE_RX_BUF_LEN, + I2C_SLAVE_TX_BUF_LEN, 0)); + while (exit_flag == false) { + if (test_read_func) { + i2c_slave_read_buffer(I2C_SLAVE_NUM, data, DATA_LENGTH, 0); + } else { + i2c_slave_write_buffer(I2C_SLAVE_NUM, data, DATA_LENGTH, 0); + } + } + + free(data); + xSemaphoreGive(*sema); + vTaskDelete(NULL); +} + +TEST_CASE("test i2c_slave_read_buffer is not blocked when ticks_to_wait=0", "[i2c]") +{ + xSemaphoreHandle exit_sema = xSemaphoreCreateBinary(); + exit_flag = false; + + test_read_func = true; + xTaskCreate(test_task, "tsk1", 2048, &exit_sema, 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("i2c_slave_read_buffer is blocked"); + } + TEST_ESP_OK(i2c_driver_delete(I2C_SLAVE_NUM)); +} + +TEST_CASE("test i2c_slave_write_buffer is not blocked when ticks_to_wait=0", "[i2c]") +{ + xSemaphoreHandle exit_sema = xSemaphoreCreateBinary(); + exit_flag = false; + + test_read_func = false; + xTaskCreate(test_task, "tsk1", 2048, &exit_sema, 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("i2c_slave_write_buffer is blocked"); + } + TEST_ESP_OK(i2c_driver_delete(I2C_SLAVE_NUM)); +} diff --git a/components/driver/test/test_uart.c b/components/driver/test/test_uart.c index 370f00ffe..db2146efd 100644 --- a/components/driver/test/test_uart.c +++ b/components/driver/test/test_uart.c @@ -118,6 +118,56 @@ static void uart_config(uint32_t baud_rate, bool use_ref_tick) 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;