Przeglądaj źródła

Merge branch 'bugfix/select_driver_not_installed' into 'master'

VFS: Check in select() if the UART driver is installed or not

Closes IDFGH-2540

See merge request espressif/esp-idf!7331
Angus Gratton 6 lat temu
rodzic
commit
e0fe136bf9

+ 11 - 0
components/driver/include/driver/uart.h

@@ -109,6 +109,17 @@ esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_b
  */
 esp_err_t uart_driver_delete(uart_port_t uart_num);
 
+/**
+ * @brief Checks whether the driver is installed or not
+ *
+ * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1).
+ *
+ * @return
+ *     - true  driver is installed
+ *     - false driver is not installed
+ */
+bool uart_is_driver_installed(uart_port_t uart_num);
+
 /**
  * @brief Set UART data bits.
  *

+ 6 - 3
components/driver/uart.c

@@ -1355,8 +1355,6 @@ err:
     return r;
 }
 
-int a = 0;
-
 //Make sure no other tasks are still using UART before you call this function
 esp_err_t uart_driver_delete(uart_port_t uart_num)
 {
@@ -1410,6 +1408,11 @@ esp_err_t uart_driver_delete(uart_port_t uart_num)
     return ESP_OK;
 }
 
+bool uart_is_driver_installed(uart_port_t uart_num)
+{
+    return uart_num < UART_NUM_MAX && (p_uart_obj[uart_num] != NULL);
+}
+
 void uart_set_select_notif_callback(uart_port_t uart_num, uart_select_notif_callback_t uart_select_notif_callback)
 {
     if (uart_num < UART_NUM_MAX && p_uart_obj[uart_num]) {
@@ -1538,4 +1541,4 @@ esp_err_t uart_set_loop_back(uart_port_t uart_num, bool loop_back_en)
     UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_ERR_INVALID_ARG);
     uart_hal_set_loop_back(&(uart_context[uart_num].hal), loop_back_en);
     return ESP_OK;
-}
+}

+ 8 - 0
components/vfs/vfs_uart.c

@@ -433,6 +433,14 @@ static esp_err_t uart_start_select(int nfds, fd_set *readfds, fd_set *writefds,
     const int max_fds = MIN(nfds, UART_NUM);
     *end_select_args = NULL;
 
+    for (int i = 0; i < max_fds; ++i) {
+        if (FD_ISSET(i, readfds) || FD_ISSET(i, writefds) || FD_ISSET(i, exceptfds)) {
+            if (!uart_is_driver_installed(i)) {
+                return ESP_ERR_INVALID_STATE;
+            }
+        }
+    }
+
     uart_select_args_t *args = malloc(sizeof(uart_select_args_t));
 
     if (args == NULL) {