espressif / esp-idf

Espressif IoT Development Framework. Official development framework for Espressif SoCs.
Apache License 2.0
12.57k stars 7.02k forks source link

examples: tusb_console( esp tusb console duplicate registration release causing memory leaks ) (IDFGH-12683) #13674

Closed PING020903 closed 3 weeks ago

PING020903 commented 3 weeks ago

Answers checklist.

General issue report

I run the example, just changed the output string

IDF version: 5.1.2

developboard: ESP32-S3

/*
 * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
 *
 * SPDX-License-Identifier: Unlicense OR CC0-1.0
 */

// DESCRIPTION:
// This example contains minimal code to make ESP32-S2 based device
// recognizable by USB-host devices as a USB Serial Device printing output from
// the application.

#include <stdio.h>
#include <stdlib.h>
#include <sys/reent.h>
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "tinyusb.h"
#include "tusb_cdc_acm.h"
#include "tusb_console.h"
#include "sdkconfig.h"

static const char *TAG = "example";

void app_main(void)
{
    /* Setting TinyUSB up */
    ESP_LOGI(TAG, "USB initialization");

    const tinyusb_config_t tusb_cfg = {
        .device_descriptor = NULL,
        .string_descriptor = NULL,
        .external_phy = false, // In the most cases you need to use a `false` value
        .configuration_descriptor = NULL,
    };

    ESP_ERROR_CHECK(tinyusb_driver_install(&tusb_cfg));

    tinyusb_config_cdcacm_t acm_cfg = { 0 }; // the configuration uses default values
    ESP_ERROR_CHECK(tusb_cdc_acm_init(&acm_cfg));

    ESP_LOGI(TAG, "USB initialization DONE");
    while (1) {
        ESP_LOGI(TAG, "log -> uart");
        ESP_LOGW(TAG, "log -> uart");
        ESP_LOGE(TAG, "log -> uart\n");
        vTaskDelay(1000 / portTICK_PERIOD_MS);

        esp_tusb_init_console(TINYUSB_CDC_ACM_0); // log to usb
        ESP_LOGI(TAG, "log -> USB");
        ESP_LOGW(TAG, "log -> USB");
        ESP_LOGE(TAG, "log -> USB\n");
        vTaskDelay(1000 / portTICK_PERIOD_MS);
        esp_tusb_deinit_console(TINYUSB_CDC_ACM_0); // log to uart
    }
}

the function esp_tusb_init_console() and esp_tusb_deinit_console() causes memory leaks

this is my log:

I (14564) USER_app: GPIO 5 is low
I (14564) USER_app: Minimum free heap size: 362480 bytes
I (14564) USER_app: log -> uart
W (14564) USER_app: log -> uart
E (14564) USER_app: log -> uart

I (16564) USER_app: GPIO 5 is low
I (16564) USER_app: Minimum free heap size: 362480 bytes
I (16564) USER_app: log -> uart
W (16564) USER_app: log -> uart
E (16564) USER_app: log -> uart

I (18564) USER_app: GPIO 5 is low
I (18564) USER_app: Minimum free heap size: 362480 bytes
I (18564) USER_app: log -> uart
W (18564) USER_app: log -> uart
E (18564) USER_app: log -> uart

I (20564) USER_app: GPIO 5 is low
I (20564) USER_app: Minimum free heap size: 362480 bytes
I (20564) USER_app: log -> uart
W (20564) USER_app: log -> uart
E (20564) USER_app: log -> uart

I (22564) USER_app: GPIO 5 is low
I (22564) USER_app: Minimum free heap size: 362480 bytes
I (22564) USER_app: log -> uart
W (22564) USER_app: log -> uart
E (22564) USER_app: log -> uart

I (24564) USER_app: GPIO 5 is low
I (24564) USER_app: Minimum free heap size: 362480 bytes
I (24564) USER_app: log -> uart
W (24564) USER_app: log -> uart
E (24564) USER_app: log -> uart

I (26564) USER_app: log -> USB
W (26564) USER_app: log -> USB
E (26564) USER_app: log -> USB

I (28564) USER_app: log -> USB
W (28564) USER_app: log -> USB
E (28564) USER_app: log -> USB

I (30564) USER_app: log -> USB
W (30564) USER_app: log -> USB
E (30564) USER_app: log -> USB

I (32564) USER_app: log -> USB
W (32564) USER_app: log -> USB
E (32564) USER_app: log -> USB

I (2860568) USER_app: log -> USB
W (2860568) USER_app: log -> USB
E (2860568) USER_app: log -> USB

I (2862568) USER_app: log -> USB
W (2862568) USER_app: log -> USB
E (2862568) USER_app: log -> USB

I (6306568) USER_app: log -> USB
W (6306568) USER_app: log -> USB
E (6306568) USER_app: log -> USB

I (6310568) USER_app: log -> USB
W (6310568) USER_app: log -> USB
E (6310568) USER_app: log -> USB

I (6480568) USER_app: GPIO 5 is low
I (6480568) USER_app: Minimum free heap size: 81652 bytes
I (6480568) USER_app: log -> uart
W (6480568) USER_app: log -> uart
E (6480568) USER_app: log -> uart

I (6482568) USER_app: GPIO 5 is low
I (6482568) USER_app: Minimum free heap size: 81564 bytes
I (6482568) USER_app: log -> uart
W (6482568) USER_app: log -> uart
E (6482568) USER_app: log -> uart

I (6484568) USER_app: GPIO 5 is low
I (6484568) USER_app: Minimum free heap size: 81476 bytes
I (6484568) USER_app: log -> uart
W (6484568) USER_app: log -> uart
E (6484568) USER_app: log -> uart

I (6486568) USER_app: GPIO 5 is low
I (6486568) USER_app: Minimum free heap size: 81388 bytes
I (6486568) USER_app: log -> uart
W (6486568) USER_app: log -> uart
E (6486568) USER_app: log -> uart

I (6488568) USER_app: GPIO 5 is low
I (6488568) USER_app: Minimum free heap size: 81300 bytes
I (6488568) USER_app: log -> uart
W (6488568) USER_app: log -> uart
E (6488568) USER_app: log -> uart

I (6506568) USER_app: GPIO 5 is low
I (6506568) USER_app: Minimum free heap size: 80508 bytes
I (6506568) USER_app: log -> uart
W (6506568) USER_app: log -> uart
E (6506568) USER_app: log -> uart

I (6508568) USER_app: GPIO 5 is low
I (6508568) USER_app: Minimum free heap size: 80420 bytes
I (6508568) USER_app: log -> uart
W (6508568) USER_app: log -> uart
E (6508568) USER_app: log -> uart

I (6510568) USER_app: GPIO 5 is low
I (6510568) USER_app: Minimum free heap size: 80332 bytes
I (6510568) USER_app: log -> uart
W (6510568) USER_app: log -> uart
E (6510568) USER_app: log -> uart

I (6512568) USER_app: GPIO 5 is low
I (6512568) USER_app: Minimum free heap size: 80244 bytes
I (6512568) USER_app: log -> uart
W (6512568) USER_app: log -> uart
E (6512568) USER_app: log -> uart

I (6514568) USER_app: GPIO 5 is low
I (6514568) USER_app: Minimum free heap size: 80156 bytes
I (6514568) USER_app: log -> uart
W (6514568) USER_app: log -> uart
E (6514568) USER_app: log -> uart

I (6516568) USER_app: GPIO 5 is low
I (6516568) USER_app: Minimum free heap size: 80068 bytes
I (6516568) USER_app: log -> uart
W (6516568) USER_app: log -> uart
E (6516568) USER_app: log -> uart

I (6518568) USER_app: GPIO 5 is low
I (6518568) USER_app: Minimum free heap size: 79980 bytes
I (6518568) USER_app: log -> uart
W (6518568) USER_app: log -> uart
E (6518568) USER_app: log -> uart

I (6520568) USER_app: GPIO 5 is low
I (6520568) USER_app: Minimum free heap size: 79892 bytes
I (6520568) USER_app: log -> uart
W (6520568) USER_app: log -> uart
E (6520568) USER_app: log -> uart

I (6522568) USER_app: GPIO 5 is low
I (6522568) USER_app: Minimum free heap size: 79804 bytes
I (6522568) USER_app: log -> uart
W (6522568) USER_app: log -> uart
E (6522568) USER_app: log -> uart

I (6524568) USER_app: GPIO 5 is low
I (6524568) USER_app: Minimum free heap size: 79716 bytes
I (6524568) USER_app: log -> uart
W (6524568) USER_app: log -> uart
E (6524568) USER_app: log -> uart

I (6526568) USER_app: GPIO 5 is low
I (6526568) USER_app: Minimum free heap size: 79628 bytes
I (6526568) USER_app: log -> uart
W (6526568) USER_app: log -> uart
E (6526568) USER_app: log -> uart

I (6528568) USER_app: GPIO 5 is low
I (6528568) USER_app: Minimum free heap size: 79540 bytes
I (6528568) USER_app: log -> uart
W (6528568) USER_app: log -> uart
E (6528568) USER_app: log -> uart

There was no memory leak at first, it was a gradual decrease in memory after running for a while. As long as I deactivate the function, there's no memory leak.

tore-espressif commented 3 weeks ago

Thank you for the report @PING020903 ! Fix is here https://github.com/espressif/esp-usb/pull/32