From d191538f18088fc29c8f6b03d21f53ef34c7016f Mon Sep 17 00:00:00 2001 From: "igor.masar" Date: Thu, 24 Apr 2025 16:11:05 +0200 Subject: [PATCH 001/213] feat(usb/hal): Add support for explicit FIFO configuration Introduce a new HAL API `usb_dwc_hal_set_fifo_config()` that allows advanced users to manually configure RX, Non-Periodic TX, and Periodic TX FIFO sizes. This offers fine-grained control beyond the previous bias-based sizing approach. The HAL function no longer returns `esp_err_t`, and internal validations are enforced via `HAL_ASSERT()`. Responsibility for input validation has been moved to the HCD layer. FIFO configuration must be applied before any USB pipes are created or activated. This feature is intended for use during `usb_host_install()`. If no custom FIFO configuration is provided (i.e., all values are zero), the driver falls back to a bias-based default layout based on Kconfig settings (`CONFIG_USB_HOST_HW_BUFFER_BIAS_*`). Bias resolution is done inside `hcd_port_init()`. The `port_obj_t` structure has been extended with a `fifo_config` field, which stores the configuration to allow re-application after a USB port reset. Obsolete FIFO bias enums (`usb_hal_fifo_bias_t`, `hcd_port_fifo_bias_t`) and related APIs (`hcd_port_set_fifo_bias()`) have been removed in favor of the new structure-based mechanism. The HCD initialization and port reset flow has been updated to use the explicit FIFO configuration. USB Host maintainer documentation (`maintainers.md`) has been updated accordingly. Test cases were updated to remove the usage of removed bias API and now rely on default or custom FIFO configuration. --- components/hal/include/hal/usb_dwc_hal.h | 48 +++--- components/hal/usb_dwc_hal.c | 83 +++++----- components/usb/hcd_dwc.c | 153 +++++++++++++----- components/usb/hub.c | 1 - components/usb/include/usb/usb_host.h | 10 ++ components/usb/maintainers.md | 10 +- components/usb/private_include/hcd.h | 43 ++--- components/usb/test_apps/common/dev_isoc.c | 2 +- .../usb/test_apps/hcd/main/test_hcd_common.c | 1 - .../usb/test_apps/hcd/main/test_hcd_isoc.c | 3 - components/usb/usb_host.c | 19 ++- 11 files changed, 230 insertions(+), 143 deletions(-) diff --git a/components/hal/include/hal/usb_dwc_hal.h b/components/hal/include/hal/usb_dwc_hal.h index d4c880571f7..9314bfdce61 100644 --- a/components/hal/include/hal/usb_dwc_hal.h +++ b/components/hal/include/hal/usb_dwc_hal.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2020-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2020-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -29,15 +29,6 @@ extern "C" { // ----------------------- Configs ------------------------- -/** - * @brief Possible FIFO biases - */ -typedef enum { - USB_HAL_FIFO_BIAS_DEFAULT, /**< Default (balanced) FIFO sizes */ - USB_HAL_FIFO_BIAS_RX, /**< Bigger RX FIFO for IN transfers */ - USB_HAL_FIFO_BIAS_PTX, /**< Bigger periodic TX FIFO for ISOC OUT transfers */ -} usb_hal_fifo_bias_t; - /** * @brief MPS limits based on FIFO configuration * @@ -261,20 +252,35 @@ void usb_dwc_hal_deinit(usb_dwc_hal_context_t *hal); void usb_dwc_hal_core_soft_reset(usb_dwc_hal_context_t *hal); /** - * @brief Set FIFO bias + * @brief Check if FIFO configuration is valid * - * This function will set the sizes of each of the FIFOs (RX FIFO, Non-periodic TX FIFO, Periodic TX FIFO) and must be - * called at least once before allocating the channel. Based on the type of endpoints (and the endpoints' MPS), there - * may be situations where this function may need to be called again to resize the FIFOs. If resizing FIFOs dynamically, - * it is the user's responsibility to ensure there are no active channels when this function is called. + * This function checks that the sum of FIFO sizes does not exceed available space. + * It does not modify hardware state and is safe to call from HAL or upper layers. * - * @note After a port reset, the FIFO size registers will reset to their default values, so this function must be called - * again post reset. - * - * @param[in] hal Context of the HAL layer - * @param[in] fifo_bias FIFO bias configuration + * @param[in] hal Pointer to HAL context (must be initialized) + * @param[in] config Pointer to FIFO config to validate + * @return true if config is valid, false otherwise */ -void usb_dwc_hal_set_fifo_bias(usb_dwc_hal_context_t *hal, const usb_hal_fifo_bias_t fifo_bias); +bool usb_dwc_hal_fifo_config_is_valid(const usb_dwc_hal_context_t *hal, const usb_dwc_hal_fifo_config_t *config); + + +/** + * @brief Set the FIFO sizes of the USB-DWC core + * + * This function programs the FIFO sizing registers (RX FIFO, Non-Periodic TX FIFO, + * and Periodic TX FIFO) based on the provided configuration. It must be called + * during USB initialization, before any channels are allocated or transfers started. + * + * The sum of all FIFO sizes must not exceed the hardware-defined limit + * (see HWCFG3.DfifoDepth and EPINFO_CTL). + * + * @note This function must be called exactly once during initialization and after + * each USB port reset. It is typically used internally by the USB Host stack. + * + * @param[inout] hal Pointer to the HAL context + * @param[in] config Pointer to the FIFO configuration to apply (must be valid) + */ +void usb_dwc_hal_set_fifo_config(usb_dwc_hal_context_t *hal, const usb_dwc_hal_fifo_config_t *config); /** * @brief Get MPS limits diff --git a/components/hal/usb_dwc_hal.c b/components/hal/usb_dwc_hal.c index 342d76ee7f7..96b26d33b92 100644 --- a/components/hal/usb_dwc_hal.c +++ b/components/hal/usb_dwc_hal.c @@ -185,64 +185,53 @@ void usb_dwc_hal_core_soft_reset(usb_dwc_hal_context_t *hal) } } -void usb_dwc_hal_set_fifo_bias(usb_dwc_hal_context_t *hal, const usb_hal_fifo_bias_t fifo_bias) +bool usb_dwc_hal_fifo_config_is_valid(const usb_dwc_hal_context_t *hal, const usb_dwc_hal_fifo_config_t *config) { - HAL_ASSERT(hal->channels.hdls); - const uint16_t fifo_size_lines = hal->constant_config.fifo_size; - /* - * Recommended FIFO sizes (see 2.1.2.4 for programming guide) - * - * RXFIFO: ((LPS/4) * 2) + 2 - * NPTXFIFO: (LPS/4) * 2 - * PTXFIFO: (LPS/4) * 2 - * - * Recommended sizes fit 2 packets of each type. For S2 and S3 we can't fit even one MPS ISOC packet (1023 FS and 1024 HS). - * So the calculations below are compromises between the available FIFO size and optimal performance. - */ - - // Information for maintainers: this calculation is here for backward compatibility - // It should be removed when we allow HAL users to configure the FIFO sizes IDF-9042 - const int otg_dfifo_depth = hal->constant_config.hsphy_type ? 1024 : 256; - - usb_dwc_hal_fifo_config_t fifo_config; - switch (fifo_bias) { - // Define minimum viable (fits at least 1 MPS) FIFO sizes for non-biased FIFO types - // Allocate the remaining size to the biased FIFO type - case USB_HAL_FIFO_BIAS_DEFAULT: - fifo_config.nptx_fifo_lines = otg_dfifo_depth / 4; - fifo_config.ptx_fifo_lines = otg_dfifo_depth / 8; - fifo_config.rx_fifo_lines = fifo_size_lines - fifo_config.ptx_fifo_lines - fifo_config.nptx_fifo_lines; - break; - case USB_HAL_FIFO_BIAS_RX: - fifo_config.nptx_fifo_lines = otg_dfifo_depth / 16; - fifo_config.ptx_fifo_lines = otg_dfifo_depth / 8; - fifo_config.rx_fifo_lines = fifo_size_lines - fifo_config.ptx_fifo_lines - fifo_config.nptx_fifo_lines; - break; - case USB_HAL_FIFO_BIAS_PTX: - fifo_config.rx_fifo_lines = otg_dfifo_depth / 8 + 2; // 2 extra lines are allocated for status information. See USB-OTG Programming Guide, chapter 2.1.2.1 - fifo_config.nptx_fifo_lines = otg_dfifo_depth / 16; - fifo_config.ptx_fifo_lines = fifo_size_lines - fifo_config.nptx_fifo_lines - fifo_config.rx_fifo_lines; - break; - default: - abort(); + if (!hal || !config) { + return false; } + uint32_t used_lines = config->rx_fifo_lines + config->nptx_fifo_lines + config->ptx_fifo_lines; + return (used_lines <= hal->constant_config.fifo_size); +} - HAL_ASSERT((fifo_config.rx_fifo_lines + fifo_config.nptx_fifo_lines + fifo_config.ptx_fifo_lines) <= fifo_size_lines); - //Check that none of the channels are active + +void usb_dwc_hal_set_fifo_config(usb_dwc_hal_context_t *hal, const usb_dwc_hal_fifo_config_t *config) +{ + // Check internal HAL state + HAL_ASSERT(hal != NULL); + HAL_ASSERT(hal->channels.hdls != NULL); + + // Validate provided config + HAL_ASSERT(config != NULL); + + // Check if configuration exceeds available FIFO memory + HAL_ASSERT(usb_dwc_hal_fifo_config_is_valid(hal, config)); + + // Ensure no active channels (must only be called before USB install completes) for (int i = 0; i < hal->constant_config.chan_num_total; i++) { if (hal->channels.hdls[i] != NULL) { HAL_ASSERT(!hal->channels.hdls[i]->flags.active); } } - //Set the new FIFO lengths - usb_dwc_ll_grxfsiz_set_fifo_size(hal->dev, fifo_config.rx_fifo_lines); - usb_dwc_ll_gnptxfsiz_set_fifo_size(hal->dev, fifo_config.rx_fifo_lines, fifo_config.nptx_fifo_lines); - usb_dwc_ll_hptxfsiz_set_ptx_fifo_size(hal->dev, fifo_config.rx_fifo_lines + fifo_config.nptx_fifo_lines, fifo_config.ptx_fifo_lines); - //Flush the FIFOs + + // Program FIFO size registers + usb_dwc_ll_grxfsiz_set_fifo_size(hal->dev, config->rx_fifo_lines);// Set RX FIFO size (GRXFSIZ) + // Set Non-Periodic TX FIFO (GNPTXFSIZ) + // Offset = RX FIFO lines + usb_dwc_ll_gnptxfsiz_set_fifo_size(hal->dev, config->rx_fifo_lines, config->nptx_fifo_lines); + // Set Periodic TX FIFO (HPTXFSIZ) + // Offset = RX + NPTX + usb_dwc_ll_hptxfsiz_set_ptx_fifo_size(hal->dev, + config->rx_fifo_lines + config->nptx_fifo_lines, + config->ptx_fifo_lines); + + // Flush all FIFOs usb_dwc_ll_grstctl_flush_nptx_fifo(hal->dev); usb_dwc_ll_grstctl_flush_ptx_fifo(hal->dev); usb_dwc_ll_grstctl_flush_rx_fifo(hal->dev); - hal->fifo_config = fifo_config; // Implicit struct copy + + // Save configuration to HAL context + hal->fifo_config = *config; hal->flags.fifo_sizes_set = 1; } diff --git a/components/usb/hcd_dwc.c b/components/usb/hcd_dwc.c index 36d8ab84def..6a68f306fd1 100644 --- a/components/usb/hcd_dwc.c +++ b/components/usb/hcd_dwc.c @@ -245,8 +245,8 @@ struct port_obj { uint32_t val; } flags; bool initialized; - // FIFO biasing related - usb_hal_fifo_bias_t fifo_bias; // Bias is saved so it can be reconfigured upon reset + // FIFO related + usb_dwc_hal_fifo_config_t fifo_config; // FIFO config to be applied at HAL level // Port callback and context hcd_port_callback_t callback; void *callback_arg; @@ -549,6 +549,23 @@ static bool _port_check_all_pipes_halted(port_t *port); */ static bool _port_debounce(port_t *port); +/** + * @brief Convert user-provided FIFO configuration to HAL format + * + * This function validates and converts a user-defined FIFO configuration + * (provided via `hcd_config_t.fifo_config`) into the format expected by the HAL. + * It ensures that both RX FIFO and Non-Periodic TX FIFO sizes are non-zero. + * + * @param[in] src Pointer to user-defined FIFO settings (HCD format) + * @param[out] dst Pointer to HAL-compatible FIFO configuration structure + * + * @return + * - ESP_OK: Conversion successful and values copied + * - ESP_ERR_INVALID_SIZE: Either RX FIFO or Non-Periodic TX FIFO is zero + */ + +static esp_err_t convert_fifo_config_to_hal_config(const hcd_fifo_settings_t *src, usb_dwc_hal_fifo_config_t *dst); + /** * @brief Power ON the port * @@ -739,16 +756,6 @@ static usb_speed_t get_usb_port_speed(usb_dwc_speed_t priv) } } -static usb_hal_fifo_bias_t get_hal_fifo_bias(hcd_port_fifo_bias_t public) -{ - switch (public) { - case HCD_PORT_FIFO_BIAS_BALANCED: return USB_HAL_FIFO_BIAS_DEFAULT; - case HCD_PORT_FIFO_BIAS_RX: return USB_HAL_FIFO_BIAS_RX; - case HCD_PORT_FIFO_BIAS_PTX: return USB_HAL_FIFO_BIAS_PTX; - default: abort(); - } -} - // ----------------- Interrupt Handlers -------------------- /** @@ -949,6 +956,46 @@ static void intr_hdlr_main(void *arg) } } +// ----------------------- FIFO Config ------------------------- + +/** + * @brief Calculate default FIFO configuration based on bias preference + * + * This function calculates the FIFO configuration (RX, non-periodic TX, and periodic TX) + * according to the selected bias mode from Kconfig: + * + * - CONFIG_USB_HOST_HW_BUFFER_BIAS_IN: Prioritize RX FIFO space, useful for IN-heavy traffic. + * - CONFIG_USB_HOST_HW_BUFFER_BIAS_PERIODIC_OUT: Prioritize periodic TX FIFO, suitable for periodic OUT transfers. + * - USB_HOST_HW_BUFFER_BIAS_BALANCED: Balanced configuration between RX and both TX FIFOs. + * + * @param[inout] port Pointer to the port object whose fifo_config will be filled + * @param[in] hal Pointer to an initialized HAL context providing hardware FIFO limits + */ +static void _calculate_fifo_from_bias(port_t *port, const usb_dwc_hal_context_t *hal) +{ + const int otg_dfifo_depth = hal->constant_config.hsphy_type ? 1024 : 256; + const uint16_t fifo_size_lines = hal->constant_config.fifo_size; + +#if CONFIG_USB_HOST_HW_BUFFER_BIAS_IN + // Prioritize RX FIFO (best for IN-heavy workloads) + port->fifo_config.nptx_fifo_lines = otg_dfifo_depth / 16; + port->fifo_config.ptx_fifo_lines = otg_dfifo_depth / 8; + port->fifo_config.rx_fifo_lines = fifo_size_lines - port->fifo_config.ptx_fifo_lines - port->fifo_config.nptx_fifo_lines; + +#elif CONFIG_USB_HOST_HW_BUFFER_BIAS_PERIODIC_OUT + // Prioritize periodic TX FIFO (useful for high throughput periodic endpoints) + port->fifo_config.rx_fifo_lines = otg_dfifo_depth / 8 + 2; // 2 extra lines are allocated for status information. See USB-OTG Programming Guide, chapter 2.1.2.1 + port->fifo_config.nptx_fifo_lines = otg_dfifo_depth / 16; + port->fifo_config.ptx_fifo_lines = fifo_size_lines - port->fifo_config.nptx_fifo_lines - port->fifo_config.rx_fifo_lines; + +#else // USB_HOST_HW_BUFFER_BIAS_BALANCED + // Balanced configuration (default) + port->fifo_config.nptx_fifo_lines = otg_dfifo_depth / 4; + port->fifo_config.ptx_fifo_lines = otg_dfifo_depth / 8; + port->fifo_config.rx_fifo_lines = fifo_size_lines - port->fifo_config.ptx_fifo_lines - port->fifo_config.nptx_fifo_lines; +#endif +} + // --------------------------------------------- Host Controller Driver ------------------------------------------------ static port_t *port_obj_alloc(void) @@ -1013,6 +1060,15 @@ esp_err_t hcd_install(const hcd_config_t *config) ESP_LOGE(HCD_DWC_TAG, "Interrupt alloc error: %s", esp_err_to_name(err_ret)); goto intr_alloc_err; } + // Apply custom FIFO config if provided, otherwise mark as default (all zeros) + memset(&p_hcd_obj_dmy->port_obj->fifo_config, 0, sizeof(p_hcd_obj_dmy->port_obj->fifo_config)); + if (config->fifo_config != NULL) { + // Convert and validate user-provided config + err_ret = convert_fifo_config_to_hal_config(config->fifo_config, &p_hcd_obj_dmy->port_obj->fifo_config); + if (err_ret != ESP_OK) { + goto assign_err; + } + } HCD_ENTER_CRITICAL(); if (s_hcd_obj != NULL) { HCD_EXIT_CRITICAL(); @@ -1095,6 +1151,34 @@ static bool _port_debounce(port_t *port) return is_connected; } +static esp_err_t convert_fifo_config_to_hal_config(const hcd_fifo_settings_t *src, usb_dwc_hal_fifo_config_t *dst) +{ + // Check at least RX and NPTX are non-zero + if (src->rx_fifo_lines == 0 || src->nptx_fifo_lines == 0) { + ESP_LOGE(HCD_DWC_TAG, "RX and Non-Periodic TX FIFO must be > 0"); + return ESP_ERR_INVALID_SIZE; + } + // Assign valid values + dst->rx_fifo_lines = src->rx_fifo_lines; + dst->nptx_fifo_lines = src->nptx_fifo_lines; + dst->ptx_fifo_lines = src->ptx_fifo_lines; // OK even if zero + + return ESP_OK; +} + +/** + * @brief Check if the FIFO config is marked to use bias-based default values. + * + * If all FIFO line sizes are zero, the configuration is considered uninitialized, + * and default values will be calculated based on bias settings. + */ +static inline bool _is_fifo_config_by_bias(const usb_dwc_hal_fifo_config_t *cfg) +{ + return (cfg->rx_fifo_lines == 0 && + cfg->nptx_fifo_lines == 0 && + cfg->ptx_fifo_lines == 0); +} + // ---------------------- Commands ------------------------- static esp_err_t _port_cmd_power_on(port_t *port) @@ -1172,8 +1256,16 @@ static esp_err_t _port_cmd_reset(port_t *port) goto bailout; } - // Reinitialize port registers. - usb_dwc_hal_set_fifo_bias(port->hal, port->fifo_bias); // Set FIFO biases + // Reinitialize port registers + if (!usb_dwc_hal_fifo_config_is_valid(port->hal, &port->fifo_config)) { + HCD_EXIT_CRITICAL(); + ret = ESP_ERR_INVALID_SIZE; + ESP_LOGE(HCD_DWC_TAG, "Invalid FIFO config"); + HCD_ENTER_CRITICAL(); + goto bailout; + } + usb_dwc_hal_set_fifo_config(port->hal, &port->fifo_config);// Apply FIFO settings + usb_dwc_hal_port_set_frame_list(port->hal, port->frame_list, FRAME_LIST_LEN); // Set periodic frame list usb_dwc_hal_port_periodic_enable(port->hal); // Enable periodic scheduling @@ -1282,7 +1374,6 @@ esp_err_t hcd_port_init(int port_number, const hcd_port_config_t *port_config, h TAILQ_INIT(&port_obj->pipes_active_tailq); port_obj->state = HCD_PORT_STATE_NOT_POWERED; port_obj->last_event = HCD_PORT_EVENT_NONE; - port_obj->fifo_bias = get_hal_fifo_bias(port_config->fifo_bias); port_obj->callback = port_config->callback; port_obj->callback_arg = port_config->callback_arg; port_obj->context = port_config->context; @@ -1292,10 +1383,18 @@ esp_err_t hcd_port_init(int port_number, const hcd_port_config_t *port_config, h port_obj->initialized = true; // Clear the frame list. We set the frame list register and enable periodic scheduling after a successful reset memset(port_obj->frame_list, 0, FRAME_LIST_LEN * sizeof(uint32_t)); + // If FIFO config is zeroed -> calculate from bias + if (_is_fifo_config_by_bias(&port_obj->fifo_config)) { + // Calculate default FIFO sizes based on Kconfig bias settings + _calculate_fifo_from_bias(port_obj, port_obj->hal); + } esp_intr_enable(s_hcd_obj->isr_hdl); *port_hdl = (hcd_port_handle_t)port_obj; HCD_EXIT_CRITICAL(); - + ESP_LOGD(HCD_DWC_TAG, "FIFO config lines: RX=%" PRIu32 ", PTX=%" PRIu32 ", NPTX=%" PRIu32, + port_obj->fifo_config.rx_fifo_lines, + port_obj->fifo_config.ptx_fifo_lines, + port_obj->fifo_config.nptx_fifo_lines); vTaskDelay(pdMS_TO_TICKS(INIT_DELAY_MS)); // Need a short delay before host mode takes effect return ESP_OK; } @@ -1450,28 +1549,6 @@ void *hcd_port_get_context(hcd_port_handle_t port_hdl) return ret; } -esp_err_t hcd_port_set_fifo_bias(hcd_port_handle_t port_hdl, hcd_port_fifo_bias_t bias) -{ - esp_err_t ret; - usb_hal_fifo_bias_t hal_bias = get_hal_fifo_bias(bias); - - // Configure the new FIFO sizes and store the pointers - port_t *port = (port_t *)port_hdl; - xSemaphoreTake(port->port_mux, portMAX_DELAY); - HCD_ENTER_CRITICAL(); - // Check that port is in the correct state to update FIFO sizes - if (port->initialized && !port->flags.event_pending && port->num_pipes_idle == 0 && port->num_pipes_queued == 0) { - usb_dwc_hal_set_fifo_bias(port->hal, hal_bias); - port->fifo_bias = hal_bias; - ret = ESP_OK; - } else { - ret = ESP_ERR_INVALID_STATE; - } - HCD_EXIT_CRITICAL(); - xSemaphoreGive(port->port_mux); - return ret; -} - // --------------------------------------------------- HCD Pipes ------------------------------------------------------- // ----------------------- Private ------------------------- diff --git a/components/usb/hub.c b/components/usb/hub.c index 67c9b0a53fe..609f9d64f2c 100644 --- a/components/usb/hub.c +++ b/components/usb/hub.c @@ -561,7 +561,6 @@ esp_err_t hub_install(hub_config_t *hub_config, void **client_ret) // Install HCD port hcd_port_config_t port_config = { - .fifo_bias = HUB_ROOT_HCD_PORT_FIFO_BIAS, .callback = root_port_callback, .callback_arg = NULL, .context = NULL, diff --git a/components/usb/include/usb/usb_host.h b/components/usb/include/usb/usb_host.h index eee26145a02..001327d809f 100644 --- a/components/usb/include/usb/usb_host.h +++ b/components/usb/include/usb/usb_host.h @@ -111,6 +111,16 @@ typedef struct { int intr_flags; /**< Interrupt flags for the underlying ISR used by the USB Host stack */ usb_host_enum_filter_cb_t enum_filter_cb; /**< Enumeration filter callback. Enable CONFIG_USB_HOST_ENABLE_ENUM_FILTER_CALLBACK to use this feature. Set to NULL otherwise. */ + struct { + uint32_t nptx_fifo_lines; /**< Required: Number of non-periodic TX FIFO lines. + Must be > 0 to enable custom configuration. */ + uint32_t ptx_fifo_lines; /**< Optional: Number of periodic TX FIFO lines. + Can be 0 if periodic TX endpoints are not used. */ + uint32_t rx_fifo_lines; /**< Required: Number of RX FIFO lines. + Must be > 0 to enable custom configuration. */ + } fifo_settings_custom; /**< Optional custom FIFO configuration (advanced use). + RX and NPTX must be > 0. If all fields are zero, + a default configuration will be selected based on Kconfig bias. */ } usb_host_config_t; /** diff --git a/components/usb/maintainers.md b/components/usb/maintainers.md index 8a0da5d23fd..56f8c9383a1 100644 --- a/components/usb/maintainers.md +++ b/components/usb/maintainers.md @@ -94,9 +94,11 @@ The HCD currently has the following limitations: - `HCD_PORT_EVENT_DISCONNECTION` - `HCD_PORT_EVENT_ERROR` - `HCD_PORT_EVENT_OVERCURRENT` -- The port's internal FIFOs (RX, Periodic TX, Non-periodic TX) must be after each port reset (a port reset seems to clear the FIFO sizing registers). The sizing of these FIFOs will affect the largest supported MPS of endpoints using that FIFO. For convenience, the HCD provides the `hcd_port_fifo_bias_t` enum that will set the FIFO sizes for you but biased towards a particular use case. For example, if the connected device has an IN endpoint with large MPS (e.g., 512 bytes), the FIFO should be biased as `HCD_PORT_FIFO_BIAS_RX`. - - The FIFO sizes will be set on port initialization (supplied in `hcd_port_config_t`) - - FIFOs can be resized after port reset using `hcd_port_set_fifo_bias()` but some restrictions apply (see API description). +- The port's internal FIFOs (RX, Periodic TX, Non-periodic TX) must be configured during port initialization. The sizing of these FIFOs affects the maximum supported MPS (Maximum Packet Size) of endpoints using that FIFO. + - FIFO sizes can be explicitly configured by the user via the `usb_host_config_t::fifo_settings_custom` structure during `usb_host_install()`. + - If no custom FIFO configuration is provided (i.e., all fields are set to zero), the driver will automatically select FIFO sizes based on Kconfig bias settings (`USB_HOST_HW_BUFFER_BIAS_BALANCED`, `CONFIG_USB_HOST_HW_BUFFER_BIAS_IN`, or `CONFIG_USB_HOST_HW_BUFFER_BIAS_PERIODIC_OUT`). + - After each USB port reset, the FIFO configuration is re-applied to the hardware registers based on the stored settings. + - Manual FIFO reconfiguration after initialization is not supported. FIFO sizes must be set before any pipes are created or transfers occur. ## HCD Pipes @@ -140,4 +142,4 @@ The HCD API is thread safe however the following limitations should be noted: - Likewise, it is the client's responsibility to ensure that events and pipes are cleared before calling `hcd_port_deinit()`. - `hcd_port_command()` is thread safe, but only one port command can be executed at any one time. Therefore HCD internally used a mutex to protect against concurrent commands. - If multiple threads attempt to execute a command on the sample one, all but one of those threads will return with an invalid state error. -- Blocking HCD functions should not be called from critical sections and interrupts (e.g., `hcd_port_command()` and `hcd_pipe_command()`). \ No newline at end of file +- Blocking HCD functions should not be called from critical sections and interrupts (e.g., `hcd_port_command()` and `hcd_pipe_command()`). diff --git a/components/usb/private_include/hcd.h b/components/usb/private_include/hcd.h index 8d24e316837..2920a11b997 100644 --- a/components/usb/private_include/hcd.h +++ b/components/usb/private_include/hcd.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -137,24 +137,32 @@ typedef bool (*hcd_port_callback_t)(hcd_port_handle_t port_hdl, hcd_port_event_t */ typedef bool (*hcd_pipe_callback_t)(hcd_pipe_handle_t pipe_hdl, hcd_pipe_event_t pipe_event, void *user_arg, bool in_isr); -typedef enum { - HCD_PORT_FIFO_BIAS_BALANCED, /**< Balanced FIFO sizing for RX, Non-periodic TX, and periodic TX */ - HCD_PORT_FIFO_BIAS_RX, /**< Bias towards a large RX FIFO */ - HCD_PORT_FIFO_BIAS_PTX, /**< Bias towards periodic TX FIFO */ -} hcd_port_fifo_bias_t; - +/** + * @brief Optional user-defined FIFO configuration (used internally by HCD) + * + * This structure is filled by the USB Host layer if the user provides + * custom FIFO values. All values must be greater than zero to activate + * the configuration. If NULL is passed, HCD will use the default + * configuration based on the Kconfig bias. + */ +typedef struct { + uint32_t nptx_fifo_lines; /**< Number of non-periodic TX FIFO lines */ + uint32_t ptx_fifo_lines; /**< Number of periodic TX FIFO lines */ + uint32_t rx_fifo_lines; /**< Number of RX FIFO lines */ +} hcd_fifo_settings_t; /** * @brief HCD configuration structure */ typedef struct { - int intr_flags; /**< Interrupt flags for HCD interrupt */ + int intr_flags; /**< Interrupt flags for HCD interrupt */ + const hcd_fifo_settings_t *fifo_config;/**< Optional pointer to custom FIFO config. + If NULL, default configuration is used. */ } hcd_config_t; /** * @brief Port configuration structure */ typedef struct { - hcd_port_fifo_bias_t fifo_bias; /**< HCD port internal FIFO biasing */ hcd_port_callback_t callback; /**< HCD port event callback */ void *callback_arg; /**< User argument for HCD port callback */ void *context; /**< Context variable used to associate the port with upper layer object */ @@ -340,23 +348,6 @@ esp_err_t hcd_port_recover(hcd_port_handle_t port_hdl); */ void *hcd_port_get_context(hcd_port_handle_t port_hdl); -/** - * @brief Set the bias of the HCD port's internal FIFO - * - * @note This function can only be called when the following conditions are met: - * - Port is initialized - * - Port does not have any pending events - * - Port does not have any allocated pipes - * - * @param[in] port_hdl Port handle - * @param[in] bias Fifo bias - * - * @return - * - ESP_OK FIFO sizing successfully set - * - ESP_ERR_INVALID_STATE Incorrect state for FIFO sizes to be set - */ -esp_err_t hcd_port_set_fifo_bias(hcd_port_handle_t port_hdl, hcd_port_fifo_bias_t bias); - // --------------------------------------------------- HCD Pipes ------------------------------------------------------- /** diff --git a/components/usb/test_apps/common/dev_isoc.c b/components/usb/test_apps/common/dev_isoc.c index 6cf1eb52f6d..c1390a108dc 100644 --- a/components/usb/test_apps/common/dev_isoc.c +++ b/components/usb/test_apps/common/dev_isoc.c @@ -15,7 +15,7 @@ static const usb_ep_desc_t isoc_out_ep_desc = { .bDescriptorType = USB_B_DESCRIPTOR_TYPE_ENDPOINT, .bEndpointAddress = 0x02, // EP 2 OUT .bmAttributes = USB_BM_ATTRIBUTES_XFER_ISOC, - .wMaxPacketSize = 512, + .wMaxPacketSize = 128, .bInterval = 1, // Isoc interval is (2 ^ (bInterval - 1)) which means an interval of 1ms }; diff --git a/components/usb/test_apps/hcd/main/test_hcd_common.c b/components/usb/test_apps/hcd/main/test_hcd_common.c index 93dd9404eb5..f70414a75aa 100644 --- a/components/usb/test_apps/hcd/main/test_hcd_common.c +++ b/components/usb/test_apps/hcd/main/test_hcd_common.c @@ -174,7 +174,6 @@ hcd_port_handle_t test_hcd_setup(void) TEST_ASSERT_EQUAL(ESP_OK, hcd_install(&hcd_config)); // Initialize a port hcd_port_config_t port_config = { - .fifo_bias = HCD_PORT_FIFO_BIAS_BALANCED, .callback = port_callback, .callback_arg = (void *)port_evt_queue, .context = (void *)port_evt_queue, diff --git a/components/usb/test_apps/hcd/main/test_hcd_isoc.c b/components/usb/test_apps/hcd/main/test_hcd_isoc.c index 2f5f837af42..2add1d1c08b 100644 --- a/components/usb/test_apps/hcd/main/test_hcd_isoc.c +++ b/components/usb/test_apps/hcd/main/test_hcd_isoc.c @@ -43,7 +43,6 @@ TEST_CASE("Test HCD isochronous pipe URBs", "[isoc][full_speed][high_speed]") { usb_speed_t port_speed = test_hcd_wait_for_conn(port_hdl); // Trigger a connection // The MPS of the ISOC OUT pipe is quite large, so we need to bias the FIFO sizing - TEST_ASSERT_EQUAL(ESP_OK, hcd_port_set_fifo_bias(port_hdl, HCD_PORT_FIFO_BIAS_PTX)); vTaskDelay(pdMS_TO_TICKS(100)); // Short delay send of SOF (for FS) or EOPs (for LS) // Enumerate and reset device @@ -118,7 +117,6 @@ TEST_CASE("Test HCD isochronous pipe URBs all", "[isoc][full_speed][high_speed]" { usb_speed_t port_speed = test_hcd_wait_for_conn(port_hdl); // Trigger a connection // The MPS of the ISOC OUT pipe is quite large, so we need to bias the FIFO sizing - TEST_ASSERT_EQUAL(ESP_OK, hcd_port_set_fifo_bias(port_hdl, HCD_PORT_FIFO_BIAS_PTX)); vTaskDelay(pdMS_TO_TICKS(100)); // Short delay send of SOF (for FS) or EOPs (for LS) // Enumerate and reset device @@ -230,7 +228,6 @@ TEST_CASE("Test HCD isochronous pipe sudden disconnect", "[isoc][full_speed][hig { usb_speed_t port_speed = test_hcd_wait_for_conn(port_hdl); // Trigger a connection // The MPS of the ISOC OUT pipe is quite large, so we need to bias the FIFO sizing - TEST_ASSERT_EQUAL(ESP_OK, hcd_port_set_fifo_bias(port_hdl, HCD_PORT_FIFO_BIAS_PTX)); vTaskDelay(pdMS_TO_TICKS(100)); // Short delay send of SOF (for FS) or EOPs (for LS) // Enumerate and reset device diff --git a/components/usb/usb_host.c b/components/usb/usb_host.c index a402d740a46..8216d3cfdf5 100644 --- a/components/usb/usb_host.c +++ b/components/usb/usb_host.c @@ -487,9 +487,26 @@ esp_err_t usb_host_install(const usb_host_config_t *config) } // Install HCD + // Prepare HCD configuration + hcd_fifo_settings_t user_fifo_config; hcd_config_t hcd_config = { - .intr_flags = config->intr_flags + .intr_flags = config->intr_flags, + .fifo_config = NULL, // Default: use bias strategy from Kconfig }; + + // Check if user has provided a custom FIFO configuration + if (config->fifo_settings_custom.rx_fifo_lines != 0 || + config->fifo_settings_custom.nptx_fifo_lines != 0 || + config->fifo_settings_custom.ptx_fifo_lines != 0) { + + // Populate user FIFO configuration with provided values + user_fifo_config.rx_fifo_lines = config->fifo_settings_custom.rx_fifo_lines; + user_fifo_config.nptx_fifo_lines = config->fifo_settings_custom.nptx_fifo_lines; + user_fifo_config.ptx_fifo_lines = config->fifo_settings_custom.ptx_fifo_lines; + + // Pass custom configuration to HCD + hcd_config.fifo_config = &user_fifo_config; + } ret = hcd_install(&hcd_config); if (ret != ESP_OK) { ESP_LOGE(USB_HOST_TAG, "HCD install error: %s", esp_err_to_name(ret)); From f81c69eabcb22dc44c181b2ce89a10f3869d4ae3 Mon Sep 17 00:00:00 2001 From: "harshal.patil" Date: Fri, 23 May 2025 09:16:10 +0530 Subject: [PATCH 002/213] fix(mbedtls/esp_crt_bundle): Suppress non-negative serial number warning Co-authored-by: Mahavir Jain --- .../mbedtls/esp_crt_bundle/gen_crt_bundle.py | 67 ++++++++++++++----- 1 file changed, 49 insertions(+), 18 deletions(-) diff --git a/components/mbedtls/esp_crt_bundle/gen_crt_bundle.py b/components/mbedtls/esp_crt_bundle/gen_crt_bundle.py index 2e5bca544b1..545a2dc3685 100755 --- a/components/mbedtls/esp_crt_bundle/gen_crt_bundle.py +++ b/components/mbedtls/esp_crt_bundle/gen_crt_bundle.py @@ -8,7 +8,7 @@ # The bundle will have the format: number of certificates; crt 1 subject name length; crt 1 public key length; # crt 1 subject name; crt 1 public key; crt 2... # -# SPDX-FileCopyrightText: 2018-2024 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2018-2025 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 import argparse import csv @@ -16,17 +16,32 @@ import os import re import struct import sys +import warnings DEFAULT_CERT_BUNDLE_MAX_CERTS = 200 +# Ignore warning about non-positive serial numbers in certificates +# Some CA certificates from the certificate bundle contain zero as serial number +# Please see https://github.com/pyca/cryptography/issues/12948 for more details +warnings.filterwarnings( + 'ignore', + message=( + r"Parsed a serial number which wasn't positive \(i.e., it was negative or zero\), " + 'which is disallowed by RFC 5280. ' + 'Loading this certificate will cause an exception in a future release of cryptography.' + ), +) + try: from cryptography import x509 from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization except ImportError: - print('The cryptography package is not installed.' - 'Please refer to the Get Started section of the ESP-IDF Programming Guide for ' - 'setting up the required packages.') + print( + 'The cryptography package is not installed.' + 'Please refer to the Get Started section of the ESP-IDF Programming Guide for ' + 'setting up the required packages.' + ) raise ca_bundle_bin_file = 'x509_crt_bundle' @@ -35,13 +50,13 @@ quiet = False def status(msg): - """ Print status message to stderr """ + """Print status message to stderr""" if not quiet: critical(msg) def critical(msg): - """ Print critical message to stderr """ + """Print critical message to stderr""" sys.stderr.write('gen_crt_bundle.py: ') sys.stderr.write(msg) sys.stderr.write('\n') @@ -53,7 +68,6 @@ class CertificateBundle: self.compressed_crts = [] def add_from_path(self, crts_path): - found = False for file_path in os.listdir(crts_path): found |= self.add_from_file(os.path.join(crts_path, file_path)) @@ -84,7 +98,7 @@ class CertificateBundle: return False def add_from_pem(self, crt_str): - """ A single PEM file may have multiple certificates """ + """A single PEM file may have multiple certificates""" crt = '' count = 0 @@ -113,9 +127,11 @@ class CertificateBundle: def create_bundle(self, max_certs=DEFAULT_CERT_BUNDLE_MAX_CERTS): if max_certs < len(self.certificates): - critical(f'No. of certs in the certificate bundle = {len(self.certificates)} exceeds\n \ + critical( + f'No. of certs in the certificate bundle = {len(self.certificates)} exceeds\n \ Max allowed certificates in the certificate bundle = {max_certs} \ - Please update the menuconfig option with appropriate value') + Please update the menuconfig option with appropriate value' + ) raise ValueError # Sort certificates in order to do binary search when looking up certificates @@ -130,7 +146,9 @@ class CertificateBundle: for crt in self.certificates: """ Read the public key as DER format """ pub_key = crt.public_key() - pub_key_der = pub_key.public_bytes(serialization.Encoding.DER, serialization.PublicFormat.SubjectPublicKeyInfo) + pub_key_der = pub_key.public_bytes( + serialization.Encoding.DER, serialization.PublicFormat.SubjectPublicKeyInfo + ) """ Read the subject name as DER format """ sub_name_der = crt.subject.public_bytes(default_backend()) @@ -152,7 +170,6 @@ class CertificateBundle: return bundle def add_with_filter(self, crts_path, filter_path): - filter_set = set() with open(filter_path, 'r', encoding='utf-8') as f: csv_reader = csv.reader(f, delimiter=',') @@ -189,12 +206,26 @@ def main(): parser = argparse.ArgumentParser(description='ESP-IDF x509 certificate bundle utility') parser.add_argument('--quiet', '-q', help="Don't print non-critical status messages to stderr", action='store_true') - parser.add_argument('--input', '-i', nargs='+', required=True, - help='Paths to the custom certificate folders or files to parse, parses all .pem or .der files') - parser.add_argument('--filter', '-f', help='Path to CSV-file where the second columns contains the name of the certificates \ - that should be included from cacrt_all.pem') - parser.add_argument('--max-certs', '-m', help='Maximum number of certificates allowed in the certificate bundle', - type=int, default=DEFAULT_CERT_BUNDLE_MAX_CERTS) + parser.add_argument( + '--input', + '-i', + nargs='+', + required=True, + help='Paths to the custom certificate folders or files to parse, parses all .pem or .der files', + ) + parser.add_argument( + '--filter', + '-f', + help='Path to CSV-file where the second columns contains the name of the certificates \ + that should be included from cacrt_all.pem', + ) + parser.add_argument( + '--max-certs', + '-m', + help='Maximum number of certificates allowed in the certificate bundle', + type=int, + default=DEFAULT_CERT_BUNDLE_MAX_CERTS, + ) args = parser.parse_args() From b26fa86bf8606a141470c30e556a5a0301896ca6 Mon Sep 17 00:00:00 2001 From: "wangtao@espressif.com" Date: Thu, 29 May 2025 11:30:52 +0800 Subject: [PATCH 003/213] fix(wifi): improve esp32c2 and esp32s2 tcp performance --- examples/wifi/iperf/sdkconfig.defaults.esp32c2 | 2 +- examples/wifi/iperf/sdkconfig.defaults.esp32s2 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/wifi/iperf/sdkconfig.defaults.esp32c2 b/examples/wifi/iperf/sdkconfig.defaults.esp32c2 index af67e48cf17..421500597e1 100644 --- a/examples/wifi/iperf/sdkconfig.defaults.esp32c2 +++ b/examples/wifi/iperf/sdkconfig.defaults.esp32c2 @@ -9,7 +9,7 @@ CONFIG_ESP_WIFI_TX_BA_WIN=16 CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y CONFIG_ESP_WIFI_RX_BA_WIN=14 -CONFIG_LWIP_TCP_SND_BUF_DEFAULT=11520 +CONFIG_LWIP_TCP_SND_BUF_DEFAULT=7200 CONFIG_LWIP_TCP_WND_DEFAULT=11520 CONFIG_LWIP_TCP_RECVMBOX_SIZE=32 CONFIG_LWIP_UDP_RECVMBOX_SIZE=32 diff --git a/examples/wifi/iperf/sdkconfig.defaults.esp32s2 b/examples/wifi/iperf/sdkconfig.defaults.esp32s2 index 3cdbfdf3a8f..37288848a91 100644 --- a/examples/wifi/iperf/sdkconfig.defaults.esp32s2 +++ b/examples/wifi/iperf/sdkconfig.defaults.esp32s2 @@ -9,7 +9,7 @@ CONFIG_ESP_WIFI_TX_BA_WIN=16 CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y CONFIG_ESP_WIFI_RX_BA_WIN=16 -CONFIG_LWIP_TCP_SND_BUF_DEFAULT=28000 +CONFIG_LWIP_TCP_SND_BUF_DEFAULT=17280 CONFIG_LWIP_TCP_WND_DEFAULT=28000 CONFIG_LWIP_TCP_RECVMBOX_SIZE=32 CONFIG_LWIP_UDP_RECVMBOX_SIZE=32 From 923ac4da5ad21cfad275f0d2e0f73155c333739f Mon Sep 17 00:00:00 2001 From: "hrushikesh.bhosale" Date: Wed, 7 May 2025 11:50:39 +0530 Subject: [PATCH 004/213] feat(http_server): httpd register handler strdup failure case check In httpd_register_uri_handler api, for the strdup function failure case was not checked and not returned any error by freeing previously allocated memory, if the memory allocation for strdup function did not gets successful. Closes https://github.com/espressif/esp-idf/issues/15878 --- components/esp_http_server/src/httpd_uri.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/components/esp_http_server/src/httpd_uri.c b/components/esp_http_server/src/httpd_uri.c index 5746febc74b..64befe83e02 100644 --- a/components/esp_http_server/src/httpd_uri.c +++ b/components/esp_http_server/src/httpd_uri.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2018-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2018-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -171,6 +171,12 @@ esp_err_t httpd_register_uri_handler(httpd_handle_t handle, hd->hd_calls[i]->handle_ws_control_frames = uri_handler->handle_ws_control_frames; if (uri_handler->supported_subprotocol) { hd->hd_calls[i]->supported_subprotocol = strdup(uri_handler->supported_subprotocol); + if (hd->hd_calls[i]->supported_subprotocol == NULL) { + /* Failed to allocate memory */ + free((void *)hd->hd_calls[i]->uri); + free(hd->hd_calls[i]); + return ESP_ERR_HTTPD_ALLOC_MEM; + } } else { hd->hd_calls[i]->supported_subprotocol = NULL; } From a36d9ab0dd32a2cad5415fc18d6f164768b9278e Mon Sep 17 00:00:00 2001 From: xiongweichao Date: Mon, 19 May 2025 16:55:31 +0800 Subject: [PATCH 005/213] feat(bt/bluedroid): Add events to indicate the initialization states of AVRCP --- .../bluedroid/api/include/api/esp_avrc_api.h | 33 +++ .../bluedroid/btc/profile/std/avrc/btc_avrc.c | 197 ++++++++++-------- .../classic_bt/a2dp_sink/main/bt_app_av.c | 28 ++- .../classic_bt/a2dp_sink/main/main.c | 8 +- 4 files changed, 178 insertions(+), 88 deletions(-) diff --git a/components/bt/host/bluedroid/api/include/api/esp_avrc_api.h b/components/bt/host/bluedroid/api/include/api/esp_avrc_api.h index 0c3828ddda3..c31efbefe57 100644 --- a/components/bt/host/bluedroid/api/include/api/esp_avrc_api.h +++ b/components/bt/host/bluedroid/api/include/api/esp_avrc_api.h @@ -145,6 +145,7 @@ typedef enum { ESP_AVRC_CT_SET_ABSOLUTE_VOLUME_RSP_EVT = 7, /*!< set absolute volume response event */ ESP_AVRC_CT_COVER_ART_STATE_EVT = 8, /*!< cover art client connection state changed event */ ESP_AVRC_CT_COVER_ART_DATA_EVT = 9, /*!< cover art client data event */ + ESP_AVRC_CT_PROF_STATE_EVT = 10, /*!< Indicate AVRCP controller init or deinit complete */ } esp_avrc_ct_cb_event_t; /// AVRC Target callback events @@ -155,6 +156,7 @@ typedef enum { ESP_AVRC_TG_SET_ABSOLUTE_VOLUME_CMD_EVT = 3, /*!< set absolute volume command from remote device */ ESP_AVRC_TG_REGISTER_NOTIFICATION_EVT = 4, /*!< register notification event */ ESP_AVRC_TG_SET_PLAYER_APP_VALUE_EVT = 5, /*!< set application attribute value, attribute refer to esp_avrc_ps_attr_ids_t */ + ESP_AVRC_TG_PROF_STATE_EVT = 6, /*!< Indicate AVRCP target init or deinit complete */ } esp_avrc_tg_cb_event_t; /// AVRC metadata attribute mask @@ -303,6 +305,18 @@ typedef struct { uint8_t ct_cover_art_conn_num; /*!< Number of cover art client connections */ } esp_avrc_profile_status_t; +/** + * @brief Bluetooth AVRCP Initiation states + */ +typedef enum { + ESP_AVRC_INIT_SUCCESS = 0, /*!< Indicate init successful */ + ESP_AVRC_INIT_ALREADY, /*!< Indicate init repeated */ + ESP_AVRC_INIT_FAIL, /*!< Indicate init fail */ + ESP_AVRC_DEINIT_SUCCESS, /*!< Indicate deinit successful */ + ESP_AVRC_DEINIT_ALREADY, /*!< Indicate deinit repeated */ + ESP_AVRC_DEINIT_FAIL, /*!< Indicate deinit fail */ +} esp_avrc_init_state_t; + /// AVRC controller callback parameters typedef union { /** @@ -381,6 +395,14 @@ typedef union { uint16_t data_len; /*!< the data length of this data event, in bytes */ uint8_t *p_data; /*!< pointer to data, should copy to other buff before event callback return */ } cover_art_data; /*!< AVRC Cover Art data event */ + + /** + * @brief ESP_AVRC_CT_PROF_STATE_EVT + */ + struct avrc_ct_init_stat_param { + esp_avrc_init_state_t state; /*!< avrc ct initialization param */ + } avrc_ct_init_stat; /*!< status to indicate avrcp ct init or deinit */ + } esp_avrc_ct_cb_param_t; /// AVRC target callback parameters @@ -433,6 +455,13 @@ typedef union { esp_avrc_set_app_value_param_t *p_vals; /*!< point to the id and value of player application attribute */ } set_app_value; /*!< set player application value */ + /** + * @brief ESP_AVRC_TG_PROF_STATE_EVT + */ + struct avrc_tg_init_stat_param { + esp_avrc_init_state_t state; /*!< avrc tg initialization param */ + } avrc_tg_init_stat; /*!< status to indicate avrcp tg init or deinit */ + } esp_avrc_tg_cb_param_t; /** @@ -473,6 +502,7 @@ esp_err_t esp_avrc_ct_register_callback(esp_avrc_ct_cb_t callback); * @brief Initialize the bluetooth AVRCP controller module, This function should be called * after esp_bluedroid_enable() completes successfully. Note: AVRC cannot work independently, * AVRC should be used along with A2DP and AVRC should be initialized before A2DP. + * ESP_AVRC_CT_PROF_STATE_EVT with ESP_AVRC_INIT_SUCCESS will reported to the APP layer. * * @return * - ESP_OK: success @@ -487,6 +517,7 @@ esp_err_t esp_avrc_ct_init(void); * @brief De-initialize AVRCP controller module. This function should be called after * after esp_bluedroid_enable() completes successfully. Note: AVRC cannot work independently, * AVRC should be used along with A2DP and AVRC should be deinitialized before A2DP. + * ESP_AVRC_CT_PROF_STATE_EVT with ESP_AVRC_DEINIT_SUCCESS will reported to the APP layer. * * @return * - ESP_OK: success @@ -615,6 +646,7 @@ esp_err_t esp_avrc_tg_register_callback(esp_avrc_tg_cb_t callback); * @brief Initialize the bluetooth AVRCP target module, This function should be called * after esp_bluedroid_enable() completes successfully. Note: AVRC cannot work independently, * AVRC should be used along with A2DP and AVRC should be initialized before A2DP. + * ESP_AVRC_TG_PROF_STATE_EVT with ESP_AVRC_INIT_SUCCESS will reported to the APP layer. * * @return * - ESP_OK: success @@ -629,6 +661,7 @@ esp_err_t esp_avrc_tg_init(void); * @brief De-initialize AVRCP target module. This function should be called after * after esp_bluedroid_enable() completes successfully. Note: AVRC cannot work independently, * AVRC should be used along with A2DP and AVRC should be deinitialized before A2DP. + * ESP_AVRC_TG_PROF_STATE_EVT with ESP_AVRC_DEINIT_SUCCESS will reported to the APP layer. * * @return * - ESP_OK: success diff --git a/components/bt/host/bluedroid/btc/profile/std/avrc/btc_avrc.c b/components/bt/host/bluedroid/btc/profile/std/avrc/btc_avrc.c index 9f1a0cb54f0..c34c38d1525 100644 --- a/components/bt/host/bluedroid/btc/profile/std/avrc/btc_avrc.c +++ b/components/bt/host/bluedroid/btc/profile/std/avrc/btc_avrc.c @@ -303,10 +303,6 @@ static bool btc_avrc_tg_set_rn_supported_evt(uint16_t evt_set) static inline void btc_avrc_ct_cb_to_app(esp_avrc_ct_cb_event_t event, esp_avrc_ct_cb_param_t *param) { - if (s_rc_ct_init != BTC_RC_CT_INIT_MAGIC) { - return; - } - esp_avrc_ct_cb_t btc_avrc_ct_cb = (esp_avrc_ct_cb_t)btc_profile_cb_get(BTC_PID_AVRC_CT); if (btc_avrc_ct_cb) { btc_avrc_ct_cb(event, param); @@ -315,10 +311,6 @@ static inline void btc_avrc_ct_cb_to_app(esp_avrc_ct_cb_event_t event, esp_avrc_ static inline void btc_avrc_tg_cb_to_app(esp_avrc_tg_cb_event_t event, esp_avrc_tg_cb_param_t *param) { - if (s_rc_tg_init != BTC_RC_TG_INIT_MAGIC) { - return; - } - esp_avrc_tg_cb_t btc_avrc_tg_cb = (esp_avrc_tg_cb_t)btc_profile_cb_get(BTC_PID_AVRC_TG); if (btc_avrc_tg_cb) { btc_avrc_tg_cb(event, param); @@ -1093,27 +1085,39 @@ BOOLEAN btc_rc_get_connected_peer(BD_ADDR peer_addr) *******************************************************************************/ static void btc_avrc_ct_init(void) { + esp_avrc_init_state_t state = ESP_AVRC_INIT_SUCCESS; + BTC_TRACE_DEBUG("## %s ##", __FUNCTION__); - if (s_rc_ct_init == BTC_RC_CT_INIT_MAGIC) { - BTC_TRACE_WARNING("%s already initialized", __FUNCTION__); - return; - } - /// initialize CT-specific resources - s_rc_ct_init = BTC_RC_CT_INIT_MAGIC; + do { - /// initialize CT-TG shared resources - if (s_rc_tg_init != BTC_RC_TG_INIT_MAGIC) { - memset (&btc_rc_cb, 0, sizeof(btc_rc_cb_t)); - - if (!g_av_with_rc) { - g_av_with_rc = true; + if (s_rc_ct_init == BTC_RC_CT_INIT_MAGIC) { + BTC_TRACE_WARNING("%s already initialized", __FUNCTION__); + state = ESP_AVRC_INIT_ALREADY; + break; } - if (g_a2dp_on_init) { - BTC_TRACE_WARNING("AVRC Controller is expected to be initialized in advance of A2DP !!!"); + /// initialize CT-TG shared resources + if (s_rc_tg_init != BTC_RC_TG_INIT_MAGIC) { + if (g_a2dp_on_init) { + BTC_TRACE_WARNING("AVRC Controller is expected to be initialized in advance of A2DP !!!"); + state = ESP_AVRC_INIT_FAIL; + break; + } + memset (&btc_rc_cb, 0, sizeof(btc_rc_cb_t)); + + if (!g_av_with_rc) { + g_av_with_rc = true; + } } - } + + /// initialize CT-specific resources + s_rc_ct_init = BTC_RC_CT_INIT_MAGIC; + } while (0); + + esp_avrc_ct_cb_param_t param = {0}; + param.avrc_ct_init_stat.state = state; + btc_avrc_ct_cb_to_app(ESP_AVRC_CT_PROF_STATE_EVT, ¶m); } @@ -1128,29 +1132,37 @@ static void btc_avrc_ct_init(void) ***************************************************************************/ static void btc_avrc_ct_deinit(void) { + esp_avrc_init_state_t state = ESP_AVRC_DEINIT_SUCCESS; + BTC_TRACE_API("## %s ##", __FUNCTION__); - if (g_a2dp_on_deinit) { - BTC_TRACE_WARNING("A2DP already deinit, AVRC CT should deinit in advance of A2DP !!!"); - } - - if (s_rc_ct_init != BTC_RC_CT_INIT_MAGIC) { - BTC_TRACE_WARNING("%s not initialized", __FUNCTION__); - return; - } - - /// deinit CT-specific resources - s_rc_ct_init = 0; - - /// deinit CT-TG shared resources - if (s_rc_tg_init != BTC_RC_TG_INIT_MAGIC) { - memset (&btc_rc_cb, 0, sizeof(btc_rc_cb_t)); - if (g_av_with_rc) { - g_av_with_rc = false; + do { + if (g_a2dp_on_deinit) { + BTC_TRACE_WARNING("A2DP already deinit, AVRC CT should deinit in advance of A2DP !!!"); } - } - BTC_TRACE_API("## %s ## completed", __FUNCTION__); + if (s_rc_ct_init != BTC_RC_CT_INIT_MAGIC) { + BTC_TRACE_WARNING("%s not initialized", __FUNCTION__); + state = ESP_AVRC_DEINIT_ALREADY; + break; + } + + /// deinit CT-specific resources + s_rc_ct_init = 0; + + /// deinit CT-TG shared resources + if (s_rc_tg_init != BTC_RC_TG_INIT_MAGIC) { + memset (&btc_rc_cb, 0, sizeof(btc_rc_cb_t)); + if (g_av_with_rc) { + g_av_with_rc = false; + } + } + BTC_TRACE_API("## %s ## completed", __FUNCTION__); + } while (0); + + esp_avrc_ct_cb_param_t param = {0}; + param.avrc_ct_init_stat.state = state; + btc_avrc_ct_cb_to_app(ESP_AVRC_CT_PROF_STATE_EVT, ¶m); } static bt_status_t btc_avrc_ct_send_set_player_value_cmd(uint8_t tl, uint8_t attr_id, uint8_t value_id) @@ -1427,30 +1439,42 @@ static void btc_avrc_ct_cover_art_get_linked_thumbnail(UINT8 *image_handle) *******************************************************************************/ static void btc_avrc_tg_init(void) { + esp_avrc_init_state_t state = ESP_AVRC_INIT_SUCCESS; + BTC_TRACE_DEBUG("## %s ##", __FUNCTION__); - if (s_rc_tg_init == BTC_RC_TG_INIT_MAGIC) { - BTC_TRACE_WARNING("%s already initialized", __FUNCTION__); - return; - } - /// initialize TG-specific resources - memcpy(s_psth_supported_cmd, cs_psth_dft_supported_cmd, sizeof(s_psth_supported_cmd)); - s_rn_supported_evt = cs_rn_dft_supported_evt; - - /// initialize CT-TG shared resources - if (s_rc_ct_init != BTC_RC_CT_INIT_MAGIC) { - memset (&btc_rc_cb, 0, sizeof(btc_rc_cb)); - - if (!g_av_with_rc) { - g_av_with_rc = true; + do { + if (s_rc_tg_init == BTC_RC_TG_INIT_MAGIC) { + BTC_TRACE_WARNING("%s already initialized", __FUNCTION__); + state = ESP_AVRC_INIT_ALREADY; + break; } - if (g_a2dp_on_init) { - BTC_TRACE_WARNING("AVRC Target is expected to be initialized in advance of A2DP !!!"); - } - } + /// initialize CT-TG shared resources + if (s_rc_ct_init != BTC_RC_CT_INIT_MAGIC) { + if (g_a2dp_on_init) { + BTC_TRACE_WARNING("AVRC Target is expected to be initialized in advance of A2DP !!!"); + state = ESP_AVRC_INIT_FAIL; + break; + } - s_rc_tg_init = BTC_RC_TG_INIT_MAGIC; + memset (&btc_rc_cb, 0, sizeof(btc_rc_cb)); + + if (!g_av_with_rc) { + g_av_with_rc = true; + } + } + + /// initialize TG-specific resources + memcpy(s_psth_supported_cmd, cs_psth_dft_supported_cmd, sizeof(s_psth_supported_cmd)); + s_rn_supported_evt = cs_rn_dft_supported_evt; + + s_rc_tg_init = BTC_RC_TG_INIT_MAGIC; + } while (0); + + esp_avrc_tg_cb_param_t param = {0}; + param.avrc_tg_init_stat.state = state; + btc_avrc_tg_cb_to_app(ESP_AVRC_TG_PROF_STATE_EVT, ¶m); } @@ -1465,31 +1489,40 @@ static void btc_avrc_tg_init(void) ***************************************************************************/ static void btc_avrc_tg_deinit(void) { + esp_avrc_init_state_t state = ESP_AVRC_DEINIT_SUCCESS; + BTC_TRACE_API("## %s ##", __FUNCTION__); - if (g_a2dp_on_deinit) { - BTC_TRACE_WARNING("A2DP already deinit, AVRC TG should deinit in advance of A2DP !!!"); - } - - if (s_rc_tg_init != BTC_RC_TG_INIT_MAGIC) { - BTC_TRACE_WARNING("%s not initialized", __FUNCTION__); - return; - } - - /// deinit TG-specific resources - memset(s_psth_supported_cmd, 0, sizeof(s_psth_supported_cmd)); - s_rn_supported_evt = 0; - s_rc_tg_init = 0; - - /// deinit CT-TG shared resources - if (s_rc_ct_init != BTC_RC_CT_INIT_MAGIC) { - memset (&btc_rc_cb, 0, sizeof(btc_rc_cb)); - if (g_av_with_rc) { - g_av_with_rc = false; + do { + if (g_a2dp_on_deinit) { + BTC_TRACE_WARNING("A2DP already deinit, AVRC TG should deinit in advance of A2DP !!!"); } - } - BTC_TRACE_API("## %s ## completed", __FUNCTION__); + if (s_rc_tg_init != BTC_RC_TG_INIT_MAGIC) { + BTC_TRACE_WARNING("%s not initialized", __FUNCTION__); + state = ESP_AVRC_DEINIT_ALREADY; + break; + } + + /// deinit TG-specific resources + memset(s_psth_supported_cmd, 0, sizeof(s_psth_supported_cmd)); + s_rn_supported_evt = 0; + s_rc_tg_init = 0; + + /// deinit CT-TG shared resources + if (s_rc_ct_init != BTC_RC_CT_INIT_MAGIC) { + memset (&btc_rc_cb, 0, sizeof(btc_rc_cb)); + if (g_av_with_rc) { + g_av_with_rc = false; + } + } + + BTC_TRACE_API("## %s ## completed", __FUNCTION__); + } while (0); + + esp_avrc_tg_cb_param_t param = {0}; + param.avrc_tg_init_stat.state = state; + btc_avrc_tg_cb_to_app(ESP_AVRC_TG_PROF_STATE_EVT, ¶m); } static void btc_avrc_tg_send_rn_rsp(esp_avrc_rn_event_ids_t event_id, esp_avrc_rn_rsp_t rsp, const esp_avrc_rn_param_t *param) diff --git a/examples/bluetooth/bluedroid/classic_bt/a2dp_sink/main/bt_app_av.c b/examples/bluetooth/bluedroid/classic_bt/a2dp_sink/main/bt_app_av.c index 47c76babf2d..f009fcca3f5 100644 --- a/examples/bluetooth/bluedroid/classic_bt/a2dp_sink/main/bt_app_av.c +++ b/examples/bluetooth/bluedroid/classic_bt/a2dp_sink/main/bt_app_av.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -518,6 +518,17 @@ static void bt_av_hdl_avrc_ct_evt(uint16_t event, void *p_param) #endif break; } + /* when avrcp controller init or deinit completed, this event comes */ + case ESP_AVRC_CT_PROF_STATE_EVT: { + if (ESP_AVRC_INIT_SUCCESS == rc->avrc_ct_init_stat.state) { + ESP_LOGI(BT_RC_CT_TAG, "AVRCP CT STATE: Init Complete"); + } else if (ESP_AVRC_DEINIT_SUCCESS == rc->avrc_ct_init_stat.state) { + ESP_LOGI(BT_RC_CT_TAG, "AVRCP CT STATE: Deinit Complete"); + } else { + ESP_LOGE(BT_RC_CT_TAG, "AVRCP CT STATE error: %d", rc->avrc_ct_init_stat.state); + } + break; + } /* others */ default: ESP_LOGE(BT_RC_CT_TAG, "%s unhandled event: %d", __func__, event); @@ -573,6 +584,17 @@ static void bt_av_hdl_avrc_tg_evt(uint16_t event, void *p_param) ESP_LOGI(BT_RC_TG_TAG, "AVRC remote features: %"PRIx32", CT features: %x", rc->rmt_feats.feat_mask, rc->rmt_feats.ct_feat_flag); break; } + /* when avrcp target init or deinit completed, this event comes */ + case ESP_AVRC_TG_PROF_STATE_EVT: { + if (ESP_AVRC_INIT_SUCCESS == rc->avrc_tg_init_stat.state) { + ESP_LOGI(BT_RC_CT_TAG, "AVRCP TG STATE: Init Complete"); + } else if (ESP_AVRC_DEINIT_SUCCESS == rc->avrc_tg_init_stat.state) { + ESP_LOGI(BT_RC_CT_TAG, "AVRCP TG STATE: Deinit Complete"); + } else { + ESP_LOGE(BT_RC_CT_TAG, "AVRCP TG STATE error: %d", rc->avrc_tg_init_stat.state); + } + break; + } /* others */ default: ESP_LOGE(BT_RC_TG_TAG, "%s unhandled event: %d", __func__, event); @@ -633,7 +655,8 @@ void bt_app_rc_ct_cb(esp_avrc_ct_cb_event_t event, esp_avrc_ct_cb_param_t *param case ESP_AVRC_CT_REMOTE_FEATURES_EVT: case ESP_AVRC_CT_GET_RN_CAPABILITIES_RSP_EVT: case ESP_AVRC_CT_COVER_ART_STATE_EVT: - case ESP_AVRC_CT_COVER_ART_DATA_EVT: { + case ESP_AVRC_CT_COVER_ART_DATA_EVT: + case ESP_AVRC_CT_PROF_STATE_EVT: { bt_app_work_dispatch(bt_av_hdl_avrc_ct_evt, event, param, sizeof(esp_avrc_ct_cb_param_t), NULL); break; } @@ -652,6 +675,7 @@ void bt_app_rc_tg_cb(esp_avrc_tg_cb_event_t event, esp_avrc_tg_cb_param_t *param case ESP_AVRC_TG_SET_ABSOLUTE_VOLUME_CMD_EVT: case ESP_AVRC_TG_REGISTER_NOTIFICATION_EVT: case ESP_AVRC_TG_SET_PLAYER_APP_VALUE_EVT: + case ESP_AVRC_TG_PROF_STATE_EVT: bt_app_work_dispatch(bt_av_hdl_avrc_tg_evt, event, param, sizeof(esp_avrc_tg_cb_param_t), NULL); break; default: diff --git a/examples/bluetooth/bluedroid/classic_bt/a2dp_sink/main/main.c b/examples/bluetooth/bluedroid/classic_bt/a2dp_sink/main/main.c index ea9f4abf142..198f1d1df08 100644 --- a/examples/bluetooth/bluedroid/classic_bt/a2dp_sink/main/main.c +++ b/examples/bluetooth/bluedroid/classic_bt/a2dp_sink/main/main.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -153,17 +153,17 @@ static void bt_av_hdl_stack_evt(uint16_t event, void *p_param) esp_bt_dev_register_callback(bt_app_dev_cb); esp_bt_gap_register_callback(bt_app_gap_cb); - assert(esp_avrc_ct_init() == ESP_OK); esp_avrc_ct_register_callback(bt_app_rc_ct_cb); - assert(esp_avrc_tg_init() == ESP_OK); + assert(esp_avrc_ct_init() == ESP_OK); esp_avrc_tg_register_callback(bt_app_rc_tg_cb); + assert(esp_avrc_tg_init() == ESP_OK); esp_avrc_rn_evt_cap_mask_t evt_set = {0}; esp_avrc_rn_evt_bit_mask_operation(ESP_AVRC_BIT_MASK_OP_SET, &evt_set, ESP_AVRC_RN_VOLUME_CHANGE); assert(esp_avrc_tg_set_rn_evt_cap(&evt_set) == ESP_OK); - assert(esp_a2d_sink_init() == ESP_OK); esp_a2d_register_callback(&bt_app_a2d_cb); + assert(esp_a2d_sink_init() == ESP_OK); esp_a2d_sink_register_data_callback(bt_app_a2d_data_cb); /* Get the default value of the delay value */ From 571fe2eae64c99c59361465e0178a820059671b1 Mon Sep 17 00:00:00 2001 From: luoxu Date: Fri, 30 May 2025 11:08:46 +0800 Subject: [PATCH 006/213] fix(ble_mesh): fixed issues with proxy solic pdu adv --- components/bt/esp_ble_mesh/core/adv.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/components/bt/esp_ble_mesh/core/adv.c b/components/bt/esp_ble_mesh/core/adv.c index 79932a05829..f2bd9c60d86 100644 --- a/components/bt/esp_ble_mesh/core/adv.c +++ b/components/bt/esp_ble_mesh/core/adv.c @@ -2,7 +2,7 @@ /* * SPDX-FileCopyrightText: 2017 Intel Corporation - * SPDX-FileContributor: 2018-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileContributor: 2018-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -190,12 +190,11 @@ static inline int adv_send(struct net_buf *buf) #if CONFIG_BLE_MESH_PROXY_SOLIC_PDU_TX if (BLE_MESH_ADV(buf)->type == BLE_MESH_ADV_PROXY_SOLIC) { bt_mesh_adv_buf_ref_debug(__func__, buf, 3U, BLE_MESH_BUF_REF_SMALL); - struct bt_mesh_adv_data solic_ad[3] = { - BLE_MESH_ADV_DATA_BYTES(BLE_MESH_DATA_FLAGS, (BLE_MESH_AD_GENERAL | BLE_MESH_AD_NO_BREDR)), + struct bt_mesh_adv_data solic_ad[2] = { BLE_MESH_ADV_DATA_BYTES(BLE_MESH_DATA_UUID16_ALL, 0x59, 0x18), BLE_MESH_ADV_DATA(BLE_MESH_DATA_SVC_DATA16, buf->data, buf->len), }; - err = bt_le_adv_start(¶m, solic_ad, 3, NULL, 0); + err = bt_le_adv_start(¶m, solic_ad, ARRAY_SIZE(solic_ad), NULL, 0); } else #endif { From e7c2b9a8f8610266aa66c5cfec832a0358e78ac5 Mon Sep 17 00:00:00 2001 From: Sarvesh Bodakhe Date: Thu, 29 May 2025 21:46:45 +0530 Subject: [PATCH 007/213] fix(wif): Prevent NON-PMF STA retries if esp_wifi_disconnect() before handshake Ensure that NON-PMF station does not attemp connection retries when 'esp_wifi_disconnect()' is called before the 4-way-handshake completes, even if 'failure_retry_cnt' allows retries. --- components/esp_wifi/lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esp_wifi/lib b/components/esp_wifi/lib index 206fe3e13e7..2b5492b9f1b 160000 --- a/components/esp_wifi/lib +++ b/components/esp_wifi/lib @@ -1 +1 @@ -Subproject commit 206fe3e13e788b5fad8be6d39b5d9742e4bd9985 +Subproject commit 2b5492b9f1b940d06f9d2636fa29279a9db4702d From 421f499317ff821e19209e762988dbf42b9acdd8 Mon Sep 17 00:00:00 2001 From: Jan Beran Date: Mon, 2 Jun 2025 10:16:55 +0200 Subject: [PATCH 008/213] change(gen_soc_caps_kconfig): check if config options have the same type Also introduce ignore pragma to prevent some #defines from .h files to be translated to Kconfig files. --- .../soc/esp32/include/soc/Kconfig.soc_caps.in | 28 ++-- components/soc/esp32/include/soc/soc_caps.h | 16 +- .../esp32s2/include/soc/Kconfig.soc_caps.in | 8 +- components/soc/esp32s2/include/soc/soc_caps.h | 10 +- .../esp32s3/include/soc/Kconfig.soc_caps.in | 8 +- components/soc/esp32s3/include/soc/soc_caps.h | 6 +- tools/gen_soc_caps_kconfig/README.md | 2 + .../gen_soc_caps_kconfig.py | 141 ++++++++++++------ .../test/test_gen_soc_caps_kconfig.py | 13 +- 9 files changed, 143 insertions(+), 89 deletions(-) diff --git a/components/soc/esp32/include/soc/Kconfig.soc_caps.in b/components/soc/esp32/include/soc/Kconfig.soc_caps.in index b95b24029e4..3cc86094ff8 100644 --- a/components/soc/esp32/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32/include/soc/Kconfig.soc_caps.in @@ -3,18 +3,6 @@ # using gen_soc_caps_kconfig.py, do not edit manually ##################################################### -config SOC_BROWNOUT_RESET_SUPPORTED - string - default "Not determined" - -config SOC_TWAI_BRP_DIV_SUPPORTED - string - default "Not determined" - -config SOC_DPORT_WORKAROUND - string - default "Not determined" - config SOC_CAPS_ECO_VER_MAX int default 301 @@ -279,6 +267,10 @@ config SOC_ADC_SHARED_POWER bool default y +config SOC_BROWNOUT_RESET_SUPPORTED + bool + default y + config SOC_SHARED_IDCACHE_SUPPORTED bool default y @@ -312,8 +304,8 @@ config SOC_CPU_WATCHPOINTS_NUM default 2 config SOC_CPU_WATCHPOINT_MAX_REGION_SIZE - int - default 64 + hex + default 0x40 config SOC_DAC_CHAN_NUM int @@ -808,8 +800,8 @@ config SOC_MPI_MEM_BLOCKS_NUM default 4 config SOC_MPI_OPERATIONS_NUM - bool - default y + int + default 1 config SOC_RSA_MAX_BIT_LEN int @@ -832,8 +824,8 @@ config SOC_SECURE_BOOT_V1 default y config SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS - bool - default y + int + default 1 config SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX int diff --git a/components/soc/esp32/include/soc/soc_caps.h b/components/soc/esp32/include/soc/soc_caps.h index 5a39b7655f5..c26ad0b8008 100644 --- a/components/soc/esp32/include/soc/soc_caps.h +++ b/components/soc/esp32/include/soc/soc_caps.h @@ -1,6 +1,6 @@ /* - * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2020-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -54,9 +54,9 @@ // Define warning strings here for ECO-ed features to show error when they are used without being // defined correctly -#define SOC_BROWNOUT_RESET_SUPPORTED "Not determined" -#define SOC_TWAI_BRP_DIV_SUPPORTED "Not determined" -#define SOC_DPORT_WORKAROUND "Not determined" +#define SOC_BROWNOUT_RESET_SUPPORTED "Not determined" // [gen_soc_caps:ignore] +#define SOC_TWAI_BRP_DIV_SUPPORTED "Not determined" // [gen_soc_caps:ignore] +#define SOC_DPORT_WORKAROUND "Not determined" // [gen_soc_caps:ignore] #endif /*-------------------------- COMMON CAPS ---------------------------------------*/ @@ -107,7 +107,7 @@ #define SOC_PM_SUPPORTED 1 #if SOC_CAPS_ECO_VER < 200 -#define SOC_DPORT_WORKAROUND 1 +#define SOC_DPORT_WORKAROUND 1 // [gen_soc_caps:ignore] #endif // SOC_CAPS_ECO_VER < 200 #define SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL (5U) @@ -162,7 +162,7 @@ #define SOC_CPU_BREAKPOINTS_NUM 2 #define SOC_CPU_WATCHPOINTS_NUM 2 -#define SOC_CPU_WATCHPOINT_MAX_REGION_SIZE 64 // bytes +#define SOC_CPU_WATCHPOINT_MAX_REGION_SIZE 0x40 // bytes /*-------------------------- DAC CAPS ----------------------------------------*/ #define SOC_DAC_CHAN_NUM 2 @@ -381,7 +381,7 @@ /*--------------------------- MPI CAPS ---------------------------------------*/ #define SOC_MPI_MEM_BLOCKS_NUM (4) -#define SOC_MPI_OPERATIONS_NUM (1) +#define SOC_MPI_OPERATIONS_NUM (1U) /*--------------------------- RSA CAPS ---------------------------------------*/ #define SOC_RSA_MAX_BIT_LEN (4096) @@ -399,7 +399,7 @@ * Hence, for now we are handling this special capability in bootloader "security" configuration itself. */ #define SOC_SECURE_BOOT_V1 1 -#define SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS 1 +#define SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS (1U) /*-------------------------- Flash Encryption CAPS----------------------------*/ #define SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX (32) diff --git a/components/soc/esp32s2/include/soc/Kconfig.soc_caps.in b/components/soc/esp32s2/include/soc/Kconfig.soc_caps.in index 8110c9b64ab..a1cfe60af74 100644 --- a/components/soc/esp32s2/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32s2/include/soc/Kconfig.soc_caps.in @@ -348,8 +348,8 @@ config SOC_CPU_WATCHPOINTS_NUM default 2 config SOC_CPU_WATCHPOINT_MAX_REGION_SIZE - int - default 64 + hex + default 0x40 config SOC_DAC_CHAN_NUM int @@ -776,8 +776,8 @@ config SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED default y config SOC_SYSTIMER_COUNTER_NUM - bool - default y + int + default 1 config SOC_SYSTIMER_ALARM_NUM int diff --git a/components/soc/esp32s2/include/soc/soc_caps.h b/components/soc/esp32s2/include/soc/soc_caps.h index 377a1720efb..862157aabbb 100644 --- a/components/soc/esp32s2/include/soc/soc_caps.h +++ b/components/soc/esp32s2/include/soc/soc_caps.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2020-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2020-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -22,8 +22,8 @@ * x 0`, it's still a risk.) * * ECO & exceptions: - * For ECO-ed booleans, `#define x "Not determined"` for them. This will cause error when used by - * `#if x` and `#if !x`, making these missing definitions more obvious. + * For ECO-ed booleans, `#define x "Not determined" // [gen_soc_caps:ignore]` for them. This will cause error when used by + * `#if x` and `#if !x`, making these missing definitions more obvious. Ignore pragma ensures those values are not converted into config options. * * These defines are parsed and imported as kconfig variables via the script * `tools/gen_soc_caps_kconfig/gen_soc_caps_kconfig.py` @@ -148,7 +148,7 @@ #define SOC_CPU_BREAKPOINTS_NUM 2 #define SOC_CPU_WATCHPOINTS_NUM 2 -#define SOC_CPU_WATCHPOINT_MAX_REGION_SIZE 64 // bytes +#define SOC_CPU_WATCHPOINT_MAX_REGION_SIZE 0x40 // bytes /*-------------------------- DAC CAPS ----------------------------------------*/ #define SOC_DAC_CHAN_NUM 2 @@ -329,7 +329,7 @@ #define SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED 1 /*-------------------------- SYSTIMER CAPS ----------------------------------*/ -#define SOC_SYSTIMER_COUNTER_NUM 1 // Number of counter units +#define SOC_SYSTIMER_COUNTER_NUM (1U) // Number of counter units #define SOC_SYSTIMER_ALARM_NUM 3 // Number of alarm units #define SOC_SYSTIMER_BIT_WIDTH_LO 32 // Bit width of systimer low part #define SOC_SYSTIMER_BIT_WIDTH_HI 32 // Bit width of systimer high part diff --git a/components/soc/esp32s3/include/soc/Kconfig.soc_caps.in b/components/soc/esp32s3/include/soc/Kconfig.soc_caps.in index de84378125b..4031e836a15 100644 --- a/components/soc/esp32s3/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32s3/include/soc/Kconfig.soc_caps.in @@ -412,8 +412,8 @@ config SOC_CPU_WATCHPOINTS_NUM default 2 config SOC_CPU_WATCHPOINT_MAX_REGION_SIZE - int - default 64 + hex + default 0x40 config SOC_SIMD_PREFERRED_DATA_ALIGNMENT int @@ -840,8 +840,8 @@ config SOC_LP_IO_CLOCK_IS_INDEPENDENT default y config SOC_SDM_GROUPS - bool - default y + int + default 1 config SOC_SDM_CHANNELS_PER_GROUP int diff --git a/components/soc/esp32s3/include/soc/soc_caps.h b/components/soc/esp32s3/include/soc/soc_caps.h index 84d6683cdc3..d97e7538c98 100644 --- a/components/soc/esp32s3/include/soc/soc_caps.h +++ b/components/soc/esp32s3/include/soc/soc_caps.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2019-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2019-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -146,7 +146,7 @@ #define SOC_CPU_BREAKPOINTS_NUM 2 #define SOC_CPU_WATCHPOINTS_NUM 2 -#define SOC_CPU_WATCHPOINT_MAX_REGION_SIZE 64 // bytes +#define SOC_CPU_WATCHPOINT_MAX_REGION_SIZE 0x40 // bytes #define SOC_SIMD_PREFERRED_DATA_ALIGNMENT 16 // The preferred data alignment accepted by the SIMD instructions, in bytes @@ -327,7 +327,7 @@ #define SOC_LP_IO_CLOCK_IS_INDEPENDENT 1 /*-------------------------- Sigma Delta Modulator CAPS -----------------*/ -#define SOC_SDM_GROUPS 1 +#define SOC_SDM_GROUPS (1U) #define SOC_SDM_CHANNELS_PER_GROUP 8 #define SOC_SDM_CLK_SUPPORT_APB 1 diff --git a/tools/gen_soc_caps_kconfig/README.md b/tools/gen_soc_caps_kconfig/README.md index 2238c47531e..57d6d314332 100644 --- a/tools/gen_soc_caps_kconfig/README.md +++ b/tools/gen_soc_caps_kconfig/README.md @@ -19,3 +19,5 @@ Defines that are 0 or 1 will automatically be interpreted as Booleans. If it's n The script is not able to evaluate expressions, e.g X*Y. If you need a variable to be available in kconfig it needs to be a simple assignment expression. + +If some `#define` statement should be excluded from being converted into config option, use `// [gen_soc_caps:ignore]` pragma. \ No newline at end of file diff --git a/tools/gen_soc_caps_kconfig/gen_soc_caps_kconfig.py b/tools/gen_soc_caps_kconfig/gen_soc_caps_kconfig.py index af6cfefc02b..02c34bbdf8d 100755 --- a/tools/gen_soc_caps_kconfig/gen_soc_caps_kconfig.py +++ b/tools/gen_soc_caps_kconfig/gen_soc_caps_kconfig.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -# SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 """ Generate Kconfig.soc_caps.in with defines from soc_caps.h @@ -9,6 +9,7 @@ import argparse import inspect import io import logging +import os import sys from difflib import unified_diff from os import path @@ -22,11 +23,12 @@ from pyparsing import Char from pyparsing import Combine from pyparsing import Group from pyparsing import hexnums +from pyparsing import Keyword from pyparsing import Literal from pyparsing import nums from pyparsing import OneOrMore from pyparsing import Optional -from pyparsing import ParserElement +from pyparsing import ParserElement # noqa: F401 # pylint: disable=unused-import from pyparsing import QuotedString from pyparsing import restOfLine from pyparsing import Suppress @@ -40,50 +42,49 @@ except ImportError: pass -class KconfigWriter(): - PREAMBLE = inspect.cleandoc(''' +class KconfigWriter: + PREAMBLE = inspect.cleandoc(""" ##################################################### # This file is auto-generated from SoC caps # using gen_soc_caps_kconfig.py, do not edit manually ##################################################### - ''') + """) KCONFIG_ENTRY_TEMPLATE = Template( - inspect.cleandoc(''' + inspect.cleandoc(""" config $name $entry_type default $value - ''')) + """) + ) KCONFIG_CONDITION_SOURCE_TEMPLATE = Template( - inspect.cleandoc(''' + inspect.cleandoc(""" if $condition source "$source_path" endif - ''')) - - def __init__(self): # type: () -> None - self.entries = set('') + """) + ) + def __init__(self, path, always_write): # type: (str, bool) -> None self.kconfig_text = io.StringIO('') self.kconfig_text.write(self.PREAMBLE) - def add_entry(self, name, entry_type, value): # type: (str, str, typing.Any) -> None + # NAME: (type, val) + self.entries = dict() # type: typing.Dict[str, typing.Tuple[str, typing.Any]] # key: config name, value: tuple of (config_type, config_value) + self.kconfig_path = path + self.always_write = always_write + def add_entry(self, name, entry_type, value): # type: (str, str, typing.Any) -> None if name in self.entries: logging.info('Duplicate entry: {}'.format(name)) return - self.entries.add(name) - self.kconfig_text.write('\n\n') - # Format values for kconfig if entry_type == 'bool': value = 'y' if value else 'n' elif entry_type == 'string': value = '"' + value + '"' - - entry = self.KCONFIG_ENTRY_TEMPLATE.substitute(name=name, entry_type=entry_type, value=value) - self.kconfig_text.write(entry) + self.entries[name] = (entry_type, value) def add_source(self, source_path, condition): # type: (str, str) -> None self.kconfig_text.write('\n\n') @@ -93,10 +94,16 @@ class KconfigWriter(): else: self.kconfig_text.write('source "' + source_path + '"') - def update_file(self, kconfig_path, always_write): # type: (Path, bool) -> bool + def update_file(self): # type: () -> bool + for entry_name in self.entries: + self.kconfig_text.write('\n\n') + config_option = self.KCONFIG_ENTRY_TEMPLATE.substitute( + name=entry_name, entry_type=self.entries[entry_name][0], value=self.entries[entry_name][1] + ) + self.kconfig_text.write(config_option) try: - with open(kconfig_path, 'r', encoding='utf-8') as f: + with open(self.kconfig_path, 'r', encoding='utf-8') as f: old_content = f.readlines() except FileNotFoundError: old_content = [''] @@ -105,17 +112,17 @@ class KconfigWriter(): new_content = self.kconfig_text.readlines() new_content[-1] += '\n' # Add final newline to end of file - file_needs_update = always_write + file_needs_update = self.always_write # Check if file was updated and print diff for users - diff = unified_diff(old_content, new_content, fromfile=str(kconfig_path), n=2) + diff = unified_diff(old_content, new_content, fromfile=str(self.kconfig_path), n=2) for line in diff: print(line, end='') file_needs_update = True if file_needs_update: - print('\n' + 'Updating file: {}'.format(kconfig_path)) - with open(kconfig_path, 'w', encoding='utf-8') as f: + print('\n' + 'Updating file: {}'.format(self.kconfig_path)) + with open(self.kconfig_path, 'w', encoding='utf-8') as f: f.writelines(new_content) return file_needs_update @@ -138,7 +145,6 @@ def parse_include(inc_line): # type: (str) -> typing.Any[typing.Type[ParserElem def parse_define(define_line): # type: (str) -> typing.Any[typing.Type[ParserElement]] - # Group for parsing literal suffix of a numbers, e.g. 100UL literal_symbol = Group(CaselessLiteral('L') | CaselessLiteral('U')) literal_suffix = OneOrMore(literal_symbol) @@ -148,23 +154,29 @@ def parse_define(define_line): # type: (str) -> typing.Any[typing.Type[ParserEl # Define value, either a hex, int or a string hex_value = Combine(Literal('0x') + Word(hexnums) + Optional(literal_suffix).suppress())('hex_value') - int_value = Combine(Optional('-') + Word(nums))('int_value') + ~Char('.') + Optional(literal_suffix)('literal_suffix') + int_value = ( + Combine(Optional('-') + Word(nums))('int_value') + ~Char('.') + Optional(literal_suffix)('literal_suffix') + ) str_value = QuotedString('"')('str_value') # Remove optional parenthesis around values - value = Optional('(').suppress() + (hex_value ^ int_value ^ str_value)('value') + Optional(')').suppress() + value = Optional('(').suppress() + (hex_value ^ int_value ^ str_value)('value') + Optional(')').suppress() - expr = '#define' + Optional(name)('name') + Optional(value) + # Define ignore pragma (if present, define will be ignored) + ignore_pragma = Literal('//') + Keyword('[gen_soc_caps:ignore]') + + expr = ( + '#define' + Optional(name)('name') + Optional(value) + Optional(ignore_pragma).set_results_name('ignore_pragma') + ) res = expr.parseString(define_line) return res -def generate_defines(soc_caps_dir, filename, always_write): # type: (Path, str, bool) -> bool - +def generate_defines(soc_caps_dir, filename, always_write): # type: (Path, str, bool) -> typing.Union[KconfigWriter, None] soc_headers = list(soc_caps_dir.glob(filename)) if soc_headers == []: - return False + return None # Sort header files to make the generated files deterministic soc_headers.sort(key=lambda file: file.name) @@ -173,13 +185,15 @@ def generate_defines(soc_caps_dir, filename, always_write): # type: (Path, str, for soc_header in soc_headers: defines.extend(get_defines(soc_header)) - writer = KconfigWriter() + writer = KconfigWriter(os.path.join(soc_caps_dir, 'Kconfig.soc_caps.in'), always_write) for line in defines: try: inc = parse_include(line) if 'inc_path' in inc and 'recursive' in inc and inc['inc_path'][-6:] == 'caps.h': - source_path = path.join('$IDF_PATH', str(soc_caps_dir), path.dirname(inc['inc_path']), 'Kconfig.soc_caps.in') + source_path = path.join( + '$IDF_PATH', str(soc_caps_dir), path.dirname(inc['inc_path']), 'Kconfig.soc_caps.in' + ) condition = inc['condition'].strip(' ') if 'condition' in inc else '' writer.add_source(source_path, condition) sub_soc_cap_dir = soc_caps_dir.joinpath(str(inc['inc_path'])).parent @@ -194,6 +208,10 @@ def generate_defines(soc_caps_dir, filename, always_write): # type: (Path, str, logging.debug('Failed to parse: {}'.format(line)) continue + if res.ignore_pragma: + # Ignore this define + continue + # Add the kconfig entry corresponding to the type we parsed if 'str_value' in res: writer.add_entry(res.name, 'string', res.str_value) @@ -209,10 +227,7 @@ def generate_defines(soc_caps_dir, filename, always_write): # type: (Path, str, elif 'hex_value' in res: writer.add_entry(res.name, 'hex', res.hex_value) - # Updates output if necessary - updated = writer.update_file(Path(soc_caps_dir) / 'Kconfig.soc_caps.in', always_write) - - return updated + return writer def get_defines(header_path): # type: (Path) -> list[str] @@ -230,12 +245,15 @@ def get_defines(header_path): # type: (Path) -> list[str] if __name__ == '__main__': - parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('-d', '--dir', help='SoC caps folder paths, support wildcards', nargs='+', default=[]) - parser.add_argument('-n', '--filename', nargs='?', default='*caps.h', - help='SoC caps filename, support wildcards') - parser.add_argument('-v', '--verbose', action='count', help='Increase the logging level of the script. Can be specified multiple times.') + parser.add_argument('-n', '--filename', nargs='?', default='*caps.h', help='SoC caps filename, support wildcards') + parser.add_argument( + '-v', + '--verbose', + action='count', + help='Increase the logging level of the script. Can be specified multiple times.', + ) parser.add_argument('--always-write', help='Always generate new output files', action='store_true') args = parser.parse_args() @@ -249,10 +267,47 @@ if __name__ == '__main__': logging.basicConfig(level=log_level) files_updated = [] + writers = [] # type: typing.List[typing.Optional[KconfigWriter]] for caps_dir in args.dir: soc_caps_dirs = Path().glob(caps_dir) - files_updated += [generate_defines(d, args.filename, args.always_write) for d in soc_caps_dirs if path.isdir(d)] + new_writers = [generate_defines(d, args.filename, args.always_write) for d in soc_caps_dirs if path.isdir(d)] + writers.extend(new_writers) + configs = dict() # type: typing.Dict[str, str] # key: config name, value: config_type + configs_with_differing_types = dict() # type: typing.Dict[str, typing.Set[str]] # key: config name, value: set of types + for writer in writers: + if writer is None: + continue + for config_name in writer.entries: + if config_name in configs: + type_in_writer = writer.entries[config_name][0] + type_in_configs = configs[config_name] + if type_in_writer != type_in_configs: + if config_name not in configs_with_differing_types: + configs_with_differing_types[config_name] = set() + configs_with_differing_types[config_name].add(type_in_writer) + configs_with_differing_types[config_name].add(type_in_configs) + + else: + configs[config_name] = writer.entries[config_name][0] + + if configs_with_differing_types: + print( + 'The following macro constants would be translated to config options with different types' + ' for different targets (which may lead to unexpected behavior).' + ) + + for config_name in configs_with_differing_types: + print( + f' {config_name} has types' + f'{", ".join(config_type for config_type in configs_with_differing_types[config_name])}' + ) + + print('Please ensure all the macro constants will translate to the same config type for all targets.') + + sys.exit(1) + + files_updated = [writer.update_file() for writer in writers if writer is not None] print('Updated {} files'.format(sum(files_updated))) sys.exit(all(files_updated)) diff --git a/tools/gen_soc_caps_kconfig/test/test_gen_soc_caps_kconfig.py b/tools/gen_soc_caps_kconfig/test/test_gen_soc_caps_kconfig.py index 4d0cd796fff..398a1539515 100755 --- a/tools/gen_soc_caps_kconfig/test/test_gen_soc_caps_kconfig.py +++ b/tools/gen_soc_caps_kconfig/test/test_gen_soc_caps_kconfig.py @@ -1,7 +1,6 @@ #!/usr/bin/env python -# SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 - import sys import unittest @@ -13,7 +12,6 @@ except ImportError: class ParserTests(unittest.TestCase): - def test_parse_name(self): res = gen_soc_caps_kconfig.parse_define('#define TEST_NAME (2)') self.assertEqual(res.name, 'TEST_NAME') @@ -44,10 +42,17 @@ class ParserTests(unittest.TestCase): self.assertEqual(res.int_value, '329000') def test_parse_float(self): - # Kconfig doesnt support floats, should not be parsed as anything + # Kconfig doesn't support floats, should not be parsed as anything res = gen_soc_caps_kconfig.parse_define('#define TEST_FLOAT (3.14)') self.assertEqual(res.value, '') + def test_parse_ignore_pragma(self): + res = gen_soc_caps_kconfig.parse_define('#define TEST_IGNORE // [gen_soc_caps:ignore]') + self.assertEqual(' '.join(res.ignore_pragma), '// [gen_soc_caps:ignore]') + + res = gen_soc_caps_kconfig.parse_define('#define TEST_NO_IGNORE') + self.assertEqual(res.ignore_pragma, '') + if __name__ == '__main__': print('Running gen_soc_caps_config tests...') From 628d7ad77d0b169efe02cb7a2eb81d69d8a29501 Mon Sep 17 00:00:00 2001 From: Roman Leonov Date: Mon, 2 Jun 2025 17:35:30 +0800 Subject: [PATCH 009/213] refactor(ext_hub): Device release (allows to run usb_host test with ext hub) 754d357f refactor(ext_hub): Fixed device release, optimized the order of closing usbh device fc61875a refactor(ext_hub): Pospone the device release, if device is not IDLE 3fd17b8b refactor(hub): Applied new ext_hub api, refactor func names 3003362b refactor(usb_host): Cancel hub porpagation to the user, rename non-critical func 19ce9ed6 refactor(test_usb_host_async): Added host_lib_task finish notification f238d75b refactor(ext_port): Remove the error verification, as error will be handled in ext hub driver Co-authored-by: Roman Leonov --- components/usb/ext_hub.c | 196 +++++++----------- components/usb/ext_port.c | 2 +- components/usb/hub.c | 16 +- components/usb/private_include/ext_hub.h | 5 +- components/usb/private_include/hub.h | 4 +- .../usb_host/main/test_usb_host_async.c | 14 +- components/usb/usb_host.c | 22 +- 7 files changed, 113 insertions(+), 146 deletions(-) diff --git a/components/usb/ext_hub.c b/components/usb/ext_hub.c index dbfdd43df21..9fc2b8961f8 100644 --- a/components/usb/ext_hub.c +++ b/components/usb/ext_hub.c @@ -312,13 +312,32 @@ static bool _device_set_actions(ext_hub_dev_t *ext_hub_dev, uint32_t action_flag static esp_err_t device_enable_int_ep(ext_hub_dev_t *ext_hub_dev) { - ESP_LOGD(EXT_HUB_TAG, "[%d] Enable EP IN", ext_hub_dev->constant.dev_addr); - esp_err_t ret = usbh_ep_enqueue_urb(ext_hub_dev->constant.ep_in_hdl, ext_hub_dev->constant.in_urb); - if (ret != ESP_OK) { - ESP_LOGE(EXT_HUB_TAG, "[%d] Failed to submit in urb: %s", ext_hub_dev->constant.dev_addr, esp_err_to_name(ret)); - device_error(ext_hub_dev); + bool call_proc_req_cb = false; + bool is_active = true; + ESP_LOGD(EXT_HUB_TAG, "[%d] Device ports handle complete", ext_hub_dev->constant.dev_addr); + + // Check if the device should be released + EXT_HUB_ENTER_CRITICAL(); + if (ext_hub_dev->dynamic.flags.waiting_release) { + is_active = false; + call_proc_req_cb = _device_set_actions(ext_hub_dev, DEV_ACTION_RELEASE); } - return ret; + EXT_HUB_EXIT_CRITICAL(); + + if (is_active) { + ESP_LOGD(EXT_HUB_TAG, "[%d] Enable IN EP", ext_hub_dev->constant.dev_addr); + esp_err_t ret = usbh_ep_enqueue_urb(ext_hub_dev->constant.ep_in_hdl, ext_hub_dev->constant.in_urb); + if (ret != ESP_OK) { + ESP_LOGE(EXT_HUB_TAG, "[%d] Failed to submit in urb: %s", ext_hub_dev->constant.dev_addr, esp_err_to_name(ret)); + device_error(ext_hub_dev); + } + return ret; + } + + if (call_proc_req_cb) { + p_ext_hub_driver->constant.proc_req_cb(false, p_ext_hub_driver->constant.proc_req_cb_arg); + } + return ESP_OK; } static void device_has_changed(ext_hub_dev_t *ext_hub_dev) @@ -420,7 +439,6 @@ static esp_err_t device_port_free(ext_hub_dev_t *ext_hub_dev, uint8_t port_idx) EXT_HUB_CHECK(ext_hub_dev->constant.ports[port_idx] != NULL, ESP_ERR_INVALID_STATE); bool call_proc_req_cb = false; - bool all_ports_freed = false; assert(ext_hub_dev->single_thread.maxchild != 0); assert(p_ext_hub_driver->constant.port_driver); @@ -435,25 +453,11 @@ static esp_err_t device_port_free(ext_hub_dev_t *ext_hub_dev, uint8_t port_idx) ext_hub_dev->single_thread.maxchild--; EXT_HUB_ENTER_CRITICAL(); - if (ext_hub_dev->dynamic.flags.is_gone) { - all_ports_freed = (ext_hub_dev->single_thread.maxchild == 0); - - if (all_ports_freed) { - ext_hub_dev->dynamic.flags.waiting_children = 0; - ext_hub_dev->dynamic.flags.waiting_free = 1; - call_proc_req_cb = _device_set_actions(ext_hub_dev, DEV_ACTION_FREE); - } else { - ext_hub_dev->dynamic.flags.waiting_children = 1; - } + if (ext_hub_dev->dynamic.flags.waiting_free && ext_hub_dev->single_thread.maxchild == 0) { + call_proc_req_cb = _device_set_actions(ext_hub_dev, DEV_ACTION_FREE); } EXT_HUB_EXIT_CRITICAL(); - // Close the device if all children were freed - if (all_ports_freed) { - ESP_LOGD(EXT_HUB_TAG, "[%d] Release USBH device object", ext_hub_dev->constant.dev_addr); - ESP_ERROR_CHECK(usbh_dev_close(ext_hub_dev->constant.dev_hdl)); - } - if (call_proc_req_cb) { p_ext_hub_driver->constant.proc_req_cb(false, p_ext_hub_driver->constant.proc_req_cb_arg); } @@ -463,71 +467,60 @@ exit: return ret; } -static esp_err_t device_release_ports(ext_hub_dev_t *ext_hub_dev) +static esp_err_t device_release_port(ext_hub_dev_t *ext_hub_dev, uint8_t port_idx) { - esp_err_t ret = ESP_OK; - // Mark all ports as gone - for (uint8_t i = 0; i < ext_hub_dev->constant.hub_desc->bNbrPorts; i++) { - // Only for ports, that were created - if (ext_hub_dev->constant.ports[i] != NULL) { - // Mark port as gone - ret = p_ext_hub_driver->constant.port_driver->gone(ext_hub_dev->constant.ports[i]); - if (ret == ESP_OK) { - // Port doesn't have a device and can be recycled right now - ESP_ERROR_CHECK(device_port_free(ext_hub_dev, i)); - } else if (ret == ESP_ERR_NOT_FINISHED) { - // Port has a device and will be recycled after USBH device will be released by all clients and freed - ESP_LOGE(EXT_HUB_TAG, "[%d:%d] Port is gone", ext_hub_dev->constant.dev_addr, i + 1); - // Not an error case, but it's good to notify this with the error message - // TODO: IDF-12173 remove the error, instead set up the flag and verify the flag while recycle - ret = ESP_OK; - } else { - ESP_LOGE(EXT_HUB_TAG, "[%d:%d] Unable to mark port as gone: %s", - ext_hub_dev->constant.dev_addr, i + 1, esp_err_to_name(ret)); - return ret; - } - } else { - ESP_LOGE(EXT_HUB_TAG, "[%d:%d] Port was not created", ext_hub_dev->constant.dev_addr, i + 1); - } + assert(ext_hub_dev->constant.ports[port_idx] != NULL); + assert(ext_hub_dev->single_thread.maxchild != 0); + assert(p_ext_hub_driver->constant.port_driver); + + // Mark port as gone + esp_err_t ret = p_ext_hub_driver->constant.port_driver->gone(ext_hub_dev->constant.ports[port_idx]); + if (ret == ESP_OK) { + // Port doesn't have a device and can be freed right now + ESP_ERROR_CHECK(device_port_free(ext_hub_dev, port_idx)); + } else if (ret == ESP_ERR_NOT_FINISHED) { + // Port has a device and will be freed on recycle + EXT_HUB_ENTER_CRITICAL(); + ext_hub_dev->dynamic.flags.waiting_children = 1; + EXT_HUB_EXIT_CRITICAL(); + ret = ESP_OK; + } else { + ESP_LOGE(EXT_HUB_TAG, "[%d:%d] Unable to mark port as gone: %s", + ext_hub_dev->constant.dev_addr, port_idx + 1, esp_err_to_name(ret)); + return ret; } + return ret; } +static void device_release_ports(ext_hub_dev_t *ext_hub_dev) +{ + assert(ext_hub_dev->constant.hub_desc->bNbrPorts); // Sanity check + for (uint8_t i = 0; i < ext_hub_dev->constant.hub_desc->bNbrPorts; i++) { + ESP_ERROR_CHECK(device_release_port(ext_hub_dev, i)); + } +} + static void device_release(ext_hub_dev_t *ext_hub_dev) { ESP_LOGD(EXT_HUB_TAG, "[%d] Device release", ext_hub_dev->constant.dev_addr); EXT_HUB_ENTER_CRITICAL(); - assert(ext_hub_dev->dynamic.flags.waiting_release); // Device should waiting the release - ext_hub_dev->dynamic.flags.is_gone = 1; + assert(ext_hub_dev->dynamic.flags.waiting_release); // Sanity check ext_hub_dev->dynamic.flags.waiting_release = 0; + ext_hub_dev->dynamic.flags.waiting_free = 1; EXT_HUB_EXIT_CRITICAL(); - // Release IN EP - ESP_ERROR_CHECK(usbh_ep_command(ext_hub_dev->constant.ep_in_hdl, USBH_EP_CMD_HALT)); - switch (ext_hub_dev->single_thread.state) { - case EXT_HUB_STATE_ATTACHED: - // Device has no configured ports, release the USBH device object - ESP_LOGD(EXT_HUB_TAG, "[%d] Release USBH device object", ext_hub_dev->constant.dev_addr); - ESP_ERROR_CHECK(usbh_dev_close(ext_hub_dev->constant.dev_hdl)); - break; case EXT_HUB_STATE_CONFIGURED: case EXT_HUB_STATE_SUSPENDED: assert(ext_hub_dev->constant.hub_desc != NULL); // Device should have a Hub descriptor assert(p_ext_hub_driver->constant.port_driver); // Port driver should be available - - // Release ports if device has them - if (ext_hub_dev->constant.hub_desc->bNbrPorts) { - ESP_ERROR_CHECK(device_release_ports(ext_hub_dev)); - } + device_release_ports(ext_hub_dev); break; default: - // Should never occur - abort(); break; } - ext_hub_dev->single_thread.state = EXT_HUB_STATE_RELEASED; } @@ -771,6 +764,9 @@ static void device_free(ext_hub_dev_t *ext_hub_dev) TAILQ_REMOVE(&p_ext_hub_driver->dynamic.ext_hubs_tailq, ext_hub_dev, dynamic.tailq_entry); EXT_HUB_EXIT_CRITICAL(); + ESP_ERROR_CHECK(usbh_ep_free(ext_hub_dev->constant.ep_in_hdl)); + ESP_ERROR_CHECK(usbh_dev_close(ext_hub_dev->constant.dev_hdl)); + if (ext_hub_dev->constant.hub_desc) { heap_caps_free(ext_hub_dev->constant.hub_desc); } @@ -778,10 +774,8 @@ static void device_free(ext_hub_dev_t *ext_hub_dev) heap_caps_free(ext_hub_dev->constant.ports); } - ESP_ERROR_CHECK(usbh_ep_free(ext_hub_dev->constant.ep_in_hdl)); urb_free(ext_hub_dev->constant.ctrl_urb); urb_free(ext_hub_dev->constant.in_urb); - heap_caps_free(ext_hub_dev); } @@ -1387,6 +1381,7 @@ esp_err_t ext_hub_dev_gone(uint8_t dev_addr) ESP_LOGD(EXT_HUB_TAG, "[%d] Device gone", ext_hub_dev->constant.dev_addr); EXT_HUB_ENTER_CRITICAL(); + ext_hub_dev->dynamic.flags.is_gone = 1; if (ext_hub_dev->dynamic.flags.waiting_release || ext_hub_dev->dynamic.flags.waiting_children) { EXT_HUB_EXIT_CRITICAL(); @@ -1396,7 +1391,7 @@ esp_err_t ext_hub_dev_gone(uint8_t dev_addr) } if ((ext_hub_dev->single_thread.maxchild == 0) && !ext_hub_dev->dynamic.flags.in_pending_list) { - // Not in pending list and doesn't have any children + // Not in pending list and doesn't have any children release and free right away ext_hub_dev->dynamic.flags.waiting_free = 1; ext_hub_dev->dynamic.flags.waiting_release = 1; call_proc_req_cb = _device_set_actions(ext_hub_dev, DEV_ACTION_RELEASE | @@ -1420,10 +1415,9 @@ exit: return ret; } -esp_err_t ext_hub_all_free(void) +void ext_hub_mark_all_free(void) { bool call_proc_req_cb = false; - bool wait_for_free = false; EXT_HUB_ENTER_CRITICAL(); for (int i = 0; i < 2; i++) { @@ -1438,9 +1432,13 @@ esp_err_t ext_hub_all_free(void) while (hub_curr != NULL) { hub_next = TAILQ_NEXT(hub_curr, dynamic.tailq_entry); hub_curr->dynamic.flags.waiting_release = 1; - call_proc_req_cb = _device_set_actions(hub_curr, DEV_ACTION_RELEASE); - // At least one hub should be released - wait_for_free = true; + uint32_t action_flags = DEV_ACTION_EP1_FLUSH | DEV_ACTION_EP1_DEQUEUE; + // If device in the IDLE stage, add the release action + // otherwise, device will be released when the stage changed to IDLE + if (hub_curr->single_thread.stage == EXT_HUB_STAGE_IDLE) { + action_flags |= DEV_ACTION_RELEASE; + } + call_proc_req_cb = _device_set_actions(hub_curr, action_flags); hub_curr = hub_next; } } @@ -1449,8 +1447,6 @@ esp_err_t ext_hub_all_free(void) if (call_proc_req_cb) { p_ext_hub_driver->constant.proc_req_cb(false, p_ext_hub_driver->constant.proc_req_cb_arg); } - - return (wait_for_free) ? ESP_ERR_NOT_FINISHED : ESP_OK; } esp_err_t ext_hub_status_handle_complete(ext_hub_handle_t ext_hub_hdl) @@ -1575,66 +1571,30 @@ esp_err_t ext_hub_port_recycle(ext_hub_handle_t ext_hub_hdl, uint8_t port_num) EXT_HUB_CHECK(ext_hub_hdl != NULL, ESP_ERR_INVALID_ARG); ext_hub_dev_t *ext_hub_dev = (ext_hub_dev_t *)ext_hub_hdl; - esp_err_t ret; uint8_t port_idx = port_num - 1; - bool free_port = false; bool release_port = false; - EXT_HUB_CHECK(port_idx < ext_hub_dev->constant.hub_desc->bNbrPorts, ESP_ERR_INVALID_SIZE); EXT_HUB_CHECK(p_ext_hub_driver->constant.port_driver != NULL, ESP_ERR_NOT_SUPPORTED); EXT_HUB_CHECK(ext_hub_dev->single_thread.state == EXT_HUB_STATE_CONFIGURED || ext_hub_dev->single_thread.state == EXT_HUB_STATE_RELEASED, ESP_ERR_INVALID_STATE); EXT_HUB_ENTER_CRITICAL(); - if (ext_hub_dev->dynamic.flags.waiting_release) { + if (ext_hub_dev->dynamic.flags.waiting_release || + ext_hub_dev->dynamic.flags.waiting_children) { release_port = true; - } else if (ext_hub_dev->dynamic.flags.waiting_children) { - assert(ext_hub_dev->dynamic.flags.waiting_release == 0); // Device should be already released - assert(ext_hub_dev->dynamic.flags.is_gone == 1); // Device should be gone by now - free_port = true; } EXT_HUB_EXIT_CRITICAL(); - if (!release_port && !free_port) { + esp_err_t ret; + if (release_port) { + ret = device_release_port(ext_hub_dev, port_idx); + } else { // Parent still present, recycle the port ret = p_ext_hub_driver->constant.port_driver->recycle(ext_hub_dev->constant.ports[port_idx]); if (ret != ESP_OK) { ESP_LOGE(EXT_HUB_TAG, "[%d:%d] Unable to recycle the port: %s", ext_hub_dev->constant.dev_addr, port_num, esp_err_to_name(ret)); - goto exit; - } - } else { - if (release_port) { - // Notify the port that parent is not available anymore and port should be recycled then freed - ret = p_ext_hub_driver->constant.port_driver->gone(ext_hub_dev->constant.ports[port_idx]); - if (ret == ESP_OK) { - ESP_LOGD(EXT_HUB_TAG, "[%d:%d] Port doesn't have a device and can be freed right now", - ext_hub_dev->constant.dev_addr, - port_num); - assert(free_port == false); - free_port = true; - } else if (ret == ESP_ERR_NOT_FINISHED) { - // Port has a device and will be recycled after USBH device will be released by all clients and freed - ESP_LOGE(EXT_HUB_TAG, "[%d:%d] Port is gone", - ext_hub_dev->constant.dev_addr, - port_num); - // Logically, recycling logic are finished for the Hub Driver, return ESP_OK to free the node - assert(free_port == false); - } else { - ESP_LOGE(EXT_HUB_TAG, "[%d:%d] Unable to mark port as gone: %s", - ext_hub_dev->constant.dev_addr, port_num, esp_err_to_name(ret)); - } - } - - if (free_port) { - ret = device_port_free(ext_hub_dev, port_idx); - if (ret != ESP_OK) { - goto exit; - } } } - - ret = ESP_OK; -exit: return ret; } diff --git a/components/usb/ext_port.c b/components/usb/ext_port.c index 5fedc49ae38..eb5f40d3ea9 100644 --- a/components/usb/ext_port.c +++ b/components/usb/ext_port.c @@ -717,7 +717,7 @@ static void handle_port_state(ext_port_t *ext_port) switch (curr_state) { case USB_PORT_STATE_NOT_CONFIGURED: new_state = USB_PORT_STATE_POWERED_OFF; - ESP_ERROR_CHECK(port_request_status(ext_port)); + port_request_status(ext_port); need_handling = true; break; case USB_PORT_STATE_POWERED_OFF: diff --git a/components/usb/hub.c b/components/usb/hub.c index 67c9b0a53fe..404425f8f98 100644 --- a/components/usb/hub.c +++ b/components/usb/hub.c @@ -767,7 +767,7 @@ esp_err_t hub_port_disable(usb_device_handle_t parent_dev_hdl, uint8_t parent_po return ret; } -esp_err_t hub_notify_new_dev(uint8_t dev_addr) +esp_err_t hub_dev_new(uint8_t dev_addr) { HUB_DRIVER_ENTER_CRITICAL(); HUB_DRIVER_CHECK_FROM_CRIT(p_hub_driver_obj != NULL, ESP_ERR_INVALID_STATE); @@ -790,15 +790,15 @@ esp_err_t hub_notify_new_dev(uint8_t dev_addr) } } // Close device - usbh_dev_close(dev_hdl); + ESP_ERROR_CHECK(usbh_dev_close(dev_hdl)); } - // Logic should not stop the flow, so no error to return - ret = ESP_OK; + // Nothing to do, while Hubs support is not enabled + ret = ESP_ERR_NOT_SUPPORTED; #endif // ENABLE_USB_HUBS return ret; } -esp_err_t hub_notify_dev_gone(uint8_t dev_addr) +esp_err_t hub_dev_gone(uint8_t dev_addr) { HUB_DRIVER_ENTER_CRITICAL(); HUB_DRIVER_CHECK_FROM_CRIT(p_hub_driver_obj != NULL, ESP_ERR_INVALID_STATE); @@ -809,7 +809,7 @@ esp_err_t hub_notify_dev_gone(uint8_t dev_addr) ret = ext_hub_dev_gone(dev_addr); #else // Nothing to do, while Hubs support is not enabled - ret = ESP_OK; + ret = ESP_ERR_NOT_SUPPORTED; #endif // ENABLE_USB_HUBS return ret; } @@ -821,7 +821,9 @@ esp_err_t hub_notify_all_free(void) HUB_DRIVER_CHECK_FROM_CRIT(p_hub_driver_obj != NULL, ESP_ERR_INVALID_STATE); HUB_DRIVER_EXIT_CRITICAL(); - return ext_hub_all_free(); + ext_hub_mark_all_free(); + + return ESP_OK; } #endif // ENABLE_USB_HUBS diff --git a/components/usb/private_include/ext_hub.h b/components/usb/private_include/ext_hub.h index be95dbefe3c..f58b9a3383c 100644 --- a/components/usb/private_include/ext_hub.h +++ b/components/usb/private_include/ext_hub.h @@ -131,11 +131,8 @@ esp_err_t ext_hub_dev_gone(uint8_t dev_addr); * Entry: * - should be called within Hub Driver when USB Host library need to be uninstalled * - * @return - * - ESP_OK: All devices freed - * - ESP_ERR_NOT_FINISHED: Operation not finished: devices waiting children to be freed. */ -esp_err_t ext_hub_all_free(void); +void ext_hub_mark_all_free(void); /** * @brief The External Hub or Ports statuses change completed diff --git a/components/usb/private_include/hub.h b/components/usb/private_include/hub.h index f563a56f283..c5ca0aec88b 100644 --- a/components/usb/private_include/hub.h +++ b/components/usb/private_include/hub.h @@ -205,7 +205,7 @@ esp_err_t hub_port_disable(usb_device_handle_t parent_dev_hdl, uint8_t parent_po * - ESP_OK: New device added successfully * - ESP_ERR_INVALID_STATE: Hub driver is not in a correct state */ -esp_err_t hub_notify_new_dev(uint8_t dev_addr); +esp_err_t hub_dev_new(uint8_t dev_addr); /** * @brief Notify Hub driver that device has been removed @@ -221,7 +221,7 @@ esp_err_t hub_notify_new_dev(uint8_t dev_addr); * - ESP_OK: A device removed successfully * - ESP_ERR_INVALID_STATE: Hub driver is not in a correct state */ -esp_err_t hub_notify_dev_gone(uint8_t dev_addr); +esp_err_t hub_dev_gone(uint8_t dev_addr); #if ENABLE_USB_HUBS /** diff --git a/components/usb/test_apps/usb_host/main/test_usb_host_async.c b/components/usb/test_apps/usb_host/main/test_usb_host_async.c index e6917086708..3d68b06495f 100644 --- a/components/usb/test_apps/usb_host/main/test_usb_host_async.c +++ b/components/usb/test_apps/usb_host/main/test_usb_host_async.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -297,6 +297,7 @@ Procedure: */ static void host_lib_task(void *arg) { + TaskHandle_t pending_task = (TaskHandle_t)arg; while (1) { // Start handling system events uint32_t event_flags; @@ -306,10 +307,12 @@ static void host_lib_task(void *arg) TEST_ASSERT_EQUAL(ESP_ERR_NOT_FINISHED, usb_host_device_free_all()); } if (event_flags & USB_HOST_LIB_EVENT_FLAGS_ALL_FREE) { + printf("All devices freed\n"); break; } } - + // Notify the main task that the host library task is done + xTaskNotifyGive(pending_task); printf("Deleting host_lib_task\n"); vTaskDelete(NULL); } @@ -330,13 +333,16 @@ TEST_CASE("Test USB Host multiconfig client (single client)", "[usb_host][full_s xTaskNotifyGive(client_task); TaskHandle_t host_lib_task_hdl; - xTaskCreatePinnedToCore(host_lib_task, "host lib", 4096, NULL, 2, &host_lib_task_hdl, 0); + // Get Current task handle + TaskHandle_t pending_task = xTaskGetCurrentTaskHandle(); + xTaskCreatePinnedToCore(host_lib_task, "host lib", 4096, (void*)pending_task, 2, &host_lib_task_hdl, 0); TEST_ASSERT_NOT_NULL_MESSAGE(host_lib_task_hdl, "Failed to create host lib task"); // Wait for the device to be open xSemaphoreTake(dev_open_smp, portMAX_DELAY); multiconf_client_get_conf_desc(); - + // Wait for the host library task to finish + ulTaskNotifyTake(pdTRUE, portMAX_DELAY); // Cleanup vSemaphoreDelete(dev_open_smp); } diff --git a/components/usb/usb_host.c b/components/usb/usb_host.c index a402d740a46..1d1a06485a8 100644 --- a/components/usb/usb_host.c +++ b/components/usb/usb_host.c @@ -221,7 +221,7 @@ static bool _unblock_lib(bool in_isr) return yield; } -static inline bool _is_internal_client(void *client) +static inline bool is_internal_client(void *client) { if (p_host_lib_obj->constant.enum_client && (client == p_host_lib_obj->constant.enum_client)) { return true; @@ -295,7 +295,7 @@ static void usbh_event_callback(usbh_event_data_t *event_data, void *arg) assert(event_data->ctrl_xfer_data.urb != NULL); assert(event_data->ctrl_xfer_data.urb->usb_host_client != NULL); // Redistribute completed control transfers to the clients that submitted them - if (_is_internal_client(event_data->ctrl_xfer_data.urb->usb_host_client)) { + if (is_internal_client(event_data->ctrl_xfer_data.urb->usb_host_client)) { // Simply call the transfer callback event_data->ctrl_xfer_data.urb->transfer.callback(&event_data->ctrl_xfer_data.urb->transfer); } else { @@ -309,10 +309,11 @@ static void usbh_event_callback(usbh_event_data_t *event_data, void *arg) break; } case USBH_EVENT_NEW_DEV: { - // Internal client - hub_notify_new_dev(event_data->new_dev_data.dev_addr); - // External clients - // Prepare a NEW_DEV client event message, the send it to all clients + if (hub_dev_new(event_data->new_dev_data.dev_addr) == ESP_OK) { + // Device is a hub, we do not need to propagate the event to the clients + break; + } + // Prepare a NEW_DEV client event message, and send it to all clients usb_host_client_event_msg_t event_msg = { .event = USB_HOST_CLIENT_EVENT_NEW_DEV, .new_dev.address = event_data->new_dev_data.dev_addr, @@ -321,10 +322,11 @@ static void usbh_event_callback(usbh_event_data_t *event_data, void *arg) break; } case USBH_EVENT_DEV_GONE: { - // Internal client - hub_notify_dev_gone(event_data->new_dev_data.dev_addr); - // External clients - // Prepare event msg, send only to clients that have opened the device + if (hub_dev_gone(event_data->new_dev_data.dev_addr) == ESP_OK) { + // Device is a hub, we do not need to propagate the event to the clients + break; + } + // Prepare a DEV GONE event, send only to clients that have opened the device usb_host_client_event_msg_t event_msg = { .event = USB_HOST_CLIENT_EVENT_DEV_GONE, .dev_gone.dev_hdl = event_data->dev_gone_data.dev_hdl, From 7aa117477d2a383f9ed7c1003592b889a9214616 Mon Sep 17 00:00:00 2001 From: Roman Leonov Date: Mon, 2 Jun 2025 17:36:12 +0800 Subject: [PATCH 010/213] fix(ext_hub): Added processing waiting_release flag while dev changed to IDLE 11382a2a fix(ext_hub): Added processing waiting_release flag while dev changed to IDLE Co-authored-by: Roman Leonov --- components/usb/ext_hub.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/components/usb/ext_hub.c b/components/usb/ext_hub.c index 9fc2b8961f8..44b81eb380e 100644 --- a/components/usb/ext_hub.c +++ b/components/usb/ext_hub.c @@ -1064,6 +1064,11 @@ static bool device_set_next_stage(ext_hub_dev_t *ext_hub_dev, bool last_stage_pa } else { // Terminal stages, move to IDLE next_stage = EXT_HUB_STAGE_IDLE; + EXT_HUB_ENTER_CRITICAL(); + if (ext_hub_dev->dynamic.flags.waiting_release) { + call_proc_req_cb = _device_set_actions(ext_hub_dev, DEV_ACTION_RELEASE); + } + EXT_HUB_EXIT_CRITICAL(); } ext_hub_dev->single_thread.stage = next_stage; call_proc_req_cb = stage_need_process(next_stage); From b768e1e42a8a009272d466b59a276da2ab8a698a Mon Sep 17 00:00:00 2001 From: Zhang Hai Peng Date: Tue, 3 Jun 2025 12:13:37 +0800 Subject: [PATCH 011/213] fix(ble/bluedroid): Fixed null pointer assert in l2c_link_check_send_pkts (cherry picked from commit 815057301208c2e6c07af58633bd94526096610a) Co-authored-by: zhanghaipeng --- components/bt/host/bluedroid/stack/l2cap/l2c_link.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/components/bt/host/bluedroid/stack/l2cap/l2c_link.c b/components/bt/host/bluedroid/stack/l2cap/l2c_link.c index 64304152c16..9898a49d6a9 100644 --- a/components/bt/host/bluedroid/stack/l2cap/l2c_link.c +++ b/components/bt/host/bluedroid/stack/l2cap/l2c_link.c @@ -1084,7 +1084,9 @@ void l2c_link_check_send_pkts (tL2C_LCB *p_lcb, tL2C_CCB *p_ccb, BT_HDR *p_buf) p_lcb_cur = list_node(p_node); if (p_lcb_cur == p_lcb) { p_node = list_next(p_node); - p_lcb = list_node(p_node); + if (p_node) { + p_lcb = list_node(p_node); + } break; } } From 7d86471ea921a9326ca3a4a0701bf8d58d135b33 Mon Sep 17 00:00:00 2001 From: Shreeyash Date: Thu, 8 May 2025 18:02:43 +0530 Subject: [PATCH 012/213] fix(nimble): Add support to minimize ram consumption --- .../sdkconfig.defaults.dram_optimised | 47 ++++++++++++++++ .../sdkconfig.defaults.dram_optimised | 45 +++++++++++++++ .../sdkconfig.defaults.dram_optimised | 48 ++++++++++++++++ .../sdkconfig.defaults.dram_optimised | 49 ++++++++++++++++ .../sdkconfig.defaults.dram_optimised | 47 ++++++++++++++++ .../sdkconfig.defaults.dram_optimised | 47 ++++++++++++++++ .../sdkconfig.defaults.dram_optimised | 46 +++++++++++++++ .../sdkconfig.defaults.dram_optimised | 50 +++++++++++++++++ .../sdkconfig.defaults.dram_optimised | 50 +++++++++++++++++ .../sdkconfig.defaults.dram_optimised | 49 ++++++++++++++++ .../sdkconfig.defaults.dram_optimised | 50 +++++++++++++++++ .../sdkconfig.defaults.dram_optimised | 50 +++++++++++++++++ .../sdkconfig.defaults.dram_optimised | 49 ++++++++++++++++ .../sdkconfig.defaults.dram_optimised | 47 ++++++++++++++++ .../sdkconfig.defaults.dram_optimised | 47 ++++++++++++++++ .../sdkconfig.defaults.dram_optimised | 45 +++++++++++++++ .../sdkconfig.defaults.dram_optimised | 47 ++++++++++++++++ .../sdkconfig.defaults.dram_optimised | 45 +++++++++++++++ examples/bluetooth/nimble/blecent/README.md | 29 ++++++++++ .../blecent/sdkconfig.defaults.dram_optimised | 47 ++++++++++++++++ .../blecsc/sdkconfig.defaults.dram_optimised | 47 ++++++++++++++++ .../blehr/sdkconfig.defaults.dram_optimised | 48 ++++++++++++++++ examples/bluetooth/nimble/bleprph/README.md | 29 ++++++++++ .../bleprph/sdkconfig.defaults.dram_optimised | 45 +++++++++++++++ .../sdkconfig.defaults.dram_optimised | 56 +++++++++++++++++++ 25 files changed, 1159 insertions(+) create mode 100644 examples/bluetooth/nimble/ble_cts/cts_cent/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/ble_cts/cts_prph/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/ble_dynamic_service/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/ble_enc_adv_data/enc_adv_data_cent/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/ble_enc_adv_data/enc_adv_data_prph/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/ble_htp/htp_cent/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/ble_htp/htp_prph/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/ble_l2cap_coc/coc_blecent/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/ble_l2cap_coc/coc_bleprph/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/ble_multi_adv/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/ble_periodic_adv/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/ble_periodic_sync/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/ble_phy/phy_cent/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/ble_phy/phy_prph/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/ble_proximity_sensor/proximity_sensor_cent/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/ble_proximity_sensor/proximity_sensor_prph/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/ble_spp/spp_client/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/ble_spp/spp_server/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/blecent/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/blecsc/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/blehr/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/bleprph/sdkconfig.defaults.dram_optimised create mode 100644 examples/bluetooth/nimble/power_save/sdkconfig.defaults.dram_optimised diff --git a/examples/bluetooth/nimble/ble_cts/cts_cent/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/ble_cts/cts_cent/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..7bcce855af5 --- /dev/null +++ b/examples/bluetooth/nimble/ble_cts/cts_cent/sdkconfig.defaults.dram_optimised @@ -0,0 +1,47 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=2 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +CONFIG_ESP_TASK_WDT_EN=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/ble_cts/cts_prph/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/ble_cts/cts_prph/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..4b4d5ca9522 --- /dev/null +++ b/examples/bluetooth/nimble/ble_cts/cts_prph/sdkconfig.defaults.dram_optimised @@ -0,0 +1,45 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=2 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/ble_dynamic_service/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/ble_dynamic_service/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..93de6ec8b58 --- /dev/null +++ b/examples/bluetooth/nimble/ble_dynamic_service/sdkconfig.defaults.dram_optimised @@ -0,0 +1,48 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_BT_NIMBLE_DYNAMIC_SERVICE=y + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=2 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +CONFIG_ESP_TASK_WDT_EN=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/ble_enc_adv_data/enc_adv_data_cent/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/ble_enc_adv_data/enc_adv_data_cent/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..8f0e93a7b3c --- /dev/null +++ b/examples/bluetooth/nimble/ble_enc_adv_data/enc_adv_data_cent/sdkconfig.defaults.dram_optimised @@ -0,0 +1,49 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_BT_NIMBLE_EXT_ADV=n +CONFIG_BT_NIMBLE_50_FEATURE_SUPPORT=y + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=2 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +CONFIG_ESP_TASK_WDT_EN=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/ble_enc_adv_data/enc_adv_data_prph/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/ble_enc_adv_data/enc_adv_data_prph/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..44f19abbcb7 --- /dev/null +++ b/examples/bluetooth/nimble/ble_enc_adv_data/enc_adv_data_prph/sdkconfig.defaults.dram_optimised @@ -0,0 +1,47 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_BT_NIMBLE_TRANSPORT_EVT_SIZE=70 +CONFIG_BT_NIMBLE_EXT_ADV=n + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=2 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/ble_htp/htp_cent/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/ble_htp/htp_cent/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..7bcce855af5 --- /dev/null +++ b/examples/bluetooth/nimble/ble_htp/htp_cent/sdkconfig.defaults.dram_optimised @@ -0,0 +1,47 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=2 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +CONFIG_ESP_TASK_WDT_EN=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/ble_htp/htp_prph/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/ble_htp/htp_prph/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..9fcb3a5cdeb --- /dev/null +++ b/examples/bluetooth/nimble/ble_htp/htp_prph/sdkconfig.defaults.dram_optimised @@ -0,0 +1,46 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=4000 + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=2 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/ble_l2cap_coc/coc_blecent/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/ble_l2cap_coc/coc_blecent/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..f2e5d8cb145 --- /dev/null +++ b/examples/bluetooth/nimble/ble_l2cap_coc/coc_blecent/sdkconfig.defaults.dram_optimised @@ -0,0 +1,50 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_BT_NIMBLE_L2CAP_COC_MAX_NUM=1 +CONFIG_BT_NIMBLE_MSYS_1_BLOCK_COUNT=30 +CONFIG_BT_NIMBLE_MSYS_1_BLOCK_SIZE=512 + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=2 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +CONFIG_ESP_TASK_WDT_EN=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/ble_l2cap_coc/coc_bleprph/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/ble_l2cap_coc/coc_bleprph/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..f2e5d8cb145 --- /dev/null +++ b/examples/bluetooth/nimble/ble_l2cap_coc/coc_bleprph/sdkconfig.defaults.dram_optimised @@ -0,0 +1,50 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_BT_NIMBLE_L2CAP_COC_MAX_NUM=1 +CONFIG_BT_NIMBLE_MSYS_1_BLOCK_COUNT=30 +CONFIG_BT_NIMBLE_MSYS_1_BLOCK_SIZE=512 + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=2 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +CONFIG_ESP_TASK_WDT_EN=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/ble_multi_adv/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/ble_multi_adv/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..d465b30d89e --- /dev/null +++ b/examples/bluetooth/nimble/ble_multi_adv/sdkconfig.defaults.dram_optimised @@ -0,0 +1,49 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_BT_NIMBLE_EXT_ADV=y +CONFIG_BT_NIMBLE_MAX_EXT_ADV_INSTANCES=4 + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=2 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +CONFIG_ESP_TASK_WDT_EN=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/ble_periodic_adv/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/ble_periodic_adv/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..b42d28d3786 --- /dev/null +++ b/examples/bluetooth/nimble/ble_periodic_adv/sdkconfig.defaults.dram_optimised @@ -0,0 +1,50 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_EXAMPLE_EXTENDED_ADV=y +CONFIG_BT_NIMBLE_EXT_ADV=y +CONFIG_BT_NIMBLE_MAX_PERIODIC_SYNCS=1 + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=2 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +CONFIG_ESP_TASK_WDT_EN=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/ble_periodic_sync/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/ble_periodic_sync/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..b42d28d3786 --- /dev/null +++ b/examples/bluetooth/nimble/ble_periodic_sync/sdkconfig.defaults.dram_optimised @@ -0,0 +1,50 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_EXAMPLE_EXTENDED_ADV=y +CONFIG_BT_NIMBLE_EXT_ADV=y +CONFIG_BT_NIMBLE_MAX_PERIODIC_SYNCS=1 + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=2 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +CONFIG_ESP_TASK_WDT_EN=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/ble_phy/phy_cent/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/ble_phy/phy_cent/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..0749ca371a2 --- /dev/null +++ b/examples/bluetooth/nimble/ble_phy/phy_cent/sdkconfig.defaults.dram_optimised @@ -0,0 +1,49 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_BT_NIMBLE_EXT_ADV=y +CONFIG_BT_NIMBLE_BLE_GATT_BLOB_TRANSFER=y + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=2 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +CONFIG_ESP_TASK_WDT_EN=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/ble_phy/phy_prph/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/ble_phy/phy_prph/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..61ac1083d4f --- /dev/null +++ b/examples/bluetooth/nimble/ble_phy/phy_prph/sdkconfig.defaults.dram_optimised @@ -0,0 +1,47 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_BT_NIMBLE_EXT_ADV=y +CONFIG_BT_NIMBLE_BLE_GATT_BLOB_TRANSFER=y + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=2 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/ble_proximity_sensor/proximity_sensor_cent/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/ble_proximity_sensor/proximity_sensor_cent/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..7bcce855af5 --- /dev/null +++ b/examples/bluetooth/nimble/ble_proximity_sensor/proximity_sensor_cent/sdkconfig.defaults.dram_optimised @@ -0,0 +1,47 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=2 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +CONFIG_ESP_TASK_WDT_EN=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/ble_proximity_sensor/proximity_sensor_prph/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/ble_proximity_sensor/proximity_sensor_prph/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..4b4d5ca9522 --- /dev/null +++ b/examples/bluetooth/nimble/ble_proximity_sensor/proximity_sensor_prph/sdkconfig.defaults.dram_optimised @@ -0,0 +1,45 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=2 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/ble_spp/spp_client/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/ble_spp/spp_client/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..10c7480beec --- /dev/null +++ b/examples/bluetooth/nimble/ble_spp/spp_client/sdkconfig.defaults.dram_optimised @@ -0,0 +1,47 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=3 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +CONFIG_ESP_TASK_WDT_EN=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/ble_spp/spp_server/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/ble_spp/spp_server/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..e8446703e99 --- /dev/null +++ b/examples/bluetooth/nimble/ble_spp/spp_server/sdkconfig.defaults.dram_optimised @@ -0,0 +1,45 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=3 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/blecent/README.md b/examples/bluetooth/nimble/blecent/README.md index 615817e3c31..fa05d998c16 100644 --- a/examples/bluetooth/nimble/blecent/README.md +++ b/examples/bluetooth/nimble/blecent/README.md @@ -131,6 +131,35 @@ GAP procedure initiated: terminate connection; conn_handle=0 hci_reason=19 disconnect; reason=534 ``` +The following configuration flags can be adjusted to significantly reduce RAM usage in your ESP-IDF project while retaining basic BLE functionality. +---------------------------------------------------------------------------------------------- +| Config Option || Old → New Value || RAM Saved (Bytes) | +|--------------------------------------------------||------------------||--------------------| +| CONFIG_BT_NIMBLE_SM_SC || y → n || 2040 | +| CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION || y → n || 32 | +| CONFIG_BT_NIMBLE_GATT_MAX_PROCS || 4 → 2 || 112 | +| CONFIG_BT_NIMBLE_MAX_CONNECTIONS || 3 → 1 || 480 | +| CONFIG_BT_NIMBLE_MAX_BONDS || 3 → 1 || 448 | +| CONFIG_BT_NIMBLE_MAX_CCCDS || 8 → 1 || 112 | +| CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT || y → n || 256 | +| CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT || 30 → 15 || 240 | +| CONFIG_BT_NIMBLE_SECURITY_ENABLE || y → n || 2072 | +| CONFIG_SPI_FLASH_ROM_IMPL || n → y || 9804 | +| CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP || y → n || 0 | +| CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP || y → n || 140 | +| CONFIG_SPI_FLASH_SUPPORT_GD_CHIP || y → n || 648 | +| CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP || y → n || 8 | +| CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP || y → n || 140 | +| CONFIG_SPI_FLASH_SUPPORT_TH_CHIP || y → n || 136 | +| CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE || y → n || 704 | +| CONFIG_VFS_SUPPORT_TERMIOS || y → n || 424 | +| CONFIG_VFS_SUPPORT_IO || y → n || 2008 | +| CONFIG_COMPILER_OPTIMIZATION_SIZE || n → y || 8408 | +| CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE || n → y || 5896 | +| CONFIG_ESP_COEX_SW_COEXIST_ENABLE || y → n || 896 | +| ESP_TASK_WDT_EN || y → n || 528 | +| CONFIG_LOG_DEFAULT_LEVEL_NONE || n → y || 2592 | +---------------------------------------------------------------------------------------------- ## Troubleshooting diff --git a/examples/bluetooth/nimble/blecent/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/blecent/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..7bcce855af5 --- /dev/null +++ b/examples/bluetooth/nimble/blecent/sdkconfig.defaults.dram_optimised @@ -0,0 +1,47 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=2 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +CONFIG_ESP_TASK_WDT_EN=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/blecsc/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/blecsc/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..7bcce855af5 --- /dev/null +++ b/examples/bluetooth/nimble/blecsc/sdkconfig.defaults.dram_optimised @@ -0,0 +1,47 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=2 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +CONFIG_ESP_TASK_WDT_EN=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/blehr/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/blehr/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..856479767db --- /dev/null +++ b/examples/bluetooth/nimble/blehr/sdkconfig.defaults.dram_optimised @@ -0,0 +1,48 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=4000 + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=2 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +CONFIG_ESP_TASK_WDT_EN=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/bleprph/README.md b/examples/bluetooth/nimble/bleprph/README.md index 71b49302ba0..f760093ad9b 100644 --- a/examples/bluetooth/nimble/bleprph/README.md +++ b/examples/bluetooth/nimble/bleprph/README.md @@ -92,6 +92,35 @@ Notification sent successfully ## Note * NVS support is not yet integrated to bonding. So, for now, bonding is not persistent across reboot. +The following configuration flags can be adjusted to significantly reduce RAM usage in your ESP-IDF project while retaining basic BLE functionality. +---------------------------------------------------------------------------------------------- +| Config Option || Old → New Value || RAM Saved (Bytes) | +|--------------------------------------------------||------------------||--------------------| +| CONFIG_BT_NIMBLE_SM_SC || y → n || 2016 | +| CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION || y → n || 32 | +| CONFIG_BT_NIMBLE_GATT_MAX_PROCS || 4 → 2 || 112 | +| CONFIG_BT_NIMBLE_MAX_CONNECTIONS || 3 → 1 || 480 | +| CONFIG_BT_NIMBLE_MAX_BONDS || 3 → 1 || 448 | +| CONFIG_BT_NIMBLE_MAX_CCCDS || 8 → 1 || 112 | +| CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT || y → n || 256 | +| CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT || 30 → 15 || 240 | +| CONFIG_BT_NIMBLE_SECURITY_ENABLE || y → n || 2048 | +| CONFIG_SPI_FLASH_ROM_IMPL || n → y || 9804 | +| CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP || y → n || 8 | +| CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP || y → n || 132 | +| CONFIG_SPI_FLASH_SUPPORT_GD_CHIP || y → n || 640 | +| CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP || y → n || 0 | +| CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP || y → n || 132 | +| CONFIG_SPI_FLASH_SUPPORT_TH_CHIP || y → n || 128 | +| CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE || y → n || 696 | +| CONFIG_VFS_SUPPORT_TERMIOS || y → n || 424 | +| CONFIG_VFS_SUPPORT_IO || y → n || 3000 | +| CONFIG_COMPILER_OPTIMIZATION_SIZE || n → y || 8912 | +| CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE || n → y || 8456 | +| CONFIG_ESP_COEX_SW_COEXIST_ENABLE || y → n || 896 | +| CONFIG_LOG_DEFAULT_LEVEL_NONE || n → y || 2568 | +---------------------------------------------------------------------------------------------- + ## Troubleshooting For any technical queries, please open an [issue](https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you soon. diff --git a/examples/bluetooth/nimble/bleprph/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/bleprph/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..4b4d5ca9522 --- /dev/null +++ b/examples/bluetooth/nimble/bleprph/sdkconfig.defaults.dram_optimised @@ -0,0 +1,45 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=2 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_ROM_IMPL=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/examples/bluetooth/nimble/power_save/sdkconfig.defaults.dram_optimised b/examples/bluetooth/nimble/power_save/sdkconfig.defaults.dram_optimised new file mode 100644 index 00000000000..28452929c48 --- /dev/null +++ b/examples/bluetooth/nimble/power_save/sdkconfig.defaults.dram_optimised @@ -0,0 +1,56 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y + +# Enable support for power management +CONFIG_PM_ENABLE=y +# Enable tickless idle mode +CONFIG_FREERTOS_USE_TICKLESS_IDLE=y +# Set the tick rate at which FreeRTOS does pre-emptive context switching. +CONFIG_FREERTOS_HZ=1000 +# Minimum number of ticks to enter sleep mode for +CONFIG_FREERTOS_IDLE_TIME_BEFORE_SLEEP=3 +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=4000 + +CONFIG_BT_NIMBLE_SM_SC=n +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=n +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=2 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 +CONFIG_BT_NIMBLE_MAX_BONDS=1 +CONFIG_BT_NIMBLE_MAX_CCCDS=1 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=15 + +#Uncomment below, if security needs to be disabled +#CONFIG_BT_NIMBLE_SECURITY_ENABLE=n + +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=n +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=n +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +CONFIG_VFS_SUPPORT_TERMIOS=n +CONFIG_VFS_SUPPORT_IO=n + +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y + +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=n + +CONFIG_ESP_TASK_WDT_EN=n + +#Uncomment below, if logging needs to be disabled +#CONFIG_LOG_DEFAULT_LEVEL_NONE=y +#CONFIG_LOG_DEFAULT_LEVEL=0 From 3104d97737c0cd6fb28cb79b3abc0f993088229c Mon Sep 17 00:00:00 2001 From: Rahul Tank Date: Tue, 3 Jun 2025 16:00:54 +0530 Subject: [PATCH 013/213] fix(nimble): Modified Kconfig information to make it more user friendly --- components/bt/host/nimble/Kconfig.in | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/components/bt/host/nimble/Kconfig.in b/components/bt/host/nimble/Kconfig.in index 44d6c6ef38a..2cf0fb344a7 100644 --- a/components/bt/host/nimble/Kconfig.in +++ b/components/bt/host/nimble/Kconfig.in @@ -898,7 +898,7 @@ menu "BLE Services" Enable HeartRate Service support menuconfig BT_NIMBLE_HID_SERVICE - bool "HID service" + bool "Human Interface Device service" default n help Enable HID service support @@ -930,10 +930,10 @@ menu "BLE Services" Enable/Disable notifications on BAS Battery Level Characteristic menuconfig BT_NIMBLE_DIS_SERVICE - bool "DIS service" + bool "Device Information Service" default y help - Enable DIS service support + Enable Device Information service support config BT_NIMBLE_SVC_DIS_MANUFACTURER_NAME depends on BT_NIMBLE_DIS_SERVICE @@ -1075,7 +1075,6 @@ menu "BLE Services" default 0 if BT_NIMBLE_SVC_GAP_CAR_NOT_SUPP default 1 if BT_NIMBLE_SVC_GAP_CAR_SUPP - menu "GAP device name write permissions" depends on BT_NIMBLE_GAP_SERVICE config BT_NIMBLE_SVC_GAP_NAME_WRITE @@ -1106,7 +1105,7 @@ menu "BLE Services" Enable write with authorisation permission (BLE_GATT_CHR_F_WRITE_AUTHOR) endmenu - menu "PPCP settings" + menu "Peripheral Preferred Connection Parameters (PPCP) settings" depends on BT_NIMBLE_GAP_SERVICE config BT_NIMBLE_SVC_GAP_PPCP_MAX_CONN_INTERVAL int "PPCP Connection Interval Max (Unit: 1.25 ms)" From 7f3ad9aa95d4a8d2da8923a9fda7e9d42cd5b203 Mon Sep 17 00:00:00 2001 From: Astha Verma Date: Thu, 29 May 2025 18:02:06 +0530 Subject: [PATCH 014/213] fix(nimble): Added support for ANCS in nimble --- .../bluetooth/nimble/ble_ancs/CMakeLists.txt | 8 + examples/bluetooth/nimble/ble_ancs/README.md | 65 ++ .../nimble/ble_ancs/main/CMakeLists.txt | 5 + .../nimble/ble_ancs/main/Kconfig.projbuild | 14 + .../bluetooth/nimble/ble_ancs/main/ble_ancs.c | 212 +++++ .../bluetooth/nimble/ble_ancs/main/ble_ancs.h | 118 +++ .../nimble/ble_ancs/main/idf_component.yml | 3 + .../bluetooth/nimble/ble_ancs/main/main.c | 771 ++++++++++++++++++ .../nimble/ble_ancs/sdkconfig.defaults | 13 + tools/ci/check_copyright_ignore.txt | 1 + 10 files changed, 1210 insertions(+) create mode 100644 examples/bluetooth/nimble/ble_ancs/CMakeLists.txt create mode 100644 examples/bluetooth/nimble/ble_ancs/README.md create mode 100644 examples/bluetooth/nimble/ble_ancs/main/CMakeLists.txt create mode 100644 examples/bluetooth/nimble/ble_ancs/main/Kconfig.projbuild create mode 100644 examples/bluetooth/nimble/ble_ancs/main/ble_ancs.c create mode 100644 examples/bluetooth/nimble/ble_ancs/main/ble_ancs.h create mode 100644 examples/bluetooth/nimble/ble_ancs/main/idf_component.yml create mode 100644 examples/bluetooth/nimble/ble_ancs/main/main.c create mode 100644 examples/bluetooth/nimble/ble_ancs/sdkconfig.defaults diff --git a/examples/bluetooth/nimble/ble_ancs/CMakeLists.txt b/examples/bluetooth/nimble/ble_ancs/CMakeLists.txt new file mode 100644 index 00000000000..98f604ab170 --- /dev/null +++ b/examples/bluetooth/nimble/ble_ancs/CMakeLists.txt @@ -0,0 +1,8 @@ +# The following lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +idf_build_set_property(MINIMAL_BUILD ON) +project(ble_ancs) diff --git a/examples/bluetooth/nimble/ble_ancs/README.md b/examples/bluetooth/nimble/ble_ancs/README.md new file mode 100644 index 00000000000..d1d1b551bb4 --- /dev/null +++ b/examples/bluetooth/nimble/ble_ancs/README.md @@ -0,0 +1,65 @@ +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | --------- | -------- | -------- | + +# ESP-IDF NimBLE ANCS Example + +The purpose of the Apple Notification Center Service (ANCS) is to give Bluetooth accessories (that connect to iOS devices through a Bluetooth low-energy link) a simple and convenient way to access many kinds of notifications that are generated on iOS devices. + +## How to Use Example + +Before project configuration and build, be sure to set the correct chip target using: + +```bash +idf.py set-target +``` + +The Apple Notification Center Service is a primary service whose service UUID is: + +`7905F431-B5CE-4E99-A40F-4B1E122D00D0` + +Only one instance of the ANCS may be present on an NP. Due to the nature of iOS, the ANCS is not guaranteed to always be present. As a result, the NC should look for and subscribe to the Service Changed characteristic of the GATT service in order to monitor for the potential publishing and unpublishing of the ANCS at any time. + +In its basic form, the ANCS exposes three characteristics: +Notification Source: UUID `9FBF120D-6301-42D9-8C58-25E699A21DBD` (notifiable) +Control Point: UUID `69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9` (writeable with response) +Data Source: UUID `22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB` (notifiable) + +All these characteristics require authorization for access. + +### Hardware Required + +* A development board with ESP32/ESP32-C3/ESP32-H2/ESP32-C2/ESP32-S3 SoC (e.g., ESP32-DevKitC, ESP-WROVER-KIT, etc.) +* A USB cable for power supply and programming + +See [Development Boards](https://www.espressif.com/en/products/devkits) for more information about it. + +### Build and Flash + +Run `idf.py -p PORT flash monitor` to build, flash and monitor the project. + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the [Getting Started Guide](https://idf.espressif.com/) for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +``` +I (466) NimBLE ANCS: BLE Host Task Started +I (466) NimBLE: GAP procedure initiated: stop advertising. + +I (476) NimBLE: Device Address: +I (476) NimBLE: 48:27:e2:e9:0e:a6 +I (476) NimBLE: + +I (476) NimBLE: GAP procedure initiated: advertise; +I (476) NimBLE: disc_mode=2 +I (476) NimBLE: adv_channel_map=0 own_addr_type=0 adv_filter_policy=0 adv_itvl_min=0 adv_itvl_max=0 +I (486) NimBLE: + +I (496) uart: queue free spaces: 8 +I (496) main_task: Returned from app_main() +``` + +## Troubleshooting + +For any technical queries, please open an [issue](https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you soon. diff --git a/examples/bluetooth/nimble/ble_ancs/main/CMakeLists.txt b/examples/bluetooth/nimble/ble_ancs/main/CMakeLists.txt new file mode 100644 index 00000000000..1873a0ceb3c --- /dev/null +++ b/examples/bluetooth/nimble/ble_ancs/main/CMakeLists.txt @@ -0,0 +1,5 @@ +set(srcs "main.c" + "ble_ancs.c") + +idf_component_register(SRCS "${srcs}" + INCLUDE_DIRS ".") diff --git a/examples/bluetooth/nimble/ble_ancs/main/Kconfig.projbuild b/examples/bluetooth/nimble/ble_ancs/main/Kconfig.projbuild new file mode 100644 index 00000000000..8e5ab9f250a --- /dev/null +++ b/examples/bluetooth/nimble/ble_ancs/main/Kconfig.projbuild @@ -0,0 +1,14 @@ +menu "Example Configuration" + + config EXAMPLE_EXTENDED_ADV + bool + depends on SOC_BLE_50_SUPPORTED && BT_NIMBLE_50_FEATURE_SUPPORT + default y if SOC_ESP_NIMBLE_CONTROLLER + select BT_NIMBLE_EXT_ADV + prompt "Enable Extended Adv" + help + Use this option to enable extended advertising in the example. + If this option is disabled, ensure config BT_NIMBLE_EXT_ADV is + also disabled from Nimble stack menuconfig + +endmenu diff --git a/examples/bluetooth/nimble/ble_ancs/main/ble_ancs.c b/examples/bluetooth/nimble/ble_ancs/main/ble_ancs.c new file mode 100644 index 00000000000..19262c5ea15 --- /dev/null +++ b/examples/bluetooth/nimble/ble_ancs/main/ble_ancs.c @@ -0,0 +1,212 @@ +/* + * SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ + +#include +#include +#include +#include "esp_log.h" +#include "ble_ancs.h" + +#define NimBLE_ANCS_TAG "NimBLE_ANCS" + +/* +| EventID(1 Byte) | EventFlags(1 Byte) | CategoryID(1 Byte) | CategoryCount(1 Byte) | NotificationUID(4 Bytes) | + +A GATT notification delivered through the Notification Source characteristic contains the following information: +* EventID: This field informs the accessory whether the given iOS notification was added, modified, or removed. The enumerated values for this field are defined + in EventID Values. +* EventFlags: A bitmask whose set bits inform an NC of specificities with the iOS notification. For example, if an iOS notification is considered “important”, + the NC may want to display a more aggressive user interface (UI) to make sure the user is properly alerted. The enumerated bits for this field + are defined in EventFlags. +* CategoryID: A numerical value providing a category in which the iOS notification can be classified. The NP will make a best effort to provide an accurate category + for each iOS notification. The enumerated values for this field are defined in CategoryID Values. +* CategoryCount: The current number of active iOS notifications in the given category. For example, if two unread emails are sitting in a user’s email inbox, and a new + email is pushed to the user’s iOS device, the value of CategoryCount is 3. +* NotificationUID: A 32-bit numerical value that is the unique identifier (UID) for the iOS notification. This value can be used as a handle in commands sent to the + Control Point characteristic to interact with the iOS notification. +*/ + +char *EventID_to_String(uint8_t EventID) +{ + char *str = NULL; + switch (EventID) + { + case EventIDNotificationAdded: + str = "New message"; + break; + case EventIDNotificationModified: + str = "Modified message"; + break; + case EventIDNotificationRemoved: + str = "Removed message"; + break; + default: + str = "unknown EventID"; + break; + } + return str; +} + +char *CategoryID_to_String(uint8_t CategoryID) +{ + char *Cidstr = NULL; + switch(CategoryID) { + case CategoryIDOther: + Cidstr = "Other"; + break; + case CategoryIDIncomingCall: + Cidstr = "IncomingCall"; + break; + case CategoryIDMissedCall: + Cidstr = "MissedCall"; + break; + case CategoryIDVoicemail: + Cidstr = "Voicemail"; + break; + case CategoryIDSocial: + Cidstr = "Social"; + break; + case CategoryIDSchedule: + Cidstr = "Schedule"; + break; + case CategoryIDEmail: + Cidstr = "Email"; + break; + case CategoryIDNews: + Cidstr = "News"; + break; + case CategoryIDHealthAndFitness: + Cidstr = "HealthAndFitness"; + break; + case CategoryIDBusinessAndFinance: + Cidstr = "BusinessAndFinance"; + break; + case CategoryIDLocation: + Cidstr = "Location"; + break; + case CategoryIDEntertainment: + Cidstr = "Entertainment"; + break; + default: + Cidstr = "Unknown CategoryID"; + break; + } + return Cidstr; +} + +/* +| EventID(1 Byte) | EventFlags(1 Byte) | CategoryID(1 Byte) | CategoryCount(1 Byte) | NotificationUID(4 Bytes) | +*/ + +void ble_receive_apple_notification_source(uint8_t *message, uint16_t message_len) +{ + if (!message || message_len < 5) { + return; + } + + uint8_t EventID = message[0]; + char *EventIDS = EventID_to_String(EventID); + uint8_t EventFlags = message[1]; + uint8_t CategoryID = message[2]; + char *Cidstr = CategoryID_to_String(CategoryID); + uint8_t CategoryCount = message[3]; + uint32_t NotificationUID = (message[4]) | (message[5]<< 8) | (message[6]<< 16) | (message[7] << 24); + ESP_LOGI(NimBLE_ANCS_TAG, "EventID:%s EventFlags:0x%x CategoryID:%s CategoryCount:%d NotificationUID:%" PRIu32, EventIDS, EventFlags, Cidstr, CategoryCount, NotificationUID); +} + +void ble_receive_apple_data_source(uint8_t *message, uint16_t message_len) +{ + if (!message || message_len == 0) { + return; + } + uint8_t Command_id = message[0]; + switch (Command_id) + { + case CommandIDGetNotificationAttributes: { + uint32_t NotificationUID = (message[1]) | (message[2]<< 8) | (message[3]<< 16) | (message[4] << 24); + uint32_t remian_attr_len = message_len - 5; + uint8_t *attrs = &message[5]; + ESP_LOGI(NimBLE_ANCS_TAG, "recevice Notification Attributes response Command_id %d NotificationUID %" PRIu32, Command_id, NotificationUID); + while(remian_attr_len > 0) { + uint8_t AttributeID = attrs[0]; + uint16_t len = attrs[1] | (attrs[2] << 8); + if(len > (remian_attr_len -3)) { + ESP_LOGE(NimBLE_ANCS_TAG, "data error"); + break; + } + switch (AttributeID) + { + case NotificationAttributeIDAppIdentifier: + ESP_LOG_BUFFER_CHAR("Identifier", &attrs[3], len); + break; + case NotificationAttributeIDTitle: + ESP_LOG_BUFFER_CHAR("Title", &attrs[3], len); + break; + case NotificationAttributeIDSubtitle: + ESP_LOG_BUFFER_CHAR("Subtitle", &attrs[3], len); + break; + case NotificationAttributeIDMessage: + ESP_LOG_BUFFER_CHAR("Message", &attrs[3], len); + break; + case NotificationAttributeIDMessageSize: + ESP_LOG_BUFFER_CHAR("MessageSize", &attrs[3], len); + break; + case NotificationAttributeIDDate: + //yyyyMMdd'T'HHmmSS + ESP_LOG_BUFFER_CHAR("Date", &attrs[3], len); + break; + case NotificationAttributeIDPositiveActionLabel: + ESP_LOG_BUFFER_HEX("PActionLabel", &attrs[3], len); + break; + case NotificationAttributeIDNegativeActionLabel: + ESP_LOG_BUFFER_HEX("NActionLabel", &attrs[3], len); + break; + default: + ESP_LOG_BUFFER_HEX("unknownAttributeID", &attrs[3], len); + break; + } + + attrs += (1 + 2 + len); + remian_attr_len -= (1 + 2 + len); + } + + break; + } + case CommandIDGetAppAttributes: + ESP_LOGI(NimBLE_ANCS_TAG, "recevice APP Attributes response"); + break; + case CommandIDPerformNotificationAction: + ESP_LOGI(NimBLE_ANCS_TAG, "recevice Perform Notification Action"); + break; + default: + ESP_LOGI(NimBLE_ANCS_TAG, "unknown Command ID"); + break; + } +} + +char *Errcode_to_String(uint16_t status) +{ + char *Errstr = NULL; + switch (status) { + case Unknown_command: + Errstr = "Unknown_command"; + break; + case Invalid_command: + Errstr = "Invalid_command"; + break; + case Invalid_parameter: + Errstr = "Invalid_parameter"; + break; + case Action_failed: + Errstr = "Action_failed"; + break; + default: + Errstr = "unknown_failed"; + break; + } + return Errstr; + +} diff --git a/examples/bluetooth/nimble/ble_ancs/main/ble_ancs.h b/examples/bluetooth/nimble/ble_ancs/main/ble_ancs.h new file mode 100644 index 00000000000..83bb1e9be21 --- /dev/null +++ b/examples/bluetooth/nimble/ble_ancs/main/ble_ancs.h @@ -0,0 +1,118 @@ +/* + * SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ + + +#include +#include +#include + +//EventID values +typedef enum { + EventIDNotificationAdded = 0, + EventIDNotificationModified = 1, + EventIDNotificationRemoved = 2, + //Reserved EventID values = 3–255 +} ble_ancs_EventID; + +//EventFlags +typedef enum { + EventFlagSilent = (1 << 0), + EventFlagImportant = (1 << 1), + EventFlagPreExisting = (1 << 2), + EventFlagPositiveAction = (1 << 3), + EventFlagNegativeAction = (1 << 4), + //Reserved EventFlags = (1 << 5)–(1 << 7 +}ble_ancs_EventFlags; + +// CategoryID values +typedef enum { + CategoryIDOther = 0, + CategoryIDIncomingCall = 1, + CategoryIDMissedCall = 2, + CategoryIDVoicemail = 3, + CategoryIDSocial = 4, + CategoryIDSchedule = 5, + CategoryIDEmail = 6, + CategoryIDNews = 7, + CategoryIDHealthAndFitness = 8, + CategoryIDBusinessAndFinance = 9, + CategoryIDLocation = 10, + CategoryIDEntertainment = 11, + //Reserved CategoryID values = 12–255 +} ble_ancs_CategoryID; + +//CommandID values +typedef enum { + CommandIDGetNotificationAttributes = 0, + CommandIDGetAppAttributes = 1, + CommandIDPerformNotificationAction = 2, + //Reserved CommandID values = 3–255 +} ble_ancs_CommandID; + +//NotificationAttributeID +typedef enum { + NotificationAttributeIDAppIdentifier = 0, + NotificationAttributeIDTitle = 1, //(Needs to be followed by a 2-bytes max length parameter) + NotificationAttributeIDSubtitle = 2, //(Needs to be followed by a 2-bytes max length parameter) + NotificationAttributeIDMessage = 3, //(Needs to be followed by a 2-bytes max length parameter) + NotificationAttributeIDMessageSize = 4, + NotificationAttributeIDDate = 5, + NotificationAttributeIDPositiveActionLabel = 6, + NotificationAttributeIDNegativeActionLabel = 7, + //Reserved NotificationAttributeID values = 8–255 +} ble_ancs_NotificationAttributeID; + +/* +Note: The format of the NotificationAttributeIDMessageSize constant is a string that represents the integral value +of the message size. The format of the NotificationAttributeIDDate constant is a string that uses the Unicode Technical +Standard (UTS) #35 date format pattern yyyyMMdd'T'HHmmSS. The format of all the other constants in Table 3-5 are UTF-8 +strings. +*/ + +//ActionID values +typedef enum { + ActionIDPositive = 0, + ActionIDNegative = 1, + //Reserved ActionID values = 2–255 +} ble_ActionID; + +//AppAttributeID Values +typedef enum { + AppAttributeIDDisplayName = 0, + //Reserved AppAttributeID values = 1–255 +} ble_AppAttributeID; + +typedef struct { + uint8_t noti_attribute_id; + uint16_t attribute_len; +} ble_noti_attr_list_t; + +typedef enum { + Unknown_command = (0xA0), //The commandID was not recognized by the NP. + Invalid_command = (0xA1), //The command was improperly formatted. + Invalid_parameter = (0xA2), // One of the parameters (for example, the NotificationUID) does not refer to an existing object on the NP. + Action_failed = (0xA3), //The action was not performed +} ble_ancs_error_code; + +typedef enum { + attr_appidentifier_index = 0, //The commandID was not recognized by the NP. + attr_title_index, + attr_subtitle_index, + attr_message_index, + attr_messagesize_index, + attr_date_index, + attr_positiveactionlabel_index, + attr_negativeactionlabel_index, +} ble_ancs_attr_index; + +#define ESP_NOTIFICATIONUID_LEN 4 + + +char *EventID_to_String(uint8_t EventID); +char *CategoryID_to_String(uint8_t CategoryID); +void ble_receive_apple_notification_source(uint8_t *message, uint16_t message_len); +void ble_receive_apple_data_source(uint8_t *message, uint16_t message_len); +char *Errcode_to_String(uint16_t status); diff --git a/examples/bluetooth/nimble/ble_ancs/main/idf_component.yml b/examples/bluetooth/nimble/ble_ancs/main/idf_component.yml new file mode 100644 index 00000000000..d6e735fe770 --- /dev/null +++ b/examples/bluetooth/nimble/ble_ancs/main/idf_component.yml @@ -0,0 +1,3 @@ +dependencies: + nimble_peripheral_utils: + path: ${IDF_PATH}/examples/bluetooth/nimble/common/nimble_peripheral_utils diff --git a/examples/bluetooth/nimble/ble_ancs/main/main.c b/examples/bluetooth/nimble/ble_ancs/main/main.c new file mode 100644 index 00000000000..8fbb3268f6b --- /dev/null +++ b/examples/bluetooth/nimble/ble_ancs/main/main.c @@ -0,0 +1,771 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#include "esp_log.h" +#include "nvs_flash.h" +/* BLE */ +#include "nimble/nimble_port.h" +#include "nimble/nimble_port_freertos.h" +#include "host/ble_hs.h" +#include "host/util/util.h" +#include "console/console.h" +#include "services/gap/ble_svc_gap.h" +#include "nimble/ble.h" +#include "esp_peripheral.h" +#include "ble_ancs.h" +#include "esp_timer.h" + +uint16_t notification_source_handle; +uint16_t data_source_handle; +uint16_t control_point_handle; +uint16_t svc_e_handle; + +static void periodic_timer_callback(void* arg); +esp_timer_handle_t periodic_timer; + +const esp_timer_create_args_t periodic_timer_args = { + .callback = &periodic_timer_callback, + /* name is optional, but may help identify the timer when debugging */ + .name = "periodic" +}; + +struct data_source_buffer { + uint8_t buffer[1024]; + uint16_t len; +}; + +static struct data_source_buffer data_buffer = {0}; +static uint16_t MTU_size = 23; +//In its basic form, the ANCS exposes three characteristics: +// service UUID: 7905F431-B5CE-4E99-A40F-4B1E122D00D0 +static ble_uuid128_t APPLE_NC_UUID = BLE_UUID128_INIT( + 0xD0, 0x00, 0x2D, 0x12, 0x1E, 0x4B, 0x0F, 0xA4, 0x99, 0x4E, 0xCE, 0xB5, 0x31, 0xF4, 0x05, 0x79); + +// Notification Source UUID: 9FBF120D-6301-42D9-8C58-25E699A21DBD(notifiable) +static ble_uuid128_t notification_source = BLE_UUID128_INIT( + 0xbd, 0x1d, 0xa2, 0x99, 0xe6, 0x25, 0x58, 0x8c, 0xd9, 0x42, 0x01, 0x63, 0x0d, 0x12, 0xbf, 0x9f); +// Control Point UUID:69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9(writeable with response) +static ble_uuid128_t control_point = BLE_UUID128_INIT( + 0xd9, 0xd9, 0xaa, 0xfd, 0xbd, 0x9b, 0x21, 0x98, 0xa8, 0x49, 0xe1, 0x45, 0xf3, 0xd8, 0xd1, 0x69); +// Data Source UUID:22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB(notifiable) +static ble_uuid128_t data_source = BLE_UUID128_INIT( + 0xfb, 0x7b, 0x7c, 0xce, 0x6a, 0xb3, 0x44, 0xbe, 0xb5, 0x4b, 0xd6, 0x24, 0xe9, 0xc6, 0xea, 0x22); + +#if CONFIG_EXAMPLE_EXTENDED_ADV +static uint8_t ext_adv_pattern_1[] = { + 0x02, 0x01, 0x06, + 0x03, 0x03, 0xab, 0xcd, + 0x03, 0x03, 0x18, 0x11, + 0x0e, 0X09, 'n', 'i', 'm', 'b', 'l', 'e', '-', 'a', 'n', 'c', 's', '-', 'e', +}; +#endif + +static const char *tag = "NimBLE_ANCS"; +static int ble_ancs_gap_event(struct ble_gap_event *event, void *arg); +static uint8_t own_addr_type; + +void ble_store_config_init(void); + +static ble_noti_attr_list_t p_attr[8] = { + [attr_appidentifier_index] = { + .noti_attribute_id = NotificationAttributeIDAppIdentifier, + .attribute_len = 0, + }, + [attr_title_index] = { + .noti_attribute_id = NotificationAttributeIDTitle, + .attribute_len = 0xFFFF, + }, + [attr_subtitle_index] = { + .noti_attribute_id = NotificationAttributeIDSubtitle, + .attribute_len = 0xFFFF, + }, + [attr_message_index] = { + .noti_attribute_id = NotificationAttributeIDMessage, + .attribute_len = 0xFFFF, + }, + [attr_messagesize_index] = { + .noti_attribute_id = NotificationAttributeIDMessageSize, + .attribute_len = 0, + }, + [attr_date_index] = { + .noti_attribute_id = NotificationAttributeIDDate, + .attribute_len = 0, + }, + [attr_positiveactionlabel_index] = { + .noti_attribute_id = NotificationAttributeIDPositiveActionLabel, + .attribute_len = 0, + }, + [attr_negativeactionlabel_index] = { + .noti_attribute_id = NotificationAttributeIDNegativeActionLabel, + .attribute_len = 0, + }, +}; + + +void ble_get_notification_attributes(uint16_t conn_handle, + uint16_t control_point_handle, + uint8_t *notificationUID, + uint8_t num_attr, + ble_noti_attr_list_t *p_attr) +{ + uint8_t cmd[600] = {0}; + + uint32_t index = 0; + cmd[index++] = CommandIDGetNotificationAttributes; + + memcpy(&cmd[index], notificationUID, ESP_NOTIFICATIONUID_LEN); + index += ESP_NOTIFICATIONUID_LEN; + + while (num_attr > 0) { + cmd[index++] = p_attr->noti_attribute_id; + + if (p_attr->attribute_len > 0) { + cmd[index++] = (uint8_t)(p_attr->attribute_len & 0xFF); + cmd[index++] = (uint8_t)((p_attr->attribute_len >> 8) & 0xFF); + } + + p_attr++; + num_attr--; + } + + int rc = ble_gattc_write_flat(conn_handle, + control_point_handle, + cmd, + index, + NULL, // no callback + NULL); // no argument + + if (rc != 0) { + MODLOG_DFLT(WARN, "Failed to write notification attribute request: rc=%d\n", rc); + + } +} +void ble_perform_notification_action(uint8_t *notificationUID, + uint8_t ActionID, + uint16_t conn_handle, + uint16_t control_point_handle) +{ + uint8_t buffer[600] = {0}; + + uint16_t index = 0; + buffer[index++] = CommandIDPerformNotificationAction; // define this as needed + + memcpy(&buffer[index], notificationUID, ESP_NOTIFICATIONUID_LEN); + index += ESP_NOTIFICATIONUID_LEN; + + buffer[index++] = ActionID; + + int rc = ble_gattc_write_flat(conn_handle, + control_point_handle, + buffer, + index, + NULL, // no callback + NULL); // no callback argument + + if (rc != 0) { + MODLOG_DFLT(WARN, "Failed to write perform action command: rc=%d\n", rc); + } +} + +static void periodic_timer_callback(void* arg) +{ + esp_timer_stop(periodic_timer); + if (data_buffer.len > 0) { + ble_receive_apple_data_source(data_buffer.buffer, data_buffer.len); + memset(data_buffer.buffer, 0, data_buffer.len); + data_buffer.len = 0; + } +} + +static int +ancs_on_custom_subscribe(uint16_t conn_handle, + const struct ble_gatt_error *error, + struct ble_gatt_attr *attr, + void *arg) +{ + + MODLOG_DFLT(INFO, + "Subscribe to the custom subscribable characteristic complete; " + "status=%d conn_handle=%d", + error->status, conn_handle); + + return 0; +} +int ancs_dsc_discovered_cb(uint16_t conn_handle, const struct ble_gatt_error *error, + uint16_t chr_val_handle, const struct ble_gatt_dsc *dsc, + void *arg) +{ + int rc = 0; + uint8_t cccd_val[2] = {0x01, 0x00}; // Enable notification + if (error->status == 0) { + if (ble_uuid_cmp(&dsc->uuid.u, BLE_UUID16_DECLARE(BLE_GATT_DSC_CLT_CFG_UUID16)) == 0) { + rc = ble_gattc_write_flat(conn_handle, + dsc->handle, + cccd_val, sizeof(cccd_val), + ancs_on_custom_subscribe, NULL); + + if (rc != 0) { + MODLOG_DFLT(WARN, "Failed to subscribe to (rc=%d)", rc); + return rc; + } + } + } else { + rc = error->status; + } + + return rc; +} + +static int +ancs_chr_discovered_cb(uint16_t conn_handle, const struct ble_gatt_error *error, + const struct ble_gatt_chr *chr, void *arg) +{ + int rc = 0; + if (error->status == 0) { + /* Notification Source */ + if ((chr->properties & BLE_GATT_CHR_PROP_NOTIFY) && + ble_uuid_cmp(&chr->uuid.u, ¬ification_source.u) == 0) { + + notification_source_handle = chr->val_handle; + rc = ble_gattc_disc_all_dscs(conn_handle, chr->val_handle, svc_e_handle, ancs_dsc_discovered_cb, NULL); + MODLOG_DFLT(INFO, "Found Notification Source characnteristic"); + + } + /* Data Source */ + else if ((chr->properties & BLE_GATT_CHR_PROP_NOTIFY) && + ble_uuid_cmp(&chr->uuid.u, &data_source.u) == 0) { + + data_source_handle = chr->val_handle; + rc = ble_gattc_disc_all_dscs(conn_handle, chr->val_handle, svc_e_handle, ancs_dsc_discovered_cb, NULL); + MODLOG_DFLT(INFO, "Found Data Source characteristic"); + + } + /* Control Point */ + else if ((chr->properties & BLE_GATT_CHR_PROP_WRITE) && + ble_uuid_cmp(&chr->uuid.u, &control_point.u) == 0) { + + control_point_handle = chr->val_handle; + MODLOG_DFLT(INFO, "Found Control Point characteristic"); + } + } else{ + rc = error->status; + } + + return rc; +} + +static int ancs_service_discovered_cb(uint16_t conn_handle, const struct ble_gatt_error *error, + const struct ble_gatt_svc *svc, void *arg) +{ + int rc ; + if (error->status == 0) { + if (svc == NULL) { + MODLOG_DFLT(WARN, "ANCS service not found"); + return -1; + } + + svc_e_handle = svc->end_handle; + /* discover characteristics within this service range */ + rc = ble_gattc_disc_all_chrs(conn_handle, svc->start_handle, svc->end_handle, ancs_chr_discovered_cb, NULL); + } else { + rc = error->status; + } + return rc; +} + +#if NIMBLE_BLE_CONNECT +/** + * Logs information about a connection to the console. + */ +static void +ble_ancs_print_conn_desc(struct ble_gap_conn_desc *desc) +{ + MODLOG_DFLT(INFO, "handle=%d our_ota_addr_type=%d our_ota_addr=", + desc->conn_handle, desc->our_ota_addr.type); + print_addr(desc->our_ota_addr.val); + MODLOG_DFLT(INFO, " our_id_addr_type=%d our_id_addr=", + desc->our_id_addr.type); + print_addr(desc->our_id_addr.val); + MODLOG_DFLT(INFO, " peer_ota_addr_type=%d peer_ota_addr=", + desc->peer_ota_addr.type); + print_addr(desc->peer_ota_addr.val); + MODLOG_DFLT(INFO, " peer_id_addr_type=%d peer_id_addr=", + desc->peer_id_addr.type); + print_addr(desc->peer_id_addr.val); + MODLOG_DFLT(INFO, " conn_itvl=%d conn_latency=%d supervision_timeout=%d " + "encrypted=%d authenticated=%d bonded=%d\n", + desc->conn_itvl, desc->conn_latency, + desc->supervision_timeout, + desc->sec_state.encrypted, + desc->sec_state.authenticated, + desc->sec_state.bonded); +} +#endif + +#if CONFIG_EXAMPLE_EXTENDED_ADV +/** + * Enables advertising with the following parameters: + * o General discoverable mode. + * o Undirected connectable mode. + */ +static void +ext_ble_ancs_advertise(void) +{ + struct ble_gap_ext_adv_params params; + struct os_mbuf *data; + uint8_t instance = 0; + int rc; + + /* First check if any instance is already active */ + if(ble_gap_ext_adv_active(instance)) { + return; + } + + /* use defaults for non-set params */ + memset (¶ms, 0, sizeof(params)); + + /* enable connectable advertising */ + params.connectable = 1; + + /* advertise using random addr */ + params.own_addr_type = BLE_OWN_ADDR_PUBLIC; + + params.primary_phy = BLE_HCI_LE_PHY_1M; + params.secondary_phy = BLE_HCI_LE_PHY_2M; + //params.tx_power = 127; + params.sid = 1; + + params.itvl_min = BLE_GAP_ADV_FAST_INTERVAL1_MIN; + params.itvl_max = BLE_GAP_ADV_FAST_INTERVAL1_MIN; + + /* configure instance 0 */ + rc = ble_gap_ext_adv_configure(instance, ¶ms, NULL, + ble_ancs_gap_event, NULL); + assert (rc == 0); + + /* in this case only scan response is allowed */ + + /* get mbuf for scan rsp data */ + data = os_msys_get_pkthdr(sizeof(ext_adv_pattern_1), 0); + assert(data); + + /* fill mbuf with scan rsp data */ + rc = os_mbuf_append(data, ext_adv_pattern_1, sizeof(ext_adv_pattern_1)); + assert(rc == 0); + + rc = ble_gap_ext_adv_set_data(instance, data); + assert (rc == 0); + + /* start advertising */ + rc = ble_gap_ext_adv_start(instance, 0, 0); + assert (rc == 0); +} +#else +/** + * Enables advertising with the following parameters: + * o General discoverable mode. + * o Undirected connectable mode. + */ +static void +ble_ancs_advertise(void) +{ + struct ble_gap_adv_params adv_params; + struct ble_hs_adv_fields fields; +#if CONFIG_BT_NIMBLE_GAP_SERVICE + const char *name; +#endif + int rc; + + /** + * Set the advertisement data included in our advertisements: + * o Flags (indicates advertisement type and other general info). + * o Advertising tx power. + * o Device name. + * o 16-bit service UUIDs (alert notifications). + */ + + memset(&fields, 0, sizeof fields); + + /* Advertise two flags: + * o Discoverability in forthcoming advertisement (general) + * o BLE-only (BR/EDR unsupported). + */ + fields.flags = BLE_HS_ADV_F_DISC_GEN | + BLE_HS_ADV_F_BREDR_UNSUP; + + /* Indicate that the TX power level field should be included; have the + * stack fill this value automatically. This is done by assigning the + * special value BLE_HS_ADV_TX_PWR_LVL_AUTO. + */ + fields.tx_pwr_lvl_is_present = 1; + fields.tx_pwr_lvl = BLE_HS_ADV_TX_PWR_LVL_AUTO; + + name = ble_svc_gap_device_name(); + fields.name = (uint8_t *)name; + fields.name_len = strlen(name); + fields.name_is_complete = 1; + + fields.num_uuids16 = 1; + fields.uuids16_is_complete = 1; + + rc = ble_gap_adv_set_fields(&fields); + if (rc != 0) { + MODLOG_DFLT(ERROR, "error setting advertisement data; rc=%d\n", rc); + return; + } + + /* Begin advertising. */ + memset(&adv_params, 0, sizeof adv_params); + adv_params.conn_mode = BLE_GAP_CONN_MODE_UND; + adv_params.disc_mode = BLE_GAP_DISC_MODE_GEN; + rc = ble_gap_adv_start(own_addr_type, NULL, BLE_HS_FOREVER, + &adv_params, ble_ancs_gap_event, NULL); + if (rc != 0) { + MODLOG_DFLT(ERROR, "error enabling advertisement; rc=%d\n", rc); + return; + } +} +#endif + +/** + * The nimble host executes this callback when a GAP event occurs. The + * application associates a GAP event callback with each connection that forms. + * ble_ancs uses the same callback for all connections. + * + * @param event The type of event being signalled. + * @param ctxt Various information pertaining to the event. + * @param arg Application-specified argument; unused by + * ble_ancs. + * + * @return 0 if the application successfully handled the + * event; nonzero on failure. The semantics + * of the return code is specific to the + * particular GAP event being signalled. + */ +static int +ble_ancs_gap_event(struct ble_gap_event *event, void *arg) +{ +#if NIMBLE_BLE_CONNECT + struct ble_gap_conn_desc desc; + int rc; +#endif + + switch (event->type) { + +#if NIMBLE_BLE_CONNECT + case BLE_GAP_EVENT_CONNECT: + /* A new connection was established or a connection attempt failed. */ + MODLOG_DFLT(INFO, "connection %s; status=%d ", + event->connect.status == 0 ? "established" : "failed", + event->connect.status); + if (event->connect.status == 0) { + rc = ble_gap_conn_find(event->connect.conn_handle, &desc); + assert(rc == 0); + ble_ancs_print_conn_desc(&desc); + } + MODLOG_DFLT(INFO, "\n"); + + if (event->connect.status != 0) { + /* Connection failed; resume advertising. */ +#if CONFIG_EXAMPLE_EXTENDED_ADV + ext_ble_ancs_advertise(); +#else + ble_ancs_advertise(); +#endif + } + + /** Initiate security - It will perform + * Pairing (Exchange keys) + * Bonding (Store keys) + * Encryption (Enable encryption) + * Will invoke event BLE_GAP_EVENT_ENC_CHANGE + **/ + rc = ble_gap_security_initiate(event->connect.conn_handle); + if (rc != 0) { + MODLOG_DFLT(INFO, "Security could not be initiated, rc = %d\n", rc); + return ble_gap_terminate(event->connect.conn_handle, + BLE_ERR_REM_USER_CONN_TERM); + } else { + MODLOG_DFLT(INFO, "Connection secured\n"); + } + return 0; + + case BLE_GAP_EVENT_DISCONNECT: + MODLOG_DFLT(INFO, "disconnect; reason=%d ", event->disconnect.reason); + ble_ancs_print_conn_desc(&event->disconnect.conn); + MODLOG_DFLT(INFO, "\n"); + + /* Connection terminated; resume advertising. */ +#if CONFIG_EXAMPLE_EXTENDED_ADV + ext_ble_ancs_advertise(); +#else + ble_ancs_advertise(); +#endif + return 0; + + case BLE_GAP_EVENT_CONN_UPDATE: + /* The central has updated the connection parameters. */ + MODLOG_DFLT(INFO, "connection updated; status=%d ", + event->conn_update.status); + rc = ble_gap_conn_find(event->conn_update.conn_handle, &desc); + assert(rc == 0); + ble_ancs_print_conn_desc(&desc); + MODLOG_DFLT(INFO, "\n"); + return 0; + + case BLE_GAP_EVENT_ADV_COMPLETE: + MODLOG_DFLT(INFO, "advertise complete; reason=%d", + event->adv_complete.reason); +#if CONFIG_EXAMPLE_EXTENDED_ADV + ext_ble_ancs_advertise(); +#else + ble_ancs_advertise(); +#endif + return 0; + + case BLE_GAP_EVENT_ENC_CHANGE: + /* Encryption has been enabled or disabled for this connection. */ + MODLOG_DFLT(INFO, "encryption change event; status=%d ", + event->enc_change.status); + rc = ble_gap_conn_find(event->enc_change.conn_handle, &desc); + assert(rc == 0); + ble_ancs_print_conn_desc(&desc); + MODLOG_DFLT(INFO, "\n"); + rc = ble_gattc_disc_svc_by_uuid(event->connect.conn_handle, &APPLE_NC_UUID.u, + ancs_service_discovered_cb, NULL); + if (rc != 0) { + return rc; + } + return 0; + + case BLE_GAP_EVENT_NOTIFY_TX: + MODLOG_DFLT(INFO, "notify_tx event; conn_handle=%d attr_handle=%d " + "status=%d is_indication=%d", + event->notify_tx.conn_handle, + event->notify_tx.attr_handle, + event->notify_tx.status, + event->notify_tx.indication); + return 0; + + case BLE_GAP_EVENT_NOTIFY_RX: + /* Peer sent us a notification or indication. */ + if (event->notify_rx.attr_handle == notification_source_handle) { + ble_receive_apple_notification_source(event->notify_rx.om->om_data, event->notify_rx.om->om_len); + uint8_t *notificationUID = &event->notify_rx.om->om_data[4]; + if (event->notify_rx.om->om_data[0] == EventIDNotificationAdded && + event->notify_rx.om->om_data[2] == CategoryIDIncomingCall) { + MODLOG_DFLT(INFO, "IncomingCall, reject"); + ble_perform_notification_action(notificationUID, ActionIDNegative, event->notify_rx.conn_handle, control_point_handle); + } else if (event->notify_rx.om->om_data[0] == EventIDNotificationAdded) { + MODLOG_DFLT(INFO, "Get detailed information"); + ble_get_notification_attributes(event->notify_rx.conn_handle, control_point_handle, + notificationUID, sizeof(p_attr)/sizeof(ble_noti_attr_list_t), p_attr); + } + } else if (event->notify_rx.attr_handle == data_source_handle) { + memcpy(&data_buffer.buffer[data_buffer.len], + event->notify_rx.om->om_data, + event->notify_rx.om->om_len); + data_buffer.len += event->notify_rx.om->om_len; + + if (event->notify_rx.om->om_len == (MTU_size - 3)) { + esp_timer_start_periodic(periodic_timer, 500000); + } else { + esp_timer_stop(periodic_timer); + ble_receive_apple_data_source(data_buffer.buffer, data_buffer.len); + memset(data_buffer.buffer, 0, data_buffer.len); + data_buffer.len = 0; + } + + } else { + MODLOG_DFLT(INFO, "unknown handle, receive notify value:" ); + } + return 0; + + case BLE_GAP_EVENT_SUBSCRIBE: + MODLOG_DFLT(INFO, "subscribe event; conn_handle=%d attr_handle=%d " + "reason=%d prevn=%d curn=%d previ=%d curi=%d\n", + event->subscribe.conn_handle, + event->subscribe.attr_handle, + event->subscribe.reason, + event->subscribe.prev_notify, + event->subscribe.cur_notify, + event->subscribe.prev_indicate, + event->subscribe.cur_indicate); + return 0; + + case BLE_GAP_EVENT_MTU: + MTU_size = event->mtu.value; + MODLOG_DFLT(INFO, "mtu update event; conn_handle=%d cid=%d mtu=%d\n", + event->mtu.conn_handle, + event->mtu.channel_id, + event->mtu.value); + return 0; + + case BLE_GAP_EVENT_REPEAT_PAIRING: + /* We already have a bond with the peer, but it is attempting to + * establish a new secure link. This app sacrifices security for + * convenience: just throw away the old bond and accept the new link. + */ + + /* Delete the old bond. */ + rc = ble_gap_conn_find(event->repeat_pairing.conn_handle, &desc); + assert(rc == 0); + ble_store_util_delete_peer(&desc.peer_id_addr); + + /* Return BLE_GAP_REPEAT_PAIRING_RETRY to indicate that the host should + * continue with the pairing operation. + */ + return BLE_GAP_REPEAT_PAIRING_RETRY; + + case BLE_GAP_EVENT_PASSKEY_ACTION: + ESP_LOGI(tag, "PASSKEY_ACTION_EVENT started"); + struct ble_sm_io pkey = {0}; + int key = 0; + + if (event->passkey.params.action == BLE_SM_IOACT_DISP) { + pkey.action = event->passkey.params.action; + pkey.passkey = 123456; // This is the passkey to be entered on peer + ESP_LOGI(tag, "Enter passkey %" PRIu32 "on the peer side", pkey.passkey); + rc = ble_sm_inject_io(event->passkey.conn_handle, &pkey); + ESP_LOGI(tag, "ble_sm_inject_io result: %d", rc); + } else if (event->passkey.params.action == BLE_SM_IOACT_NUMCMP) { + ESP_LOGI(tag, "Passkey on device's display: %" PRIu32 , event->passkey.params.numcmp); + ESP_LOGI(tag, "Accept or reject the passkey through console in this format -> key Y or key N"); + pkey.action = event->passkey.params.action; + if (scli_receive_key(&key)) { + pkey.numcmp_accept = key; + } else { + pkey.numcmp_accept = 0; + ESP_LOGE(tag, "Timeout! Rejecting the key"); + } + rc = ble_sm_inject_io(event->passkey.conn_handle, &pkey); + ESP_LOGI(tag, "ble_sm_inject_io result: %d", rc); + } else if (event->passkey.params.action == BLE_SM_IOACT_OOB) { + static uint8_t tem_oob[16] = {0}; + pkey.action = event->passkey.params.action; + for (int i = 0; i < 16; i++) { + pkey.oob[i] = tem_oob[i]; + } + rc = ble_sm_inject_io(event->passkey.conn_handle, &pkey); + ESP_LOGI(tag, "ble_sm_inject_io result: %d", rc); + } else if (event->passkey.params.action == BLE_SM_IOACT_INPUT) { + ESP_LOGI(tag, "Enter the passkey through console in this format-> key 123456"); + pkey.action = event->passkey.params.action; + if (scli_receive_key(&key)) { + pkey.passkey = key; + } else { + pkey.passkey = 0; + ESP_LOGE(tag, "Timeout! Passing 0 as the key"); + } + rc = ble_sm_inject_io(event->passkey.conn_handle, &pkey); + ESP_LOGI(tag, "ble_sm_inject_io result: %d", rc); + } + return 0; + +#endif + } + return 0; +} + +static void +ble_ancs_on_reset(int reason) +{ + MODLOG_DFLT(ERROR, "Resetting state; reason=%d\n", reason); +} + +static void +ble_ancs_on_sync(void) +{ + int rc; + + rc = ble_hs_util_ensure_addr(0); + assert(rc == 0); + + /* Figure out address to use while advertising (no privacy for now) */ + rc = ble_hs_id_infer_auto(0, &own_addr_type); + if (rc != 0) { + MODLOG_DFLT(ERROR, "error determining address type; rc=%d\n", rc); + return; + } + + /* Printing ADDR */ + uint8_t addr_val[6] = {0}; + rc = ble_hs_id_copy_addr(own_addr_type, addr_val, NULL); + + MODLOG_DFLT(INFO, "Device Address: "); + print_addr(addr_val); + MODLOG_DFLT(INFO, "\n"); + /* Begin advertising. */ +#if CONFIG_EXAMPLE_EXTENDED_ADV + ext_ble_ancs_advertise(); +#else + ble_ancs_advertise(); +#endif +} + +void ble_ancs_host_task(void *param) +{ + ESP_LOGI(tag, "BLE Host Task Started"); + /* This function will return only when nimble_port_stop() is executed */ + nimble_port_run(); + + nimble_port_freertos_deinit(); +} + +void +app_main(void) +{ + int rc; + + /* Initialize NVS — it is used to store PHY calibration data */ + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + ret = nimble_port_init(); + if (ret != ESP_OK) { + ESP_LOGE(tag, "Failed to init nimble %d ", ret); + return; + } + /* Initialize the NimBLE host configuration. */ + ble_hs_cfg.reset_cb = ble_ancs_on_reset; + ble_hs_cfg.sync_cb = ble_ancs_on_sync; + ble_hs_cfg.store_status_cb = ble_store_util_status_rr; + + ble_hs_cfg.sm_bonding = 1; + /* Enable the appropriate bit masks to make sure the keys + * that are needed are exchanged + */ + ble_hs_cfg.sm_our_key_dist |= BLE_SM_PAIR_KEY_DIST_ENC; + ble_hs_cfg.sm_their_key_dist |= BLE_SM_PAIR_KEY_DIST_ENC; + ble_hs_cfg.sm_sc = 0; + + /* Set the default device name. */ + rc = ble_svc_gap_device_name_set("nimble-ancs"); + assert(rc == 0); + + /* XXX Need to have template for store */ + ble_store_config_init(); + + nimble_port_freertos_init(ble_ancs_host_task); + +} diff --git a/examples/bluetooth/nimble/ble_ancs/sdkconfig.defaults b/examples/bluetooth/nimble/ble_ancs/sdkconfig.defaults new file mode 100644 index 00000000000..5969b0a1ccb --- /dev/null +++ b/examples/bluetooth/nimble/ble_ancs/sdkconfig.defaults @@ -0,0 +1,13 @@ +# Override some defaults so BT stack is enabled +# in this example + +# +# BT config +# +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_BT_NIMBLE_NVS_PERSIST=y diff --git a/tools/ci/check_copyright_ignore.txt b/tools/ci/check_copyright_ignore.txt index b689dab5116..c8c7a800446 100644 --- a/tools/ci/check_copyright_ignore.txt +++ b/tools/ci/check_copyright_ignore.txt @@ -825,6 +825,7 @@ examples/bluetooth/esp_ble_mesh/aligenie_demo/components/vendor_model/include/ge examples/bluetooth/esp_ble_mesh/aligenie_demo/components/vendor_model/include/genie_slist.h examples/bluetooth/esp_ble_mesh/aligenie_demo/components/vendor_model/include/genie_timer.h examples/bluetooth/esp_ble_mesh/aligenie_demo/components/vendor_model/include/genie_util.h +examples/bluetooth/nimble/ble_ancs/main/main.c examples/bluetooth/nimble/blecent/main/blecent.h examples/bluetooth/nimble/blecent/main/main.c examples/bluetooth/nimble/blecsc/main/blecsc_sens.h From f91a687bae360729602864549ffb5e5152bd4618 Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Wed, 4 Jun 2025 11:06:14 +0200 Subject: [PATCH 015/213] ci(change): disable esp32c61 tests --- examples/system/.build-test-rules.yml | 4 ++-- examples/system/app_trace_basic/pytest_app_trace_basic.py | 1 - examples/system/gcov/pytest_gcov.py | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/examples/system/.build-test-rules.yml b/examples/system/.build-test-rules.yml index c52bdb089a4..dd18995fa07 100644 --- a/examples/system/.build-test-rules.yml +++ b/examples/system/.build-test-rules.yml @@ -2,7 +2,7 @@ examples/system/app_trace_basic: disable_test: - - if: IDF_TARGET in ["esp32p4", "esp32c5"] + - if: IDF_TARGET in ["esp32p4", "esp32c5", "esp32c61"] temporary: true reason: lack of runners. @@ -86,7 +86,7 @@ examples/system/freertos/real_time_stats: examples/system/gcov: disable_test: - - if: IDF_TARGET in ["esp32p4", "esp32c5"] + - if: IDF_TARGET in ["esp32p4", "esp32c5", "esp32c61"] temporary: true reason: lack of runners - if: IDF_TARGET == "esp32s3" diff --git a/examples/system/app_trace_basic/pytest_app_trace_basic.py b/examples/system/app_trace_basic/pytest_app_trace_basic.py index b669b5f013b..b715f256583 100644 --- a/examples/system/app_trace_basic/pytest_app_trace_basic.py +++ b/examples/system/app_trace_basic/pytest_app_trace_basic.py @@ -165,7 +165,6 @@ def test_examples_app_trace_basic(dut: IdfDut) -> None: @pytest.mark.esp32s3 @pytest.mark.esp32c3 @pytest.mark.esp32c6 -@pytest.mark.esp32c61 @pytest.mark.esp32h2 @pytest.mark.usb_serial_jtag def test_examples_app_trace_basic_usj(dut: IdfDut) -> None: diff --git a/examples/system/gcov/pytest_gcov.py b/examples/system/gcov/pytest_gcov.py index acd72752a30..1513137edc5 100644 --- a/examples/system/gcov/pytest_gcov.py +++ b/examples/system/gcov/pytest_gcov.py @@ -188,6 +188,6 @@ def test_gcov(dut: IdfDut) -> None: @pytest.mark.usb_serial_jtag -@idf_parametrize('target', ['esp32c3', 'esp32c6', 'esp32c61', 'esp32h2'], indirect=['target']) +@idf_parametrize('target', ['esp32c3', 'esp32c6', 'esp32h2'], indirect=['target']) def test_gcov_usj(dut: IdfDut) -> None: _test_gcov(dut) From cf2780a7c35e505fc8ec00e3a8e0aab64bd3f7b8 Mon Sep 17 00:00:00 2001 From: luoxu Date: Fri, 6 Jun 2025 14:28:19 +0800 Subject: [PATCH 016/213] fix(ble_mesh): fixed proxy server might send segment message with incorrect format refer commit: 7738bca124a2d15f14a3b9573ee468c166077a37 --- components/bt/esp_ble_mesh/core/proxy_server.c | 2 +- components/bt/esp_ble_mesh/core/scan.c | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/components/bt/esp_ble_mesh/core/proxy_server.c b/components/bt/esp_ble_mesh/core/proxy_server.c index 50d881e991f..cc98e03cdc4 100644 --- a/components/bt/esp_ble_mesh/core/proxy_server.c +++ b/components/bt/esp_ble_mesh/core/proxy_server.c @@ -1341,7 +1341,7 @@ int bt_mesh_proxy_server_segment_send(struct bt_mesh_conn *conn, uint8_t type, net_buf_simple_pull(msg, mtu); while (msg->len) { - if (msg->len + 1 < mtu) { + if (msg->len + 1 <= mtu) { net_buf_simple_push_u8(msg, BLE_MESH_PROXY_PDU_HDR(BLE_MESH_PROXY_SAR_LAST, type)); proxy_send(conn, msg->data, msg->len); break; diff --git a/components/bt/esp_ble_mesh/core/scan.c b/components/bt/esp_ble_mesh/core/scan.c index 9931c873eb5..4ddd2418d3c 100644 --- a/components/bt/esp_ble_mesh/core/scan.c +++ b/components/bt/esp_ble_mesh/core/scan.c @@ -2,7 +2,7 @@ /* * SPDX-FileCopyrightText: 2017 Intel Corporation - * SPDX-FileContributor: 2020-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileContributor: 2020-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -86,13 +86,14 @@ int bt_mesh_unprov_dev_info_query(uint8_t uuid[16], uint8_t addr[6], { uint8_t idx = 0; uint8_t cnt = 0; + uint8_t pair_num = unprov_dev_info_fifo.pair_num; - if (uuid == NULL || addr == NULL) { + if (uuid == NULL && addr == NULL) { BT_WARN("No available information to query"); return -1; } - while (cnt < unprov_dev_info_fifo.pair_num) { + while (cnt < pair_num) { idx = (cnt + unprov_dev_info_fifo.start_idx) % BLE_MESH_STORE_UNPROV_INFO_MAX_NUM; if (query_type & BLE_MESH_STORE_UNPROV_INFO_QUERY_TYPE_UUID) { if (!memcmp(unprov_dev_info_fifo.info[idx].addr, addr, 6)) { @@ -118,7 +119,7 @@ int bt_mesh_unprov_dev_info_query(uint8_t uuid[16], uint8_t addr[6], cnt++; } - if (cnt == unprov_dev_info_fifo.pair_num) { + if (cnt == pair_num) { return -1; } From 976409b59e903a671ba1ed79b5dc8aa23399d293 Mon Sep 17 00:00:00 2001 From: luoxu Date: Wed, 28 May 2025 17:21:26 +0800 Subject: [PATCH 017/213] fix(ble_mesh): fixed issue with recv ntf before ccc done --- .../core/bluedroid_host/adapter.c | 4 +++- .../bt/esp_ble_mesh/core/proxy_client.c | 21 +++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/components/bt/esp_ble_mesh/core/bluedroid_host/adapter.c b/components/bt/esp_ble_mesh/core/bluedroid_host/adapter.c index 2480494181f..2f3b3d351b8 100644 --- a/components/bt/esp_ble_mesh/core/bluedroid_host/adapter.c +++ b/components/bt/esp_ble_mesh/core/bluedroid_host/adapter.c @@ -1599,8 +1599,10 @@ static void bt_mesh_bta_gattc_cb(tBTA_GATTC_EVT event, tBTA_GATTC *p_data) for (i = 0; i < ARRAY_SIZE(bt_mesh_gattc_info); i++) { if (bt_mesh_gattc_info[i].conn.handle == handle) { if (bt_mesh_gattc_info[i].wr_desc_done == false) { - BT_DBG("Receive notification before finishing to write ccc"); + BT_WARN("Receive notification before finishing to write ccc"); +#if !CONFIG_BLE_MESH_BQB_TEST return; +#endif } conn = &bt_mesh_gattc_info[i].conn; diff --git a/components/bt/esp_ble_mesh/core/proxy_client.c b/components/bt/esp_ble_mesh/core/proxy_client.c index 016db7f2ce9..d89c5ff1fdf 100644 --- a/components/bt/esp_ble_mesh/core/proxy_client.c +++ b/components/bt/esp_ble_mesh/core/proxy_client.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2017-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2017-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -31,7 +31,7 @@ static struct bt_mesh_proxy_server { struct bt_mesh_conn *conn; - + bt_mesh_addr_t addr; enum __attribute__((packed)) { CLI_NONE, CLI_PROV, @@ -465,6 +465,7 @@ static void proxy_connected(bt_mesh_addr_t *addr, struct bt_mesh_conn *conn, int server->conn = bt_mesh_conn_ref(conn); server->conn_type = CLI_NONE; + memcpy(&server->addr, addr, sizeof(bt_mesh_addr_t)); net_buf_simple_reset(&server->buf); #if CONFIG_BLE_MESH_RPR_SRV && CONFIG_BLE_MESH_PB_GATT @@ -629,6 +630,12 @@ static ssize_t proxy_write_ccc(bt_mesh_addr_t *addr, struct bt_mesh_conn *conn) return 0; } +#if CONFIG_BLE_MESH_BQB_TEST + /* notify maybe received first */ + if (server->conn_type == CLI_PROXY) { + return 0; + } +#endif return -EINVAL; } @@ -641,6 +648,16 @@ static ssize_t proxy_recv_ntf(struct bt_mesh_conn *conn, uint8_t *data, uint16_t return -ENOTCONN; } +#if CONFIG_BLE_MESH_BQB_TEST + /* update conn type if notify received before write ccc */ + if (server->conn_type == CLI_NONE) { + server->conn_type = CLI_PROXY; + if (proxy_client_connect_cb) { + proxy_client_connect_cb(&server->addr, server - servers, server->net_idx); + } + } +#endif + if (server->conn_type == CLI_PROXY) { return proxy_recv(conn, NULL, data, len, 0, 0); } From 8c729ffef1d74bebaf76d5569cc9bfe4f328166f Mon Sep 17 00:00:00 2001 From: luoxu Date: Fri, 6 Jun 2025 14:38:38 +0800 Subject: [PATCH 018/213] feat(ble_mesh): update lib to f15b27e2d2 --- components/bt/esp_ble_mesh/lib/lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/esp_ble_mesh/lib/lib b/components/bt/esp_ble_mesh/lib/lib index a62a98132cd..50346b46ba8 160000 --- a/components/bt/esp_ble_mesh/lib/lib +++ b/components/bt/esp_ble_mesh/lib/lib @@ -1 +1 @@ -Subproject commit a62a98132cdec59d2f2745da7b0598964b38bdae +Subproject commit 50346b46ba845fd0b25552faea828de67a515da4 From f99db02e59e2591a84a2e2fb9896c04c09f7db9d Mon Sep 17 00:00:00 2001 From: Xu Si Yu Date: Wed, 21 May 2025 19:30:19 +0800 Subject: [PATCH 019/213] feat(openthread): add a function to exit openthread main loop safely --- components/openthread/include/esp_openthread.h | 11 ++++++++++- components/openthread/src/esp_openthread.cpp | 15 ++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/components/openthread/include/esp_openthread.h b/components/openthread/include/esp_openthread.h index 9e5f39a59bf..a3f0528f935 100644 --- a/components/openthread/include/esp_openthread.h +++ b/components/openthread/include/esp_openthread.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -79,6 +79,15 @@ esp_err_t esp_openthread_deinit(void); */ otInstance *esp_openthread_get_instance(void); +/** + * @brief Signals the OpenThread main loop to exit. + * + * @return + * - ESP_OK on success + * - ESP_FAIL on failures + * + */ +esp_err_t esp_openthread_mainloop_exit(void); #ifdef __cplusplus } // end of extern "C" diff --git a/components/openthread/src/esp_openthread.cpp b/components/openthread/src/esp_openthread.cpp index 73018e2d3f4..d816cd121d5 100644 --- a/components/openthread/src/esp_openthread.cpp +++ b/components/openthread/src/esp_openthread.cpp @@ -26,6 +26,8 @@ #include "openthread/dataset_ftd.h" #endif +static bool s_ot_mainloop_running = false; + static int hex_digit_to_int(char hex) { if ('A' <= hex && hex <= 'F') { @@ -158,13 +160,24 @@ esp_err_t esp_openthread_auto_start(otOperationalDatasetTlvs *datasetTlvs) return ESP_OK; } +static void mainloop_safe_exit(void *ctx) +{ + s_ot_mainloop_running = false; +} + +esp_err_t esp_openthread_mainloop_exit(void) +{ + return esp_openthread_task_queue_post(mainloop_safe_exit, NULL); +} + esp_err_t esp_openthread_launch_mainloop(void) { esp_openthread_mainloop_context_t mainloop; otInstance *instance = esp_openthread_get_instance(); esp_err_t error = ESP_OK; + s_ot_mainloop_running = true; - while (true) { + while (s_ot_mainloop_running) { FD_ZERO(&mainloop.read_fds); FD_ZERO(&mainloop.write_fds); FD_ZERO(&mainloop.error_fds); From 2a76a7f206e02295c36118a62cf4388959079f93 Mon Sep 17 00:00:00 2001 From: Abhinav Kudnar Date: Thu, 29 May 2025 11:55:33 +0530 Subject: [PATCH 020/213] fix(nimble): memset the sync structs to prevent uncertainty for ext_adv reports --- .../ble_pawr_adv/ble_pawr_sync/main/main.c | 26 ++++--------------- .../ble_pawr_sync_conn/main/main.c | 22 +++------------- 2 files changed, 8 insertions(+), 40 deletions(-) diff --git a/examples/bluetooth/nimble/ble_pawr_adv/ble_pawr_sync/main/main.c b/examples/bluetooth/nimble/ble_pawr_adv/ble_pawr_sync/main/main.c index c0a8ef0b60d..dc9d1b83e2f 100644 --- a/examples/bluetooth/nimble/ble_pawr_adv/ble_pawr_sync/main/main.c +++ b/examples/bluetooth/nimble/ble_pawr_adv/ble_pawr_sync/main/main.c @@ -22,7 +22,6 @@ static void start_scan(void); static struct ble_hs_adv_fields fields; static bool synced = false; -uint8_t rsp_slot_idx = 0; static int gap_event_cb(struct ble_gap_event *event, void *arg) { @@ -57,12 +56,11 @@ gap_event_cb(struct ble_gap_event *event, void *arg) event->periodic_report.event_counter, event->periodic_report.subevent); - rsp_slot_idx += 1; struct ble_gap_periodic_adv_response_params param = { .request_event = event->periodic_report.event_counter, .request_subevent = event->periodic_report.subevent, .response_subevent = event->periodic_report.subevent, - .response_slot = rsp_slot_idx, + .response_slot = 2, }; struct os_mbuf *data = os_msys_get_pkthdr(BLE_PAWR_RSP_DATA_LEN, 0); @@ -129,8 +127,9 @@ static int create_periodic_sync(struct ble_gap_ext_disc_desc *disc) { int rc; - struct ble_gap_periodic_sync_params params; + struct ble_gap_periodic_sync_params params = {0}; + memset(¶ms, 0, sizeof(params)); params.skip = 0; params.sync_timeout = 4000; params.reports_disabled = 0; @@ -159,9 +158,11 @@ start_scan(void) int rc; struct ble_gap_ext_disc_params disc_params; + /* Perform a passive scan. I.e., don't send follow-up scan requests to * each advertiser. */ + memset(&disc_params, 0, sizeof(disc_params)); disc_params.itvl = BLE_GAP_SCAN_ITVL_MS(600); disc_params.window = BLE_GAP_SCAN_ITVL_MS(300); disc_params.passive = 1; @@ -182,23 +183,6 @@ on_reset(int reason) ESP_LOGE(TAG, "Resetting state; reason=%d\n", reason); } -/* Cnnot find `ble_single_xxxx()`, workaround */ -// static void -// on_sync(void) -// { -// int ble_single_env_init(void); -// int ble_single_init(void); - -// int rc; - -// rc = ble_single_env_init(); -// assert(!rc); -// rc = ble_single_init(); -// assert(!rc); - -// start_scan(); -// } - static void on_sync(void) { diff --git a/examples/bluetooth/nimble/ble_pawr_adv_conn/ble_pawr_sync_conn/main/main.c b/examples/bluetooth/nimble/ble_pawr_adv_conn/ble_pawr_sync_conn/main/main.c index 967d7c9e3f4..e43a975ce43 100644 --- a/examples/bluetooth/nimble/ble_pawr_adv_conn/ble_pawr_sync_conn/main/main.c +++ b/examples/bluetooth/nimble/ble_pawr_adv_conn/ble_pawr_sync_conn/main/main.c @@ -185,8 +185,8 @@ static int create_periodic_sync(struct ble_gap_ext_disc_desc *disc) { int rc; - struct ble_gap_periodic_sync_params params; - + struct ble_gap_periodic_sync_params params = {0}; + memset(¶ms, 0, sizeof(params)); params.skip = 0; params.sync_timeout = 4000; params.reports_disabled = 0; @@ -218,6 +218,7 @@ start_scan(void) /* Perform a passive scan. I.e., don't send follow-up scan requests to * each advertiser. */ + memset(&disc_params, 0, sizeof(disc_params)); disc_params.itvl = BLE_GAP_SCAN_ITVL_MS(600); disc_params.window = BLE_GAP_SCAN_ITVL_MS(300); disc_params.passive = 1; @@ -238,23 +239,6 @@ on_reset(int reason) ESP_LOGE(TAG, "Resetting state; reason=%d\n", reason); } -/* Cnnot find `ble_single_xxxx()`, workaround */ -// static void -// on_sync(void) -// { -// int ble_single_env_init(void); -// int ble_single_init(void); - -// int rc; - -// rc = ble_single_env_init(); -// assert(!rc); -// rc = ble_single_init(); -// assert(!rc); - -// start_scan(); -// } - static void on_sync(void) { From 00e26f15b435e186fa8a4d5c750e063b9b7e6b0d Mon Sep 17 00:00:00 2001 From: Zhang Hai Peng Date: Wed, 4 Jun 2025 17:13:39 +0800 Subject: [PATCH 021/213] feat(ble/bluedroid): Include SMP state in BLE status reporting (cherry picked from commit de9a367f130366c1d924332f1ac5a51c01013080) Co-authored-by: zhanghaipeng --- components/bt/host/bluedroid/btc/core/btc_main.c | 7 +++++++ components/bt/host/bluedroid/btc/include/btc/btc_main.h | 1 + 2 files changed, 8 insertions(+) diff --git a/components/bt/host/bluedroid/btc/core/btc_main.c b/components/bt/host/bluedroid/btc/core/btc_main.c index cb92ff9beaf..8f28aca2488 100644 --- a/components/bt/host/bluedroid/btc/core/btc_main.c +++ b/components/bt/host/bluedroid/btc/core/btc_main.c @@ -216,5 +216,12 @@ uint32_t btc_get_ble_status(void) } #endif + #if SMP_INCLUDED == TRUE + extern uint8_t smp_get_state(void); + if (smp_get_state()) { + status |= BIT(BTC_BLE_STATUS_SMP_STATE); + } + #endif + return status; } diff --git a/components/bt/host/bluedroid/btc/include/btc/btc_main.h b/components/bt/host/bluedroid/btc/include/btc/btc_main.h index 4cc77841418..83f87b56a3b 100644 --- a/components/bt/host/bluedroid/btc/include/btc/btc_main.h +++ b/components/bt/host/bluedroid/btc/include/btc/btc_main.h @@ -41,6 +41,7 @@ typedef enum { BTC_BLE_STATUS_GATTS_SRVC, // GATTS service exist BTC_BLE_STATUS_PRIVACY, // Privacy enabled BTC_BLE_STATUS_ADDR_RESOLVE_DISABLE,// Address resolution disable status + BTC_BLE_STATUS_SMP_STATE, // SMP state machine } tBTC_BLE_STATUS; future_t **btc_main_get_future_p(btc_main_future_type_t type); From 7a17d9c2f7cd708ff824a3804f830d318f5ffff6 Mon Sep 17 00:00:00 2001 From: Zhang Hai Peng Date: Wed, 4 Jun 2025 17:13:41 +0800 Subject: [PATCH 022/213] fix(ble/bluedroid): Fixed BLE SMP state machine inconsistency on disconnection (cherry picked from commit 99121258d40bb2940555dd1014b9f66ceb4d98ca) Co-authored-by: zhanghaipeng --- components/bt/host/bluedroid/stack/smp/smp_act.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/components/bt/host/bluedroid/stack/smp/smp_act.c b/components/bt/host/bluedroid/stack/smp/smp_act.c index 0e7dcd5b3f2..43b2e476530 100644 --- a/components/bt/host/bluedroid/stack/smp/smp_act.c +++ b/components/bt/host/bluedroid/stack/smp/smp_act.c @@ -1553,7 +1553,7 @@ void smp_fast_conn_param(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) } /* Disable L2CAP connection parameter updates while bonding since some peripherals are not able to revert to fast connection parameters - during the start of service discovery. Connection paramter updates + during the start of service discovery. Connection parameter updates get enabled again once service discovery completes. */ #if (BT_MULTI_CONNECTION_ENBALE == FALSE) L2CA_EnableUpdateBleConnParams(p_cb->pairing_bda, FALSE); @@ -1648,6 +1648,8 @@ void smp_process_local_nonce(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) /* slave calculates and sends local commitment */ smp_calculate_local_commitment(p_cb); smp_send_commitment(p_cb, NULL); + /* Ensure the connection is still active */ + if (smp_get_state() == SMP_STATE_IDLE) return; /* slave has to wait for peer nonce */ smp_set_state(SMP_STATE_WAIT_NONCE); } else { /* i.e. master */ @@ -1658,6 +1660,8 @@ void smp_process_local_nonce(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) p_cb->selected_association_model); p_cb->flags &= ~SMP_PAIR_FLAG_HAVE_PEER_COMM; smp_send_rand(p_cb, NULL); + /* Ensure the connection is still active */ + if (smp_get_state() == SMP_STATE_IDLE) return; smp_set_state(SMP_STATE_WAIT_NONCE); } } @@ -1672,6 +1676,8 @@ void smp_process_local_nonce(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_COMM) { /* master commitment is already received */ smp_send_commitment(p_cb, NULL); + /* Ensure the connection is still active */ + if (smp_get_state() == SMP_STATE_IDLE) return; smp_set_state(SMP_STATE_WAIT_NONCE); } } @@ -1679,6 +1685,8 @@ void smp_process_local_nonce(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) case SMP_MODEL_SEC_CONN_OOB: if (p_cb->role == HCI_ROLE_MASTER) { smp_send_rand(p_cb, NULL); + /* Ensure the connection is still active */ + if (smp_get_state() == SMP_STATE_IDLE) return; } smp_set_state(SMP_STATE_WAIT_NONCE); @@ -2002,7 +2010,7 @@ void smp_link_encrypted(BD_ADDR bda, UINT8 encr_enable) SMP_TRACE_DEBUG("%s encr_enable=%d\n", __func__, encr_enable); if (memcmp(&smp_cb.pairing_bda[0], bda, BD_ADDR_LEN) == 0) { - /* encryption completed with STK, remmeber the key size now, could be overwite + /* encryption completed with STK, remember the key size now, could be overwrite * when key exchange happens */ if (p_cb->loc_enc_size != 0 && encr_enable) { /* update the link encryption key size if a SMP pairing just performed */ From 59b727663fd12823f688e6b2e633b62e0ea010b4 Mon Sep 17 00:00:00 2001 From: Zhang Shuxian Date: Fri, 6 Jun 2025 11:11:13 +0800 Subject: [PATCH 023/213] docs: Update hw-reference/index.rst for esp32p4 --- docs/en/hw-reference/index.rst | 34 +++++++++++++++++-------------- docs/zh_CN/hw-reference/index.rst | 34 +++++++++++++++++-------------- 2 files changed, 38 insertions(+), 30 deletions(-) diff --git a/docs/en/hw-reference/index.rst b/docs/en/hw-reference/index.rst index d19e0edc3ee..b9eca1c0eeb 100644 --- a/docs/en/hw-reference/index.rst +++ b/docs/en/hw-reference/index.rst @@ -7,7 +7,7 @@ Hardware Reference .. toctree:: :maxdepth: 1 - :not esp32p4: Technical Reference Manual (PDF) <{IDF_TARGET_TRM_EN_URL}> + Technical Reference Manual (PDF) <{IDF_TARGET_TRM_EN_URL}> :esp32: Chip Datasheet (PDF) :esp32s2: Chip Datasheet (PDF) :esp32s3: Chip Datasheet (PDF) @@ -15,20 +15,24 @@ Hardware Reference :esp32c3: Chip Datasheet (PDF) :esp32c6: Chip Datasheet (PDF) :esp32h2: Chip Datasheet (PDF) - :esp32: Hardware Design Guidelines (PDF) - :esp32s2: Hardware Design Guidelines (PDF) - :esp32s3: Hardware Design Guidelines (PDF) - :esp32c2: Hardware Design Guidelines (PDF) - :esp32c3: Hardware Design Guidelines (PDF) - :esp32c6: Hardware Design Guidelines (PDF) - :esp32h2: Hardware Design Guidelines (PDF) - :esp32: Silicon Errata (PDF) - :esp32s2: Silicon Errata (PDF) - :esp32s3: Silicon Errata (PDF) - :esp32c3: Silicon Errata (PDF) - :esp32c2: Silicon Errata (PDF) - :esp32c6: Silicon Errata (PDF) - :esp32h2: Silicon Errata (PDF) + :esp32c5: Chip Datasheet (PDF) + :esp32p4: Chip Datasheet (PDF) + :esp32: Hardware Design Guidelines + :esp32s2: Hardware Design Guidelines + :esp32s3: Hardware Design Guidelines + :esp32c2: Hardware Design Guidelines + :esp32c3: Hardware Design Guidelines + :esp32c6: Hardware Design Guidelines + :esp32h2: Hardware Design Guidelines + :esp32p4: Hardware Design Guidelines + :esp32c5: Hardware Design Guidelines + :esp32: SoC Errata + :esp32s2: SoC Errata + :esp32s3: SoC Errata + :esp32c3: SoC Errata + :esp32c2: SoC Errata + :esp32c6: SoC Errata + :esp32h2: SoC Errata Chip Variants :not esp32p4: Modules Development Boards diff --git a/docs/zh_CN/hw-reference/index.rst b/docs/zh_CN/hw-reference/index.rst index 86cee7cc349..b78c0afbef0 100644 --- a/docs/zh_CN/hw-reference/index.rst +++ b/docs/zh_CN/hw-reference/index.rst @@ -7,7 +7,7 @@ H/W 硬件参考 .. toctree:: :maxdepth: 1 - :not esp32p4: 技术参考手册 (PDF) <{IDF_TARGET_TRM_CN_URL}> + 技术参考手册 (PDF) <{IDF_TARGET_TRM_CN_URL}> :esp32: 技术规格书 (PDF) :esp32s2: 技术规格书 (PDF) :esp32s3: 技术规格书 (PDF) @@ -15,20 +15,24 @@ H/W 硬件参考 :esp32c3: 技术规格书 (PDF) :esp32c6: 技术规格书 (PDF) :esp32h2: 技术规格书 (PDF) - :esp32: 硬件设计指南 (PDF) - :esp32s2: 硬件设计指南 (PDF) - :esp32s3: 硬件设计指南 (PDF) - :esp32c2: 硬件设计指南 (PDF) - :esp32c3: 硬件设计指南 (PDF) - :esp32c6: 硬件设计指南 (PDF) - :esp32h2: 硬件设计指南 (PDF) - :esp32: 勘误表及解决方法 (PDF) - :esp32s2: 勘误表及解决方法 (PDF) - :esp32s3: 勘误表及解决方法 (PDF) - :esp32c3: 勘误表及解决方法 (PDF) - :esp32c2: 勘误表及解决方法 (PDF) - :esp32c6: 勘误表及解决方法 (PDF) - :esp32h2: 勘误表及解决方法 (PDF) + :esp32c5: 技术规格书 (PDF) + :esp32p4: 技术规格书 (PDF) + :esp32: 硬件设计指南 + :esp32s2: 硬件设计指南 + :esp32s3: 硬件设计指南 + :esp32c2: 硬件设计指南 + :esp32c3: 硬件设计指南 + :esp32c6: 硬件设计指南 + :esp32h2: 硬件设计指南 + :esp32p4: 硬件设计指南 + :esp32c5: 硬件设计指南 + :esp32: 芯片勘误表 + :esp32s2: 芯片勘误表 + :esp32s3: 芯片勘误表 + :esp32c3: 芯片勘误表 + :esp32c2: 芯片勘误表 + :esp32c6: 芯片勘误表 + :esp32h2: 芯片勘误表 芯片变型 :not esp32p4: 模组 开发板 From fb51a125afcdd731901bd356900f3528b0da3394 Mon Sep 17 00:00:00 2001 From: John Boiles Date: Wed, 28 May 2025 10:48:08 -0700 Subject: [PATCH 024/213] fix(freertos): Use ESP_EARLY_LOGE in vPortTLSPointersDelCb for RISCV Using ESP_LOG* in this function causes a crash --- components/freertos/FreeRTOS-Kernel-SMP/portable/riscv/port.c | 2 +- components/freertos/FreeRTOS-Kernel/portable/riscv/port.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/freertos/FreeRTOS-Kernel-SMP/portable/riscv/port.c b/components/freertos/FreeRTOS-Kernel-SMP/portable/riscv/port.c index 3bd684e44e5..650151edf5c 100644 --- a/components/freertos/FreeRTOS-Kernel-SMP/portable/riscv/port.c +++ b/components/freertos/FreeRTOS-Kernel-SMP/portable/riscv/port.c @@ -252,7 +252,7 @@ static void vPortTLSPointersDelCb( void *pxTCB ) if ( pvThreadLocalStoragePointersDelCallback[ x ] != NULL ) { //If del cb is set /* In case the TLSP deletion callback has been overwritten by a TLS pointer, gracefully abort. */ if ( !esp_ptr_executable( pvThreadLocalStoragePointersDelCallback[ x ] ) ) { - ESP_LOGE("FreeRTOS", "Fatal error: TLSP deletion callback at index %d overwritten with non-excutable pointer %p", x, pvThreadLocalStoragePointersDelCallback[ x ]); + ESP_EARLY_LOGE("FreeRTOS", "Fatal error: TLSP deletion callback at index %d overwritten with non-excutable pointer %p", x, pvThreadLocalStoragePointersDelCallback[ x ]); abort(); } diff --git a/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c b/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c index 799a8b03395..f5302a205f2 100644 --- a/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c +++ b/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c @@ -717,7 +717,7 @@ static void vPortTLSPointersDelCb( void *pxTCB ) if ( pvThreadLocalStoragePointersDelCallback[ x ] != NULL ) { //If del cb is set /* In case the TLSP deletion callback has been overwritten by a TLS pointer, gracefully abort. */ if ( !esp_ptr_executable( pvThreadLocalStoragePointersDelCallback[ x ] ) ) { - ESP_LOGE("FreeRTOS", "Fatal error: TLSP deletion callback at index %d overwritten with non-excutable pointer %p", x, pvThreadLocalStoragePointersDelCallback[ x ]); + ESP_EARLY_LOGE("FreeRTOS", "Fatal error: TLSP deletion callback at index %d overwritten with non-excutable pointer %p", x, pvThreadLocalStoragePointersDelCallback[ x ]); abort(); } From c5e02f95dd5ac0a94ea571c80aaea1a07218ca78 Mon Sep 17 00:00:00 2001 From: John Boiles Date: Tue, 20 May 2025 20:23:39 -0700 Subject: [PATCH 025/213] fix(memory-utils): Add _instruction_reserved_start/end to esp_psram_check_ptr_addr Adds missing range check that can be used when SPIRAM_XIP_FROM_PSRAM is enabled. --- components/esp_psram/esp_psram.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/components/esp_psram/esp_psram.c b/components/esp_psram/esp_psram.c index a5e650178e2..bde6d73b5f6 100644 --- a/components/esp_psram/esp_psram.c +++ b/components/esp_psram/esp_psram.c @@ -56,6 +56,7 @@ extern uint8_t _rodata_reserved_end; #endif /* CONFIG_SPIRAM_RODATA */ #if CONFIG_SPIRAM_FETCH_INSTRUCTIONS +extern uint8_t _instruction_reserved_start; extern uint8_t _instruction_reserved_end; #endif /* CONFIG_SPIRAM_FETCH_INSTRUCTIONS */ @@ -467,6 +468,12 @@ bool IRAM_ATTR esp_psram_check_ptr_addr(const void *p) } #endif /* CONFIG_SPIRAM_FETCH_INSTRUCTIONS && SOC_MMU_DI_VADDR_SHARED */ +#if CONFIG_SPIRAM_FETCH_INSTRUCTIONS + if ((intptr_t)p >= (uint32_t)&_instruction_reserved_start && (intptr_t)p < (uint32_t)&_instruction_reserved_end) { + return true; + } +#endif /* CONFIG_SPIRAM_FETCH_INSTRUCTIONS */ + return false; } From 70fe58d935ea4e4cd2048fe0945f09ac913989eb Mon Sep 17 00:00:00 2001 From: armando Date: Thu, 29 May 2025 10:29:30 +0800 Subject: [PATCH 026/213] fix(psram): fixed psram ptr check under xip_psram condition Closes https://github.com/espressif/esp-idf/pull/15999 Closes https://github.com/espressif/esp-idf/issues/15997 --- components/esp_psram/esp_psram.c | 17 +++----- .../include/esp_private/mmu_psram_flash.h | 12 +++--- components/esp_psram/mmu_psram_flash.c | 39 ++++++++++--------- components/esp_psram/mmu_psram_flash_v2.c | 10 +++-- .../test_apps/psram/main/test_psram.c | 14 ++++++- 5 files changed, 50 insertions(+), 42 deletions(-) diff --git a/components/esp_psram/esp_psram.c b/components/esp_psram/esp_psram.c index bde6d73b5f6..e9b2a55ad3d 100644 --- a/components/esp_psram/esp_psram.c +++ b/components/esp_psram/esp_psram.c @@ -56,7 +56,6 @@ extern uint8_t _rodata_reserved_end; #endif /* CONFIG_SPIRAM_RODATA */ #if CONFIG_SPIRAM_FETCH_INSTRUCTIONS -extern uint8_t _instruction_reserved_start; extern uint8_t _instruction_reserved_end; #endif /* CONFIG_SPIRAM_FETCH_INSTRUCTIONS */ @@ -456,23 +455,17 @@ bool IRAM_ATTR esp_psram_check_ptr_addr(const void *p) return true; } -#if CONFIG_SPIRAM_RODATA && !CONFIG_IDF_TARGET_ESP32S2 - if (mmu_psram_check_ptr_addr_in_rodata_alignment_gap(p)) { +#if CONFIG_SPIRAM_RODATA + if (mmu_psram_check_ptr_addr_in_xip_psram_rodata_region(p)) { return true; } -#endif /* CONFIG_SPIRAM_RODATA && !CONFIG_IDF_TARGET_ESP32S2 */ - -#if CONFIG_SPIRAM_FETCH_INSTRUCTIONS && SOC_MMU_DI_VADDR_SHARED - if (mmu_psram_check_ptr_addr_in_instruction_alignment_gap(p)) { - return true; - } -#endif /* CONFIG_SPIRAM_FETCH_INSTRUCTIONS && SOC_MMU_DI_VADDR_SHARED */ +#endif #if CONFIG_SPIRAM_FETCH_INSTRUCTIONS - if ((intptr_t)p >= (uint32_t)&_instruction_reserved_start && (intptr_t)p < (uint32_t)&_instruction_reserved_end) { + if (mmu_psram_check_ptr_addr_in_xip_psram_instruction_region(p)) { return true; } -#endif /* CONFIG_SPIRAM_FETCH_INSTRUCTIONS */ +#endif return false; } diff --git a/components/esp_psram/include/esp_private/mmu_psram_flash.h b/components/esp_psram/include/esp_private/mmu_psram_flash.h index a1fbcf0f4bd..37392c39d0f 100644 --- a/components/esp_psram/include/esp_private/mmu_psram_flash.h +++ b/components/esp_psram/include/esp_private/mmu_psram_flash.h @@ -56,13 +56,13 @@ size_t mmu_psram_get_text_segment_length(void); void mmu_psram_get_instruction_alignment_gap_info(uint32_t *gap_start, uint32_t *gap_size); /** - * @brief Check if the pointer is in the instruction alignment gap + * @brief Check if the pointer is in the xip psram instruction region * * @param[in] p Pointer to check * - * @return true if the pointer is in the instruction alignment gap, false otherwise + * @return true if the pointer is in the instruction region, false otherwise */ -bool mmu_psram_check_ptr_addr_in_instruction_alignment_gap(const void *p); +bool mmu_psram_check_ptr_addr_in_xip_psram_instruction_region(const void *p); /** * @brief Copy Flash texts to PSRAM @@ -101,13 +101,13 @@ size_t mmu_psram_get_rodata_segment_length(void); esp_err_t mmu_config_psram_rodata_segment(uint32_t start_page, uint32_t psram_size, uint32_t *out_page); /** - * @brief Check if the pointer is in the rodata alignment gap + * @brief Check if the pointer is in the xip psram rodata region * * @param[in] p Pointer to check * - * @return true if the pointer is in the rodata alignment gap, false otherwise + * @return true if the pointer is in the rodata region, false otherwise */ -bool mmu_psram_check_ptr_addr_in_rodata_alignment_gap(const void *p); +bool mmu_psram_check_ptr_addr_in_xip_psram_rodata_region(const void *p); #endif //#if CONFIG_SPIRAM_RODATA /*---------------------------------------------------------------------------- diff --git a/components/esp_psram/mmu_psram_flash.c b/components/esp_psram/mmu_psram_flash.c index c33c9f26e0e..9f415f706fb 100644 --- a/components/esp_psram/mmu_psram_flash.c +++ b/components/esp_psram/mmu_psram_flash.c @@ -33,6 +33,7 @@ #endif #define ALIGN_UP_BY(num, align) (((num) + ((align) - 1)) & ~((align) - 1)) +#define ALIGN_DOWN_BY(num, align) ((num) & (~((align) - 1))) /*---------------------------------------------------------------------------- Part 1 APIs (See @Backgrounds on top of this file) @@ -44,10 +45,22 @@ const static char *TAG = "mmu_psram"; //TODO IDF-4387 static uint32_t page0_mapped = 0; static uint32_t page0_page = INVALID_PHY_PAGE; + +/** + * If using `int`, then for CLANG, with enabled optimization when inlined function is provided with the address of external symbol, the two least bits of the constant used inside that function get cleared. + * Optimizer assumes that address of external symbol should be aligned to 4-bytes and therefore aligns constant value used for bitwise AND operation with that address. + * + * This means `extern int _instruction_reserved_start;` can be unaligned to 4 bytes, whereas using `char` can solve this issue. + * + * As we only use these symbol address, we declare them as `char` here + */ +extern char _instruction_reserved_start; +extern char _instruction_reserved_end; +extern char _rodata_reserved_start; +extern char _rodata_reserved_end; #endif //#if CONFIG_SPIRAM_FETCH_INSTRUCTIONS || CONFIG_SPIRAM_RODATA #if CONFIG_SPIRAM_FETCH_INSTRUCTIONS -extern char _instruction_reserved_end; #define INSTRUCTION_ALIGNMENT_GAP_START ALIGN_UP_BY((uint32_t)&_instruction_reserved_end, 4) #define INSTRUCTION_ALIGNMENT_GAP_END ALIGN_UP_BY((uint32_t)&_instruction_reserved_end, CONFIG_MMU_PAGE_SIZE) @@ -71,11 +84,12 @@ void mmu_psram_get_instruction_alignment_gap_info(uint32_t *gap_start, uint32_t *gap_end = INSTRUCTION_ALIGNMENT_GAP_END; } -bool IRAM_ATTR mmu_psram_check_ptr_addr_in_instruction_alignment_gap(const void *p) +bool mmu_psram_check_ptr_addr_in_xip_psram_instruction_region(const void *p) { - if ((intptr_t)p >= INSTRUCTION_ALIGNMENT_GAP_START && (intptr_t)p < INSTRUCTION_ALIGNMENT_GAP_END) { + if ((intptr_t)p >= ALIGN_DOWN_BY((uint32_t)&_instruction_reserved_start, CONFIG_MMU_PAGE_SIZE) && (intptr_t)p < ALIGN_UP_BY((uint32_t)&_instruction_reserved_end, CONFIG_MMU_PAGE_SIZE)) { return true; } + return false; } @@ -116,7 +130,6 @@ esp_err_t mmu_config_psram_text_segment(uint32_t start_page, uint32_t psram_size #endif //#if CONFIG_SPIRAM_FETCH_INSTRUCTIONS #if CONFIG_SPIRAM_RODATA -extern char _rodata_reserved_end; #define RODATA_ALIGNMENT_GAP_START ALIGN_UP_BY((uint32_t)&_rodata_reserved_end, 4) #define RODATA_ALIGNMENT_GAP_END ALIGN_UP_BY((uint32_t)&_rodata_reserved_end, CONFIG_MMU_PAGE_SIZE) @@ -142,11 +155,12 @@ void mmu_psram_get_rodata_alignment_gap_info(uint32_t *gap_start, uint32_t *gap_ *gap_end = RODATA_ALIGNMENT_GAP_END; } -bool IRAM_ATTR mmu_psram_check_ptr_addr_in_rodata_alignment_gap(const void *p) +bool mmu_psram_check_ptr_addr_in_xip_psram_rodata_region(const void *p) { - if ((intptr_t)p >= RODATA_ALIGNMENT_GAP_START && (intptr_t)p < RODATA_ALIGNMENT_GAP_END) { + if ((intptr_t)p >= ALIGN_DOWN_BY((uint32_t)&_rodata_reserved_start, CONFIG_MMU_PAGE_SIZE) && (intptr_t)p < ALIGN_UP_BY((uint32_t)&_rodata_reserved_end, CONFIG_MMU_PAGE_SIZE)) { return true; } + return false; } @@ -192,19 +206,6 @@ esp_err_t mmu_config_psram_rodata_segment(uint32_t start_page, uint32_t psram_si /*---------------------------------------------------------------------------- Part 2 APIs (See @Backgrounds on top of this file) -------------------------------------------------------------------------------*/ -/** - * If using `int`, then for CLANG, with enabled optimization when inlined function is provided with the address of external symbol, the two least bits of the constant used inside that function get cleared. - * Optimizer assumes that address of external symbol should be aligned to 4-bytes and therefore aligns constant value used for bitwise AND operation with that address. - * - * This means `extern int _instruction_reserved_start;` can be unaligned to 4 bytes, whereas using `char` can solve this issue. - * - * As we only use these symbol address, we declare them as `char` here - */ -extern char _instruction_reserved_start; -extern char _instruction_reserved_end; -extern char _rodata_reserved_start; -extern char _rodata_reserved_end; - //------------------------------------Copy Flash .text to PSRAM-------------------------------------// #if CONFIG_SPIRAM_FETCH_INSTRUCTIONS static uint32_t instruction_in_spiram; diff --git a/components/esp_psram/mmu_psram_flash_v2.c b/components/esp_psram/mmu_psram_flash_v2.c index 7611ac33af2..0f08c99d2f7 100644 --- a/components/esp_psram/mmu_psram_flash_v2.c +++ b/components/esp_psram/mmu_psram_flash_v2.c @@ -103,11 +103,12 @@ void mmu_psram_get_instruction_alignment_gap_info(uint32_t *gap_start, uint32_t *gap_end = INSTRUCTION_ALIGNMENT_GAP_END; } -bool IRAM_ATTR mmu_psram_check_ptr_addr_in_instruction_alignment_gap(const void *p) +bool mmu_psram_check_ptr_addr_in_xip_psram_instruction_region(const void *p) { - if ((intptr_t)p >= INSTRUCTION_ALIGNMENT_GAP_START && (intptr_t)p < INSTRUCTION_ALIGNMENT_GAP_END) { + if ((intptr_t)p >= ALIGN_DOWN_BY((uint32_t)&_instruction_reserved_start, CONFIG_MMU_PAGE_SIZE) && (intptr_t)p < ALIGN_UP_BY((uint32_t)&_instruction_reserved_end, CONFIG_MMU_PAGE_SIZE)) { return true; } + return false; } @@ -164,11 +165,12 @@ void mmu_psram_get_rodata_alignment_gap_info(uint32_t *gap_start, uint32_t *gap_ *gap_end = RODATA_ALIGNMENT_GAP_END; } -bool IRAM_ATTR mmu_psram_check_ptr_addr_in_rodata_alignment_gap(const void *p) +bool mmu_psram_check_ptr_addr_in_xip_psram_rodata_region(const void *p) { - if ((intptr_t)p >= RODATA_ALIGNMENT_GAP_START && (intptr_t)p < RODATA_ALIGNMENT_GAP_END) { + if ((intptr_t)p >= ALIGN_DOWN_BY((uint32_t)&_rodata_reserved_start, CONFIG_MMU_PAGE_SIZE) && (intptr_t)p < ALIGN_UP_BY((uint32_t)&_rodata_reserved_end, CONFIG_MMU_PAGE_SIZE)) { return true; } + return false; } diff --git a/components/esp_psram/test_apps/psram/main/test_psram.c b/components/esp_psram/test_apps/psram/main/test_psram.c index d93e3cf83cb..3ce5bc9c7de 100644 --- a/components/esp_psram/test_apps/psram/main/test_psram.c +++ b/components/esp_psram/test_apps/psram/main/test_psram.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2020-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -140,6 +140,18 @@ TEST_CASE("test spi1 flash operation after putting .text and .rodata into psram" TEST_ESP_OK(gptimer_disable(gptimer)); TEST_ESP_OK(gptimer_del_timer(gptimer)); } + +TEST_CASE("test esp_psram_check_ptr_addr with xip rodata and instruction region", "[psram]") +{ + bool on_psram = false; + + on_psram = esp_psram_check_ptr_addr(s_get_partition); + TEST_ASSERT(on_psram); + + on_psram = esp_psram_check_ptr_addr(s_test_buf); + TEST_ASSERT(on_psram); +} + #endif //CONFIG_SPIRAM_FETCH_INSTRUCTIONS && CONFIG_SPIRAM_RODATA TEST_CASE("test psram unaligned access", "[psram]") From a502f011873044b263ab009cb6b3ed77853c1f3d Mon Sep 17 00:00:00 2001 From: Zhao Wei Liang Date: Mon, 9 Jun 2025 11:04:23 +0800 Subject: [PATCH 027/213] change(ble): [AUTO_MR] Update lib_esp32h2 to 35fe65f4 (cherry picked from commit dbf7835a6b78ac39b180e0ff0719026fc9f9e3fa) Co-authored-by: zwl --- components/bt/controller/lib_esp32h2/esp32h2-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32h2/esp32h2-bt-lib b/components/bt/controller/lib_esp32h2/esp32h2-bt-lib index bd09406c74d..82cbc1dd934 160000 --- a/components/bt/controller/lib_esp32h2/esp32h2-bt-lib +++ b/components/bt/controller/lib_esp32h2/esp32h2-bt-lib @@ -1 +1 @@ -Subproject commit bd09406c74d135d1d4e68c5e578540a8bcffbcac +Subproject commit 82cbc1dd9345010e7e6d78f8a7b022a7ae669e87 From 67fb29942155be327cb8cad88659d36b28b2688c Mon Sep 17 00:00:00 2001 From: Zhao Wei Liang Date: Mon, 9 Jun 2025 11:04:25 +0800 Subject: [PATCH 028/213] change(ble): [AUTO_MR] Update lib_esp32c5 to 35fe65f4 (cherry picked from commit dacaae746ef12a518a3192c73a82a6cb9307621d) Co-authored-by: zwl --- components/bt/controller/lib_esp32c5/esp32c5-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c5/esp32c5-bt-lib b/components/bt/controller/lib_esp32c5/esp32c5-bt-lib index 19bce59850e..40a1921b1f2 160000 --- a/components/bt/controller/lib_esp32c5/esp32c5-bt-lib +++ b/components/bt/controller/lib_esp32c5/esp32c5-bt-lib @@ -1 +1 @@ -Subproject commit 19bce59850e593a1e0231a1f051e24a1532c38d6 +Subproject commit 40a1921b1f2993eb7558309e73fef837a8a28a15 From 373f68a86e874647f3c67a9e1948f5d767205610 Mon Sep 17 00:00:00 2001 From: Zhao Wei Liang Date: Mon, 9 Jun 2025 11:04:27 +0800 Subject: [PATCH 029/213] change(ble): [AUTO_MR] Update lib_esp32c6 to 35fe65f4 (cherry picked from commit 57c8d238001c471431bb1b054d71657e7e53f279) Co-authored-by: zwl --- components/bt/controller/lib_esp32c6/esp32c6-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c6/esp32c6-bt-lib b/components/bt/controller/lib_esp32c6/esp32c6-bt-lib index 841466ff3cf..250e75199e8 160000 --- a/components/bt/controller/lib_esp32c6/esp32c6-bt-lib +++ b/components/bt/controller/lib_esp32c6/esp32c6-bt-lib @@ -1 +1 @@ -Subproject commit 841466ff3cf6635bf061c18e836807ee7f99ce78 +Subproject commit 250e75199e8772a9ce44c53e7747063107d36155 From 35e7d1ad03144618b04ec626b9fcd1ec37b97bd6 Mon Sep 17 00:00:00 2001 From: Zhao Wei Liang Date: Mon, 9 Jun 2025 11:04:29 +0800 Subject: [PATCH 030/213] change(ble): [AUTO_MR] Update lib_esp32c2 to 7f72c031 (cherry picked from commit 4be18a2469488b26166400de0092a4c91a09b521) Co-authored-by: zwl --- components/bt/controller/lib_esp32c2/esp32c2-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c2/esp32c2-bt-lib b/components/bt/controller/lib_esp32c2/esp32c2-bt-lib index 06c5ef1481e..3ad00705899 160000 --- a/components/bt/controller/lib_esp32c2/esp32c2-bt-lib +++ b/components/bt/controller/lib_esp32c2/esp32c2-bt-lib @@ -1 +1 @@ -Subproject commit 06c5ef1481e6e5ff9308d6abe9c1e576d60c946f +Subproject commit 3ad007058995a523c2cd212bcef4c6937533871e From 33022b7bbc97e8daf56137e168de5deefcad6604 Mon Sep 17 00:00:00 2001 From: Zhao Wei Liang Date: Mon, 9 Jun 2025 11:04:32 +0800 Subject: [PATCH 031/213] fix(ble): fixed an occasional assertion issue during sync on ESP32-C6 (cherry picked from commit 3c8ba488e0b34586ccfa945ebb085b6e43e73fdb) Co-authored-by: zwl --- components/bt/controller/esp32c6/bt.c | 2 +- components/bt/controller/esp32h2/bt.c | 2 +- components/bt/include/esp32c6/include/esp_bt.h | 5 ++++- components/bt/include/esp32h2/include/esp_bt.h | 4 +++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/components/bt/controller/esp32c6/bt.c b/components/bt/controller/esp32c6/bt.c index 74e1d585555..dd57e8b3720 100644 --- a/components/bt/controller/esp32c6/bt.c +++ b/components/bt/controller/esp32c6/bt.c @@ -1744,7 +1744,7 @@ int ble_sm_alg_gen_key_pair(uint8_t *pub, uint8_t *priv) #endif // CONFIG_BT_LE_DEBUG_REMAIN_SCENE_ENABLED int IRAM_ATTR -ble_capture_info_user_handler(uint8_t type, uint32_t reason) +ble_capture_info_user_handler(uint8_t type, uint32_t reason, uint32_t param1, uint32_t param2) { int i; diff --git a/components/bt/controller/esp32h2/bt.c b/components/bt/controller/esp32h2/bt.c index 22b1aaa3ebf..2c564b911b2 100644 --- a/components/bt/controller/esp32h2/bt.c +++ b/components/bt/controller/esp32h2/bt.c @@ -1666,7 +1666,7 @@ int ble_sm_alg_gen_key_pair(uint8_t *pub, uint8_t *priv) #endif // CONFIG_BT_LE_DEBUG_REMAIN_SCENE_ENABLED int IRAM_ATTR -ble_capture_info_user_handler(uint8_t type, uint32_t reason) +ble_capture_info_user_handler(uint8_t type, uint32_t reason, uint32_t param1, uint32_t param2) { int i; diff --git a/components/bt/include/esp32c6/include/esp_bt.h b/components/bt/include/esp32c6/include/esp_bt.h index e91a7f1c2ec..c035b4a6cc9 100644 --- a/components/bt/include/esp32c6/include/esp_bt.h +++ b/components/bt/include/esp32c6/include/esp_bt.h @@ -156,7 +156,7 @@ esp_err_t esp_ble_tx_power_set_enhanced(esp_ble_enhanced_power_type_t power_type */ esp_power_level_t esp_ble_tx_power_get_enhanced(esp_ble_enhanced_power_type_t power_type, uint16_t handle); -#define CONFIG_VERSION 0x20250513 +#define CONFIG_VERSION 0x20250526 #define CONFIG_MAGIC 0x5A5AA5A5 /** @@ -231,6 +231,7 @@ typedef struct { uint8_t fast_conn_data_tx_en; /*!< The option for fast transmission of connection data - 0 - Disable - 1 - Enable (default) */ + int8_t ch39_txpwr; /*!< BLE transmit power (in dBm) used for BLE advertising on channel 39. */ uint32_t config_magic; /*!< Magic number for configuration validation */ } esp_bt_controller_config_t; @@ -292,6 +293,7 @@ typedef struct { .ble_adv_tx_options = 0, \ .skip_unnecessary_checks_en = 0, \ .fast_conn_data_tx_en = DEFAULT_BT_LE_CTRL_FAST_CONN_DATA_TX_EN, \ + .ch39_txpwr = BLE_LL_TX_PWR_DBM_N, \ .config_magic = CONFIG_MAGIC, \ } #elif CONFIG_IDF_TARGET_ESP32C61 @@ -350,6 +352,7 @@ typedef struct { .ble_adv_tx_options = 0, \ .skip_unnecessary_checks_en = 0, \ .fast_conn_data_tx_en = DEFAULT_BT_LE_CTRL_FAST_CONN_DATA_TX_EN, \ + .ch39_txpwr = BLE_LL_TX_PWR_DBM_N, \ .config_magic = CONFIG_MAGIC, \ } #endif diff --git a/components/bt/include/esp32h2/include/esp_bt.h b/components/bt/include/esp32h2/include/esp_bt.h index bf9370eba13..0aafa744bd7 100644 --- a/components/bt/include/esp32h2/include/esp_bt.h +++ b/components/bt/include/esp32h2/include/esp_bt.h @@ -161,7 +161,7 @@ esp_err_t esp_ble_tx_power_set_enhanced(esp_ble_enhanced_power_type_t power_type */ esp_power_level_t esp_ble_tx_power_get_enhanced(esp_ble_enhanced_power_type_t power_type, uint16_t handle); -#define CONFIG_VERSION 0x20250513 +#define CONFIG_VERSION 0x20250526 #define CONFIG_MAGIC 0x5A5AA5A5 /** @@ -233,6 +233,7 @@ typedef struct { uint8_t fast_conn_data_tx_en; /*!< The option for fast transmission of connection data - 0 - Disable - 1 - Enable (default) */ + int8_t ch39_txpwr; /*!< BLE transmit power (in dBm) used for BLE advertising on channel 39. */ uint32_t config_magic; /*!< Configuration magic value */ } esp_bt_controller_config_t; @@ -292,6 +293,7 @@ typedef struct { .ble_adv_tx_options = 0, \ .skip_unnecessary_checks_en = 0, \ .fast_conn_data_tx_en = DEFAULT_BT_LE_CTRL_FAST_CONN_DATA_TX_EN, \ + .ch39_txpwr = BLE_LL_TX_PWR_DBM_N, \ .config_magic = CONFIG_MAGIC, \ } From dbd4e8ffe79ec615675d67c815b137711f998d90 Mon Sep 17 00:00:00 2001 From: Zhao Wei Liang Date: Mon, 9 Jun 2025 11:04:34 +0800 Subject: [PATCH 032/213] fix(ble): fixed an occasional abnormal scanning stop issue on ESP32-C5 (cherry picked from commit 44d7fc43f67a6369687433ed8a994577918c5ad0) Co-authored-by: zwl --- components/bt/controller/esp32c5/bt.c | 2 +- components/bt/include/esp32c5/include/esp_bt.h | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/components/bt/controller/esp32c5/bt.c b/components/bt/controller/esp32c5/bt.c index 7d332a06fbd..e6070f520ca 100644 --- a/components/bt/controller/esp32c5/bt.c +++ b/components/bt/controller/esp32c5/bt.c @@ -1673,7 +1673,7 @@ int ble_sm_alg_gen_key_pair(uint8_t *pub, uint8_t *priv) #endif // CONFIG_BT_LE_DEBUG_REMAIN_SCENE_ENABLED int IRAM_ATTR -ble_capture_info_user_handler(uint8_t type, uint32_t reason) +ble_capture_info_user_handler(uint8_t type, uint32_t reason, uint32_t param1, uint32_t param2) { int i; diff --git a/components/bt/include/esp32c5/include/esp_bt.h b/components/bt/include/esp32c5/include/esp_bt.h index 35dd2c21a1a..91b1da306ad 100644 --- a/components/bt/include/esp32c5/include/esp_bt.h +++ b/components/bt/include/esp32c5/include/esp_bt.h @@ -159,7 +159,7 @@ esp_err_t esp_ble_tx_power_set_enhanced(esp_ble_enhanced_power_type_t power_type */ esp_power_level_t esp_ble_tx_power_get_enhanced(esp_ble_enhanced_power_type_t power_type, uint16_t handle); -#define CONFIG_VERSION 0x20250513 +#define CONFIG_VERSION 0x20250526 #define CONFIG_MAGIC 0x5A5AA5A5 /** @@ -231,6 +231,7 @@ typedef struct { uint8_t fast_conn_data_tx_en; /*!< The option for fast transmission of connection data - 0 - Disable - 1 - Enable (default) */ + int8_t ch39_txpwr; /*!< BLE transmit power (in dBm) used for BLE advertising on channel 39. */ uint32_t config_magic; /*!< Magic number for configuration validation */ } esp_bt_controller_config_t; @@ -289,6 +290,7 @@ typedef struct { .ble_adv_tx_options = 0, \ .skip_unnecessary_checks_en = 0, \ .fast_conn_data_tx_en = DEFAULT_BT_LE_CTRL_FAST_CONN_DATA_TX_EN, \ + .ch39_txpwr = BLE_LL_TX_PWR_DBM_N, \ .config_magic = CONFIG_MAGIC, \ } From 557ad56c6be0d973314d14db03d45ce57fee571a Mon Sep 17 00:00:00 2001 From: Zhao Wei Liang Date: Mon, 9 Jun 2025 11:04:36 +0800 Subject: [PATCH 033/213] fix(ble): change ld file on ESP32-C2 (cherry picked from commit 6c5bff1bd88f9e411e81b0f61ea15ded0cf9657e) Co-authored-by: zwl --- components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld | 6 +++--- components/esp_rom/esp32c2/ld/esp32c2.rom.ble.ld | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld b/components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld index 00800134b26..233a6337bfd 100644 --- a/components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld +++ b/components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld @@ -159,7 +159,7 @@ r_ble_ll_adv_sm_deinit = 0x40000cc4; r_ble_ll_adv_sm_event_init = 0x40000cc8; //r_ble_ll_adv_sm_find_configured = 0x40000ccc; r_ble_ll_adv_sm_get = 0x40000cd0; -r_ble_ll_adv_sm_init = 0x40000cd4; +//r_ble_ll_adv_sm_init = 0x40000cd4; r_ble_ll_adv_sm_reset = 0x40000cd8; r_ble_ll_adv_sm_start = 0x40000cdc; r_ble_ll_adv_sm_start_periodic = 0x40000ce0; @@ -245,11 +245,11 @@ r_ble_ll_conn_set_csa = 0x40000e20; r_ble_ll_conn_set_ext_con_params = 0x40000e24; r_ble_ll_conn_set_global_chanmap = 0x40000e28; r_ble_ll_conn_set_phy = 0x40000e2c; -r_ble_ll_conn_set_txpwr_by_handle = 0x40000e30; +//r_ble_ll_conn_set_txpwr_by_handle = 0x40000e30; r_ble_ll_conn_set_unknown_rx_octets = 0x40000e34; //r_ble_ll_conn_slave_start = 0x40000e38; r_ble_ll_conn_sm_get = 0x40000e3c; -r_ble_ll_conn_sm_new = 0x40000e40; +//r_ble_ll_conn_sm_new = 0x40000e40; r_ble_ll_conn_sm_npl_deinit = 0x40000e44; r_ble_ll_conn_sm_npl_init = 0x40000e48; r_ble_ll_conn_tx_pkt_in = 0x40000e4c; diff --git a/components/esp_rom/esp32c2/ld/esp32c2.rom.ble.ld b/components/esp_rom/esp32c2/ld/esp32c2.rom.ble.ld index b940fe9d111..4f89f0b6384 100644 --- a/components/esp_rom/esp32c2/ld/esp32c2.rom.ble.ld +++ b/components/esp_rom/esp32c2/ld/esp32c2.rom.ble.ld @@ -196,7 +196,7 @@ r_ble_ll_conn_set_csa = 0x40000e20; r_ble_ll_conn_set_ext_con_params = 0x40000e24; r_ble_ll_conn_set_global_chanmap = 0x40000e28; r_ble_ll_conn_set_phy = 0x40000e2c; -r_ble_ll_conn_set_txpwr_by_handle = 0x40000e30; +//r_ble_ll_conn_set_txpwr_by_handle = 0x40000e30; r_ble_ll_conn_set_unknown_rx_octets = 0x40000e34; r_ble_ll_conn_sm_get = 0x40000e3c; r_ble_ll_conn_tx_pkt_in = 0x40000e4c; From 6723eae6ecc7810ae7ecba4f6e14cfab1b7baaac Mon Sep 17 00:00:00 2001 From: Zhao Wei Liang Date: Mon, 9 Jun 2025 11:04:38 +0800 Subject: [PATCH 034/213] fix(ble): change the default ble cca thresh on ESP32-C5 (cherry picked from commit c8021765355e6fb37ae0e51580b265078a789021) Co-authored-by: cjin --- components/bt/controller/esp32c5/Kconfig.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/esp32c5/Kconfig.in b/components/bt/controller/esp32c5/Kconfig.in index 989bb52df91..2e6db9fdf6f 100644 --- a/components/bt/controller/esp32c5/Kconfig.in +++ b/components/bt/controller/esp32c5/Kconfig.in @@ -681,7 +681,7 @@ config BT_LE_CCA_RSSI_THRESH int "CCA RSSI threshold value" depends on BT_LE_TX_CCA_ENABLED range 20 100 - default 20 + default 65 help Power threshold of CCA in unit of -1 dBm. From ecfafb77f5ec78400c80cb9328e4a999d0dcf1dc Mon Sep 17 00:00:00 2001 From: Zhao Wei Liang Date: Mon, 9 Jun 2025 11:04:41 +0800 Subject: [PATCH 035/213] fix(ble): change the default ble cca thresh on ESP32-C6 (cherry picked from commit 581521526b648ab720cb723378891a17910049c6) Co-authored-by: cjin --- components/bt/controller/esp32c6/Kconfig.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/esp32c6/Kconfig.in b/components/bt/controller/esp32c6/Kconfig.in index 4501db3cb8f..949349aaaf7 100644 --- a/components/bt/controller/esp32c6/Kconfig.in +++ b/components/bt/controller/esp32c6/Kconfig.in @@ -721,7 +721,7 @@ config BT_LE_CCA_RSSI_THRESH int "CCA RSSI threshold value" depends on BT_LE_TX_CCA_ENABLED range 20 100 - default 20 + default 65 help Power threshold of CCA in unit of -1 dBm. From b575652e62fcfc30457614bc49568247ab208df5 Mon Sep 17 00:00:00 2001 From: Zhao Wei Liang Date: Mon, 9 Jun 2025 11:04:44 +0800 Subject: [PATCH 036/213] fix(ble): change the default ble cca thresh on ESP32-H2 (cherry picked from commit a2fab0ad60f581a5e4a64fdff4232bf5c77e1de1) Co-authored-by: cjin --- components/bt/controller/esp32h2/Kconfig.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/esp32h2/Kconfig.in b/components/bt/controller/esp32h2/Kconfig.in index e7d935cd978..14330540e05 100644 --- a/components/bt/controller/esp32h2/Kconfig.in +++ b/components/bt/controller/esp32h2/Kconfig.in @@ -716,7 +716,7 @@ config BT_LE_CCA_RSSI_THRESH int "CCA RSSI threshold value" depends on BT_LE_TX_CCA_ENABLED range 20 100 - default 20 + default 65 help Power threshold of CCA in unit of -1 dBm. From 112644547d6413b8e41083017a94026058560ba8 Mon Sep 17 00:00:00 2001 From: Zhao Wei Liang Date: Mon, 9 Jun 2025 11:04:47 +0800 Subject: [PATCH 037/213] fix(ble): change the default ble cca thresh on ESP32-C2 (cherry picked from commit a10696d7e19b267fdc78f7bf31ae7772a522928c) Co-authored-by: cjin --- components/bt/controller/esp32c2/Kconfig.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/esp32c2/Kconfig.in b/components/bt/controller/esp32c2/Kconfig.in index 69623987e08..1076cf24ba6 100644 --- a/components/bt/controller/esp32c2/Kconfig.in +++ b/components/bt/controller/esp32c2/Kconfig.in @@ -584,7 +584,7 @@ config BT_LE_CCA_RSSI_THRESH int "CCA RSSI threshold value" depends on BT_LE_TX_CCA_ENABLED range 20 100 - default 20 + default 65 help Power threshold of CCA in unit of -1 dBm. From 45dcdc470991157f8a8d6e79797a6b33fa247d74 Mon Sep 17 00:00:00 2001 From: Zhang Hai Peng Date: Mon, 9 Jun 2025 15:13:44 +0800 Subject: [PATCH 038/213] fix(bt): Update bt lib for ESP32-C3 and ESP32-S3(4713a69) - Fixed double free exception during BLE init under low memory (cherry picked from commit 49a4325b158d0c818e033c56086e526937c317eb) Co-authored-by: zhanghaipeng --- components/bt/controller/lib_esp32c3_family | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c3_family b/components/bt/controller/lib_esp32c3_family index 72599d583c2..3ff529142f6 160000 --- a/components/bt/controller/lib_esp32c3_family +++ b/components/bt/controller/lib_esp32c3_family @@ -1 +1 @@ -Subproject commit 72599d583c232ea78d6461b5b502426c6e5a1ec9 +Subproject commit 3ff529142f6e2707d57b10eb87ac8d86e9098b88 From caeb78c90e39f43bfa8267ea3f279df757cb0d40 Mon Sep 17 00:00:00 2001 From: Chen Jian Hua Date: Tue, 10 Jun 2025 21:33:32 +0800 Subject: [PATCH 039/213] fix(ble/bluedroid): Fixed extended adv restart failure during reconnection (cherry picked from commit 63921808132204bb5d40644c6d19d70afd1cd8e8) Co-authored-by: chenjianhua --- .../bt/host/bluedroid/stack/btm/btm_ble_5_gap.c | 3 ++- components/bt/host/bluedroid/stack/l2cap/l2c_link.c | 12 ++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/components/bt/host/bluedroid/stack/btm/btm_ble_5_gap.c b/components/bt/host/bluedroid/stack/btm/btm_ble_5_gap.c index 47941808b68..76fe63c08a9 100644 --- a/components/bt/host/bluedroid/stack/btm/btm_ble_5_gap.c +++ b/components/bt/host/bluedroid/stack/btm/btm_ble_5_gap.c @@ -613,6 +613,7 @@ tBTM_STATUS BTM_BleStartExtAdvRestart(uint8_t con_handle) } if((index >= MAX_BLE_ADV_INSTANCE) || (!adv_record[index].invalid)) { + BTM_TRACE_WARNING("%s failed to find extend adv, adv_handle %u con_handle %u", __func__, index, con_handle); return BTM_WRONG_MODE; } @@ -1254,7 +1255,7 @@ void btm_ble_adv_set_terminated_evt(tBTM_BLE_ADV_TERMINAT *params) } // adv terminated due to connection, save the adv handle and connection handle - if(params->completed_event == 0x00) { + if(params->status == 0x00) { adv_record[params->adv_handle].ter_con_handle = params->conn_handle; } else { adv_record[params->adv_handle].ter_con_handle = INVALID_VALUE; diff --git a/components/bt/host/bluedroid/stack/l2cap/l2c_link.c b/components/bt/host/bluedroid/stack/l2cap/l2c_link.c index 64304152c16..b756f6684e4 100644 --- a/components/bt/host/bluedroid/stack/l2cap/l2c_link.c +++ b/components/bt/host/bluedroid/stack/l2cap/l2c_link.c @@ -480,6 +480,8 @@ BOOLEAN l2c_link_hci_disc_comp (UINT16 handle, UINT8 reason) if (l2cu_create_conn(p_lcb, BT_TRANSPORT_LE)) { btm_acl_removed (p_lcb->remote_bd_addr, BT_TRANSPORT_LE); lcb_is_free = FALSE; /* still using this lcb */ + } else { + L2CAP_TRACE_ERROR("master retry connect failed"); } } #endif // (GATTC_CONNECT_RETRY_EN == TRUE) @@ -489,7 +491,10 @@ BOOLEAN l2c_link_hci_disc_comp (UINT16 handle, UINT8 reason) if(btm_ble_inter_get() && p_lcb->link_role == HCI_ROLE_SLAVE) { p_lcb->retry_create_con ++; L2CAP_TRACE_DEBUG("slave restart extend adv, retry count %d reason 0x%x\n", p_lcb->retry_create_con, reason); - BTM_BleStartExtAdvRestart(handle); + tBTM_STATUS start_adv_status = BTM_BleStartExtAdvRestart(handle); + if (start_adv_status != BTM_SUCCESS) { + L2CAP_TRACE_ERROR("slave restart extend adv failed (err 0x%x)", start_adv_status); + } } #endif // #if (BLE_50_EXTEND_ADV_EN == TRUE) #endif // #if (BLE_50_FEATURE_SUPPORT == TRUE) @@ -499,7 +504,10 @@ BOOLEAN l2c_link_hci_disc_comp (UINT16 handle, UINT8 reason) if(!btm_ble_inter_get() && p_lcb->link_role == HCI_ROLE_SLAVE) { p_lcb->retry_create_con ++; L2CAP_TRACE_DEBUG("slave resatrt adv, retry count %d reason 0x%x\n", p_lcb->retry_create_con, reason); - btm_ble_start_adv(); + tBTM_STATUS start_adv_status = btm_ble_start_adv(); + if (start_adv_status != BTM_SUCCESS) { + L2CAP_TRACE_ERROR("slave resatrt adv failed (err 0x%x)", start_adv_status); + } } #endif // #if (BLE_42_ADV_EN == TRUE) #endif // #if (BLE_42_FEATURE_SUPPORT == TRUE) From fac072401ac0aac6691eb50d3373fc79a45c1ffd Mon Sep 17 00:00:00 2001 From: chenjianhua Date: Thu, 20 Feb 2025 19:19:25 +0800 Subject: [PATCH 040/213] fix(bt/bluedroid): Fixed BLE connection active count getting --- .../bt/host/bluedroid/btc/core/btc_main.c | 26 +++++++++---------- .../bt/host/bluedroid/stack/btm/btm_main.c | 7 ++--- .../bt/host/bluedroid/stack/gatt/gatt_main.c | 3 ++- .../bluedroid/stack/l2cap/include/l2c_int.h | 14 +++++----- .../bt/host/bluedroid/stack/l2cap/l2c_ble.c | 2 +- .../bt/host/bluedroid/stack/l2cap/l2c_utils.c | 14 +++++----- 6 files changed, 34 insertions(+), 32 deletions(-) diff --git a/components/bt/host/bluedroid/btc/core/btc_main.c b/components/bt/host/bluedroid/btc/core/btc_main.c index cb92ff9beaf..0c39c6ecffe 100644 --- a/components/bt/host/bluedroid/btc/core/btc_main.c +++ b/components/bt/host/bluedroid/btc/core/btc_main.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -146,6 +146,18 @@ uint32_t btc_get_ble_status(void) status |= BIT(BTC_BLE_STATUS_CONN); } + // Number of active ACL connection + extern uint8_t btm_ble_acl_active_count(void); + if (btm_ble_acl_active_count()) { + status |= BIT(BTC_BLE_STATUS_CONN); + } + + // Number of active L2C plcb + extern uint8_t l2cu_ble_plcb_active_count(void); + if (l2cu_ble_plcb_active_count()) { + status |= BIT(BTC_BLE_STATUS_CONN); + } + // Address resolve status extern uint8_t btm_get_ble_addr_resolve_disable_status(void); if (btm_get_ble_addr_resolve_disable_status()) { @@ -182,18 +194,6 @@ uint32_t btc_get_ble_status(void) } #endif - // Number of active ACL connection - extern uint8_t btm_acl_active_count(void); - if (btm_acl_active_count()) { - status |= BIT(BTC_BLE_STATUS_CONN); - } - - // Number of active L2C plcb - extern uint8_t l2cu_plcb_active_count(void); - if (l2cu_plcb_active_count()) { - status |= BIT(BTC_BLE_STATUS_CONN); - } - #if (GATTC_INCLUDED == TRUE) // Number of registered GATTC APP extern uint8_t bta_gattc_cl_rcb_active_count(void); diff --git a/components/bt/host/bluedroid/stack/btm/btm_main.c b/components/bt/host/bluedroid/stack/btm/btm_main.c index e5f8940a4b2..67882af0efc 100644 --- a/components/bt/host/bluedroid/stack/btm/btm_main.c +++ b/components/bt/host/bluedroid/stack/btm/btm_main.c @@ -126,7 +126,8 @@ void btm_free(void) #endif } -uint8_t btm_acl_active_count(void) +#if (BLE_INCLUDED == TRUE) +uint8_t btm_ble_acl_active_count(void) { list_node_t *p_node = NULL; tACL_CONN *p_acl_conn = NULL; @@ -134,14 +135,14 @@ uint8_t btm_acl_active_count(void) for (p_node = list_begin(btm_cb.p_acl_db_list); p_node; p_node = list_next(p_node)) { p_acl_conn = list_node(p_node); - if (p_acl_conn && p_acl_conn->in_use) { + if (p_acl_conn && p_acl_conn->in_use && p_acl_conn->transport == BT_TRANSPORT_LE) { count++; } } return count; } -#if (BLE_INCLUDED == TRUE) + // Address resolution status uint8_t btm_get_ble_addr_resolve_disable_status(void) { diff --git a/components/bt/host/bluedroid/stack/gatt/gatt_main.c b/components/bt/host/bluedroid/stack/gatt/gatt_main.c index 600cbe45332..53d9be747de 100644 --- a/components/bt/host/bluedroid/stack/gatt/gatt_main.c +++ b/components/bt/host/bluedroid/stack/gatt/gatt_main.c @@ -1244,7 +1244,8 @@ uint8_t gatt_tcb_active_count(void) for(p_node = list_begin(gatt_cb.p_tcb_list); p_node; p_node = list_next(p_node)) { p_tcb = list_node(p_node); - if (p_tcb && p_tcb->in_use && (p_tcb->ch_state != GATT_CH_CLOSE)) { + if (p_tcb && p_tcb->in_use && (p_tcb->transport == BT_TRANSPORT_LE) && + (p_tcb->ch_state != GATT_CH_CLOSE)) { count++; } } diff --git a/components/bt/host/bluedroid/stack/l2cap/include/l2c_int.h b/components/bt/host/bluedroid/stack/l2cap/include/l2c_int.h index 045fb10daa7..88eac86b2f1 100644 --- a/components/bt/host/bluedroid/stack/l2cap/include/l2c_int.h +++ b/components/bt/host/bluedroid/stack/l2cap/include/l2c_int.h @@ -65,7 +65,7 @@ #define L2CAP_WAIT_UNPARK_TOUT 2 /* 2 seconds */ #define L2CAP_LINK_INFO_RESP_TOUT 2 /* 2 seconds */ #define L2CAP_UPDATE_CONN_PARAM_TOUT 6 /* 6 seconds */ -#define L2CAP_BLE_LINK_CONNECT_TOUT BLE_ESTABLISH_LINK_CONNECTION_TIMEOUT // configed in menuconfig +#define L2CAP_BLE_LINK_CONNECT_TOUT BLE_ESTABLISH_LINK_CONNECTION_TIMEOUT // configured in menuconfig #define L2CAP_BLE_CONN_PARAM_UPD_TOUT 30 /* 30 seconds */ /* quick timer uses millisecond unit */ @@ -80,10 +80,10 @@ ** the Bluetooth specification. */ typedef enum { - CST_CLOSED, /* Channel is in clodes state */ + CST_CLOSED, /* Channel is in closed state */ CST_ORIG_W4_SEC_COMP, /* Originator waits security clearence */ CST_TERM_W4_SEC_COMP, /* Acceptor waits security clearence */ - CST_W4_L2CAP_CONNECT_RSP, /* Waiting for peer conenct response */ + CST_W4_L2CAP_CONNECT_RSP, /* Waiting for peer connect response */ CST_W4_L2CA_CONNECT_RSP, /* Waiting for upper layer connect rsp */ CST_CONFIG, /* Negotiating configuration */ CST_OPEN, /* Data transfer state */ @@ -208,8 +208,8 @@ typedef struct { UINT32 controller_idle; /* # of times less than 2 packets in controller */ /* when the xmit window was closed */ UINT32 pkts_retransmitted; /* # of packets that were retransmitted */ - UINT32 retrans_touts; /* # of retransmission timouts */ - UINT32 xmit_ack_touts; /* # of xmit ack timouts */ + UINT32 retrans_touts; /* # of retransmission timeouts */ + UINT32 xmit_ack_touts; /* # of xmit ack timeouts */ #define L2CAP_ERTM_STATS_NUM_AVG 10 #define L2CAP_ERTM_STATS_AVG_NUM_SAMPLES 100 @@ -386,7 +386,7 @@ typedef struct t_l2c_linkcb { tL2C_CCB *p_pending_ccb; /* ccb of waiting channel during link disconnect */ TIMER_LIST_ENT info_timer_entry; /* Timer entry for info resp timeout evt */ - TIMER_LIST_ENT upda_con_timer; /* Timer entry for update connection parametr */ + TIMER_LIST_ENT upda_con_timer; /* Timer entry for update connection parameter */ BD_ADDR remote_bd_addr; /* The BD address of the remote */ UINT8 link_role; /* Master or slave */ @@ -599,7 +599,7 @@ extern BOOLEAN l2cu_start_post_bond_timer (UINT16 handle); extern void l2cu_release_lcb (tL2C_LCB *p_lcb); extern tL2C_LCB *l2cu_find_lcb_by_bd_addr (BD_ADDR p_bd_addr, tBT_TRANSPORT transport); extern tL2C_LCB *l2cu_find_lcb_by_handle (UINT16 handle); -extern uint8_t l2cu_plcb_active_count(void); +extern uint8_t l2cu_ble_plcb_active_count(void); extern void l2cu_update_lcb_4_bonding (BD_ADDR p_bd_addr, BOOLEAN is_bonding); extern UINT8 l2cu_get_conn_role (tL2C_LCB *p_this_lcb); diff --git a/components/bt/host/bluedroid/stack/l2cap/l2c_ble.c b/components/bt/host/bluedroid/stack/l2cap/l2c_ble.c index 5f9bd751666..3ce25ab977b 100644 --- a/components/bt/host/bluedroid/stack/l2cap/l2c_ble.c +++ b/components/bt/host/bluedroid/stack/l2cap/l2c_ble.c @@ -242,7 +242,7 @@ BOOLEAN L2CA_EnableUpdateBleConnParams (BD_ADDR rem_bda, BOOLEAN enable) return (FALSE); } bool is_disable = (p_lcb->conn_update_mask & L2C_BLE_CONN_UPDATE_DISABLE); - if(l2cu_plcb_active_count() >1 && !(enable && is_disable)) { + if(l2cu_ble_plcb_active_count() >1 && !(enable && is_disable)) { return FALSE; } diff --git a/components/bt/host/bluedroid/stack/l2cap/l2c_utils.c b/components/bt/host/bluedroid/stack/l2cap/l2c_utils.c index 992d4b68ebb..e4bf8a081db 100644 --- a/components/bt/host/bluedroid/stack/l2cap/l2c_utils.c +++ b/components/bt/host/bluedroid/stack/l2cap/l2c_utils.c @@ -336,14 +336,14 @@ tL2C_LCB *l2cu_find_free_lcb (void) return (NULL); } -uint8_t l2cu_plcb_active_count(void) +uint8_t l2cu_ble_plcb_active_count(void) { list_node_t *p_node = NULL; tL2C_LCB *p_lcb = NULL; uint8_t active_count = 0; for (p_node = list_begin(l2cb.p_lcb_pool); p_node; p_node = list_next(p_node)) { p_lcb = list_node(p_node); - if (p_lcb && p_lcb->in_use) { + if (p_lcb && p_lcb->in_use && p_lcb->transport == BT_TRANSPORT_LE) { active_count ++; } } @@ -615,7 +615,7 @@ void l2cu_send_peer_connect_rsp (tL2C_CCB *p_ccb, UINT16 result, UINT16 status) ** ** Description Build and send an L2CAP "connection response neg" message ** to the peer. This function is called when there is no peer -** CCB (non-existant PSM or no resources). +** CCB (non-existent PSM or no resources). ** ** Returns void ** @@ -1737,7 +1737,7 @@ void l2cu_release_ccb (tL2C_CCB *p_ccb) ) { l2cu_dequeue_ccb (p_ccb); - /* Delink the CCB from the LCB */ + /* Unlink the CCB from the LCB */ p_ccb->p_lcb = NULL; } @@ -1960,7 +1960,7 @@ tL2C_RCB *l2cu_find_ble_rcb_by_psm (UINT16 psm) ** ** Returns UINT8 - L2CAP_PEER_CFG_OK if passed to upper layer, ** L2CAP_PEER_CFG_UNACCEPTABLE if automatically responded to -** because parameters are unnacceptable from a specification +** because parameters are unacceptable from a specification ** point of view. ** L2CAP_PEER_CFG_DISCONNECT if no compatible channel modes ** between the two devices, and shall be closed. @@ -2558,7 +2558,7 @@ BOOLEAN l2cu_set_acl_priority (BD_ADDR bd_addr, UINT8 priority, BOOLEAN reset_af ** ** Function l2cu_set_non_flushable_pbf ** -** Description set L2CAP_PKT_START_NON_FLUSHABLE if controller supoorts +** Description set L2CAP_PKT_START_NON_FLUSHABLE if controller supports ** ** Returns void ** @@ -3328,7 +3328,7 @@ static tL2C_CCB *l2cu_get_next_channel_in_rr(tL2C_LCB *p_lcb) for ( i = 0; (i < L2CAP_NUM_CHNL_PRIORITY) && (!p_serve_ccb); i++ ) { /* scan all channel within serving priority group until finding a channel to serve */ for ( j = 0; (j < p_lcb->rr_serv[p_lcb->rr_pri].num_ccb) && (!p_serve_ccb); j++) { - /* scaning from next serving channel */ + /* scanning from next serving channel */ p_ccb = p_lcb->rr_serv[p_lcb->rr_pri].p_serve_ccb; if (!p_ccb) { From c334e006614094b3277ccb6cf256a48b1ad1fafb Mon Sep 17 00:00:00 2001 From: chenjianhua Date: Thu, 6 Mar 2025 14:28:51 +0800 Subject: [PATCH 041/213] feat(ble/bluedroid): Support BLE vendor event reporting with params --- .../bt/host/bluedroid/api/esp_gap_ble_api.c | 2 +- .../api/include/api/esp_gap_ble_api.h | 63 ++++++++++++++++--- .../btc/profile/std/gap/btc_gap_ble.c | 39 ++++++++++-- .../btc/profile/std/include/btc_gap_ble.h | 4 ++ .../bt/host/bluedroid/stack/btm/btm_ble_gap.c | 2 +- .../bluedroid/stack/include/stack/hcidefs.h | 6 +- 6 files changed, 99 insertions(+), 17 deletions(-) diff --git a/components/bt/host/bluedroid/api/esp_gap_ble_api.c b/components/bt/host/bluedroid/api/esp_gap_ble_api.c index 453b5ea7ca9..f11e8e37cf3 100644 --- a/components/bt/host/bluedroid/api/esp_gap_ble_api.c +++ b/components/bt/host/bluedroid/api/esp_gap_ble_api.c @@ -1741,7 +1741,7 @@ esp_err_t esp_ble_gap_vendor_command_send(esp_ble_vendor_cmd_params_t *vendor_cm == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); } -esp_err_t esp_ble_gap_set_vendor_event_mask(uint32_t event_mask) +esp_err_t esp_ble_gap_set_vendor_event_mask(esp_ble_vendor_evt_mask_t event_mask) { btc_msg_t msg = {0}; btc_ble_gap_args_t arg; diff --git a/components/bt/host/bluedroid/api/include/api/esp_gap_ble_api.h b/components/bt/host/bluedroid/api/include/api/esp_gap_ble_api.h index 1c2240ff4c9..16a5d5b7392 100644 --- a/components/bt/host/bluedroid/api/include/api/esp_gap_ble_api.h +++ b/components/bt/host/bluedroid/api/include/api/esp_gap_ble_api.h @@ -1102,11 +1102,58 @@ typedef struct { } esp_ble_gap_past_params_t; #endif // #if (BLE_FEAT_PERIODIC_ADV_SYNC_TRANSFER == TRUE) -typedef enum{ +typedef enum { ESP_BLE_NETWORK_PRIVACY_MODE = 0X00, /*!< Network Privacy Mode for peer device (default) */ ESP_BLE_DEVICE_PRIVACY_MODE = 0X01, /*!< Device Privacy Mode for peer device */ } esp_ble_privacy_mode_t; +#define ESP_BLE_VENDOR_SCAN_REQ_RECV_EVT_MASK BIT(0) /*!< Vendor BLE legacy SCAN_REQ received event mask */ +#define ESP_BLE_VENDOR_CHMAP_UPDATE_EVT_MASK BIT(1) /*!< Vendor BLE channel map update event mask */ +#define ESP_BLE_VENDOR_SLEEP_WAKEUP_EVT_MASK BIT(3) /*!< Vendor BLE sleep wakeup event mask */ +#define ESP_BLE_VENDOR_CONN_REQ_RECV_EVT_MASK BIT(4) /*!< Vendor BLE CONNECT_IND and AUX_CONNECT_REQ received event mask */ +#define ESP_BLE_VENDOR_CONN_RSP_RECV_EVT_MASK BIT(5) /*!< Vendor BLE AUX_CONNECT_RSP received event mask */ +typedef uint32_t esp_ble_vendor_evt_mask_t; + +#define ESP_BLE_VENDOR_PDU_RECV_EVT (0) /*!< Vendor BLE specify PDU received event */ +#define ESP_BLE_VENDOR_CHAN_MAP_UPDATE_EVT (1) /*!< Vendor BLE channel map update complete event */ +#define ESP_BLE_VENDOR_SLEEP_WAKEUP_EVT (2) /*!< Vendor BLE sleep wakeup event */ +typedef uint8_t esp_ble_vendor_evt_t; + +typedef enum { + ESP_BLE_VENDOR_PDU_SCAN_REQ = 0, /*!< SCAN_REQ PDU type */ + ESP_BLE_VENDOR_PDU_CONN_REQ, /*!< CONNECT_IND and AUX_CONNECT_REQ PDU type */ + ESP_BLE_VENDOR_PDU_CONN_RSP, /*!< AUX_CONNECT_RSP PDU type */ +} esp_ble_vendor_pdu_t; + +/** + * @brief BLE vendor event parameters union + */ +typedef union { + /** + * @brief ESP_BLE_VENDOR_PDU_RECV_EVT + */ + struct ble_pdu_recv_evt_param { + esp_ble_vendor_pdu_t type; /*!< The type of LE PDU */ + uint8_t handle; /*!< The handle of advertising set */ + esp_ble_addr_type_t addr_type; /*!< The address type of peer device */ + esp_bd_addr_t peer_addr; /*!< The address of peer device */ + } pdu_recv; /*!< Event parameter of ESP_BLE_VENDOR_PDU_RECV_EVT */ + /** + * @brief ESP_BLE_VENDOR_CHAN_MAP_UPDATE_EVT + */ + struct ble_chan_map_update_evt_param { + uint8_t status; /*!< Indicate the channel map update status (HCI error code) */ + uint16_t conn_handle; /*!< The connection handle */ + esp_gap_ble_channels ch_map; /*!< The channel map after updated */ + } chan_map_update; /*!< Event parameter of ESP_BLE_VENDOR_CHAN_MAP_UPDATE_EVT */ + /** + * @brief ESP_BLE_VENDOR_SLEEP_WAKEUP_EVT + */ + struct ble_sleep_wakeup_evt_param { + // No parameters + } sleep_wakeup; /*!< Event parameter of ESP_BLE_VENDOR_SLEEP_WAKEUP_EVT */ +} esp_ble_vendor_evt_param_t; + /** * @brief path loss report parameters */ @@ -1695,10 +1742,11 @@ typedef union { * @brief ESP_GAP_BLE_VENDOR_HCI_EVT */ struct ble_vendor_hci_event_evt_param { - uint8_t subevt_code; /*!< Subevent code for vendor HCI event, the range is 0xC0 to 0xFF */ - uint8_t param_len; /*!< The length of the event parameter buffer */ - uint8_t *param_buf; /*!< The pointer of the event parameter buffer */ - } vendor_hci_evt; /*!< Event parameter buffer of ESP_GAP_BLE_VENDOR_HCI_EVT */ + esp_ble_vendor_evt_t subevt_code; /*!< Subevent code for BLE vendor HCI event */ + esp_ble_vendor_evt_param_t param; /*!< Event parameter of BLE vendor HCI subevent */ + uint8_t param_len; /*!< The length of the event parameter buffer (for internal use only) */ + uint8_t *param_buf; /*!< The pointer of the event parameter buffer (for internal use only) */ + } vendor_hci_evt; /*!< Event parameter of ESP_GAP_BLE_VENDOR_HCI_EVT */ #if (BLE_FEAT_POWER_CONTROL_EN == TRUE) /** * @brief ESP_GAP_BLE_ENH_READ_TRANS_PWR_LEVEL_EVT @@ -3032,14 +3080,13 @@ esp_err_t esp_ble_gap_set_csa_support(uint8_t csa_select); /** * @brief This function is used to control which vendor events are generated by the HCI for the Host. * - * @param[in] event_mask: Bit0: Legacy scan request received event - * Bit1: Vendor channel map update complete event + * @param[in] event_mask: The BLE vendor HCI event mask * * @return * - ESP_OK : success * - other : failed */ -esp_err_t esp_ble_gap_set_vendor_event_mask(uint32_t event_mask); +esp_err_t esp_ble_gap_set_vendor_event_mask(esp_ble_vendor_evt_mask_t event_mask); /** * @brief This function is used to read the current and maximum transmit power levels of the local Controller. diff --git a/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c b/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c index 2a0f737b20f..63fb30ef017 100644 --- a/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c +++ b/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c @@ -1490,7 +1490,7 @@ static void btc_ble_set_vendor_evt_mask_callback(UINT8 status) msg.pid = BTC_PID_GAP_BLE; msg.act = ESP_GAP_BLE_SET_VENDOR_EVT_MASK_COMPLETE_EVT; - param.set_csa_support_cmpl.status = btc_btm_status_to_esp_status(status); + param.set_vendor_evt_mask_cmpl.status = btc_btm_status_to_esp_status(status); ret = btc_transfer_context(&msg, ¶m, sizeof(esp_ble_gap_cb_param_t), NULL, NULL); @@ -1504,15 +1504,46 @@ static void btc_ble_vendor_hci_event_callback(UINT8 subevt_code, UINT8 param_len esp_ble_gap_cb_param_t param = {0}; bt_status_t ret; btc_msg_t msg = {0}; + esp_ble_vendor_evt_param_t *evt_param = ¶m.vendor_hci_evt.param; + bool copy_param = false; msg.sig = BTC_SIG_API_CB; msg.pid = BTC_PID_GAP_BLE; msg.act = ESP_GAP_BLE_VENDOR_HCI_EVT; param.vendor_hci_evt.subevt_code = subevt_code; - param.vendor_hci_evt.param_len = param_len; - param.vendor_hci_evt.param_buf = params; - ret = btc_transfer_context(&msg, ¶m, sizeof(esp_ble_gap_cb_param_t), btc_gap_ble_cb_deep_copy, btc_gap_ble_cb_deep_free); + param.vendor_hci_evt.param_len = 0; + param.vendor_hci_evt.param_buf = NULL; + switch (subevt_code) { + case BLE_VENDOR_PDU_RECV_EVT: + param.vendor_hci_evt.subevt_code = ESP_BLE_VENDOR_PDU_RECV_EVT; + STREAM_TO_UINT8(evt_param->pdu_recv.type, params); + STREAM_TO_UINT8(evt_param->pdu_recv.handle, params); + STREAM_TO_UINT8(evt_param->pdu_recv.addr_type, params); + STREAM_TO_BDADDR(evt_param->pdu_recv.peer_addr, params); + break; + case BLE_VENDOR_CHMAP_UPDATE_EVT: + param.vendor_hci_evt.subevt_code = ESP_BLE_VENDOR_CHAN_MAP_UPDATE_EVT; + STREAM_TO_UINT8(evt_param->chan_map_update.status, params); + STREAM_TO_UINT16(evt_param->chan_map_update.conn_handle, params); + REVERSE_STREAM_TO_ARRAY(evt_param->chan_map_update.ch_map, params, ESP_GAP_BLE_CHANNELS_LEN); + break; + case BLE_VENDOR_SLEEP_WAKEUP_EVT: + param.vendor_hci_evt.subevt_code = ESP_BLE_VENDOR_SLEEP_WAKEUP_EVT; + // No parameters + break; + default: + copy_param = true; + break; + } + + if (copy_param) { + param.vendor_hci_evt.param_len = param_len; + param.vendor_hci_evt.param_buf = (param_len) ? params : NULL; + ret = btc_transfer_context(&msg, ¶m, sizeof(esp_ble_gap_cb_param_t), btc_gap_ble_cb_deep_copy, btc_gap_ble_cb_deep_free); + } else { + ret = btc_transfer_context(&msg, ¶m, sizeof(esp_ble_gap_cb_param_t), NULL, NULL); + } if (ret != BT_STATUS_SUCCESS) { BTC_TRACE_ERROR("%s btc_transfer_context failed\n", __func__); diff --git a/components/bt/host/bluedroid/btc/profile/std/include/btc_gap_ble.h b/components/bt/host/bluedroid/btc/profile/std/include/btc_gap_ble.h index 43d44343acb..83c8f5986ec 100644 --- a/components/bt/host/bluedroid/btc/profile/std/include/btc_gap_ble.h +++ b/components/bt/host/bluedroid/btc/profile/std/include/btc_gap_ble.h @@ -24,6 +24,10 @@ extern tBTA_BLE_ADV_DATA *gl_bta_scan_rsp_data_ptr; #define BLE_ISVALID_PARAM(x, min, max) (((x) >= (min) && (x) <= (max))) +#define BLE_VENDOR_PDU_RECV_EVT (0xC0) +#define BLE_VENDOR_CHMAP_UPDATE_EVT (0xC1) +#define BLE_VENDOR_SLEEP_WAKEUP_EVT (0xC3) + typedef enum { #if (BLE_42_FEATURE_SUPPORT == TRUE) BTC_GAP_BLE_ACT_CFG_ADV_DATA = 0, diff --git a/components/bt/host/bluedroid/stack/btm/btm_ble_gap.c b/components/bt/host/bluedroid/stack/btm/btm_ble_gap.c index 11c226a143b..297d1fbbeea 100644 --- a/components/bt/host/bluedroid/stack/btm/btm_ble_gap.c +++ b/components/bt/host/bluedroid/stack/btm/btm_ble_gap.c @@ -4559,7 +4559,7 @@ static void btm_ble_vs_evt_callback(UINT8 len, UINT8 *p) STREAM_TO_UINT8(sub_event, p); len--; - if (sub_event < HCI_VSE_LE_LEGACY_SCAN_REQ_RECEIVED_EVT) { + if (sub_event < HCI_VSE_LE_SUBEVT_BASE) { return; } diff --git a/components/bt/host/bluedroid/stack/include/stack/hcidefs.h b/components/bt/host/bluedroid/stack/include/stack/hcidefs.h index 05292af8227..23f9b3e6b8d 100644 --- a/components/bt/host/bluedroid/stack/include/stack/hcidefs.h +++ b/components/bt/host/bluedroid/stack/include/stack/hcidefs.h @@ -927,9 +927,9 @@ #define HCI_VENDOR_CH_CLASSIFICATION_EVT_SUBCODE 0x06 #define HCI_VENDOR_CH_CLASSIFICATION_REPORTING_MODE_EVT_SUBCODE 0x07 -#define HCI_VSE_LE_LEGACY_SCAN_REQ_RECEIVED_EVT 0xC0 -#define HCI_VSE_LE_CHAN_MAP_UPDATE_CMPL_EVT 0xC1 -#define HCI_VSE_LE_EVT_MAX 0xFF +#define HCI_VENDOR_SPECIFIC_EVT 0xFF /* Vendor specific events */ +#define HCI_VSE_LE_SUBEVT_BASE 0xC0 /* BLE vendor event code base */ +#define HCI_VSE_LE_EVT_MAX 0xFF /* BLE vendor event code max */ #define HCI_NAP_TRACE_EVT 0xFF /* was define 0xFE, 0xFD, change to 0xFF because conflict w/ TCI_EVT and per specification compliant */ From 40b5315ca4f42096c20d4f2cf5b84fa822eb7bc3 Mon Sep 17 00:00:00 2001 From: chenjianhua Date: Mon, 9 Jun 2025 19:24:08 +0800 Subject: [PATCH 042/213] feat(ble/bluedroid): Add config for BLE vendor hci command and event --- components/bt/host/bluedroid/Kconfig.in | 7 ++ .../bt/host/bluedroid/api/esp_gap_ble_api.c | 62 ++++++----- .../api/include/api/esp_gap_ble_api.h | 26 +++-- .../bt/host/bluedroid/bta/dm/bta_dm_act.c | 44 ++++---- .../bt/host/bluedroid/bta/dm/bta_dm_api.c | 102 ++++++++--------- .../bt/host/bluedroid/bta/dm/bta_dm_main.c | 10 +- .../bluedroid/bta/dm/include/bta_dm_int.h | 10 +- .../btc/profile/std/gap/btc_gap_ble.c | 105 +++++++++--------- .../btc/profile/std/include/btc_gap_ble.h | 10 +- .../include/common/bluedroid_user_config.h | 6 + .../common/include/common/bt_target.h | 6 + .../bt/host/bluedroid/stack/btm/btm_ble_gap.c | 56 ++++++---- .../bt/host/bluedroid/stack/hcic/hciblecmds.c | 44 ++++---- 13 files changed, 266 insertions(+), 222 deletions(-) diff --git a/components/bt/host/bluedroid/Kconfig.in b/components/bt/host/bluedroid/Kconfig.in index 63c94c75dbc..1d65ea051c2 100644 --- a/components/bt/host/bluedroid/Kconfig.in +++ b/components/bt/host/bluedroid/Kconfig.in @@ -1452,6 +1452,13 @@ config BT_BLE_FEAT_CONN_SUBRATING help Enable BLE connection subrating feature +config BT_BLE_VENDOR_HCI_EN + bool "Enable BLE Vendor HCI command and event" + depends on BT_BLE_ENABLED + default y + help + This enables BLE vendor HCI command and event + config BT_BLE_HIGH_DUTY_ADV_INTERVAL bool "Enable BLE high duty advertising interval feature" depends on BT_BLE_ENABLED diff --git a/components/bt/host/bluedroid/api/esp_gap_ble_api.c b/components/bt/host/bluedroid/api/esp_gap_ble_api.c index f11e8e37cf3..a4262fd0178 100644 --- a/components/bt/host/bluedroid/api/esp_gap_ble_api.c +++ b/components/bt/host/bluedroid/api/esp_gap_ble_api.c @@ -131,19 +131,6 @@ esp_err_t esp_ble_gap_stop_advertising(void) return (btc_transfer_context(&msg, NULL, 0, NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); } - -esp_err_t esp_ble_gap_clear_advertising(void) -{ - btc_msg_t msg; - - ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED); - - msg.sig = BTC_SIG_API_CALL; - msg.pid = BTC_PID_GAP_BLE; - msg.act = BTC_GAP_BLE_ACT_CLEAR_ADV; - - return (btc_transfer_context(&msg, NULL, 0, NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); -} #endif // #if (BLE_42_ADV_EN == TRUE) #endif // #if (BLE_42_FEATURE_SUPPORT == TRUE) @@ -1013,23 +1000,6 @@ esp_err_t esp_ble_gap_set_privacy_mode(esp_ble_addr_type_t addr_type, esp_bd_add == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); } -esp_err_t esp_ble_gap_set_csa_support(uint8_t csa_select) -{ - btc_msg_t msg; - btc_ble_gap_args_t arg; - - ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED); - - msg.sig = BTC_SIG_API_CALL; - msg.pid = BTC_PID_GAP_BLE; - msg.act = BTC_GAP_BLE_SET_CSA_SUPPORT; - - arg.set_csa_support.csa_select = csa_select; - - return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL) - == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); -} - #if (BLE_50_FEATURE_SUPPORT == TRUE) esp_err_t esp_ble_gap_read_phy(esp_bd_addr_t bd_addr) @@ -1713,6 +1683,7 @@ esp_err_t esp_ble_gap_set_periodic_adv_sync_trans_params(esp_bd_addr_t addr, con } #endif //#if (BLE_FEAT_PERIODIC_ADV_SYNC_TRANSFER == TRUE) +#if (BLE_VENDOR_HCI_EN == TRUE) esp_err_t esp_ble_gap_vendor_command_send(esp_ble_vendor_cmd_params_t *vendor_cmd_param) { btc_msg_t msg = {0}; @@ -1759,6 +1730,37 @@ esp_err_t esp_ble_gap_set_vendor_event_mask(esp_ble_vendor_evt_mask_t event_mask == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); } +esp_err_t esp_ble_gap_clear_advertising(void) +{ + btc_msg_t msg; + + ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED); + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GAP_BLE; + msg.act = BTC_GAP_BLE_ACT_CLEAR_ADV; + + return (btc_transfer_context(&msg, NULL, 0, NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +esp_err_t esp_ble_gap_set_csa_support(uint8_t csa_select) +{ + btc_msg_t msg; + btc_ble_gap_args_t arg; + + ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED); + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GAP_BLE; + msg.act = BTC_GAP_BLE_SET_CSA_SUPPORT; + + arg.set_csa_support.csa_select = csa_select; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL) + == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} +#endif // (BLE_VENDOR_HCI_EN == TRUE) + #if (BLE_FEAT_POWER_CONTROL_EN == TRUE) esp_err_t esp_ble_gap_enhanced_read_transmit_power_level(uint16_t conn_handle, esp_ble_tx_power_phy_t phy) { diff --git a/components/bt/host/bluedroid/api/include/api/esp_gap_ble_api.h b/components/bt/host/bluedroid/api/include/api/esp_gap_ble_api.h index 16a5d5b7392..99de67d375b 100644 --- a/components/bt/host/bluedroid/api/include/api/esp_gap_ble_api.h +++ b/components/bt/host/bluedroid/api/include/api/esp_gap_ble_api.h @@ -1305,12 +1305,6 @@ typedef union { struct ble_adv_stop_cmpl_evt_param { esp_bt_status_t status; /*!< Indicate adv stop operation success status */ } adv_stop_cmpl; /*!< Event parameter of ESP_GAP_BLE_ADV_STOP_COMPLETE_EVT */ - /** - * @brief ESP_GAP_BLE_ADV_CLEAR_COMPLETE_EVT - */ - struct ble_adv_clear_cmpl_evt_param { - esp_bt_status_t status; /*!< Indicate adv clear operation success status */ - } adv_clear_cmpl; /*!< Event parameter of ESP_GAP_BLE_ADV_CLEAR_COMPLETE_EVT */ #endif // #if (BLE_42_FEATURE_SUPPORT == TRUE) /** * @brief ESP_GAP_BLE_SET_STATIC_RAND_ADDR_EVT @@ -1712,6 +1706,19 @@ typedef union { esp_ble_dtm_update_evt_t update_evt; /*!< DTM state change event, 0x00: DTM TX start, 0x01: DTM RX start, 0x02:DTM end */ uint16_t num_of_pkt; /*!< number of packets received, only valid if update_evt is DTM_TEST_STOP_EVT and shall be reported as 0 for a transmitter */ } dtm_state_update; /*!< Event parameter of ESP_GAP_BLE_DTM_TEST_UPDATE_EVT */ + /** + * @brief ESP_GAP_BLE_SET_PRIVACY_MODE_COMPLETE_EVT + */ + struct ble_set_privacy_mode_cmpl_evt_param { + esp_bt_status_t status; /*!< Indicate privacy mode set operation success status */ + } set_privacy_mode_cmpl; /*!< Event parameter of ESP_GAP_BLE_SET_PRIVACY_MODE_COMPLETE_EVT */ +#if (BLE_VENDOR_HCI_EN == TRUE) + /** + * @brief ESP_GAP_BLE_ADV_CLEAR_COMPLETE_EVT + */ + struct ble_adv_clear_cmpl_evt_param { + esp_bt_status_t status; /*!< Indicate adv clear operation success status */ + } adv_clear_cmpl; /*!< Event parameter of ESP_GAP_BLE_ADV_CLEAR_COMPLETE_EVT */ /** * @brief ESP_GAP_BLE_VENDOR_CMD_COMPLETE_EVT */ @@ -1720,12 +1727,6 @@ typedef union { uint16_t param_len; /*!< The length of parameter buffer */ uint8_t *p_param_buf; /*!< The point of parameter buffer */ } vendor_cmd_cmpl; /*!< Event parameter of ESP_GAP_BLE_VENDOR_CMD_COMPLETE_EVT */ - /** - * @brief ESP_GAP_BLE_SET_PRIVACY_MODE_COMPLETE_EVT - */ - struct ble_set_privacy_mode_cmpl_evt_param { - esp_bt_status_t status; /*!< Indicate privacy mode set operation success status */ - } set_privacy_mode_cmpl; /*!< Event parameter of ESP_GAP_BLE_SET_PRIVACY_MODE_COMPLETE_EVT */ /** * @brief ESP_GAP_BLE_SET_CSA_SUPPORT_COMPLETE_EVT */ @@ -1747,6 +1748,7 @@ typedef union { uint8_t param_len; /*!< The length of the event parameter buffer (for internal use only) */ uint8_t *param_buf; /*!< The pointer of the event parameter buffer (for internal use only) */ } vendor_hci_evt; /*!< Event parameter of ESP_GAP_BLE_VENDOR_HCI_EVT */ +#endif // #if (BLE_VENDOR_HCI_EN == TRUE) #if (BLE_FEAT_POWER_CONTROL_EN == TRUE) /** * @brief ESP_GAP_BLE_ENH_READ_TRANS_PWR_LEVEL_EVT diff --git a/components/bt/host/bluedroid/bta/dm/bta_dm_act.c b/components/bt/host/bluedroid/bta/dm/bta_dm_act.c index 2439ad5a69a..3ec7ae2aff5 100644 --- a/components/bt/host/bluedroid/bta/dm/bta_dm_act.c +++ b/components/bt/host/bluedroid/bta/dm/bta_dm_act.c @@ -733,6 +733,7 @@ void bta_dm_cfg_coex_status (tBTA_DM_MSG *p_data) } #endif +#if (BLE_VENDOR_HCI_EN == TRUE) void bta_dm_send_vendor_hci(tBTA_DM_MSG *p_data) { BTM_VendorSpecificCommand(p_data->vendor_hci_cmd.opcode, @@ -741,6 +742,28 @@ void bta_dm_send_vendor_hci(tBTA_DM_MSG *p_data) p_data->vendor_hci_cmd.vendor_hci_cb); } +void bta_dm_ble_gap_clear_adv(tBTA_DM_MSG *p_data) +{ + if (BTM_BleClearAdv(p_data->ble_clear_adv.p_clear_adv_cback) == FALSE) { + if (p_data->ble_clear_adv.p_clear_adv_cback) { + (*p_data->ble_clear_adv.p_clear_adv_cback)(BTA_FAILURE); + } + } +} + +void bta_dm_ble_gap_set_csa_support(tBTA_DM_MSG *p_data) +{ + APPL_TRACE_API("%s, csa_select = %d", __func__, p_data->ble_set_csa_support.csa_select); + BTM_BleSetCsaSupport(p_data->ble_set_csa_support.csa_select, p_data->ble_set_csa_support.p_cback); +} + +void bta_dm_ble_gap_set_vendor_evt_mask(tBTA_DM_MSG *p_data) +{ + APPL_TRACE_API("%s, evt_mask = %d", __func__, p_data->ble_set_vendor_evt_mask.evt_mask); + BTM_BleSetVendorEventMask(p_data->ble_set_vendor_evt_mask.evt_mask, p_data->ble_set_vendor_evt_mask.p_cback); +} +#endif // #if (BLE_VENDOR_HCI_EN == TRUE) + /******************************************************************************* ** ** Function bta_dm_set_afh_channels @@ -5822,15 +5845,6 @@ void bta_dm_ble_gap_dtm_stop(tBTA_DM_MSG *p_data) } #endif // #if ((BLE_42_DTM_TEST_EN == TRUE) || (BLE_50_DTM_TEST_EN == TRUE)) -void bta_dm_ble_gap_clear_adv(tBTA_DM_MSG *p_data) -{ - if (BTM_BleClearAdv(p_data->ble_clear_adv.p_clear_adv_cback) == FALSE) { - if (p_data->ble_clear_adv.p_clear_adv_cback) { - (*p_data->ble_clear_adv.p_clear_adv_cback)(BTA_FAILURE); - } - } -} - void bta_dm_ble_gap_set_rpa_timeout(tBTA_DM_MSG *p_data) { APPL_TRACE_API("%s, rpa_timeout = %d", __func__, p_data->set_rpa_timeout.rpa_timeout); @@ -5853,18 +5867,6 @@ void bta_dm_ble_gap_set_privacy_mode(tBTA_DM_MSG *p_data) p_data->ble_set_privacy_mode.privacy_mode, p_data->ble_set_privacy_mode.p_cback); } -void bta_dm_ble_gap_set_csa_support(tBTA_DM_MSG *p_data) -{ - APPL_TRACE_API("%s, csa_select = %d", __func__, p_data->ble_set_csa_support.csa_select); - BTM_BleSetCsaSupport(p_data->ble_set_csa_support.csa_select, p_data->ble_set_csa_support.p_cback); -} - -void bta_dm_ble_gap_set_vendor_evt_mask(tBTA_DM_MSG *p_data) -{ - APPL_TRACE_API("%s, evt_mask = %d", __func__, p_data->ble_set_vendor_evt_mask.evt_mask); - BTM_BleSetVendorEventMask(p_data->ble_set_vendor_evt_mask.evt_mask, p_data->ble_set_vendor_evt_mask.p_cback); -} - void bta_dm_read_ble_channel_map(tBTA_DM_MSG *p_data) { if (p_data && p_data->ch_map.read_ch_map_cb) { diff --git a/components/bt/host/bluedroid/bta/dm/bta_dm_api.c b/components/bt/host/bluedroid/bta/dm/bta_dm_api.c index 7b8a0d9a164..08510894e63 100644 --- a/components/bt/host/bluedroid/bta/dm/bta_dm_api.c +++ b/components/bt/host/bluedroid/bta/dm/bta_dm_api.c @@ -231,6 +231,7 @@ void BTA_DmCfgCoexStatus(UINT8 op, UINT8 type, UINT8 status) } #endif +#if (BLE_VENDOR_HCI_EN == TRUE) void BTA_DmsendVendorHciCmd(UINT16 opcode, UINT8 param_len, UINT8 *p_param_buf, tBTA_SEND_VENDOR_HCI_CMPL_CBACK p_vendor_cmd_complete_cback) { tBTA_DM_API_SEND_VENDOR_HCI_CMD *p_msg; @@ -246,6 +247,57 @@ void BTA_DmsendVendorHciCmd(UINT16 opcode, UINT8 param_len, UINT8 *p_param_buf, } } +/******************************************************************************* +** +** Function BTA_DmBleClearAdv +** +** Description This function is called to clear Advertising +** +** Parameters p_adv_data_cback : clear adv complete callback. +** +** Returns None +** +*******************************************************************************/ +void BTA_DmBleClearAdv (tBTA_CLEAR_ADV_CMPL_CBACK *p_clear_adv_cback) +{ + tBTA_DM_API_CLEAR_ADV *p_msg; + + if ((p_msg = (tBTA_DM_API_CLEAR_ADV *) + osi_malloc(sizeof(tBTA_DM_API_CLEAR_ADV))) != NULL) { + p_msg->hdr.event = BTA_DM_API_BLE_CLEAR_ADV_EVT; + p_msg->p_clear_adv_cback = p_clear_adv_cback; + + bta_sys_sendmsg(p_msg); + } +} + +void BTA_DmBleGapSetCsaSupport(uint8_t csa_select, tBTA_SET_CSA_SUPPORT_CMPL_CBACK *p_callback) +{ + tBTA_DM_API_BLE_SET_CSA_SUPPORT *p_msg; + + if ((p_msg = (tBTA_DM_API_BLE_SET_CSA_SUPPORT *)osi_malloc(sizeof(tBTA_DM_API_BLE_SET_CSA_SUPPORT))) + != NULL) { + p_msg->hdr.event = BTA_DM_API_BLE_SET_CSA_SUPPORT_EVT; + p_msg->csa_select = csa_select; + p_msg->p_cback = p_callback; + bta_sys_sendmsg(p_msg); + } +} + +void BTA_DmBleGapSetVendorEventMask(uint32_t evt_mask, tBTA_SET_VENDOR_EVT_MASK_CBACK *p_callback) +{ + tBTA_DM_API_BLE_SET_VENDOR_EVT_MASK *p_msg; + + if ((p_msg = (tBTA_DM_API_BLE_SET_VENDOR_EVT_MASK *)osi_malloc(sizeof(tBTA_DM_API_BLE_SET_VENDOR_EVT_MASK))) + != NULL) { + p_msg->hdr.event = BTA_DM_API_BLE_SET_VENDOR_EVT_MASK_EVT; + p_msg->evt_mask = evt_mask; + p_msg->p_cback = p_callback; + bta_sys_sendmsg(p_msg); + } +} +#endif // #if (BLE_VENDOR_HCI_EN == TRUE) + #if (CLASSIC_BT_INCLUDED == TRUE) void BTA_DmConfigEir(tBTA_DM_EIR_CONF *eir_config) @@ -1896,30 +1948,6 @@ extern void BTA_DmBleBroadcast (BOOLEAN start, tBTA_START_STOP_ADV_CMPL_CBACK *p bta_sys_sendmsg(p_msg); } } - -/******************************************************************************* -** -** Function BTA_DmBleClearAdv -** -** Description This function is called to clear Advertising -** -** Parameters p_adv_data_cback : clear adv complete callback. -** -** Returns None -** -*******************************************************************************/ -void BTA_DmBleClearAdv (tBTA_CLEAR_ADV_CMPL_CBACK *p_clear_adv_cback) -{ - tBTA_DM_API_CLEAR_ADV *p_msg; - - if ((p_msg = (tBTA_DM_API_CLEAR_ADV *) - osi_malloc(sizeof(tBTA_DM_API_CLEAR_ADV))) != NULL) { - p_msg->hdr.event = BTA_DM_API_BLE_CLEAR_ADV_EVT; - p_msg->p_clear_adv_cback = p_clear_adv_cback; - - bta_sys_sendmsg(p_msg); - } -} #endif // #if (BLE_42_ADV_EN == TRUE) #endif @@ -3014,32 +3042,6 @@ void BTA_DmClearRandAddress(void) } } -void BTA_DmBleGapSetCsaSupport(uint8_t csa_select, tBTA_SET_CSA_SUPPORT_CMPL_CBACK *p_callback) -{ - tBTA_DM_API_BLE_SET_CSA_SUPPORT *p_msg; - - if ((p_msg = (tBTA_DM_API_BLE_SET_CSA_SUPPORT *)osi_malloc(sizeof(tBTA_DM_API_BLE_SET_CSA_SUPPORT))) - != NULL) { - p_msg->hdr.event = BTA_DM_API_BLE_SET_CSA_SUPPORT_EVT; - p_msg->csa_select = csa_select; - p_msg->p_cback = p_callback; - bta_sys_sendmsg(p_msg); - } -} - -void BTA_DmBleGapSetVendorEventMask(uint32_t evt_mask, tBTA_SET_VENDOR_EVT_MASK_CBACK *p_callback) -{ - tBTA_DM_API_BLE_SET_VENDOR_EVT_MASK *p_msg; - - if ((p_msg = (tBTA_DM_API_BLE_SET_VENDOR_EVT_MASK *)osi_malloc(sizeof(tBTA_DM_API_BLE_SET_VENDOR_EVT_MASK))) - != NULL) { - p_msg->hdr.event = BTA_DM_API_BLE_SET_VENDOR_EVT_MASK_EVT; - p_msg->evt_mask = evt_mask; - p_msg->p_cback = p_callback; - bta_sys_sendmsg(p_msg); - } -} - #if (BLE_FEAT_POWER_CONTROL_EN == TRUE) void BTA_DmBleGapEnhReadTransPwrLevel(uint16_t conn_handle, uint8_t phy) { diff --git a/components/bt/host/bluedroid/bta/dm/bta_dm_main.c b/components/bt/host/bluedroid/bta/dm/bta_dm_main.c index 3aaf6b49ea4..9fe5e7696e6 100644 --- a/components/bt/host/bluedroid/bta/dm/bta_dm_main.c +++ b/components/bt/host/bluedroid/bta/dm/bta_dm_main.c @@ -67,7 +67,12 @@ const tBTA_DM_ACTION bta_dm_action[BTA_DM_MAX_EVT] = { #if (ESP_COEX_VSC_INCLUDED == TRUE) bta_dm_cfg_coex_status, /* BTA_DM_API_CFG_COEX_ST_EVT */ #endif +#if (BLE_VENDOR_HCI_EN == TRUE) bta_dm_send_vendor_hci, /* BTA_DM_API_SEND_VENDOR_HCI_CMD_EVT */ + bta_dm_ble_gap_clear_adv, /* BTA_DM_API_BLE_CLEAR_ADV_EVT */ + bta_dm_ble_gap_set_csa_support, /* BTA_DM_API_BLE_SET_CSA_SUPPORT_EVT */ + bta_dm_ble_gap_set_vendor_evt_mask, /* BTA_DM_API_BLE_SET_VENDOR_EVT_MASK_EVT */ +#endif // #if (BLE_VENDOR_HCI_EN == TRUE) #if (CLASSIC_BT_INCLUDED == TRUE) bta_dm_config_eir, /* BTA_DM_API_CONFIG_EIR_EVT */ bta_dm_set_page_timeout, /* BTA_DM_API_PAGE_TO_SET_EVT */ @@ -278,14 +283,9 @@ const tBTA_DM_ACTION bta_dm_action[BTA_DM_MAX_EVT] = { #if ((BLE_42_DTM_TEST_EN == TRUE) || (BLE_50_DTM_TEST_EN == TRUE)) bta_dm_ble_gap_dtm_stop, /* BTA_DM_API_DTM_STOP_EVT */ #endif // #if ((BLE_42_DTM_TEST_EN == TRUE) || (BLE_50_DTM_TEST_EN == TRUE)) -#if (BLE_42_ADV_EN == TRUE) - bta_dm_ble_gap_clear_adv, /* BTA_DM_API_BLE_CLEAR_ADV_EVT */ -#endif // #if (BLE_42_ADV_EN == TRUE) bta_dm_ble_gap_set_rpa_timeout, /* BTA_DM_API_SET_RPA_TIMEOUT_EVT */ bta_dm_ble_gap_add_dev_to_resolving_list, /* BTA_DM_API_ADD_DEV_TO_RESOLVING_LIST_EVT */ bta_dm_ble_gap_set_privacy_mode, /* BTA_DM_API_SET_PRIVACY_MODE_EVT */ - bta_dm_ble_gap_set_csa_support, /* BTA_DM_API_BLE_SET_CSA_SUPPORT_EVT */ - bta_dm_ble_gap_set_vendor_evt_mask, /* BTA_DM_API_BLE_SET_VENDOR_EVT_MASK_EVT */ bta_dm_read_ble_channel_map, /* BTA_DM_API_BLE_READ_CH_MAP_EVT */ #endif #if (BLE_FEAT_ISO_EN == TRUE) diff --git a/components/bt/host/bluedroid/bta/dm/include/bta_dm_int.h b/components/bt/host/bluedroid/bta/dm/include/bta_dm_int.h index 4de7e01f150..e724b37c3a9 100644 --- a/components/bt/host/bluedroid/bta/dm/include/bta_dm_int.h +++ b/components/bt/host/bluedroid/bta/dm/include/bta_dm_int.h @@ -57,7 +57,12 @@ enum { #if (ESP_COEX_VSC_INCLUDED == TRUE) BTA_DM_API_CFG_COEX_ST_EVT, #endif +#if (BLE_VENDOR_HCI_EN == TRUE) BTA_DM_API_SEND_VENDOR_HCI_CMD_EVT, + BTA_DM_API_BLE_CLEAR_ADV_EVT, + BTA_DM_API_BLE_SET_CSA_SUPPORT_EVT, + BTA_DM_API_BLE_SET_VENDOR_EVT_MASK_EVT, +#endif // #if (BLE_VENDOR_HCI_EN == TRUE) #if (CLASSIC_BT_INCLUDED == TRUE) BTA_DM_API_CONFIG_EIR_EVT, BTA_DM_API_PAGE_TO_SET_EVT, @@ -269,14 +274,9 @@ enum { #if ((BLE_42_DTM_TEST_EN == TRUE) || (BLE_50_DTM_TEST_EN == TRUE)) BTA_DM_API_DTM_STOP_EVT, #endif // #if ((BLE_42_DTM_TEST_EN == TRUE) || (BLE_50_DTM_TEST_EN == TRUE)) -#if (BLE_42_ADV_EN == TRUE) - BTA_DM_API_BLE_CLEAR_ADV_EVT, -#endif // #if (BLE_42_ADV_EN == TRUE) BTA_DM_API_SET_RPA_TIMEOUT_EVT, BTA_DM_API_ADD_DEV_TO_RESOLVING_LIST_EVT, BTA_DM_API_SET_PRIVACY_MODE_EVT, - BTA_DM_API_BLE_SET_CSA_SUPPORT_EVT, - BTA_DM_API_BLE_SET_VENDOR_EVT_MASK_EVT, BTA_DM_API_BLE_READ_CH_MAP_EVT, #endif #if (BLE_FEAT_ISO_EN == TRUE) diff --git a/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c b/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c index 63fb30ef017..07067748b1f 100644 --- a/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c +++ b/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c @@ -467,25 +467,6 @@ static void btc_stop_adv_callback(uint8_t status) BTC_TRACE_ERROR("%s btc_transfer_context failed\n", __func__); } } - -static void btc_clear_adv_callback(uint8_t status) -{ - esp_ble_gap_cb_param_t param; - bt_status_t ret; - btc_msg_t msg = {0}; - - msg.sig = BTC_SIG_API_CB; - msg.pid = BTC_PID_GAP_BLE; - msg.act = ESP_GAP_BLE_ADV_CLEAR_COMPLETE_EVT; - param.adv_clear_cmpl.status = btc_hci_to_esp_status(status); - - ret = btc_transfer_context(&msg, ¶m, - sizeof(esp_ble_gap_cb_param_t), NULL, NULL); - - if (ret != BT_STATUS_SUCCESS) { - BTC_TRACE_ERROR("%s btc_transfer_context failed\n", __func__); - } -} #endif // #if (BLE_42_ADV_EN == TRUE) void btc_update_duplicate_exceptional_list_callback(tBTA_STATUS status, uint8_t subcode, uint32_t length, uint8_t *device_info) @@ -1406,6 +1387,45 @@ void btc_dtm_stop_callback(void *p1) } #endif // #if ((BLE_42_DTM_TEST_EN == TRUE) || (BLE_50_DTM_TEST_EN == TRUE)) +static void btc_ble_set_privacy_mode_callback(UINT8 status) +{ + esp_ble_gap_cb_param_t param; + bt_status_t ret; + btc_msg_t msg = {0}; + + msg.sig = BTC_SIG_API_CB; + msg.pid = BTC_PID_GAP_BLE; + msg.act = ESP_GAP_BLE_SET_PRIVACY_MODE_COMPLETE_EVT; + + param.set_privacy_mode_cmpl.status = btc_btm_status_to_esp_status(status); + + ret = btc_transfer_context(&msg, ¶m, sizeof(esp_ble_gap_cb_param_t), NULL, NULL); + + if (ret != BT_STATUS_SUCCESS) { + BTC_TRACE_ERROR("%s btc_transfer_context failed\n", __func__); + } +} + +#if (BLE_VENDOR_HCI_EN == TRUE) +static void btc_clear_adv_callback(uint8_t status) +{ + esp_ble_gap_cb_param_t param; + bt_status_t ret; + btc_msg_t msg = {0}; + + msg.sig = BTC_SIG_API_CB; + msg.pid = BTC_PID_GAP_BLE; + msg.act = ESP_GAP_BLE_ADV_CLEAR_COMPLETE_EVT; + param.adv_clear_cmpl.status = btc_hci_to_esp_status(status); + + ret = btc_transfer_context(&msg, ¶m, + sizeof(esp_ble_gap_cb_param_t), NULL, NULL); + + if (ret != BT_STATUS_SUCCESS) { + BTC_TRACE_ERROR("%s btc_transfer_context failed\n", __func__); + } +} + static void btc_ble_vendor_hci_cmd_complete_callback(tBTA_VSC_CMPL *p_param) { bool param_invalid = false; @@ -1442,25 +1462,6 @@ static void btc_ble_vendor_hci_cmd_complete_callback(tBTA_VSC_CMPL *p_param) } } -static void btc_ble_set_privacy_mode_callback(UINT8 status) -{ - esp_ble_gap_cb_param_t param; - bt_status_t ret; - btc_msg_t msg = {0}; - - msg.sig = BTC_SIG_API_CB; - msg.pid = BTC_PID_GAP_BLE; - msg.act = ESP_GAP_BLE_SET_PRIVACY_MODE_COMPLETE_EVT; - - param.set_privacy_mode_cmpl.status = btc_btm_status_to_esp_status(status); - - ret = btc_transfer_context(&msg, ¶m, sizeof(esp_ble_gap_cb_param_t), NULL, NULL); - - if (ret != BT_STATUS_SUCCESS) { - BTC_TRACE_ERROR("%s btc_transfer_context failed\n", __func__); - } -} - static void btc_ble_set_csa_support_callback(UINT8 status) { esp_ble_gap_cb_param_t param; @@ -1549,6 +1550,7 @@ static void btc_ble_vendor_hci_event_callback(UINT8 subevt_code, UINT8 param_len BTC_TRACE_ERROR("%s btc_transfer_context failed\n", __func__); } } +#endif // #if (BLE_VENDOR_HCI_EN == TRUE) void btc_get_whitelist_size(uint16_t *length) { @@ -1583,11 +1585,6 @@ static void btc_ble_stop_advertising(tBTA_START_STOP_ADV_CMPL_CBACK *stop_adv_cb BTA_DmBleBroadcast(stop_adv, stop_adv_cb); } - -static void btc_ble_clear_advertising(tBTA_CLEAR_ADV_CMPL_CBACK *clear_adv_cb) -{ - BTA_DmBleClearAdv(clear_adv_cb); -} #endif // #if (BLE_42_ADV_EN == TRUE) #endif // #if (BLE_42_FEATURE_SUPPORT == TRUE) @@ -1930,6 +1927,7 @@ void btc_gap_ble_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src) } #endif // #if (BLE_50_EXTEND_ADV_EN == TRUE) #endif // #if (BLE_50_FEATURE_SUPPORT == TRUE) +#if (BLE_VENDOR_HCI_EN == TRUE) case BTC_GAP_BLE_ACT_VENDOR_HCI_CMD_EVT: { btc_ble_gap_args_t *src = (btc_ble_gap_args_t *)p_src; btc_ble_gap_args_t *dst = (btc_ble_gap_args_t *)p_dest; @@ -1943,6 +1941,7 @@ void btc_gap_ble_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src) } break; } +#endif // #if (BLE_VENDOR_HCI_EN == TRUE) case BTC_GAP_BLE_ACT_SET_DEV_NAME:{ btc_ble_gap_args_t *src = (btc_ble_gap_args_t *)p_src; btc_ble_gap_args_t *dst = (btc_ble_gap_args_t *)p_dest; @@ -2096,6 +2095,7 @@ void btc_gap_ble_arg_deep_free(btc_msg_t *msg) } #endif // #if (BLE_50_EXTEND_ADV_EN == TRUE) #endif // #if (BLE_50_FEATURE_SUPPORT == TRUE) +#if (BLE_VENDOR_HCI_EN == TRUE) case BTC_GAP_BLE_ACT_VENDOR_HCI_CMD_EVT: { uint8_t *p_param_buf = ((btc_ble_gap_args_t *)msg->arg)->vendor_cmd_send.p_param_buf; if (p_param_buf) { @@ -2103,6 +2103,7 @@ void btc_gap_ble_arg_deep_free(btc_msg_t *msg) } break; } +#endif // #if (BLE_VENDOR_HCI_EN == TRUE) case BTC_GAP_BLE_ACT_SET_DEV_NAME:{ char *p_name = ((btc_ble_gap_args_t *)msg->arg)->set_dev_name.device_name; if (p_name) { @@ -2187,9 +2188,6 @@ void btc_gap_ble_call_handler(btc_msg_t *msg) case BTC_GAP_BLE_ACT_STOP_ADV: btc_ble_stop_advertising(btc_stop_adv_callback); break; - case BTC_GAP_BLE_ACT_CLEAR_ADV: - btc_ble_clear_advertising(btc_clear_adv_callback); - break; #endif // #if (BLE_42_ADV_EN == TRUE) #endif // #if (BLE_42_FEATURE_SUPPORT == TRUE) case BTC_GAP_BLE_ACT_UPDATE_CONN_PARAM: @@ -2649,22 +2647,27 @@ void btc_gap_ble_call_handler(btc_msg_t *msg) btc_ble_dtm_enhance_rx_start(arg_5->dtm_enh_rx_start.rx_channel, arg_5->dtm_enh_rx_start.phy, arg_5->dtm_enh_rx_start.modulation_index, btc_dtm_rx_start_callback); break; #endif // #if (BLE_50_DTM_TEST_EN == TRUE) + case BTC_GAP_BLE_SET_PRIVACY_MODE: + btc_ble_set_privacy_mode(arg->set_privacy_mode.addr_type, arg->set_privacy_mode.addr, + arg->set_privacy_mode.privacy_mode, btc_ble_set_privacy_mode_callback); + break; +#if (BLE_VENDOR_HCI_EN == TRUE) + case BTC_GAP_BLE_ACT_CLEAR_ADV: + BTA_DmBleClearAdv(btc_clear_adv_callback); + break; case BTC_GAP_BLE_ACT_VENDOR_HCI_CMD_EVT: BTA_DmsendVendorHciCmd(arg->vendor_cmd_send.opcode, arg->vendor_cmd_send.param_len, arg->vendor_cmd_send.p_param_buf, btc_ble_vendor_hci_cmd_complete_callback); break; - case BTC_GAP_BLE_SET_PRIVACY_MODE: - btc_ble_set_privacy_mode(arg->set_privacy_mode.addr_type, arg->set_privacy_mode.addr, - arg->set_privacy_mode.privacy_mode, btc_ble_set_privacy_mode_callback); - break; case BTC_GAP_BLE_SET_CSA_SUPPORT: BTA_DmBleGapSetCsaSupport(arg->set_csa_support.csa_select, btc_ble_set_csa_support_callback); break; case BTC_GAP_BLE_ACT_SET_VENDOR_EVT_MASK: BTA_DmBleGapSetVendorEventMask(arg->set_vendor_evt_mask.evt_mask, btc_ble_set_vendor_evt_mask_callback); break; +#endif // #if (BLE_VENDOR_HCI_EN == TRUE) #if (BLE_FEAT_POWER_CONTROL_EN == TRUE) case BTC_GAP_BLE_ENH_READ_TRANS_POWER_LEVEL: BTA_DmBleGapEnhReadTransPwrLevel(arg_5->enh_read_trans_pwr_level.conn_handle, arg_5->enh_read_trans_pwr_level.phy); @@ -2713,7 +2716,9 @@ void btc_gap_callback_init(void) #if (BLE_50_FEATURE_SUPPORT == TRUE) BTM_BleGapRegisterCallback(btc_ble_5_gap_callback); #endif // #if (BLE_50_FEATURE_SUPPORT == TRUE) +#if (BLE_VENDOR_HCI_EN == TRUE) BTM_BleRegisterVendorHciEventCallback(btc_ble_vendor_hci_event_callback); +#endif // #if (BLE_VENDOR_HCI_EN == TRUE) } bool btc_gap_ble_init(void) diff --git a/components/bt/host/bluedroid/btc/profile/std/include/btc_gap_ble.h b/components/bt/host/bluedroid/btc/profile/std/include/btc_gap_ble.h index 83c8f5986ec..03b1e0885d1 100644 --- a/components/bt/host/bluedroid/btc/profile/std/include/btc_gap_ble.h +++ b/components/bt/host/bluedroid/btc/profile/std/include/btc_gap_ble.h @@ -117,15 +117,15 @@ typedef enum { BTC_GAP_BLE_DTM_RX_START, #endif // #if (BLE_42_DTM_TEST_EN == TRUE) BTC_GAP_BLE_DTM_STOP, -#if (BLE_42_FEATURE_SUPPORT == TRUE) +#if (BLE_VENDOR_HCI_EN == TRUE) BTC_GAP_BLE_ACT_CLEAR_ADV, -#endif // #if (BLE_42_FEATURE_SUPPORT == TRUE) - BTC_GAP_BLE_ACT_SET_RESOLVABLE_PRIVATE_ADDRESS_TIMEOUT, - BTC_GAP_BLE_ACT_ADD_DEVICE_TO_RESOLVING_LIST, BTC_GAP_BLE_ACT_VENDOR_HCI_CMD_EVT, - BTC_GAP_BLE_SET_PRIVACY_MODE, BTC_GAP_BLE_SET_CSA_SUPPORT, BTC_GAP_BLE_ACT_SET_VENDOR_EVT_MASK, +#endif // #if (BLE_VENDOR_HCI_EN == TRUE) + BTC_GAP_BLE_ACT_SET_RESOLVABLE_PRIVATE_ADDRESS_TIMEOUT, + BTC_GAP_BLE_ACT_ADD_DEVICE_TO_RESOLVING_LIST, + BTC_GAP_BLE_SET_PRIVACY_MODE, #if (BLE_FEAT_POWER_CONTROL_EN == TRUE) BTC_GAP_BLE_ENH_READ_TRANS_POWER_LEVEL, BTC_GAP_BLE_READ_REM_TRANS_POWER_LEVEL, diff --git a/components/bt/host/bluedroid/common/include/common/bluedroid_user_config.h b/components/bt/host/bluedroid/common/include/common/bluedroid_user_config.h index 0585b53f5dd..716d01a5a2c 100644 --- a/components/bt/host/bluedroid/common/include/common/bluedroid_user_config.h +++ b/components/bt/host/bluedroid/common/include/common/bluedroid_user_config.h @@ -333,6 +333,12 @@ #define UC_BT_BLE_FEAT_CONN_SUBRATING FALSE #endif +#ifdef CONFIG_BT_BLE_VENDOR_HCI_EN +#define UC_BT_BLE_VENDOR_HCI_EN CONFIG_BT_BLE_VENDOR_HCI_EN +#else +#define UC_BT_BLE_VENDOR_HCI_EN FALSE +#endif + #ifdef CONFIG_BT_BLE_HIGH_DUTY_ADV_INTERVAL #define UC_BT_BLE_HIGH_DUTY_ADV_INTERVAL CONFIG_BT_BLE_HIGH_DUTY_ADV_INTERVAL #else diff --git a/components/bt/host/bluedroid/common/include/common/bt_target.h b/components/bt/host/bluedroid/common/include/common/bt_target.h index ce30fff86fa..1d51761105e 100644 --- a/components/bt/host/bluedroid/common/include/common/bt_target.h +++ b/components/bt/host/bluedroid/common/include/common/bt_target.h @@ -392,6 +392,12 @@ #define BLE_FEAT_CONN_SUBRATING FALSE #endif +#if (UC_BT_BLE_VENDOR_HCI_EN == TRUE) +#define BLE_VENDOR_HCI_EN TRUE +#else +#define BLE_VENDOR_HCI_EN FALSE +#endif + #if (UC_BT_BLE_HIGH_DUTY_ADV_INTERVAL == TRUE) #define BLE_HIGH_DUTY_ADV_INTERVAL TRUE #else diff --git a/components/bt/host/bluedroid/stack/btm/btm_ble_gap.c b/components/bt/host/bluedroid/stack/btm/btm_ble_gap.c index 297d1fbbeea..f3886643d9c 100644 --- a/components/bt/host/bluedroid/stack/btm/btm_ble_gap.c +++ b/components/bt/host/bluedroid/stack/btm/btm_ble_gap.c @@ -72,7 +72,9 @@ static tBTM_BLE_CTRL_FEATURES_CBACK *p_ctrl_le_feature_rd_cmpl_cback = NULL; tBTM_CallbackFunc conn_callback_func; // BLE vendor HCI event callback +#if (BLE_VENDOR_HCI_EN == TRUE) static tBTM_BLE_VENDOR_HCI_EVT_CBACK *ble_vs_evt_callback = NULL; +#endif // #if (BLE_VENDOR_HCI_EN == TRUE) /******************************************************************************* ** Local functions *******************************************************************************/ @@ -353,10 +355,12 @@ void BTM_BleRegiseterPktLengthChangeCallback(tBTM_SET_PKT_DATA_LENGTH_CBACK *ptk conn_callback_func.set_pkt_data_length_cb = ptk_len_chane_cb; } +#if (BLE_VENDOR_HCI_EN == TRUE) void BTM_BleRegisterVendorHciEventCallback(tBTM_BLE_VENDOR_HCI_EVT_CBACK *vendor_hci_evt_cb) { ble_vs_evt_callback = vendor_hci_evt_cb; } +#endif // #if (BLE_VENDOR_HCI_EN == TRUE) /******************************************************************************* ** @@ -4548,6 +4552,7 @@ BOOLEAN btm_ble_update_mode_operation(UINT8 link_role, BD_ADDR bd_addr, UINT8 st return bg_con; } +#if (BLE_VENDOR_HCI_EN == TRUE) static void btm_ble_vs_evt_callback(UINT8 len, UINT8 *p) { UINT8 sub_event; @@ -4567,6 +4572,7 @@ static void btm_ble_vs_evt_callback(UINT8 len, UINT8 *p) ble_vs_evt_callback(sub_event, len, p); } } +#endif // #if (BLE_VENDOR_HCI_EN == TRUE) /******************************************************************************* ** @@ -4626,8 +4632,9 @@ void btm_ble_init (void) btm_ble_adv_filter_init(); #endif // #if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE #endif - +#if (BLE_VENDOR_HCI_EN == TRUE) BTM_RegisterForVSEvents(btm_ble_vs_evt_callback, TRUE); +#endif // #if (BLE_VENDOR_HCI_EN == TRUE) } /******************************************************************************* @@ -4754,6 +4761,7 @@ BOOLEAN BTM_Ble_Authorization(BD_ADDR bd_addr, BOOLEAN authorize) return FALSE; } +#if (BLE_VENDOR_HCI_EN == TRUE) /******************************************************************************* ** ** Function BTM_BleClearAdv @@ -4775,6 +4783,30 @@ BOOLEAN BTM_BleClearAdv(tBTM_CLEAR_ADV_CMPL_CBACK *p_clear_adv_cback) p_cb->inq_var.p_clear_adv_cb = p_clear_adv_cback; return TRUE; } + +BOOLEAN BTM_BleSetCsaSupport(UINT8 csa_select, tBTM_SET_CSA_SUPPORT_CMPL_CBACK *p_callback) +{ + if (btsnd_hcic_ble_set_csa_support(csa_select) != TRUE) { + BTM_TRACE_ERROR("LE SetCsaSupport csa_select=%d: error", csa_select); + return FALSE; + } + + btm_cb.ble_ctr_cb.set_csa_support_cmpl_cb = p_callback; + return TRUE; +} + +BOOLEAN BTM_BleSetVendorEventMask(UINT32 evt_mask, tBTM_SET_VENDOR_EVT_MASK_CBACK *p_callback) +{ + if (btsnd_hcic_ble_set_vendor_evt_mask(evt_mask) != TRUE) { + BTM_TRACE_ERROR("LE SetVendorEventMask evt_mask=%x: error", evt_mask); + return FALSE; + } + + btm_cb.ble_ctr_cb.set_vendor_evt_mask_cmpl_cb = p_callback; + return TRUE; +} +#endif // #if (BLE_VENDOR_HCI_EN == TRUE) + BOOLEAN BTM_BleSetRpaTimeout(uint16_t rpa_timeout,tBTM_SET_RPA_TIMEOUT_CMPL_CBACK *p_set_rpa_timeout_cback) { if ((btsnd_hcic_ble_set_rand_priv_addr_timeout(rpa_timeout)) != TRUE) { @@ -4810,28 +4842,6 @@ BOOLEAN BTM_BleSetPrivacyMode(UINT8 addr_type, BD_ADDR bd_addr, UINT8 privacy_mo return TRUE; } -BOOLEAN BTM_BleSetCsaSupport(UINT8 csa_select, tBTM_SET_CSA_SUPPORT_CMPL_CBACK *p_callback) -{ - if (btsnd_hcic_ble_set_csa_support(csa_select) != TRUE) { - BTM_TRACE_ERROR("LE SetCsaSupport csa_select=%d: error", csa_select); - return FALSE; - } - - btm_cb.ble_ctr_cb.set_csa_support_cmpl_cb = p_callback; - return TRUE; -} - -BOOLEAN BTM_BleSetVendorEventMask(UINT32 evt_mask, tBTM_SET_VENDOR_EVT_MASK_CBACK *p_callback) -{ - if (btsnd_hcic_ble_set_vendor_evt_mask(evt_mask) != TRUE) { - BTM_TRACE_ERROR("LE SetVendorEventMask evt_mask=%x: error", evt_mask); - return FALSE; - } - - btm_cb.ble_ctr_cb.set_vendor_evt_mask_cmpl_cb = p_callback; - return TRUE; -} - #if (BLE_42_SCAN_EN == TRUE) bool btm_ble_adv_pkt_ready(void) { diff --git a/components/bt/host/bluedroid/stack/hcic/hciblecmds.c b/components/bt/host/bluedroid/stack/hcic/hciblecmds.c index 5b4822dad93..5ad13216f77 100644 --- a/components/bt/host/bluedroid/stack/hcic/hciblecmds.c +++ b/components/bt/host/bluedroid/stack/hcic/hciblecmds.c @@ -1088,27 +1088,6 @@ BOOLEAN btsnd_hcic_ble_set_channels (BLE_CHANNELS channels) return (TRUE); } -BOOLEAN btsnd_hcic_ble_clear_adv (void) -{ - BT_HDR *p; - UINT8 *pp; - - if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_CLEAR_ADV)) == NULL) { - return (FALSE); - } - - pp = (UINT8 *)(p + 1); - - p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_CLEAR_ADV; - p->offset = 0; - - UINT16_TO_STREAM (pp, HCI_VENDOR_BLE_CLEAR_ADV); - UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_CLEAR_ADV); - - btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); - return TRUE; -} - #define HCIC_BLE_CMD_CREATED(p, pp, size) do{\ if ((p = HCI_GET_CMD_BUF(size)) == NULL) { \ return FALSE; \ @@ -1948,6 +1927,28 @@ BOOLEAN btsnd_hcic_ble_set_privacy_mode(UINT8 addr_type, BD_ADDR addr, UINT8 pri return (TRUE); } +#if (BLE_VENDOR_HCI_EN == TRUE) +BOOLEAN btsnd_hcic_ble_clear_adv (void) +{ + BT_HDR *p; + UINT8 *pp; + + if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_CLEAR_ADV)) == NULL) { + return (FALSE); + } + + pp = (UINT8 *)(p + 1); + + p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_CLEAR_ADV; + p->offset = 0; + + UINT16_TO_STREAM (pp, HCI_VENDOR_BLE_CLEAR_ADV); + UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_CLEAR_ADV); + + btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); + return TRUE; +} + BOOLEAN btsnd_hcic_ble_set_csa_support (UINT8 csa_select) { BT_HDR *p; @@ -1991,6 +1992,7 @@ BOOLEAN btsnd_hcic_ble_set_vendor_evt_mask (UINT32 evt_mask) btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); return TRUE; } +#endif // #if (BLE_VENDOR_HCI_EN == TRUE) #endif #if (BLE_FEAT_ISO_EN == TRUE) From 93eb5e705d743c7155d39552578f39406b7d035e Mon Sep 17 00:00:00 2001 From: chenjianhua Date: Wed, 7 May 2025 17:36:06 +0800 Subject: [PATCH 043/213] feat(ble/bluedroid): Support anonymous address type for white list --- .../host/bluedroid/api/include/api/esp_bt_defs.h | 7 +++++-- .../bt/host/bluedroid/stack/btm/btm_ble_bgconn.c | 14 ++++++++++++-- .../host/bluedroid/stack/include/stack/bt_types.h | 1 + 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/components/bt/host/bluedroid/api/include/api/esp_bt_defs.h b/components/bt/host/bluedroid/api/include/api/esp_bt_defs.h index 64762fd074e..d6a2718ab19 100644 --- a/components/bt/host/bluedroid/api/include/api/esp_bt_defs.h +++ b/components/bt/host/bluedroid/api/include/api/esp_bt_defs.h @@ -282,8 +282,11 @@ typedef enum { /// white list address type typedef enum { - BLE_WL_ADDR_TYPE_PUBLIC = 0x00, - BLE_WL_ADDR_TYPE_RANDOM = 0x01, + BLE_WL_ADDR_TYPE_PUBLIC = 0x00, /*!< Public Device Address */ + BLE_WL_ADDR_TYPE_RANDOM = 0x01, /*!< Random Device Address */ +#if (CONFIG_BT_BLE_50_FEATURES_SUPPORTED) + BLE_WL_ADDR_TYPE_ANONYMOUS = 0xFF, /*!< Devices sending anonymous advertisements, use to enable anonymous advertising report for scanning */ +#endif // (CONFIG_BT_BLE_50_FEATURES_SUPPORTED) } esp_ble_wl_addr_type_t; /// Used to exchange the encryption key in the init key & response key diff --git a/components/bt/host/bluedroid/stack/btm/btm_ble_bgconn.c b/components/bt/host/bluedroid/stack/btm/btm_ble_bgconn.c index 9d08c042be0..bf9b1adbff3 100644 --- a/components/bt/host/bluedroid/stack/btm/btm_ble_bgconn.c +++ b/components/bt/host/bluedroid/stack/btm/btm_ble_bgconn.c @@ -201,7 +201,12 @@ BOOLEAN btm_add_dev_to_controller (BOOLEAN to_add, BD_ADDR bd_addr, tBLE_ADDR_TY /* Controller do not support resolvable address now, only support public address and static random address */ BOOLEAN started = FALSE; - if(wl_addr_type > BLE_ADDR_RANDOM) { +#if (BLE_50_FEATURE_SUPPORT == TRUE) + if (wl_addr_type > BLE_ADDR_RANDOM && wl_addr_type != BLE_ADDR_ANONYMOUS) +#else + if (wl_addr_type > BLE_ADDR_RANDOM) +#endif // #if (BLE_50_FEATURE_SUPPORT == TRUE) + { BTM_TRACE_ERROR("wl_addr_type is error\n"); return started; } @@ -278,7 +283,12 @@ void btm_enq_wl_dev_operation(BOOLEAN to_add, BD_ADDR bd_addr, tBLE_ADDR_TYPE ad *******************************************************************************/ BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr, tBLE_ADDR_TYPE addr_type, tBTM_UPDATE_WHITELIST_CBACK *update_wl_cb) { - if(addr_type > BLE_ADDR_RANDOM) { +#if (BLE_50_FEATURE_SUPPORT == TRUE) + if (addr_type > BLE_ADDR_RANDOM && addr_type != BLE_ADDR_ANONYMOUS) +#else + if (addr_type > BLE_ADDR_RANDOM) +#endif // #if (BLE_50_FEATURE_SUPPORT == TRUE) + { BTM_TRACE_ERROR("%s address type is error, unable to add device", __func__); if (update_wl_cb){ update_wl_cb(HCI_ERR_ILLEGAL_PARAMETER_FMT,to_add); diff --git a/components/bt/host/bluedroid/stack/include/stack/bt_types.h b/components/bt/host/bluedroid/stack/include/stack/bt_types.h index 5d817632989..4050b79d3bf 100644 --- a/components/bt/host/bluedroid/stack/include/stack/bt_types.h +++ b/components/bt/host/bluedroid/stack/include/stack/bt_types.h @@ -486,6 +486,7 @@ typedef struct { #define BLE_ADDR_RANDOM_ID 0x03 #define BLE_ADDR_TYPE_MAX BLE_ADDR_RANDOM_ID #define BLE_ADDR_UNKNOWN_TYPE 0XFF +#define BLE_ADDR_ANONYMOUS 0xFF typedef UINT8 tBLE_ADDR_TYPE; #define BLE_ADDR_TYPE_MASK (BLE_ADDR_RANDOM | BLE_ADDR_PUBLIC) From 4594a84ddb2b9e6f462340a5b5bc714d0de16555 Mon Sep 17 00:00:00 2001 From: Fu Hanxi Date: Tue, 3 Jun 2025 08:37:30 +0200 Subject: [PATCH 044/213] ci: disable idf-ci plugin this plugin will be re-enabled with compatible code in !38755 --- components/nvs_flash/nvs_partition_tool/pytest.ini | 2 +- pytest.ini | 1 + tools/ci/idf_pytest/pytest.ini | 1 + tools/ci/test_autocomplete/pytest.ini | 2 +- tools/test_build_system/pytest.ini | 1 + tools/test_idf_py/pytest.ini | 2 +- tools/test_idf_size/pytest.ini | 2 +- tools/test_mkdfu/pytest.ini | 2 +- 8 files changed, 8 insertions(+), 5 deletions(-) diff --git a/components/nvs_flash/nvs_partition_tool/pytest.ini b/components/nvs_flash/nvs_partition_tool/pytest.ini index d95e773e5cd..8cb59810c32 100644 --- a/components/nvs_flash/nvs_partition_tool/pytest.ini +++ b/components/nvs_flash/nvs_partition_tool/pytest.ini @@ -1,5 +1,5 @@ [pytest] -addopts = -s -p no:pytest_embedded +addopts = -s -p no:pytest_embedded -p no:idf-ci # log related log_cli = True diff --git a/pytest.ini b/pytest.ini index 069d1cf4158..1fe5e78cc60 100644 --- a/pytest.ini +++ b/pytest.ini @@ -7,6 +7,7 @@ python_files = pytest_*.py addopts = -s -vv --embedded-services esp,idf + -p no:idf-ci --tb short --strict-markers --skip-check-coredump y diff --git a/tools/ci/idf_pytest/pytest.ini b/tools/ci/idf_pytest/pytest.ini index 0ee949b8988..cc928df8995 100644 --- a/tools/ci/idf_pytest/pytest.ini +++ b/tools/ci/idf_pytest/pytest.ini @@ -1,2 +1,3 @@ [pytest] +addopts = -p no:idf-ci python_files = test_*.py diff --git a/tools/ci/test_autocomplete/pytest.ini b/tools/ci/test_autocomplete/pytest.ini index d95e773e5cd..8cb59810c32 100644 --- a/tools/ci/test_autocomplete/pytest.ini +++ b/tools/ci/test_autocomplete/pytest.ini @@ -1,5 +1,5 @@ [pytest] -addopts = -s -p no:pytest_embedded +addopts = -s -p no:pytest_embedded -p no:idf-ci # log related log_cli = True diff --git a/tools/test_build_system/pytest.ini b/tools/test_build_system/pytest.ini index fe058544ee3..eeac16e6d7b 100644 --- a/tools/test_build_system/pytest.ini +++ b/tools/test_build_system/pytest.ini @@ -1,4 +1,5 @@ [pytest] +addopts = -p no:idf-ci # log related log_cli = True diff --git a/tools/test_idf_py/pytest.ini b/tools/test_idf_py/pytest.ini index d95e773e5cd..8cb59810c32 100644 --- a/tools/test_idf_py/pytest.ini +++ b/tools/test_idf_py/pytest.ini @@ -1,5 +1,5 @@ [pytest] -addopts = -s -p no:pytest_embedded +addopts = -s -p no:pytest_embedded -p no:idf-ci # log related log_cli = True diff --git a/tools/test_idf_size/pytest.ini b/tools/test_idf_size/pytest.ini index d95e773e5cd..8cb59810c32 100644 --- a/tools/test_idf_size/pytest.ini +++ b/tools/test_idf_size/pytest.ini @@ -1,5 +1,5 @@ [pytest] -addopts = -s -p no:pytest_embedded +addopts = -s -p no:pytest_embedded -p no:idf-ci # log related log_cli = True diff --git a/tools/test_mkdfu/pytest.ini b/tools/test_mkdfu/pytest.ini index d95e773e5cd..8cb59810c32 100644 --- a/tools/test_mkdfu/pytest.ini +++ b/tools/test_mkdfu/pytest.ini @@ -1,5 +1,5 @@ [pytest] -addopts = -s -p no:pytest_embedded +addopts = -s -p no:pytest_embedded -p no:idf-ci # log related log_cli = True From b14882626938047cc336290eff1df1844aa401c5 Mon Sep 17 00:00:00 2001 From: Marek Fiala Date: Fri, 16 May 2025 17:34:32 +0200 Subject: [PATCH 045/213] fix(tools): Enabled removing requirements.* files --- tools/check_python_dependencies.py | 36 +++++++++++++++++++++++++----- tools/idf_tools.py | 20 +++++++++++++++++ 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/tools/check_python_dependencies.py b/tools/check_python_dependencies.py index 1c290b4b7c0..35df9ea3922 100755 --- a/tools/check_python_dependencies.py +++ b/tools/check_python_dependencies.py @@ -37,6 +37,21 @@ except ImportError: PYTHON_PACKAGE_RE = re.compile(r'[^<>=~]+') +def validate_requirement_list(file_path: str) -> str: + """Validate that a requirement file exists and is readable.""" + if not os.path.isfile(file_path): + raise argparse.ArgumentTypeError( + f'Requirement file {file_path} not found\n' + 'Please make sure the file path is correct.\n' + 'In case the file was removed, please run the export script again, to update the environment.' + ) + try: + open(file_path, encoding='utf-8').close() + except IOError as e: + raise argparse.ArgumentTypeError(f'Cannot read requirement file {file_path}: {e}') + return file_path + + # The version and requires function from importlib.metadata in python prior # 3.10 does perform distribution name normalization before searching for # package distribution. This might cause problems for package with dot in its @@ -66,12 +81,21 @@ def get_requires(name: str) -> Optional[list]: if __name__ == '__main__': parser = argparse.ArgumentParser(description='ESP-IDF Python package dependency checker') - parser.add_argument('--requirements', '-r', - help='Path to a requirements file (can be used multiple times)', - action='append', default=[]) - parser.add_argument('--constraints', '-c', default=[], - help='Path to a constraints file (can be used multiple times)', - action='append') + parser.add_argument( + '--requirements', + '-r', + help='Path to a requirements file (can be used multiple times)', + action='append', + default=[], + type=validate_requirement_list, + ) + parser.add_argument( + '--constraints', + '-c', + default=[], + help='Path to a constraints file (can be used multiple times)', + action='append', + ) args = parser.parse_args() required_set = set() diff --git a/tools/idf_tools.py b/tools/idf_tools.py index f188e07951c..de70f077a03 100755 --- a/tools/idf_tools.py +++ b/tools/idf_tools.py @@ -1442,6 +1442,25 @@ class IDFRecord: features.add('core') self._features = list(features) + def check_feature_requirements_files(self) -> None: + """ + Check if feature requirements files exist. + If not, remove the feature from the features list. + """ + features_to_remove: Tuple[str, ...] = () + for feature in self._features: + if not os.path.isfile(feature_to_requirements_path(feature)): + info( + '\n'.join( + [ + f"Feature file '{feature_to_requirements_path(feature)}' does not exist.", + f'Removing feature {feature}', + ] + ) + ) + features_to_remove += (feature,) + self.update_features(remove=features_to_remove) + @property def targets(self) -> List[str]: return self._targets @@ -1802,6 +1821,7 @@ def process_and_check_features(idf_env_obj: IDFEnv, features_str: str) -> List[s raise SystemExit(1) idf_env_obj.get_active_idf_record().update_features(tuple(new_features), tuple(remove_features)) + idf_env_obj.get_active_idf_record().check_feature_requirements_files() return idf_env_obj.get_active_idf_record().features From e9306808579a3175858599a0a598325696af27d4 Mon Sep 17 00:00:00 2001 From: armando Date: Thu, 12 Jun 2025 10:05:30 +0800 Subject: [PATCH 046/213] feat(mmu): use cache freeze for mmap apis --- components/esp_mm/CMakeLists.txt | 5 +- .../esp_mm/{esp_cache.c => esp_cache_msync.c} | 36 ------ components/esp_mm/esp_cache_utils.c | 114 ++++++++++++++++++ components/esp_mm/esp_mmu_map.c | 55 ++++++--- .../include/esp_private/esp_cache_private.h | 12 ++ components/esp_mm/linker.lf | 3 +- components/esp_mm/test_apps/mm/README.md | 4 +- .../esp_mm/test_apps/mm/main/CMakeLists.txt | 5 +- .../test_apps/mm/main/idf_component.yml | 3 + .../test_apps/mm/main/test_cache_utils.c | 67 ++++++++++ components/esp_mm/test_apps/mmap_hw/README.md | 4 +- 11 files changed, 250 insertions(+), 58 deletions(-) rename components/esp_mm/{esp_cache.c => esp_cache_msync.c} (88%) create mode 100644 components/esp_mm/esp_cache_utils.c create mode 100644 components/esp_mm/test_apps/mm/main/idf_component.yml create mode 100644 components/esp_mm/test_apps/mm/main/test_cache_utils.c diff --git a/components/esp_mm/CMakeLists.txt b/components/esp_mm/CMakeLists.txt index 923ab0aae69..bf81e65185b 100644 --- a/components/esp_mm/CMakeLists.txt +++ b/components/esp_mm/CMakeLists.txt @@ -14,14 +14,15 @@ set(srcs) if(NOT CONFIG_APP_BUILD_TYPE_PURE_RAM_APP) set(srcs "esp_mmu_map.c" "port/${target}/ext_mem_layout.c" - "esp_cache.c") + "esp_cache_msync.c" + "esp_cache_utils.c") if(CONFIG_IDF_TARGET_ESP32) list(APPEND srcs "cache_esp32.c") endif() else() if(CONFIG_SOC_CACHE_INTERNAL_MEM_VIA_L1CACHE) - list(APPEND srcs "esp_cache.c") + list(APPEND srcs "esp_cache_msync.c") endif() endif() diff --git a/components/esp_mm/esp_cache.c b/components/esp_mm/esp_cache_msync.c similarity index 88% rename from components/esp_mm/esp_cache.c rename to components/esp_mm/esp_cache_msync.c index d193ace39e6..e8af782c265 100644 --- a/components/esp_mm/esp_cache.c +++ b/components/esp_mm/esp_cache_msync.c @@ -147,42 +147,6 @@ esp_err_t esp_cache_msync(void *addr, size_t size, int flags) return ESP_OK; } -void esp_cache_suspend_ext_mem_cache(void) -{ -#if (CONFIG_SPIRAM && SOC_CACHE_INTERNAL_MEM_VIA_L1CACHE) - /** - * before suspending the external mem cache, writeback internal mem cache content back to external mem cache - * to avoid stuck issue caused by internal mem cache auto-writeback - */ - cache_ll_writeback_all(CACHE_LL_LEVEL_INT_MEM, CACHE_TYPE_DATA, CACHE_LL_ID_ALL); -#endif - cache_hal_suspend(CACHE_LL_LEVEL_EXT_MEM, CACHE_TYPE_ALL); -} - -void esp_cache_resume_ext_mem_cache(void) -{ - cache_hal_resume(CACHE_LL_LEVEL_EXT_MEM, CACHE_TYPE_ALL); -} - -#if SOC_CACHE_FREEZE_SUPPORTED -void esp_cache_freeze_ext_mem_cache(void) -{ -#if (CONFIG_SPIRAM && SOC_CACHE_INTERNAL_MEM_VIA_L1CACHE) - /** - * before freezing the external mem cache, writeback internal mem cache content back to external mem cache - * to avoid stuck issue caused by internal mem cache auto-writeback - */ - cache_ll_writeback_all(CACHE_LL_LEVEL_INT_MEM, CACHE_TYPE_DATA, CACHE_LL_ID_ALL); -#endif - cache_hal_freeze(CACHE_LL_LEVEL_EXT_MEM, CACHE_TYPE_ALL); -} - -void esp_cache_unfreeze_ext_mem_cache(void) -{ - cache_hal_unfreeze(CACHE_LL_LEVEL_EXT_MEM, CACHE_TYPE_ALL); -} -#endif //#if SOC_CACHE_FREEZE_SUPPORTED - //The esp_cache_aligned_malloc function is marked deprecated but also called by other //(also deprecated) functions in this file. In order to work around that generating warnings, it's //split into a non-deprecated internal function and the stubbed external deprecated function. diff --git a/components/esp_mm/esp_cache_utils.c b/components/esp_mm/esp_cache_utils.c new file mode 100644 index 00000000000..f986c3b4ff5 --- /dev/null +++ b/components/esp_mm/esp_cache_utils.c @@ -0,0 +1,114 @@ +/* + * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD +* +* SPDX-License-Identifier: Apache-2.0 +*/ + +#include +#include +#include +#include "sys/lock.h" +#include "sdkconfig.h" +#include "esp_check.h" +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "esp_memory_utils.h" +#include "soc/soc_caps.h" +#include "hal/cache_hal.h" +#include "hal/cache_ll.h" +#include "esp_private/esp_cache_private.h" +#include "esp_private/critical_section.h" +#if __riscv +#include "riscv/rv_utils.h" +#endif + +#define ALIGN_UP_BY(num, align) (((num) + ((align) - 1)) & ~((align) - 1)) + +void esp_cache_suspend_ext_mem_cache(void) +{ +#if (CONFIG_SPIRAM && SOC_CACHE_INTERNAL_MEM_VIA_L1CACHE) + /** + * before suspending the external mem cache, writeback internal mem cache content back to external mem cache + * to avoid stuck issue caused by internal mem cache auto-writeback + */ + cache_ll_writeback_all(CACHE_LL_LEVEL_INT_MEM, CACHE_TYPE_DATA, CACHE_LL_ID_ALL); +#endif + cache_hal_suspend(CACHE_LL_LEVEL_EXT_MEM, CACHE_TYPE_ALL); +} + +void esp_cache_resume_ext_mem_cache(void) +{ + cache_hal_resume(CACHE_LL_LEVEL_EXT_MEM, CACHE_TYPE_ALL); +} + +/*----------------------------------------------------------------------------- + * Cache Freeze Related + *----------------------------------------------------------------------------*/ +#if SOC_CACHE_FREEZE_SUPPORTED +DEFINE_CRIT_SECTION_LOCK_STATIC(s_spinlock); + +void esp_cache_freeze_ext_mem_cache(void) +{ +#if (CONFIG_SPIRAM && SOC_CACHE_INTERNAL_MEM_VIA_L1CACHE) +#if !CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE + int cpuid = xPortGetCoreID(); + uint32_t other_cpuid = (cpuid == 0) ? 1 : 0; + esp_cpu_stall(other_cpuid); +#else + //single core mode, don't need to stall other core +#endif + /** + * before freezing the external mem cache, writeback internal mem cache content back to external mem cache + * to avoid stuck issue caused by internal mem cache auto-writeback + */ + cache_ll_writeback_all(CACHE_LL_LEVEL_INT_MEM, CACHE_TYPE_DATA, CACHE_LL_ID_ALL); +#endif + + cache_hal_freeze(CACHE_LL_LEVEL_EXT_MEM, CACHE_TYPE_ALL); + +#if (CONFIG_SPIRAM && SOC_CACHE_INTERNAL_MEM_VIA_L1CACHE) +#if !CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE + esp_cpu_unstall(other_cpuid); +#else + //single core mode, don't need to unstall other core +#endif +#endif +} + +void esp_cache_unfreeze_ext_mem_cache(void) +{ + cache_hal_unfreeze(CACHE_LL_LEVEL_EXT_MEM, CACHE_TYPE_ALL); +} + +static inline bool s_task_stack_is_sane_when_cache_frozen(void) +{ + const void *sp = (const void *)esp_cpu_get_sp(); + + return esp_ptr_in_dram(sp) +#if CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP + || esp_ptr_in_rtc_dram_fast(sp) +#endif + ; +} + +void esp_cache_freeze_caches_disable_interrupts(void) +{ + assert(s_task_stack_is_sane_when_cache_frozen()); + esp_os_enter_critical_safe(&s_spinlock); + + /** + * - disable non-iram interrupt on current core + * - current core call cache freeze + * - external access from other cores will hang on cache + */ + esp_intr_noniram_disable(); + esp_cache_freeze_ext_mem_cache(); +} + +void esp_cache_unfreeze_caches_enable_interrupts(void) +{ + esp_cache_unfreeze_ext_mem_cache(); + esp_intr_noniram_enable(); + esp_os_exit_critical_safe(&s_spinlock); +} +#endif diff --git a/components/esp_mm/esp_mmu_map.c b/components/esp_mm/esp_mmu_map.c index 32dadf7a822..52b719cb54d 100644 --- a/components/esp_mm/esp_mmu_map.c +++ b/components/esp_mm/esp_mmu_map.c @@ -27,6 +27,7 @@ #include "esp_private/cache_utils.h" #include "esp_private/esp_cache_esp32_private.h" +#include "esp_private/esp_cache_private.h" #include "esp_private/esp_mmu_map_private.h" #include "ext_mem_layout.h" #include "esp_mmu_map.h" @@ -373,6 +374,26 @@ IRAM_ATTR esp_err_t esp_mmu_paddr_find_caps(const esp_paddr_t paddr, mmu_mem_cap return ESP_OK; } +static void IRAM_ATTR NOINLINE_ATTR s_stop_cache(void) +{ +#if SOC_CACHE_FREEZE_SUPPORTED && !CONFIG_IDF_TARGET_ESP32P4 + // On P4, due to limitations on stalling another core, we temporarily use cache disable/enable + esp_cache_freeze_caches_disable_interrupts(); +#else + spi_flash_disable_interrupts_caches_and_other_cpu(); +#endif +} + +static void IRAM_ATTR NOINLINE_ATTR s_start_cache(void) +{ +#if SOC_CACHE_FREEZE_SUPPORTED && !CONFIG_IDF_TARGET_ESP32P4 + // On P4, due to limitations on stalling another core, we temporarily use cache disable/enable + esp_cache_unfreeze_caches_enable_interrupts(); +#else + spi_flash_enable_interrupts_caches_and_other_cpu(); +#endif +} + static void IRAM_ATTR NOINLINE_ATTR s_do_cache_invalidate(uint32_t vaddr_start, uint32_t size) { #if CONFIG_IDF_TARGET_ESP32 @@ -416,10 +437,8 @@ static void IRAM_ATTR NOINLINE_ATTR s_do_mapping(mmu_target_t target, uint32_t v { /** * Disable Cache, after this function, involved code and data should be placed in internal RAM. - * - * @note we call this for now, but this will be refactored to move out of `spi_flash` */ - spi_flash_disable_interrupts_caches_and_other_cpu(); + s_stop_cache(); uint32_t actual_mapped_len = s_mapping_operation(target, vaddr_start, paddr_start, size); @@ -433,7 +452,7 @@ static void IRAM_ATTR NOINLINE_ATTR s_do_mapping(mmu_target_t target, uint32_t v s_do_cache_invalidate(vaddr_start, size); //enable Cache, after this function, internal RAM access is no longer mandatory - spi_flash_enable_interrupts_caches_and_other_cpu(); + s_start_cache(); ESP_EARLY_LOGV(TAG, "actual_mapped_len is 0x%"PRIx32, actual_mapped_len); } @@ -613,15 +632,13 @@ static void IRAM_ATTR NOINLINE_ATTR s_do_unmapping(uint32_t vaddr_start, uint32_ { /** * Disable Cache, after this function, involved code and data should be placed in internal RAM. - * - * @note we call this for now, but this will be refactored to move out of `spi_flash` */ - spi_flash_disable_interrupts_caches_and_other_cpu(); + s_stop_cache(); s_unmapping_operation(vaddr_start, size); //enable Cache, after this function, internal RAM access is no longer mandatory - spi_flash_enable_interrupts_caches_and_other_cpu(); + s_start_cache(); } esp_err_t esp_mmu_unmap(void *ptr) @@ -759,8 +776,11 @@ esp_err_t IRAM_ATTR esp_mmu_map_dump_mapped_blocks_private(void) static bool NOINLINE_ATTR IRAM_ATTR s_vaddr_to_paddr(uint32_t vaddr, esp_paddr_t *out_paddr, mmu_target_t *out_target) { uint32_t mmu_id = 0; - //we call this for now, but this will be refactored to move out of `spi_flash` - spi_flash_disable_interrupts_caches_and_other_cpu(); + /** + * Disable Cache, after this function, involved code and data should be placed in internal RAM. + */ + s_stop_cache(); + #if SOC_MMU_PER_EXT_MEM_TARGET mmu_id = mmu_hal_get_id_from_vaddr(vaddr); #endif @@ -770,7 +790,9 @@ static bool NOINLINE_ATTR IRAM_ATTR s_vaddr_to_paddr(uint32_t vaddr, esp_paddr_t is_mapped = mmu_hal_vaddr_to_paddr(1, vaddr, out_paddr, out_target); } #endif - spi_flash_enable_interrupts_caches_and_other_cpu(); + + //enable Cache, after this function, internal RAM access is no longer mandatory + s_start_cache(); return is_mapped; } @@ -794,14 +816,19 @@ esp_err_t esp_mmu_vaddr_to_paddr(void *vaddr, esp_paddr_t *out_paddr, mmu_target static bool NOINLINE_ATTR IRAM_ATTR s_paddr_to_vaddr(esp_paddr_t paddr, mmu_target_t target, mmu_vaddr_t type, uint32_t *out_vaddr) { - //we call this for now, but this will be refactored to move out of `spi_flash` - spi_flash_disable_interrupts_caches_and_other_cpu(); + /** + * Disable Cache, after this function, involved code and data should be placed in internal RAM. + */ + s_stop_cache(); + uint32_t mmu_id = 0; #if SOC_MMU_PER_EXT_MEM_TARGET mmu_id = mmu_hal_get_id_from_target(target); #endif bool found = mmu_hal_paddr_to_vaddr(mmu_id, paddr, target, type, out_vaddr); - spi_flash_enable_interrupts_caches_and_other_cpu(); + + //enable Cache, after this function, internal RAM access is no longer mandatory + s_start_cache(); return found; } diff --git a/components/esp_mm/include/esp_private/esp_cache_private.h b/components/esp_mm/include/esp_private/esp_cache_private.h index 7380fddfa4b..9768765b737 100644 --- a/components/esp_mm/include/esp_private/esp_cache_private.h +++ b/components/esp_mm/include/esp_private/esp_cache_private.h @@ -53,6 +53,18 @@ void esp_cache_freeze_ext_mem_cache(void); * @note This API must be called after a `esp_cache_freeze_ext_mem_cache` */ void esp_cache_unfreeze_ext_mem_cache(void); + +/** + * @brief Freeze external memory cache and disable non-iram interrupts + * + * @note This API will enter a critical section, you will need to call `esp_cache_unfreeze_caches_enable_interrupts` to exit it. + */ +void esp_cache_freeze_caches_disable_interrupts(void); + +/** + * @brief Unfreeze external memory cache and re-enable non-iram interrupts + */ +void esp_cache_unfreeze_caches_enable_interrupts(void); #endif /** diff --git a/components/esp_mm/linker.lf b/components/esp_mm/linker.lf index 1af07775ddb..bf3f3820c32 100644 --- a/components/esp_mm/linker.lf +++ b/components/esp_mm/linker.lf @@ -3,7 +3,8 @@ archive: libesp_mm.a entries: if APP_BUILD_TYPE_PURE_RAM_APP = n: - esp_cache (noflash) + esp_cache_msync (noflash) + esp_cache_utils (noflash) if IDF_TARGET_ESP32 = y: cache_esp32 (noflash) diff --git a/components/esp_mm/test_apps/mm/README.md b/components/esp_mm/test_apps/mm/README.md index fb8e4a96b8b..bf47d80ec64 100644 --- a/components/esp_mm/test_apps/mm/README.md +++ b/components/esp_mm/test_apps/mm/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | diff --git a/components/esp_mm/test_apps/mm/main/CMakeLists.txt b/components/esp_mm/test_apps/mm/main/CMakeLists.txt index dc8881aef7d..6b99509dbe2 100644 --- a/components/esp_mm/test_apps/mm/main/CMakeLists.txt +++ b/components/esp_mm/test_apps/mm/main/CMakeLists.txt @@ -6,9 +6,12 @@ if(CONFIG_SOC_CACHE_WRITEBACK_SUPPORTED) list(APPEND srcs "test_cache_msync.c") endif() +if(CONFIG_SOC_CACHE_FREEZE_SUPPORTED) + list(APPEND srcs "test_cache_utils.c") +endif() # In order for the cases defined by `TEST_CASE` to be linked into the final elf, # the component can be registered as WHOLE_ARCHIVE idf_component_register(SRCS ${srcs} - PRIV_REQUIRES unity esp_partition spi_flash esp_mm driver esp_timer test_mm_utils + PRIV_REQUIRES unity esp_partition spi_flash esp_mm driver esp_timer test_mm_utils test_utils WHOLE_ARCHIVE) diff --git a/components/esp_mm/test_apps/mm/main/idf_component.yml b/components/esp_mm/test_apps/mm/main/idf_component.yml new file mode 100644 index 00000000000..f5001494e21 --- /dev/null +++ b/components/esp_mm/test_apps/mm/main/idf_component.yml @@ -0,0 +1,3 @@ +dependencies: + test_utils: + path: ${IDF_PATH}/tools/unit-test-app/components/test_utils diff --git a/components/esp_mm/test_apps/mm/main/test_cache_utils.c b/components/esp_mm/test_apps/mm/main/test_cache_utils.c new file mode 100644 index 00000000000..70f2529ec39 --- /dev/null +++ b/components/esp_mm/test_apps/mm/main/test_cache_utils.c @@ -0,0 +1,67 @@ +/* + * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD +* +* SPDX-License-Identifier: Apache-2.0 +*/ + +#include +#include +#include "sdkconfig.h" +#include "inttypes.h" +#include "unity.h" +#include "esp_log.h" +#include "esp_attr.h" +#include "esp_cpu.h" +#include "esp_private/esp_cache_private.h" +#include "esp_private/cache_utils.h" +#include "test_utils.h" + +#if !CONFIG_FREERTOS_UNICORE + +#define RECORD_TIME_PREPARE() uint32_t __t1, __t2 +#define RECORD_TIME_START() do {__t1 = esp_cpu_get_cycle_count();} while(0) +#define RECORD_TIME_END(p_time) do{__t2 = esp_cpu_get_cycle_count(); p_time = (__t2 - __t1);} while(0) +#define GET_US_BY_CCOUNT(t) ((double)(t)/CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ) + +static void IRAM_ATTR NOINLINE_ATTR s_test_func_freeze_unfreeze(void) +{ + esp_cache_freeze_caches_disable_interrupts(); + for (int i = 0; i < 100; i++) { + asm volatile("nop"); + } + esp_cache_unfreeze_caches_enable_interrupts(); +} + +static void IRAM_ATTR NOINLINE_ATTR s_test_func_disable_enable(void) +{ + spi_flash_disable_interrupts_caches_and_other_cpu(); + for (int i = 0; i < 100; i++) { + asm volatile("nop"); + } + spi_flash_enable_interrupts_caches_and_other_cpu(); +} + +TEST_CASE("test esp_cache_freeze_caches_disable_interrupts speed", "[cache]") +{ + uint32_t cache_disable_enable_time = 0; + uint32_t cache_freeze_unfreeze_time = 0; + + s_test_func_freeze_unfreeze(); + s_test_func_disable_enable(); + + RECORD_TIME_PREPARE(); + RECORD_TIME_START(); + s_test_func_freeze_unfreeze(); + RECORD_TIME_END(cache_freeze_unfreeze_time); + uint32_t cache_freeze_unfreeze_time_us = GET_US_BY_CCOUNT(cache_freeze_unfreeze_time); + IDF_LOG_PERFORMANCE("Cache freeze time", "cache_freeze_unfreeze_time: %"PRId32" cpu cycles, %"PRId32" us", cache_freeze_unfreeze_time, cache_freeze_unfreeze_time_us); + + RECORD_TIME_START(); + s_test_func_disable_enable(); + RECORD_TIME_END(cache_disable_enable_time); + uint32_t cache_disable_enable_time_us = GET_US_BY_CCOUNT(cache_disable_enable_time); + IDF_LOG_PERFORMANCE("Cache disable time", "cache_disable_enable_time: %"PRId32", cpu cycles, %"PRId32" us", cache_disable_enable_time, cache_disable_enable_time_us); + + TEST_ASSERT(cache_freeze_unfreeze_time < cache_disable_enable_time); +} +#endif // #if !CONFIG_FREERTOS_UNICORE diff --git a/components/esp_mm/test_apps/mmap_hw/README.md b/components/esp_mm/test_apps/mmap_hw/README.md index fb8e4a96b8b..bf47d80ec64 100644 --- a/components/esp_mm/test_apps/mmap_hw/README.md +++ b/components/esp_mm/test_apps/mmap_hw/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | From 3393aa99d1efa9239999894969ed7ba6f0b598be Mon Sep 17 00:00:00 2001 From: Rahul Tank Date: Tue, 3 Jun 2025 17:40:30 +0530 Subject: [PATCH 047/213] fix(nimble): Add fixes for compilation issues in nimble 1. Fix compile failures when CSFCS is 0 2. Wrap BLE service API with extern "C" --- components/bt/host/nimble/nimble | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/host/nimble/nimble b/components/bt/host/nimble/nimble index 0225775e496..cc3ac5416b4 160000 --- a/components/bt/host/nimble/nimble +++ b/components/bt/host/nimble/nimble @@ -1 +1 @@ -Subproject commit 0225775e49669cd4f070400908f73718bddce83b +Subproject commit cc3ac5416b46e6e9363dae357378c03b4975cfdb From e7db79eb46acfa149c1ee5af26ca9a31e523642d Mon Sep 17 00:00:00 2001 From: liqigan Date: Tue, 27 May 2025 11:12:04 +0800 Subject: [PATCH 048/213] docs(bt/bluedroid): Updated HID Device connect API description Closes https://github.com/espressif/esp-idf/issues/16020 --- components/bt/host/bluedroid/api/include/api/esp_hidd_api.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/components/bt/host/bluedroid/api/include/api/esp_hidd_api.h b/components/bt/host/bluedroid/api/include/api/esp_hidd_api.h index 5250779d0d2..f16bbcb0fa8 100644 --- a/components/bt/host/bluedroid/api/include/api/esp_hidd_api.h +++ b/components/bt/host/bluedroid/api/include/api/esp_hidd_api.h @@ -345,6 +345,11 @@ esp_err_t esp_bt_hid_device_unregister_app(void); * called after esp_bt_hid_device_init(). When the operation is complete, the callback function will * be called with ESP_HIDD_OPEN_EVT. * + * @note The connection between the HID Host and the HID Device is established as a virtual cable by default. + * A new HID Host connection request will only be accepted after the previous HID Host has been + * explicitly unplugged. For details on disconnection and virtual cable unplugging, please refer to API + * `esp_bt_hid_device_disconnect` and `esp_bt_hid_device_virtual_cable_unplug`. + * * @param[in] bd_addr: Remote host bluetooth device address. * * @return From 81b2bea2f75c8600afbf26364ce0b80c273e9d6d Mon Sep 17 00:00:00 2001 From: zwl Date: Wed, 11 Jun 2025 11:27:24 +0800 Subject: [PATCH 049/213] feat(ble): add dtm test code to cert test example on ESP32-C6 --- examples/phy/cert_test/README.md | 4 +- examples/phy/cert_test/main/CMakeLists.txt | 10 +- examples/phy/cert_test/main/Kconfig.projbuild | 7 + examples/phy/cert_test/main/cert_test.c | 10 +- examples/phy/cert_test/main/cmd_ble_dtm.c | 189 ++++++++++++++++++ examples/phy/cert_test/main/cmd_ble_dtm.h | 13 ++ .../phy/cert_test/sdkconfig.defaults.esp32c6 | 10 + .../phy/cert_test/sdkconfig.defaults.esp32h2 | 9 + 8 files changed, 246 insertions(+), 6 deletions(-) create mode 100644 examples/phy/cert_test/main/cmd_ble_dtm.c create mode 100644 examples/phy/cert_test/main/cmd_ble_dtm.h create mode 100644 examples/phy/cert_test/sdkconfig.defaults.esp32c6 create mode 100644 examples/phy/cert_test/sdkconfig.defaults.esp32h2 diff --git a/examples/phy/cert_test/README.md b/examples/phy/cert_test/README.md index 748bbba0f09..42c3dc000e1 100644 --- a/examples/phy/cert_test/README.md +++ b/examples/phy/cert_test/README.md @@ -6,7 +6,6 @@ (See the README.md file in the upper level 'examples' directory for more information about examples.) This example shows how to use the Certification test APIS. - ## How to use example Before project configuration and build, be sure to set the correct chip target using `idf.py set-target `. @@ -114,6 +113,9 @@ phy> For BLE test, if you want to use `fcc_le_tx` and `rw_le_rx_per` legacy commands for tx/rx test, you need to enable `ESP_PHY_LEGACY_COMMANDS` in menuconfig, otherwise, the new format commands `esp_ble_tx` and `esp_ble_rx` are supported. +## BLE DTM Test Function + +The BLE DTM test function in this example currently supports only the ESP32-H2 and ESP32-C6 chips. ## Troubleshooting For any technical queries, please open an [issue](https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you soon. diff --git a/examples/phy/cert_test/main/CMakeLists.txt b/examples/phy/cert_test/main/CMakeLists.txt index 4daa8226287..7bb4e0d24f5 100644 --- a/examples/phy/cert_test/main/CMakeLists.txt +++ b/examples/phy/cert_test/main/CMakeLists.txt @@ -1,3 +1,9 @@ -idf_component_register(SRCS "cert_test.c" - "cmd_phy.c" +set(srcs "cert_test.c" + "cmd_phy.c") +if(CONFIG_COMMANDS_ENABLE_BLE_DTM_TEST) +list(APPEND srcs "cmd_ble_dtm.c") +endif() + +idf_component_register(SRCS "${srcs}" + PRIV_REQUIRES bt INCLUDE_DIRS ".") diff --git a/examples/phy/cert_test/main/Kconfig.projbuild b/examples/phy/cert_test/main/Kconfig.projbuild index ce75aded8f9..c751f1a68ab 100644 --- a/examples/phy/cert_test/main/Kconfig.projbuild +++ b/examples/phy/cert_test/main/Kconfig.projbuild @@ -11,4 +11,11 @@ menu "Example Configuration" endchoice + config COMMANDS_ENABLE_BLE_DTM_TEST + bool "Enable BLE DTM Test Mode" + depends on IDF_TARGET_ESP32C6 || IDF_TARGET_ESP32H2 + default n + help + Enable this option to support BLE Direct Test Mode (DTM) for RF testing and validation. + endmenu diff --git a/examples/phy/cert_test/main/cert_test.c b/examples/phy/cert_test/main/cert_test.c index cd8ac2afac1..0c23d7850ef 100644 --- a/examples/phy/cert_test/main/cert_test.c +++ b/examples/phy/cert_test/main/cert_test.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -12,6 +12,9 @@ #include "cmd_phy.h" #include "esp_phy_cert_test.h" +#if CONFIG_COMMANDS_ENABLE_BLE_DTM_TEST +#include "cmd_ble_dtm.h" +#endif void app_main(void) { @@ -20,7 +23,6 @@ void app_main(void) esp_console_repl_t *repl = NULL; esp_console_repl_config_t repl_config = ESP_CONSOLE_REPL_CONFIG_DEFAULT(); repl_config.prompt = "phy>"; - #if CONFIG_ESP_CONSOLE_UART esp_console_dev_uart_config_t uart_config = ESP_CONSOLE_DEV_UART_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_console_new_repl_uart(&uart_config, &repl_config, &repl)); @@ -46,7 +48,9 @@ void app_main(void) esp_phy_rftest_config(1); esp_phy_rftest_init(); #endif - +#if CONFIG_COMMANDS_ENABLE_BLE_DTM_TEST + dtm_configuration_command_register(); +#endif int help_index = 1; printf("\n ==================================================\n"); printf(" | RF certification test |\n"); diff --git a/examples/phy/cert_test/main/cmd_ble_dtm.c b/examples/phy/cert_test/main/cmd_ble_dtm.c new file mode 100644 index 00000000000..90e9d8daf73 --- /dev/null +++ b/examples/phy/cert_test/main/cmd_ble_dtm.c @@ -0,0 +1,189 @@ +/* + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +#include "esp_log.h" +#include "esp_bt.h" + +#include "esp_console.h" +#include "argtable3/argtable3.h" +#include "esp_hci_driver.h" + +#define PROMPT_STR CONFIG_IDF_TARGET +static struct { + struct arg_int *cmd_params; + struct arg_end *end; +} dtm_set_tx_power_cmd_args; + +static struct { + struct arg_int *tx_pin; + struct arg_int *rx_pin; + struct arg_end *end; +} dtm_reconfig_uart_cmd_args; + +static struct { + struct arg_int *cmd_params; + struct arg_end *end; +} dtm_enable_cmd_args; + +static int dtm_set_ble_tx_power_command(int argc, char **argv) +{ + esp_err_t ret = ESP_OK; + int nerrors = arg_parse(argc, argv, (void **) &dtm_set_tx_power_cmd_args); + if (nerrors != 0) { + arg_print_errors(stderr, dtm_set_tx_power_cmd_args.end, argv[0]); + return 1; + } + + if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_ENABLED) { + esp_rom_printf("\nPlease enable BLE DTM mode first by using the command enable_ble_dtm -e 1 before sending this command.\n"); + return 2; + } + + ESP_LOGI(__func__, "Set tx power level '%d'", dtm_set_tx_power_cmd_args.cmd_params->ival[0]); + if (dtm_set_tx_power_cmd_args.cmd_params->ival[0] > 15) { + return 3; + } + + ret = esp_ble_tx_power_set_enhanced(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0, dtm_set_tx_power_cmd_args.cmd_params->ival[0]); + if (ret != ESP_OK) { + return 4; + } + + return 0; +} + +static int dtm_get_ble_tx_power_command(int argc, char **argv) +{ + esp_power_level_t power_level = 0xFF; + if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_ENABLED) { + esp_rom_printf("\nPlease enable BLE DTM mode first by using the command enable_ble_dtm -e 1 before sending this command.\n"); + return 2; + } + + power_level = esp_ble_tx_power_get_enhanced(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0); + esp_rom_printf("\nCurrent BLE TX power is %d level\n", power_level); + return 0; +} + +static int dtm_reconfig_uart_pins_command(int argc, char **argv) +{ + int nerrors = arg_parse(argc, argv, (void **) &dtm_reconfig_uart_cmd_args); + if (nerrors != 0) { + arg_print_errors(stderr, dtm_reconfig_uart_cmd_args.end, argv[0]); + return 1; + } + + if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_ENABLED) { + esp_rom_printf("\nPlease enable BLE DTM mode first by using the command enable_ble_dtm -e 1 before sending this command.\n"); + return 2; + } + + ESP_LOGI(__func__, "reconfig tx:'%d', rx: '%d'", + dtm_reconfig_uart_cmd_args.tx_pin->ival[0], dtm_reconfig_uart_cmd_args.rx_pin->ival[0]); + hci_uart_reconfig_pin(dtm_reconfig_uart_cmd_args.tx_pin->ival[0], + dtm_reconfig_uart_cmd_args.rx_pin->ival[0], -1, -1); + return 0; +} + +static int dtm_test_enable_command(int argc, char **argv) +{ + int dtm_enable = 0; + esp_bt_controller_config_t config_opts = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); + int nerrors = arg_parse(argc, argv, (void **) &dtm_enable_cmd_args); + if (nerrors != 0) { + arg_print_errors(stderr, dtm_enable_cmd_args.end, argv[0]); + return 1; + } + + dtm_enable = dtm_enable_cmd_args.cmd_params->ival[0]; + ESP_LOGI(__func__, "Enable DTM Test '%d'", dtm_enable); + if (dtm_enable > 2) { + return 2; + } + + if (dtm_enable) { + if (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_IDLE) { + /* Initialize Bluetooth Controller parameters. */ + ESP_ERROR_CHECK(esp_bt_controller_init(&config_opts)); + + /* Enable the task stack of the Bluetooth Controller. */ + ESP_ERROR_CHECK(esp_bt_controller_enable(ESP_BT_MODE_BLE)); + } + } else { + if (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_ENABLED) { + ESP_ERROR_CHECK(esp_bt_controller_disable()); + ESP_ERROR_CHECK(esp_bt_controller_deinit()); + } + } + + return 0; +} + +esp_err_t esp_console_register_set_ble_tx_power_command(void) +{ + dtm_set_tx_power_cmd_args.cmd_params = arg_int1("i", "index", "","tx power level index"); + dtm_set_tx_power_cmd_args.end = arg_end(1); + + esp_console_cmd_t command = { + .command = "set_ble_tx_power", + .help = "Set ble tx power during DTM", + .func = &dtm_set_ble_tx_power_command, + .argtable = &dtm_set_tx_power_cmd_args + }; + + return esp_console_cmd_register(&command); +} + +esp_err_t esp_console_register_get_ble_tx_power_command(void) +{ + esp_console_cmd_t command = { + .command = "get_ble_tx_power", + .help = "Get ble tx power during DTM", + .func = &dtm_get_ble_tx_power_command, + }; + + return esp_console_cmd_register(&command); +} + + +esp_err_t esp_console_register_reconfig_dtm_pins_command(void) +{ + dtm_reconfig_uart_cmd_args.tx_pin = arg_int1("t", "tx", "","tx pin index"); + dtm_reconfig_uart_cmd_args.rx_pin = arg_int1("r", "rx", "","rx pin index"); + dtm_reconfig_uart_cmd_args.end = arg_end(2); + + esp_console_cmd_t command = { + .command = "reconfig_dtm_uart_pin", + .help = "Reconfig dtm uart pins during DTM", + .func = &dtm_reconfig_uart_pins_command, + .argtable = &dtm_reconfig_uart_cmd_args + }; + + return esp_console_cmd_register(&command); +} + +esp_err_t esp_console_register_enable_ble_dtm_command(void) +{ + dtm_enable_cmd_args.cmd_params = arg_int1("e", "enable", "","enable/disable ble dtm test"); + dtm_enable_cmd_args.end = arg_end(1); + + esp_console_cmd_t command = { + .command = "enable_ble_dtm", + .help = "Enable BLE DTM Test", + .func = &dtm_test_enable_command, + .argtable = &dtm_enable_cmd_args + }; + + return esp_console_cmd_register(&command); +} + +esp_err_t dtm_configuration_command_register(void) +{ + esp_console_register_set_ble_tx_power_command(); + esp_console_register_get_ble_tx_power_command(); + esp_console_register_reconfig_dtm_pins_command(); + esp_console_register_enable_ble_dtm_command(); + return ESP_OK; +} diff --git a/examples/phy/cert_test/main/cmd_ble_dtm.h b/examples/phy/cert_test/main/cmd_ble_dtm.h new file mode 100644 index 00000000000..b6dc400c156 --- /dev/null +++ b/examples/phy/cert_test/main/cmd_ble_dtm.h @@ -0,0 +1,13 @@ +/* + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +#ifndef __CMD_BLE_DTM_H__ +#define __CMD_BLE_DTM_H__ +#include +#include +#include "esp_err.h" + +esp_err_t dtm_configuration_command_register(void); +#endif diff --git a/examples/phy/cert_test/sdkconfig.defaults.esp32c6 b/examples/phy/cert_test/sdkconfig.defaults.esp32c6 new file mode 100644 index 00000000000..8ae9f0ef3bc --- /dev/null +++ b/examples/phy/cert_test/sdkconfig.defaults.esp32c6 @@ -0,0 +1,10 @@ +# +# ESP32C6-specific +# + +CONFIG_COMMANDS_ENABLE_BLE_DTM_TEST=y +CONFIG_BT_CONTROLLER_ONLY=y +CONFIG_BT_LE_HCI_INTERFACE_USE_UART=y +CONFIG_BT_LE_HCI_UART_TX_PIN=8 +CONFIG_BT_LE_HCI_UART_RX_PIN=9 +CONFIG_BT_LE_HCI_UART_BAUD=115200 diff --git a/examples/phy/cert_test/sdkconfig.defaults.esp32h2 b/examples/phy/cert_test/sdkconfig.defaults.esp32h2 new file mode 100644 index 00000000000..6cc9f6cd96a --- /dev/null +++ b/examples/phy/cert_test/sdkconfig.defaults.esp32h2 @@ -0,0 +1,9 @@ +# +# ESP32C6-specific +# +CONFIG_COMMANDS_ENABLE_BLE_DTM_TEST=y +CONFIG_BT_CONTROLLER_ONLY=y +CONFIG_BT_LE_HCI_INTERFACE_USE_UART=y +CONFIG_BT_LE_HCI_UART_TX_PIN=8 +CONFIG_BT_LE_HCI_UART_RX_PIN=9 +CONFIG_BT_LE_HCI_UART_BAUD=115200 From d57fb88764e07bf014ed6f32490ebe56ba680d35 Mon Sep 17 00:00:00 2001 From: Guillaume Souchere Date: Thu, 12 Jun 2025 08:23:20 +0200 Subject: [PATCH 050/213] change(esp-event): Update the doxygen comment of esp_event_handler_register Add a comment to specify what happens when registering a handler several times to the same event. --- components/esp_event/include/esp_event.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/components/esp_event/include/esp_event.h b/components/esp_event/include/esp_event.h index c1a9d8612f2..cfaf5eefa4f 100644 --- a/components/esp_event/include/esp_event.h +++ b/components/esp_event/include/esp_event.h @@ -118,7 +118,9 @@ esp_err_t esp_event_loop_run(esp_event_loop_handle_t event_loop, TickType_t tick * * Registering multiple handlers to events is possible. Registering a single handler to multiple events is * also possible. However, registering the same handler to the same event multiple times would cause the - * previous registrations to be overwritten. + * overwriting of the event_handler_arg but the handler will be kept at the same position in the list associated + * with the event that triggers it. It means that the call order of registered handlers for that event will remain + * the same. * * @param[in] event_base the base ID of the event to register the handler for * @param[in] event_id the ID of the event to register the handler for From ef0323aeddf478f0a2d75528caad4978ca11617e Mon Sep 17 00:00:00 2001 From: "C.S.M" Date: Mon, 9 Jun 2025 14:14:20 +0800 Subject: [PATCH 051/213] bugfix(jpeg): eliminate random black line on jpeg decoder --- components/esp_driver_jpeg/jpeg_decode.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/components/esp_driver_jpeg/jpeg_decode.c b/components/esp_driver_jpeg/jpeg_decode.c index d940acc3397..c0121b1876c 100644 --- a/components/esp_driver_jpeg/jpeg_decode.c +++ b/components/esp_driver_jpeg/jpeg_decode.c @@ -245,6 +245,10 @@ esp_err_t jpeg_decoder_process(jpeg_decoder_handle_t decoder_engine, const jpeg_ ret = esp_cache_msync((void*)decoder_engine->header_info->buffer_offset, decoder_engine->header_info->buffer_left, ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_UNALIGNED); assert(ret == ESP_OK); + // Before 2DDMA starts, invalidate cache ahead of time. + ret = esp_cache_msync((void*)decoder_engine->decoded_buf, outbuf_size, ESP_CACHE_MSYNC_FLAG_DIR_M2C); + assert(ret == ESP_OK); + ESP_GOTO_ON_ERROR(dma2d_enqueue(decoder_engine->dma2d_group_handle, &trans_desc, decoder_engine->trans_desc), err2, TAG, "enqueue dma2d failed"); bool need_yield; // Blocking for JPEG decode transaction finishes. From 373fe5f0d99d254341fc472c5d40642819bcc3d5 Mon Sep 17 00:00:00 2001 From: "C.S.M" Date: Wed, 21 May 2025 17:54:44 +0800 Subject: [PATCH 052/213] fix(jpeg): Fix wrong parameter in jpeg encoder msync --- components/esp_driver_jpeg/jpeg_encode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esp_driver_jpeg/jpeg_encode.c b/components/esp_driver_jpeg/jpeg_encode.c index 9e9ce47e627..e57d62d25ae 100644 --- a/components/esp_driver_jpeg/jpeg_encode.c +++ b/components/esp_driver_jpeg/jpeg_encode.c @@ -237,7 +237,7 @@ esp_err_t jpeg_encoder_process(jpeg_encoder_handle_t encoder_engine, const jpeg_ memset(encoder_engine->txlink, 0, sizeof(dma2d_descriptor_t)); s_cfg_desc(encoder_engine, encoder_engine->txlink, JPEG_DMA2D_2D_ENABLE, DMA2D_DESCRIPTOR_BLOCK_RW_MODE_MULTIPLE, dma_vb, dma_hb, JPEG_DMA2D_EOF_NOT_LAST, dma2d_desc_pixel_format_to_pbyte_value(picture_format), DMA2D_DESCRIPTOR_BUFFER_OWNER_DMA, encoder_engine->header_info->origin_v, encoder_engine->header_info->origin_h, raw_buffer, NULL); - ret = esp_cache_msync((void*)raw_buffer, encoder_engine->header_info->origin_v * encoder_engine->header_info->origin_h * encoder_engine->bytes_per_pixel, ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_UNALIGNED); + ret = esp_cache_msync((void*)raw_buffer, inbuf_size, ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_UNALIGNED); assert(ret == ESP_OK); dma2d_trans_config_t trans_desc = { From 4ccd76343c5e460f4db58c3bf7f52aff917704ba Mon Sep 17 00:00:00 2001 From: Tomas Rezucha Date: Mon, 16 Jun 2025 13:23:23 +0200 Subject: [PATCH 053/213] docs(usb): Update ESP32-P4 USB pins to MP version Closes https://github.com/espressif/esp-idf/issues/16136 --- examples/peripherals/usb/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/peripherals/usb/README.md b/examples/peripherals/usb/README.md index b7bbe883601..30a6320fe71 100644 --- a/examples/peripherals/usb/README.md +++ b/examples/peripherals/usb/README.md @@ -22,7 +22,7 @@ ESP BOARD USB CONNECTOR (type A) | | USB_DP | USB_DM | | ------------ | ------ | ------ | | ESP32-S2/S3 | GPIO20 | GPIO19 | -| ESP32-P4 2.0 | pin 51 | pin 50 | +| ESP32-P4 2.0 | pin 50 | pin 49 | | ESP32-P4 1.1 | GPIO27 | GPIO26 | > Note: On the ESP32-P4, the USB 2.0 PHY pins are dedicated to USB-OTG functionality and cannot be used as general-purpose GPIOs. From c658f460b78f38c67dee727677df89c38f5c6c62 Mon Sep 17 00:00:00 2001 From: Sergei Silnov Date: Sat, 14 Jun 2025 14:58:51 +0200 Subject: [PATCH 054/213] ci: Use new release-zips-action with shallow history --- .github/workflows/release_zips.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release_zips.yml b/.github/workflows/release_zips.yml index a88dd90128e..9e9a013f682 100644 --- a/.github/workflows/release_zips.yml +++ b/.github/workflows/release_zips.yml @@ -11,7 +11,8 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Create a recursive clone source zip - uses: espressif/github-actions/release_zips@master - env: - RELEASE_PROJECT_NAME: ESP-IDF - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + uses: espressif/release-zips-action@v1 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + release_project_name: ESP-IDF + git_extra_args: --shallow-since="1 year ago" From b13ade8e0c122033cbe75ac3ec3583f4a041f837 Mon Sep 17 00:00:00 2001 From: Guillaume Souchere Date: Thu, 29 May 2025 13:30:19 +0200 Subject: [PATCH 055/213] fix(driver): remove unecessary if conditions in the read function This changes affect usb_serial_jtag_vfs and cdcacm_vfs read functions. This commit removes the exit condition on reception of \n character. --- .../esp_driver_usb_serial_jtag/src/usb_serial_jtag_vfs.c | 3 --- components/esp_vfs_console/vfs_cdcacm.c | 3 --- 2 files changed, 6 deletions(-) diff --git a/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag_vfs.c b/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag_vfs.c index d24ef0c3519..e0a169f9fa9 100644 --- a/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag_vfs.c +++ b/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag_vfs.c @@ -257,9 +257,6 @@ static ssize_t usb_serial_jtag_read(int fd, void* data, size_t size) } data_c[received] = (char) c; ++received; - if (c == '\n') { - break; - } } _lock_release_recursive(&s_ctx.read_lock); if (received > 0) { diff --git a/components/esp_vfs_console/vfs_cdcacm.c b/components/esp_vfs_console/vfs_cdcacm.c index 3402e342200..65dca2aa6ec 100644 --- a/components/esp_vfs_console/vfs_cdcacm.c +++ b/components/esp_vfs_console/vfs_cdcacm.c @@ -196,9 +196,6 @@ static ssize_t cdcacm_read(int fd, void *data, size_t size) break; } data_c[received++] = (char) c; - if (c == '\n') { - break; - } } } _lock_release_recursive(&s_read_lock); From 0650ee6900818be66f6d009a24e200d8560bd8f6 Mon Sep 17 00:00:00 2001 From: Guillaume Souchere Date: Tue, 3 Jun 2025 13:56:25 +0200 Subject: [PATCH 056/213] feat(usb_serial_tag_vfs): Add test for read exit conditions Add a test to make sure the VFS read does not return on reception of the \n character --- .../src/usb_serial_jtag_vfs.c | 2 + .../main/test_vfs_usb_serial_jtag.c | 61 ++++++++++++++++--- .../pytest_usb_serial_jtag_vfs.py | 21 ++++++- .../usb_cdc_vfs/main/test_app_main.c | 48 +++++++++++++++ .../usb_cdc_vfs/pytest_usb_cdc_vfs.py | 5 ++ 5 files changed, 129 insertions(+), 8 deletions(-) diff --git a/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag_vfs.c b/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag_vfs.c index e0a169f9fa9..9bbcbc3e88a 100644 --- a/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag_vfs.c +++ b/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag_vfs.c @@ -226,9 +226,11 @@ static void usb_serial_jtag_return_char(int fd, int c) static ssize_t usb_serial_jtag_read(int fd, void* data, size_t size) { + assert(fd == USJ_LOCAL_FD); char *data_c = (char *) data; size_t received = 0; _lock_acquire_recursive(&s_ctx.read_lock); + while (received < size) { int c = usb_serial_jtag_read_char(fd); if (c == '\r') { diff --git a/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/main/test_vfs_usb_serial_jtag.c b/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/main/test_vfs_usb_serial_jtag.c index c349aab14c1..9c418c57fed 100644 --- a/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/main/test_vfs_usb_serial_jtag.c +++ b/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/main/test_vfs_usb_serial_jtag.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -23,11 +23,6 @@ #include "test_utils.h" #include "sdkconfig.h" -struct task_arg_t { - FILE* stream; - SemaphoreHandle_t done; -}; - static int read_bytes_with_select(FILE *stream, void *buf, size_t buf_len, struct timeval tv) { @@ -74,7 +69,7 @@ static int read_bytes_with_select(FILE *stream, void *buf, size_t buf_len, struc * write calls. At the end of the test, the variable is check to make sure the select returned * for each of the write calls. */ -TEST_CASE("test select read, write and timeout", "[usb_serial_jtag]") +TEST_CASE("test select read, write and timeout", "[usb_serial_jtag vfs]") { struct timeval tv; tv.tv_sec = 1; @@ -128,3 +123,55 @@ TEST_CASE("test select read, write and timeout", "[usb_serial_jtag]") usb_serial_jtag_vfs_use_nonblocking(); usb_serial_jtag_driver_uninstall(); } + +TEST_CASE("read with usj driver (non-blocking)", "[usb serial jtag vfs]") +{ + // Send a string with length less than the read requested length + const char in_buffer[] = "!(@*#&(!*@&#((SDasdkjhad\nce"; // read should not early return on \n + const size_t in_buffer_len = sizeof(in_buffer); + + const size_t out_buffer_len = in_buffer_len - 1; // don't compare the null character at the end of in_buffer string + char out_buffer[out_buffer_len] = {}; + + // flush_stdin_stdout(); + + usb_serial_jtag_driver_config_t usj_config = USB_SERIAL_JTAG_DRIVER_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(usb_serial_jtag_driver_install(&usj_config)); + usb_serial_jtag_vfs_use_driver(); + + usb_serial_jtag_vfs_set_rx_line_endings(ESP_LINE_ENDINGS_LF); + usb_serial_jtag_vfs_set_tx_line_endings(ESP_LINE_ENDINGS_LF); + + int flags = fcntl(STDIN_FILENO, F_GETFL, 0); + fcntl(STDIN_FILENO, F_SETFL, flags | O_NONBLOCK); + + // trigger the test environment to send the test message + char ready_msg[] = "ready to receive\n"; + write(fileno(stdout), ready_msg, sizeof(ready_msg)); + + // wait for the string to be sent and buffered + vTaskDelay(pdMS_TO_TICKS(500)); + + char *out_buffer_ptr = out_buffer; + size_t bytes_read = 0; + do { + int nread = read(STDIN_FILENO, out_buffer_ptr, out_buffer_len); + printf("%d\n", nread); + if (nread > 0) { + out_buffer_ptr += nread; + bytes_read += nread; + } + } while (bytes_read < in_buffer_len); + + // string compare + for (size_t i = 0; i < out_buffer_len; i++) { + TEST_ASSERT_EQUAL(in_buffer[i], out_buffer[i]); + } + + usb_serial_jtag_vfs_use_nonblocking(); + fcntl(STDIN_FILENO, F_SETFL, flags); + usb_serial_jtag_vfs_set_rx_line_endings(ESP_LINE_ENDINGS_CRLF); + usb_serial_jtag_vfs_set_tx_line_endings(ESP_LINE_ENDINGS_CRLF); + ESP_ERROR_CHECK(usb_serial_jtag_driver_uninstall()); + vTaskDelay(2); // wait for tasks to exit +} diff --git a/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/pytest_usb_serial_jtag_vfs.py b/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/pytest_usb_serial_jtag_vfs.py index 897f3179eec..c8a7f07e44b 100644 --- a/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/pytest_usb_serial_jtag_vfs.py +++ b/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/pytest_usb_serial_jtag_vfs.py @@ -16,10 +16,29 @@ from pytest_embedded import Dut ], indirect=True,) @pytest.mark.parametrize('test_message', ['test123456789!@#%^&*']) -def test_usj_vfs_release(dut: Dut, test_message: list) -> None: +@idf_parametrize('target', ['esp32s3', 'esp32c3', 'esp32c6', 'esp32h2'], indirect=['target']) +def test_usj_vfs_select(dut: Dut, test_message: list) -> None: dut.expect_exact('Press ENTER to see the list of tests') dut.write('\"test select read, write and timeout\"') dut.expect_exact('select timed out', timeout=2) dut.write(test_message) dut.expect_exact(test_message, timeout=2) dut.expect(r'\d{1} Tests 0 Failures 0 Ignored', timeout=10) + + +@pytest.mark.usb_serial_jtag +@pytest.mark.parametrize( + 'port, config', + [ + pytest.param('/dev/ttyACM1', 'release'), + ], + indirect=True, +) +@pytest.mark.parametrize('test_message', ['!(@*#&(!*@&#((SDasdkjhad\nce']) +@idf_parametrize('target', ['esp32s3', 'esp32c3', 'esp32c6', 'esp32h2'], indirect=['target']) +def test_usj_vfs_read(dut: Dut, test_message: list) -> None: + dut.expect_exact('Press ENTER to see the list of tests') + dut.write('"read with usj driver (non-blocking)"') + dut.expect_exact('ready to receive', timeout=2) + dut.write(test_message) + dut.expect(r'\d{1} Tests 0 Failures 0 Ignored', timeout=10) diff --git a/components/esp_vfs_console/test_apps/usb_cdc_vfs/main/test_app_main.c b/components/esp_vfs_console/test_apps/usb_cdc_vfs/main/test_app_main.c index 4e0b84d5bb0..e4372bb38d2 100644 --- a/components/esp_vfs_console/test_apps/usb_cdc_vfs/main/test_app_main.c +++ b/components/esp_vfs_console/test_apps/usb_cdc_vfs/main/test_app_main.c @@ -86,7 +86,55 @@ static void test_usb_cdc_read_non_blocking(void) TEST_ASSERT(errno != EWOULDBLOCK); } +static void test_usb_cdc_read_no_exit_on_newline_reception(void) +{ + test_setup(__func__, sizeof(__func__)); + + // Send a string with length less than the read requested length + const char in_buffer[] = "!(@*#&(!*@&#((SDasdkjhad\nce"; // read should not early return on \n + const size_t in_buffer_len = sizeof(in_buffer); + + const size_t out_buffer_len = in_buffer_len - 1; // don't compare the null character at the end of in_buffer string + char out_buffer[out_buffer_len] = {}; + + ESP_ERROR_CHECK(esp_vfs_dev_cdcacm_register()); + + esp_vfs_dev_cdcacm_set_rx_line_endings(ESP_LINE_ENDINGS_LF); + esp_vfs_dev_cdcacm_set_tx_line_endings(ESP_LINE_ENDINGS_LF); + + int flags = fcntl(STDIN_FILENO, F_GETFL, 0); + fcntl(STDIN_FILENO, F_SETFL, flags | O_NONBLOCK); + + // trigger the test environment to send the test message + char ready_msg[] = "ready to receive\n"; + write(fileno(stdout), ready_msg, sizeof(ready_msg)); + + // wait for the string to be sent and buffered + vTaskDelay(pdMS_TO_TICKS(500)); + + char *out_buffer_ptr = out_buffer; + size_t bytes_read = 0; + do { + int nread = read(STDIN_FILENO, out_buffer_ptr, out_buffer_len); + if (nread > 0) { + out_buffer_ptr += nread; + bytes_read += nread; + } + } while (bytes_read < in_buffer_len); + + // string compare + for (size_t i = 0; i < out_buffer_len; i++) { + TEST_ASSERT_EQUAL(in_buffer[i], out_buffer[i]); + } + + fcntl(STDIN_FILENO, F_SETFL, flags); + esp_vfs_dev_cdcacm_set_rx_line_endings(ESP_LINE_ENDINGS_CRLF); + esp_vfs_dev_cdcacm_set_tx_line_endings(ESP_LINE_ENDINGS_CRLF); + vTaskDelay(2); // wait for tasks to exit +} + void app_main(void) { test_usb_cdc_read_non_blocking(); + test_usb_cdc_read_no_exit_on_newline_reception(); } diff --git a/components/esp_vfs_console/test_apps/usb_cdc_vfs/pytest_usb_cdc_vfs.py b/components/esp_vfs_console/test_apps/usb_cdc_vfs/pytest_usb_cdc_vfs.py index b462d0f8b29..0e1cde5cbc8 100644 --- a/components/esp_vfs_console/test_apps/usb_cdc_vfs/pytest_usb_cdc_vfs.py +++ b/components/esp_vfs_console/test_apps/usb_cdc_vfs/pytest_usb_cdc_vfs.py @@ -18,3 +18,8 @@ def test_usb_cdc_vfs_default(dut: Dut, test_message: str) -> None: dut.expect_exact('test_usb_cdc_read_non_blocking', timeout=2) dut.expect_exact('send_bytes', timeout=2) dut.write('abcdefgh') + + # test run: test_usb_cdc_read_no_exit_on_newline_reception + dut.expect_exact('test_usb_cdc_read_no_exit_on_newline_reception', timeout=2) + dut.expect_exact('ready to receive', timeout=2) + dut.write('!(@*#&(!*@&#((SDasdkjhad\nce') From fd1103d39c16a215b6846da207e77053338621e8 Mon Sep 17 00:00:00 2001 From: Guillaume Souchere Date: Thu, 5 Jun 2025 12:15:53 +0200 Subject: [PATCH 057/213] feat(usb_cdc): Update vfs read() to comply with POSIX standards --- .../main/test_vfs_usb_serial_jtag.c | 37 ++++++- .../pytest_usb_serial_jtag_vfs.py | 24 ++++- .../usb_cdc_vfs/main/test_app_main.c | 99 +++++++++++++++++++ .../usb_cdc_vfs/pytest_usb_cdc_vfs.py | 5 + components/esp_vfs_console/vfs_cdcacm.c | 35 +++---- 5 files changed, 174 insertions(+), 26 deletions(-) diff --git a/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/main/test_vfs_usb_serial_jtag.c b/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/main/test_vfs_usb_serial_jtag.c index 9c418c57fed..4e305baa87b 100644 --- a/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/main/test_vfs_usb_serial_jtag.c +++ b/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/main/test_vfs_usb_serial_jtag.c @@ -124,7 +124,9 @@ TEST_CASE("test select read, write and timeout", "[usb_serial_jtag vfs]") usb_serial_jtag_driver_uninstall(); } -TEST_CASE("read with usj driver (non-blocking)", "[usb serial jtag vfs]") +/* Test that the read function does not return prematurely when receiving a new line character + */ +TEST_CASE("read does not return on new line character", "[usb serial jtag vfs]") { // Send a string with length less than the read requested length const char in_buffer[] = "!(@*#&(!*@&#((SDasdkjhad\nce"; // read should not early return on \n @@ -133,8 +135,6 @@ TEST_CASE("read with usj driver (non-blocking)", "[usb serial jtag vfs]") const size_t out_buffer_len = in_buffer_len - 1; // don't compare the null character at the end of in_buffer string char out_buffer[out_buffer_len] = {}; - // flush_stdin_stdout(); - usb_serial_jtag_driver_config_t usj_config = USB_SERIAL_JTAG_DRIVER_CONFIG_DEFAULT(); ESP_ERROR_CHECK(usb_serial_jtag_driver_install(&usj_config)); usb_serial_jtag_vfs_use_driver(); @@ -175,3 +175,34 @@ TEST_CASE("read with usj driver (non-blocking)", "[usb serial jtag vfs]") ESP_ERROR_CHECK(usb_serial_jtag_driver_uninstall()); vTaskDelay(2); // wait for tasks to exit } + +TEST_CASE("blocking read returns with available data", "[usb serial jtag vfs]") +{ + const size_t out_buffer_len = 32; + char out_buffer[out_buffer_len] = {}; + + usb_serial_jtag_driver_config_t usj_config = USB_SERIAL_JTAG_DRIVER_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(usb_serial_jtag_driver_install(&usj_config)); + usb_serial_jtag_vfs_use_driver(); + + usb_serial_jtag_vfs_set_rx_line_endings(ESP_LINE_ENDINGS_LF); + usb_serial_jtag_vfs_set_tx_line_endings(ESP_LINE_ENDINGS_LF); + + int flags = fcntl(STDIN_FILENO, F_GETFL, 0); + fcntl(STDIN_FILENO, F_SETFL, flags & (~O_NONBLOCK)); + + // trigger the test environment to send the test message + char ready_msg[] = "ready to receive\n"; + write(fileno(stdout), ready_msg, sizeof(ready_msg)); + + const int nread = read(STDIN_FILENO, out_buffer, out_buffer_len); + TEST_ASSERT(nread > 0); + TEST_ASSERT(nread < out_buffer_len); + + usb_serial_jtag_vfs_use_nonblocking(); + fcntl(STDIN_FILENO, F_SETFL, flags); + usb_serial_jtag_vfs_set_rx_line_endings(ESP_LINE_ENDINGS_CRLF); + usb_serial_jtag_vfs_set_tx_line_endings(ESP_LINE_ENDINGS_CRLF); + ESP_ERROR_CHECK(usb_serial_jtag_driver_uninstall()); + vTaskDelay(2); // wait for tasks to exit +} diff --git a/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/pytest_usb_serial_jtag_vfs.py b/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/pytest_usb_serial_jtag_vfs.py index c8a7f07e44b..a66afd6b44a 100644 --- a/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/pytest_usb_serial_jtag_vfs.py +++ b/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/pytest_usb_serial_jtag_vfs.py @@ -28,9 +28,9 @@ def test_usj_vfs_select(dut: Dut, test_message: list) -> None: @pytest.mark.usb_serial_jtag @pytest.mark.parametrize( - 'port, config', + 'port, flash_port, config', [ - pytest.param('/dev/ttyACM1', 'release'), + pytest.param('/dev/serial_ports/ttyACM-esp32', '/dev/serial_ports/ttyUSB-esp32', 'release'), ], indirect=True, ) @@ -38,7 +38,25 @@ def test_usj_vfs_select(dut: Dut, test_message: list) -> None: @idf_parametrize('target', ['esp32s3', 'esp32c3', 'esp32c6', 'esp32h2'], indirect=['target']) def test_usj_vfs_read(dut: Dut, test_message: list) -> None: dut.expect_exact('Press ENTER to see the list of tests') - dut.write('"read with usj driver (non-blocking)"') + dut.write('"read does not return on new line character"') + dut.expect_exact('ready to receive', timeout=2) + dut.write(test_message) + dut.expect(r'\d{1} Tests 0 Failures 0 Ignored', timeout=10) + + +@pytest.mark.usb_serial_jtag +@pytest.mark.parametrize( + 'port, flash_port, config', + [ + pytest.param('/dev/serial_ports/ttyACM-esp32', '/dev/serial_ports/ttyUSB-esp32', 'release'), + ], + indirect=True, +) +@pytest.mark.parametrize('test_message', ['testdata']) +@idf_parametrize('target', ['esp32s3', 'esp32c3', 'esp32c6', 'esp32h2'], indirect=['target']) +def test_usj_vfs_read(dut: Dut, test_message: list) -> None: + dut.expect_exact('Press ENTER to see the list of tests') + dut.write('"blocking read returns with available data"') dut.expect_exact('ready to receive', timeout=2) dut.write(test_message) dut.expect(r'\d{1} Tests 0 Failures 0 Ignored', timeout=10) diff --git a/components/esp_vfs_console/test_apps/usb_cdc_vfs/main/test_app_main.c b/components/esp_vfs_console/test_apps/usb_cdc_vfs/main/test_app_main.c index e4372bb38d2..92441a08340 100644 --- a/components/esp_vfs_console/test_apps/usb_cdc_vfs/main/test_app_main.c +++ b/components/esp_vfs_console/test_apps/usb_cdc_vfs/main/test_app_main.c @@ -40,6 +40,63 @@ static bool wait_for_read_ready(FILE *stream) } } +static void test_usb_cdc_select(void) +{ + test_setup(__func__, sizeof(__func__)); + + struct timeval tv; + tv.tv_sec = 1; + tv.tv_usec = 0; + char out_buffer[32]; + memset(out_buffer, 0, sizeof(out_buffer)); + size_t out_buffer_len = sizeof(out_buffer); + + // stdin needs to be non blocking to properly call read after select returns + // with read ready on stdin. + int fd = fileno(stdin); + int flags = fcntl(fd, F_GETFL); + flags |= O_NONBLOCK; + int res = fcntl(fd, F_SETFL, flags); + TEST_ASSERT(res == 0); + + // init driver + // ESP_ERROR_CHECK(esp_usb_console_init()); + // esp_vfs_dev_cdcacm_register(); + + // send the message from pytest environment and make sure it can be read + bool message_received = false; + size_t char_read = 0; + while (!message_received && out_buffer_len > char_read) { + int nread = read_bytes_with_select(stdin, out_buffer + char_read, out_buffer_len - char_read, &tv); + if (nread > 0) { + char_read += nread; + if (out_buffer[char_read - 1] == '\n') { + message_received = true; + } + } else if (nread == -2) { + // time out occurred, send the expected message back to the testing + // environment to trigger the testing environment into sending the + // test message. don't update this message without updating the pytest + // function since the string is expected as is by the test environment + char timeout_msg[] = "select timed out\n"; + write(fileno(stdout), timeout_msg, sizeof(timeout_msg)); + flush_write(); + } else { + break; + } + } + + // write the received message back to the test environment. The test + // environment will check that the message received matches the one sent + write(fileno(stdout), out_buffer, char_read); + flush_write(); + + vTaskDelay(10); // wait for the string to send +} + +/** + * @brief Test that the non blocking read is compliant with POSIX standards + */ static void test_usb_cdc_read_non_blocking(void) { test_setup(__func__, sizeof(__func__)); @@ -86,6 +143,44 @@ static void test_usb_cdc_read_non_blocking(void) TEST_ASSERT(errno != EWOULDBLOCK); } +/** + * @brief Test that the blocking read will return with the available + * data even if the size is less than the requested size. + */ +static void test_usb_cdc_read_blocking(void) +{ + test_setup(__func__, sizeof(__func__)); + + const size_t out_buffer_len = 32; + char out_buffer[out_buffer_len] = {}; + + ESP_ERROR_CHECK(esp_vfs_dev_cdcacm_register()); + + esp_vfs_dev_cdcacm_set_rx_line_endings(ESP_LINE_ENDINGS_LF); + esp_vfs_dev_cdcacm_set_tx_line_endings(ESP_LINE_ENDINGS_LF); + + /* make sure blocking mode is enabled */ + int flags = fcntl(STDIN_FILENO, F_GETFL, 0); + fcntl(STDIN_FILENO, F_SETFL, flags & (~O_NONBLOCK)); + + // trigger the test environment to send the test message + char ready_msg[] = "ready to receive\n"; + write(fileno(stdout), ready_msg, sizeof(ready_msg)); + + const int nread = read(STDIN_FILENO, out_buffer, out_buffer_len); + TEST_ASSERT(nread > 0); + TEST_ASSERT(nread < out_buffer_len); + + fcntl(STDIN_FILENO, F_SETFL, flags); + esp_vfs_dev_cdcacm_set_rx_line_endings(ESP_LINE_ENDINGS_CRLF); + esp_vfs_dev_cdcacm_set_tx_line_endings(ESP_LINE_ENDINGS_CRLF); + vTaskDelay(2); // wait for tasks to exit +} + +/** + * @brief Test that the read function does not prematurely return + * on reception of new line character. + */ static void test_usb_cdc_read_no_exit_on_newline_reception(void) { test_setup(__func__, sizeof(__func__)); @@ -133,8 +228,12 @@ static void test_usb_cdc_read_no_exit_on_newline_reception(void) vTaskDelay(2); // wait for tasks to exit } +/* Always make sure that the function calling sequence in the main + * function matches the expected order in the pytest function. + */ void app_main(void) { test_usb_cdc_read_non_blocking(); + test_usb_cdc_read_blocking(); test_usb_cdc_read_no_exit_on_newline_reception(); } diff --git a/components/esp_vfs_console/test_apps/usb_cdc_vfs/pytest_usb_cdc_vfs.py b/components/esp_vfs_console/test_apps/usb_cdc_vfs/pytest_usb_cdc_vfs.py index 0e1cde5cbc8..0403a5e8fd0 100644 --- a/components/esp_vfs_console/test_apps/usb_cdc_vfs/pytest_usb_cdc_vfs.py +++ b/components/esp_vfs_console/test_apps/usb_cdc_vfs/pytest_usb_cdc_vfs.py @@ -19,6 +19,11 @@ def test_usb_cdc_vfs_default(dut: Dut, test_message: str) -> None: dut.expect_exact('send_bytes', timeout=2) dut.write('abcdefgh') + # test run: test_usb_cdc_read_blocking + dut.expect_exact('test_usb_cdc_read_blocking', timeout=2) + dut.expect_exact('ready to receive', timeout=2) + dut.write('testdata') + # test run: test_usb_cdc_read_no_exit_on_newline_reception dut.expect_exact('test_usb_cdc_read_no_exit_on_newline_reception', timeout=2) dut.expect_exact('ready to receive', timeout=2) diff --git a/components/esp_vfs_console/vfs_cdcacm.c b/components/esp_vfs_console/vfs_cdcacm.c index 65dca2aa6ec..b210b035b3a 100644 --- a/components/esp_vfs_console/vfs_cdcacm.c +++ b/components/esp_vfs_console/vfs_cdcacm.c @@ -146,13 +146,16 @@ static void cdcacm_return_char(int c) static ssize_t cdcacm_read(int fd, void *data, size_t size) { - assert(fd == 0); + assert(fd == USB_CDC_LOCAL_FD); char *data_c = (char *) data; ssize_t received = 0; _lock_acquire_recursive(&s_read_lock); if (s_blocking) { - while (cdcacm_data_length_in_buffer() < size) { + /* in blocking mode, wait for data. by the POSIX standards, + * the amount of available bytes does not need to match the + * requested size to return */ + while (cdcacm_data_length_in_buffer() <= 0) { xSemaphoreTake(s_rx_semaphore, portMAX_DELAY); } } else { @@ -161,21 +164,12 @@ static ssize_t cdcacm_read(int fd, void *data, size_t size) size = MIN(size, cdcacm_data_length_in_buffer()); } - if (s_rx_mode == ESP_LINE_ENDINGS_CR || s_rx_mode == ESP_LINE_ENDINGS_LF) { - /* This is easy. Just receive, and if needed replace \r by \n. */ - received = esp_usb_console_read_buf(data_c, size); - if (s_rx_mode == ESP_LINE_ENDINGS_CR) { - /* Change CRs to newlines */ - for (ssize_t i = 0; i < received; i++) { - if (data_c[i] == '\r') { - data_c[i] = '\n'; - } - } - } - } else { - while (received < size) { - int c = cdcacm_read_char(); - if (c == '\r') { + while (received < size) { + int c = cdcacm_read_char(); + if (c == '\r') { + if (s_rx_mode == ESP_LINE_ENDINGS_CR) { + c = '\n'; + } else if (s_rx_mode == ESP_LINE_ENDINGS_CRLF) { /* look ahead */ int c2 = cdcacm_read_char(); if (c2 == NONE) { @@ -192,11 +186,12 @@ static ssize_t cdcacm_read(int fd, void *data, size_t size) */ cdcacm_return_char(c2); } - } else if (c == NONE) { - break; } - data_c[received++] = (char) c; + + } else if (c == NONE) { + break; } + data_c[received++] = (char) c; } _lock_release_recursive(&s_read_lock); if (received > 0) { From 3a1f8ffd9bc151577bbd800e5d0d1e3d646ce5e4 Mon Sep 17 00:00:00 2001 From: Tan Yan Quan Date: Fri, 6 Jun 2025 12:26:44 +0800 Subject: [PATCH 058/213] fix(openthread): disable rx_abort events in next operation --- components/ieee802154/driver/esp_ieee802154_dev.c | 1 + 1 file changed, 1 insertion(+) diff --git a/components/ieee802154/driver/esp_ieee802154_dev.c b/components/ieee802154/driver/esp_ieee802154_dev.c index c6b7868f9c9..c40505578a2 100644 --- a/components/ieee802154/driver/esp_ieee802154_dev.c +++ b/components/ieee802154/driver/esp_ieee802154_dev.c @@ -385,6 +385,7 @@ static IRAM_ATTR void next_operation(void) #if !CONFIG_IEEE802154_TEST if (s_pending_tx.frame) { // Here the driver needs to recover the setting of rx aborts, see function `ieee802154_transmit`. + ieee802154_ll_disable_rx_abort_events(IEEE802154_RX_ABORT_ALL); ieee802154_ll_enable_rx_abort_events(BIT(IEEE802154_RX_ABORT_BY_TX_ACK_TIMEOUT - 1) | BIT(IEEE802154_RX_ABORT_BY_TX_ACK_COEX_BREAK - 1)); // Clear the RX abort event again for avoiding the risk if there are still some rx abort events created after last isr process. ieee802154_ll_clear_events(IEEE802154_EVENT_RX_ABORT); From 7f94080c3bca36631f1c7f97434b60deb3845882 Mon Sep 17 00:00:00 2001 From: Xu Si Yu Date: Tue, 3 Jun 2025 16:29:46 +0800 Subject: [PATCH 059/213] feat(openthread): add some configurations in Kconfig --- components/openthread/Kconfig | 12 +++- .../openthread-core-esp32x-ftd-config.h | 62 +++++++++++++++++++ 2 files changed, 71 insertions(+), 3 deletions(-) diff --git a/components/openthread/Kconfig b/components/openthread/Kconfig index bca02ec1fb2..54ecce875a2 100644 --- a/components/openthread/Kconfig +++ b/components/openthread/Kconfig @@ -320,8 +320,8 @@ menu "OpenThread" config OPENTHREAD_RX_ON_WHEN_IDLE bool "Enable OpenThread radio capability rx on when idle" - default y if !ESP_COEX_SW_COEXIST_ENABLE - default n if ESP_COEX_SW_COEXIST_ENABLE + default y if !ESP_COEX_SW_COEXIST_ENABLE && !ESP_COEX_EXTERNAL_COEXIST_ENABLE + default n if ESP_COEX_SW_COEXIST_ENABLE || ESP_COEX_EXTERNAL_COEXIST_ENABLE help Select this option to enable OpenThread radio capability rx on when idle. Do not support this feature when SW coexistence is enabled. @@ -343,7 +343,7 @@ menu "OpenThread" RSS to its current parent every periodically and starts a parent search process if the average RSS is below OPENTHREAD_PARENT_SEARCH_RSS_THRESHOLD. This feature is always enabled for FTDs. menu "Parent Search Configurations" - depends on OPENTHREAD_PARENT_SEARCH_MTD + depends on OPENTHREAD_PARENT_SEARCH_MTD || OPENTHREAD_FTD config OPENTHREAD_PARENT_SEARCH_CHECK_INTERVAL_MINS int "The interval in minutes for a child to check the trigger condition to perform a parent search" default 9 @@ -353,6 +353,12 @@ menu "OpenThread" config OPENTHREAD_PARENT_SEARCH_RSS_THRESHOLD int "The RSS threshold used to trigger a parent search" default -65 + config OPENTHREAD_PARENT_SEARCH_RESELECT_TIMEOUT_MINS + int "The parent reselect timeout duration in minutes used on FTD child devices" + default 90 + config OPENTHREAD_PARENT_SEARCH_RSS_MARGIN + int "The RSS margin over the current parent RSS used on FTD child devices" + default 7 endmenu menu "Thread Memory Allocation" diff --git a/components/openthread/private_include/openthread-core-esp32x-ftd-config.h b/components/openthread/private_include/openthread-core-esp32x-ftd-config.h index 57e19977d0c..6e62ee5f390 100644 --- a/components/openthread/private_include/openthread-core-esp32x-ftd-config.h +++ b/components/openthread/private_include/openthread-core-esp32x-ftd-config.h @@ -382,6 +382,68 @@ #define OPENTHREAD_CONFIG_BORDER_AGENT_ENABLE 0 #endif +/** + * @def OPENTHREAD_CONFIG_PARENT_SEARCH_CHECK_INTERVAL + * + * Specifies the interval in seconds for a child to check the trigger condition to perform a parent search. + * + * Applicable only if periodic parent search feature is enabled (see `OPENTHREAD_CONFIG_PARENT_SEARCH_ENABLE`). + */ +#ifdef OPENTHREAD_CONFIG_PARENT_SEARCH_CHECK_INTERVAL +#error `OPENTHREAD_CONFIG_PARENT_SEARCH_CHECK_INTERVAL` is redefined. +#endif +#define OPENTHREAD_CONFIG_PARENT_SEARCH_CHECK_INTERVAL CONFIG_OPENTHREAD_PARENT_SEARCH_CHECK_INTERVAL_MINS * 60 + +/** + * @def OPENTHREAD_CONFIG_PARENT_SEARCH_BACKOFF_INTERVAL + * + * Specifies the backoff interval in seconds for a child to not perform a parent search after triggering one. This is + * used when device is an MTD child. + * + * Applicable only if periodic parent search feature is enabled (see `OPENTHREAD_CONFIG_PARENT_SEARCH_ENABLE`). + */ +#ifdef OPENTHREAD_CONFIG_PARENT_SEARCH_BACKOFF_INTERVAL +#error `OPENTHREAD_CONFIG_PARENT_SEARCH_BACKOFF_INTERVAL` is redefined. +#endif +#define OPENTHREAD_CONFIG_PARENT_SEARCH_BACKOFF_INTERVAL CONFIG_OPENTHREAD_PARENT_SEARCH_BACKOFF_INTERVAL_MINS * 60 + +/** + * @def OPENTHREAD_CONFIG_PARENT_SEARCH_RSS_THRESHOLD + * + * Specifies the RSS threshold used to trigger a parent search. + * + * Applicable only if periodic parent search feature is enabled (see `OPENTHREAD_CONFIG_PARENT_SEARCH_ENABLE`). + */ +#ifdef OPENTHREAD_CONFIG_PARENT_SEARCH_RSS_THRESHOLD +#error `OPENTHREAD_CONFIG_PARENT_SEARCH_RSS_THRESHOLD` is redefined. +#endif +#define OPENTHREAD_CONFIG_PARENT_SEARCH_RSS_THRESHOLD CONFIG_OPENTHREAD_PARENT_SEARCH_RSS_THRESHOLD + +/** + * @def OPENTHREAD_CONFIG_PARENT_SEARCH_RESELECT_TIMEOUT + * + * Specifies parent reselect timeout duration in seconds used on FTD child devices. When an attach attempt to a + * neighboring router selected as a potential new parent fails, the same router cannot be selected again until this + * timeout expires. + * + * Applicable only if periodic parent search feature is enabled (see `OPENTHREAD_CONFIG_PARENT_SEARCH_ENABLE`). + */ +#ifdef OPENTHREAD_CONFIG_PARENT_SEARCH_RESELECT_TIMEOUT +#error `OPENTHREAD_CONFIG_PARENT_SEARCH_RESELECT_TIMEOUT` is redefined. +#endif +#define OPENTHREAD_CONFIG_PARENT_SEARCH_RESELECT_TIMEOUT CONFIG_OPENTHREAD_PARENT_SEARCH_RESELECT_TIMEOUT_MINS * 60 + +/** + * @def OPENTHREAD_CONFIG_PARENT_SEARCH_RSS_MARGIN + * + * Specifies the RSS margin over the current parent RSS for allowing selection of a neighboring router as a potential + * new parent to attach to. Used on FTD child devices. + */ +#ifdef OPENTHREAD_CONFIG_PARENT_SEARCH_RSS_MARGIN +#error `OPENTHREAD_CONFIG_PARENT_SEARCH_RSS_MARGIN` is redefined. +#endif +#define OPENTHREAD_CONFIG_PARENT_SEARCH_RSS_MARGIN CONFIG_OPENTHREAD_PARENT_SEARCH_RSS_MARGIN + /*----The following options set fixed default values but can be overridden by the user header file.----*/ #if CONFIG_OPENTHREAD_BORDER_ROUTER From aa66cb8d1cb20e79f4730c5d368f6392702c096f Mon Sep 17 00:00:00 2001 From: Tan Yan Quan Date: Wed, 11 Jun 2025 16:00:14 +0800 Subject: [PATCH 060/213] feat(openthread): use apb_freq_max mode for esp_openthread_sleep pm lock --- components/openthread/src/port/esp_openthread_sleep.c | 6 ++++-- .../light_sleep/main/esp_ot_sleepy_device.c | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/components/openthread/src/port/esp_openthread_sleep.c b/components/openthread/src/port/esp_openthread_sleep.c index a5381625ca1..8ca7504a6f6 100644 --- a/components/openthread/src/port/esp_openthread_sleep.c +++ b/components/openthread/src/port/esp_openthread_sleep.c @@ -19,10 +19,12 @@ esp_err_t esp_openthread_sleep_init(void) { esp_err_t err = ESP_OK; - err = esp_pm_lock_create(ESP_PM_CPU_FREQ_MAX, 0, "ieee802154", &s_pm_lock); + // Here we use APB_MAX because modem requires MODEM_REQUIRED_MIN_APB_CLK_FREQ. + // No need for CPU_MAX to reduce current consumption during Rx window. + err = esp_pm_lock_create(ESP_PM_APB_FREQ_MAX, 0, "ot_sleep", &s_pm_lock); if (err == ESP_OK) { esp_pm_lock_acquire(s_pm_lock); - ESP_LOGI(TAG, "Enable ieee802154 light sleep, the wake up source is ESP timer"); + ESP_LOGI(TAG, "Enable OpenThread light sleep, the wake up source is ESP timer"); } else { if (s_pm_lock != NULL) { esp_pm_lock_delete(s_pm_lock); diff --git a/examples/openthread/ot_sleepy_device/light_sleep/main/esp_ot_sleepy_device.c b/examples/openthread/ot_sleepy_device/light_sleep/main/esp_ot_sleepy_device.c index a7600f9c9a8..d4e1892273d 100644 --- a/examples/openthread/ot_sleepy_device/light_sleep/main/esp_ot_sleepy_device.c +++ b/examples/openthread/ot_sleepy_device/light_sleep/main/esp_ot_sleepy_device.c @@ -25,6 +25,7 @@ #include "esp_openthread_netif_glue.h" #include "esp_ot_sleepy_device_config.h" #include "esp_vfs_eventfd.h" +#include "esp_private/esp_clk.h" #include "driver/uart.h" #include "nvs_flash.h" #include "openthread/logging.h" @@ -192,7 +193,7 @@ static esp_err_t ot_power_save_init(void) esp_pm_config_t pm_config = { .max_freq_mhz = cur_cpu_freq_mhz, - .min_freq_mhz = cur_cpu_freq_mhz, + .min_freq_mhz = esp_clk_xtal_freq() / MHZ, #if CONFIG_FREERTOS_USE_TICKLESS_IDLE .light_sleep_enable = true #endif From 8182f20774e3a742922e353d0b9c0bb1eefdc513 Mon Sep 17 00:00:00 2001 From: Guillaume Souchere Date: Mon, 9 Jun 2025 09:03:40 +0200 Subject: [PATCH 061/213] feat(usb_serial_jtag): Update vfs read to be POSIX compliant The function now returns with available data in blocking mode instead of waiting for the requested size to be available before returning. --- .../include/driver/usb_serial_jtag_select.h | 9 +- .../src/usb_serial_jtag.c | 19 ++++- .../src/usb_serial_jtag_vfs.c | 84 +++++++++++++------ .../test_apps/usb_serial_jtag_vfs/README.md | 4 +- .../pytest_usb_serial_jtag_vfs.py | 5 +- 5 files changed, 85 insertions(+), 36 deletions(-) diff --git a/components/esp_driver_usb_serial_jtag/include/driver/usb_serial_jtag_select.h b/components/esp_driver_usb_serial_jtag/include/driver/usb_serial_jtag_select.h index 3fb185ed3d4..4c3e36d9ce8 100644 --- a/components/esp_driver_usb_serial_jtag/include/driver/usb_serial_jtag_select.h +++ b/components/esp_driver_usb_serial_jtag/include/driver/usb_serial_jtag_select.h @@ -1,6 +1,6 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -27,6 +27,13 @@ typedef void (*usj_select_notif_callback_t)(usj_select_notif_t usb_serial_jtag_s */ void usb_serial_jtag_set_select_notif_callback(usj_select_notif_callback_t usb_serial_jtag_select_notif_callback); +/** + * @brief Return the number of bytes available for reading + * + * @return the number of bytes available for reading in the buffer + */ +size_t usb_serial_jtag_get_read_bytes_available(void); + /** * @brief Return the readiness status of the driver for read operation * diff --git a/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag.c b/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag.c index a2ae108f1a4..631829de9e1 100644 --- a/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag.c +++ b/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag.c @@ -366,12 +366,23 @@ void usb_serial_jtag_set_select_notif_callback(usj_select_notif_callback_t usj_s } } -bool usb_serial_jtag_read_ready(void) +size_t usb_serial_jtag_get_read_bytes_available(void) { // sign the the driver is read ready is that data is waiting in the RX ringbuffer - UBaseType_t items_waiting = 0; - vRingbufferGetInfo(p_usb_serial_jtag_obj->rx_ring_buf, NULL, NULL, NULL, NULL, &items_waiting); - return items_waiting != 0; + UBaseType_t bytes_available = 0; + if (usb_serial_jtag_is_driver_installed()) { + vRingbufferGetInfo(p_usb_serial_jtag_obj->rx_ring_buf, NULL, NULL, NULL, NULL, &bytes_available); + if (bytes_available <= 0) { + return 0; + } + } + + return (size_t)bytes_available; +} + +bool usb_serial_jtag_read_ready(void) +{ + return usb_serial_jtag_get_read_bytes_available() != 0; } bool usb_serial_jtag_write_ready(void) diff --git a/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag_vfs.c b/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag_vfs.c index 9bbcbc3e88a..90d8addacf1 100644 --- a/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag_vfs.c +++ b/components/esp_driver_usb_serial_jtag/src/usb_serial_jtag_vfs.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -229,36 +229,66 @@ static ssize_t usb_serial_jtag_read(int fd, void* data, size_t size) assert(fd == USJ_LOCAL_FD); char *data_c = (char *) data; size_t received = 0; + size_t available_size = 0; + int c = NONE; // store the read char _lock_acquire_recursive(&s_ctx.read_lock); - while (received < size) { - int c = usb_serial_jtag_read_char(fd); - if (c == '\r') { - if (s_ctx.rx_mode == ESP_LINE_ENDINGS_CR) { - c = '\n'; - } else if (s_ctx.rx_mode == ESP_LINE_ENDINGS_CRLF) { - /* look ahead */ - int c2 = usb_serial_jtag_read_char(fd); - if (c2 == NONE) { - /* could not look ahead, put the current character back */ - usb_serial_jtag_return_char(fd, c); - break; - } - if (c2 == '\n') { - /* this was \r\n sequence. discard \r, return \n */ + // if blocking read, wait for data to be available + if (!s_ctx.non_blocking) { + c = usb_serial_jtag_read_char(fd); + } + + // find the actual fetch size + available_size += usb_serial_jtag_get_read_bytes_available(); + if (c != NONE) { + available_size++; + } + if (s_ctx.peek_char != NONE) { + available_size++; + } + size_t fetch_size = MIN(available_size, size); + + if (fetch_size > 0) { + do { + if (c == NONE) { // for non-O_NONBLOCK mode, there is already a pre-fetched char + c = usb_serial_jtag_read_char(fd); + } + assert(c != NONE); + + if (c == '\r') { + if (s_ctx.rx_mode == ESP_LINE_ENDINGS_CR) { c = '\n'; - } else { - /* \r followed by something else. put the second char back, - * it will be processed on next iteration. return \r now. - */ - usb_serial_jtag_return_char(fd, c2); + } else if (s_ctx.rx_mode == ESP_LINE_ENDINGS_CRLF) { + /* look ahead */ + int c2 = usb_serial_jtag_read_char(fd); + fetch_size--; + if (c2 == NONE) { + /* could not look ahead, put the current character back */ + usb_serial_jtag_return_char(fd, c); + c = NONE; + break; + } + if (c2 == '\n') { + /* this was \r\n sequence. discard \r, return \n */ + c = '\n'; + } else { + /* \r followed by something else. put the second char back, + * it will be processed on next iteration. return \r now. + */ + usb_serial_jtag_return_char(fd, c2); + fetch_size++; + } } } - } else if (c == NONE) { - break; - } - data_c[received] = (char) c; - ++received; + + data_c[received] = (char) c; + ++received; + c = NONE; + } while (received < fetch_size); + } + + if (c != NONE) { // fetched, but not used + usb_serial_jtag_return_char(fd, c); } _lock_release_recursive(&s_ctx.read_lock); if (received > 0) { @@ -454,7 +484,7 @@ static esp_err_t usb_serial_jtag_start_select(int nfds, fd_set *readfds, fd_set bool trigger_select = false; // check if the select should return instantly if the bus is read ready - if (FD_ISSET(USJ_LOCAL_FD, &args->readfds_orig) && usb_serial_jtag_read_ready()) { + if (FD_ISSET(USJ_LOCAL_FD, &args->readfds_orig) && (usb_serial_jtag_get_read_bytes_available() > 0)) { // signal immediately when data is buffered FD_SET(USJ_LOCAL_FD, readfds); trigger_select = true; diff --git a/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/README.md b/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/README.md index fa96566bdae..ad95e411339 100644 --- a/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/README.md +++ b/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32-C3 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S3 | -| ----------------- | -------- | -------- | --------- | -------- | -------- | -------- | +| Supported Targets | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S3 | +| ----------------- | -------- | -------- | -------- | -------- | -------- | diff --git a/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/pytest_usb_serial_jtag_vfs.py b/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/pytest_usb_serial_jtag_vfs.py index a66afd6b44a..fad239963a0 100644 --- a/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/pytest_usb_serial_jtag_vfs.py +++ b/components/esp_driver_usb_serial_jtag/test_apps/usb_serial_jtag_vfs/pytest_usb_serial_jtag_vfs.py @@ -2,6 +2,7 @@ # SPDX-License-Identifier: CC0-1.0 import pytest from pytest_embedded import Dut +from pytest_embedded_idf.utils import idf_parametrize @pytest.mark.esp32s3 @@ -36,7 +37,7 @@ def test_usj_vfs_select(dut: Dut, test_message: list) -> None: ) @pytest.mark.parametrize('test_message', ['!(@*#&(!*@&#((SDasdkjhad\nce']) @idf_parametrize('target', ['esp32s3', 'esp32c3', 'esp32c6', 'esp32h2'], indirect=['target']) -def test_usj_vfs_read(dut: Dut, test_message: list) -> None: +def test_usj_vfs_read_return(dut: Dut, test_message: list) -> None: dut.expect_exact('Press ENTER to see the list of tests') dut.write('"read does not return on new line character"') dut.expect_exact('ready to receive', timeout=2) @@ -54,7 +55,7 @@ def test_usj_vfs_read(dut: Dut, test_message: list) -> None: ) @pytest.mark.parametrize('test_message', ['testdata']) @idf_parametrize('target', ['esp32s3', 'esp32c3', 'esp32c6', 'esp32h2'], indirect=['target']) -def test_usj_vfs_read(dut: Dut, test_message: list) -> None: +def test_usj_vfs_read_blocking(dut: Dut, test_message: list) -> None: dut.expect_exact('Press ENTER to see the list of tests') dut.write('"blocking read returns with available data"') dut.expect_exact('ready to receive', timeout=2) From 0b383b9d59aad5d37c08c94bb1e7459446272849 Mon Sep 17 00:00:00 2001 From: Wang Mengyang Date: Wed, 11 Jun 2025 14:12:16 +0800 Subject: [PATCH 062/213] fix(bt): Fixed HFP AG data callback cleared after profile is re-initialized --- components/bt/common/btc/core/btc_task.c | 4 +- .../btc/profile/std/hf_ag/btc_hf_ag.c | 385 ++++++++---------- .../btc/profile/std/include/btc_hf_ag.h | 7 +- 3 files changed, 185 insertions(+), 211 deletions(-) diff --git a/components/bt/common/btc/core/btc_task.c b/components/bt/common/btc/core/btc_task.c index 0bbbb67a206..e213cd02385 100644 --- a/components/bt/common/btc/core/btc_task.c +++ b/components/bt/common/btc/core/btc_task.c @@ -484,10 +484,10 @@ static bt_status_t btc_init_mem(void) { #endif #if BTC_HF_INCLUDED == TRUE && HFP_DYNAMIC_MEMORY == TRUE - if ((hf_local_param_ptr = (hf_local_param_t *)osi_malloc(BTC_HF_NUM_CB * sizeof(hf_local_param_t))) == NULL) { + if ((hf_local_param_ptr = (hf_local_param_t *)osi_malloc(sizeof(hf_local_param_t))) == NULL) { goto error_exit; } - memset((void *)hf_local_param_ptr, 0, BTC_HF_NUM_CB * sizeof(hf_local_param_t)); + memset((void *)hf_local_param_ptr, 0, sizeof(hf_local_param_t)); #endif #if BTC_HF_CLIENT_INCLUDED == TRUE && HFP_DYNAMIC_MEMORY == TRUE diff --git a/components/bt/host/bluedroid/btc/profile/std/hf_ag/btc_hf_ag.c b/components/bt/host/bluedroid/btc/profile/std/hf_ag/btc_hf_ag.c index e1b070c24b9..c7fa57f0b06 100644 --- a/components/bt/host/bluedroid/btc/profile/std/hf_ag/btc_hf_ag.c +++ b/components/bt/host/bluedroid/btc/profile/std/hf_ag/btc_hf_ag.c @@ -66,7 +66,7 @@ static UINT16 btc_max_hf_clients = BTC_HF_NUM_CB; /* HF Param Definition */ #if HFP_DYNAMIC_MEMORY == FALSE -static hf_local_param_t hf_local_param[BTC_HF_NUM_CB]; +static hf_local_param_t hf_local_param; #else hf_local_param_t *hf_local_param_ptr = NULL; #endif @@ -117,7 +117,7 @@ do { if ((idx < 0) || (idx >= BTC_HF_NUM_CB)) { \ return BT_STATUS_FAIL; \ } \ - if (!hf_local_param[idx].btc_hf_cb.initialized) { \ + if (!hf_local_param.initialized) { \ BTIF_TRACE_WARNING("CHECK_HF_INIT: %s: HF AG not initialized", __FUNCTION__); \ return BT_STATUS_NOT_READY; \ } else { \ @@ -130,8 +130,8 @@ do { if ((idx < 0) || (idx >= BTC_HF_NUM_CB)) { \ return BT_STATUS_FAIL; \ } \ - if (!hf_local_param[idx].btc_hf_cb.initialized || \ - hf_local_param[idx].btc_hf_cb.connection_state != ESP_HF_CONNECTION_STATE_SLC_CONNECTED) { \ + if (!hf_local_param.initialized || \ + hf_local_param.btc_hf_cb[idx].connection_state != ESP_HF_CONNECTION_STATE_SLC_CONNECTED) { \ BTIF_TRACE_WARNING("CHECK_HF_SLC_CONNECTED: %s: HF AG SLC not connected", __FUNCTION__); \ return BT_STATUS_NOT_READY; \ } else { \ @@ -141,10 +141,10 @@ do { #define clear_phone_state() \ - hf_local_param[idx].btc_hf_cb.call_state = ESP_HF_CALL_STATUS_NO_CALLS; \ - hf_local_param[idx].btc_hf_cb.call_setup_state = ESP_HF_CALL_SETUP_STATUS_IDLE;\ - hf_local_param[idx].btc_hf_cb.num_active = 0; \ - hf_local_param[idx].btc_hf_cb.num_held = 0; + hf_local_param.btc_hf_cb[idx].call_state = ESP_HF_CALL_STATUS_NO_CALLS; \ + hf_local_param.btc_hf_cb[idx].call_setup_state = ESP_HF_CALL_SETUP_STATUS_IDLE;\ + hf_local_param.btc_hf_cb[idx].num_active = 0; \ + hf_local_param.btc_hf_cb[idx].num_held = 0; #define CHECK_HF_IDX(idx) \ do { \ @@ -160,7 +160,7 @@ do { static int btc_hf_idx_by_bdaddr(bt_bdaddr_t *bd_addr) { for (int i = 0; i < btc_max_hf_clients; ++i) { - if (bdcmp(bd_addr->address, hf_local_param[i].btc_hf_cb.connected_bda.address) == 0) { + if (bdcmp(bd_addr->address, hf_local_param.btc_hf_cb[i].connected_bda.address) == 0) { return i; } } @@ -170,8 +170,8 @@ static int btc_hf_idx_by_bdaddr(bt_bdaddr_t *bd_addr) static int btc_hf_find_free_idx(void) { for (int idx = 0; idx < btc_max_hf_clients; ++idx) { - if (hf_local_param[idx].btc_hf_cb.initialized && - hf_local_param[idx].btc_hf_cb.connection_state == ESP_HF_CONNECTION_STATE_DISCONNECTED) { + if (hf_local_param.initialized && + hf_local_param.btc_hf_cb[idx].connection_state == ESP_HF_CONNECTION_STATE_DISCONNECTED) { return idx; } } @@ -180,9 +180,9 @@ static int btc_hf_find_free_idx(void) static BOOLEAN is_connected(int idx, bt_bdaddr_t *bd_addr) { - if ((bdcmp(bd_addr->address,hf_local_param[idx].btc_hf_cb.connected_bda.address) == 0) && - ((hf_local_param[idx].btc_hf_cb.connection_state == ESP_HF_CONNECTION_STATE_CONNECTED) || - (hf_local_param[idx].btc_hf_cb.connection_state == ESP_HF_CONNECTION_STATE_SLC_CONNECTED))) { + if ((bdcmp(bd_addr->address,hf_local_param.btc_hf_cb[idx].connected_bda.address) == 0) && + ((hf_local_param.btc_hf_cb[idx].connection_state == ESP_HF_CONNECTION_STATE_CONNECTED) || + (hf_local_param.btc_hf_cb[idx].connection_state == ESP_HF_CONNECTION_STATE_SLC_CONNECTED))) { return TRUE; } return FALSE; @@ -196,9 +196,9 @@ static int btc_hf_latest_connected_idx(void) conn_time_delta.tv_sec = now.tv_sec; for (int i = 0; i < btc_max_hf_clients; i++) { - if (hf_local_param[i].btc_hf_cb.connection_state == ESP_HF_CONNECTION_STATE_SLC_CONNECTED) { - if ((now.tv_sec - hf_local_param[i].btc_hf_cb.connected_timestamp.tv_sec) < conn_time_delta.tv_sec) { - conn_time_delta.tv_sec = now.tv_sec - hf_local_param[i].btc_hf_cb.connected_timestamp.tv_sec; + if (hf_local_param.btc_hf_cb[i].connection_state == ESP_HF_CONNECTION_STATE_SLC_CONNECTED) { + if ((now.tv_sec - hf_local_param.btc_hf_cb[i].connected_timestamp.tv_sec) < conn_time_delta.tv_sec) { + conn_time_delta.tv_sec = now.tv_sec - hf_local_param.btc_hf_cb[i].connected_timestamp.tv_sec; latest_conn_idx = i; } } @@ -261,25 +261,23 @@ static void bte_hf_evt(tBTA_AG_EVT event, tBTA_AG *param) ************************************************************************************/ void btc_hf_reg_data_cb(esp_hf_incoming_data_cb_t recv, esp_hf_outgoing_data_cb_t send) { - hf_local_param[0].btc_hf_incoming_data_cb = recv; - hf_local_param[0].btc_hf_outgoing_data_cb = send; + hf_local_param.btc_hf_incoming_data_cb = recv; + hf_local_param.btc_hf_outgoing_data_cb = send; } void btc_hf_incoming_data_cb_to_app(const uint8_t *data, uint32_t len) { - int idx = 0; // todo: critical section protection - if (hf_local_param[idx].btc_hf_incoming_data_cb) { - hf_local_param[idx].btc_hf_incoming_data_cb(data, len); + if (hf_local_param.btc_hf_incoming_data_cb) { + hf_local_param.btc_hf_incoming_data_cb(data, len); } } uint32_t btc_hf_outgoing_data_cb_to_app(uint8_t *data, uint32_t len) { - int idx = 0; // todo: critical section protection - if (hf_local_param[idx].btc_hf_outgoing_data_cb) { - return hf_local_param[idx].btc_hf_outgoing_data_cb(data, len); + if (hf_local_param.btc_hf_outgoing_data_cb) { + return hf_local_param.btc_hf_outgoing_data_cb(data, len); } else { return 0; } @@ -298,7 +296,7 @@ bt_status_t btc_hf_execute_service(BOOLEAN b_enable) } else { /* De-register AG */ for (idx = 0; idx < btc_max_hf_clients; idx++) { - BTA_AgDeregister(hf_local_param[idx].btc_hf_cb.handle); + BTA_AgDeregister(hf_local_param.btc_hf_cb[idx].handle); } /* Disable AG */ BTA_AgDisable(); @@ -316,30 +314,29 @@ bt_status_t btc_hf_init(void) { int idx = 0; -#if HFP_DYNAMIC_MEMORY == TRUE - if (hf_local_param) -#endif - { - if (hf_local_param[idx].btc_hf_cb.initialized) { - esp_hf_cb_param_t param = { - .prof_stat.state = ESP_HF_INIT_ALREADY, - }; - btc_hf_cb_to_app(ESP_HF_PROF_STATE_EVT, ¶m); - return BT_STATUS_SUCCESS; - } + if (hf_local_param.initialized) { + esp_hf_cb_param_t param = { + .prof_stat.state = ESP_HF_INIT_ALREADY, + }; + btc_hf_cb_to_app(ESP_HF_PROF_STATE_EVT, ¶m); + return BT_STATUS_SUCCESS; } BTC_TRACE_DEBUG("%s - max_hf_clients=%d", __func__, btc_max_hf_clients); -#if HFP_DYNAMIC_MEMORY == TRUE - if (hf_local_param == NULL) { - if ((hf_local_param = (hf_local_param_t *)osi_malloc(BTC_HF_NUM_CB * sizeof(hf_local_param_t))) == NULL) { + if (hf_local_param.btc_hf_cb == NULL) { + hf_local_param.btc_hf_cb = (btc_hf_cb_t *)osi_malloc(BTC_HF_NUM_CB * sizeof(btc_hf_cb_t)); + if (hf_local_param.btc_hf_cb == NULL) { BTC_TRACE_ERROR("%s malloc failed!", __func__); return BT_STATUS_NOMEM; } } - memset((void *)hf_local_param, 0, BTC_HF_NUM_CB * sizeof(hf_local_param_t)); -#endif + + memset(hf_local_param.btc_hf_cb, 0, BTC_HF_NUM_CB * sizeof(btc_hf_cb_t)); + for (int i = 0; i < BTC_HF_NUM_CB; i++) { + hf_local_param.btc_hf_cb[i].sync_conn_hdl = ESP_INVALID_CONN_HANDLE; + } + hf_local_param.hf_idx = BTC_HF_INVALID_IDX; /* Invoke the enable service API to the core to set the appropriate service_id * Internally, the HSP_SERVICE_ID shall also be enabled if HFP is enabled (phone) @@ -350,10 +347,7 @@ bt_status_t btc_hf_init(void) btc_dm_enable_service(BTA_HSP_SERVICE_ID); #endif clear_phone_state(); - memset(&hf_local_param[idx].btc_hf_cb, 0, sizeof(btc_hf_cb_t)); - for (int i = 0; i < BTC_HF_NUM_CB; i++) { - hf_local_param[i].btc_hf_cb.sync_conn_hdl = ESP_INVALID_CONN_HANDLE; - } + // set audio path #if (BT_CONTROLLER_INCLUDED == TRUE) #if BTM_SCO_HCI_INCLUDED @@ -371,19 +365,12 @@ void btc_hf_deinit(void) { BTC_TRACE_EVENT("%s", __FUNCTION__); - int idx = 0; - -#if HFP_DYNAMIC_MEMORY == TRUE - if (hf_local_param) -#endif - { - if (!hf_local_param[idx].btc_hf_cb.initialized) { - esp_hf_cb_param_t param = { - .prof_stat.state = ESP_HF_DEINIT_ALREADY, - }; - btc_hf_cb_to_app(ESP_HF_PROF_STATE_EVT, ¶m); - return; - } + if (!hf_local_param.initialized) { + esp_hf_cb_param_t param = { + .prof_stat.state = ESP_HF_DEINIT_ALREADY, + }; + btc_hf_cb_to_app(ESP_HF_PROF_STATE_EVT, ¶m); + return; } btc_dm_disable_service(BTA_HFP_SERVICE_ID); @@ -391,12 +378,8 @@ void btc_hf_deinit(void) static void btc_hf_cb_release(void) { -#if HFP_DYNAMIC_MEMORY == TRUE - if (hf_local_param) { - osi_free(hf_local_param); - hf_local_param = NULL; - } -#endif + osi_free(hf_local_param.btc_hf_cb); + hf_local_param.btc_hf_cb = NULL; } static bt_status_t connect_init(bt_bdaddr_t *bd_addr, uint16_t uuid) @@ -408,9 +391,9 @@ static bt_status_t connect_init(bt_bdaddr_t *bd_addr, uint16_t uuid) } if (!is_connected(idx, bd_addr)) { - hf_local_param[idx].btc_hf_cb.connection_state = ESP_HF_CONNECTION_STATE_CONNECTING; - bdcpy(hf_local_param[idx].btc_hf_cb.connected_bda.address, bd_addr->address); - BTA_AgOpen(hf_local_param[idx].btc_hf_cb.handle, hf_local_param[idx].btc_hf_cb.connected_bda.address, BTC_HF_SECURITY, BTC_HF_SERVICES); + hf_local_param.btc_hf_cb[idx].connection_state = ESP_HF_CONNECTION_STATE_CONNECTING; + bdcpy(hf_local_param.btc_hf_cb[idx].connected_bda.address, bd_addr->address); + BTA_AgOpen(hf_local_param.btc_hf_cb[idx].handle, hf_local_param.btc_hf_cb[idx].connected_bda.address, BTC_HF_SECURITY, BTC_HF_SERVICES); return BT_STATUS_SUCCESS; } return BT_STATUS_BUSY; @@ -430,7 +413,7 @@ bt_status_t btc_hf_disconnect(bt_bdaddr_t *bd_addr) } if (is_connected(idx, bd_addr)) { - BTA_AgClose(hf_local_param[idx].btc_hf_cb.handle); + BTA_AgClose(hf_local_param.btc_hf_cb[idx].handle); return BT_STATUS_SUCCESS; } return BT_STATUS_FAIL; @@ -442,13 +425,13 @@ bt_status_t btc_hf_connect_audio(bt_bdaddr_t *bd_addr) CHECK_HF_SLC_CONNECTED(idx); if (is_connected(idx, bd_addr)) { - BTA_AgAudioOpen(hf_local_param[idx].btc_hf_cb.handle); + BTA_AgAudioOpen(hf_local_param.btc_hf_cb[idx].handle); /* Inform the application that the audio connection has been initiated successfully */ do { esp_hf_cb_param_t param; memset(¶m, 0, sizeof(esp_hf_cb_param_t)); param.audio_stat.state = ESP_HF_AUDIO_STATE_CONNECTING; - memcpy(param.audio_stat.remote_addr, &hf_local_param[idx].btc_hf_cb.connected_bda, sizeof(esp_bd_addr_t)); + memcpy(param.audio_stat.remote_addr, &hf_local_param.btc_hf_cb[idx].connected_bda, sizeof(esp_bd_addr_t)); btc_hf_cb_to_app(ESP_HF_AUDIO_STATE_EVT, ¶m); } while (0); return BT_STATUS_SUCCESS; @@ -462,7 +445,7 @@ bt_status_t btc_hf_disconnect_audio(bt_bdaddr_t *bd_addr) CHECK_HF_SLC_CONNECTED(idx); if (is_connected(idx, bd_addr)) { - BTA_AgAudioClose(hf_local_param[idx].btc_hf_cb.handle); + BTA_AgAudioClose(hf_local_param.btc_hf_cb[idx].handle); return BT_STATUS_SUCCESS; } return BT_STATUS_FAIL; @@ -476,7 +459,7 @@ static bt_status_t btc_hf_pkt_stat_nums_get(UINT16 sync_conn_handle) CHECK_HF_SLC_CONNECTED(idx); if (idx != BTC_HF_INVALID_IDX) { - BTA_AgPktStatsNumsGet(hf_local_param[idx].btc_hf_cb.handle, sync_conn_handle); + BTA_AgPktStatsNumsGet(hf_local_param.btc_hf_cb[idx].handle, sync_conn_handle); status = BT_STATUS_SUCCESS; } #endif /*#if (BTM_SCO_HCI_INCLUDED == TRUE) */ @@ -493,11 +476,11 @@ static bt_status_t btc_hf_vra(bt_bdaddr_t *bd_addr, esp_hf_vr_state_t value) CHECK_HF_SLC_CONNECTED(idx); if (is_connected(idx, bd_addr)) { - if (hf_local_param[idx].btc_hf_cb.peer_feat & BTA_AG_PEER_FEAT_VREC) { + if (hf_local_param.btc_hf_cb[idx].peer_feat & BTA_AG_PEER_FEAT_VREC) { tBTA_AG_RES_DATA ag_res; memset(&ag_res, 0, sizeof(ag_res)); ag_res.state = value; - BTA_AgResult(hf_local_param[idx].btc_hf_cb.handle, BTA_AG_BVRA_RES, &ag_res); + BTA_AgResult(hf_local_param.btc_hf_cb[idx].handle, BTA_AG_BVRA_RES, &ag_res); return BT_STATUS_SUCCESS; } else { return BT_STATUS_UNSUPPORTED; @@ -515,7 +498,7 @@ static bt_status_t btc_hf_volume_control(bt_bdaddr_t *bd_addr, esp_hf_volume_typ if (is_connected(idx, bd_addr)) { ag_res.num = volume; - BTA_AgResult(hf_local_param[idx].btc_hf_cb.handle, (type == ESP_HF_VOLUME_TYPE_SPK) ? BTA_AG_SPK_RES : BTA_AG_MIC_RES, &ag_res); + BTA_AgResult(hf_local_param.btc_hf_cb[idx].handle, (type == ESP_HF_VOLUME_TYPE_SPK) ? BTA_AG_SPK_RES : BTA_AG_MIC_RES, &ag_res); return BT_STATUS_SUCCESS; } return BT_STATUS_FAIL; @@ -539,7 +522,7 @@ static bt_status_t btc_hf_unat_response(bt_bdaddr_t *bd_addr, const char *unat) ag_res.errcode = BTA_AG_ERR_OP_NOT_SUPPORTED; } - BTA_AgResult(hf_local_param[idx].btc_hf_cb.handle, BTA_AG_UNAT_RES, &ag_res); + BTA_AgResult(hf_local_param.btc_hf_cb[idx].handle, BTA_AG_UNAT_RES, &ag_res); return BT_STATUS_SUCCESS; } return BT_STATUS_FAIL; @@ -560,7 +543,7 @@ static bt_status_t btc_hf_cmee_response(bt_bdaddr_t *bd_addr, esp_hf_at_response ag_res.ok_flag = BTA_AG_OK_ERROR; ag_res.errcode = error_code; } - BTA_AgResult(hf_local_param[idx].btc_hf_cb.handle, BTA_AG_UNAT_RES, &ag_res); + BTA_AgResult(hf_local_param.btc_hf_cb[idx].handle, BTA_AG_UNAT_RES, &ag_res); return BT_STATUS_SUCCESS; } return BT_STATUS_FAIL; @@ -621,7 +604,7 @@ static bt_status_t btc_hf_cind_response(bt_bdaddr_t *bd_addr, batt_lev, /* Battery level */ call_held_status /* Callheld state */ ); - BTA_AgResult(hf_local_param[idx].btc_hf_cb.handle, BTA_AG_CIND_RES, &ag_res); + BTA_AgResult(hf_local_param.btc_hf_cb[idx].handle, BTA_AG_CIND_RES, &ag_res); return BT_STATUS_SUCCESS; } return BT_STATUS_FAIL; @@ -639,7 +622,7 @@ static bt_status_t btc_hf_cops_response(bt_bdaddr_t *bd_addr, const char *name) /* Format the response */ sprintf(ag_res.str, "0,0,\"%s\"", name); ag_res.ok_flag = BTA_AG_OK_DONE; - BTA_AgResult(hf_local_param[idx].btc_hf_cb.handle, BTA_AG_COPS_RES, &ag_res); + BTA_AgResult(hf_local_param.btc_hf_cb[idx].handle, BTA_AG_COPS_RES, &ag_res); return BT_STATUS_SUCCESS; } return BT_STATUS_FAIL; @@ -671,7 +654,7 @@ static bt_status_t btc_hf_clcc_response(bt_bdaddr_t *bd_addr, int index, esp_hf_ } } } - BTA_AgResult(hf_local_param[idx].btc_hf_cb.handle, BTA_AG_CLCC_RES, &ag_res); + BTA_AgResult(hf_local_param.btc_hf_cb[idx].handle, BTA_AG_CLCC_RES, &ag_res); return BT_STATUS_SUCCESS; } return BT_STATUS_FAIL; @@ -693,7 +676,7 @@ static bt_status_t btc_hf_cnum_response(bt_bdaddr_t *bd_addr, const char *number sprintf(ag_res.str, ",\"%s\",%d,,",number, number_type); } ag_res.ok_flag = BTA_AG_OK_DONE; - BTA_AgResult(hf_local_param[idx].btc_hf_cb.handle, BTA_AG_CNUM_RES, &ag_res); + BTA_AgResult(hf_local_param.btc_hf_cb[idx].handle, BTA_AG_CNUM_RES, &ag_res); return BT_STATUS_SUCCESS; } return BT_STATUS_FAIL; @@ -709,7 +692,7 @@ static bt_status_t btc_hf_inband_ring(bt_bdaddr_t *bd_addr, esp_hf_in_band_ring_ tBTA_AG_RES_DATA ag_res; memset (&ag_res, 0, sizeof (ag_res)); ag_res.state = state; - BTA_AgResult(hf_local_param[idx].btc_hf_cb.handle, BTA_AG_INBAND_RING_RES, &ag_res); + BTA_AgResult(hf_local_param.btc_hf_cb[idx].handle, BTA_AG_INBAND_RING_RES, &ag_res); return BT_STATUS_SUCCESS; } return BT_STATUS_FAIL; @@ -727,8 +710,8 @@ static bt_status_t btc_hf_phone_state_update(bt_bdaddr_t *bd_addr,int num_active int idx = btc_hf_idx_by_bdaddr(bd_addr), i; /* hf_idx is index of connected HS that sent ATA/BLDN, otherwise index of latest connected HS */ - if (hf_local_param->hf_idx != BTC_HF_INVALID_IDX) { - idx = hf_local_param->hf_idx; + if (hf_local_param.hf_idx != BTC_HF_INVALID_IDX) { + idx = hf_local_param.hf_idx; } else { idx = btc_hf_latest_connected_idx(); } @@ -736,28 +719,28 @@ static bt_status_t btc_hf_phone_state_update(bt_bdaddr_t *bd_addr,int num_active BTC_TRACE_DEBUG("phone_state_change: idx = %d", idx); CHECK_HF_SLC_CONNECTED(idx); BTC_TRACE_DEBUG("phone_state_change: num_active=%d [prev: %d] num_held=%d[prev: %d] call =%s [prev: %s] call_setup=%s [prev: %s]", - num_active, hf_local_param[idx].btc_hf_cb.num_active, - num_held, hf_local_param[idx].btc_hf_cb.num_held, - dump_hf_call_state(call_state), dump_hf_call_state(hf_local_param[idx].btc_hf_cb.call_state), - dump_hf_call_setup_state(call_setup_state), dump_hf_call_setup_state(hf_local_param[idx].btc_hf_cb.call_setup_state)); + num_active, hf_local_param.btc_hf_cb[idx].num_active, + num_held, hf_local_param.btc_hf_cb[idx].num_held, + dump_hf_call_state(call_state), dump_hf_call_state(hf_local_param.btc_hf_cb[idx].call_state), + dump_hf_call_setup_state(call_setup_state), dump_hf_call_setup_state(hf_local_param.btc_hf_cb[idx].call_setup_state)); /* If all indicators are 0, send end call and return */ if (num_active == 0 && num_held == 0 && call_state == ESP_HF_CALL_STATUS_NO_CALLS && call_setup_state == ESP_HF_CALL_SETUP_STATUS_IDLE) { BTC_TRACE_DEBUG("%s: Phone on hook", __FUNCTION__); /* Record call termination timestamp if there was an active/held call or call_setup_state > ESP_HF_CALL_SETUP_STATUS_IDLE */ - if ((hf_local_param[idx].btc_hf_cb.call_state != ESP_HF_CALL_STATUS_NO_CALLS) || - (hf_local_param[idx].btc_hf_cb.call_setup_state != ESP_HF_CALL_SETUP_STATUS_IDLE) || - (hf_local_param[idx].btc_hf_cb.num_active) || - (hf_local_param[idx].btc_hf_cb.num_held)) { + if ((hf_local_param.btc_hf_cb[idx].call_state != ESP_HF_CALL_STATUS_NO_CALLS) || + (hf_local_param.btc_hf_cb[idx].call_setup_state != ESP_HF_CALL_SETUP_STATUS_IDLE) || + (hf_local_param.btc_hf_cb[idx].num_active) || + (hf_local_param.btc_hf_cb[idx].num_held)) { BTC_TRACE_DEBUG("%s: Record call termination timestamp", __FUNCTION__); - clock_gettime(CLOCK_MONOTONIC, &hf_local_param[0].btc_hf_cb.call_end_timestamp); + clock_gettime(CLOCK_MONOTONIC, &hf_local_param.btc_hf_cb[idx].call_end_timestamp); } BTA_AgResult(BTA_AG_HANDLE_ALL, BTA_AG_END_CALL_RES, NULL); - hf_local_param->hf_idx = BTC_HF_INVALID_IDX; + hf_local_param.hf_idx = BTC_HF_INVALID_IDX; /* If held call was present, reset that as well. */ - if (hf_local_param[idx].btc_hf_cb.num_held) { + if (hf_local_param.btc_hf_cb[idx].num_held) { send_indicator_update(BTA_AG_IND_CALLHELD, 0); } goto update_call_states; @@ -771,13 +754,13 @@ static bt_status_t btc_hf_phone_state_update(bt_bdaddr_t *bd_addr,int num_active /* Handle case(3) here prior to call setup handling.*/ if (((num_active + num_held) > 0) && - (hf_local_param[idx].btc_hf_cb.num_active == 0) && - (hf_local_param[idx].btc_hf_cb.num_held == 0) && - (hf_local_param[idx].btc_hf_cb.call_setup_state == ESP_HF_CALL_SETUP_STATUS_IDLE)) { + (hf_local_param.btc_hf_cb[idx].num_active == 0) && + (hf_local_param.btc_hf_cb[idx].num_held == 0) && + (hf_local_param.btc_hf_cb[idx].call_setup_state == ESP_HF_CALL_SETUP_STATUS_IDLE)) { BTC_TRACE_DEBUG("%s: Active/Held call notification received without call setup update", __FUNCTION__); memset(&ag_res, 0, sizeof(tBTA_AG_RES_DATA)); - ag_res.audio_handle = hf_local_param[idx].btc_hf_cb.handle; + ag_res.audio_handle = hf_local_param.btc_hf_cb[idx].handle; /* Addition callsetup with the Active call. */ if (call_setup_state != ESP_HF_CALL_SETUP_STATUS_IDLE) { @@ -793,9 +776,9 @@ static bt_status_t btc_hf_phone_state_update(bt_bdaddr_t *bd_addr,int num_active } /* Handle call_setup indicator change. */ - if (call_setup_state != hf_local_param[idx].btc_hf_cb.call_setup_state) { + if (call_setup_state != hf_local_param.btc_hf_cb[idx].call_setup_state) { BTC_TRACE_DEBUG("%s: Call setup states changed. old: %s new: %s", __FUNCTION__, - dump_hf_call_setup_state(hf_local_param[idx].btc_hf_cb.call_setup_state), + dump_hf_call_setup_state(hf_local_param.btc_hf_cb[idx].call_setup_state), dump_hf_call_setup_state(call_setup_state)); memset(&ag_res, 0, sizeof(tBTA_AG_RES_DATA)); @@ -803,14 +786,14 @@ static bt_status_t btc_hf_phone_state_update(bt_bdaddr_t *bd_addr,int num_active { case ESP_HF_CALL_SETUP_STATUS_IDLE: { - switch(hf_local_param[idx].btc_hf_cb.call_setup_state) + switch(hf_local_param.btc_hf_cb[idx].call_setup_state) { case ESP_HF_CALL_SETUP_STATUS_INCOMING: { - if (num_active > hf_local_param[idx].btc_hf_cb.num_active) { + if (num_active > hf_local_param.btc_hf_cb[idx].num_active) { res = BTA_AG_IN_CALL_CONN_RES; - ag_res.audio_handle = hf_local_param[idx].btc_hf_cb.handle; - } else if (num_held > hf_local_param[idx].btc_hf_cb.num_held) { + ag_res.audio_handle = hf_local_param.btc_hf_cb[idx].handle; + } else if (num_held > hf_local_param.btc_hf_cb[idx].num_held) { res = BTA_AG_IN_CALL_HELD_RES; } else { res = BTA_AG_CALL_CANCEL_RES; @@ -821,7 +804,7 @@ static bt_status_t btc_hf_phone_state_update(bt_bdaddr_t *bd_addr,int num_active case ESP_HF_CALL_SETUP_STATUS_OUTGOING_DIALING: case ESP_HF_CALL_SETUP_STATUS_OUTGOING_ALERTING: { - if (num_active > hf_local_param[idx].btc_hf_cb.num_active) { + if (num_active > hf_local_param.btc_hf_cb[idx].num_active) { res = BTA_AG_OUT_CALL_CONN_RES; ag_res.audio_handle = BTA_AG_HANDLE_SCO_NO_CHANGE; } else { @@ -864,7 +847,7 @@ static bt_status_t btc_hf_phone_state_update(bt_bdaddr_t *bd_addr,int num_active case ESP_HF_CALL_SETUP_STATUS_OUTGOING_DIALING: { if (!(num_active + num_held)) { - ag_res.audio_handle = hf_local_param[idx].btc_hf_cb.handle; + ag_res.audio_handle = hf_local_param.btc_hf_cb[idx].handle; } res = BTA_AG_OUT_CALL_ORIG_RES; break; @@ -872,9 +855,9 @@ static bt_status_t btc_hf_phone_state_update(bt_bdaddr_t *bd_addr,int num_active case ESP_HF_CALL_SETUP_STATUS_OUTGOING_ALERTING: { - if ((hf_local_param[idx].btc_hf_cb.call_setup_state == ESP_HF_CALL_SETUP_STATUS_IDLE) && + if ((hf_local_param.btc_hf_cb[idx].call_setup_state == ESP_HF_CALL_SETUP_STATUS_IDLE) && !(num_active + num_held)) { - ag_res.audio_handle = hf_local_param[idx].btc_hf_cb.handle; + ag_res.audio_handle = hf_local_param.btc_hf_cb[idx].handle; /* Force SCO setup here.*/ BTA_AgAudioOpen(ag_res.audio_handle); } @@ -904,34 +887,34 @@ static bt_status_t btc_hf_phone_state_update(bt_bdaddr_t *bd_addr,int num_active /* Handle call_state indicator change. */ if (!activeCallUpdated && - ((num_active + num_held) != (hf_local_param[idx].btc_hf_cb.num_active + hf_local_param[idx].btc_hf_cb.num_held))) { - BTC_TRACE_DEBUG("%s: Active call states changed. old: %d new: %d", __FUNCTION__, hf_local_param[idx].btc_hf_cb.num_active, num_active); + ((num_active + num_held) != (hf_local_param.btc_hf_cb[idx].num_active + hf_local_param.btc_hf_cb[idx].num_held))) { + BTC_TRACE_DEBUG("%s: Active call states changed. old: %d new: %d", __FUNCTION__, hf_local_param.btc_hf_cb[idx].num_active, num_active); send_indicator_update(BTA_AG_IND_CALL, ((num_active + num_held) > 0) ? 1 : 0); } /* Handle call_held_state indicator change. */ - if (num_held != hf_local_param[idx].btc_hf_cb.num_held || - ((num_active == 0) && ((num_held + hf_local_param[idx].btc_hf_cb.num_held) > 1))) { - BTC_TRACE_DEBUG("%s: Held call states changed. old: %d new: %d", __FUNCTION__, hf_local_param[idx].btc_hf_cb.num_held, num_held); + if (num_held != hf_local_param.btc_hf_cb[idx].num_held || + ((num_active == 0) && ((num_held + hf_local_param.btc_hf_cb[idx].num_held) > 1))) { + BTC_TRACE_DEBUG("%s: Held call states changed. old: %d new: %d", __FUNCTION__, hf_local_param.btc_hf_cb[idx].num_held, num_held); send_indicator_update(BTA_AG_IND_CALLHELD, ((num_held == 0) ? 0 : ((num_active == 0) ? 2 : 1))); } /* Handle Call Active/Held Swap indicator update.*/ - if ((call_setup_state == hf_local_param[idx].btc_hf_cb.call_setup_state) && + if ((call_setup_state == hf_local_param.btc_hf_cb[idx].call_setup_state) && (num_active) && (num_held) && - (num_active == hf_local_param[idx].btc_hf_cb.num_active) && - (num_held == hf_local_param[idx].btc_hf_cb.num_held)) { + (num_active == hf_local_param.btc_hf_cb[idx].num_active) && + (num_held == hf_local_param.btc_hf_cb[idx].num_held)) { BTC_TRACE_DEBUG("%s: Calls swapped", __FUNCTION__); send_indicator_update(BTA_AG_IND_CALLHELD, 1); } update_call_states: for (i = 0; i < btc_max_hf_clients; i++) { - hf_local_param[i].btc_hf_cb.num_active = num_active; - hf_local_param[i].btc_hf_cb.num_held = num_held; - hf_local_param[i].btc_hf_cb.call_state = call_state; - hf_local_param[i].btc_hf_cb.call_setup_state = call_setup_state; + hf_local_param.btc_hf_cb[i].num_active = num_active; + hf_local_param.btc_hf_cb[i].num_held = num_held; + hf_local_param.btc_hf_cb[i].call_state = call_state; + hf_local_param.btc_hf_cb[i].call_setup_state = call_setup_state; } return status; } @@ -944,7 +927,7 @@ bt_status_t btc_hf_ci_sco_data(void) CHECK_HF_SLC_CONNECTED(idx); if (idx != BTC_HF_INVALID_IDX) { - BTA_AgCiData(hf_local_param[idx].btc_hf_cb.handle); + BTA_AgCiData(hf_local_param.btc_hf_cb[idx].handle); return status; } status = BT_STATUS_FAIL; @@ -1298,17 +1281,11 @@ void btc_hf_cb_handler(btc_msg_t *msg) break; case BTA_AG_DISABLE_EVT: { - idx = 0; -#if HFP_DYNAMIC_MEMORY == TRUE - if (hf_local_param) -#endif - { - if (hf_local_param[idx].btc_hf_cb.initialized) { - hf_local_param[idx].btc_hf_cb.initialized = false; - btc_hf_cb_release(); - param.prof_stat.state = ESP_HF_DEINIT_SUCCESS; - btc_hf_cb_to_app(ESP_HF_PROF_STATE_EVT, ¶m); - } + if (hf_local_param.initialized) { + hf_local_param.initialized = false; + btc_hf_cb_release(); + param.prof_stat.state = ESP_HF_DEINIT_SUCCESS; + btc_hf_cb_to_app(ESP_HF_PROF_STATE_EVT, ¶m); } break; } @@ -1316,14 +1293,14 @@ void btc_hf_cb_handler(btc_msg_t *msg) { idx = p_data->hdr.handle - 1; CHECK_HF_IDX(idx); - hf_local_param[idx].btc_hf_cb.handle = p_data->reg.hdr.handle; - BTC_TRACE_DEBUG("%s: BTA_AG_REGISTER_EVT," "hf_local_param[%d].btc_hf_cb.handle = %d", - __FUNCTION__, idx, hf_local_param[idx].btc_hf_cb.handle); - if (!hf_local_param[idx].btc_hf_cb.initialized) { + hf_local_param.btc_hf_cb[idx].handle = p_data->reg.hdr.handle; + BTC_TRACE_DEBUG("%s: BTA_AG_REGISTER_EVT," "hf_hf_cb[%d].btc_hf_cb.handle = %d", + __FUNCTION__, idx, hf_local_param.btc_hf_cb[idx].handle); + if (!hf_local_param.initialized) { param.prof_stat.state = ESP_HF_INIT_SUCCESS; btc_hf_cb_to_app(ESP_HF_PROF_STATE_EVT, ¶m); } - hf_local_param[idx].btc_hf_cb.initialized = true; + hf_local_param.initialized = true; break; } @@ -1333,30 +1310,30 @@ void btc_hf_cb_handler(btc_msg_t *msg) CHECK_HF_IDX(idx); if (p_data->open.hdr.status == BTA_AG_SUCCESS) { - bdcpy(hf_local_param[idx].btc_hf_cb.connected_bda.address, p_data->open.bd_addr); - hf_local_param[idx].btc_hf_cb.connection_state = ESP_HF_CONNECTION_STATE_CONNECTED; - hf_local_param[idx].btc_hf_cb.peer_feat = 0; - hf_local_param[idx].btc_hf_cb.chld_feat = 0; + bdcpy(hf_local_param.btc_hf_cb[idx].connected_bda.address, p_data->open.bd_addr); + hf_local_param.btc_hf_cb[idx].connection_state = ESP_HF_CONNECTION_STATE_CONNECTED; + hf_local_param.btc_hf_cb[idx].peer_feat = 0; + hf_local_param.btc_hf_cb[idx].chld_feat = 0; //clear_phone_state(); - } else if (hf_local_param[idx].btc_hf_cb.connection_state == ESP_HF_CONNECTION_STATE_CONNECTING) { - hf_local_param[idx].btc_hf_cb.connection_state = ESP_HF_CONNECTION_STATE_DISCONNECTED; + } else if (hf_local_param.btc_hf_cb[idx].connection_state == ESP_HF_CONNECTION_STATE_CONNECTING) { + hf_local_param.btc_hf_cb[idx].connection_state = ESP_HF_CONNECTION_STATE_DISCONNECTED; } else { BTC_TRACE_WARNING("%s: AG open failed, but another device connected. status=%d state=%d connected device=%s", __FUNCTION__, - p_data->open.hdr.status, hf_local_param[idx].btc_hf_cb.connection_state, - bdaddr_to_string(&hf_local_param[idx].btc_hf_cb.connected_bda, bdstr, sizeof(bdstr))); + p_data->open.hdr.status, hf_local_param.btc_hf_cb[idx].connection_state, + bdaddr_to_string(&hf_local_param.btc_hf_cb[idx].connected_bda, bdstr, sizeof(bdstr))); break; } do { - memcpy(param.conn_stat.remote_bda, &hf_local_param[idx].btc_hf_cb.connected_bda, sizeof(esp_bd_addr_t)); - param.conn_stat.state = hf_local_param[idx].btc_hf_cb.connection_state; + memcpy(param.conn_stat.remote_bda, &hf_local_param.btc_hf_cb[idx].connected_bda, sizeof(esp_bd_addr_t)); + param.conn_stat.state = hf_local_param.btc_hf_cb[idx].connection_state; param.conn_stat.peer_feat = 0; param.conn_stat.chld_feat = 0; btc_hf_cb_to_app(ESP_HF_CONNECTION_STATE_EVT, ¶m); } while (0); - if (hf_local_param[idx].btc_hf_cb.connection_state == ESP_HF_CONNECTION_STATE_DISCONNECTED) - bdsetany(hf_local_param[idx].btc_hf_cb.connected_bda.address); + if (hf_local_param.btc_hf_cb[idx].connection_state == ESP_HF_CONNECTION_STATE_DISCONNECTED) + bdsetany(hf_local_param.btc_hf_cb[idx].connected_bda.address); if (p_data->open.hdr.status != BTA_AG_SUCCESS) btc_queue_advance(); @@ -1367,20 +1344,20 @@ void btc_hf_cb_handler(btc_msg_t *msg) { idx = p_data->hdr.handle - 1; CHECK_HF_IDX(idx); - clock_gettime(CLOCK_MONOTONIC, &(hf_local_param[idx].btc_hf_cb.connected_timestamp)); + clock_gettime(CLOCK_MONOTONIC, &(hf_local_param.btc_hf_cb[idx].connected_timestamp)); BTC_TRACE_DEBUG("%s: BTA_AG_CONN_EVT, idx = %d ", __FUNCTION__, idx); - hf_local_param[idx].btc_hf_cb.peer_feat = p_data->conn.peer_feat; - hf_local_param[idx].btc_hf_cb.chld_feat = p_data->conn.chld_feat; - hf_local_param[idx].btc_hf_cb.connection_state = ESP_HF_CONNECTION_STATE_SLC_CONNECTED; + hf_local_param.btc_hf_cb[idx].peer_feat = p_data->conn.peer_feat; + hf_local_param.btc_hf_cb[idx].chld_feat = p_data->conn.chld_feat; + hf_local_param.btc_hf_cb[idx].connection_state = ESP_HF_CONNECTION_STATE_SLC_CONNECTED; do { - param.conn_stat.state = hf_local_param[idx].btc_hf_cb.connection_state; - param.conn_stat.peer_feat = hf_local_param[idx].btc_hf_cb.peer_feat; - param.conn_stat.chld_feat = hf_local_param[idx].btc_hf_cb.chld_feat; - memcpy(param.conn_stat.remote_bda, &hf_local_param[idx].btc_hf_cb.connected_bda, sizeof(esp_bd_addr_t)); + param.conn_stat.state = hf_local_param.btc_hf_cb[idx].connection_state; + param.conn_stat.peer_feat = hf_local_param.btc_hf_cb[idx].peer_feat; + param.conn_stat.chld_feat = hf_local_param.btc_hf_cb[idx].chld_feat; + memcpy(param.conn_stat.remote_bda, &hf_local_param.btc_hf_cb[idx].connected_bda, sizeof(esp_bd_addr_t)); btc_hf_cb_to_app(ESP_HF_CONNECTION_STATE_EVT, ¶m); } while(0); - hf_local_param[idx].hf_idx = btc_hf_latest_connected_idx(); + hf_local_param.hf_idx = btc_hf_latest_connected_idx(); btc_queue_advance(); break; } @@ -1389,20 +1366,20 @@ void btc_hf_cb_handler(btc_msg_t *msg) { idx = p_data->hdr.handle - 1; CHECK_HF_IDX(idx); - hf_local_param[idx].btc_hf_cb.connected_timestamp.tv_sec = 0; - hf_local_param[idx].btc_hf_cb.connection_state = ESP_HF_CONNECTION_STATE_DISCONNECTED; - BTC_TRACE_DEBUG("%s: BTA_AG_CLOSE_EVT," "hf_local_param[%d].btc_hf_cb.handle = %d", __FUNCTION__, - idx, hf_local_param[idx].btc_hf_cb.handle); + hf_local_param.btc_hf_cb[idx].connected_timestamp.tv_sec = 0; + hf_local_param.btc_hf_cb[idx].connection_state = ESP_HF_CONNECTION_STATE_DISCONNECTED; + BTC_TRACE_DEBUG("%s: BTA_AG_CLOSE_EVT," "hf_local_param.btc_hf_cb[%d].handle = %d", __FUNCTION__, + idx, hf_local_param.btc_hf_cb[idx].handle); do { param.conn_stat.state = ESP_HF_CONNECTION_STATE_DISCONNECTED; param.conn_stat.peer_feat = 0; param.conn_stat.chld_feat = 0; - memcpy(param.conn_stat.remote_bda, &hf_local_param[idx].btc_hf_cb.connected_bda, sizeof(esp_bd_addr_t)); + memcpy(param.conn_stat.remote_bda, &hf_local_param.btc_hf_cb[idx].connected_bda, sizeof(esp_bd_addr_t)); btc_hf_cb_to_app(ESP_HF_CONNECTION_STATE_EVT, ¶m); } while(0); - bdsetany(hf_local_param[idx].btc_hf_cb.connected_bda.address); + bdsetany(hf_local_param.btc_hf_cb[idx].connected_bda.address); clear_phone_state(); - hf_local_param[idx].hf_idx = btc_hf_latest_connected_idx(); + hf_local_param.hf_idx = btc_hf_latest_connected_idx(); btc_queue_advance(); break; } @@ -1413,8 +1390,8 @@ void btc_hf_cb_handler(btc_msg_t *msg) CHECK_HF_IDX(idx); do { param.audio_stat.state = ESP_HF_AUDIO_STATE_CONNECTED; - memcpy(param.audio_stat.remote_addr, &hf_local_param[idx].btc_hf_cb.connected_bda,sizeof(esp_bd_addr_t)); - hf_local_param[idx].btc_hf_cb.sync_conn_hdl = p_data->hdr.sync_conn_handle; + memcpy(param.audio_stat.remote_addr, &hf_local_param.btc_hf_cb[idx].connected_bda,sizeof(esp_bd_addr_t)); + hf_local_param.btc_hf_cb[idx].sync_conn_hdl = p_data->hdr.sync_conn_handle; param.audio_stat.sync_conn_handle = p_data->hdr.sync_conn_handle; btc_hf_cb_to_app(ESP_HF_AUDIO_STATE_EVT, ¶m); } while(0); @@ -1427,8 +1404,8 @@ void btc_hf_cb_handler(btc_msg_t *msg) CHECK_HF_IDX(idx); do { param.audio_stat.state = ESP_HF_AUDIO_STATE_CONNECTED_MSBC; - memcpy(param.audio_stat.remote_addr, &hf_local_param[idx].btc_hf_cb.connected_bda,sizeof(esp_bd_addr_t)); - hf_local_param[idx].btc_hf_cb.sync_conn_hdl = p_data->hdr.sync_conn_handle; + memcpy(param.audio_stat.remote_addr, &hf_local_param.btc_hf_cb[idx].connected_bda,sizeof(esp_bd_addr_t)); + hf_local_param.btc_hf_cb[idx].sync_conn_hdl = p_data->hdr.sync_conn_handle; param.audio_stat.sync_conn_handle = p_data->hdr.sync_conn_handle; btc_hf_cb_to_app(ESP_HF_AUDIO_STATE_EVT, ¶m); } while (0); @@ -1440,8 +1417,8 @@ void btc_hf_cb_handler(btc_msg_t *msg) CHECK_HF_IDX(idx); do { param.audio_stat.state = ESP_HF_AUDIO_STATE_DISCONNECTED; - hf_local_param[idx].btc_hf_cb.sync_conn_hdl = ESP_INVALID_CONN_HANDLE; - memcpy(param.audio_stat.remote_addr, &hf_local_param[idx].btc_hf_cb.connected_bda, sizeof(esp_bd_addr_t)); + hf_local_param.btc_hf_cb[idx].sync_conn_hdl = ESP_INVALID_CONN_HANDLE; + memcpy(param.audio_stat.remote_addr, &hf_local_param.btc_hf_cb[idx].connected_bda, sizeof(esp_bd_addr_t)); param.audio_stat.sync_conn_handle = p_data->hdr.sync_conn_handle; btc_hf_cb_to_app(ESP_HF_AUDIO_STATE_EVT, ¶m); } while(0); @@ -1454,12 +1431,12 @@ void btc_hf_cb_handler(btc_msg_t *msg) CHECK_HF_IDX(idx); do { param.vra_rep.value = p_data->val.num; - memcpy(param.vra_rep.remote_addr, &hf_local_param[idx].btc_hf_cb.connected_bda,sizeof(esp_bd_addr_t)); + memcpy(param.vra_rep.remote_addr, &hf_local_param.btc_hf_cb[idx].connected_bda,sizeof(esp_bd_addr_t)); btc_hf_cb_to_app(ESP_HF_BVRA_RESPONSE_EVT, ¶m); if (p_data->val.num) { - btc_hf_connect_audio(&hf_local_param[idx].btc_hf_cb.connected_bda); + btc_hf_connect_audio(&hf_local_param.btc_hf_cb[idx].connected_bda); } else { - btc_hf_disconnect_audio(&hf_local_param[idx].btc_hf_cb.connected_bda); + btc_hf_disconnect_audio(&hf_local_param.btc_hf_cb[idx].connected_bda); } } while (0); break; @@ -1471,7 +1448,7 @@ void btc_hf_cb_handler(btc_msg_t *msg) idx = p_data->hdr.handle - 1; CHECK_HF_IDX(idx); do { - memcpy(param.volume_control.remote_addr, &hf_local_param[idx].btc_hf_cb.connected_bda,sizeof(esp_bd_addr_t)); + memcpy(param.volume_control.remote_addr, &hf_local_param.btc_hf_cb[idx].connected_bda,sizeof(esp_bd_addr_t)); param.volume_control.type = (event == BTA_AG_SPK_EVT) ? ESP_HF_VOLUME_CONTROL_TARGET_SPK : ESP_HF_VOLUME_CONTROL_TARGET_MIC; param.volume_control.volume = p_data->val.num; btc_hf_cb_to_app(ESP_HF_VOLUME_CONTROL_EVT, ¶m); @@ -1484,7 +1461,7 @@ void btc_hf_cb_handler(btc_msg_t *msg) idx = p_data->hdr.handle - 1; CHECK_HF_IDX(idx); do { - memcpy(param.unat_rep.remote_addr, &hf_local_param[idx].btc_hf_cb.connected_bda,sizeof(esp_bd_addr_t)); + memcpy(param.unat_rep.remote_addr, &hf_local_param.btc_hf_cb[idx].connected_bda,sizeof(esp_bd_addr_t)); param.unat_rep.unat = p_data->val.str; btc_hf_cb_to_app(ESP_HF_UNAT_RESPONSE_EVT, ¶m); } while (0); @@ -1495,7 +1472,7 @@ void btc_hf_cb_handler(btc_msg_t *msg) { idx = p_data->hdr.handle - 1; CHECK_HF_IDX(idx); - memcpy(param.ind_upd.remote_addr, &hf_local_param[idx].btc_hf_cb.connected_bda,sizeof(esp_bd_addr_t)); + memcpy(param.ind_upd.remote_addr, &hf_local_param.btc_hf_cb[idx].connected_bda,sizeof(esp_bd_addr_t)); btc_hf_cb_to_app(ESP_HF_IND_UPDATE_EVT, ¶m); break; } @@ -1504,7 +1481,7 @@ void btc_hf_cb_handler(btc_msg_t *msg) { idx = p_data->hdr.handle - 1; CHECK_HF_IDX(idx); - memcpy(param.cind_rep.remote_addr, &hf_local_param[idx].btc_hf_cb.connected_bda,sizeof(esp_bd_addr_t)); + memcpy(param.cind_rep.remote_addr, &hf_local_param.btc_hf_cb[idx].connected_bda,sizeof(esp_bd_addr_t)); btc_hf_cb_to_app(ESP_HF_CIND_RESPONSE_EVT, ¶m); break; } @@ -1513,7 +1490,7 @@ void btc_hf_cb_handler(btc_msg_t *msg) { idx = p_data->hdr.handle - 1; CHECK_HF_IDX(idx); - memcpy(param.cops_rep.remote_addr, &hf_local_param[idx].btc_hf_cb.connected_bda,sizeof(esp_bd_addr_t)); + memcpy(param.cops_rep.remote_addr, &hf_local_param.btc_hf_cb[idx].connected_bda,sizeof(esp_bd_addr_t)); btc_hf_cb_to_app(ESP_HF_COPS_RESPONSE_EVT, ¶m); break; } @@ -1522,7 +1499,7 @@ void btc_hf_cb_handler(btc_msg_t *msg) { idx = p_data->hdr.handle - 1; CHECK_HF_IDX(idx); - memcpy(param.clcc_rep.remote_addr, &hf_local_param[idx].btc_hf_cb.connected_bda,sizeof(esp_bd_addr_t)); + memcpy(param.clcc_rep.remote_addr, &hf_local_param.btc_hf_cb[idx].connected_bda,sizeof(esp_bd_addr_t)); btc_hf_cb_to_app(ESP_HF_CLCC_RESPONSE_EVT, ¶m); break; } @@ -1531,7 +1508,7 @@ void btc_hf_cb_handler(btc_msg_t *msg) { idx = p_data->hdr.handle - 1; CHECK_HF_IDX(idx); - memcpy(param.cnum_rep.remote_addr, &hf_local_param[idx].btc_hf_cb.connected_bda,sizeof(esp_bd_addr_t)); + memcpy(param.cnum_rep.remote_addr, &hf_local_param.btc_hf_cb[idx].connected_bda,sizeof(esp_bd_addr_t)); btc_hf_cb_to_app(ESP_HF_CNUM_RESPONSE_EVT, ¶m); break; } @@ -1541,7 +1518,7 @@ void btc_hf_cb_handler(btc_msg_t *msg) idx = p_data->hdr.handle - 1; CHECK_HF_IDX(idx); do { - memcpy(param.vts_rep.remote_addr, &hf_local_param[idx].btc_hf_cb.connected_bda,sizeof(esp_bd_addr_t)); + memcpy(param.vts_rep.remote_addr, &hf_local_param.btc_hf_cb[idx].connected_bda,sizeof(esp_bd_addr_t)); param.vts_rep.code = p_data->val.str; btc_hf_cb_to_app(ESP_HF_VTS_RESPONSE_EVT, ¶m); } while(0); @@ -1553,7 +1530,7 @@ void btc_hf_cb_handler(btc_msg_t *msg) idx = p_data->hdr.handle - 1; CHECK_HF_IDX(idx); do { - memcpy(param.nrec.remote_addr, &hf_local_param[idx].btc_hf_cb.connected_bda,sizeof(esp_bd_addr_t)); + memcpy(param.nrec.remote_addr, &hf_local_param.btc_hf_cb[idx].connected_bda,sizeof(esp_bd_addr_t)); param.nrec.state = p_data->val.num; btc_hf_cb_to_app(ESP_HF_NREC_RESPONSE_EVT, ¶m); } while(0); @@ -1564,7 +1541,7 @@ void btc_hf_cb_handler(btc_msg_t *msg) { idx = p_data->hdr.handle - 1; CHECK_HF_IDX(idx); - memcpy(param.ata_rep.remote_addr, &hf_local_param[idx].btc_hf_cb.connected_bda,sizeof(esp_bd_addr_t)); + memcpy(param.ata_rep.remote_addr, &hf_local_param.btc_hf_cb[idx].connected_bda,sizeof(esp_bd_addr_t)); btc_hf_cb_to_app(ESP_HF_ATA_RESPONSE_EVT, ¶m); break; } @@ -1573,7 +1550,7 @@ void btc_hf_cb_handler(btc_msg_t *msg) { idx = p_data->hdr.handle - 1; CHECK_HF_IDX(idx); - memcpy(param.chup_rep.remote_addr, &hf_local_param[idx].btc_hf_cb.connected_bda,sizeof(esp_bd_addr_t)); + memcpy(param.chup_rep.remote_addr, &hf_local_param.btc_hf_cb[idx].connected_bda,sizeof(esp_bd_addr_t)); btc_hf_cb_to_app(ESP_HF_CHUP_RESPONSE_EVT, ¶m); break; } @@ -1585,14 +1562,14 @@ void btc_hf_cb_handler(btc_msg_t *msg) CHECK_HF_IDX(idx); do { if (event == BTA_AG_AT_D_EVT) { // dial_number_or_memory - memcpy(param.out_call.remote_addr, &hf_local_param[idx].btc_hf_cb.connected_bda,sizeof(esp_bd_addr_t)); + memcpy(param.out_call.remote_addr, &hf_local_param.btc_hf_cb[idx].connected_bda,sizeof(esp_bd_addr_t)); param.out_call.type = p_data->val.value; param.out_call.num_or_loc = osi_malloc((strlen(p_data->val.str) + 1) * sizeof(char)); sprintf(param.out_call.num_or_loc, "%s", p_data->val.str); btc_hf_cb_to_app(ESP_HF_DIAL_EVT, ¶m); osi_free(param.out_call.num_or_loc); } else if (event == BTA_AG_AT_BLDN_EVT) { //dial_last - memcpy(param.out_call.remote_addr, &hf_local_param[idx].btc_hf_cb.connected_bda,sizeof(esp_bd_addr_t)); + memcpy(param.out_call.remote_addr, &hf_local_param.btc_hf_cb[idx].connected_bda,sizeof(esp_bd_addr_t)); param.out_call.num_or_loc = NULL; btc_hf_cb_to_app(ESP_HF_DIAL_EVT, ¶m); } @@ -1609,7 +1586,7 @@ void btc_hf_cb_handler(btc_msg_t *msg) memset(&ag_res, 0, sizeof(ag_res)); ag_res.ok_flag = BTA_AG_OK_ERROR; ag_res.errcode = BTA_AG_ERR_OP_NOT_SUPPORTED; - BTA_AgResult(hf_local_param[idx].btc_hf_cb.handle, BTA_AG_UNAT_RES, &ag_res); + BTA_AgResult(hf_local_param.btc_hf_cb[idx].handle, BTA_AG_UNAT_RES, &ag_res); break; } @@ -1624,11 +1601,11 @@ void btc_hf_cb_handler(btc_msg_t *msg) ** of SCO connection establishment */ if ((btc_conf_hf_force_wbs == TRUE) && (p_data->val.num & BTA_AG_CODEC_MSBC)) { BTC_TRACE_DEBUG("%s btc_hf override-Preferred Codec to MSBC", __FUNCTION__); - BTA_AgSetCodec(hf_local_param[idx].btc_hf_cb.handle,BTA_AG_CODEC_MSBC); + BTA_AgSetCodec(hf_local_param.btc_hf_cb[idx].handle,BTA_AG_CODEC_MSBC); } else { BTC_TRACE_DEBUG("%s btc_hf override-Preferred Codec to CVSD", __FUNCTION__); - BTA_AgSetCodec(hf_local_param[idx].btc_hf_cb.handle,BTA_AG_CODEC_CVSD); + BTA_AgSetCodec(hf_local_param.btc_hf_cb[idx].handle,BTA_AG_CODEC_CVSD); } #endif break; @@ -1640,7 +1617,7 @@ void btc_hf_cb_handler(btc_msg_t *msg) CHECK_HF_IDX(idx); do { BTC_TRACE_DEBUG("Set codec status %d codec %d 1=CVSD 2=MSBC", p_data->val.hdr.status, p_data->val.num); - memcpy(param.wbs_rep.remote_addr, &hf_local_param[idx].btc_hf_cb.connected_bda,sizeof(esp_bd_addr_t)); + memcpy(param.wbs_rep.remote_addr, &hf_local_param.btc_hf_cb[idx].connected_bda,sizeof(esp_bd_addr_t)); param.wbs_rep.codec = p_data->val.num; btc_hf_cb_to_app(ESP_HF_WBS_RESPONSE_EVT, ¶m); } while (0); @@ -1653,7 +1630,7 @@ void btc_hf_cb_handler(btc_msg_t *msg) CHECK_HF_IDX(idx); do { BTC_TRACE_DEBUG("AG final seleded codec is %d 1=CVSD 2=MSBC", p_data->val.num); - memcpy(param.bcs_rep.remote_addr, &hf_local_param[idx].btc_hf_cb.connected_bda,sizeof(esp_bd_addr_t)); + memcpy(param.bcs_rep.remote_addr, &hf_local_param.btc_hf_cb[idx].connected_bda,sizeof(esp_bd_addr_t)); param.bcs_rep.mode = p_data->val.num; /* No ESP_HF_WBS_NONE case, because HFP 1.6 supported device can send BCS */ btc_hf_cb_to_app(ESP_HF_BCS_RESPONSE_EVT, ¶m); @@ -1677,18 +1654,16 @@ void btc_hf_get_profile_status(esp_hf_profile_status_t *param) { param->hfp_ag_inited = false; // Not initialized by default -#if HFP_DYNAMIC_MEMORY == TRUE - if (hf_local_param) -#endif - { + if (hf_local_param.initialized) { + param->hfp_ag_inited = true; + } + + if (hf_local_param.btc_hf_cb != NULL) { for (int idx = 0; idx < BTC_HF_NUM_CB; idx++) { - if (hf_local_param[idx].btc_hf_cb.initialized) { - param->hfp_ag_inited = true; - if (hf_local_param[idx].btc_hf_cb.connection_state == ESP_HF_CONNECTION_STATE_SLC_CONNECTED) { - param->slc_conn_num++; - if (hf_local_param[idx].btc_hf_cb.sync_conn_hdl != ESP_INVALID_CONN_HANDLE) { - param->sync_conn_num++; - } + if (hf_local_param.btc_hf_cb[idx].connection_state == ESP_HF_CONNECTION_STATE_SLC_CONNECTED) { + param->slc_conn_num++; + if (hf_local_param.btc_hf_cb[idx].sync_conn_hdl != ESP_INVALID_CONN_HANDLE) { + param->sync_conn_num++; } } } diff --git a/components/bt/host/bluedroid/btc/profile/std/include/btc_hf_ag.h b/components/bt/host/bluedroid/btc/profile/std/include/btc_hf_ag.h index 4eea4022740..52ef7bab868 100644 --- a/components/bt/host/bluedroid/btc/profile/std/include/btc_hf_ag.h +++ b/components/bt/host/bluedroid/btc/profile/std/include/btc_hf_ag.h @@ -209,7 +209,6 @@ typedef union /* BTC-AG control block to map bdaddr to BTA handle */ typedef struct { - bool initialized; UINT16 handle; UINT16 sync_conn_hdl; bt_bdaddr_t connected_bda; @@ -227,16 +226,16 @@ typedef struct typedef struct { + bool initialized; int hf_idx; - UINT32 btc_hf_features; - btc_hf_cb_t btc_hf_cb; + btc_hf_cb_t *btc_hf_cb; esp_hf_incoming_data_cb_t btc_hf_incoming_data_cb; esp_hf_outgoing_data_cb_t btc_hf_outgoing_data_cb; } hf_local_param_t; #if HFP_DYNAMIC_MEMORY == TRUE extern hf_local_param_t *hf_local_param_ptr; -#define hf_local_param (hf_local_param_ptr) +#define hf_local_param (*hf_local_param_ptr) #endif /******************************************************************************* From c8a6d41c278765b9f8c413e97f539a45a221075a Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Thu, 22 May 2025 12:11:11 +0800 Subject: [PATCH 063/213] refactor(touch): adjust touch channel number on P4 from 0-13 to 1-14 --- .../common/touch_sens_common.c | 33 +++++----- .../hw_ver3/touch_version_specific.c | 3 +- .../touch_sens/main/test_touch_sens_common.c | 2 +- .../hal/esp32p4/include/hal/touch_sensor_ll.h | 60 +++++++------------ .../esp32/include/soc/touch_sensor_channel.h | 38 +++++------- .../esp32p4/include/soc/Kconfig.soc_caps.in | 8 +++ components/soc/esp32p4/include/soc/soc_caps.h | 2 + .../include/soc/touch_sensor_channel.h | 58 +++++++++--------- components/soc/esp32p4/touch_sensor_periph.c | 6 +- .../include/soc/touch_sensor_channel.h | 56 ++++++++--------- .../soc/esp32s3/include/soc/touch_channel.h | 46 -------------- .../include/soc/touch_sensor_channel.h | 40 ++++++------- tools/ci/check_copyright_ignore.txt | 1 - 13 files changed, 145 insertions(+), 208 deletions(-) delete mode 100644 components/soc/esp32s3/include/soc/touch_channel.h diff --git a/components/esp_driver_touch_sens/common/touch_sens_common.c b/components/esp_driver_touch_sens/common/touch_sens_common.c index f5119c72372..8ecbfaaf765 100644 --- a/components/esp_driver_touch_sens/common/touch_sens_common.c +++ b/components/esp_driver_touch_sens/common/touch_sens_common.c @@ -133,22 +133,24 @@ esp_err_t touch_sensor_new_channel(touch_sensor_handle_t sens_handle, int chan_i TOUCH_NULL_POINTER_CHECK(chan_cfg); TOUCH_NULL_POINTER_CHECK(ret_chan_handle); TOUCH_CHANNEL_CHECK(chan_id); + uint32_t ch_offset = chan_id - TOUCH_MIN_CHAN_ID; + ESP_RETURN_ON_FALSE(g_touch == sens_handle, ESP_ERR_INVALID_ARG, TAG, "The input touch sensor handle is unmatched"); esp_err_t ret = ESP_OK; xSemaphoreTake(sens_handle->mutex, portMAX_DELAY); ESP_GOTO_ON_FALSE(!sens_handle->is_enabled, ESP_ERR_INVALID_STATE, err2, TAG, "Please disable the touch sensor first"); - ESP_GOTO_ON_FALSE(!sens_handle->ch[chan_id], ESP_ERR_INVALID_STATE, err2, TAG, "The channel %d has been registered", chan_id); + ESP_GOTO_ON_FALSE(!sens_handle->ch[ch_offset], ESP_ERR_INVALID_STATE, err2, TAG, "The channel %d has been registered", chan_id); - sens_handle->ch[chan_id] = (touch_channel_handle_t)heap_caps_calloc(1, sizeof(struct touch_channel_s), TOUCH_MEM_ALLOC_CAPS); - ESP_GOTO_ON_FALSE(sens_handle->ch[chan_id], ESP_ERR_NO_MEM, err2, TAG, "No memory for touch channel"); - sens_handle->ch[chan_id]->id = chan_id; - sens_handle->ch[chan_id]->base = sens_handle; - sens_handle->ch[chan_id]->is_prox_chan = false; + sens_handle->ch[ch_offset] = (touch_channel_handle_t)heap_caps_calloc(1, sizeof(struct touch_channel_s), TOUCH_MEM_ALLOC_CAPS); + ESP_GOTO_ON_FALSE(sens_handle->ch[ch_offset], ESP_ERR_NO_MEM, err2, TAG, "No memory for touch channel"); + sens_handle->ch[ch_offset]->id = chan_id; + sens_handle->ch[ch_offset]->base = sens_handle; + sens_handle->ch[ch_offset]->is_prox_chan = false; /* Init the channel */ - ESP_GOTO_ON_ERROR(touch_priv_config_channel(sens_handle->ch[chan_id], chan_cfg), + ESP_GOTO_ON_ERROR(touch_priv_config_channel(sens_handle->ch[ch_offset], chan_cfg), err1, TAG, "Failed to configure the touch channel %d", chan_id); touch_channel_pin_init(chan_id); TOUCH_ENTER_CRITICAL(TOUCH_PERIPH_LOCK); @@ -159,13 +161,13 @@ esp_err_t touch_sensor_new_channel(touch_sensor_handle_t sens_handle, int chan_i touch_ll_set_channel_mask(sens_handle->chan_mask); TOUCH_EXIT_CRITICAL(TOUCH_PERIPH_LOCK); - *ret_chan_handle = sens_handle->ch[chan_id]; + *ret_chan_handle = sens_handle->ch[ch_offset]; xSemaphoreGive(sens_handle->mutex); return ret; err1: - free(sens_handle->ch[chan_id]); - sens_handle->ch[chan_id] = NULL; + free(sens_handle->ch[ch_offset]); + sens_handle->ch[ch_offset] = NULL; err2: xSemaphoreGive(sens_handle->mutex); return ret; @@ -188,14 +190,15 @@ esp_err_t touch_sensor_del_channel(touch_channel_handle_t chan_handle) ESP_GOTO_ON_ERROR(touch_sensor_config_sleep_channel(sens_handle, NULL), err, TAG, "Failed to disable sleep function on this channel"); } #endif - int id = chan_handle->id; + int ch_offset = chan_handle->id - TOUCH_MIN_CHAN_ID; + assert(ch_offset >= 0); TOUCH_ENTER_CRITICAL(TOUCH_PERIPH_LOCK); - sens_handle->chan_mask &= ~(1UL << id); + sens_handle->chan_mask &= ~(1UL << chan_handle->id); touch_ll_set_channel_mask(sens_handle->chan_mask); TOUCH_EXIT_CRITICAL(TOUCH_PERIPH_LOCK); - free(g_touch->ch[id]); - g_touch->ch[id] = NULL; + free(g_touch->ch[ch_offset]); + g_touch->ch[ch_offset] = NULL; err: xSemaphoreGive(sens_handle->mutex); return ret; @@ -358,7 +361,7 @@ esp_err_t touch_sensor_trigger_oneshot_scanning(touch_sensor_handle_t sens_handl FOR_EACH_TOUCH_CHANNEL(i) { if (sens_handle->ch[i]) { TOUCH_ENTER_CRITICAL(TOUCH_PERIPH_LOCK); - touch_ll_channel_sw_measure_mask(BIT(i)); + touch_ll_channel_sw_measure_mask(BIT(sens_handle->ch[i]->id)); touch_ll_trigger_oneshot_measurement(); TOUCH_EXIT_CRITICAL(TOUCH_PERIPH_LOCK); while (!touch_ll_is_measure_done()) { diff --git a/components/esp_driver_touch_sens/hw_ver3/touch_version_specific.c b/components/esp_driver_touch_sens/hw_ver3/touch_version_specific.c index e9335d39652..f9d44a75f44 100644 --- a/components/esp_driver_touch_sens/hw_ver3/touch_version_specific.c +++ b/components/esp_driver_touch_sens/hw_ver3/touch_version_specific.c @@ -63,7 +63,8 @@ void IRAM_ATTR touch_priv_default_intr_handler(void *arg) touch_ll_intr_clear(status); touch_base_event_data_t data; touch_ll_get_active_channel_mask(&data.status_mask); - data.chan = g_touch->ch[touch_ll_get_current_meas_channel()]; + int ch_offset = touch_ll_get_current_meas_channel() - TOUCH_MIN_CHAN_ID; + data.chan = g_touch->ch[ch_offset]; /* If the channel is not registered, return directly */ if (!data.chan) { return; diff --git a/components/esp_driver_touch_sens/test_apps/touch_sens/main/test_touch_sens_common.c b/components/esp_driver_touch_sens/test_apps/touch_sens/main/test_touch_sens_common.c index 226b8549fa2..b93c277b0eb 100644 --- a/components/esp_driver_touch_sens/test_apps/touch_sens/main/test_touch_sens_common.c +++ b/components/esp_driver_touch_sens/test_apps/touch_sens/main/test_touch_sens_common.c @@ -49,7 +49,7 @@ TEST_CASE("touch_sens_install_uninstall_test", "[touch]") TEST_ESP_OK(touch_sensor_config_filter(touch, &filter_cfg)); for (int i = 0; i < TOUCH_TOTAL_CHAN_NUM; i++) { - TEST_ESP_OK(touch_sensor_new_channel(touch, i, &s_chan_cfg, &touch_chan[i])); + TEST_ESP_OK(touch_sensor_new_channel(touch, i + TOUCH_MIN_CHAN_ID, &s_chan_cfg, &touch_chan[i])); } touch_channel_handle_t fault_chan = NULL; TEST_ASSERT(touch_sensor_new_channel(touch, TOUCH_TOTAL_CHAN_NUM, &s_chan_cfg, &fault_chan) == ESP_ERR_INVALID_ARG); diff --git a/components/hal/esp32p4/include/hal/touch_sensor_ll.h b/components/hal/esp32p4/include/hal/touch_sensor_ll.h index 37280c3b5d2..5d47aa137ec 100644 --- a/components/hal/esp32p4/include/hal/touch_sensor_ll.h +++ b/components/hal/esp32p4/include/hal/touch_sensor_ll.h @@ -45,7 +45,7 @@ extern "C" { #define TOUCH_LL_INTR_MASK_PROX_DONE BIT(5) #define TOUCH_LL_INTR_MASK_ALL (0x3F) -#define TOUCH_LL_FULL_CHANNEL_MASK ((uint16_t)((1U << SOC_TOUCH_SENSOR_NUM) - 1)) +#define TOUCH_LL_FULL_CHANNEL_MASK ((uint16_t)((1U << (SOC_TOUCH_SENSOR_NUM)) - 1) << SOC_TOUCH_MIN_CHAN_ID) #define TOUCH_LL_NULL_CHANNEL (15) // Null Channel id. Used for disabling some functions like sleep/proximity/waterproof #define TOUCH_LL_PAD_MEASURE_WAIT_MAX (0x7FFF) // The timer frequency is 8Mhz, the max value is 0xff @@ -273,8 +273,7 @@ static inline void touch_ll_trigger_oneshot_measurement(void) static inline void touch_ll_measure_channel_once(uint16_t chan_mask) { - // Channel shift workaround - LP_ANA_PERI.touch_mux1.touch_start = chan_mask << 1; + LP_ANA_PERI.touch_mux1.touch_start = chan_mask; } /** @@ -290,8 +289,7 @@ static inline void touch_ll_measure_channel_once(uint16_t chan_mask) static inline void touch_ll_set_chan_active_threshold(uint32_t touch_num, uint8_t sample_cfg_id, uint32_t thresh) { HAL_ASSERT(sample_cfg_id < SOC_TOUCH_SAMPLE_CFG_NUM); - // Channel shift workaround - HAL_FORCE_MODIFY_U32_REG_FIELD(LP_ANA_PERI.touch_padx_thn[touch_num + 1].thresh[sample_cfg_id], threshold, thresh); // codespell:ignore + HAL_FORCE_MODIFY_U32_REG_FIELD(LP_ANA_PERI.touch_padx_thn[touch_num].thresh[sample_cfg_id], threshold, thresh); // codespell:ignore } /** @@ -304,8 +302,8 @@ static inline void touch_ll_set_chan_active_threshold(uint32_t touch_num, uint8_ __attribute__((always_inline)) static inline void touch_ll_enable_scan_mask(uint16_t chan_mask, bool enable) { - // Channel shift workaround: the lowest bit takes no effect - uint16_t mask = (chan_mask << 1) & TOUCH_PAD_BIT_MASK_ALL; + // the lowest bit takes no effect + uint16_t mask = chan_mask & TOUCH_LL_FULL_CHANNEL_MASK; uint16_t prev_mask = LP_ANA_PERI.touch_scan_ctrl1.touch_scan_pad_map; if (enable) { LP_ANA_PERI.touch_scan_ctrl1.touch_scan_pad_map = prev_mask | mask; @@ -328,8 +326,8 @@ static inline void touch_ll_enable_scan_mask(uint16_t chan_mask, bool enable) */ static inline void touch_ll_set_channel_mask(uint16_t enable_mask) { - // Channel shift workaround: the lowest bit takes no effect - uint16_t mask = (enable_mask << 1) & TOUCH_PAD_BIT_MASK_ALL; + // the lowest bit takes no effect + uint16_t mask = enable_mask & TOUCH_LL_FULL_CHANNEL_MASK; LP_ANA_PERI.touch_scan_ctrl1.touch_scan_pad_map = mask; LP_ANA_PERI.touch_filter2.touch_outen = mask; } @@ -342,9 +340,8 @@ static inline void touch_ll_set_channel_mask(uint16_t enable_mask) __attribute__((always_inline)) static inline void touch_ll_channel_sw_measure_mask(uint16_t chan_mask) { - // Channel shift workaround - LP_ANA_PERI.touch_mux1.touch_xpd = chan_mask << 1; - LP_ANA_PERI.touch_mux1.touch_start = chan_mask << 1; + LP_ANA_PERI.touch_mux1.touch_xpd = chan_mask; + LP_ANA_PERI.touch_mux1.touch_start = chan_mask; } /** @@ -355,8 +352,7 @@ static inline void touch_ll_channel_sw_measure_mask(uint16_t chan_mask) static inline void touch_ll_channel_power_off(uint16_t chan_mask) { uint32_t curr_mask = LP_ANA_PERI.touch_mux1.touch_xpd; - // Channel shift workaround - LP_ANA_PERI.touch_mux1.touch_xpd = (~(chan_mask << 1)) & curr_mask; + LP_ANA_PERI.touch_mux1.touch_xpd = (~chan_mask) & curr_mask; } /** @@ -367,8 +363,7 @@ static inline void touch_ll_channel_power_off(uint16_t chan_mask) __attribute__((always_inline)) static inline void touch_ll_get_active_channel_mask(uint32_t *active_mask) { - // Channel shift workaround - *active_mask = (LP_TOUCH.chn_status.pad_active >> 1); + *active_mask = LP_TOUCH.chn_status.pad_active; } /** @@ -400,8 +395,7 @@ static inline void touch_ll_read_chan_data(uint32_t touch_num, uint8_t sample_cf HAL_ASSERT(type == TOUCH_LL_READ_BENCHMARK || type == TOUCH_LL_READ_SMOOTH); LP_ANA_PERI.touch_mux0.touch_freq_sel = sample_cfg_id; LP_ANA_PERI.touch_mux0.touch_data_sel = type; - // Channel shift workaround - *data = LP_TOUCH.chn_data[touch_num + 1].pad_data; + *data = HAL_FORCE_READ_U32_REG_FIELD(LP_TOUCH.chn_data[touch_num], pad_data); } /** @@ -416,11 +410,6 @@ static inline bool touch_ll_is_measure_done(void) return (bool)LP_TOUCH.chn_status.meas_done; } -static inline uint32_t touch_ll_get_current_measure_channel(void) -{ - // Channel shift workaround - return (uint32_t)(LP_TOUCH.chn_status.scan_curr - 1); -} /** * Select the counting mode of the binarized touch out wave * @@ -493,8 +482,11 @@ static inline void touch_ll_set_idle_channel_connect(touch_pad_conn_type_t type) __attribute__((always_inline)) static inline uint32_t touch_ll_get_current_meas_channel(void) { - // Channel shift workaround - return (uint32_t)(LP_TOUCH.chn_status.scan_curr - 1); + uint32_t curr_chan = LP_TOUCH.chn_status.scan_curr; + HAL_ASSERT(curr_chan < 14); + // Workaround: the curr channel read 0 when the actual channel is 14 + curr_chan = curr_chan == 0 ? 14 : curr_chan; + return curr_chan; } /** @@ -770,8 +762,7 @@ static inline void touch_ll_force_update_benchmark(uint32_t benchmark) */ static inline void touch_ll_waterproof_set_guard_chan(uint32_t pad_num) { - // Channel shift workaround - LP_ANA_PERI.touch_scan_ctrl2.touch_out_ring = pad_num == TOUCH_LL_NULL_CHANNEL ? TOUCH_LL_NULL_CHANNEL : pad_num + 1; + LP_ANA_PERI.touch_scan_ctrl2.touch_out_ring = pad_num; } /** @@ -794,8 +785,7 @@ static inline void touch_ll_waterproof_enable(bool enable) */ static inline void touch_ll_waterproof_set_shield_chan_mask(uint32_t mask) { - // Channel shift workaround - LP_ANA_PERI.touch_mux0.touch_bufsel = mask << 1; + LP_ANA_PERI.touch_mux0.touch_bufsel = mask; } /** @@ -821,16 +811,13 @@ static inline void touch_ll_set_proximity_sensing_channel(uint8_t prox_chan, uin { switch (prox_chan) { case 0: - // Channel shift workaround - LP_ANA_PERI.touch_approach.touch_approach_pad0 = touch_num + 1; + LP_ANA_PERI.touch_approach.touch_approach_pad0 = touch_num; break; case 1: - // Channel shift workaround - LP_ANA_PERI.touch_approach.touch_approach_pad1 = touch_num + 1; + LP_ANA_PERI.touch_approach.touch_approach_pad1 = touch_num; break; case 2: - // Channel shift workaround - LP_ANA_PERI.touch_approach.touch_approach_pad2 = touch_num + 1; + LP_ANA_PERI.touch_approach.touch_approach_pad2 = touch_num; break; default: // invalid proximity channel @@ -921,8 +908,7 @@ static inline bool touch_ll_is_proximity_sensing_channel(uint32_t touch_num) */ static inline void touch_ll_sleep_set_channel_num(uint32_t touch_num) { - // Channel shift workaround - LP_ANA_PERI.touch_slp0.touch_slp_pad = touch_num + 1; + LP_ANA_PERI.touch_slp0.touch_slp_pad = touch_num; } /** diff --git a/components/soc/esp32/include/soc/touch_sensor_channel.h b/components/soc/esp32/include/soc/touch_sensor_channel.h index 02b712ae4a5..fb538423708 100644 --- a/components/soc/esp32/include/soc/touch_sensor_channel.h +++ b/components/soc/esp32/include/soc/touch_sensor_channel.h @@ -1,49 +1,41 @@ -// Copyright 2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2019-2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _SOC_TOUCH_CHANNEL_H #define _SOC_TOUCH_CHANNEL_H //Touch channels -#define TOUCH_PAD_GPIO4_CHANNEL TOUCH_PAD_NUM0 +#define TOUCH_PAD_GPIO4_CHANNEL 0 #define TOUCH_PAD_NUM0_GPIO_NUM 4 -#define TOUCH_PAD_GPIO0_CHANNEL TOUCH_PAD_NUM1 +#define TOUCH_PAD_GPIO0_CHANNEL 1 #define TOUCH_PAD_NUM1_GPIO_NUM 0 -#define TOUCH_PAD_GPIO2_CHANNEL TOUCH_PAD_NUM2 +#define TOUCH_PAD_GPIO2_CHANNEL 2 #define TOUCH_PAD_NUM2_GPIO_NUM 2 -#define TOUCH_PAD_GPIO15_CHANNEL TOUCH_PAD_NUM3 +#define TOUCH_PAD_GPIO15_CHANNEL 3 #define TOUCH_PAD_NUM3_GPIO_NUM 15 -#define TOUCH_PAD_GPIO13_CHANNEL TOUCH_PAD_NUM4 +#define TOUCH_PAD_GPIO13_CHANNEL 4 #define TOUCH_PAD_NUM4_GPIO_NUM 13 -#define TOUCH_PAD_GPIO12_CHANNEL TOUCH_PAD_NUM5 +#define TOUCH_PAD_GPIO12_CHANNEL 5 #define TOUCH_PAD_NUM5_GPIO_NUM 12 -#define TOUCH_PAD_GPIO14_CHANNEL TOUCH_PAD_NUM6 +#define TOUCH_PAD_GPIO14_CHANNEL 6 #define TOUCH_PAD_NUM6_GPIO_NUM 14 -#define TOUCH_PAD_GPIO27_CHANNEL TOUCH_PAD_NUM7 +#define TOUCH_PAD_GPIO27_CHANNEL 7 #define TOUCH_PAD_NUM7_GPIO_NUM 27 -#define TOUCH_PAD_GPIO33_CHANNEL TOUCH_PAD_NUM8 +#define TOUCH_PAD_GPIO33_CHANNEL 8 #define TOUCH_PAD_NUM8_GPIO_NUM 33 -#define TOUCH_PAD_GPIO32_CHANNEL TOUCH_PAD_NUM9 +#define TOUCH_PAD_GPIO32_CHANNEL 9 #define TOUCH_PAD_NUM9_GPIO_NUM 32 #endif diff --git a/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in b/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in index 260501d23bd..d2807282eda 100644 --- a/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in @@ -1699,6 +1699,14 @@ config SOC_TOUCH_SENSOR_NUM int default 14 +config SOC_TOUCH_MIN_CHAN_ID + int + default 1 + +config SOC_TOUCH_MAX_CHAN_ID + int + default 14 + config SOC_TOUCH_SUPPORT_SLEEP_WAKEUP bool default y diff --git a/components/soc/esp32p4/include/soc/soc_caps.h b/components/soc/esp32p4/include/soc/soc_caps.h index 4fff6c8f432..67ce4aed861 100644 --- a/components/soc/esp32p4/include/soc/soc_caps.h +++ b/components/soc/esp32p4/include/soc/soc_caps.h @@ -629,6 +629,8 @@ /*-------------------------- TOUCH SENSOR CAPS -------------------------------*/ #define SOC_TOUCH_SENSOR_VERSION (3) /*!< Hardware version of touch sensor */ #define SOC_TOUCH_SENSOR_NUM (14) /*!< Touch available channel number. Actually there are 15 Touch channels, but channel 14 is not pinned out, limit to 14 channels */ +#define SOC_TOUCH_MIN_CHAN_ID (1U) /*!< Touch minimum channel number */ +#define SOC_TOUCH_MAX_CHAN_ID (14) /*!< Touch maximum channel number */ /* Touch Sensor Features */ #define SOC_TOUCH_SUPPORT_SLEEP_WAKEUP (1) /*!< Touch sensor supports sleep awake */ diff --git a/components/soc/esp32p4/include/soc/touch_sensor_channel.h b/components/soc/esp32p4/include/soc/touch_sensor_channel.h index 77643a5742b..ff009b31ed8 100644 --- a/components/soc/esp32p4/include/soc/touch_sensor_channel.h +++ b/components/soc/esp32p4/include/soc/touch_sensor_channel.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -10,44 +10,44 @@ /* Note: T14 is an internal channel that does not have a corresponding external GPIO. */ -#define TOUCH_PAD_GPIO2_CHANNEL TOUCH_PAD_NUM0 -#define TOUCH_PAD_NUM0_GPIO_NUM 2 +#define TOUCH_PAD_GPIO2_CHANNEL 1 +#define TOUCH_PAD_NUM1_GPIO_NUM 2 -#define TOUCH_PAD_GPIO3_CHANNEL TOUCH_PAD_NUM1 -#define TOUCH_PAD_NUM1_GPIO_NUM 3 +#define TOUCH_PAD_GPIO3_CHANNEL 2 +#define TOUCH_PAD_NUM2_GPIO_NUM 3 -#define TOUCH_PAD_GPIO4_CHANNEL TOUCH_PAD_NUM2 -#define TOUCH_PAD_NUM2_GPIO_NUM 4 +#define TOUCH_PAD_GPIO4_CHANNEL 3 +#define TOUCH_PAD_NUM3_GPIO_NUM 4 -#define TOUCH_PAD_GPIO5_CHANNEL TOUCH_PAD_NUM3 -#define TOUCH_PAD_NUM3_GPIO_NUM 5 +#define TOUCH_PAD_GPIO5_CHANNEL 4 +#define TOUCH_PAD_NUM4_GPIO_NUM 5 -#define TOUCH_PAD_GPIO6_CHANNEL TOUCH_PAD_NUM4 -#define TOUCH_PAD_NUM4_GPIO_NUM 6 +#define TOUCH_PAD_GPIO6_CHANNEL 5 +#define TOUCH_PAD_NUM5_GPIO_NUM 6 -#define TOUCH_PAD_GPIO7_CHANNEL TOUCH_PAD_NUM5 -#define TOUCH_PAD_NUM5_GPIO_NUM 7 +#define TOUCH_PAD_GPIO7_CHANNEL 6 +#define TOUCH_PAD_NUM6_GPIO_NUM 7 -#define TOUCH_PAD_GPIO8_CHANNEL TOUCH_PAD_NUM6 -#define TOUCH_PAD_NUM6_GPIO_NUM 8 +#define TOUCH_PAD_GPIO8_CHANNEL 7 +#define TOUCH_PAD_NUM7_GPIO_NUM 8 -#define TOUCH_PAD_GPIO9_CHANNEL TOUCH_PAD_NUM7 -#define TOUCH_PAD_NUM7_GPIO_NUM 9 +#define TOUCH_PAD_GPIO9_CHANNEL 8 +#define TOUCH_PAD_NUM8_GPIO_NUM 9 -#define TOUCH_PAD_GPIO10_CHANNEL TOUCH_PAD_NUM8 -#define TOUCH_PAD_NUM8_GPIO_NUM 10 +#define TOUCH_PAD_GPIO10_CHANNEL 9 +#define TOUCH_PAD_NUM9_GPIO_NUM 10 -#define TOUCH_PAD_GPIO11_CHANNEL TOUCH_PAD_NUM9 -#define TOUCH_PAD_NUM9_GPIO_NUM 11 +#define TOUCH_PAD_GPIO11_CHANNEL 10 +#define TOUCH_PAD_NUM10_GPIO_NUM 11 -#define TOUCH_PAD_GPIO12_CHANNEL TOUCH_PAD_NUM10 -#define TOUCH_PAD_NUM10_GPIO_NUM 12 +#define TOUCH_PAD_GPIO12_CHANNEL 11 +#define TOUCH_PAD_NUM11_GPIO_NUM 12 -#define TOUCH_PAD_GPIO13_CHANNEL TOUCH_PAD_NUM11 -#define TOUCH_PAD_NUM11_GPIO_NUM 13 +#define TOUCH_PAD_GPIO13_CHANNEL 12 +#define TOUCH_PAD_NUM12_GPIO_NUM 13 -#define TOUCH_PAD_GPIO14_CHANNEL TOUCH_PAD_NUM12 -#define TOUCH_PAD_NUM12_GPIO_NUM 14 +#define TOUCH_PAD_GPIO14_CHANNEL 13 +#define TOUCH_PAD_NUM13_GPIO_NUM 14 -#define TOUCH_PAD_GPIO15_CHANNEL TOUCH_PAD_NUM13 -#define TOUCH_PAD_NUM13_GPIO_NUM 15 +#define TOUCH_PAD_GPIO15_CHANNEL 14 +#define TOUCH_PAD_NUM14_GPIO_NUM 15 diff --git a/components/soc/esp32p4/touch_sensor_periph.c b/components/soc/esp32p4/touch_sensor_periph.c index 0cd872effe1..1cba03337b1 100644 --- a/components/soc/esp32p4/touch_sensor_periph.c +++ b/components/soc/esp32p4/touch_sensor_periph.c @@ -7,9 +7,9 @@ #include "soc/touch_sensor_channel.h" /* Store IO number corresponding to the Touch Sensor channel number. */ -/* Note: T14 is an internal channel that does not have a corresponding external GPIO. */ +/* Note: T0 is an internal channel that does not have a corresponding external GPIO. */ const int touch_sensor_channel_io_map[] = { - TOUCH_PAD_NUM0_GPIO_NUM, + -1, TOUCH_PAD_NUM1_GPIO_NUM, TOUCH_PAD_NUM2_GPIO_NUM, TOUCH_PAD_NUM3_GPIO_NUM, @@ -23,5 +23,5 @@ const int touch_sensor_channel_io_map[] = { TOUCH_PAD_NUM11_GPIO_NUM, TOUCH_PAD_NUM12_GPIO_NUM, TOUCH_PAD_NUM13_GPIO_NUM, - -1, + TOUCH_PAD_NUM14_GPIO_NUM, }; diff --git a/components/soc/esp32s2/include/soc/touch_sensor_channel.h b/components/soc/esp32s2/include/soc/touch_sensor_channel.h index a405a6bd1cf..61197c92c42 100644 --- a/components/soc/esp32s2/include/soc/touch_sensor_channel.h +++ b/components/soc/esp32s2/include/soc/touch_sensor_channel.h @@ -1,16 +1,8 @@ -// Copyright 2010-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2010-2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _SOC_TOUCH_CHANNEL_H #define _SOC_TOUCH_CHANNEL_H @@ -19,46 +11,46 @@ /* Note: T0 is an internal channel that does not have a corresponding external GPIO. */ -#define TOUCH_PAD_GPIO1_CHANNEL TOUCH_PAD_NUM1 +#define TOUCH_PAD_GPIO1_CHANNEL 1 #define TOUCH_PAD_NUM1_GPIO_NUM 1 -#define TOUCH_PAD_GPIO2_CHANNEL TOUCH_PAD_NUM2 +#define TOUCH_PAD_GPIO2_CHANNEL 2 #define TOUCH_PAD_NUM2_GPIO_NUM 2 -#define TOUCH_PAD_GPIO3_CHANNEL TOUCH_PAD_NUM3 +#define TOUCH_PAD_GPIO3_CHANNEL 3 #define TOUCH_PAD_NUM3_GPIO_NUM 3 -#define TOUCH_PAD_GPIO4_CHANNEL TOUCH_PAD_NUM4 +#define TOUCH_PAD_GPIO4_CHANNEL 4 #define TOUCH_PAD_NUM4_GPIO_NUM 4 -#define TOUCH_PAD_GPIO5_CHANNEL TOUCH_PAD_NUM5 +#define TOUCH_PAD_GPIO5_CHANNEL 5 #define TOUCH_PAD_NUM5_GPIO_NUM 5 -#define TOUCH_PAD_GPIO6_CHANNEL TOUCH_PAD_NUM6 +#define TOUCH_PAD_GPIO6_CHANNEL 6 #define TOUCH_PAD_NUM6_GPIO_NUM 6 -#define TOUCH_PAD_GPIO7_CHANNEL TOUCH_PAD_NUM7 +#define TOUCH_PAD_GPIO7_CHANNEL 7 #define TOUCH_PAD_NUM7_GPIO_NUM 7 -#define TOUCH_PAD_GPIO8_CHANNEL TOUCH_PAD_NUM8 +#define TOUCH_PAD_GPIO8_CHANNEL 8 #define TOUCH_PAD_NUM8_GPIO_NUM 8 -#define TOUCH_PAD_GPIO9_CHANNEL TOUCH_PAD_NUM9 +#define TOUCH_PAD_GPIO9_CHANNEL 9 #define TOUCH_PAD_NUM9_GPIO_NUM 9 -#define TOUCH_PAD_GPIO10_CHANNEL TOUCH_PAD_NUM10 -#define TOUCH_PAD_NUM10_GPIO_NUM 10 +#define TOUCH_PAD_GPIO10_CHANNEL 10 +#define TOUCH_PAD_NUM10_GPIO_NUM 10 -#define TOUCH_PAD_GPIO11_CHANNEL TOUCH_PAD_NUM11 -#define TOUCH_PAD_NUM11_GPIO_NUM 11 +#define TOUCH_PAD_GPIO11_CHANNEL 11 +#define TOUCH_PAD_NUM11_GPIO_NUM 11 -#define TOUCH_PAD_GPIO12_CHANNEL TOUCH_PAD_NUM12 -#define TOUCH_PAD_NUM12_GPIO_NUM 12 +#define TOUCH_PAD_GPIO12_CHANNEL 12 +#define TOUCH_PAD_NUM12_GPIO_NUM 12 -#define TOUCH_PAD_GPIO13_CHANNEL TOUCH_PAD_NUM13 -#define TOUCH_PAD_NUM13_GPIO_NUM 13 +#define TOUCH_PAD_GPIO13_CHANNEL 13 +#define TOUCH_PAD_NUM13_GPIO_NUM 13 -#define TOUCH_PAD_GPIO14_CHANNEL TOUCH_PAD_NUM14 -#define TOUCH_PAD_NUM14_GPIO_NUM 14 +#define TOUCH_PAD_GPIO14_CHANNEL 14 +#define TOUCH_PAD_NUM14_GPIO_NUM 14 #endif diff --git a/components/soc/esp32s3/include/soc/touch_channel.h b/components/soc/esp32s3/include/soc/touch_channel.h deleted file mode 100644 index d0921c59ae1..00000000000 --- a/components/soc/esp32s3/include/soc/touch_channel.h +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2010-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#pragma once - -//Touch channels -#define TOUCH_PAD_GPIO4_CHANNEL TOUCH_PAD_NUM0 -#define TOUCH_PAD_NUM0_GPIO_NUM 4 - -#define TOUCH_PAD_GPIO0_CHANNEL TOUCH_PAD_NUM1 -#define TOUCH_PAD_NUM1_GPIO_NUM 0 - -#define TOUCH_PAD_GPIO2_CHANNEL TOUCH_PAD_NUM2 -#define TOUCH_PAD_NUM2_GPIO_NUM 2 - -#define TOUCH_PAD_GPIO15_CHANNEL TOUCH_PAD_NUM3 -#define TOUCH_PAD_NUM3_GPIO_NUM 15 - -#define TOUCH_PAD_GPIO13_CHANNEL TOUCH_PAD_NUM4 -#define TOUCH_PAD_NUM4_GPIO_NUM 13 - -#define TOUCH_PAD_GPIO12_CHANNEL TOUCH_PAD_NUM5 -#define TOUCH_PAD_NUM5_GPIO_NUM 12 - -#define TOUCH_PAD_GPIO14_CHANNEL TOUCH_PAD_NUM6 -#define TOUCH_PAD_NUM6_GPIO_NUM 14 - -#define TOUCH_PAD_GPIO27_CHANNEL TOUCH_PAD_NUM7 -#define TOUCH_PAD_NUM7_GPIO_NUM 27 - -#define TOUCH_PAD_GPIO33_CHANNEL TOUCH_PAD_NUM8 -#define TOUCH_PAD_NUM8_GPIO_NUM 33 - -#define TOUCH_PAD_GPIO32_CHANNEL TOUCH_PAD_NUM9 -#define TOUCH_PAD_NUM9_GPIO_NUM 32 diff --git a/components/soc/esp32s3/include/soc/touch_sensor_channel.h b/components/soc/esp32s3/include/soc/touch_sensor_channel.h index d5065eac4f3..88d58d66b98 100644 --- a/components/soc/esp32s3/include/soc/touch_sensor_channel.h +++ b/components/soc/esp32s3/include/soc/touch_sensor_channel.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -10,44 +10,44 @@ /* Note: T0 is an internal channel that does not have a corresponding external GPIO. */ -#define TOUCH_PAD_GPIO1_CHANNEL TOUCH_PAD_NUM1 +#define TOUCH_PAD_GPIO1_CHANNEL 1 #define TOUCH_PAD_NUM1_GPIO_NUM 1 -#define TOUCH_PAD_GPIO2_CHANNEL TOUCH_PAD_NUM2 +#define TOUCH_PAD_GPIO2_CHANNEL 2 #define TOUCH_PAD_NUM2_GPIO_NUM 2 -#define TOUCH_PAD_GPIO3_CHANNEL TOUCH_PAD_NUM3 +#define TOUCH_PAD_GPIO3_CHANNEL 3 #define TOUCH_PAD_NUM3_GPIO_NUM 3 -#define TOUCH_PAD_GPIO4_CHANNEL TOUCH_PAD_NUM4 +#define TOUCH_PAD_GPIO4_CHANNEL 4 #define TOUCH_PAD_NUM4_GPIO_NUM 4 -#define TOUCH_PAD_GPIO5_CHANNEL TOUCH_PAD_NUM5 +#define TOUCH_PAD_GPIO5_CHANNEL 5 #define TOUCH_PAD_NUM5_GPIO_NUM 5 -#define TOUCH_PAD_GPIO6_CHANNEL TOUCH_PAD_NUM6 +#define TOUCH_PAD_GPIO6_CHANNEL 6 #define TOUCH_PAD_NUM6_GPIO_NUM 6 -#define TOUCH_PAD_GPIO7_CHANNEL TOUCH_PAD_NUM7 +#define TOUCH_PAD_GPIO7_CHANNEL 7 #define TOUCH_PAD_NUM7_GPIO_NUM 7 -#define TOUCH_PAD_GPIO8_CHANNEL TOUCH_PAD_NUM8 +#define TOUCH_PAD_GPIO8_CHANNEL 8 #define TOUCH_PAD_NUM8_GPIO_NUM 8 -#define TOUCH_PAD_GPIO9_CHANNEL TOUCH_PAD_NUM9 +#define TOUCH_PAD_GPIO9_CHANNEL 9 #define TOUCH_PAD_NUM9_GPIO_NUM 9 -#define TOUCH_PAD_GPIO10_CHANNEL TOUCH_PAD_NUM10 -#define TOUCH_PAD_NUM10_GPIO_NUM 10 +#define TOUCH_PAD_GPIO10_CHANNEL 10 +#define TOUCH_PAD_NUM10_GPIO_NUM 10 -#define TOUCH_PAD_GPIO11_CHANNEL TOUCH_PAD_NUM11 -#define TOUCH_PAD_NUM11_GPIO_NUM 11 +#define TOUCH_PAD_GPIO11_CHANNEL 11 +#define TOUCH_PAD_NUM11_GPIO_NUM 11 -#define TOUCH_PAD_GPIO12_CHANNEL TOUCH_PAD_NUM12 -#define TOUCH_PAD_NUM12_GPIO_NUM 12 +#define TOUCH_PAD_GPIO12_CHANNEL 12 +#define TOUCH_PAD_NUM12_GPIO_NUM 12 -#define TOUCH_PAD_GPIO13_CHANNEL TOUCH_PAD_NUM13 -#define TOUCH_PAD_NUM13_GPIO_NUM 13 +#define TOUCH_PAD_GPIO13_CHANNEL 13 +#define TOUCH_PAD_NUM13_GPIO_NUM 13 -#define TOUCH_PAD_GPIO14_CHANNEL TOUCH_PAD_NUM14 -#define TOUCH_PAD_NUM14_GPIO_NUM 14 +#define TOUCH_PAD_GPIO14_CHANNEL 14 +#define TOUCH_PAD_NUM14_GPIO_NUM 14 diff --git a/tools/ci/check_copyright_ignore.txt b/tools/ci/check_copyright_ignore.txt index b689dab5116..6717718b4ce 100644 --- a/tools/ci/check_copyright_ignore.txt +++ b/tools/ci/check_copyright_ignore.txt @@ -533,7 +533,6 @@ components/soc/esp32s2/include/soc/gpio_sig_map.h components/soc/esp32s2/include/soc/memprot_defs.h components/soc/esp32s2/include/soc/nrx_reg.h components/soc/esp32s2/include/soc/soc_ulp.h -components/soc/esp32s2/include/soc/touch_sensor_channel.h components/soc/esp32s2/include/soc/touch_sensor_pins.h components/soc/esp32s2/include/soc/uart_pins.h components/soc/esp32s2/include/soc/wdev_reg.h From 52c860144a67d6aa4128edb151914756636e772e Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Wed, 28 May 2025 20:56:12 +0800 Subject: [PATCH 064/213] fix(touch): fixed incorrect interval clock source --- .../esp_driver_touch_sens/common/touch_sens_private.h | 1 + .../hw_ver3/touch_version_specific.c | 9 ++++++++- .../test_apps/touch_sens/main/test_touch_sens_common.c | 4 ++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/components/esp_driver_touch_sens/common/touch_sens_private.h b/components/esp_driver_touch_sens/common/touch_sens_private.h index 325acb775e5..48b671bb3a8 100644 --- a/components/esp_driver_touch_sens/common/touch_sens_private.h +++ b/components/esp_driver_touch_sens/common/touch_sens_private.h @@ -67,6 +67,7 @@ struct touch_sensor_s { touch_channel_handle_t ch[SOC_TOUCH_SENSOR_NUM]; /*!< Touch sensor channel handles, will be NULL if the channel is not registered */ uint32_t chan_mask; /*!< Enabled channel mask, corresponding bit will be set if the channel is registered */ uint32_t src_freq_hz; /*!< Source clock frequency */ + uint32_t interval_freq_hz; /*!< Frequency of the interval clock */ intr_handle_t intr_handle; /*!< Interrupt handle */ touch_event_callbacks_t cbs; /*!< Event callbacks */ touch_channel_handle_t deep_slp_chan; /*!< The configured channel for depp sleep, will be NULL if not enable the deep sleep */ diff --git a/components/esp_driver_touch_sens/hw_ver3/touch_version_specific.c b/components/esp_driver_touch_sens/hw_ver3/touch_version_specific.c index f9d44a75f44..a5a338dc27d 100644 --- a/components/esp_driver_touch_sens/hw_ver3/touch_version_specific.c +++ b/components/esp_driver_touch_sens/hw_ver3/touch_version_specific.c @@ -147,11 +147,18 @@ static esp_err_t s_touch_convert_to_hal_config(touch_sensor_handle_t sens_handle TAG, "get clock frequency failed"); ESP_LOGD(TAG, "touch rtc clock source: RTC_FAST, frequency: %"PRIu32" Hz", sens_handle->src_freq_hz); } + if (!sens_handle->interval_freq_hz) { + ESP_RETURN_ON_ERROR(esp_clk_tree_src_get_freq_hz(SOC_MOD_CLK_RTC_SLOW, ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED, &sens_handle->interval_freq_hz), + TAG, "get interval clock frequency failed"); + } uint32_t src_freq_hz = sens_handle->src_freq_hz; uint32_t src_freq_mhz = src_freq_hz / 1000000; + uint32_t interval_freq_mhz = sens_handle->interval_freq_hz / 1000000; hal_cfg->power_on_wait_ticks = (uint32_t)sens_cfg->power_on_wait_us * src_freq_mhz; - hal_cfg->meas_interval_ticks = (uint32_t)(sens_cfg->meas_interval_us * src_freq_mhz); + hal_cfg->power_on_wait_ticks = hal_cfg->power_on_wait_ticks > TOUCH_LL_PAD_MEASURE_WAIT_MAX ? + TOUCH_LL_PAD_MEASURE_WAIT_MAX : hal_cfg->power_on_wait_ticks; + hal_cfg->meas_interval_ticks = (uint32_t)(sens_cfg->meas_interval_us * interval_freq_mhz); hal_cfg->timeout_ticks = (uint32_t)sens_cfg->max_meas_time_us * src_freq_mhz; ESP_RETURN_ON_FALSE(hal_cfg->timeout_ticks <= TOUCH_LL_TIMEOUT_MAX, ESP_ERR_INVALID_ARG, TAG, "max_meas_time_ms should within %"PRIu32, TOUCH_LL_TIMEOUT_MAX / src_freq_mhz); diff --git a/components/esp_driver_touch_sens/test_apps/touch_sens/main/test_touch_sens_common.c b/components/esp_driver_touch_sens/test_apps/touch_sens/main/test_touch_sens_common.c index b93c277b0eb..c5c0adc3cee 100644 --- a/components/esp_driver_touch_sens/test_apps/touch_sens/main/test_touch_sens_common.c +++ b/components/esp_driver_touch_sens/test_apps/touch_sens/main/test_touch_sens_common.c @@ -52,8 +52,8 @@ TEST_CASE("touch_sens_install_uninstall_test", "[touch]") TEST_ESP_OK(touch_sensor_new_channel(touch, i + TOUCH_MIN_CHAN_ID, &s_chan_cfg, &touch_chan[i])); } touch_channel_handle_t fault_chan = NULL; - TEST_ASSERT(touch_sensor_new_channel(touch, TOUCH_TOTAL_CHAN_NUM, &s_chan_cfg, &fault_chan) == ESP_ERR_INVALID_ARG); - TEST_ASSERT(touch_sensor_new_channel(touch, 0, &s_chan_cfg, &fault_chan) == ESP_ERR_INVALID_STATE); + TEST_ASSERT(touch_sensor_new_channel(touch, TOUCH_TOTAL_CHAN_NUM + TOUCH_MIN_CHAN_ID, &s_chan_cfg, &fault_chan) == ESP_ERR_INVALID_ARG); + TEST_ASSERT(touch_sensor_new_channel(touch, TOUCH_MIN_CHAN_ID, &s_chan_cfg, &fault_chan) == ESP_ERR_INVALID_STATE); TEST_ESP_OK(touch_sensor_enable(touch)); TEST_ASSERT(touch_sensor_del_channel(touch_chan[0]) == ESP_ERR_INVALID_STATE); From 4ecedae60f6a9b261cb3d5d6f374386532595876 Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Fri, 13 Jun 2025 16:34:38 +0800 Subject: [PATCH 065/213] fix(touch): fixed touch interval freq unit convert issue --- .../esp_driver_touch_sens/hw_ver3/touch_version_specific.c | 3 +-- tools/ci/check_copyright_ignore.txt | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/components/esp_driver_touch_sens/hw_ver3/touch_version_specific.c b/components/esp_driver_touch_sens/hw_ver3/touch_version_specific.c index a5a338dc27d..4ef56906efd 100644 --- a/components/esp_driver_touch_sens/hw_ver3/touch_version_specific.c +++ b/components/esp_driver_touch_sens/hw_ver3/touch_version_specific.c @@ -154,11 +154,10 @@ static esp_err_t s_touch_convert_to_hal_config(touch_sensor_handle_t sens_handle uint32_t src_freq_hz = sens_handle->src_freq_hz; uint32_t src_freq_mhz = src_freq_hz / 1000000; - uint32_t interval_freq_mhz = sens_handle->interval_freq_hz / 1000000; hal_cfg->power_on_wait_ticks = (uint32_t)sens_cfg->power_on_wait_us * src_freq_mhz; hal_cfg->power_on_wait_ticks = hal_cfg->power_on_wait_ticks > TOUCH_LL_PAD_MEASURE_WAIT_MAX ? TOUCH_LL_PAD_MEASURE_WAIT_MAX : hal_cfg->power_on_wait_ticks; - hal_cfg->meas_interval_ticks = (uint32_t)(sens_cfg->meas_interval_us * interval_freq_mhz); + hal_cfg->meas_interval_ticks = (uint32_t)(sens_cfg->meas_interval_us * sens_handle->interval_freq_hz / 1000000); hal_cfg->timeout_ticks = (uint32_t)sens_cfg->max_meas_time_us * src_freq_mhz; ESP_RETURN_ON_FALSE(hal_cfg->timeout_ticks <= TOUCH_LL_TIMEOUT_MAX, ESP_ERR_INVALID_ARG, TAG, "max_meas_time_ms should within %"PRIu32, TOUCH_LL_TIMEOUT_MAX / src_freq_mhz); diff --git a/tools/ci/check_copyright_ignore.txt b/tools/ci/check_copyright_ignore.txt index 6717718b4ce..6a2c501d5e6 100644 --- a/tools/ci/check_copyright_ignore.txt +++ b/tools/ci/check_copyright_ignore.txt @@ -520,7 +520,6 @@ components/soc/esp32/include/soc/reset_reasons.h components/soc/esp32/include/soc/sdmmc_pins.h components/soc/esp32/include/soc/soc_pins.h components/soc/esp32/include/soc/soc_ulp.h -components/soc/esp32/include/soc/touch_sensor_channel.h components/soc/esp32/include/soc/uart_pins.h components/soc/esp32/include/soc/wdev_reg.h components/soc/esp32/ledc_periph.c From 312ff02b432106b444e518a555be11826daae9e9 Mon Sep 17 00:00:00 2001 From: Fu Hanxi Date: Tue, 11 Mar 2025 10:07:35 +0100 Subject: [PATCH 066/213] docs: fetch all tags while deploying --- .gitlab/ci/docs.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitlab/ci/docs.yml b/.gitlab/ci/docs.yml index 3f7dd1c6086..1d068753a29 100644 --- a/.gitlab/ci/docs.yml +++ b/.gitlab/ci/docs.yml @@ -144,11 +144,16 @@ build_docs_html_partial: variables: DOCS_BUILD_DIR: "${IDF_PATH}/docs/_build/" PYTHONUNBUFFERED: 1 + # ensure all tags are fetched, need to know the latest/stable tag for the docs + GIT_STRATEGY: clone + GIT_DEPTH: 0 stage: test_deploy tags: - deploy - shiny script: + # ensure all tags are fetched, need to know the latest/stable tag for the docs + - git fetch --tags --prune - add_doc_server_ssh_keys $DOCS_DEPLOY_PRIVATEKEY $DOCS_DEPLOY_SERVER $DOCS_DEPLOY_SERVER_USER - export GIT_VER=$(git describe --always ${PIPELINE_COMMIT_SHA} --) - deploy-docs From 950a7d22c8a482b284d3f88dc3e9232a63259126 Mon Sep 17 00:00:00 2001 From: liqigan Date: Thu, 19 Jun 2025 20:30:35 +0800 Subject: [PATCH 067/213] fix(bt/controller): Fixed bugs on LMP legacy and secure authentication collision --- components/bt/controller/lib_esp32 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32 b/components/bt/controller/lib_esp32 index 6d007b71671..b0ebfcf639d 160000 --- a/components/bt/controller/lib_esp32 +++ b/components/bt/controller/lib_esp32 @@ -1 +1 @@ -Subproject commit 6d007b7167146b31256b29fed31e04dc46989885 +Subproject commit b0ebfcf639d62e1d1926a9936e048405ebb48e7f From d36596bc564b9b7e6422b8a5f804db471e8dc94c Mon Sep 17 00:00:00 2001 From: Jan Beran Date: Mon, 2 Jun 2025 12:56:16 +0200 Subject: [PATCH 068/213] change: detect misspelled Kconfig[.projbuild] file names Original issue: https://github.com/espressif/esp-idf-kconfig/issues/14 --- tools/cmake/kconfig.cmake | 18 +++++ .../build_test_app/main/KConfig.projbuild | 4 + tools/test_build_system/test_build.py | 76 +++++++++++++++---- 3 files changed, 82 insertions(+), 16 deletions(-) create mode 100644 tools/test_build_system/build_test_app/main/KConfig.projbuild diff --git a/tools/cmake/kconfig.cmake b/tools/cmake/kconfig.cmake index f1f0ab20fb5..a768e7df580 100644 --- a/tools/cmake/kconfig.cmake +++ b/tools/cmake/kconfig.cmake @@ -15,6 +15,24 @@ endfunction() # function(__kconfig_component_init component_target) __component_get_property(component_dir ${component_target} COMPONENT_DIR) + + # Check for misspelled Kconfig files + # If found, print a status message, but do not add them to the configuration. + file(GLOB all_files "${component_dir}/*") + foreach(_file IN LISTS all_files) + get_filename_component(_fname ${_file} NAME) + string(TOLOWER "${_fname}" _fname_lowercase) + if(_fname_lowercase STREQUAL "kconfig" AND NOT _fname STREQUAL "Kconfig") + message(STATUS + "${_fname} file should be named 'Kconfig' (uppercase K, the rest lowercase)." + " Full path to the file: ${_file}") + elseif(_fname_lowercase STREQUAL "kconfig.projbuild" AND NOT _fname STREQUAL "Kconfig.projbuild") + message(STATUS + "${_fname} file should be named 'Kconfig.projbuild' (uppercase K, the rest lowercase)." + " Full path to the file: ${_file}") + endif() + endforeach() + file(GLOB kconfig "${component_dir}/Kconfig") list(SORT kconfig) __component_set_property(${component_target} KCONFIG "${kconfig}") diff --git a/tools/test_build_system/build_test_app/main/KConfig.projbuild b/tools/test_build_system/build_test_app/main/KConfig.projbuild new file mode 100644 index 00000000000..4c7e3fb2446 --- /dev/null +++ b/tools/test_build_system/build_test_app/main/KConfig.projbuild @@ -0,0 +1,4 @@ +# Misspelled Kconfig file checks whether it is picked up by the build system +config FROM_MISSPELLED_KCONFIG + bool "From misspelled Kconfig" + default y diff --git a/tools/test_build_system/test_build.py b/tools/test_build_system/test_build.py index bcc2d73527e..5c56d436efb 100644 --- a/tools/test_build_system/test_build.py +++ b/tools/test_build_system/test_build.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 import logging import os @@ -35,7 +35,9 @@ def test_build_alternative_directories(idf_py: IdfPyFunc, func_work_dir: Path, t assert os.listdir(alt_build_dir) != [], 'No files found in new build directory!' default_build_dir = test_app_copy / 'build' if default_build_dir.exists(): - assert os.listdir(default_build_dir) == [], f'Some files were incorrectly put into the default build directory: {default_build_dir}' + assert os.listdir(default_build_dir) == [], ( + f'Some files were incorrectly put into the default build directory: {default_build_dir}' + ) except Exception: raise else: @@ -146,10 +148,17 @@ def test_build_with_sdkconfig_build_abspath(idf_py: IdfPyFunc, test_app_copy: Pa def test_build_fail_on_build_time(idf_py: IdfPyFunc, test_app_copy: Path) -> None: logging.info('Fail on build time works') - append_to_file(test_app_copy / 'CMakeLists.txt', '\n'.join(['', - 'if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/hello.txt")', - 'fail_at_build_time(test_file "hello.txt does not exists")', - 'endif()'])) + append_to_file( + test_app_copy / 'CMakeLists.txt', + '\n'.join( + [ + '', + 'if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/hello.txt")', + 'fail_at_build_time(test_file "hello.txt does not exists")', + 'endif()', + ] + ), + ) ret = idf_py('build', check=False) assert ret.returncode != 0, 'Build should fail if requirements are not satisfied' (test_app_copy / 'hello.txt').touch() @@ -160,10 +169,14 @@ def test_build_fail_on_build_time(idf_py: IdfPyFunc, test_app_copy: Path) -> Non def test_build_dfu(idf_py: IdfPyFunc) -> None: logging.info('DFU build works') ret = idf_py('dfu', check=False) - assert 'command "dfu" is not known to idf.py and is not a Ninja target' in ret.stderr, 'DFU build should fail for default chip target' + assert 'command "dfu" is not known to idf.py and is not a Ninja target' in ret.stderr, ( + 'DFU build should fail for default chip target' + ) idf_py('set-target', 'esp32s2') ret = idf_py('dfu') - assert 'build/dfu.bin" has been written. You may proceed with DFU flashing.' in ret.stdout, 'DFU build should succeed for esp32s2' + assert 'build/dfu.bin" has been written. You may proceed with DFU flashing.' in ret.stdout, ( + 'DFU build should succeed for esp32s2' + ) assert_built(BOOTLOADER_BINS + APP_BINS + PARTITION_BIN + ['build/dfu.bin']) @@ -174,23 +187,35 @@ def test_build_uf2(idf_py: IdfPyFunc) -> None: assert 'build/uf2.bin, ready to be flashed with any ESP USB Bridge' in ret.stdout, 'UF2 build should work for esp32' assert_built(BOOTLOADER_BINS + APP_BINS + PARTITION_BIN + ['build/uf2.bin']) ret = idf_py('uf2-app') - assert 'build/uf2-app.bin, ready to be flashed with any ESP USB Bridge' in ret.stdout, 'UF2 build should work for application binary' + assert 'build/uf2-app.bin, ready to be flashed with any ESP USB Bridge' in ret.stdout, ( + 'UF2 build should work for application binary' + ) assert_built(['build/uf2-app.bin']) idf_py('set-target', 'esp32s2') ret = idf_py('uf2') - assert 'build/uf2.bin, ready to be flashed with any ESP USB Bridge' in ret.stdout, 'UF2 build should work for esp32s2' + assert 'build/uf2.bin, ready to be flashed with any ESP USB Bridge' in ret.stdout, ( + 'UF2 build should work for esp32s2' + ) assert_built(BOOTLOADER_BINS + APP_BINS + PARTITION_BIN + ['build/uf2.bin']) def test_build_loadable_elf(idf_py: IdfPyFunc, test_app_copy: Path) -> None: logging.info('Loadable ELF build works') - (test_app_copy / 'sdkconfig').write_text('\n'.join(['CONFIG_APP_BUILD_TYPE_RAM=y', - 'CONFIG_VFS_SUPPORT_TERMIOS=n', - 'CONFIG_NEWLIB_NANO_FORMAT=y', - 'CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=y', - 'CONFIG_ESP_ERR_TO_NAME_LOOKUP=n'])) + (test_app_copy / 'sdkconfig').write_text( + '\n'.join( + [ + 'CONFIG_APP_BUILD_TYPE_RAM=y', + 'CONFIG_VFS_SUPPORT_TERMIOS=n', + 'CONFIG_NEWLIB_NANO_FORMAT=y', + 'CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=y', + 'CONFIG_ESP_ERR_TO_NAME_LOOKUP=n', + ] + ) + ) idf_py('reconfigure') - assert (test_app_copy / 'build' / 'flasher_args.json').exists(), 'flasher_args.json should be generated in a loadable ELF build' + assert (test_app_copy / 'build' / 'flasher_args.json').exists(), ( + 'flasher_args.json should be generated in a loadable ELF build' + ) idf_py('build') @@ -221,3 +246,22 @@ def test_build_cmake_executable_suffix(idf_py: IdfPyFunc, test_app_copy: Path) - append_to_file((test_app_copy / 'CMakeLists.txt'), 'set(CMAKE_EXECUTABLE_SUFFIX_CXX ".ext")') ret = idf_py('build') assert 'Project build complete' in ret.stdout, 'Build with CMAKE_EXECUTABLE_SUFFIX set failed' + + +def test_build_with_misspelled_kconfig(idf_py: IdfPyFunc, test_app_copy: Path) -> None: + logging.info('idf.py can build with misspelled Kconfig file') + ret = idf_py('build') + assert " file should be named 'Kconfig.projbuild'" in ret.stdout, 'Misspelled Kconfig file should be detected' + assert_built(BOOTLOADER_BINS + APP_BINS + PARTITION_BIN) + with open(test_app_copy / 'sdkconfig', 'r') as f: + sdkconfig = f.read() + # NOTE: Both Windows and macOS are case insensitive and implicitly included all Kconfig files, + # no matter their casing. Linux is case sensitive and will not include Kconfig files with misspelled names. + if sys.platform in ['win32', 'cygwin', 'darwin']: + assert 'CONFIG_FROM_MISSPELLED_KCONFIG' in sdkconfig, ( + 'Config options from misspelled Kconfig file should be set in sdkconfig on Windows/macOS' + ) + else: + assert 'CONFIG_FROM_MISSPELLED_KCONFIG=y' not in sdkconfig, ( + 'Config options from misspelled Kconfig file should not be set in sdkconfig on Linux-based systems' + ) From 391e90ba73f55ae3dc9634f1b73ffa0d3193bd52 Mon Sep 17 00:00:00 2001 From: Jan Beran Date: Tue, 17 Jun 2025 08:52:37 +0200 Subject: [PATCH 069/213] docs: Fix spelling of the word "Kconfig" --- docs/en/contribute/creating-examples.rst | 2 +- docs/zh_CN/contribute/creating-examples.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/contribute/creating-examples.rst b/docs/en/contribute/creating-examples.rst index 61600ebce2f..6c23ba426ce 100644 --- a/docs/en/contribute/creating-examples.rst +++ b/docs/en/contribute/creating-examples.rst @@ -30,6 +30,6 @@ Checklist before submitting a new example: * All code in the example is well structured and commented. * Any unnecessary code (old debugging logs, commented-out code, etc.) is removed from the example. * Options in the example (like network names, addresses, etc) are not hard-coded. Use configuration items if possible, or otherwise declare macros or constants. -* Configuration items are provided in a ``KConfig.projbuild`` file with a menu named "Example Configuration". See existing example projects to see how this is done. +* Configuration items are provided in a ``Kconfig.projbuild`` file with a menu named "Example Configuration". See existing example projects to see how this is done. * All original example code has a license header saying it is "in the public domain / CC0", and a warranty disclaimer clause. Alternatively, the example is licensed under Apache License 2.0. See existing examples for headers to adapt from. * Any adapted or third party example code has the original license header on it. This code must be licensed compatible with Apache License 2.0. diff --git a/docs/zh_CN/contribute/creating-examples.rst b/docs/zh_CN/contribute/creating-examples.rst index a2624564b94..a7d3820bad8 100644 --- a/docs/zh_CN/contribute/creating-examples.rst +++ b/docs/zh_CN/contribute/creating-examples.rst @@ -30,6 +30,6 @@ - 示例项目中的所有代码结构良好,关键代码要有详细注释。 - 示例项目中所有不必要的代码(旧的调试日志,注释掉的代码等)都必须清除掉。 - 示例项目中使用的选项(比如网络名称,地址等)不得直接硬编码,应尽可能地使用配置项,或者定义为宏或常量。 -- 配置项可见 ``KConfig.projbuild`` 文件,该文件中包含一个名为 “Example Configuration” 的菜单。具体情况,请查看现有示例项目。 +- 配置项可见 ``Kconfig.projbuild`` 文件,该文件中包含一个名为 “Example Configuration” 的菜单。具体情况,请查看现有示例项目。 - 所有的源代码都需要在文件开头指定许可信息(表示该代码是 ``in the public domain CC0``)和免责声明。或者,源代码也可以应用 ``Apache License 2.0`` 许可条款。请查看现有示例项目的许可信息和免责声明,并根据实际情况进行修改。 - 任何第三方代码(无论是直接使用,还是进行了一些改进)均应保留原始代码中的许可信息,且这些代码的许可必须兼容 ``Apache License 2.0`` 协议。 From e6c8cc5a65e689252691778137d9da438a456bf8 Mon Sep 17 00:00:00 2001 From: Zhao Wei Liang Date: Fri, 20 Jun 2025 15:31:35 +0800 Subject: [PATCH 070/213] fix(ble): fixed assertion issue in connection state on ESP32C2-ECO4 (cherry picked from commit 83fd955f11a3813eb31aacc259d6b95a05b7aeea) Co-authored-by: zwl --- components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld b/components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld index 00800134b26..0dea959a286 100644 --- a/components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld +++ b/components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld @@ -233,8 +233,8 @@ r_ble_ll_conn_is_dev_connected = 0x40000dec; r_ble_ll_conn_is_empty_pdu = 0x40000df0; r_ble_ll_conn_is_lru = 0x40000df4; r_ble_ll_conn_master_init = 0x40000df8; -r_ble_ll_conn_module_deinit = 0x40000dfc; -r_ble_ll_conn_module_init = 0x40000e00; +//r_ble_ll_conn_module_deinit = 0x40000dfc; +//r_ble_ll_conn_module_init = 0x40000e00; r_ble_ll_conn_module_reset = 0x40000e04; r_ble_ll_conn_num_comp_pkts_event_send = 0x40000e0c; r_ble_ll_conn_prepare_tx_pdu = 0x40000e10; @@ -694,7 +694,7 @@ r_ble_lll_conn_halt = 0x4000152c; r_ble_lll_conn_master_common_init = 0x40001530; r_ble_lll_conn_master_new = 0x40001534; r_ble_lll_conn_module_deinit = 0x40001538; -r_ble_lll_conn_module_init = 0x4000153c; +//r_ble_lll_conn_module_init = 0x4000153c; r_ble_lll_conn_module_reset = 0x40001540; r_ble_lll_conn_no_mem_evt_pre_cb = 0x40001544; r_ble_lll_conn_pre_process = 0x40001548; From 421be5de07570ef1737056a5dacf5a3f0fe7b8a9 Mon Sep 17 00:00:00 2001 From: linruihao Date: Thu, 29 May 2025 19:12:33 +0800 Subject: [PATCH 071/213] fix(coex): Fix ble disconnect when coexisting wifi on esp32c2 --- components/esp_rom/esp32c2/ld/esp32c2.rom.eco4.ld | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esp_rom/esp32c2/ld/esp32c2.rom.eco4.ld b/components/esp_rom/esp32c2/ld/esp32c2.rom.eco4.ld index 2102daeb9ee..482643f9d62 100644 --- a/components/esp_rom/esp32c2/ld/esp32c2.rom.eco4.ld +++ b/components/esp_rom/esp32c2/ld/esp32c2.rom.eco4.ld @@ -129,7 +129,7 @@ s_trans_id = 0x3fcdfac4; ***************************************/ /* Functions */ -coex_core_event_duration_get = 0x40002178; +/* coex_core_event_duration_get = 0x40002178; */ /* coex_core_timer_idx_get = 0x4000218c; */ coex_hw_timer_tick_get = 0x400021b8; From c32377d6e74e3d65cb6a215e420f56013cee3faf Mon Sep 17 00:00:00 2001 From: linruihao Date: Thu, 19 Jun 2025 14:42:11 +0800 Subject: [PATCH 072/213] fix(bt/bluedroid): Fix AVRCP build issue when disable Cover Art Closes https://github.com/espressif/esp-idf/issues/16155 --- components/bt/host/bluedroid/btc/profile/std/avrc/btc_avrc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/bt/host/bluedroid/btc/profile/std/avrc/btc_avrc.c b/components/bt/host/bluedroid/btc/profile/std/avrc/btc_avrc.c index 9f1a0cb54f0..c6ce8fedda6 100644 --- a/components/bt/host/bluedroid/btc/profile/std/avrc/btc_avrc.c +++ b/components/bt/host/bluedroid/btc/profile/std/avrc/btc_avrc.c @@ -1640,9 +1640,11 @@ void btc_avrc_get_profile_status(esp_avrc_profile_status_t *param) if (btc_avrc_ct_init_p()) { param->avrc_ct_inited = true; } +#if BTC_AV_CA_INCLUDED if (btc_rc_cb.rc_cover_art_connected) { param->ct_cover_art_conn_num++; } +#endif } } From 45080e9740b4dbf73f31f5072f642103bae711b5 Mon Sep 17 00:00:00 2001 From: linruihao Date: Thu, 19 Jun 2025 19:42:46 +0800 Subject: [PATCH 073/213] ci(bt/bluedroid): Add CI build test for A2DP Sink example with Caver Art disabled --- .../classic_bt/a2dp_sink/sdkconfig.ci.ca_dis | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 examples/bluetooth/bluedroid/classic_bt/a2dp_sink/sdkconfig.ci.ca_dis diff --git a/examples/bluetooth/bluedroid/classic_bt/a2dp_sink/sdkconfig.ci.ca_dis b/examples/bluetooth/bluedroid/classic_bt/a2dp_sink/sdkconfig.ci.ca_dis new file mode 100644 index 00000000000..1c6372a1b37 --- /dev/null +++ b/examples/bluetooth/bluedroid/classic_bt/a2dp_sink/sdkconfig.ci.ca_dis @@ -0,0 +1,12 @@ +# Override some defaults so BT stack is enabled and +# Classic BT is enabled and BT_DRAM_RELEASE is disabled +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=n +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=y +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=y +CONFIG_BT_CLASSIC_ENABLED=y +CONFIG_BT_A2DP_ENABLE=y +CONFIG_BT_AVRCP_CT_COVER_ART_ENABLED=n +CONFIG_EXAMPLE_AVRCP_CT_COVER_ART_ENABLE=n +CONFIG_DAC_DMA_AUTO_16BIT_ALIGN=n From dcdd82326310090e4de2ff8ae08c3d86d9b45341 Mon Sep 17 00:00:00 2001 From: Marek Fiala Date: Mon, 9 Jun 2025 10:43:17 +0200 Subject: [PATCH 074/213] feat(tools): adjusted create_ext.py by ruff formatter --- tools/idf_py_actions/create_ext.py | 83 +++++++++++++++++------------- 1 file changed, 47 insertions(+), 36 deletions(-) diff --git a/tools/idf_py_actions/create_ext.py b/tools/idf_py_actions/create_ext.py index 00d9fa28816..01d1deeeced 100644 --- a/tools/idf_py_actions/create_ext.py +++ b/tools/idf_py_actions/create_ext.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 import os import re @@ -8,6 +8,7 @@ from shutil import copytree from typing import Dict import click + from idf_py_actions.tools import PropertyDict @@ -29,12 +30,16 @@ def is_empty_and_create(path: str, action: str) -> None: if not os.path.exists(abspath): os.makedirs(abspath) elif not os.path.isdir(abspath): - print('Your target path is not a directory. Please remove the', os.path.abspath(abspath), - 'or use different target path.') + print( + f'Your target path is not a directory.' + f'Please remove the {os.path.abspath(abspath)} or use different target path.' + ) sys.exit(4) elif len(os.listdir(path)) > 0: - print('The directory', abspath, 'is not empty. To create a', get_type(action), - 'you must empty the directory or choose a different path.') + print( + f'The directory {abspath} is not empty. To create a {get_type(action)} you must ' + f'empty the directory or choose a different path.' + ) sys.exit(3) @@ -61,8 +66,9 @@ def create_component(target_path: str, name: str) -> None: dirs_exist_ok=True, ) os.rename(os.path.join(target_path, 'main.c'), os.path.join(target_path, '.'.join((name, 'c')))) - os.rename(os.path.join(target_path, 'include', 'main.h'), - os.path.join(target_path, 'include', '.'.join((name, 'h')))) + os.rename( + os.path.join(target_path, 'include', 'main.h'), os.path.join(target_path, 'include', '.'.join((name, 'h'))) + ) replace_in_file(os.path.join(target_path, '.'.join((name, 'c'))), 'main', name) replace_in_file(os.path.join(target_path, 'CMakeLists.txt'), 'main', name) @@ -87,45 +93,50 @@ def action_extensions(base_actions: Dict, project_path: str) -> Dict: 'create-project': { 'callback': create_new, 'short_help': 'Create a new project.', - 'help': ('Create a new project with the name NAME specified as argument. ' - 'For example: ' - '`idf.py create-project new_proj` ' - 'will create a new project in subdirectory called `new_proj` ' - 'of the current working directory. ' - "For specifying the new project's path, use either the option --path for specifying the " - 'destination directory, or the global option -C if the project should be created as a ' - 'subdirectory of the specified directory. ' - 'If the target path does not exist it will be created. If the target folder is not empty ' - 'then the operation will fail with return code 3. ' - 'If the target path is not a folder, the script will fail with return code 4. ' - 'After the execution idf.py terminates ' - 'so this operation should be used alone.'), + 'help': ( + 'Create a new project with the name NAME specified as argument. ' + 'For example: ' + '`idf.py create-project new_proj` ' + 'will create a new project in subdirectory called `new_proj` ' + 'of the current working directory. ' + "For specifying the new project's path, use either the option --path for specifying the " + 'destination directory, or the global option -C if the project should be created as a ' + 'subdirectory of the specified directory. ' + 'If the target path does not exist it will be created. If the target folder is not empty ' + 'then the operation will fail with return code 3. ' + 'If the target path is not a folder, the script will fail with return code 4. ' + 'After the execution idf.py terminates ' + 'so this operation should be used alone.' + ), 'arguments': [{'names': ['name']}], 'options': [ { 'names': ['-p', '--path'], - 'help': ('Set the path for the new project. The project ' - 'will be created directly in the given folder if it does not contain anything'), + 'help': ( + 'Set the path for the new project. The project ' + 'will be created directly in the given folder if it does not contain anything' + ), }, ], - }, 'create-component': { 'callback': create_new, 'short_help': 'Create a new component.', - 'help': ('Create a new component with the name NAME specified as argument. ' - 'For example: ' - '`idf.py create-component new_comp` ' - 'will create a new component in subdirectory called `new_comp` ' - 'of the current working directory. ' - "For specifying the new component's path use the option -C. " - 'If the target path does not exist then it will be created. ' - 'If the target folder is not empty ' - 'then the operation will fail with return code 3. ' - 'If the target path is not a folder, the script will fail with return code 4. ' - 'After the execution idf.py terminates ' - 'so this operation should be used alone.'), + 'help': ( + 'Create a new component with the name NAME specified as argument. ' + 'For example: ' + '`idf.py create-component new_comp` ' + 'will create a new component in subdirectory called `new_comp` ' + 'of the current working directory. ' + "For specifying the new component's path use the option -C. " + 'If the target path does not exist then it will be created. ' + 'If the target folder is not empty ' + 'then the operation will fail with return code 3. ' + 'If the target path is not a folder, the script will fail with return code 4. ' + 'After the execution idf.py terminates ' + 'so this operation should be used alone.' + ), 'arguments': [{'names': ['name']}], - } + }, } } From 84760adf2d24578f9963d070edac965c546d539c Mon Sep 17 00:00:00 2001 From: Marek Fiala Date: Fri, 16 May 2025 11:19:52 +0200 Subject: [PATCH 075/213] fix(tools): idf_tools.py install tool@version --- tools/idf_tools.py | 47 +++++++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/tools/idf_tools.py b/tools/idf_tools.py index f188e07951c..43c4b4de4f4 100755 --- a/tools/idf_tools.py +++ b/tools/idf_tools.py @@ -1008,14 +1008,37 @@ class IDFTool(object): def get_preferred_installed_version(self) -> Optional[str]: """ - Get the preferred installed version of the tool. If more versions installed, return the highest. + Get the preferred installed version of the tool. + If more versions installed, return recommended version if exists, otherwise return the highest supported version """ - recommended_versions = [k for k in self.versions_installed - if self.versions[k].status == IDFToolVersion.STATUS_RECOMMENDED - and self.versions[k].compatible_with_platform(self._platform)] - assert len(recommended_versions) <= 1 - if recommended_versions: - return recommended_versions[0] + + try: + self.find_installed_versions() + except ToolBinaryError: + pass + + if self.get_recommended_version() in self.versions_installed: + return self.get_recommended_version() + + supported_installed_versions = [ + k + for k in self.versions_installed + if self.versions[k].status == IDFToolVersion.STATUS_SUPPORTED + and self.versions[k].compatible_with_platform(self._platform) + ] + sorted_supported_installed_versions = sorted( + supported_installed_versions, key=lambda x: self.versions[x], reverse=True + ) + if sorted_supported_installed_versions: + warn( + ''.join( + [ + f'Using supported version {sorted_supported_installed_versions[0]} for tool {self.name} ', + f'as recommended version {self.get_recommended_version()} is not installed.', + ] + ) + ) + return sorted_supported_installed_versions[0] return None def find_installed_versions(self) -> None: @@ -1062,8 +1085,7 @@ class IDFTool(object): else: if ver_str != version: warn(f'tool {self.name} version {version} is installed, but has reported version {ver_str}') - else: - self.versions_installed.append(version) + self.versions_installed.append(version) if tool_error: raise ToolBinaryError @@ -1739,6 +1761,9 @@ def expand_tools_arg(tools_spec: List[str], overall_tools: OrderedDict, targets: # Filtering by ESP_targets tools = [k for k in tools if overall_tools[k].is_supported_for_any_of_targets(targets)] + + # Processing specific version of tool - defined with '@' + tools.extend([tool_pattern for tool_pattern in tools_spec if '@' in tool_pattern]) return tools @@ -2078,10 +2103,6 @@ def process_tool( tool_export_paths: List[str] = [] tool_export_vars: Dict[str, str] = {} - try: - tool.find_installed_versions() - except ToolBinaryError: - pass recommended_version_to_use = tool.get_preferred_installed_version() if not tool.is_executable and recommended_version_to_use: From 38354b9ecdff999361f94d704ee6e3706662fb2b Mon Sep 17 00:00:00 2001 From: Marek Fiala Date: Mon, 2 Jun 2025 15:08:44 +0200 Subject: [PATCH 076/213] test(tools): Added test for installing supported tool version Added test_export_supported_version_cmake in `test_idf_tools.py`, that installs and exports supported version of tool - cmake. --- .gitlab/ci/host-test.yml | 3 ++- .gitlab/ci/test-win.yml | 3 ++- tools/test_idf_tools/test_idf_tools.py | 26 ++++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/.gitlab/ci/host-test.yml b/.gitlab/ci/host-test.yml index 306177b32c5..75318a13f4a 100644 --- a/.gitlab/ci/host-test.yml +++ b/.gitlab/ci/host-test.yml @@ -111,7 +111,8 @@ test_cli_installer: script: # Tools must be downloaded for testing # We could use "idf_tools.py download all", but we don't want to install clang because of its huge size - - python3 ${IDF_PATH}/tools/idf_tools.py download required qemu-riscv32 qemu-xtensa cmake + # cmake@version that is supported + - python3 ${IDF_PATH}/tools/idf_tools.py download required qemu-riscv32 qemu-xtensa cmake cmake@3.16.3 - cd ${IDF_PATH}/tools/test_idf_tools - python3 -m pip install jsonschema - python3 ./test_idf_tools.py -v diff --git a/.gitlab/ci/test-win.yml b/.gitlab/ci/test-win.yml index 42e24469333..5e0a197e063 100644 --- a/.gitlab/ci/test-win.yml +++ b/.gitlab/ci/test-win.yml @@ -31,7 +31,8 @@ test_cli_installer_win: IDF_PATH: "$CI_PROJECT_DIR" script: # Tools must be downloaded for testing - - python ${IDF_PATH}\tools\idf_tools.py download required qemu-riscv32 qemu-xtensa cmake + # cmake@version that is supported + - python ${IDF_PATH}\tools\idf_tools.py download required qemu-riscv32 qemu-xtensa cmake cmake@3.16.3 - cd ${IDF_PATH}\tools\test_idf_tools - python -m pip install jsonschema - python .\test_idf_tools.py diff --git a/tools/test_idf_tools/test_idf_tools.py b/tools/test_idf_tools/test_idf_tools.py index 87eab1dee0c..9bd6872d983 100755 --- a/tools/test_idf_tools/test_idf_tools.py +++ b/tools/test_idf_tools/test_idf_tools.py @@ -303,6 +303,32 @@ class TestUsage(TestUsageBase): self.assertIn(os.path.join(tool_to_test, tool_version), output) + def test_export_supported_version_cmake(self): + tool_to_test = 'cmake' + supported_version = '' + recommended_version = '' + for tool in self.tools_dict['tools']: + if tool['name'] != tool_to_test: + continue + for version in tool['versions']: + if version['status'] == 'supported': + supported_version = version['name'] + elif version['status'] == 'recommended': + recommended_version = version['name'] + + self.run_idf_tools_with_action(['install']) + output = self.run_idf_tools_with_action(['install', f'{tool_to_test}@{supported_version}']) + self.assert_tool_installed(output, tool_to_test, supported_version) + + # Remove the recommended version folder installed by install command (in case of Windows) + recommended_version_folder = os.path.join(self.temp_tools_dir, 'tools', tool_to_test, recommended_version) + if os.path.exists(recommended_version_folder): + shutil.rmtree(recommended_version_folder) + + output = self.run_idf_tools_with_action(['export']) + self.assertIn(os.path.join(tool_to_test, supported_version), output) + self.assertNotIn(os.path.join(tool_to_test, recommended_version), output) + def test_export_prefer_system_cmake(self): tool_to_test = 'cmake' self.run_idf_tools_with_action(['install']) From 347748a6f84eae2f23ed22e6748f0404775dc161 Mon Sep 17 00:00:00 2001 From: Marek Fiala Date: Mon, 2 Jun 2025 16:07:24 +0200 Subject: [PATCH 077/213] fix(tools): idf_tools.py uninstall decide based on preferred tool version idf_tools.py uninstall now doesn't take only recommended version, but makes the decision based on preferred installed versions. --- tools/idf_tools.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/idf_tools.py b/tools/idf_tools.py index 43c4b4de4f4..486df991abf 100755 --- a/tools/idf_tools.py +++ b/tools/idf_tools.py @@ -2913,8 +2913,10 @@ def action_uninstall(args: Any) -> None: for tool in installed_tools: tool_versions = os.listdir(os.path.join(tools_path, tool)) if os.path.isdir(os.path.join(tools_path, tool)) else [] try: - unused_versions = ([x for x in tool_versions if x != tools_info[tool].get_recommended_version()]) - except KeyError: # When tool that is not supported by tools_info (tools.json) anymore, remove the whole tool file + unused_versions = [x for x in tool_versions if x != tools_info[tool].get_preferred_installed_version()] + except ( + KeyError + ): # When tool that is not supported by tools_info (tools.json) anymore, remove the whole tool file unused_versions = [''] if unused_versions: unused_tools_versions[tool] = unused_versions @@ -2959,7 +2961,7 @@ def action_uninstall(args: Any) -> None: tool_name, tool_version = tool_spec.split('@', 1) tool_obj = tools_info_for_platform[tool_name] if tool_version is None: - tool_version = tool_obj.get_recommended_version() + tool_version = tool_obj.get_preferred_installed_version() # mypy-checks if tool_version is not None: archive_version = tool_obj.versions[tool_version].get_download_for_platform(CURRENT_PLATFORM) From e7e7f8feb9214122200fe7fb4e25dd6fd596752f Mon Sep 17 00:00:00 2001 From: Marek Fiala Date: Mon, 9 Jun 2025 10:52:05 +0200 Subject: [PATCH 078/213] fix(tools): idf.py create-project works in read-only ESP-IDF As the native copy function shutil.copyfile preserves directories metadata such as file permissions, we need to ensure the copied destination is writable for owner. Closes https://github.com/espressif/esp-idf/issues/15964 Closes https://github.com/espressif/esp-idf/pull/16021 --- tools/idf_py_actions/create_ext.py | 31 +++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/tools/idf_py_actions/create_ext.py b/tools/idf_py_actions/create_ext.py index 01d1deeeced..ccbaadf989e 100644 --- a/tools/idf_py_actions/create_ext.py +++ b/tools/idf_py_actions/create_ext.py @@ -2,13 +2,13 @@ # SPDX-License-Identifier: Apache-2.0 import os import re +import stat import sys from shutil import copyfile from shutil import copytree from typing import Dict import click - from idf_py_actions.tools import PropertyDict @@ -43,14 +43,37 @@ def is_empty_and_create(path: str, action: str) -> None: sys.exit(3) +def make_directory_permissions_writable(root_path: str) -> None: + """ + Ensures all directories under `root_path` have write permission for the owner. + Skips files and doesn't override existing permissions unnecessarily. + Only applies to POSIX systems (Linux/macOS). + """ + if sys.platform == 'win32': + return + + for current_root, dirs, _ in os.walk(root_path): + for dirname in dirs: + dir_path = os.path.join(current_root, dirname) + try: + current_perm = stat.S_IMODE(os.stat(dir_path).st_mode) + new_perm = current_perm | stat.S_IWUSR # mask permission for owner (write) + if new_perm != current_perm: + os.chmod(dir_path, new_perm) + except PermissionError: + continue + + def create_project(target_path: str, name: str) -> None: copytree( os.path.join(os.environ['IDF_PATH'], 'tools', 'templates', 'sample_project'), target_path, - # 'copyfile' ensures only data are copied, without any metadata (file permissions) + # 'copyfile' ensures only data are copied, without any metadata (file permissions) - for files only copy_function=copyfile, dirs_exist_ok=True, ) + # since 'copyfile' does preserve directory metadata, we need to make sure the directories are writable + make_directory_permissions_writable(target_path) main_folder = os.path.join(target_path, 'main') os.rename(os.path.join(main_folder, 'main.c'), os.path.join(main_folder, '.'.join((name, 'c')))) replace_in_file(os.path.join(main_folder, 'CMakeLists.txt'), 'main', name) @@ -61,10 +84,12 @@ def create_component(target_path: str, name: str) -> None: copytree( os.path.join(os.environ['IDF_PATH'], 'tools', 'templates', 'sample_component'), target_path, - # 'copyfile' ensures only data are copied, without any metadata (file permissions) + # 'copyfile' ensures only data are copied, without any metadata (file permissions) - for files only copy_function=copyfile, dirs_exist_ok=True, ) + # since 'copyfile' does preserve directory metadata, we need to make sure the directories are writable + make_directory_permissions_writable(target_path) os.rename(os.path.join(target_path, 'main.c'), os.path.join(target_path, '.'.join((name, 'c')))) os.rename( os.path.join(target_path, 'include', 'main.h'), os.path.join(target_path, 'include', '.'.join((name, 'h'))) From 5bc5a1474cfb3304d132d5f202e603d75e6a01d1 Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Mon, 9 Jun 2025 14:54:12 +0800 Subject: [PATCH 079/213] fix(hal): fix pmu_ll_ext1_clear_wakeup_status API --- components/hal/esp32p4/include/hal/pmu_ll.h | 1 + 1 file changed, 1 insertion(+) diff --git a/components/hal/esp32p4/include/hal/pmu_ll.h b/components/hal/esp32p4/include/hal/pmu_ll.h index 16ec05fb57f..01b523bed02 100644 --- a/components/hal/esp32p4/include/hal/pmu_ll.h +++ b/components/hal/esp32p4/include/hal/pmu_ll.h @@ -700,6 +700,7 @@ static inline uint32_t pmu_ll_ext1_get_wakeup_status(void) static inline void pmu_ll_ext1_clear_wakeup_status(void) { REG_SET_BIT(PMU_EXT_WAKEUP_CNTL_REG, PMU_EXT_WAKEUP_STATUS_CLR); + REG_CLR_BIT(PMU_EXT_WAKEUP_CNTL_REG, PMU_EXT_WAKEUP_STATUS_CLR); } /** From 28aa20045e79b0f7416a1cb95aa831ae88deb7ea Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Mon, 9 Jun 2025 14:55:08 +0800 Subject: [PATCH 080/213] feat(esp_hw_support): enable wakeup tests for more chips --- .../test_apps/.build-test-rules.yml | 4 +- .../test_apps/wakeup_tests/README.md | 4 +- .../wakeup_tests/main/src/io_wakeup_cmd.c | 58 ++++++++++++++++--- .../wakeup_tests/pytest_wakeup_tests.py | 53 +++++++++++++++-- 4 files changed, 103 insertions(+), 16 deletions(-) diff --git a/components/esp_hw_support/test_apps/.build-test-rules.yml b/components/esp_hw_support/test_apps/.build-test-rules.yml index 0585429ebae..95cd9fa76e4 100644 --- a/components/esp_hw_support/test_apps/.build-test-rules.yml +++ b/components/esp_hw_support/test_apps/.build-test-rules.yml @@ -52,5 +52,7 @@ components/esp_hw_support/test_apps/vad_wakeup: - if: SOC_LP_VAD_SUPPORTED != 1 components/esp_hw_support/test_apps/wakeup_tests: + enable: + - if: SOC_DEEP_SLEEP_SUPPORTED == 1 and SOC_LIGHT_SLEEP_SUPPORTED == 1 disable: - - if: IDF_TARGET in ["esp32c5", "esp32p4", "linux", "esp32c61"] + - if: IDF_TARGET in ["esp32c5", "linux", "esp32c61"] diff --git a/components/esp_hw_support/test_apps/wakeup_tests/README.md b/components/esp_hw_support/test_apps/wakeup_tests/README.md index a8b7833fa30..bf47d80ec64 100644 --- a/components/esp_hw_support/test_apps/wakeup_tests/README.md +++ b/components/esp_hw_support/test_apps/wakeup_tests/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | diff --git a/components/esp_hw_support/test_apps/wakeup_tests/main/src/io_wakeup_cmd.c b/components/esp_hw_support/test_apps/wakeup_tests/main/src/io_wakeup_cmd.c index 3c8c9fc870a..39b5591cd67 100644 --- a/components/esp_hw_support/test_apps/wakeup_tests/main/src/io_wakeup_cmd.c +++ b/components/esp_hw_support/test_apps/wakeup_tests/main/src/io_wakeup_cmd.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -10,6 +10,7 @@ #include "esp_sleep.h" #include "driver/rtc_io.h" #include "driver/gpio.h" +#include "hal/gpio_ll.h" #include "esp_console.h" #include "linenoise/linenoise.h" #include "argtable3/argtable3.h" @@ -128,7 +129,7 @@ static void register_ext1_wakeup(void) const esp_console_cmd_t cmd = { .command = "ext1", - .help = "configue ext1 wakeup", + .help = "configure ext1 wakeup", .hint = NULL, .func = &process_ext1_wakeup, .argtable = &ext1_wakeup_args @@ -202,7 +203,7 @@ static void register_rtcio_wakeup(void) const esp_console_cmd_t cmd = { .command = "rtcio", - .help = "configue rtcio wakeup", + .help = "configure rtcio wakeup", .hint = NULL, .func = &process_rtcio_wakeup, .argtable = &rtcio_wakeup_args @@ -247,13 +248,14 @@ static int process_gpio_wakeup(int argc, char **argv) if (gpio_wakeup_args.disable->count) { ESP_ERROR_CHECK(gpio_wakeup_disable(io_wakeup_num)); + ESP_ERROR_CHECK(gpio_intr_disable(io_wakeup_num)); } else { gpio_config_t config = { .pin_bit_mask = BIT64(io_wakeup_num), .mode = GPIO_MODE_INPUT, .pull_down_en = false, .pull_up_en = false, - .intr_type = GPIO_INTR_DISABLE + .intr_type = (io_wakeup_level == 0) ? GPIO_INTR_LOW_LEVEL : GPIO_INTR_HIGH_LEVEL }; ESP_ERROR_CHECK(gpio_config(&config)); @@ -277,7 +279,7 @@ static void register_gpio_wakeup(void) const esp_console_cmd_t cmd = { .command = "gpio", - .help = "configue gpio wakeup", + .help = "configure gpio wakeup", .hint = NULL, .func = &process_gpio_wakeup, .argtable = &gpio_wakeup_args @@ -336,7 +338,7 @@ static void register_gpio_control(void) const esp_console_cmd_t cmd = { .command = "gpio_control", - .help = "configue gpio control", + .help = "configure gpio control", .hint = NULL, .func = &process_gpio_control, .argtable = &gpio_control_args @@ -358,11 +360,51 @@ static int process_get_wakeup_cause(int argc, char **argv) switch (esp_sleep_get_wakeup_cause()) { case ESP_SLEEP_WAKEUP_EXT1: { - printf("Wake up from EXT1\n"); +#if SOC_PM_SUPPORT_EXT1_WAKEUP && SOC_RTCIO_PIN_COUNT > 0 + uint64_t wakeup_pin_mask = esp_sleep_get_ext1_wakeup_status(); + if (wakeup_pin_mask != 0) { + int pin = __builtin_ffsll(wakeup_pin_mask) - 1; + printf("Wake up from EXT1 at IO%d\n", pin); + } else +#endif + { + printf("Wake up from EXT1 triggered, but unknown wake-up IO\n"); + } break; } case ESP_SLEEP_WAKEUP_GPIO: { - printf("Wake up from GPIO\n"); + if (esp_reset_reason() == ESP_RST_DEEPSLEEP) { +#if SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP + uint64_t wakeup_pin_mask = esp_sleep_get_gpio_wakeup_status(); + if (wakeup_pin_mask != 0) { + int pin = __builtin_ffsll(wakeup_pin_mask) - 1; + printf("Wake up from GPIO at IO%d\n", pin); + } else { + printf("Wake up from GPIO triggered, but unknown wake-up IO\n"); + } +#endif + } else { + struct { + union { + struct + { + uint32_t status_l; + uint32_t status_h; + }; + uint64_t val; + }; + } gpio_intr_status; + gpio_ll_get_intr_status(&GPIO, 0, &gpio_intr_status.status_l); + gpio_ll_get_intr_status_high(&GPIO, 0, &gpio_intr_status.status_h); + + if (gpio_intr_status.val) { + printf("Wake up from GPIO at IO%d\n", __builtin_ffsll(gpio_intr_status.val) - 1); + } else { + printf("Wake up from GPIO triggered, but unknown wake-up IO\n"); + } + gpio_ll_clear_intr_status(&GPIO, 0xFFFFFFFF); + gpio_ll_clear_intr_status_high(&GPIO, 0xFFFFFFFF); + } break; } default: { diff --git a/components/esp_hw_support/test_apps/wakeup_tests/pytest_wakeup_tests.py b/components/esp_hw_support/test_apps/wakeup_tests/pytest_wakeup_tests.py index b99d1345a40..b4511844d16 100644 --- a/components/esp_hw_support/test_apps/wakeup_tests/pytest_wakeup_tests.py +++ b/components/esp_hw_support/test_apps/wakeup_tests/pytest_wakeup_tests.py @@ -1,6 +1,5 @@ -# SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - from time import sleep from typing import Tuple @@ -23,6 +22,40 @@ available_gpio_nums = { 'esp32c3': [0, 1, 2, 3, 4, 5, 6, 7, 10, 18, 19], 'esp32c6': [0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 15, 18, 19, 20, 21, 22, 23], 'esp32h2': [0, 1, 2, 3, 4, 5, 10, 11, 12, 22, 25, 26, 27], + 'esp32p4': [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 28, + 29, + 30, + 31, + 32, + 33, + 36, + 49, + 50, + 51, + 52, + 53, + 54, + ], + 'esp32c5': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 14, 23, 24, 25, 26], } available_rtcio_nums = { @@ -33,6 +66,8 @@ available_rtcio_nums = { 'esp32c3': [0, 1, 2, 3, 4, 5], 'esp32c6': [0, 1, 2, 3, 4, 5, 6, 7], 'esp32h2': [7, 8, 9, 10, 11, 12, 13, 14], + 'esp32p4': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], + 'esp32c5': [0, 1, 2, 3, 4, 5, 6], } @@ -41,6 +76,7 @@ available_rtcio_nums = { @pytest.mark.esp32s3 @pytest.mark.esp32c6 @pytest.mark.esp32h2 +@pytest.mark.esp32p4 @pytest.mark.generic_multi_device @pytest.mark.parametrize('count', [2], indirect=True) @pytest.mark.parametrize('config', TEST_CONFIGS, indirect=True) @@ -81,7 +117,12 @@ def test_ext1_deepsleep(dut: Tuple[IdfDut, IdfDut]) -> None: sleep(2) wakee.write('cause') - wakee.expect('Wake up from EXT1', timeout=10) + # esp32 ext1 all low wakeup mode can not detect wakeup pin. + if (dut[0].target == 'esp32') and (wakeup_level == 0): + wakee.expect('Wake up from EXT1', timeout=10) + else: + wakee.expect(f'Wake up from EXT1 at IO{gpio_num}', timeout=10) + wakee.write(f'ext1 -p {gpio_num} -d') wakee.expect(f'io_wakeup_num = {gpio_num}', timeout=10) @@ -89,6 +130,7 @@ def test_ext1_deepsleep(dut: Tuple[IdfDut, IdfDut]) -> None: @pytest.mark.esp32c2 @pytest.mark.esp32c3 @pytest.mark.esp32c6 +@pytest.mark.esp32p4 @pytest.mark.generic_multi_device @pytest.mark.parametrize('count', [2], indirect=True) @pytest.mark.parametrize('config', TEST_CONFIGS, indirect=True) @@ -129,7 +171,7 @@ def test_rtcio_deepsleep(dut: Tuple[IdfDut, IdfDut]) -> None: sleep(2) wakee.write('cause') - wakee.expect('Wake up from GPIO', timeout=10) + wakee.expect(f'Wake up from GPIO at IO{gpio_num}', timeout=10) wakee.write(f'rtcio -p {gpio_num} -d') wakee.expect(f'io_wakeup_num = {gpio_num}', timeout=10) @@ -141,6 +183,7 @@ def test_rtcio_deepsleep(dut: Tuple[IdfDut, IdfDut]) -> None: @pytest.mark.esp32s3 @pytest.mark.esp32c6 @pytest.mark.esp32h2 +@pytest.mark.esp32p4 @pytest.mark.generic_multi_device @pytest.mark.parametrize('count', [2], indirect=True) @pytest.mark.parametrize('config', TEST_CONFIGS, indirect=True) @@ -175,7 +218,7 @@ def test_gpio_wakeup_enable_lightsleep(dut: Tuple[IdfDut, IdfDut]) -> None: wakee.expect('esp_light_sleep_start', timeout=10) wakee.write('cause') - wakee.expect('Wake up from GPIO', timeout=10) + wakee.expect(f'Wake up from GPIO at IO{gpio_num}', timeout=10) wakee.write(f'gpio -p {gpio_num} -d') wakee.expect(f'io_wakeup_num = {gpio_num}', timeout=10) From ff195f3492b0b86a242b5f7ed21e77121287d4de Mon Sep 17 00:00:00 2001 From: armando Date: Fri, 13 Jun 2025 15:46:17 +0800 Subject: [PATCH 081/213] feat(psram): support fallback to use default driver pattern when id isn't match --- .../esp_psram/device/esp_psram_impl_ap_hex.c | 55 +++++++++++++++++-- .../esp_psram/device/esp_psram_impl_ap_quad.c | 49 ++++++++++++++++- .../esp_psram/esp32s3/esp_psram_impl_octal.c | 53 ++++++++++++++++-- 3 files changed, 144 insertions(+), 13 deletions(-) diff --git a/components/esp_psram/device/esp_psram_impl_ap_hex.c b/components/esp_psram/device/esp_psram_impl_ap_hex.c index 5741acef32a..acf07e4d73e 100644 --- a/components/esp_psram/device/esp_psram_impl_ap_hex.c +++ b/components/esp_psram/device/esp_psram_impl_ap_hex.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2019-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2019-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -48,7 +48,8 @@ #define AP_HEX_PSRAM_WR_LATENCY 2 #endif -#define AP_HEX_PSRAM_VENDOR_ID 0xD +#define AP_HEX_PSRAM_VENDOR_ID_AP 0xD +#define AP_HEX_PSRAM_VENDOR_ID_UNILC 0x1A //UnilC shares driver pattern with AP #define AP_HEX_PSRAM_CS_SETUP_TIME 4 #define AP_HEX_PSRAM_CS_HOLD_TIME 4 #define AP_HEX_PSRAM_CS_ECC_HOLD_TIME 4 @@ -56,6 +57,8 @@ #define AP_HEX_PSRAM_MPLL_DEFAULT_FREQ_MHZ 400 +#define AP_HEX_PSRAM_REF_DATA 0x5a6b7c8d + typedef struct { union { struct { @@ -257,6 +260,41 @@ static void s_get_psram_mode_reg(int spi_num, hex_psram_mode_reg_t *out_reg) false); } +/** + * Check if PSRAM is connected by write and read + */ +static esp_err_t s_check_psram_connected(int spi_num) +{ + uint32_t addr = 0x80; + uint32_t ref_data = AP_HEX_PSRAM_REF_DATA; + uint32_t exp_data = 0; + int data_bit_len = 32; + + //write + addr = 0x0; + s_psram_common_transaction(spi_num, + AP_HEX_PSRAM_SYNC_WRITE, AP_HEX_PSRAM_WR_CMD_BITLEN, + addr, AP_HEX_PSRAM_ADDR_BITLEN, + AP_HEX_PSRAM_WR_DUMMY_BITLEN, + (uint8_t *)&ref_data, data_bit_len, + NULL, 0, + false); + + //read MR4 and MR8 + s_psram_common_transaction(spi_num, + AP_HEX_PSRAM_SYNC_READ, AP_HEX_PSRAM_RD_CMD_BITLEN, + addr, AP_HEX_PSRAM_ADDR_BITLEN, + AP_HEX_PSRAM_RD_DUMMY_BITLEN, + NULL, 0, + (uint8_t *)&exp_data, data_bit_len, + false); + + ESP_EARLY_LOGD(TAG, "exp_data: 0x%08x", exp_data); + ESP_EARLY_LOGD(TAG, "ref_data: 0x%08x", ref_data); + + return (exp_data == ref_data ? ESP_OK : ESP_FAIL); +} + static void s_print_psram_info(hex_psram_mode_reg_t *reg_val) { ESP_EARLY_LOGI(TAG, "vendor id : 0x%02x (%s)", reg_val->mr1.vendor_id, reg_val->mr1.vendor_id == 0x0d ? "AP" : "UNKNOWN"); @@ -405,12 +443,17 @@ esp_err_t esp_psram_impl_enable(void) mode_reg.mr8.x16 = 0; #endif s_init_psram_mode_reg(PSRAM_CTRLR_LL_MSPI_ID_3, &mode_reg); - //Print PSRAM info - s_get_psram_mode_reg(PSRAM_CTRLR_LL_MSPI_ID_3, &mode_reg); - if (mode_reg.mr1.vendor_id != AP_HEX_PSRAM_VENDOR_ID) { - ESP_EARLY_LOGE(TAG, "PSRAM ID read error: 0x%08x, PSRAM chip not found or not supported, or wrong PSRAM line mode", mode_reg.mr1.vendor_id); + + if (s_check_psram_connected(PSRAM_CTRLR_LL_MSPI_ID_3) != ESP_OK) { + ESP_EARLY_LOGE(TAG, "PSRAM chip is not connected"); return ESP_ERR_NOT_SUPPORTED; } + + s_get_psram_mode_reg(PSRAM_CTRLR_LL_MSPI_ID_3, &mode_reg); + if (mode_reg.mr1.vendor_id != AP_HEX_PSRAM_VENDOR_ID_AP && mode_reg.mr1.vendor_id != AP_HEX_PSRAM_VENDOR_ID_UNILC) { + ESP_EARLY_LOGW(TAG, "PSRAM ID read error: 0x%08x, fallback to use default driver pattern", mode_reg.mr1.vendor_id); + } + s_print_psram_info(&mode_reg); s_psram_size = mode_reg.mr2.density == 0x1 ? PSRAM_SIZE_4MB : mode_reg.mr2.density == 0X3 ? PSRAM_SIZE_8MB : diff --git a/components/esp_psram/device/esp_psram_impl_ap_quad.c b/components/esp_psram/device/esp_psram_impl_ap_quad.c index a269751388b..412141fbac2 100644 --- a/components/esp_psram/device/esp_psram_impl_ap_quad.c +++ b/components/esp_psram/device/esp_psram_impl_ap_quad.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -19,6 +19,8 @@ #include "esp_quad_psram_defs.h" #include "soc/soc_caps.h" +#define AP_HEX_PSRAM_REF_DATA 0x5a6b7c8d + static const char* TAG = "quad_psram"; static uint32_t s_psram_size = 0; //this stands for physical psram size in bytes @@ -172,6 +174,42 @@ static void psram_set_cs_timing(void) psram_ctrlr_ll_set_cs_setup(PSRAM_CTRLR_LL_MSPI_ID_0, PSRAM_CS_SETUP_VAL); } +/** + * Check if PSRAM is connected by write and read + */ +static esp_err_t s_check_psram_connected(int spi_num) +{ + uint32_t addr = 0x0; + uint32_t ref_data = AP_HEX_PSRAM_REF_DATA; + uint32_t exp_data = 0; + int data_bit_len = 32; + + //write + psram_exec_cmd(spi_num, PSRAM_HAL_CMD_SPI, + PSRAM_WRITE, 8, + addr, 24, + 0, + (uint8_t *)&ref_data, data_bit_len, + NULL, 0, + PSRAM_LL_CS_SEL, + false); + + //read MR4 and MR8 + psram_exec_cmd(spi_num, PSRAM_HAL_CMD_SPI, + PSRAM_READ, 8, + addr, 24, + 0, + NULL, 0, + (uint8_t *)&exp_data, data_bit_len, + PSRAM_LL_CS_SEL, + false); + + ESP_EARLY_LOGV(TAG, "exp_data: 0x%08x", exp_data); + ESP_EARLY_LOGV(TAG, "ref_data: 0x%08x", ref_data); + + return (exp_data == ref_data ? ESP_OK : ESP_FAIL); +} + static void psram_gpio_config(void) { //CS1 @@ -250,6 +288,12 @@ esp_err_t esp_psram_impl_enable(void) //We use SPI1 to init PSRAM psram_disable_qio_mode(PSRAM_CTRLR_LL_MSPI_ID_1); + + if (s_check_psram_connected(PSRAM_CTRLR_LL_MSPI_ID_1) != ESP_OK) { + ESP_EARLY_LOGE(TAG, "PSRAM chip is not connected, or wrong PSRAM line mode"); + return ESP_ERR_NOT_SUPPORTED; + } + psram_read_id(PSRAM_CTRLR_LL_MSPI_ID_1, (uint8_t *)&psram_id, PSRAM_ID_BITS_NUM); if (!PSRAM_IS_VALID(psram_id)) { /* 16Mbit psram ID read error workaround: @@ -258,8 +302,7 @@ esp_err_t esp_psram_impl_enable(void) */ psram_read_id(PSRAM_CTRLR_LL_MSPI_ID_1, (uint8_t *)&psram_id, PSRAM_ID_BITS_NUM); if (!PSRAM_IS_VALID(psram_id)) { - ESP_EARLY_LOGE(TAG, "PSRAM ID read error: 0x%08x, PSRAM chip not found or not supported, or wrong PSRAM line mode", (uint32_t)psram_id); - return ESP_ERR_NOT_SUPPORTED; + ESP_EARLY_LOGW(TAG, "PSRAM ID read error: 0x%08x, fallback to use default driver pattern", (uint32_t)psram_id); } } diff --git a/components/esp_psram/esp32s3/esp_psram_impl_octal.c b/components/esp_psram/esp32s3/esp_psram_impl_octal.c index a801079ac80..1f3254499ee 100644 --- a/components/esp_psram/esp32s3/esp_psram_impl_octal.c +++ b/components/esp_psram/esp32s3/esp_psram_impl_octal.c @@ -45,6 +45,8 @@ #define OCT_PSRAM_PAGE_SIZE 2 //2 for 1024B #define OCT_PSRAM_ECC_ENABLE_MASK BIT(8) +#define OCT_PSRAM_REF_DATA 0x5a6b7c8d + typedef struct { union { struct { @@ -222,6 +224,44 @@ static void s_get_psram_mode_reg(int spi_num, opi_psram_mode_reg_t *out_reg) false); } +/** + * Check if PSRAM is connected by write and read + */ +static esp_err_t s_check_psram_connected(int spi_num) +{ + esp_rom_spiflash_read_mode_t mode = ESP_ROM_SPIFLASH_OPI_DTR_MODE; + int cmd_len = OCT_PSRAM_WR_CMD_BITLEN; + uint32_t addr = 0x0; + int addr_bit_len = OCT_PSRAM_ADDR_BITLEN; + uint32_t ref_data = OCT_PSRAM_REF_DATA; + uint32_t exp_data = 0; + int data_bit_len = 32; + + //write + esp_rom_opiflash_exec_cmd(spi_num, mode, + OPI_PSRAM_SYNC_WRITE, cmd_len, + addr, addr_bit_len, + OCT_PSRAM_WR_DUMMY_BITLEN, + (uint8_t *)&ref_data, data_bit_len, + NULL, 0, + BIT(1), + false); + //read + esp_rom_opiflash_exec_cmd(spi_num, mode, + OPI_PSRAM_SYNC_READ, cmd_len, + addr, addr_bit_len, + OCT_PSRAM_RD_DUMMY_BITLEN, + NULL, 0, + (uint8_t *)&exp_data, data_bit_len, + BIT(1), + false); + + ESP_EARLY_LOGD(TAG, "exp_data: 0x%08x", exp_data); + ESP_EARLY_LOGD(TAG, "ref_data: 0x%08x", ref_data); + + return (exp_data == ref_data ? ESP_OK : ESP_FAIL); +} + static void s_print_psram_info(opi_psram_mode_reg_t *reg_val) { ESP_EARLY_LOGI(TAG, "vendor id : 0x%02x (%s)", reg_val->mr1.vendor_id, reg_val->mr1.vendor_id == 0x0d ? "AP" : (reg_val->mr1.vendor_id == 0x1a ? "UnilC" : "UNKNOWN")); @@ -316,12 +356,17 @@ esp_err_t esp_psram_impl_enable(void) mode_reg.mr8.bl = 3; mode_reg.mr8.bt = 0; s_init_psram_mode_reg(1, &mode_reg); - //Print PSRAM info - s_get_psram_mode_reg(1, &mode_reg); - if (mode_reg.mr1.vendor_id != OCT_PSRAM_VENDOR_ID_AP && mode_reg.mr1.vendor_id != OCT_PSRAM_VENDOR_ID_UNILC) { - ESP_EARLY_LOGE(TAG, "PSRAM ID read error: 0x%08x, PSRAM chip not found or not supported, or wrong PSRAM line mode", mode_reg.mr1.vendor_id); + + if (s_check_psram_connected(1) != ESP_OK) { + ESP_EARLY_LOGE(TAG, "PSRAM chip is not connected, or wrong PSRAM line mode"); return ESP_ERR_NOT_SUPPORTED; } + + s_get_psram_mode_reg(1, &mode_reg); + if (mode_reg.mr1.vendor_id != OCT_PSRAM_VENDOR_ID_AP && mode_reg.mr1.vendor_id != OCT_PSRAM_VENDOR_ID_UNILC) { + ESP_EARLY_LOGW(TAG, "PSRAM ID read error: 0x%08x, fallback to use default driver pattern", mode_reg.mr1.vendor_id); + } + s_print_psram_info(&mode_reg); s_psram_size = mode_reg.mr2.density == 0x1 ? PSRAM_SIZE_4MB : mode_reg.mr2.density == 0X3 ? PSRAM_SIZE_8MB : From 96366a204aff37419376761f605e064150a284f0 Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Fri, 21 Mar 2025 17:15:57 +0800 Subject: [PATCH 082/213] refactor(i2s_es8311): refactor es8311 example --- .../i2s_codec/i2s_es8311/main/CMakeLists.txt | 2 +- .../i2s_es8311/main/Kconfig.projbuild | 92 +++++++------ .../i2s_es8311/main/example_config.h | 44 ++----- .../i2s_es8311/main/i2s_es8311_example.c | 121 +++++++++++++----- .../i2s_es8311/main/idf_component.yml | 2 +- .../i2s_codec/i2s_es8311/pytest_i2s_es8311.py | 27 +++- .../i2s/i2s_codec/i2s_es8311/sdkconfig.ci.bsp | 1 + .../i2s_es8311/sdkconfig.ci.s3_korvo2_v3 | 8 ++ .../i2s_codec/i2s_es8311/sdkconfig.defaults | 1 + tools/ci/idf_pytest/constants.py | 2 + 10 files changed, 188 insertions(+), 112 deletions(-) create mode 100644 examples/peripherals/i2s/i2s_codec/i2s_es8311/sdkconfig.ci.s3_korvo2_v3 diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/CMakeLists.txt b/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/CMakeLists.txt index bcedc48daa3..e757853d56b 100644 --- a/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/CMakeLists.txt +++ b/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/CMakeLists.txt @@ -1,3 +1,3 @@ idf_component_register(SRCS "i2s_es8311_example.c" - PRIV_REQUIRES esp_driver_i2s esp_driver_gpio + PRIV_REQUIRES esp_driver_i2s esp_driver_i2c esp_driver_gpio EMBED_FILES "canon.pcm") diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/Kconfig.projbuild b/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/Kconfig.projbuild index 72ce831be62..9ab5482ed8f 100644 --- a/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/Kconfig.projbuild +++ b/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/Kconfig.projbuild @@ -1,5 +1,54 @@ menu "Example Configuration" + menu "Example IO Configuration" + config EXAMPLE_PA_CTRL_IO + int "Power Amplifier control IO" + default 53 if IDF_TARGET_ESP32P4 + default -1 + help + Set GPIO number for PA control. Set -1 to disable PA control. + + config EXAMPLE_I2C_SDA_IO + int "I2C SDA IO" + default 17 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3 + default 9 if IDF_TARGET_ESP32H2 + default 7 + + config EXAMPLE_I2C_SCL_IO + int "I2C SCL IO" + default 16 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3 + default 8 if IDF_TARGET_ESP32H2 || IDF_TARGET_ESP32P4 + default 6 + + config EXAMPLE_I2S_MCLK_IO + int "I2S MCLK IO" + default 13 if IDF_TARGET_ESP32P4 + default 0 + + config EXAMPLE_I2S_BCLK_IO + int "I2S BCLK IO" + default 12 if IDF_TARGET_ESP32P4 + default 4 + + config EXAMPLE_I2S_WS_IO + int "I2S WS IO" + default 10 if IDF_TARGET_ESP32P4 + default 5 + + config EXAMPLE_I2S_DIN_IO + int "I2S DIN IO" + default 19 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3 + default 11 if IDF_TARGET_ESP32P4 + default 3 + + config EXAMPLE_I2S_DOUT_IO + int "I2S DOUT IO" + default 18 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3 + default 9 if IDF_TARGET_ESP32P4 + default 2 + + endmenu + choice EXAMPLE_MODE prompt "Example mode" default EXAMPLE_MODE_MUSIC @@ -13,42 +62,13 @@ menu "Example Configuration" bool "echo" endchoice - choice EXAMPLE_SELECT_MIC_GAIN - prompt "Set MIC gain" + config EXAMPLE_MIC_GAIN + int "Set MIC gain (unit: dB)" depends on EXAMPLE_MODE_ECHO - default MIC_GAIN_18DB + default 18 help Select mic gain for echo mode - config MIC_GAIN_0DB - bool "0dB" - config MIC_GAIN_6DB - bool "6dB" - config MIC_GAIN_12DB - bool "12dB" - config MIC_GAIN_18DB - bool "18dB" - config MIC_GAIN_24DB - bool "24dB" - config MIC_GAIN_30DB - bool "30dB" - config MIC_GAIN_36DB - bool "36dB" - config MIC_GAIN_42DB - bool "42dB" - endchoice - - config EXAMPLE_MIC_GAIN - int - default 0 if MIC_GAIN_0DB - default 1 if MIC_GAIN_6DB - default 2 if MIC_GAIN_12DB - default 3 if MIC_GAIN_18DB - default 4 if MIC_GAIN_24DB - default 5 if MIC_GAIN_30DB - default 6 if MIC_GAIN_36DB - default 7 if MIC_GAIN_42DB - config EXAMPLE_VOICE_VOLUME int "Voice volume" range 0 100 @@ -56,16 +76,10 @@ menu "Example Configuration" help Set voice volume - config EXAMPLE_PA_CTRL_IO - int "Power Amplifier control IO" - default 53 if IDF_TARGET_ESP32P4 - default -1 - help - Set GPIO number for PA control. Set -1 to disable PA control. - config EXAMPLE_BSP bool "Enable Board Support Package (BSP) support" default n + select CODEC_I2C_BACKWARD_COMPATIBLE help Use BSP to setup all hardware settings. Specific board must be selected in main/idf_component.yml file. endmenu diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/example_config.h b/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/example_config.h index 5c3181c4e2b..a2286b7a420 100644 --- a/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/example_config.h +++ b/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/example_config.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: CC0-1.0 */ @@ -19,47 +19,23 @@ #define EXAMPLE_MIC_GAIN CONFIG_EXAMPLE_MIC_GAIN #endif -#if !defined(CONFIG_EXAMPLE_BSP) - +#ifndef CONFIG_EXAMPLE_BSP /* I2C port and GPIOs */ #define I2C_NUM (0) -#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 -#define I2C_SCL_IO (GPIO_NUM_16) -#define I2C_SDA_IO (GPIO_NUM_17) -#elif CONFIG_IDF_TARGET_ESP32H2 -#define I2C_SCL_IO (GPIO_NUM_8) -#define I2C_SDA_IO (GPIO_NUM_9) -#elif CONFIG_IDF_TARGET_ESP32P4 -#define I2C_SCL_IO (GPIO_NUM_8) -#define I2C_SDA_IO (GPIO_NUM_7) -#else -#define I2C_SCL_IO (GPIO_NUM_6) -#define I2C_SDA_IO (GPIO_NUM_7) -#endif +#define I2C_SCL_IO CONFIG_EXAMPLE_I2C_SCL_IO +#define I2C_SDA_IO CONFIG_EXAMPLE_I2C_SDA_IO /* I2S port and GPIOs */ #define I2S_NUM (0) -#if CONFIG_IDF_TARGET_ESP32P4 -#define I2S_MCK_IO (GPIO_NUM_13) -#define I2S_BCK_IO (GPIO_NUM_12) -#define I2S_WS_IO (GPIO_NUM_10) -#define I2S_DO_IO (GPIO_NUM_9) -#define I2S_DI_IO (GPIO_NUM_11) -#else -#define I2S_MCK_IO (GPIO_NUM_0) -#define I2S_BCK_IO (GPIO_NUM_4) -#define I2S_WS_IO (GPIO_NUM_5) -#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 -#define I2S_DO_IO (GPIO_NUM_18) -#define I2S_DI_IO (GPIO_NUM_19) -#else -#define I2S_DO_IO (GPIO_NUM_2) -#define I2S_DI_IO (GPIO_NUM_3) -#endif -#endif +#define I2S_MCK_IO CONFIG_EXAMPLE_I2S_MCLK_IO +#define I2S_BCK_IO CONFIG_EXAMPLE_I2S_BCLK_IO +#define I2S_WS_IO CONFIG_EXAMPLE_I2S_WS_IO +#define I2S_DO_IO CONFIG_EXAMPLE_I2S_DOUT_IO +#define I2S_DI_IO CONFIG_EXAMPLE_I2S_DIN_IO #else // CONFIG_EXAMPLE_BSP #include "bsp/esp-bsp.h" #define I2C_NUM BSP_I2C_NUM +#define I2S_NUM (0) #endif // CONFIG_EXAMPLE_BSP diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/i2s_es8311_example.c b/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/i2s_es8311_example.c index 4b012088873..107f9409f01 100644 --- a/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/i2s_es8311_example.c +++ b/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/i2s_es8311_example.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: CC0-1.0 */ @@ -10,10 +10,15 @@ #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/i2s_std.h" +#ifndef CONFIG_EXAMPLE_BSP +#include "driver/i2c_master.h" +#endif #include "driver/gpio.h" #include "esp_system.h" +#include "esp_codec_dev_defaults.h" +#include "esp_codec_dev.h" +#include "esp_codec_dev_vol.h" #include "esp_check.h" -#include "es8311.h" #include "example_config.h" static const char *TAG = "i2s_es8311"; @@ -32,45 +37,101 @@ extern const uint8_t music_pcm_end[] asm("_binary_canon_pcm_end"); static esp_err_t es8311_codec_init(void) { /* Initialize I2C peripheral */ -#if !defined(CONFIG_EXAMPLE_BSP) - const i2c_config_t es_i2c_cfg = { +#ifndef CONFIG_EXAMPLE_BSP + i2c_master_bus_handle_t i2c_bus_handle = NULL; + i2c_master_bus_config_t i2c_mst_cfg = { + .i2c_port = I2C_NUM, .sda_io_num = I2C_SDA_IO, .scl_io_num = I2C_SCL_IO, - .mode = I2C_MODE_MASTER, - .sda_pullup_en = GPIO_PULLUP_ENABLE, - .scl_pullup_en = GPIO_PULLUP_ENABLE, - .master.clk_speed = 100000, + .clk_source = I2C_CLK_SRC_DEFAULT, + .glitch_ignore_cnt = 7, + /* Pull-up internally for no external pull-up case. + Suggest to use external pull-up to ensure a strong enough pull-up. */ + .flags.enable_internal_pullup = true, }; - ESP_RETURN_ON_ERROR(i2c_param_config(I2C_NUM, &es_i2c_cfg), TAG, "config i2c failed"); - ESP_RETURN_ON_ERROR(i2c_driver_install(I2C_NUM, I2C_MODE_MASTER, 0, 0, 0), TAG, "install i2c driver failed"); + ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_mst_cfg, &i2c_bus_handle)); #else ESP_ERROR_CHECK(bsp_i2c_init()); #endif - /* Initialize es8311 codec */ - es8311_handle_t es_handle = es8311_create(I2C_NUM, ES8311_ADDRRES_0); - ESP_RETURN_ON_FALSE(es_handle, ESP_FAIL, TAG, "es8311 create failed"); - const es8311_clock_config_t es_clk = { - .mclk_inverted = false, - .sclk_inverted = false, - .mclk_from_mclk_pin = true, - .mclk_frequency = EXAMPLE_MCLK_FREQ_HZ, - .sample_frequency = EXAMPLE_SAMPLE_RATE + /* Create control interface with I2C bus handle */ + audio_codec_i2c_cfg_t i2c_cfg = { + .port = I2C_NUM, + .addr = ES8311_CODEC_DEFAULT_ADDR, +#ifndef CONFIG_EXAMPLE_BSP + .bus_handle = i2c_bus_handle, +#endif }; + const audio_codec_ctrl_if_t *ctrl_if = audio_codec_new_i2c_ctrl(&i2c_cfg); + assert(ctrl_if); - ESP_ERROR_CHECK(es8311_init(es_handle, &es_clk, ES8311_RESOLUTION_16, ES8311_RESOLUTION_16)); - ESP_RETURN_ON_ERROR(es8311_sample_frequency_config(es_handle, EXAMPLE_SAMPLE_RATE * EXAMPLE_MCLK_MULTIPLE, EXAMPLE_SAMPLE_RATE), TAG, "set es8311 sample frequency failed"); - ESP_RETURN_ON_ERROR(es8311_voice_volume_set(es_handle, EXAMPLE_VOICE_VOLUME, NULL), TAG, "set es8311 volume failed"); - ESP_RETURN_ON_ERROR(es8311_microphone_config(es_handle, false), TAG, "set es8311 microphone failed"); + /* Create data interface with I2S bus handle */ + audio_codec_i2s_cfg_t i2s_cfg = { + .port = I2S_NUM, + .rx_handle = rx_handle, + .tx_handle = tx_handle, + }; + const audio_codec_data_if_t *data_if = audio_codec_new_i2s_data(&i2s_cfg); + assert(data_if); + + /* Create ES8311 interface handle */ + const audio_codec_gpio_if_t *gpio_if = audio_codec_new_gpio(); + assert(gpio_if); + es8311_codec_cfg_t es8311_cfg = { + .ctrl_if = ctrl_if, + .gpio_if = gpio_if, + .codec_mode = ESP_CODEC_DEV_WORK_MODE_BOTH, + .master_mode = false, + .use_mclk = true, + .pa_pin = EXAMPLE_PA_CTRL_IO, + .pa_reverted = false, + .hw_gain = { + .pa_voltage = 5.0, + .codec_dac_voltage = 3.3, + }, + .mclk_div = EXAMPLE_MCLK_MULTIPLE, + }; + const audio_codec_if_t *es8311_if = es8311_codec_new(&es8311_cfg); + assert(es8311_if); + + /* Create the top codec handle with ES8311 interface handle and data interface */ + esp_codec_dev_cfg_t dev_cfg = { + .dev_type = ESP_CODEC_DEV_TYPE_IN_OUT, + .codec_if = es8311_if, + .data_if = data_if, + }; + esp_codec_dev_handle_t codec_handle = esp_codec_dev_new(&dev_cfg); + assert(codec_handle); + + /* Specify the sample configurations and open the device */ + esp_codec_dev_sample_info_t sample_cfg = { + .bits_per_sample = I2S_DATA_BIT_WIDTH_16BIT, + .channel = 2, + .channel_mask = 0x03, + .sample_rate = EXAMPLE_SAMPLE_RATE, + }; + if (esp_codec_dev_open(codec_handle, &sample_cfg) != ESP_CODEC_DEV_OK) { + ESP_LOGE(TAG, "Open codec device failed"); + return ESP_FAIL; + } + + /* Set the initial volume and gain */ + if (esp_codec_dev_set_out_vol(codec_handle, EXAMPLE_VOICE_VOLUME) != ESP_CODEC_DEV_OK) { + ESP_LOGE(TAG, "set output volume failed"); + return ESP_FAIL; + } #if CONFIG_EXAMPLE_MODE_ECHO - ESP_RETURN_ON_ERROR(es8311_microphone_gain_set(es_handle, EXAMPLE_MIC_GAIN), TAG, "set es8311 microphone gain failed"); + if (esp_codec_dev_set_in_gain(codec_handle, EXAMPLE_MIC_GAIN) != ESP_CODEC_DEV_OK) { + ESP_LOGE(TAG, "set input gain failed"); + return ESP_FAIL; + } #endif return ESP_OK; } static esp_err_t i2s_driver_init(void) { -#if !defined(CONFIG_EXAMPLE_BSP) +#ifndef CONFIG_EXAMPLE_BSP i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM, I2S_ROLE_MASTER); chan_cfg.auto_clear = true; // Auto clear the legacy data in the DMA buffer ESP_ERROR_CHECK(i2s_new_channel(&chan_cfg, &tx_handle, &rx_handle)); @@ -200,16 +261,6 @@ void app_main(void) ESP_LOGI(TAG, "es8311 codec init success"); } -#if EXAMPLE_PA_CTRL_IO >= 0 - /* Enable PA by setting the PA_CTRL_IO to high, because the power amplifier on some dev-kits are disabled by default */ - gpio_config_t gpio_cfg = { - .pin_bit_mask = (1ULL << EXAMPLE_PA_CTRL_IO), - .mode = GPIO_MODE_OUTPUT, - }; - ESP_ERROR_CHECK(gpio_config(&gpio_cfg)); - ESP_ERROR_CHECK(gpio_set_level(EXAMPLE_PA_CTRL_IO, 1)); -#endif - #if CONFIG_EXAMPLE_MODE_MUSIC /* Play a piece of music in music mode */ xTaskCreate(i2s_music, "i2s_music", 4096, NULL, 5, NULL); diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/idf_component.yml b/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/idf_component.yml index 2091fa5dddf..7a25135736e 100644 --- a/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/idf_component.yml +++ b/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/idf_component.yml @@ -1,7 +1,7 @@ ## IDF Component Manager Manifest File dependencies: idf: "^5.0" - espressif/es8311: "^1.0.0" + espressif/esp_codec_dev: ^1.3.4 # After enabling Board Support Packages support in menuconfig, you can pick you specific BSP here espressif/esp-box: diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es8311/pytest_i2s_es8311.py b/examples/peripherals/i2s/i2s_codec/i2s_es8311/pytest_i2s_es8311.py index 54404601b03..181c0413892 100644 --- a/examples/peripherals/i2s/i2s_codec/i2s_es8311/pytest_i2s_es8311.py +++ b/examples/peripherals/i2s/i2s_codec/i2s_es8311/pytest_i2s_es8311.py @@ -17,7 +17,30 @@ from pytest_embedded import Dut def test_i2s_es8311_example_generic(dut: Dut) -> None: dut.expect('i2s es8311 codec example start') dut.expect('-----------------------------') - dut.expect('I \\(([0-9]+)\\) i2s_es8311: i2s driver init success') + dut.expect('i2s_es8311: i2s driver init success') + + +@pytest.mark.es8311 +@pytest.mark.parametrize( + 'config', + [ + 's3_korvo2_v3', + ], + indirect=True, +) +@idf_parametrize('target', ['esp32s3'], indirect=['target']) +def test_i2s_es8311_example_korvo2_v3(dut: Dut) -> None: + dut.expect(r'i2s es8311 codec example start') + dut.expect(r'-----------------------------') + dut.expect(r'i2s_es8311: i2s driver init success') + dut.expect(r'ES8311: Work in Slave mode') + dut.expect(r'I2S_IF: channel mode [0-9]+ bits:[0-9]+/[0-9]+ channel:[0-9]+ mask:[0-9]+') + dut.expect(r'I2S_IF: STD Mode [0-9]+ bits:[0-9]+/[0-9]+ channel:[0-9]+ sample_rate:[0-9]+ mask:[0-9]+') + dut.expect(r'I2S_IF: channel mode [0-9]+ bits:[0-9]+/[0-9]+ channel:[0-9]+ mask:[0-9]+') + dut.expect(r'I2S_IF: STD Mode [0-9]+ bits:[0-9]+/[0-9]+ channel:[0-9]+ sample_rate:[0-9]+ mask:[0-9]+') + dut.expect(r'Adev_Codec: Open codec device OK') + dut.expect(r'i2s_es8311: es8311 codec init success') + dut.expect(r'Returned from app_main\(\)') @pytest.mark.esp32s3 @@ -33,4 +56,4 @@ def test_i2s_es8311_example_bsp(dut: Dut) -> None: dut.expect('i2s es8311 codec example start') dut.expect('-----------------------------') dut.expect('Using BSP for HW configuration') - dut.expect('I \\(([0-9]+)\\) i2s_es8311: i2s driver init success') + dut.expect('i2s_es8311: i2s driver init success') diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es8311/sdkconfig.ci.bsp b/examples/peripherals/i2s/i2s_codec/i2s_es8311/sdkconfig.ci.bsp index 298c61ec909..97f8764b701 100644 --- a/examples/peripherals/i2s/i2s_codec/i2s_es8311/sdkconfig.ci.bsp +++ b/examples/peripherals/i2s/i2s_codec/i2s_es8311/sdkconfig.ci.bsp @@ -1,2 +1,3 @@ CONFIG_IDF_TARGET="esp32s3" CONFIG_EXAMPLE_BSP=y +CONFIG_CODEC_I2C_BACKWARD_COMPATIBLE=y diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es8311/sdkconfig.ci.s3_korvo2_v3 b/examples/peripherals/i2s/i2s_codec/i2s_es8311/sdkconfig.ci.s3_korvo2_v3 new file mode 100644 index 00000000000..2a5d5607844 --- /dev/null +++ b/examples/peripherals/i2s/i2s_codec/i2s_es8311/sdkconfig.ci.s3_korvo2_v3 @@ -0,0 +1,8 @@ +CONFIG_EXAMPLE_PA_CTRL_IO=48 +CONFIG_EXAMPLE_I2C_SDA_IO=17 +CONFIG_EXAMPLE_I2C_SCL_IO=18 +CONFIG_EXAMPLE_I2S_MCLK_IO=16 +CONFIG_EXAMPLE_I2S_BCLK_IO=9 +CONFIG_EXAMPLE_I2S_WS_IO=45 +CONFIG_EXAMPLE_I2S_DIN_IO=10 +CONFIG_EXAMPLE_I2S_DOUT_IO=8 diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es8311/sdkconfig.defaults b/examples/peripherals/i2s/i2s_codec/i2s_es8311/sdkconfig.defaults index e69de29bb2d..ab6f1e2f6b2 100644 --- a/examples/peripherals/i2s/i2s_codec/i2s_es8311/sdkconfig.defaults +++ b/examples/peripherals/i2s/i2s_codec/i2s_es8311/sdkconfig.defaults @@ -0,0 +1 @@ +CONFIG_CODEC_I2C_BACKWARD_COMPATIBLE=n diff --git a/tools/ci/idf_pytest/constants.py b/tools/ci/idf_pytest/constants.py index eb0fd6c250a..23c1215dbe8 100644 --- a/tools/ci/idf_pytest/constants.py +++ b/tools/ci/idf_pytest/constants.py @@ -108,6 +108,8 @@ ENV_MARKERS = { 'httpbin': 'runner for tests that need to access the httpbin service', 'flash_4mb': 'C2 runners with 4 MB flash', 'jtag_re_enable': 'Runner to re-enable jtag which is softly disabled by burning bit SOFT_DIS_JTAG on eFuse', + 'es8311': 'Development board that carries es8311 codec', + 'es7210': 'Development board that carries es7210 codec', # multi-dut markers 'multi_dut_modbus_rs485': 'a pair of runners connected by RS485 bus', 'ieee802154': 'ieee802154 related tests should run on ieee802154 runners.', From 50cfbaf5739baf1df5a9171ba76317bbec47b141 Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Tue, 25 Mar 2025 16:24:55 +0800 Subject: [PATCH 083/213] refactor(i2s_es8311): remove esp-box bsp support --- .../i2s_es8311/main/Kconfig.projbuild | 7 ------ .../i2s_es8311/main/example_config.h | 8 ------- .../i2s_es8311/main/i2s_es8311_example.c | 22 +---------------- .../i2s_es8311/main/idf_component.yml | 14 ----------- .../i2s_codec/i2s_es8311/pytest_i2s_es8311.py | 24 +------------------ .../i2s/i2s_codec/i2s_es8311/sdkconfig.ci.bsp | 3 --- tools/ci/idf_pytest/constants.py | 1 - 7 files changed, 2 insertions(+), 77 deletions(-) delete mode 100644 examples/peripherals/i2s/i2s_codec/i2s_es8311/sdkconfig.ci.bsp diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/Kconfig.projbuild b/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/Kconfig.projbuild index 9ab5482ed8f..c6279441bab 100644 --- a/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/Kconfig.projbuild +++ b/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/Kconfig.projbuild @@ -75,11 +75,4 @@ menu "Example Configuration" default 60 help Set voice volume - - config EXAMPLE_BSP - bool "Enable Board Support Package (BSP) support" - default n - select CODEC_I2C_BACKWARD_COMPATIBLE - help - Use BSP to setup all hardware settings. Specific board must be selected in main/idf_component.yml file. endmenu diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/example_config.h b/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/example_config.h index a2286b7a420..c56eb46b5c5 100644 --- a/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/example_config.h +++ b/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/example_config.h @@ -19,7 +19,6 @@ #define EXAMPLE_MIC_GAIN CONFIG_EXAMPLE_MIC_GAIN #endif -#ifndef CONFIG_EXAMPLE_BSP /* I2C port and GPIOs */ #define I2C_NUM (0) #define I2C_SCL_IO CONFIG_EXAMPLE_I2C_SCL_IO @@ -32,10 +31,3 @@ #define I2S_WS_IO CONFIG_EXAMPLE_I2S_WS_IO #define I2S_DO_IO CONFIG_EXAMPLE_I2S_DOUT_IO #define I2S_DI_IO CONFIG_EXAMPLE_I2S_DIN_IO - -#else // CONFIG_EXAMPLE_BSP -#include "bsp/esp-bsp.h" -#define I2C_NUM BSP_I2C_NUM -#define I2S_NUM (0) - -#endif // CONFIG_EXAMPLE_BSP diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/i2s_es8311_example.c b/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/i2s_es8311_example.c index 107f9409f01..79d13a30cef 100644 --- a/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/i2s_es8311_example.c +++ b/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/i2s_es8311_example.c @@ -10,9 +10,7 @@ #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/i2s_std.h" -#ifndef CONFIG_EXAMPLE_BSP #include "driver/i2c_master.h" -#endif #include "driver/gpio.h" #include "esp_system.h" #include "esp_codec_dev_defaults.h" @@ -37,7 +35,6 @@ extern const uint8_t music_pcm_end[] asm("_binary_canon_pcm_end"); static esp_err_t es8311_codec_init(void) { /* Initialize I2C peripheral */ -#ifndef CONFIG_EXAMPLE_BSP i2c_master_bus_handle_t i2c_bus_handle = NULL; i2c_master_bus_config_t i2c_mst_cfg = { .i2c_port = I2C_NUM, @@ -50,17 +47,12 @@ static esp_err_t es8311_codec_init(void) .flags.enable_internal_pullup = true, }; ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_mst_cfg, &i2c_bus_handle)); -#else - ESP_ERROR_CHECK(bsp_i2c_init()); -#endif /* Create control interface with I2C bus handle */ audio_codec_i2c_cfg_t i2c_cfg = { .port = I2C_NUM, .addr = ES8311_CODEC_DEFAULT_ADDR, -#ifndef CONFIG_EXAMPLE_BSP .bus_handle = i2c_bus_handle, -#endif }; const audio_codec_ctrl_if_t *ctrl_if = audio_codec_new_i2c_ctrl(&i2c_cfg); assert(ctrl_if); @@ -82,7 +74,7 @@ static esp_err_t es8311_codec_init(void) .gpio_if = gpio_if, .codec_mode = ESP_CODEC_DEV_WORK_MODE_BOTH, .master_mode = false, - .use_mclk = true, + .use_mclk = I2S_MCK_IO >= 0, .pa_pin = EXAMPLE_PA_CTRL_IO, .pa_reverted = false, .hw_gain = { @@ -131,7 +123,6 @@ static esp_err_t es8311_codec_init(void) static esp_err_t i2s_driver_init(void) { -#ifndef CONFIG_EXAMPLE_BSP i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM, I2S_ROLE_MASTER); chan_cfg.auto_clear = true; // Auto clear the legacy data in the DMA buffer ESP_ERROR_CHECK(i2s_new_channel(&chan_cfg, &tx_handle, &rx_handle)); @@ -157,17 +148,6 @@ static esp_err_t i2s_driver_init(void) ESP_ERROR_CHECK(i2s_channel_init_std_mode(rx_handle, &std_cfg)); ESP_ERROR_CHECK(i2s_channel_enable(tx_handle)); ESP_ERROR_CHECK(i2s_channel_enable(rx_handle)); -#else - ESP_LOGI(TAG, "Using BSP for HW configuration"); - i2s_std_config_t std_cfg = { - .clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(EXAMPLE_SAMPLE_RATE), - .slot_cfg = I2S_STD_PHILIPS_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_STEREO), - .gpio_cfg = BSP_I2S_GPIO_CFG, - }; - std_cfg.clk_cfg.mclk_multiple = EXAMPLE_MCLK_MULTIPLE; - ESP_ERROR_CHECK(bsp_audio_init(&std_cfg, &tx_handle, &rx_handle)); - ESP_ERROR_CHECK(bsp_audio_poweramp_enable(true)); -#endif return ESP_OK; } diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/idf_component.yml b/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/idf_component.yml index 7a25135736e..12d07255d58 100644 --- a/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/idf_component.yml +++ b/examples/peripherals/i2s/i2s_codec/i2s_es8311/main/idf_component.yml @@ -2,19 +2,5 @@ dependencies: idf: "^5.0" espressif/esp_codec_dev: ^1.3.4 - -# After enabling Board Support Packages support in menuconfig, you can pick you specific BSP here - espressif/esp-box: - version: "^2.4.2" - rules: - - if: "target in [esp32s3]" - #espressif/esp32_s2_kaluga_kit: - # version: "^2.1.1" - # rules: - # - if: "target in [esp32s2]" - #espressif/esp32_s3_lcd_ev_board: - # version: "^1" - # rules: - # - if: "target in [esp32s3]" i2s_examples_common: path: ${IDF_PATH}/examples/peripherals/i2s/i2s_examples_common diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es8311/pytest_i2s_es8311.py b/examples/peripherals/i2s/i2s_codec/i2s_es8311/pytest_i2s_es8311.py index 181c0413892..dceab569581 100644 --- a/examples/peripherals/i2s/i2s_codec/i2s_es8311/pytest_i2s_es8311.py +++ b/examples/peripherals/i2s/i2s_codec/i2s_es8311/pytest_i2s_es8311.py @@ -20,6 +20,7 @@ def test_i2s_es8311_example_generic(dut: Dut) -> None: dut.expect('i2s_es8311: i2s driver init success') +@pytest.mark.esp32s3 @pytest.mark.es8311 @pytest.mark.parametrize( 'config', @@ -28,32 +29,9 @@ def test_i2s_es8311_example_generic(dut: Dut) -> None: ], indirect=True, ) -@idf_parametrize('target', ['esp32s3'], indirect=['target']) def test_i2s_es8311_example_korvo2_v3(dut: Dut) -> None: dut.expect(r'i2s es8311 codec example start') dut.expect(r'-----------------------------') dut.expect(r'i2s_es8311: i2s driver init success') - dut.expect(r'ES8311: Work in Slave mode') - dut.expect(r'I2S_IF: channel mode [0-9]+ bits:[0-9]+/[0-9]+ channel:[0-9]+ mask:[0-9]+') - dut.expect(r'I2S_IF: STD Mode [0-9]+ bits:[0-9]+/[0-9]+ channel:[0-9]+ sample_rate:[0-9]+ mask:[0-9]+') - dut.expect(r'I2S_IF: channel mode [0-9]+ bits:[0-9]+/[0-9]+ channel:[0-9]+ mask:[0-9]+') - dut.expect(r'I2S_IF: STD Mode [0-9]+ bits:[0-9]+/[0-9]+ channel:[0-9]+ sample_rate:[0-9]+ mask:[0-9]+') - dut.expect(r'Adev_Codec: Open codec device OK') dut.expect(r'i2s_es8311: es8311 codec init success') dut.expect(r'Returned from app_main\(\)') - - -@pytest.mark.esp32s3 -@pytest.mark.generic -@pytest.mark.parametrize( - 'config', - [ - 'bsp', - ], - indirect=True, -) -def test_i2s_es8311_example_bsp(dut: Dut) -> None: - dut.expect('i2s es8311 codec example start') - dut.expect('-----------------------------') - dut.expect('Using BSP for HW configuration') - dut.expect('i2s_es8311: i2s driver init success') diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es8311/sdkconfig.ci.bsp b/examples/peripherals/i2s/i2s_codec/i2s_es8311/sdkconfig.ci.bsp deleted file mode 100644 index 97f8764b701..00000000000 --- a/examples/peripherals/i2s/i2s_codec/i2s_es8311/sdkconfig.ci.bsp +++ /dev/null @@ -1,3 +0,0 @@ -CONFIG_IDF_TARGET="esp32s3" -CONFIG_EXAMPLE_BSP=y -CONFIG_CODEC_I2C_BACKWARD_COMPATIBLE=y diff --git a/tools/ci/idf_pytest/constants.py b/tools/ci/idf_pytest/constants.py index 23c1215dbe8..88a66142fd3 100644 --- a/tools/ci/idf_pytest/constants.py +++ b/tools/ci/idf_pytest/constants.py @@ -109,7 +109,6 @@ ENV_MARKERS = { 'flash_4mb': 'C2 runners with 4 MB flash', 'jtag_re_enable': 'Runner to re-enable jtag which is softly disabled by burning bit SOFT_DIS_JTAG on eFuse', 'es8311': 'Development board that carries es8311 codec', - 'es7210': 'Development board that carries es7210 codec', # multi-dut markers 'multi_dut_modbus_rs485': 'a pair of runners connected by RS485 bus', 'ieee802154': 'ieee802154 related tests should run on ieee802154 runners.', From 0298a147f8086bc6c620c1a7ef6481efa7f3378b Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Mon, 23 Jun 2025 16:34:14 +0800 Subject: [PATCH 084/213] refactor(i2s_es7210): refactor es7210 example --- .../i2s/i2s_codec/i2s_es7210_tdm/README.md | 13 +- .../i2s_es7210_tdm/main/CMakeLists.txt | 2 +- .../main/i2s_es7210_record_example.c | 124 +++++++++++------- .../i2s_es7210_tdm/main/idf_component.yml | 16 +-- .../i2s/i2s_codec/i2s_es8311/README.md | 6 +- 5 files changed, 91 insertions(+), 70 deletions(-) diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es7210_tdm/README.md b/examples/peripherals/i2s/i2s_codec/i2s_es7210_tdm/README.md index 9c8749d6d84..bc474f2f448 100644 --- a/examples/peripherals/i2s/i2s_codec/i2s_es7210_tdm/README.md +++ b/examples/peripherals/i2s/i2s_codec/i2s_es7210_tdm/README.md @@ -16,6 +16,8 @@ This example demonstrates how to use I2S TDM mode to record 4 MICs connected to | ES7210_I2S_FMT_DSP_A | PCM short format | | ES7210_I2S_FMT_DSP_B | PCM long format | +In this example, we use `esp_codec_dev` dependency which contains the `es7210` driver. This driver uses `ES7210_I2S_FMT_I2S` format by default. + Recorded voice will be saved to SD card in `wav` format, and can be played or processed on PC. ## How to Use Example @@ -31,11 +33,11 @@ All the GPIO used in this example can be changed according to your board, by mac ### Dependency -This example is based on [es7210 component](https://components.espressif.com/component/espressif/es7210) +This example is based on [esp_codec_dev component](https://components.espressif.com/components/espressif/esp_codec_dev) -The component can be installed by esp component manager. Since this example already installed it, no need to re-installed it again, but if you want to install this component in your own project, you can input the following command: +The component can be installed by [IDF Component Manager](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-component-manager.html). This example already includes it. If you want to install [esp_codec_dev component](https://components.espressif.com/components/espressif/esp_codec_dev) separately in your project, you can input the following command: ``` -idf.py add-dependency espressif/es7210^1.0.0 +idf.py add-dependency "espressif/esp_codec_dev^1.3.4" ``` If the dependency is added, you can check `idf_component.yml` for more detail. When building this example or other projects with managed components, the component manager will search for the required components online and download them into the `managed_components` folder. @@ -46,11 +48,8 @@ If the dependency is added, you can check `idf_component.yml` for more detail. W ``` idf.py set-target TARGET ``` -* Change value of `EXAMPLE_I2S_FORMAT` to check I2S driver's functionality on different I2S formats. -* Change `EXAMPLE_ES7210_MIC_GAIN` and `EXAMPLE_ES7210_MIC_BIAS` according your MIC's specs if needed. -* Change `EXAMPLE_ES7210_ADC_VOLUME` if recorded voice is too loud or too quite. -Note: it's better to adjust `EXAMPLE_ES7210_MIC_GAIN` first. If adjusting MIC gain doesn't meet your demand, you can then adjust `EXAMPLE_ES7210_ADC_VOLUME`. That is to say, it's better to adjust analog gain than digital gain. +The configuration macros are defined at the beginning of `main/i2s_es7210_record_example.c`, you can change the configuration macros according to your needs. ### Build and Flash diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es7210_tdm/main/CMakeLists.txt b/examples/peripherals/i2s/i2s_codec/i2s_es7210_tdm/main/CMakeLists.txt index c90803d430e..dfe2f114bdc 100644 --- a/examples/peripherals/i2s/i2s_codec/i2s_es7210_tdm/main/CMakeLists.txt +++ b/examples/peripherals/i2s/i2s_codec/i2s_es7210_tdm/main/CMakeLists.txt @@ -1,4 +1,4 @@ idf_component_register(SRCS "i2s_es7210_record_example.c" - PRIV_REQUIRES esp_driver_i2s esp_driver_gpio fatfs i2s_examples_common + PRIV_REQUIRES esp_driver_i2s esp_driver_i2c esp_driver_gpio fatfs i2s_examples_common INCLUDE_DIRS ) diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es7210_tdm/main/i2s_es7210_record_example.c b/examples/peripherals/i2s/i2s_codec/i2s_es7210_tdm/main/i2s_es7210_record_example.c index 79f510e150f..5da0d9101b2 100644 --- a/examples/peripherals/i2s/i2s_codec/i2s_es7210_tdm/main/i2s_es7210_record_example.c +++ b/examples/peripherals/i2s/i2s_codec/i2s_es7210_tdm/main/i2s_es7210_record_example.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -8,8 +8,10 @@ #include "esp_check.h" #include "esp_vfs_fat.h" #include "driver/i2s_tdm.h" -#include "driver/i2c.h" -#include "es7210.h" +#include "driver/i2c_master.h" +#include "esp_codec_dev_defaults.h" +#include "esp_codec_dev.h" +#include "esp_codec_dev_vol.h" #include "format_wav.h" #if CONFIG_IDF_TARGET_ESP32S3 // ESP32-S3-Korvo-1 pin out @@ -67,7 +69,6 @@ #endif /* I2S configurations */ -#define EXAMPLE_I2S_TDM_FORMAT (ES7210_I2S_FMT_I2S) #define EXAMPLE_I2S_CHAN_NUM (4) #define EXAMPLE_I2S_SAMPLE_RATE (48000) #define EXAMPLE_I2S_MCLK_MULTIPLE (I2S_MCLK_MULTIPLE_256) @@ -76,10 +77,8 @@ /* ES7210 configurations */ #define EXAMPLE_ES7210_I2C_ADDR (0x40) -#define EXAMPLE_ES7210_I2C_CLK (100000) -#define EXAMPLE_ES7210_MIC_GAIN (ES7210_MIC_GAIN_30DB) -#define EXAMPLE_ES7210_MIC_BIAS (ES7210_MIC_BIAS_2V87) -#define EXAMPLE_ES7210_ADC_VOLUME (0) +#define EXAMPLE_ES7210_MIC_GAIN (30) // 30db +#define EXAMPLE_ES7210_MIC_SELECTED (ES7120_SEL_MIC1 | ES7120_SEL_MIC2 | ES7120_SEL_MIC3 | ES7120_SEL_MIC4) /* SD card & recording configurations */ #define EXAMPLE_RECORD_TIME_SEC (10) @@ -97,15 +96,11 @@ static i2s_chan_handle_t es7210_i2s_init(void) ESP_LOGI(TAG, "Configure I2S receive channel to TDM mode"); i2s_tdm_config_t i2s_tdm_rx_conf = { -#if EXAMPLE_I2S_FORMAT == ES7210_I2S_FMT_I2S - .slot_cfg = I2S_TDM_PHILIPS_SLOT_DEFAULT_CONFIG(EXAMPLE_I2S_SAMPLE_BITS, I2S_SLOT_MODE_STEREO, EXAMPLE_I2S_TDM_SLOT_MASK), -#elif EXAMPLE_I2S_FORMAT == ES7210_I2S_FMT_LJ - .slot_cfg = I2S_TDM_MSB_SLOT_DEFAULT_CONFIG(EXAMPLE_I2S_SAMPLE_BITS, I2S_SLOT_MODE_STEREO, EXAMPLE_I2S_TDM_SLOT_MASK), -#elif EXAMPLE_I2S_FORMAT == ES7210_I2S_FMT_DSP_A - .slot_cfg = I2S_TDM_PCM_SHORT_SLOT_DEFAULT_CONFIG(EXAMPLE_I2S_SAMPLE_BITS, I2S_SLOT_MODE_STEREO, EXAMPLE_I2S_TDM_SLOT_MASK), -#elif EXAMPLE_I2S_FORMAT == ES7210_I2S_FMT_DSP_B - .slot_cfg = I2S_TDM_PCM_LONG_SLOT_DEFAULT_CONFIG(EXAMPLE_I2S_SAMPLE_BITS, I2S_SLOT_MODE_STEREO, EXAMPLE_I2S_TDM_SLOT_MASK), -#endif + // es7210 driver is default to use philips format in esp_codec_dev component + .slot_cfg = I2S_TDM_PHILIPS_SLOT_DEFAULT_CONFIG( + EXAMPLE_I2S_SAMPLE_BITS, + I2S_SLOT_MODE_STEREO, + EXAMPLE_I2S_TDM_SLOT_MASK), .clk_cfg = { .clk_src = I2S_CLK_SRC_DEFAULT, .sample_rate_hz = EXAMPLE_I2S_SAMPLE_RATE, @@ -173,40 +168,81 @@ sdmmc_card_t * mount_sdcard(void) return sdmmc_card; } -static void es7210_codec_init(void) +static esp_codec_dev_handle_t es7210_codec_init(i2s_chan_handle_t i2s_rx_chan) { ESP_LOGI(TAG, "Init I2C used to configure ES7210"); - i2c_config_t i2c_conf = { + /* Initialize I2C peripheral */ + i2c_master_bus_handle_t i2c_bus_handle = NULL; + i2c_master_bus_config_t i2c_mst_cfg = { + .i2c_port = EXAMPLE_I2C_NUM, .sda_io_num = EXAMPLE_I2C_SDA_IO, .scl_io_num = EXAMPLE_I2C_SCL_IO, - .mode = I2C_MODE_MASTER, - .sda_pullup_en = GPIO_PULLUP_ENABLE, - .scl_pullup_en = GPIO_PULLUP_ENABLE, - .master.clk_speed = EXAMPLE_ES7210_I2C_CLK, + .clk_source = I2C_CLK_SRC_DEFAULT, + .glitch_ignore_cnt = 7, + /* Pull-up internally for no external pull-up case. + Suggest to use external pull-up to ensure a strong enough pull-up. */ + .flags.enable_internal_pullup = true, }; - ESP_ERROR_CHECK(i2c_param_config(EXAMPLE_I2C_NUM, &i2c_conf)); - ESP_ERROR_CHECK(i2c_driver_install(EXAMPLE_I2C_NUM, i2c_conf.mode, 0, 0, 0)); + ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_mst_cfg, &i2c_bus_handle)); - /* Create ES7210 device handle */ - es7210_dev_handle_t es7210_handle = NULL; - es7210_i2c_config_t es7210_i2c_conf = { - .i2c_port = EXAMPLE_I2C_NUM, - .i2c_addr = EXAMPLE_ES7210_I2C_ADDR + /* Create control interface with I2C bus handle */ + audio_codec_i2c_cfg_t i2c_cfg = { + .port = EXAMPLE_I2C_NUM, + .addr = ES7210_CODEC_DEFAULT_ADDR, + .bus_handle = i2c_bus_handle, }; - ESP_ERROR_CHECK(es7210_new_codec(&es7210_i2c_conf, &es7210_handle)); + const audio_codec_ctrl_if_t *ctrl_if = audio_codec_new_i2c_ctrl(&i2c_cfg); + assert(ctrl_if); + /* Create data interface with I2S bus handle */ + audio_codec_i2s_cfg_t i2s_cfg = { + .port = EXAMPLE_I2S_NUM, + .rx_handle = i2s_rx_chan, + .tx_handle = NULL, + }; + const audio_codec_data_if_t *data_if = audio_codec_new_i2s_data(&i2s_cfg); + assert(data_if); + + /* Create ES7210 interface handle */ ESP_LOGI(TAG, "Configure ES7210 codec parameters"); - es7210_codec_config_t codec_conf = { - .i2s_format = EXAMPLE_I2S_TDM_FORMAT, - .mclk_ratio = EXAMPLE_I2S_MCLK_MULTIPLE, - .sample_rate_hz = EXAMPLE_I2S_SAMPLE_RATE, - .bit_width = (es7210_i2s_bits_t)EXAMPLE_I2S_SAMPLE_BITS, - .mic_bias = EXAMPLE_ES7210_MIC_BIAS, - .mic_gain = EXAMPLE_ES7210_MIC_GAIN, - .flags.tdm_enable = true + es7210_codec_cfg_t es7210_cfg = { + .ctrl_if = ctrl_if, + .master_mode = false, + .mic_selected = EXAMPLE_ES7210_MIC_SELECTED, + .mclk_src = ES7210_MCLK_FROM_PAD, + .mclk_div = EXAMPLE_I2S_MCLK_MULTIPLE, }; - ESP_ERROR_CHECK(es7210_config_codec(es7210_handle, &codec_conf)); - ESP_ERROR_CHECK(es7210_config_volume(es7210_handle, EXAMPLE_ES7210_ADC_VOLUME)); + const audio_codec_if_t *es7210_if = es7210_codec_new(&es7210_cfg); + assert(es7210_if); + + /* Create the top codec handle with ES7210 interface handle and data interface */ + esp_codec_dev_cfg_t dev_cfg = { + .dev_type = ESP_CODEC_DEV_TYPE_IN, + .codec_if = es7210_if, + .data_if = data_if, + }; + esp_codec_dev_handle_t codec_handle = esp_codec_dev_new(&dev_cfg); + assert(codec_handle); + + /* Specify the sample configurations and open the device */ + esp_codec_dev_sample_info_t sample_cfg = { + .bits_per_sample = EXAMPLE_I2S_SAMPLE_BITS, + .channel = EXAMPLE_I2S_CHAN_NUM, + .channel_mask = EXAMPLE_ES7210_MIC_SELECTED, + .sample_rate = EXAMPLE_I2S_SAMPLE_RATE, + }; + if (esp_codec_dev_open(codec_handle, &sample_cfg) != ESP_CODEC_DEV_OK) { + ESP_LOGE(TAG, "Open codec device failed"); + assert(false); + } + + /* Set the initial gain */ + if (esp_codec_dev_set_in_gain(codec_handle, EXAMPLE_ES7210_MIC_GAIN) != ESP_CODEC_DEV_OK) { + ESP_LOGE(TAG, "set input gain failed"); + assert(false); + } + + return codec_handle; } static esp_err_t record_wav(i2s_chan_handle_t i2s_rx_chan) @@ -231,7 +267,6 @@ static esp_err_t record_wav(i2s_chan_handle_t i2s_rx_chan) /* Start recording */ size_t wav_written = 0; static int16_t i2s_readraw_buff[4096]; - ESP_GOTO_ON_ERROR(i2s_channel_enable(i2s_rx_chan), err, TAG, "error while starting i2s rx channel"); while (wav_written < wav_size) { if (wav_written % byte_rate < sizeof(i2s_readraw_buff)) { ESP_LOGI(TAG, "Recording: %"PRIu32"/%ds", wav_written / byte_rate + 1, (int)EXAMPLE_RECORD_TIME_SEC); @@ -247,7 +282,6 @@ static esp_err_t record_wav(i2s_chan_handle_t i2s_rx_chan) } err: - i2s_channel_disable(i2s_rx_chan); ESP_LOGI(TAG, "Recording done! Flushing file buffer"); fclose(f); @@ -259,13 +293,15 @@ void app_main(void) /* Init I2C bus to configure ES7210 and I2S bus to receive audio data from ES7210 */ i2s_chan_handle_t i2s_rx_chan = es7210_i2s_init(); /* Create ES7210 device handle and configure codec parameters */ - es7210_codec_init(); + esp_codec_dev_handle_t codec_handle = es7210_codec_init(i2s_rx_chan); /* Mount SD card, the recorded audio file will be saved into it */ sdmmc_card_t *sdmmc_card = mount_sdcard(); /* Start to record wav audio */ esp_err_t err = record_wav(i2s_rx_chan); /* Unmount SD card */ esp_vfs_fat_sdcard_unmount(EXAMPLE_SD_MOUNT_POINT, sdmmc_card); + /* Close codec device */ + esp_codec_dev_close(codec_handle); if (err == ESP_OK) { ESP_LOGI(TAG, "Audio was successfully recorded into "EXAMPLE_RECORD_FILE_PATH ". You can now remove the SD card safely"); diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es7210_tdm/main/idf_component.yml b/examples/peripherals/i2s/i2s_codec/i2s_es7210_tdm/main/idf_component.yml index 287056bd515..4f217693059 100644 --- a/examples/peripherals/i2s/i2s_codec/i2s_es7210_tdm/main/idf_component.yml +++ b/examples/peripherals/i2s/i2s_codec/i2s_es7210_tdm/main/idf_component.yml @@ -1,19 +1,5 @@ ## IDF Component Manager Manifest File dependencies: - espressif/es7210: "^1.0.0" - ## Required IDF version - idf: - version: ">=4.4.0" - # # Put list of dependencies here - # # For components maintained by Espressif: - # component: "~1.0.0" - # # For 3rd party components: - # username/component: ">=1.0.0,<2.0.0" - # username2/component2: - # version: "~1.0.0" - # # For transient dependencies `public` flag can be set. - # # `public` flag doesn't have an effect dependencies of the `main` component. - # # All dependencies of `main` are public by default. - # public: true + espressif/esp_codec_dev: ^1.3.4 i2s_examples_common: path: ${IDF_PATH}/examples/peripherals/i2s/i2s_examples_common diff --git a/examples/peripherals/i2s/i2s_codec/i2s_es8311/README.md b/examples/peripherals/i2s/i2s_codec/i2s_es8311/README.md index b79ae8b923b..e691eaf9338 100644 --- a/examples/peripherals/i2s/i2s_codec/i2s_es8311/README.md +++ b/examples/peripherals/i2s/i2s_codec/i2s_es8311/README.md @@ -59,11 +59,11 @@ Note: Since ESP32-C3 & ESP32-H2 board does not have GPIO 16/17, you can use othe ### Dependency -This example is based on [es8311 component](https://components.espressif.com/component/espressif/es8311) +This example is based on [esp_codec_dev component](https://components.espressif.com/components/espressif/esp_codec_dev) -The component can be installed by [IDF Component Manager](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-component-manager.html). This example already includes it. If you want to install [es8311 component](https://components.espressif.com/components/espressif/es8311) separately in your project, you can input the following command: +The component can be installed by [IDF Component Manager](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-component-manager.html). This example already includes it. If you want to install [esp_codec_dev component](https://components.espressif.com/components/espressif/esp_codec_dev) separately in your project, you can input the following command: ``` -idf.py add-dependency "espressif/es8311^1.0.0" +idf.py add-dependency "espressif/esp_codec_dev^1.3.4" ``` If the dependency is added, you can check `idf_component.yml` for more detail. When building this example or other projects with managed components, the component manager will search for the required components online and download them into the `managed_components` folder. From b5b2231268b32f9d845d04ad561420a5a5ec8446 Mon Sep 17 00:00:00 2001 From: gaoxu Date: Tue, 1 Apr 2025 17:19:11 +0800 Subject: [PATCH 085/213] fix(adc): fix s2 cali loss resolution --- components/esp_adc/esp32s2/adc_cali_line_fitting.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esp_adc/esp32s2/adc_cali_line_fitting.c b/components/esp_adc/esp32s2/adc_cali_line_fitting.c index 2e826e1f08a..332f1bc3a6b 100644 --- a/components/esp_adc/esp32s2/adc_cali_line_fitting.c +++ b/components/esp_adc/esp32s2/adc_cali_line_fitting.c @@ -143,7 +143,7 @@ static esp_err_t cali_raw_to_voltage(void *arg, int raw, int *voltage) //pointers are checked in the upper layer cali_chars_line_fitting_t *ctx = arg; - *voltage = raw * ctx->coeff_a / coeff_a_scaling + ctx->coeff_b / coeff_b_scaling; + *voltage = (raw * ctx->coeff_a / (coeff_a_scaling / coeff_b_scaling) + ctx->coeff_b) / coeff_b_scaling; return ESP_OK; } From 56f6dc55a5e81314551786ebfd08d555e65d1668 Mon Sep 17 00:00:00 2001 From: Fu Hanxi Date: Tue, 24 Jun 2025 09:09:07 +0200 Subject: [PATCH 086/213] ci: remove cached submodule metadata while checking with github --- .gitlab/ci/deploy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab/ci/deploy.yml b/.gitlab/ci/deploy.yml index 1df1004ee82..58b951b4b56 100644 --- a/.gitlab/ci/deploy.yml +++ b/.gitlab/ci/deploy.yml @@ -19,6 +19,7 @@ check_submodule_sync: dependencies: [] script: - git submodule deinit --force . + - rm -rf .git/modules # remove all the cached metadata # setting the default remote URL to the public one, to resolve relative location URLs - git config remote.origin.url ${PUBLIC_IDF_URL} # check if all submodules are correctly synced to public repository From 89f5e5d14964c7d06efcae361c943db013876b67 Mon Sep 17 00:00:00 2001 From: ding huan Date: Fri, 13 Jun 2025 19:08:40 +0800 Subject: [PATCH 087/213] fix(conn): wifi connect before connected status --- .../test_apps/wifi_connect/main/app_main.c | 1 + .../wifi_connect/main/test_wifi_conn.c | 17 ++++++++--------- .../test_apps/wifi_connect/sdkconfig.defaults | 3 ++- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/components/esp_wifi/test_apps/wifi_connect/main/app_main.c b/components/esp_wifi/test_apps/wifi_connect/main/app_main.c index 5816593f4ae..3d14ad85dcb 100644 --- a/components/esp_wifi/test_apps/wifi_connect/main/app_main.c +++ b/components/esp_wifi/test_apps/wifi_connect/main/app_main.c @@ -37,6 +37,7 @@ void setUp(void) void tearDown(void) { ESP_ERROR_CHECK(esp_wifi_deinit()); + vTaskDelay(500 / portTICK_PERIOD_MS); size_t after_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); size_t after_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); check_leak(before_free_8bit, after_free_8bit, "8BIT"); diff --git a/components/esp_wifi/test_apps/wifi_connect/main/test_wifi_conn.c b/components/esp_wifi/test_apps/wifi_connect/main/test_wifi_conn.c index 2088774a552..8602330315e 100644 --- a/components/esp_wifi/test_apps/wifi_connect/main/test_wifi_conn.c +++ b/components/esp_wifi/test_apps/wifi_connect/main/test_wifi_conn.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 * @@ -272,11 +272,11 @@ static void esp_wifi_connect_first_time(void) // make sure softap has started vTaskDelay(1000 / portTICK_PERIOD_MS); - wifi_config_t w_config; - memset(&w_config, 0, sizeof(w_config)); - memcpy(w_config.sta.ssid, TEST_DEFAULT_SSID, strlen(TEST_DEFAULT_SSID)); - memcpy(w_config.sta.password, TEST_DEFAULT_PWD, strlen(TEST_DEFAULT_PWD)); - w_config.sta.channel = 1; + wifi_config_t w_config = { + .sta.ssid = TEST_DEFAULT_SSID, + .sta.password = "invalid_password", + .sta.channel = 1, + }; wifi_event_handler_flag |= EVENT_HANDLER_FLAG_DO_NOT_AUTO_RECONNECT; @@ -284,7 +284,6 @@ static void esp_wifi_connect_first_time(void) ESP_LOGI(TAG, "start esp_wifi_connect first time: %s", TEST_DEFAULT_SSID); TEST_ESP_OK(esp_wifi_connect()); } - static void test_wifi_connect_at_scan_phase(void) { @@ -304,8 +303,8 @@ static void test_wifi_connect_before_connected_phase(void) esp_wifi_connect_first_time(); - // connect before connected - vTaskDelay(730 / portTICK_PERIOD_MS); + // connect before connected from channel 1 to 6 need 720ms + vTaskDelay(725 / portTICK_PERIOD_MS); ESP_LOGI(TAG, "connect when first connect after scan before connected"); TEST_ESP_ERR(ESP_ERR_WIFI_CONN, esp_wifi_connect()); wifi_event_handler_flag |= EVENT_HANDLER_FLAG_DO_NOT_AUTO_RECONNECT; diff --git a/components/esp_wifi/test_apps/wifi_connect/sdkconfig.defaults b/components/esp_wifi/test_apps/wifi_connect/sdkconfig.defaults index 7a161c4bbd5..4f3584cd25a 100644 --- a/components/esp_wifi/test_apps/wifi_connect/sdkconfig.defaults +++ b/components/esp_wifi/test_apps/wifi_connect/sdkconfig.defaults @@ -1,3 +1,4 @@ # ignore task watchdog triggered by unity_run_menu -CONFIG_ESP_TASK_WDT=n +CONFIG_ESP_TASK_WDT_EN=n +CONFIG_FREERTOS_HZ=1000 From 18d17ebd237a89032426c0df9150df2504c93afc Mon Sep 17 00:00:00 2001 From: armando Date: Mon, 16 Jun 2025 13:16:56 +0800 Subject: [PATCH 088/213] fix(cache): fixed SOC_CACHE_FREEZE_SUPPORTED not defined on c3/c2 issue --- components/hal/esp32c2/include/hal/cache_ll.h | 28 ++++++++++++++++++- components/hal/esp32c3/include/hal/cache_ll.h | 28 ++++++++++++++++++- .../esp32c2/include/soc/Kconfig.soc_caps.in | 4 +++ components/soc/esp32c2/include/soc/soc_caps.h | 1 + .../esp32c3/include/soc/Kconfig.soc_caps.in | 4 +++ components/soc/esp32c3/include/soc/soc_caps.h | 1 + 6 files changed, 64 insertions(+), 2 deletions(-) diff --git a/components/hal/esp32c2/include/hal/cache_ll.h b/components/hal/esp32c2/include/hal/cache_ll.h index ba192c98b60..814173cfa36 100644 --- a/components/hal/esp32c2/include/hal/cache_ll.h +++ b/components/hal/esp32c2/include/hal/cache_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -149,6 +149,32 @@ static inline void cache_ll_invalidate_addr(uint32_t cache_level, cache_type_t t Cache_Invalidate_Addr(vaddr, size); } +/** + * @brief Freeze Cache + * + * @param cache_level level of the cache + * @param type see `cache_type_t` + * @param cache_id id of the cache in this type and level + */ +__attribute__((always_inline)) +static inline void cache_ll_freeze_cache(uint32_t cache_level, cache_type_t type, uint32_t cache_id) +{ + Cache_Freeze_ICache_Enable(CACHE_FREEZE_ACK_BUSY); +} + +/** + * @brief Unfreeze Cache + * + * @param cache_level level of the cache + * @param type see `cache_type_t` + * @param cache_id id of the cache in this type and level + */ +__attribute__((always_inline)) +static inline void cache_ll_unfreeze_cache(uint32_t cache_level, cache_type_t type, uint32_t cache_id) +{ + Cache_Freeze_ICache_Disable(); +} + /** * @brief Get Cache line size, in bytes * diff --git a/components/hal/esp32c3/include/hal/cache_ll.h b/components/hal/esp32c3/include/hal/cache_ll.h index 71022d0121f..0dfcc45447d 100644 --- a/components/hal/esp32c3/include/hal/cache_ll.h +++ b/components/hal/esp32c3/include/hal/cache_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -152,6 +152,32 @@ static inline void cache_ll_invalidate_addr(uint32_t cache_level, cache_type_t t Cache_Invalidate_Addr(vaddr, size); } +/** + * @brief Freeze Cache + * + * @param cache_level level of the cache + * @param type see `cache_type_t` + * @param cache_id id of the cache in this type and level + */ +__attribute__((always_inline)) +static inline void cache_ll_freeze_cache(uint32_t cache_level, cache_type_t type, uint32_t cache_id) +{ + Cache_Freeze_ICache_Enable(CACHE_FREEZE_ACK_BUSY); +} + +/** + * @brief Unfreeze Cache + * + * @param cache_level level of the cache + * @param type see `cache_type_t` + * @param cache_id id of the cache in this type and level + */ +__attribute__((always_inline)) +static inline void cache_ll_unfreeze_cache(uint32_t cache_level, cache_type_t type, uint32_t cache_id) +{ + Cache_Freeze_ICache_Disable(); +} + /** * @brief Get Cache line size, in bytes * diff --git a/components/soc/esp32c2/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c2/include/soc/Kconfig.soc_caps.in index fc3ef4e665d..a86595bde12 100644 --- a/components/soc/esp32c2/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c2/include/soc/Kconfig.soc_caps.in @@ -227,6 +227,10 @@ config SOC_SHARED_IDCACHE_SUPPORTED bool default y +config SOC_CACHE_FREEZE_SUPPORTED + bool + default y + config SOC_CPU_CORES_NUM int default 1 diff --git a/components/soc/esp32c2/include/soc/soc_caps.h b/components/soc/esp32c2/include/soc/soc_caps.h index fed786801dd..cab674000bf 100644 --- a/components/soc/esp32c2/include/soc/soc_caps.h +++ b/components/soc/esp32c2/include/soc/soc_caps.h @@ -93,6 +93,7 @@ /*-------------------------- CACHE CAPS --------------------------------------*/ #define SOC_SHARED_IDCACHE_SUPPORTED 1 //Shared Cache for both instructions and data +#define SOC_CACHE_FREEZE_SUPPORTED 1 /*-------------------------- CPU CAPS ----------------------------------------*/ #define SOC_CPU_CORES_NUM (1U) diff --git a/components/soc/esp32c3/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c3/include/soc/Kconfig.soc_caps.in index fd137202d86..abf437ea8c5 100644 --- a/components/soc/esp32c3/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c3/include/soc/Kconfig.soc_caps.in @@ -311,6 +311,10 @@ config SOC_SHARED_IDCACHE_SUPPORTED bool default y +config SOC_CACHE_FREEZE_SUPPORTED + bool + default y + config SOC_CACHE_MEMORY_IBANK_SIZE hex default 0x4000 diff --git a/components/soc/esp32c3/include/soc/soc_caps.h b/components/soc/esp32c3/include/soc/soc_caps.h index bd0c08cb28a..772507205d5 100644 --- a/components/soc/esp32c3/include/soc/soc_caps.h +++ b/components/soc/esp32c3/include/soc/soc_caps.h @@ -124,6 +124,7 @@ /*-------------------------- CACHE CAPS --------------------------------------*/ #define SOC_SHARED_IDCACHE_SUPPORTED 1 //Shared Cache for both instructions and data +#define SOC_CACHE_FREEZE_SUPPORTED 1 #define SOC_CACHE_MEMORY_IBANK_SIZE 0x4000 // has to be same as the definition in ROM component /*-------------------------- CPU CAPS ----------------------------------------*/ From 096acfc67c273d0d05f7a77754867e50807b97f1 Mon Sep 17 00:00:00 2001 From: Zhang Hai Peng Date: Wed, 25 Jun 2025 11:53:41 +0800 Subject: [PATCH 089/213] fix(ble/bluedroid): fix build failure when some BLE features are disabled (cherry picked from commit a29cd4ad5f977a2df630baf6a576b646d3cdfe7a) Co-authored-by: zhanghaipeng --- components/bt/host/bluedroid/Kconfig.in | 10 +++++----- components/bt/host/bluedroid/api/esp_gap_ble_api.c | 4 ++-- components/bt/host/bluedroid/btc/core/btc_main.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/components/bt/host/bluedroid/Kconfig.in b/components/bt/host/bluedroid/Kconfig.in index 63c94c75dbc..e45e7863acf 100644 --- a/components/bt/host/bluedroid/Kconfig.in +++ b/components/bt/host/bluedroid/Kconfig.in @@ -1262,7 +1262,7 @@ config BT_BLE_50_EXTEND_ADV_EN config BT_BLE_50_PERIODIC_ADV_EN bool "Enable BLE periodic advertising" - depends on BT_BLE_50_FEATURES_SUPPORTED + depends on BT_BLE_50_EXTEND_ADV_EN default y help This enables BLE periodic advertising @@ -1276,7 +1276,7 @@ config BT_BLE_50_EXTEND_SCAN_EN config BT_BLE_50_EXTEND_SYNC_EN bool "Enable BLE periodic advertising sync" - depends on BT_BLE_50_FEATURES_SUPPORTED + depends on BT_BLE_50_EXTEND_SCAN_EN default y help This enables BLE periodic advertising sync @@ -1290,21 +1290,21 @@ config BT_BLE_50_DTM_TEST_EN config BT_BLE_FEAT_PERIODIC_ADV_SYNC_TRANSFER bool "Enable BLE periodic advertising sync transfer feature" - depends on (BT_BLUEDROID_ENABLED && BT_BLE_50_FEATURES_SUPPORTED && ((BT_CONTROLLER_ENABLED && SOC_ESP_NIMBLE_CONTROLLER) || BT_CONTROLLER_DISABLED)) # NOERROR + depends on (BT_BLUEDROID_ENABLED && BT_BLE_50_PERIODIC_ADV_EN && ((BT_CONTROLLER_ENABLED && SOC_ESP_NIMBLE_CONTROLLER) || BT_CONTROLLER_DISABLED)) # NOERROR default n help This enables BLE periodic advertising sync transfer feature config BT_BLE_FEAT_PERIODIC_ADV_ENH bool "Enable periodic adv enhancements(adi support)" - depends on (BT_BLUEDROID_ENABLED && BT_BLE_50_FEATURES_SUPPORTED && ((BT_CONTROLLER_ENABLED && SOC_ESP_NIMBLE_CONTROLLER) || BT_CONTROLLER_DISABLED)) # NOERROR + depends on (BT_BLUEDROID_ENABLED && BT_BLE_50_PERIODIC_ADV_EN && ((BT_CONTROLLER_ENABLED && SOC_ESP_NIMBLE_CONTROLLER) || BT_CONTROLLER_DISABLED)) # NOERROR default n help Enable the periodic advertising enhancements config BT_BLE_FEAT_CREATE_SYNC_ENH bool "Enable create sync enhancements(reporting disable and duplicate filtering enable support)" - depends on (BT_BLUEDROID_ENABLED && BT_BLE_50_FEATURES_SUPPORTED && ((BT_CONTROLLER_ENABLED && SOC_ESP_NIMBLE_CONTROLLER) || BT_CONTROLLER_DISABLED)) # NOERROR + depends on (BT_BLUEDROID_ENABLED && BT_BLE_50_EXTEND_SYNC_EN && ((BT_CONTROLLER_ENABLED && SOC_ESP_NIMBLE_CONTROLLER) || BT_CONTROLLER_DISABLED)) # NOERROR default n help Enable the create sync enhancements diff --git a/components/bt/host/bluedroid/api/esp_gap_ble_api.c b/components/bt/host/bluedroid/api/esp_gap_ble_api.c index 453b5ea7ca9..4959c0715b5 100644 --- a/components/bt/host/bluedroid/api/esp_gap_ble_api.c +++ b/components/bt/host/bluedroid/api/esp_gap_ble_api.c @@ -442,7 +442,7 @@ esp_err_t esp_ble_gap_get_local_used_addr(esp_bd_addr_t local_used_addr, uint8_t } return ESP_OK; } - +#if ((BLE_42_SCAN_EN == TRUE) || (BLE_50_EXTEND_SCAN_EN == TRUE)) uint8_t *esp_ble_resolve_adv_data_by_type( uint8_t *adv_data, uint16_t adv_data_len, esp_ble_adv_data_type type, uint8_t *length) { if (length == NULL) { @@ -473,7 +473,7 @@ uint8_t *esp_ble_resolve_adv_data( uint8_t *adv_data, uint8_t type, uint8_t *len { return esp_ble_resolve_adv_data_by_type( adv_data, ESP_BLE_ADV_DATA_LEN_MAX + ESP_BLE_SCAN_RSP_DATA_LEN_MAX, (esp_ble_adv_data_type) type, length); } - +#endif // #if ((BLE_42_SCAN_EN == TRUE) || (BLE_50_EXTEND_SCAN_EN == TRUE)) #if (BLE_42_FEATURE_SUPPORT == TRUE) #if (BLE_42_ADV_EN == TRUE) esp_err_t esp_ble_gap_config_adv_data_raw(uint8_t *raw_data, uint32_t raw_data_len) diff --git a/components/bt/host/bluedroid/btc/core/btc_main.c b/components/bt/host/bluedroid/btc/core/btc_main.c index cb92ff9beaf..8746039ea0e 100644 --- a/components/bt/host/bluedroid/btc/core/btc_main.c +++ b/components/bt/host/bluedroid/btc/core/btc_main.c @@ -174,7 +174,7 @@ uint32_t btc_get_ble_status(void) #endif #endif - #if (BLE_50_FEATURE_SUPPORT == TRUE) + #if (BLE_50_EXTEND_ADV_EN == TRUE) // Number of active extended advertsing extern uint8_t btm_ble_ext_adv_active_count(void); if (btm_ble_ext_adv_active_count()) { From 34b8f67a89951e8eed529ca62d6a2d714973317c Mon Sep 17 00:00:00 2001 From: "yanzihan@espressif.com" Date: Tue, 24 Jun 2025 11:01:01 +0800 Subject: [PATCH 090/213] feat(esp_hw_support): use pvt to auto control digital ldo and rtc ldo for esp32p4 --- components/esp_hw_support/Kconfig | 10 ++ components/esp_hw_support/linker.lf | 2 + .../port/esp32p4/CMakeLists.txt | 4 + .../port/esp32p4/include/soc/rtc.h | 32 +++- .../esp_hw_support/port/esp32p4/pmu_init.c | 10 +- .../esp_hw_support/port/esp32p4/pmu_param.c | 50 +++++- .../esp_hw_support/port/esp32p4/pmu_pvt.c | 154 ++++++++++++++++++ .../esp_hw_support/port/esp32p4/pmu_sleep.c | 2 +- .../port/esp32p4/private_include/pmu_param.h | 5 +- .../port/esp32p4/rtc_clk_init.c | 15 +- components/esp_hw_support/sleep_modes.c | 8 + .../esp_hw_support/sleep_system_peripheral.c | 17 +- components/esp_system/port/soc/esp32p4/clk.c | 3 + components/hal/esp32p4/include/hal/efuse_ll.h | 17 +- .../esp32p4/include/soc/Kconfig.soc_caps.in | 4 + components/soc/esp32p4/include/soc/soc_caps.h | 1 + .../include/soc/system_periph_retention.h | 12 +- components/soc/esp32p4/register/soc/pvt_reg.h | 32 ++-- .../soc/esp32p4/register/soc/pvt_struct.h | 38 ++++- .../soc/esp32p4/system_retention_periph.c | 8 + components/soc/include/soc/regdma.h | 2 + 21 files changed, 396 insertions(+), 30 deletions(-) create mode 100644 components/esp_hw_support/port/esp32p4/pmu_pvt.c diff --git a/components/esp_hw_support/Kconfig b/components/esp_hw_support/Kconfig index ef9d4f9c51f..0c4a8f6aca4 100644 --- a/components/esp_hw_support/Kconfig +++ b/components/esp_hw_support/Kconfig @@ -282,4 +282,14 @@ menu "Hardware Settings" Due to the poor low-temperature characteristics of RC32K (it cannot operate below -40 degrees Celsius), please avoid using it whenever possible + + config ESP_ENABLE_PVT + bool "Auto adjust hp & lp voltage using pvt function (MUST ENABLE FOR MP)" + depends on SOC_PMU_PVT_SUPPORTED + default y + help + If enabled, hp & lp voltage can be auto adjust by PVT characteristic. + Otherwise, internal voltage will be set to fix dbias. + This is a must for stable mass production. Disable for debugging only. + endmenu diff --git a/components/esp_hw_support/linker.lf b/components/esp_hw_support/linker.lf index af8f84c0cd5..a30384a17b1 100644 --- a/components/esp_hw_support/linker.lf +++ b/components/esp_hw_support/linker.lf @@ -25,6 +25,8 @@ entries: if SPIRAM_FLASH_LOAD_TO_PSRAM = y: pmu_init (noflash) pmu_param (noflash) + if SOC_PMU_PVT_SUPPORTED = y: + pmu_pvt (noflash) if SOC_USB_SERIAL_JTAG_SUPPORTED = y: sleep_console (noflash) if SOC_USB_OTG_SUPPORTED && SOC_PM_SUPPORT_CNNT_PD = y: diff --git a/components/esp_hw_support/port/esp32p4/CMakeLists.txt b/components/esp_hw_support/port/esp32p4/CMakeLists.txt index 80c879245ab..fd15470400b 100644 --- a/components/esp_hw_support/port/esp32p4/CMakeLists.txt +++ b/components/esp_hw_support/port/esp32p4/CMakeLists.txt @@ -18,6 +18,10 @@ if(NOT BOOTLOADER_BUILD) endif() +if(NOT BOOTLOADER_BUILD AND CONFIG_ESP_ENABLE_PVT) + list(APPEND srcs "pmu_pvt.c") +endif() + add_prefix(srcs "${CMAKE_CURRENT_LIST_DIR}/" "${srcs}") target_sources(${COMPONENT_LIB} PRIVATE "${srcs}") diff --git a/components/esp_hw_support/port/esp32p4/include/soc/rtc.h b/components/esp_hw_support/port/esp32p4/include/soc/rtc.h index 7c627a03bd2..20875057b14 100644 --- a/components/esp_hw_support/port/esp32p4/include/soc/rtc.h +++ b/components/esp_hw_support/port/esp32p4/include/soc/rtc.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -95,6 +95,36 @@ set sleep_init default param #define RTC_CNTL_PD_CUR_SLEEP_DEFAULT 1 #define RTC_CNTL_DG_VDD_DRV_B_SLP_DEFAULT 254 +#if CONFIG_ESP_ENABLE_PVT + +#define PVT_CHANNEL0_SEL 49 +#define PVT_CHANNEL1_SEL 53 +#define PVT_CHANNEL0_CFG 0x13e80 +#define PVT_CHANNEL1_CFG 0x13e80 +#define PVT_CHANNEL2_CFG 0x10000 +#define PVT_CMD0 0x24 +#define PVT_CMD1 0x5 +#define PVT_CMD2 0x427 +#define PVT_TARGET 0x7d00 +#define PVT_CLK_DIV 1 +#define PVT_EDG_MODE 1 +#define PVT_DELAY_NUM_HIGH 164 +#define PVT_DELAY_NUM_LOW 157 + +/** + * @brief Initialize PVT related parameters + */ +void pvt_auto_dbias_init(void); + +/** + * @brief Enable or disable PVT functions + * + * @param enable true to enable, false to disable + */ +void pvt_func_enable(bool enable); + +#endif //#if CONFIG_ESP_ENABLE_PVT + /* The follow value is used to get a reasonable rtc voltage dbias value according to digital dbias & some other value storing in efuse (based on ATE 5k ECO3 chips) diff --git a/components/esp_hw_support/port/esp32p4/pmu_init.c b/components/esp_hw_support/port/esp32p4/pmu_init.c index f511dd4341a..a223985f57d 100644 --- a/components/esp_hw_support/port/esp32p4/pmu_init.c +++ b/components/esp_hw_support/port/esp32p4/pmu_init.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -18,6 +18,8 @@ #include "esp_private/esp_pmu.h" #include "soc/regi2c_dig_reg.h" #include "regi2c_ctrl.h" +#include "esp_rom_sys.h" +#include "soc/rtc.h" static __attribute__((unused)) const char *TAG = "pmu_init"; @@ -194,4 +196,10 @@ void pmu_init(void) pmu_hp_system_init_default(PMU_instance()); pmu_lp_system_init_default(PMU_instance()); pmu_power_domain_force_default(PMU_instance()); +#if CONFIG_ESP_ENABLE_PVT + pvt_auto_dbias_init(); + pvt_func_enable(true); + // For PVT func taking effect, need delay. + esp_rom_delay_us(1000); +#endif } diff --git a/components/esp_hw_support/port/esp32p4/pmu_param.c b/components/esp_hw_support/port/esp32p4/pmu_param.c index 44b73bd6a1b..36a8f64de8a 100644 --- a/components/esp_hw_support/port/esp32p4/pmu_param.c +++ b/components/esp_hw_support/port/esp32p4/pmu_param.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -13,6 +13,11 @@ #include "soc/pmu_icg_mapping.h" #include "esp_private/esp_pmu.h" #include "soc/clk_tree_defs.h" +#include "hal/efuse_ll.h" +#include "hal/efuse_hal.h" +#include "esp_hw_log.h" + +static __attribute__((unused)) const char *TAG = "pmu_param"; #ifndef ARRAY_SIZE #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) @@ -330,3 +335,46 @@ const pmu_lp_system_analog_param_t * pmu_lp_system_analog_param_default(pmu_lp_m assert(mode < ARRAY_SIZE(lp_analog)); return &lp_analog[mode]; } + +uint32_t get_act_hp_dbias(void) +{ + /* hp_cali_dbias is read from efuse to ensure that the hp_active_voltage is close to 1.15V + */ + uint32_t hp_cali_dbias = HP_CALI_ACTIVE_DBIAS_DEFAULT; + uint32_t blk_version = efuse_hal_blk_version(); + uint32_t hp_cali_dbias_efuse = 0; + if (blk_version >= 2) { + hp_cali_dbias_efuse = efuse_ll_get_active_hp_dbias(); + } + if (hp_cali_dbias_efuse > 0) { + hp_cali_dbias = hp_cali_dbias_efuse + 16; + if (hp_cali_dbias > 31) { + hp_cali_dbias = 31; + } + } else { + ESP_HW_LOGW(TAG, "hp_cali_dbias not burnt in efuse, use default."); + } + return hp_cali_dbias; +} + +uint32_t get_act_lp_dbias(void) +{ + /* lp_cali_dbias is read from efuse to ensure that the lp_active_voltage is close to 1.15V + */ + uint32_t lp_cali_dbias = LP_CALI_ACTIVE_DBIAS_DEFAULT; + uint32_t blk_version = efuse_hal_blk_version(); + uint32_t lp_cali_dbias_efuse = 0; + if (blk_version >= 2) { + lp_cali_dbias_efuse = efuse_ll_get_active_lp_dbias(); + } + if (lp_cali_dbias_efuse > 0) { + //efuse dbias need to add 4 to near to dcdc voltage + lp_cali_dbias = lp_cali_dbias_efuse + 16 + 4; + if (lp_cali_dbias > 31) { + lp_cali_dbias = 31; + } + } else { + ESP_HW_LOGW(TAG, "lp_cali_dbias not burnt in efuse, use default."); + } + return lp_cali_dbias; +} diff --git a/components/esp_hw_support/port/esp32p4/pmu_pvt.c b/components/esp_hw_support/port/esp32p4/pmu_pvt.c new file mode 100644 index 00000000000..03a07258caf --- /dev/null +++ b/components/esp_hw_support/port/esp32p4/pmu_pvt.c @@ -0,0 +1,154 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include "sdkconfig.h" +#include "esp_attr.h" +#include "soc/soc.h" +#include "soc/pmu_struct.h" +#include "soc/pvt_reg.h" +#include "soc/pmu_reg.h" +#include "soc/hp_sys_clkrst_reg.h" +#include "hal/pmu_hal.h" +#include "pmu_param.h" +#include "esp_rom_sys.h" +#include "esp_private/esp_pmu.h" +#include "soc/regi2c_dig_reg.h" +#include "regi2c_ctrl.h" +#include "soc/rtc.h" +#include "hal/efuse_ll.h" +#include "hal/efuse_hal.h" +#include "esp_hw_log.h" + +static __attribute__((unused)) const char *TAG = "pmu_pvt"; + +#if CONFIG_ESP_ENABLE_PVT + +static uint8_t get_lp_hp_gap(void) +{ + int8_t lp_hp_gap = 0; + uint32_t blk_version = efuse_hal_blk_version(); + uint8_t lp_hp_gap_efuse = 0; + if (blk_version >= 2) { + lp_hp_gap_efuse = efuse_ll_get_dbias_vol_gap(); + bool gap_flag = lp_hp_gap_efuse >> 4; + uint8_t gap_abs_value = lp_hp_gap_efuse & 0xf; + if (gap_flag) { + lp_hp_gap = -1 * gap_abs_value; + } else { + lp_hp_gap = gap_abs_value; + } + lp_hp_gap = lp_hp_gap - 8; + assert((lp_hp_gap >= -15) && (lp_hp_gap <= 7)); + if (lp_hp_gap < 0 ) { + lp_hp_gap = 16 - lp_hp_gap; + } + } + return lp_hp_gap; +} + +static void set_pvt_hp_lp_gap(uint8_t value) +{ + bool flag = value >> 4; + uint8_t abs_value = value & 0xf; + + SET_PERI_REG_BITS(PVT_DBIAS_CMD0_REG, PVT_DBIAS_CMD0_OFFSET_FLAG, flag, PVT_DBIAS_CMD0_OFFSET_FLAG_S); + SET_PERI_REG_BITS(PVT_DBIAS_CMD0_REG, PVT_DBIAS_CMD0_OFFSET_VALUE, abs_value, PVT_DBIAS_CMD0_OFFSET_VALUE_S); + SET_PERI_REG_BITS(PVT_DBIAS_CMD1_REG, PVT_DBIAS_CMD1_OFFSET_FLAG, flag, PVT_DBIAS_CMD1_OFFSET_FLAG_S); + SET_PERI_REG_BITS(PVT_DBIAS_CMD1_REG, PVT_DBIAS_CMD1_OFFSET_VALUE, abs_value, PVT_DBIAS_CMD1_OFFSET_VALUE_S); + SET_PERI_REG_BITS(PVT_DBIAS_CMD2_REG, PVT_DBIAS_CMD2_OFFSET_FLAG, flag, PVT_DBIAS_CMD2_OFFSET_FLAG_S); + SET_PERI_REG_BITS(PVT_DBIAS_CMD2_REG, PVT_DBIAS_CMD2_OFFSET_VALUE, abs_value, PVT_DBIAS_CMD2_OFFSET_VALUE_S); +} + +static uint32_t pvt_get_dcmvset(void) +{ + return GET_PERI_REG_BITS2(PMU_HP_ACTIVE_HP_REGULATOR0_REG, PMU_HP_DBIAS_VOL_V, PMU_HP_DBIAS_VOL_S); +} + +static uint32_t pvt_get_lp_dbias(void) +{ + return GET_PERI_REG_BITS2(PMU_HP_ACTIVE_HP_REGULATOR0_REG, PMU_LP_DBIAS_VOL_V, PMU_LP_DBIAS_VOL_S); +} + +void pvt_auto_dbias_init(void) +{ + uint32_t blk_version = efuse_hal_blk_version(); + if (blk_version >= 2) { + SET_PERI_REG_MASK(HP_SYS_CLKRST_REF_CLK_CTRL2_REG, HP_SYS_CLKRST_REG_REF_160M_CLK_EN); + SET_PERI_REG_MASK(HP_SYS_CLKRST_SOC_CLK_CTRL1_REG, HP_SYS_CLKRST_REG_PVT_SYS_CLK_EN); + /*config for dbias func*/ + CLEAR_PERI_REG_MASK(PVT_DBIAS_TIMER_REG, PVT_TIMER_EN); + esp_rom_delay_us(100); + SET_PERI_REG_BITS(PVT_DBIAS_CHANNEL_SEL0_REG, PVT_DBIAS_CHANNEL0_SEL, PVT_CHANNEL0_SEL, PVT_DBIAS_CHANNEL0_SEL_S); + SET_PERI_REG_BITS(PVT_DBIAS_CHANNEL_SEL0_REG, PVT_DBIAS_CHANNEL1_SEL, PVT_CHANNEL1_SEL, PVT_DBIAS_CHANNEL1_SEL_S); // Select monitor cell, which used to monitor PVT situation + SET_PERI_REG_BITS(PVT_DBIAS_CHANNEL0_SEL_REG, PVT_DBIAS_CHANNEL0_CFG, PVT_CHANNEL0_CFG, PVT_DBIAS_CHANNEL0_CFG_S); + SET_PERI_REG_BITS(PVT_DBIAS_CHANNEL1_SEL_REG, PVT_DBIAS_CHANNEL1_CFG, PVT_CHANNEL1_CFG, PVT_DBIAS_CHANNEL1_CFG_S); + SET_PERI_REG_BITS(PVT_DBIAS_CHANNEL2_SEL_REG, PVT_DBIAS_CHANNEL2_CFG, PVT_CHANNEL2_CFG, PVT_DBIAS_CHANNEL2_CFG_S); // Configure filter threshold for avoiding auto-dbias overly sensitive regulation + SET_PERI_REG_BITS(PVT_DBIAS_CMD0_REG, PVT_DBIAS_CMD0_PVT, PVT_CMD0, PVT_DBIAS_CMD0_PVT_S); + SET_PERI_REG_BITS(PVT_DBIAS_CMD1_REG, PVT_DBIAS_CMD1_PVT, PVT_CMD1, PVT_DBIAS_CMD1_PVT_S); + SET_PERI_REG_BITS(PVT_DBIAS_CMD2_REG, PVT_DBIAS_CMD2_PVT, PVT_CMD2, PVT_DBIAS_CMD2_PVT_S); // Configure auto-dbias adjust property, such as adjusting step + SET_PERI_REG_MASK(PMU_HP_ACTIVE_HP_REGULATOR0_REG, PMU_DIG_DBIAS_INIT); // Start calibration @HP_CALI_DBIAS_DEFAULT + SET_PERI_REG_BITS(PVT_DBIAS_TIMER_REG, PVT_TIMER_TARGET, PVT_TARGET, PVT_TIMER_TARGET_S); // Configure auto-dbias voltage regulation cycle + + SET_PERI_REG_BITS(HP_SYS_CLKRST_PERI_CLK_CTRL24_REG, HP_SYS_CLKRST_REG_PVT_CLK_DIV_NUM, PVT_CLK_DIV, HP_SYS_CLKRST_REG_PVT_CLK_DIV_NUM_S); // PVT function clock divider number + SET_PERI_REG_BITS(HP_SYS_CLKRST_PERI_CLK_CTRL25_REG, HP_SYS_CLKRST_REG_PVT_PERI_GROUP_CLK_DIV_NUM, PVT_CLK_DIV, HP_SYS_CLKRST_REG_PVT_PERI_GROUP_CLK_DIV_NUM_S); // PVT function clock divider number + SET_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL24_REG, HP_SYS_CLKRST_REG_PVT_CLK_EN); + SET_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL25_REG, HP_SYS_CLKRST_REG_PVT_PERI_GROUP1_CLK_EN); + SET_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL25_REG, HP_SYS_CLKRST_REG_PVT_PERI_GROUP2_CLK_EN); + SET_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL25_REG, HP_SYS_CLKRST_REG_PVT_PERI_GROUP3_CLK_EN); + SET_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL25_REG, HP_SYS_CLKRST_REG_PVT_PERI_GROUP4_CLK_EN); + + /*config for pvt cell: unit0; site3; vt1*/ + SET_PERI_REG_MASK(PVT_CLK_CFG_REG, PVT_MONITOR_CLK_PVT_EN); // Once enable cannot be closed + esp_rom_delay_us(100); + SET_PERI_REG_BITS(PVT_COMB_PD_SITE3_UNIT0_VT1_CONF2_REG, PVT_MONITOR_EDG_MOD_VT1_PD_SITE3_UNIT0, PVT_EDG_MODE, PVT_MONITOR_EDG_MOD_VT1_PD_SITE3_UNIT0_S); // Select edge_mode + SET_PERI_REG_BITS(PVT_COMB_PD_SITE3_UNIT0_VT1_CONF1_REG, PVT_DELAY_LIMIT_VT1_PD_SITE3_UNIT0, PVT_DELAY_NUM_HIGH, PVT_DELAY_LIMIT_VT1_PD_SITE3_UNIT0_S); // The threshold for determining whether the voltage is too high + SET_PERI_REG_BITS(PVT_COMB_PD_SITE3_UNIT1_VT1_CONF1_REG, PVT_DELAY_LIMIT_VT1_PD_SITE3_UNIT1, PVT_DELAY_NUM_LOW, PVT_DELAY_LIMIT_VT1_PD_SITE3_UNIT1_S); // The threshold for determining whether the voltage is too low + + /*config lp offset for pvt func*/ + uint8_t lp_hp_gap = get_lp_hp_gap(); + set_pvt_hp_lp_gap(lp_hp_gap); + } else { + ESP_HW_LOGW(TAG, "blk_version is less than 2, pvt auto dbias init not supported in efuse."); + } +} + +void pvt_func_enable(bool enable) +{ + uint32_t blk_version = efuse_hal_blk_version(); + if (blk_version >= 2){ + + if (enable) { + SET_PERI_REG_MASK(HP_SYS_CLKRST_REF_CLK_CTRL2_REG, HP_SYS_CLKRST_REG_REF_160M_CLK_EN); + SET_PERI_REG_MASK(HP_SYS_CLKRST_SOC_CLK_CTRL1_REG, HP_SYS_CLKRST_REG_PVT_SYS_CLK_EN); + SET_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL24_REG, HP_SYS_CLKRST_REG_PVT_CLK_EN); + SET_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL25_REG, HP_SYS_CLKRST_REG_PVT_PERI_GROUP1_CLK_EN); + SET_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL25_REG, HP_SYS_CLKRST_REG_PVT_PERI_GROUP2_CLK_EN); + SET_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL25_REG, HP_SYS_CLKRST_REG_PVT_PERI_GROUP3_CLK_EN); + SET_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL25_REG, HP_SYS_CLKRST_REG_PVT_PERI_GROUP4_CLK_EN); + SET_PERI_REG_MASK(PMU_HP_ACTIVE_HP_REGULATOR0_REG, PMU_DIG_DBIAS_INIT); // Start calibration @HP_CALI_DBIAS_DEFAULT + SET_PERI_REG_MASK(PVT_CLK_CFG_REG, PVT_MONITOR_CLK_PVT_EN); // Once enable cannot be closed + SET_PERI_REG_MASK(PVT_COMB_PD_SITE3_UNIT0_VT1_CONF1_REG, PVT_MONITOR_EN_VT1_PD_SITE3_UNIT0); // Enable pvt clk + esp_rom_delay_us(1000); + CLEAR_PERI_REG_MASK(PMU_HP_ACTIVE_HP_REGULATOR0_REG, PMU_DIG_REGULATOR0_DBIAS_SEL); // Hand over control of dbias to pvt + CLEAR_PERI_REG_MASK(PMU_HP_ACTIVE_HP_REGULATOR0_REG, PMU_DIG_DBIAS_INIT); // Must clear @HP_CALI_DBIAS_DEFAULT + SET_PERI_REG_MASK(PVT_DBIAS_TIMER_REG, PVT_TIMER_EN); // Enable auto dbias + } else { + uint32_t pvt_dcmvset = pvt_get_dcmvset(); + uint32_t pvt_lpdbias = pvt_get_lp_dbias(); // Update pvt_cali_dbias + SET_PERI_REG_BITS(PMU_HP_ACTIVE_BIAS_REG, PMU_HP_ACTIVE_DCM_VSET, pvt_dcmvset, PMU_HP_ACTIVE_DCM_VSET_S); + SET_PERI_REG_BITS(PMU_HP_SLEEP_LP_REGULATOR0_REG, PMU_HP_SLEEP_LP_REGULATOR_DBIAS, pvt_lpdbias, PMU_HP_SLEEP_LP_REGULATOR_DBIAS_S); + SET_PERI_REG_MASK(PMU_HP_ACTIVE_HP_REGULATOR0_REG, PMU_DIG_REGULATOR0_DBIAS_SEL); // Hand over control of dbias to pmu + CLEAR_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL24_REG, HP_SYS_CLKRST_REG_PVT_CLK_EN); + } + } else { + ESP_HW_LOGD(TAG, "blk_version is less than 2, pvt function not supported in efuse."); + } +} + +#endif diff --git a/components/esp_hw_support/port/esp32p4/pmu_sleep.c b/components/esp_hw_support/port/esp32p4/pmu_sleep.c index 04daf809b94..d621fb25f9c 100644 --- a/components/esp_hw_support/port/esp32p4/pmu_sleep.c +++ b/components/esp_hw_support/port/esp32p4/pmu_sleep.c @@ -195,7 +195,7 @@ const pmu_sleep_config_t* pmu_sleep_config_default( analog_default.lp_sys[LP(SLEEP)].analog.bias_sleep = PMU_BIASSLP_SLEEP_ON; analog_default.lp_sys[LP(SLEEP)].analog.dbg_atten = PMU_DBG_ATTEN_ACTIVE_DEFAULT; #if !CONFIG_ESP_SLEEP_KEEP_DCDC_ALWAYS_ON - analog_default.lp_sys[LP(SLEEP)].analog.dbias = LP_CALI_DBIAS; + analog_default.lp_sys[LP(SLEEP)].analog.dbias = LP_CALI_ACTIVE_DBIAS_DEFAULT; #endif } diff --git a/components/esp_hw_support/port/esp32p4/private_include/pmu_param.h b/components/esp_hw_support/port/esp32p4/private_include/pmu_param.h index 899a1ecbe4a..d4b53eebaab 100644 --- a/components/esp_hw_support/port/esp32p4/private_include/pmu_param.h +++ b/components/esp_hw_support/port/esp32p4/private_include/pmu_param.h @@ -18,7 +18,7 @@ extern "C" { #define HP_CALI_ACTIVE_DCM_VSET_DEFAULT 27 // For DCDC, about 1.25v #define HP_CALI_ACTIVE_DBIAS_DEFAULT 24 // For HP regulator -#define LP_CALI_DBIAS 29 // For LP regulator +#define LP_CALI_ACTIVE_DBIAS_DEFAULT 29 // For LP regulator // FOR XTAL FORCE PU IN SLEEP #define PMU_PD_CUR_SLEEP_ON 0 @@ -53,6 +53,9 @@ extern "C" { #define PMU_DBG_ATTEN_DEEPSLEEP_DEFAULT 12 #define PMU_LP_DBIAS_DEEPSLEEP_0V7 23 +uint32_t get_act_hp_dbias(void); +uint32_t get_act_lp_dbias(void); + typedef struct { pmu_hp_dig_power_reg_t dig_power; pmu_hp_clk_power_reg_t clk_power; diff --git a/components/esp_hw_support/port/esp32p4/rtc_clk_init.c b/components/esp_hw_support/port/esp32p4/rtc_clk_init.c index 2003e500666..a8bc0d5b18e 100644 --- a/components/esp_hw_support/port/esp32p4/rtc_clk_init.c +++ b/components/esp_hw_support/port/esp32p4/rtc_clk_init.c @@ -54,11 +54,22 @@ void rtc_clk_init(rtc_clk_config_t cfg) REGI2C_WRITE_MASK(I2C_BIAS, I2C_BIAS_OR_FORCE_XPD_IPH, 0); REGI2C_WRITE_MASK(I2C_BIAS, I2C_BIAS_OR_FORCE_XPD_VGATE_BUF, 0); - pmu_ll_lp_set_regulator_dbias(&PMU, PMU_MODE_LP_ACTIVE, LP_CALI_DBIAS); + uint32_t hp_dbias = get_act_hp_dbias(); + uint32_t lp_dbias = get_act_lp_dbias(); + pmu_ll_hp_set_regulator_xpd(&PMU, PMU_MODE_HP_ACTIVE, true); + pmu_ll_hp_set_regulator_dbias(&PMU, PMU_MODE_HP_ACTIVE, hp_dbias); + pmu_ll_lp_set_regulator_dbias(&PMU, PMU_MODE_LP_ACTIVE, lp_dbias); + + uint32_t pvt_hp_dcmvset = GET_PERI_REG_BITS2(PMU_HP_ACTIVE_HP_REGULATOR0_REG, PMU_HP_DBIAS_VOL_V, PMU_HP_DBIAS_VOL_S); + uint32_t hp_dcmvset = HP_CALI_ACTIVE_DCM_VSET_DEFAULT; + if (pvt_hp_dcmvset > hp_dcmvset) { + hp_dcmvset = pvt_hp_dcmvset; + } // Switch to DCDC pmu_ll_set_dcdc_en(&PMU, true); pmu_ll_set_dcdc_switch_force_power_down(&PMU, false); - pmu_ll_hp_set_dcm_vset(&PMU, PMU_MODE_HP_ACTIVE, HP_CALI_ACTIVE_DCM_VSET_DEFAULT); + pmu_ll_hp_set_dcm_vset(&PMU, PMU_MODE_HP_ACTIVE, hp_dcmvset); + SET_PERI_REG_MASK(PMU_HP_ACTIVE_HP_REGULATOR0_REG, PMU_DIG_REGULATOR0_DBIAS_SEL); // Hand over control of dbias to pmu esp_rom_delay_us(1000); pmu_ll_hp_set_regulator_xpd(&PMU, PMU_MODE_HP_ACTIVE, false); diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index cba59b88449..230672967b9 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -20,6 +20,7 @@ #include "esp_private/esp_sleep_internal.h" #include "esp_private/esp_timer_private.h" #include "esp_private/rtc_clk.h" +#include "soc/rtc.h" #include "esp_private/sleep_event.h" #include "esp_private/system_internal.h" #include "esp_private/io_mux.h" @@ -699,6 +700,9 @@ FORCE_INLINE_ATTR void misc_modules_sleep_prepare(uint32_t sleep_flags, bool dee regi2c_tsens_reg_read(); #endif } +#if CONFIG_ESP_ENABLE_PVT + pvt_func_enable(false); +#endif #if !CONFIG_IDF_TARGET_ESP32C61 // TODO: IDF-7370 @@ -713,6 +717,10 @@ FORCE_INLINE_ATTR void misc_modules_sleep_prepare(uint32_t sleep_flags, bool dee */ FORCE_INLINE_ATTR void misc_modules_wake_prepare(uint32_t sleep_flags) { +#if CONFIG_ESP_ENABLE_PVT + pvt_func_enable(true); +#endif + #if CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP if (sleep_flags & PMU_SLEEP_PD_TOP) { // There is no driver to manage the flashboot watchdog, and it is definitely be in off state when diff --git a/components/esp_hw_support/sleep_system_peripheral.c b/components/esp_hw_support/sleep_system_peripheral.c index 77557765e6c..4a7b623f3fc 100644 --- a/components/esp_hw_support/sleep_system_peripheral.c +++ b/components/esp_hw_support/sleep_system_peripheral.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -121,6 +121,16 @@ esp_err_t sleep_pau_retention_init(void) } #endif +#if CONFIG_ESP_ENABLE_PVT +esp_err_t sleep_pvt_retention_init(void) +{ + esp_err_t err = sleep_retention_entries_create(pvt_regs_retention, ARRAY_SIZE(pvt_regs_retention), REGDMA_LINK_PRI_SYS_PERIPH_LOW, SLEEP_RETENTION_MODULE_SYS_PERIPH); + ESP_RETURN_ON_ERROR(err, TAG, "failed to allocate memory for system (PVT) retention"); + ESP_LOGI(TAG, "PVT sleep retention initialization"); + return ESP_OK; +} +#endif + static __attribute__((unused)) esp_err_t sleep_sys_periph_retention_init(void *arg) { esp_err_t err; @@ -152,6 +162,11 @@ static __attribute__((unused)) esp_err_t sleep_sys_periph_retention_init(void *a if(err) goto error; #if SOC_PAU_IN_TOP_DOMAIN err = sleep_pau_retention_init(); + if(err) goto error; +#endif +#if CONFIG_ESP_ENABLE_PVT + err = sleep_pvt_retention_init(); + if(err) goto error; #endif error: diff --git a/components/esp_system/port/soc/esp32p4/clk.c b/components/esp_system/port/soc/esp32p4/clk.c index 8b94ede3f58..54f6a3c2669 100644 --- a/components/esp_system/port/soc/esp32p4/clk.c +++ b/components/esp_system/port/soc/esp32p4/clk.c @@ -379,7 +379,10 @@ __attribute__((weak)) void esp_perip_clk_init(void) REG_CLR_BIT(HP_SYS_CLKRST_REF_CLK_CTRL1_REG, HP_SYS_CLKRST_REG_REF_50M_CLK_EN); REG_CLR_BIT(HP_SYS_CLKRST_REF_CLK_CTRL1_REG, HP_SYS_CLKRST_REG_REF_25M_CLK_EN); // 240M CLK is for Key Management use, should not be gated +#if !CONFIG_ESP_ENABLE_PVT REG_CLR_BIT(HP_SYS_CLKRST_REF_CLK_CTRL2_REG, HP_SYS_CLKRST_REG_REF_160M_CLK_EN); +#endif + // 160M CLK is for PVT use, should not be gated REG_CLR_BIT(HP_SYS_CLKRST_REF_CLK_CTRL2_REG, HP_SYS_CLKRST_REG_REF_120M_CLK_EN); REG_CLR_BIT(HP_SYS_CLKRST_REF_CLK_CTRL2_REG, HP_SYS_CLKRST_REG_REF_80M_CLK_EN); REG_CLR_BIT(HP_SYS_CLKRST_REF_CLK_CTRL2_REG, HP_SYS_CLKRST_REG_REF_20M_CLK_EN); diff --git a/components/hal/esp32p4/include/hal/efuse_ll.h b/components/hal/esp32p4/include/hal/efuse_ll.h index 11fd66c61d0..c9aefa8f082 100644 --- a/components/hal/esp32p4/include/hal/efuse_ll.h +++ b/components/hal/esp32p4/include/hal/efuse_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -144,6 +144,21 @@ __attribute__((always_inline)) static inline uint32_t efuse_ll_get_controller_st return EFUSE.status.state; } +__attribute__((always_inline)) static inline uint32_t efuse_ll_get_active_hp_dbias(void) +{ + return EFUSE.rd_mac_sys_4.active_hp_dbias; +} + +__attribute__((always_inline)) static inline uint32_t efuse_ll_get_active_lp_dbias(void) +{ + return EFUSE.rd_mac_sys_4.active_lp_dbias; +} + +__attribute__((always_inline)) static inline int32_t efuse_ll_get_dbias_vol_gap(void) +{ + return EFUSE.rd_mac_sys_5.lp_dcdc_dbias_vol_gap; +} + /******************* eFuse control functions *************************/ #ifdef __cplusplus diff --git a/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in b/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in index 260501d23bd..23dd7ae31ba 100644 --- a/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32p4/include/soc/Kconfig.soc_caps.in @@ -227,6 +227,10 @@ config SOC_PMU_SUPPORTED bool default y +config SOC_PMU_PVT_SUPPORTED + bool + default y + config SOC_DCDC_SUPPORTED bool default y diff --git a/components/soc/esp32p4/include/soc/soc_caps.h b/components/soc/esp32p4/include/soc/soc_caps.h index 4fff6c8f432..1021ea06ea9 100644 --- a/components/soc/esp32p4/include/soc/soc_caps.h +++ b/components/soc/esp32p4/include/soc/soc_caps.h @@ -73,6 +73,7 @@ #define SOC_BOD_SUPPORTED 1 #define SOC_APM_SUPPORTED 1 #define SOC_PMU_SUPPORTED 1 +#define SOC_PMU_PVT_SUPPORTED 1 #define SOC_DCDC_SUPPORTED 1 #define SOC_PAU_SUPPORTED 1 //TODO: IDF-7531 #define SOC_LP_TIMER_SUPPORTED 1 diff --git a/components/soc/esp32p4/include/soc/system_periph_retention.h b/components/soc/esp32p4/include/soc/system_periph_retention.h index 56b867e487d..f8bf6ac45c7 100644 --- a/components/soc/esp32p4/include/soc/system_periph_retention.h +++ b/components/soc/esp32p4/include/soc/system_periph_retention.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -95,6 +95,16 @@ extern const regdma_entries_config_t systimer_regs_retention[SYSTIMER_RETENTION_ #define PAU_RETENTION_LINK_LEN 1 extern const regdma_entries_config_t pau_regs_retention[PAU_RETENTION_LINK_LEN]; +/** + * @brief Provide access to pvt configuration registers retention + * context definition. + * + * This is an internal function of the sleep retention driver, and is not + * useful for external use. + */ +#define PVT_RETENTION_LINK_LEN 1 +extern const regdma_entries_config_t pvt_regs_retention[PVT_RETENTION_LINK_LEN]; + #ifdef __cplusplus } #endif diff --git a/components/soc/esp32p4/register/soc/pvt_reg.h b/components/soc/esp32p4/register/soc/pvt_reg.h index 1e3e333dc14..71a97569f1a 100644 --- a/components/soc/esp32p4/register/soc/pvt_reg.h +++ b/components/soc/esp32p4/register/soc/pvt_reg.h @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -363,10 +363,12 @@ extern "C" { /** PVT_DBIAS_CMD0 : R/W; bitpos: [16:0]; default: 0; * needs field desc */ -#define PVT_DBIAS_CMD0 0x0001FFFFU -#define PVT_DBIAS_CMD0_M (PVT_DBIAS_CMD0_V << PVT_DBIAS_CMD0_S) -#define PVT_DBIAS_CMD0_V 0x0001FFFFU -#define PVT_DBIAS_CMD0_S 0 +#define PVT_DBIAS_CMD0_OFFSET_FLAG 1 +#define PVT_DBIAS_CMD0_OFFSET_FLAG_S 16 +#define PVT_DBIAS_CMD0_OFFSET_VALUE 0x1F +#define PVT_DBIAS_CMD0_OFFSET_VALUE_S 11 +#define PVT_DBIAS_CMD0_PVT 0x7FF +#define PVT_DBIAS_CMD0_PVT_S 0 /** PVT_DBIAS_CMD1_REG register * needs desc @@ -375,10 +377,12 @@ extern "C" { /** PVT_DBIAS_CMD1 : R/W; bitpos: [16:0]; default: 0; * needs field desc */ -#define PVT_DBIAS_CMD1 0x0001FFFFU -#define PVT_DBIAS_CMD1_M (PVT_DBIAS_CMD1_V << PVT_DBIAS_CMD1_S) -#define PVT_DBIAS_CMD1_V 0x0001FFFFU -#define PVT_DBIAS_CMD1_S 0 +#define PVT_DBIAS_CMD1_OFFSET_FLAG 1 +#define PVT_DBIAS_CMD1_OFFSET_FLAG_S 16 +#define PVT_DBIAS_CMD1_OFFSET_VALUE 0x1F +#define PVT_DBIAS_CMD1_OFFSET_VALUE_S 11 +#define PVT_DBIAS_CMD1_PVT 0x7FF +#define PVT_DBIAS_CMD1_PVT_S 0 /** PVT_DBIAS_CMD2_REG register * needs desc @@ -387,10 +391,12 @@ extern "C" { /** PVT_DBIAS_CMD2 : R/W; bitpos: [16:0]; default: 0; * needs field desc */ -#define PVT_DBIAS_CMD2 0x0001FFFFU -#define PVT_DBIAS_CMD2_M (PVT_DBIAS_CMD2_V << PVT_DBIAS_CMD2_S) -#define PVT_DBIAS_CMD2_V 0x0001FFFFU -#define PVT_DBIAS_CMD2_S 0 +#define PVT_DBIAS_CMD2_OFFSET_FLAG 1 +#define PVT_DBIAS_CMD2_OFFSET_FLAG_S 16 +#define PVT_DBIAS_CMD2_OFFSET_VALUE 0x1F +#define PVT_DBIAS_CMD2_OFFSET_VALUE_S 11 +#define PVT_DBIAS_CMD2_PVT 0x7FF +#define PVT_DBIAS_CMD2_PVT_S 0 /** PVT_DBIAS_CMD3_REG register * needs desc diff --git a/components/soc/esp32p4/register/soc/pvt_struct.h b/components/soc/esp32p4/register/soc/pvt_struct.h index ebde6a6427a..c02f5d5ca1f 100644 --- a/components/soc/esp32p4/register/soc/pvt_struct.h +++ b/components/soc/esp32p4/register/soc/pvt_struct.h @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -347,10 +347,18 @@ typedef union { */ typedef union { struct { - /** dbias_cmd0 : R/W; bitpos: [16:0]; default: 0; + /** dbias_cmd0 : R/W; bitpos: [10:0]; default: 0; * needs field desc */ - uint32_t dbias_cmd0:17; + uint32_t dbias_cmd0_pvt:11; + /** dbias_cmd0_offset_value : R/W; bitpos: [15:11]; default: 0; + * needs field desc + */ + uint32_t dbias_cmd0_offset_value:5; + /** dbias_cmd0_offset_flag : R/W; bitpos: [16]; default: 0; + * needs field desc + */ + uint32_t dbias_cmd0_offset_flag:1; uint32_t reserved_17:15; }; uint32_t val; @@ -361,10 +369,18 @@ typedef union { */ typedef union { struct { - /** dbias_cmd1 : R/W; bitpos: [16:0]; default: 0; + /** dbias_cmd1 : R/W; bitpos: [10:0]; default: 0; * needs field desc */ - uint32_t dbias_cmd1:17; + uint32_t dbias_cmd1_pvt:11; + /** dbias_cmd1_offset_value : R/W; bitpos: [15:11]; default: 0; + * needs field desc + */ + uint32_t dbias_cmd1_offset_value:5; + /** dbias_cmd1_offset_flag : R/W; bitpos: [16]; default: 0; + * needs field desc + */ + uint32_t dbias_cmd1_offset_flag:1; uint32_t reserved_17:15; }; uint32_t val; @@ -375,10 +391,18 @@ typedef union { */ typedef union { struct { - /** dbias_cmd2 : R/W; bitpos: [16:0]; default: 0; + /** dbias_cmd2 : R/W; bitpos: [10:0]; default: 0; * needs field desc */ - uint32_t dbias_cmd2:17; + uint32_t dbias_cmd2_pvt:11; + /** dbias_cmd2_offset_value : R/W; bitpos: [15:11]; default: 0; + * needs field desc + */ + uint32_t dbias_cmd2_offset_value:5; + /** dbias_cmd2_offset_flag : R/W; bitpos: [16]; default: 0; + * needs field desc + */ + uint32_t dbias_cmd2_offset_flag:1; uint32_t reserved_17:15; }; uint32_t val; diff --git a/components/soc/esp32p4/system_retention_periph.c b/components/soc/esp32p4/system_retention_periph.c index aba798db31a..bdb57a92d41 100644 --- a/components/soc/esp32p4/system_retention_periph.c +++ b/components/soc/esp32p4/system_retention_periph.c @@ -23,6 +23,7 @@ #include "soc/timer_periph.h" #include "soc/uart_reg.h" #include "esp32p4/rom/cache.h" +#include "soc/pvt_reg.h" /* Interrupt Matrix Registers Context */ #define N_REGS_INTR_CORE0() (((INTERRUPT_CORE0_CLOCK_GATE_REG - DR_REG_INTERRUPT_CORE0_BASE) / 4) + 1) @@ -202,3 +203,10 @@ const regdma_entries_config_t pau_regs_retention[] = { [0] = { .config = REGDMA_LINK_CONTINUOUS_INIT(REGDMA_PAU_LINK(0x0), DR_REG_PAU_BASE, DR_REG_PAU_BASE, N_REGS_PAU(), 0, 0), .owner = ENTRY(0) }, /* pau */ }; _Static_assert(ARRAY_SIZE(pau_regs_retention) == HP_SYSTEM_RETENTION_LINK_LEN, "Inconsistent PAU retention link length definitions"); + +/* PVT Registers Context */ +#define N_REGS_PVT (((PVT_COMB_PD_SITE3_UNIT0_VT1_CONF2_REG - DR_REG_PVT_MONITOR_BASE) / 4) + 1) +const regdma_entries_config_t pvt_regs_retention[] = { + [0] = { .config = REGDMA_LINK_CONTINUOUS_INIT(REGDMA_PVT_LINK(0x00), DR_REG_PVT_MONITOR_BASE, DR_REG_PVT_MONITOR_BASE, N_REGS_PVT, 0, 0), .owner = ENTRY(0) | ENTRY(2) }, +}; +_Static_assert(ARRAY_SIZE(pvt_regs_retention) == PVT_RETENTION_LINK_LEN, "Inconsistent PVT retention link length definitions"); diff --git a/components/soc/include/soc/regdma.h b/components/soc/include/soc/regdma.h index 618ed9ea13e..60c94b65df5 100644 --- a/components/soc/include/soc/regdma.h +++ b/components/soc/include/soc/regdma.h @@ -34,6 +34,7 @@ extern "C" { #define REGDMA_MODEMSYSCON_LINK(_pri) ((0x02 << 8) | _pri) #define REGDMA_MODEMLPCON_LINK(_pri) ((0x03 << 8) | _pri) #define REGDMA_PAU_LINK(_pri) ((0x04 << 8) | _pri) +#define REGDMA_PVT_LINK(_pri) ((0x05 << 8) | _pri) #define REGDMA_CACHE_LINK(_pri) ((0x0c << 8) | _pri) #define REGDMA_INTMTX_LINK(_pri) ((0x0d << 8) | _pri) @@ -63,6 +64,7 @@ extern "C" { #define REGDMA_LEDC_LINK(_pri) ((0x24 << 8) | _pri) #define REGDMA_PCNT_LINK(_pri) ((0x25 << 8) | _pri) #define REGDMA_MCPWM_LINK(_pri) ((0x26 << 8) | _pri) + #define REGDMA_MODEM_FE_LINK(_pri) ((0xFF << 8) | _pri) #define REGDMA_LINK_PRI_SYS_CLK REGDMA_LINK_PRI_0 From d7b3e3b9784a2492d7c04d2dc6b9018dcae6ea84 Mon Sep 17 00:00:00 2001 From: "hrushikesh.bhosale" Date: Mon, 23 Jun 2025 15:11:44 +0530 Subject: [PATCH 091/213] feat(mbedtls): Add configuration to control dynamic buffer strategy in mbedtls Problem: 1. In low-memory scenarios, the dynamic buffer feature can fail due to memory fragmentation. 2. It requires a contiguous 16KB heap chunk, but continuous allocation and deallocation of the RX buffer can lead to fragmentation. 3. If another component allocates memory between these operations, it can break up the available 16KB block, causing allocation failure. Solution: 1. Introduce configurable strategy for using dynamic buffers in TLS connections. 2. For example, convert RX buffers to static after the TLS handshake. 3. Allow users to select the strategy via a new field in the esp_http_client_cfg_t structure. 4. The strategy can be controlled independently for each TLS session. --- components/esp-tls/esp_tls.h | 27 +++++++---- components/esp-tls/esp_tls_mbedtls.c | 15 +++++- .../esp-tls/private_include/esp_tls_private.h | 4 ++ components/esp_http_client/esp_http_client.c | 10 ++++ .../esp_http_client/include/esp_http_client.h | 11 ++++- .../port/dynamic/esp_mbedtls_dynamic_impl.c | 48 ++++++++++++++++++- .../port/dynamic/esp_mbedtls_dynamic_impl.h | 7 ++- .../include/mbedtls/esp_mbedtls_dynamic.h | 28 +++++++++++ .../tcp_transport/include/esp_transport_ssl.h | 11 ++++- components/tcp_transport/transport_ssl.c | 10 +++- .../simple_ota_example/main/Kconfig.projbuild | 9 ++++ .../main/simple_ota_example.c | 6 +++ .../simple_ota_example/pytest_simple_ota.py | 42 +++++++++++++++- .../sdkconfig.ci.tls1_2_dynamic | 15 ++++++ 14 files changed, 227 insertions(+), 16 deletions(-) create mode 100644 components/mbedtls/port/include/mbedtls/esp_mbedtls_dynamic.h create mode 100644 examples/system/ota/simple_ota_example/sdkconfig.ci.tls1_2_dynamic diff --git a/components/esp-tls/esp_tls.h b/components/esp-tls/esp_tls.h index b4a90b8f4c5..a5ea2b354f9 100644 --- a/components/esp-tls/esp_tls.h +++ b/components/esp-tls/esp_tls.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2017-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2017-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -91,6 +91,12 @@ typedef enum { ESP_TLS_VER_TLS_MAX, /* to indicate max */ } esp_tls_proto_ver_t; +typedef enum { + ESP_TLS_DYN_BUF_RX_STATIC = 1, /*!< Strategy to disable dynamic RX buffer allocations and convert to static allocation post-handshake, reducing memory fragmentation */ + ESP_TLS_DYN_BUF_STRATEGY_MAX, /*!< to indicate max */ +} esp_tls_dyn_buf_strategy_t; + + /** * @brief ESP-TLS configuration parameters * @@ -211,6 +217,11 @@ typedef struct esp_tls_cfg { const int *ciphersuites_list; /*!< Pointer to a zero-terminated array of IANA identifiers of TLS ciphersuites. Please check the list validity by esp_tls_get_ciphersuites_list() API */ esp_tls_proto_ver_t tls_version; /*!< TLS protocol version of the connection, e.g., TLS 1.2, TLS 1.3 (default - no preference) */ + +#if CONFIG_MBEDTLS_DYNAMIC_BUFFER + esp_tls_dyn_buf_strategy_t esp_tls_dyn_buf_strategy; /*!< ESP-TLS dynamic buffer strategy */ +#endif + } esp_tls_cfg_t; #if defined(CONFIG_ESP_TLS_SERVER_SESSION_TICKETS) @@ -464,7 +475,7 @@ int esp_tls_conn_http_new_async(const char *url, const esp_tls_cfg_t *cfg, esp_t * - >=0 if write operation was successful, the return value is the number * of bytes actually written to the TLS/SSL connection. * - <0 if write operation was not successful, because either an - * error occured or an action must be taken by the calling process. + * error occurred or an action must be taken by the calling process. * - ESP_TLS_ERR_SSL_WANT_READ/ * ESP_TLS_ERR_SSL_WANT_WRITE. * if the handshake is incomplete and waiting for data to be available for reading. @@ -485,7 +496,7 @@ ssize_t esp_tls_conn_write(esp_tls_t *tls, const void *data, size_t datalen); * - 0 if read operation was not successful. The underlying * connection was closed. * - <0 if read operation was not successful, because either an - * error occured or an action must be taken by the calling process. + * error occurred or an action must be taken by the calling process. */ ssize_t esp_tls_conn_read(esp_tls_t *tls, void *data, size_t datalen); @@ -537,7 +548,7 @@ esp_err_t esp_tls_get_conn_sockfd(esp_tls_t *tls, int *sockfd); * * @param[in] sockfd sockfd value to set. * - * @return - ESP_OK on success and value of sockfd for the tls connection shall updated withthe provided value + * @return - ESP_OK on success and value of sockfd for the tls connection shall updated with the provided value * - ESP_ERR_INVALID_ARG if (tls == NULL || sockfd < 0) */ esp_err_t esp_tls_set_conn_sockfd(esp_tls_t *tls, int sockfd); @@ -549,7 +560,7 @@ esp_err_t esp_tls_set_conn_sockfd(esp_tls_t *tls, int sockfd); * * @param[out] conn_state pointer to the connection state value. * - * @return - ESP_OK on success and value of sockfd for the tls connection shall updated withthe provided value + * @return - ESP_OK on success and value of sockfd for the tls connection shall updated with the provided value * - ESP_ERR_INVALID_ARG (Invalid arguments) */ esp_err_t esp_tls_get_conn_state(esp_tls_t *tls, esp_tls_conn_state_t *conn_state); @@ -561,7 +572,7 @@ esp_err_t esp_tls_get_conn_state(esp_tls_t *tls, esp_tls_conn_state_t *conn_stat * * @param[in] conn_state connection state value to set. * - * @return - ESP_OK on success and value of sockfd for the tls connection shall updated withthe provided value + * @return - ESP_OK on success and value of sockfd for the tls connection shall updated with the provided value * - ESP_ERR_INVALID_ARG (Invalid arguments) */ esp_err_t esp_tls_set_conn_state(esp_tls_t *tls, esp_tls_conn_state_t conn_state); @@ -586,7 +597,7 @@ void *esp_tls_get_ssl_context(esp_tls_t *tls); * * @return * - ESP_OK if creating global CA store was successful. - * - ESP_ERR_NO_MEM if an error occured when allocating the mbedTLS resources. + * - ESP_ERR_NO_MEM if an error occurred when allocating the mbedTLS resources. */ esp_err_t esp_tls_init_global_ca_store(void); @@ -605,7 +616,7 @@ esp_err_t esp_tls_init_global_ca_store(void); * * @return * - ESP_OK if adding certificates was successful. - * - Other if an error occured or an action must be taken by the calling process. + * - Other if an error occurred or an action must be taken by the calling process. */ esp_err_t esp_tls_set_global_ca_store(const unsigned char *cacert_pem_buf, const unsigned int cacert_pem_bytes); diff --git a/components/esp-tls/esp_tls_mbedtls.c b/components/esp-tls/esp_tls_mbedtls.c index e8e39cb3403..9f240741e0f 100644 --- a/components/esp-tls/esp_tls_mbedtls.c +++ b/components/esp-tls/esp_tls_mbedtls.c @@ -19,7 +19,7 @@ #include #include "esp_log.h" #include "esp_check.h" - +#include "mbedtls/esp_mbedtls_dynamic.h" #ifdef CONFIG_MBEDTLS_HARDWARE_ECDSA_SIGN #include "ecdsa/ecdsa_alt.h" #endif @@ -114,6 +114,10 @@ esp_err_t esp_create_mbedtls_handle(const char *hostname, size_t hostlen, const mbedtls_ssl_conf_rng(&tls->conf, mbedtls_ctr_drbg_random, &tls->ctr_drbg); +#if CONFIG_MBEDTLS_DYNAMIC_BUFFER + tls->esp_tls_dyn_buf_strategy = ((esp_tls_cfg_t *)cfg)->esp_tls_dyn_buf_strategy; +#endif + if (tls->role == ESP_TLS_CLIENT) { esp_ret = set_client_config(hostname, hostlen, (esp_tls_cfg_t *)cfg, tls); if (esp_ret != ESP_OK) { @@ -229,6 +233,15 @@ int esp_mbedtls_handshake(esp_tls_t *tls, const esp_tls_cfg_t *cfg) #endif ret = mbedtls_ssl_handshake(&tls->ssl); if (ret == 0) { +#if CONFIG_MBEDTLS_DYNAMIC_BUFFER + if (tls->esp_tls_dyn_buf_strategy != 0) { + ret = esp_mbedtls_dynamic_set_rx_buf_static(&tls->ssl); + if (ret != 0) { + ESP_LOGE(TAG, "esp_mbedtls_dynamic_set_rx_buf_static returned -0x%04X", -ret); + return ret; + } + } +#endif tls->conn_state = ESP_TLS_DONE; #ifdef CONFIG_ESP_TLS_USE_DS_PERIPHERAL diff --git a/components/esp-tls/private_include/esp_tls_private.h b/components/esp-tls/private_include/esp_tls_private.h index 4341557aaf9..f42aa30f6e1 100644 --- a/components/esp-tls/private_include/esp_tls_private.h +++ b/components/esp-tls/private_include/esp_tls_private.h @@ -94,6 +94,10 @@ struct esp_tls { esp_tls_error_handle_t error_handle; /*!< handle to error descriptor */ +#if CONFIG_MBEDTLS_DYNAMIC_BUFFER + esp_tls_dyn_buf_strategy_t esp_tls_dyn_buf_strategy; /*!< ESP-TLS dynamic buffer strategy */ +#endif + }; // Function pointer for the server configuration API diff --git a/components/esp_http_client/esp_http_client.c b/components/esp_http_client/esp_http_client.c index 95ccc0ac66d..9929d8bfdfe 100644 --- a/components/esp_http_client/esp_http_client.c +++ b/components/esp_http_client/esp_http_client.c @@ -34,6 +34,8 @@ static const char *TAG = "HTTP_CLIENT"; ESP_STATIC_ASSERT((int)ESP_HTTP_CLIENT_TLS_VER_ANY == (int)ESP_TLS_VER_ANY, "Enum mismatch in esp_http_client and esp-tls"); ESP_STATIC_ASSERT((int)ESP_HTTP_CLIENT_TLS_VER_MAX <= (int)ESP_TLS_VER_TLS_MAX, "HTTP client supported TLS is not supported in esp-tls"); +ESP_STATIC_ASSERT((int)HTTP_TLS_DYN_BUF_RX_STATIC == (int)ESP_TLS_DYN_BUF_RX_STATIC, "Enum mismatch in esp_http_client and esp-tls"); +ESP_STATIC_ASSERT((int)HTTP_TLS_DYN_BUF_STRATEGY_MAX <= (int)ESP_TLS_DYN_BUF_STRATEGY_MAX, "HTTP client supported TLS is not supported in esp-tls"); #if CONFIG_ESP_HTTP_CLIENT_EVENT_POST_TIMEOUT == -1 #define ESP_HTTP_CLIENT_EVENT_POST_TIMEOUT portMAX_DELAY @@ -794,6 +796,14 @@ esp_http_client_handle_t esp_http_client_init(const esp_http_client_config_t *co } esp_transport_ssl_set_tls_version(ssl, config->tls_version); +#if CONFIG_MBEDTLS_DYNAMIC_BUFFER + /* When tls_dyn_buf_strategy is 0, mbedTLS dynamic buffer allocation uses default behavior. + * No need to call esp_transport_ssl_set_esp_tls_dyn_buf_strategy() in this case */ + if (config->tls_dyn_buf_strategy != 0 && config->tls_dyn_buf_strategy < HTTP_TLS_DYN_BUF_STRATEGY_MAX) { + esp_transport_ssl_set_esp_tls_dyn_buf_strategy(ssl, config->tls_dyn_buf_strategy); + } +#endif + #if CONFIG_ESP_TLS_USE_SECURE_ELEMENT if (config->use_secure_element) { esp_transport_ssl_use_secure_element(ssl); diff --git a/components/esp_http_client/include/esp_http_client.h b/components/esp_http_client/include/esp_http_client.h index c7b7a1b08e5..7a127fb3157 100644 --- a/components/esp_http_client/include/esp_http_client.h +++ b/components/esp_http_client/include/esp_http_client.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -138,6 +138,11 @@ typedef enum { HTTP_ADDR_TYPE_INET6 = AF_INET6, /**< IPv6 address family. */ } esp_http_client_addr_type_t; +typedef enum { + HTTP_TLS_DYN_BUF_RX_STATIC = 1, /*!< Strategy to disable dynamic RX buffer allocations and convert to static allocation post-handshake, reducing memory fragmentation */ + HTTP_TLS_DYN_BUF_STRATEGY_MAX, /*!< to indicate max */ +} esp_http_client_tls_dyn_buf_strategy_t; + /** * @brief HTTP configuration */ @@ -200,6 +205,10 @@ typedef struct { struct esp_transport_item_t *transport; #endif esp_http_client_addr_type_t addr_type; /*!< Address type used in http client configurations */ + +#if CONFIG_MBEDTLS_DYNAMIC_BUFFER + esp_http_client_tls_dyn_buf_strategy_t tls_dyn_buf_strategy; /*!< TLS dynamic buffer strategy */ +#endif } esp_http_client_config_t; /** diff --git a/components/mbedtls/port/dynamic/esp_mbedtls_dynamic_impl.c b/components/mbedtls/port/dynamic/esp_mbedtls_dynamic_impl.c index d76f6b5049c..d3169d47584 100644 --- a/components/mbedtls/port/dynamic/esp_mbedtls_dynamic_impl.c +++ b/components/mbedtls/port/dynamic/esp_mbedtls_dynamic_impl.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2020-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2020-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -18,6 +18,17 @@ #define TX_IDLE_BUFFER_SIZE (MBEDTLS_SSL_HEADER_LEN + CACHE_BUFFER_SIZE) +#define ESP_MBEDTLS_RETURN_IF_RX_BUF_STATIC(ssl) \ + do { \ + if (ssl->MBEDTLS_PRIVATE(in_buf)) { \ + esp_mbedtls_ssl_buf_states state = esp_mbedtls_get_buf_state(ssl->MBEDTLS_PRIVATE(in_buf)); \ + if (state == ESP_MBEDTLS_SSL_BUF_STATIC) { \ + return 0; \ + } \ + } \ + } while(0) + + static const char *TAG = "Dynamic Impl"; static void esp_mbedtls_set_buf_state(unsigned char *buf, esp_mbedtls_ssl_buf_states state) @@ -140,6 +151,29 @@ static void init_rx_buffer(mbedtls_ssl_context *ssl, unsigned char *buf) ssl->MBEDTLS_PRIVATE(in_left) = 0; } +esp_err_t esp_mbedtls_dynamic_set_rx_buf_static(mbedtls_ssl_context *ssl) +{ + unsigned char cache_buf[16]; + memcpy(cache_buf, ssl->MBEDTLS_PRIVATE(in_buf), 16); + esp_mbedtls_reset_free_rx_buffer(ssl); + + struct esp_mbedtls_ssl_buf *esp_buf; + int buffer_len = tx_buffer_len(ssl, MBEDTLS_SSL_IN_BUFFER_LEN); + esp_buf = mbedtls_calloc(1, SSL_BUF_HEAD_OFFSET_SIZE + buffer_len); + if (!esp_buf) { + ESP_LOGE(TAG, "rx buf alloc(%d bytes) failed", SSL_BUF_HEAD_OFFSET_SIZE + buffer_len); + return ESP_ERR_NO_MEM; + } + esp_mbedtls_init_ssl_buf(esp_buf, buffer_len); + init_rx_buffer(ssl, esp_buf->buf); + + memcpy(ssl->MBEDTLS_PRIVATE(in_ctr), cache_buf, 8); + memcpy(ssl->MBEDTLS_PRIVATE(in_iv), cache_buf + 8, 8); + esp_mbedtls_set_buf_state(ssl->MBEDTLS_PRIVATE(in_buf), ESP_MBEDTLS_SSL_BUF_STATIC); + return ESP_OK; + +} + static int esp_mbedtls_alloc_tx_buf(mbedtls_ssl_context *ssl, int len) { struct esp_mbedtls_ssl_buf *esp_buf; @@ -324,6 +358,12 @@ exit: int esp_mbedtls_add_rx_buffer(mbedtls_ssl_context *ssl) { + /* + * If RX buffer is set to static mode, this macro will return early + * and skip dynamic buffer allocation logic below + */ + ESP_MBEDTLS_RETURN_IF_RX_BUF_STATIC(ssl); + int cached = 0; int ret = 0; int buffer_len; @@ -403,6 +443,12 @@ exit: int esp_mbedtls_free_rx_buffer(mbedtls_ssl_context *ssl) { + /* + * If RX buffer is set to static mode, this macro will return early + * and skip dynamic buffer free logic below + */ + ESP_MBEDTLS_RETURN_IF_RX_BUF_STATIC(ssl); + int ret = 0; unsigned char buf[16]; struct esp_mbedtls_ssl_buf *esp_buf; diff --git a/components/mbedtls/port/dynamic/esp_mbedtls_dynamic_impl.h b/components/mbedtls/port/dynamic/esp_mbedtls_dynamic_impl.h index ad7a716be58..54409766f53 100644 --- a/components/mbedtls/port/dynamic/esp_mbedtls_dynamic_impl.h +++ b/components/mbedtls/port/dynamic/esp_mbedtls_dynamic_impl.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2020-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -26,6 +26,8 @@ #include "esp_log.h" #include "sdkconfig.h" +#include "mbedtls/esp_mbedtls_dynamic.h" + #define TRACE_CHECK(_fn, _state) \ ({ \ ESP_LOGV(TAG, "%d " _state " to do \"%s\"", __LINE__, # _fn); \ @@ -48,8 +50,9 @@ }) typedef enum { - ESP_MBEDTLS_SSL_BUF_CACHED, + ESP_MBEDTLS_SSL_BUF_CACHED = 0, ESP_MBEDTLS_SSL_BUF_NO_CACHED, + ESP_MBEDTLS_SSL_BUF_STATIC, } esp_mbedtls_ssl_buf_states; struct esp_mbedtls_ssl_buf { diff --git a/components/mbedtls/port/include/mbedtls/esp_mbedtls_dynamic.h b/components/mbedtls/port/include/mbedtls/esp_mbedtls_dynamic.h new file mode 100644 index 00000000000..2c00be33c77 --- /dev/null +++ b/components/mbedtls/port/include/mbedtls/esp_mbedtls_dynamic.h @@ -0,0 +1,28 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include "mbedtls/ssl.h" +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Set the dynamic buffer rx statically after the handshake. This is to avoid frequent allocation and deallocation of dynamic buffer. + * + * @param ssl mbedtls ssl context + * @return esp_err_t + * - ESP_OK: Successfully set the rx buffer to static + * - ESP_ERR_NO_MEM: Failed to allocate memory for the rx buffer + */ +esp_err_t esp_mbedtls_dynamic_set_rx_buf_static(mbedtls_ssl_context *ssl); + +#ifdef __cplusplus +} +#endif diff --git a/components/tcp_transport/include/esp_transport_ssl.h b/components/tcp_transport/include/esp_transport_ssl.h index ad339396ffc..32020d5ce20 100644 --- a/components/tcp_transport/include/esp_transport_ssl.h +++ b/components/tcp_transport/include/esp_transport_ssl.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -61,6 +61,15 @@ void esp_transport_ssl_crt_bundle_attach(esp_transport_handle_t t, esp_err_t ((* */ void esp_transport_ssl_enable_global_ca_store(esp_transport_handle_t t); +#if CONFIG_MBEDTLS_DYNAMIC_BUFFER +/** + * @brief Set ESP-TLS dynamic buffer strategy for ESP-TLS connection + * + * @param t ssl transport + * @param[in] strategy ESP-TLS dynamic buffer strategy + */ +void esp_transport_ssl_set_esp_tls_dyn_buf_strategy(esp_transport_handle_t t, esp_tls_dyn_buf_strategy_t strategy); +#endif /** * @brief Set TLS protocol version for ESP-TLS connection * diff --git a/components/tcp_transport/transport_ssl.c b/components/tcp_transport/transport_ssl.c index 00bd8d2fffc..7ee9bc52831 100644 --- a/components/tcp_transport/transport_ssl.c +++ b/components/tcp_transport/transport_ssl.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -362,6 +362,14 @@ void esp_transport_ssl_enable_global_ca_store(esp_transport_handle_t t) ssl->cfg.use_global_ca_store = true; } +#if CONFIG_MBEDTLS_DYNAMIC_BUFFER +void esp_transport_ssl_set_esp_tls_dyn_buf_strategy(esp_transport_handle_t t, esp_tls_dyn_buf_strategy_t strategy) +{ + GET_SSL_FROM_TRANSPORT_OR_RETURN(ssl, t); + ssl->cfg.esp_tls_dyn_buf_strategy = strategy; +} +#endif + void esp_transport_ssl_set_tls_version(esp_transport_handle_t t, esp_tls_proto_ver_t tls_version) { GET_SSL_FROM_TRANSPORT_OR_RETURN(ssl, t); diff --git a/examples/system/ota/simple_ota_example/main/Kconfig.projbuild b/examples/system/ota/simple_ota_example/main/Kconfig.projbuild index 491d78429cf..4404a99f44e 100644 --- a/examples/system/ota/simple_ota_example/main/Kconfig.projbuild +++ b/examples/system/ota/simple_ota_example/main/Kconfig.projbuild @@ -51,4 +51,13 @@ menu "Example Configuration" help Select ethernet interface to pass the OTA data. endchoice + + config EXAMPLE_TLS_DYN_BUF_RX_STATIC + bool "Use static rx buffer for dynamic buffer after TLS handshake" + depends on MBEDTLS_DYNAMIC_BUFFER + default n + help + This converts the dynamic RX buffer to static allocation after the TLS handshake + is complete. This reduces memory fragmentation by avoiding repeated dynamic + allocations during data transfer. endmenu diff --git a/examples/system/ota/simple_ota_example/main/simple_ota_example.c b/examples/system/ota/simple_ota_example/main/simple_ota_example.c index e3e8c732cbd..52e1bac6bbe 100644 --- a/examples/system/ota/simple_ota_example/main/simple_ota_example.c +++ b/examples/system/ota/simple_ota_example/main/simple_ota_example.c @@ -101,6 +101,12 @@ void simple_ota_example_task(void *pvParameter) #ifdef CONFIG_EXAMPLE_FIRMWARE_UPGRADE_BIND_IF .if_name = &ifr, #endif +#if CONFIG_EXAMPLE_TLS_DYN_BUF_RX_STATIC + /* This part applies static buffer strategy for rx dynamic buffer. + * This is to avoid frequent allocation and deallocation of dynamic buffer. + */ + .tls_dyn_buf_strategy = HTTP_TLS_DYN_BUF_RX_STATIC, +#endif /* CONFIG_EXAMPLE_TLS_DYN_BUF_RX_STATIC */ }; #ifdef CONFIG_EXAMPLE_FIRMWARE_UPGRADE_URL_FROM_STDIN diff --git a/examples/system/ota/simple_ota_example/pytest_simple_ota.py b/examples/system/ota/simple_ota_example/pytest_simple_ota.py index 861f2525b68..43b4f50f8ef 100644 --- a/examples/system/ota/simple_ota_example/pytest_simple_ota.py +++ b/examples/system/ota/simple_ota_example/pytest_simple_ota.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Unlicense OR CC0-1.0 import http.server import multiprocessing @@ -365,6 +365,46 @@ def test_examples_protocol_simple_ota_example_tls1_3(dut: Dut) -> None: tls1_3_server.kill() +@pytest.mark.esp32 +@pytest.mark.ethernet_ota +@pytest.mark.parametrize( + 'config', + [ + 'tls1_2_dynamic', + ], + indirect=True, +) +def test_examples_protocol_simple_ota_example_tls1_2_dynamic(dut: Dut) -> None: + """ + steps: | + 1. join AP/Ethernet + 2. Fetch OTA image over HTTPS + 3. Reboot with the new OTA image + """ + sha256_bootloader, sha256_app = calc_all_sha256(dut) + # Start server + thread1 = multiprocessing.Process(target=start_https_server, args=(dut.app.binary_path, '0.0.0.0', 8000)) + thread1.daemon = True + thread1.start() + try: + # start test + dut.expect(f'Loaded app from partition at offset {OTA_0_ADDRESS}', timeout=30) + check_sha256(sha256_bootloader, str(dut.expect(r'SHA-256 for bootloader:\s+([a-f0-9]){64}')[0])) + check_sha256(sha256_app, str(dut.expect(r'SHA-256 for current firmware:\s+([a-f0-9]){64}')[0])) + + host_ip = setting_connection(dut) + + dut.expect('Starting OTA example task', timeout=30) + print(f'writing to device: https://{host_ip}:8000/simple_ota.bin') + dut.write(f'https://{host_ip}:8000/simple_ota.bin') + dut.expect('OTA Succeed, Rebooting...', timeout=120) + # after reboot + dut.expect(f'Loaded app from partition at offset {OTA_1_ADDRESS}', timeout=30) + dut.expect('OTA example app_main start', timeout=10) + finally: + thread1.terminate() + + if __name__ == '__main__': if sys.argv[2:]: # if two or more arguments provided: # Usage: pytest_simple_ota.py [cert_dir] diff --git a/examples/system/ota/simple_ota_example/sdkconfig.ci.tls1_2_dynamic b/examples/system/ota/simple_ota_example/sdkconfig.ci.tls1_2_dynamic new file mode 100644 index 00000000000..e8bc3efeadc --- /dev/null +++ b/examples/system/ota/simple_ota_example/sdkconfig.ci.tls1_2_dynamic @@ -0,0 +1,15 @@ +CONFIG_EXAMPLE_FIRMWARE_UPGRADE_URL="FROM_STDIN" +CONFIG_EXAMPLE_SKIP_COMMON_NAME_CHECK=y +CONFIG_EXAMPLE_CONNECT_ETHERNET=y +CONFIG_EXAMPLE_CONNECT_WIFI=n +CONFIG_EXAMPLE_USE_INTERNAL_ETHERNET=y +CONFIG_EXAMPLE_ETH_PHY_IP101=y +CONFIG_EXAMPLE_ETH_MDC_GPIO=23 +CONFIG_EXAMPLE_ETH_MDIO_GPIO=18 +CONFIG_EXAMPLE_ETH_PHY_RST_GPIO=5 +CONFIG_EXAMPLE_ETH_PHY_ADDR=1 +CONFIG_EXAMPLE_CONNECT_IPV6=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_3=y +CONFIG_MBEDTLS_DYNAMIC_BUFFER=y +CONFIG_EXAMPLE_TLS_DYN_BUF_RX_STATIC=y From 225c404b7c2a847e6c4386ac32416cc0ff890d2c Mon Sep 17 00:00:00 2001 From: Sumeet Singh Date: Fri, 6 Jun 2025 15:22:06 +0530 Subject: [PATCH 092/213] feat(nimble): Added two GATT features: 1. Automatically initiate security if a GATT service request fails 2. Encryption, Authentication, and Authorization requirement on CCCD --- components/bt/host/nimble/Kconfig.in | 9 +++++++++ components/bt/host/nimble/nimble | 2 +- components/bt/host/nimble/port/include/esp_nimble_cfg.h | 8 ++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/components/bt/host/nimble/Kconfig.in b/components/bt/host/nimble/Kconfig.in index 44d6c6ef38a..2243c8892bb 100644 --- a/components/bt/host/nimble/Kconfig.in +++ b/components/bt/host/nimble/Kconfig.in @@ -1232,6 +1232,15 @@ config BT_NIMBLE_GATTC_PROC_PREEMPTION_PROTECT can disrupt the GATT context,causing the service discovery callback to not be invoked. A temporary list is maintained to preserve the GATT context and use it in case of preemption. +config BT_NIMBLE_GATTC_AUTO_PAIR + bool "Automatically pair upon receiving service request failure" + depends on BT_NIMBLE_ENABLED + default n + help + If enabled, when a service request (e.g. read, write) to a server fails, and the ATT + error suggests insufficient security, then the central will initiate pairing and retry + the service request. + menu "Host-controller Transport" config BT_NIMBLE_TRANSPORT_UART bool "Enable Uart Transport" diff --git a/components/bt/host/nimble/nimble b/components/bt/host/nimble/nimble index cc3ac5416b4..84e02a6b820 160000 --- a/components/bt/host/nimble/nimble +++ b/components/bt/host/nimble/nimble @@ -1 +1 @@ -Subproject commit cc3ac5416b46e6e9363dae357378c03b4975cfdb +Subproject commit 84e02a6b820734de411ae9bdc8829d8ef6128205 diff --git a/components/bt/host/nimble/port/include/esp_nimble_cfg.h b/components/bt/host/nimble/port/include/esp_nimble_cfg.h index 6c80ae750c8..2d4879153f8 100644 --- a/components/bt/host/nimble/port/include/esp_nimble_cfg.h +++ b/components/bt/host/nimble/port/include/esp_nimble_cfg.h @@ -2010,6 +2010,14 @@ #endif #endif +#ifndef MYNEWT_VAL_BLE_GATTC_AUTO_PAIR +#ifdef CONFIG_BT_NIMBLE_GATTC_AUTO_PAIR +#define MYNEWT_VAL_BLE_GATTC_AUTO_PAIR CONFIG_BT_NIMBLE_GATTC_AUTO_PAIR +#else +#define MYNEWT_VAL_BLE_GATTC_AUTO_PAIR (0) +#endif +#endif + #ifndef MYNEWT_VAL_BLE_HOST_ALLOW_CONNECT_WITH_SCAN #ifdef CONFIG_BT_NIMBLE_HOST_ALLOW_CONNECT_WITH_SCAN #define MYNEWT_VAL_BLE_HOST_ALLOW_CONNECT_WITH_SCAN CONFIG_BT_NIMBLE_HOST_ALLOW_CONNECT_WITH_SCAN From 2355e2f22ddfb9a4f4845c7e6ba42fac8587cc40 Mon Sep 17 00:00:00 2001 From: Rahul Tank Date: Fri, 21 Mar 2025 16:22:24 +0530 Subject: [PATCH 093/213] fix(nimble): Added CI files for various configurations --- examples/bluetooth/nimble/blecent/main/main.c | 15 +++++++++++---- .../bluetooth/nimble/blecent/sdkconfig.ci.central | 10 ++++++++++ .../nimble/blecent/sdkconfig.ci.no_broadcaster | 10 ++++++++++ .../nimble/blecent/sdkconfig.ci.no_peripheral | 10 ++++++++++ .../nimble/blecent/sdkconfig.ci.observer | 11 +++++++++++ examples/bluetooth/nimble/bleprph/main/main.c | 14 +++++++++++++- .../nimble/bleprph/sdkconfig.ci.broadcaster | 11 +++++++++++ .../nimble/bleprph/sdkconfig.ci.no_central | 10 ++++++++++ .../nimble/bleprph/sdkconfig.ci.no_observer | 10 ++++++++++ .../nimble/bleprph/sdkconfig.ci.peripheral | 10 ++++++++++ .../nimble/common/nimble_central_utils/peer.c | 2 ++ 11 files changed, 108 insertions(+), 5 deletions(-) create mode 100644 examples/bluetooth/nimble/blecent/sdkconfig.ci.central create mode 100644 examples/bluetooth/nimble/blecent/sdkconfig.ci.no_broadcaster create mode 100644 examples/bluetooth/nimble/blecent/sdkconfig.ci.no_peripheral create mode 100644 examples/bluetooth/nimble/blecent/sdkconfig.ci.observer create mode 100644 examples/bluetooth/nimble/bleprph/sdkconfig.ci.broadcaster create mode 100644 examples/bluetooth/nimble/bleprph/sdkconfig.ci.no_central create mode 100644 examples/bluetooth/nimble/bleprph/sdkconfig.ci.no_observer create mode 100644 examples/bluetooth/nimble/bleprph/sdkconfig.ci.peripheral diff --git a/examples/bluetooth/nimble/blecent/main/main.c b/examples/bluetooth/nimble/blecent/main/main.c index d2254d9239b..d0b0c65e28b 100644 --- a/examples/bluetooth/nimble/blecent/main/main.c +++ b/examples/bluetooth/nimble/blecent/main/main.c @@ -709,7 +709,9 @@ static void blecent_power_control(uint16_t conn_handle) static int blecent_gap_event(struct ble_gap_event *event, void *arg) { +#if NIMBLE_BLE_CONNECT struct ble_gap_conn_desc desc; +#endif struct ble_hs_adv_fields fields; #if MYNEWT_VAL(BLE_HCI_VS) #if MYNEWT_VAL(BLE_POWER_CONTROL) @@ -732,7 +734,7 @@ blecent_gap_event(struct ble_gap_event *event, void *arg) /* Try to connect to the advertiser if it looks interesting. */ blecent_connect_if_interesting(&event->disc); return 0; - +#if NIMBLE_BLE_CONNECT case BLE_GAP_EVENT_CONNECT: /* A new connection was established or a connection attempt failed. */ if (event->connect.status == 0) { @@ -966,6 +968,8 @@ blecent_gap_event(struct ble_gap_event *event, void *arg) #endif #endif return 0; + +#endif default: return 0; } @@ -1041,7 +1045,6 @@ static void stack_init_deinit(void) void app_main(void) { - int rc; /* Initialize NVS — it is used to store PHY calibration data */ esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { @@ -1061,6 +1064,8 @@ app_main(void) ble_hs_cfg.sync_cb = blecent_on_sync; ble_hs_cfg.store_status_cb = ble_store_util_status_rr; +#if NIMBLE_BLE_CONNECT + int rc; /* Initialize data structures to track connected peers. */ #if MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES) rc = peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64, 64); @@ -1069,11 +1074,13 @@ app_main(void) rc = peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64); assert(rc == 0); #endif +#endif #if CONFIG_BT_NIMBLE_GAP_SERVICE + int m; /* Set the default device name. */ - rc = ble_svc_gap_device_name_set("nimble-blecent"); - assert(rc == 0); + m = ble_svc_gap_device_name_set("nimble-blecent"); + assert(m == 0); #endif /* XXX Need to have template for store */ diff --git a/examples/bluetooth/nimble/blecent/sdkconfig.ci.central b/examples/bluetooth/nimble/blecent/sdkconfig.ci.central new file mode 100644 index 00000000000..ed14605bc25 --- /dev/null +++ b/examples/bluetooth/nimble/blecent/sdkconfig.ci.central @@ -0,0 +1,10 @@ +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_BT_NIMBLE_ROLE_CENTRAL=y +CONFIG_BT_NIMBLE_ROLE_BROADCASTER=n +CONFIG_BT_NIMBLE_ROLE_OBSERVER=n +CONFIG_BT_NIMBLE_ROLE_PERIPHERAL=n diff --git a/examples/bluetooth/nimble/blecent/sdkconfig.ci.no_broadcaster b/examples/bluetooth/nimble/blecent/sdkconfig.ci.no_broadcaster new file mode 100644 index 00000000000..f78a87edcf7 --- /dev/null +++ b/examples/bluetooth/nimble/blecent/sdkconfig.ci.no_broadcaster @@ -0,0 +1,10 @@ +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_BT_NIMBLE_ROLE_CENTRAL=y +CONFIG_BT_NIMBLE_ROLE_BROADCASTER=n +CONFIG_BT_NIMBLE_ROLE_OBSERVER=y +CONFIG_BT_NIMBLE_ROLE_PERIPHERAL=y diff --git a/examples/bluetooth/nimble/blecent/sdkconfig.ci.no_peripheral b/examples/bluetooth/nimble/blecent/sdkconfig.ci.no_peripheral new file mode 100644 index 00000000000..6fb03c183cc --- /dev/null +++ b/examples/bluetooth/nimble/blecent/sdkconfig.ci.no_peripheral @@ -0,0 +1,10 @@ +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_BT_NIMBLE_ROLE_CENTRAL=y +CONFIG_BT_NIMBLE_ROLE_BROADCASTER=y +CONFIG_BT_NIMBLE_ROLE_OBSERVER=y +CONFIG_BT_NIMBLE_ROLE_PERIPHERAL=n diff --git a/examples/bluetooth/nimble/blecent/sdkconfig.ci.observer b/examples/bluetooth/nimble/blecent/sdkconfig.ci.observer new file mode 100644 index 00000000000..618e1ece537 --- /dev/null +++ b/examples/bluetooth/nimble/blecent/sdkconfig.ci.observer @@ -0,0 +1,11 @@ +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_BT_NIMBLE_ROLE_CENTRAL=n +CONFIG_BT_NIMBLE_ROLE_BROADCASTER=n +CONFIG_BT_NIMBLE_ROLE_OBSERVER=y +CONFIG_BT_NIMBLE_ROLE_PERIPHERAL=n +CONFIG_BT_NIMBLE_SECURITY_ENABLE=n diff --git a/examples/bluetooth/nimble/bleprph/main/main.c b/examples/bluetooth/nimble/bleprph/main/main.c index 5d01fe9604f..522d7fdac2b 100644 --- a/examples/bluetooth/nimble/bleprph/main/main.c +++ b/examples/bluetooth/nimble/bleprph/main/main.c @@ -52,6 +52,7 @@ static uint16_t bearers; void ble_store_config_init(void); +#if NIMBLE_BLE_CONNECT /** * Logs information about a connection to the console. */ @@ -78,6 +79,7 @@ bleprph_print_conn_desc(struct ble_gap_conn_desc *desc) desc->sec_state.authenticated, desc->sec_state.bonded); } +#endif #if CONFIG_EXAMPLE_EXTENDED_ADV /** @@ -148,7 +150,9 @@ bleprph_advertise(void) { struct ble_gap_adv_params adv_params; struct ble_hs_adv_fields fields; +#if CONFIG_BT_NIMBLE_GAP_SERVICE const char *name; +#endif int rc; /** @@ -175,10 +179,12 @@ bleprph_advertise(void) fields.tx_pwr_lvl_is_present = 1; fields.tx_pwr_lvl = BLE_HS_ADV_TX_PWR_LVL_AUTO; +#if CONFIG_BT_NIMBLE_GAP_SERVICE name = ble_svc_gap_device_name(); fields.name = (uint8_t *)name; fields.name_len = strlen(name); fields.name_is_complete = 1; +#endif fields.uuids16 = (ble_uuid16_t[]) { BLE_UUID16_INIT(GATT_SVR_SVC_ALERT_UUID) @@ -236,10 +242,14 @@ static void bleprph_power_control(uint16_t conn_handle) static int bleprph_gap_event(struct ble_gap_event *event, void *arg) { +#if NIMBLE_BLE_CONNECT struct ble_gap_conn_desc desc; int rc; +#endif switch (event->type) { + +#if NIMBLE_BLE_CONNECT case BLE_GAP_EVENT_CONNECT: /* A new connection was established or a connection attempt failed. */ MODLOG_DFLT(INFO, "connection %s; status=%d ", @@ -463,9 +473,9 @@ bleprph_gap_event(struct ble_gap_event *event, void *arg) event->subrate_change.status, event->subrate_change.subrate_factor); return 0; +#endif #endif } - return 0; } @@ -594,9 +604,11 @@ app_main(void) assert(rc == 0); #endif +#if CONFIG_BT_NIMBLE_GAP_SERVICE /* Set the default device name. */ rc = ble_svc_gap_device_name_set("nimble-bleprph"); assert(rc == 0); +#endif /* XXX Need to have template for store */ ble_store_config_init(); diff --git a/examples/bluetooth/nimble/bleprph/sdkconfig.ci.broadcaster b/examples/bluetooth/nimble/bleprph/sdkconfig.ci.broadcaster new file mode 100644 index 00000000000..a354bd8cbac --- /dev/null +++ b/examples/bluetooth/nimble/bleprph/sdkconfig.ci.broadcaster @@ -0,0 +1,11 @@ +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_BT_NIMBLE_ROLE_CENTRAL=n +CONFIG_BT_NIMBLE_ROLE_BROADCASTER=y +CONFIG_BT_NIMBLE_ROLE_OBSERVER=n +CONFIG_BT_NIMBLE_ROLE_PERIPHERAL=n +CONFIG_BT_NIMBLE_SECURITY_ENABLE=n diff --git a/examples/bluetooth/nimble/bleprph/sdkconfig.ci.no_central b/examples/bluetooth/nimble/bleprph/sdkconfig.ci.no_central new file mode 100644 index 00000000000..fdbdfba3d5a --- /dev/null +++ b/examples/bluetooth/nimble/bleprph/sdkconfig.ci.no_central @@ -0,0 +1,10 @@ +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_BT_NIMBLE_ROLE_CENTRAL=n +CONFIG_BT_NIMBLE_ROLE_BROADCASTER=y +CONFIG_BT_NIMBLE_ROLE_OBSERVER=y +CONFIG_BT_NIMBLE_ROLE_PERIPHERAL=y diff --git a/examples/bluetooth/nimble/bleprph/sdkconfig.ci.no_observer b/examples/bluetooth/nimble/bleprph/sdkconfig.ci.no_observer new file mode 100644 index 00000000000..12c1962b966 --- /dev/null +++ b/examples/bluetooth/nimble/bleprph/sdkconfig.ci.no_observer @@ -0,0 +1,10 @@ +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_BT_NIMBLE_ROLE_CENTRAL=y +CONFIG_BT_NIMBLE_ROLE_BROADCASTER=y +CONFIG_BT_NIMBLE_ROLE_OBSERVER=n +CONFIG_BT_NIMBLE_ROLE_PERIPHERAL=y diff --git a/examples/bluetooth/nimble/bleprph/sdkconfig.ci.peripheral b/examples/bluetooth/nimble/bleprph/sdkconfig.ci.peripheral new file mode 100644 index 00000000000..69f6c440bac --- /dev/null +++ b/examples/bluetooth/nimble/bleprph/sdkconfig.ci.peripheral @@ -0,0 +1,10 @@ +CONFIG_BT_ENABLED=y +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n +CONFIG_BTDM_CTRL_MODE_BTDM=n +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_BT_NIMBLE_ROLE_CENTRAL=n +CONFIG_BT_NIMBLE_ROLE_BROADCASTER=n +CONFIG_BT_NIMBLE_ROLE_OBSERVER=n +CONFIG_BT_NIMBLE_ROLE_PERIPHERAL=y diff --git a/examples/bluetooth/nimble/common/nimble_central_utils/peer.c b/examples/bluetooth/nimble/common/nimble_central_utils/peer.c index 5635b26b4f2..117b36f5c1f 100644 --- a/examples/bluetooth/nimble/common/nimble_central_utils/peer.c +++ b/examples/bluetooth/nimble/common/nimble_central_utils/peer.c @@ -9,6 +9,7 @@ #include "host/ble_hs.h" #include "esp_central.h" +#if NIMBLE_BLE_CONNECT static void *peer_svc_mem; static struct os_mempool peer_svc_pool; @@ -1089,3 +1090,4 @@ err: peer_free_mem(); return rc; } +#endif From 21827600961a8c43475f20bd58cb5b93a1ab3dd4 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Thu, 26 Jun 2025 20:33:23 +0800 Subject: [PATCH 094/213] fix(ble): ensure internal malloc in ble log spi out (cherry picked from commit d300617aa65938c54b3a77ed84dd456fd93a450d) Co-authored-by: Zhou Xiao --- components/bt/common/ble_log/ble_log_spi_out.c | 11 ++++++----- .../common/ble_log/include/ble_log/ble_log_spi_out.h | 1 + 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/components/bt/common/ble_log/ble_log_spi_out.c b/components/bt/common/ble_log/ble_log_spi_out.c index 18e2dd01690..3ee7f5119f9 100644 --- a/components/bt/common/ble_log/ble_log_spi_out.c +++ b/components/bt/common/ble_log/ble_log_spi_out.c @@ -37,6 +37,7 @@ #define SPI_OUT_PACKET_LOSS_FRAME_SIZE (6) #define SPI_OUT_TRANS_ITVL_MIN_US (30) #define SPI_OUT_UL_LOG_STR_BUF_SIZE (100) +#define SPI_OUT_MALLOC(size) heap_caps_malloc(size, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT) #if SPI_OUT_TS_SYNC_ENABLED #define SPI_OUT_TS_SYNC_TIMEOUT (1000 * 1000) @@ -233,13 +234,13 @@ static void spi_out_le_audio_log_deinit(void); static int spi_out_init_trans(spi_out_trans_cb_t **trans_cb, uint16_t buf_size) { // Memory allocations - *trans_cb = (spi_out_trans_cb_t *)malloc(sizeof(spi_out_trans_cb_t)); + *trans_cb = (spi_out_trans_cb_t *)SPI_OUT_MALLOC(sizeof(spi_out_trans_cb_t)); if (!(*trans_cb)) { return -1; } memset(*trans_cb, 0, sizeof(spi_out_trans_cb_t)); - uint8_t *buf = (uint8_t *)spi_bus_dma_memory_alloc(SPI_OUT_BUS, (size_t)buf_size, 0); + uint8_t *buf = (uint8_t *)SPI_OUT_MALLOC((size_t)buf_size); if (!buf) { free(*trans_cb); *trans_cb = NULL; @@ -311,7 +312,7 @@ recycle: static int spi_out_log_cb_init(spi_out_log_cb_t **log_cb, uint16_t buf_size, uint8_t type) { // Initialize log control block - *log_cb = (spi_out_log_cb_t *)malloc(sizeof(spi_out_log_cb_t)); + *log_cb = (spi_out_log_cb_t *)SPI_OUT_MALLOC(sizeof(spi_out_log_cb_t)); if (!(*log_cb)) { ESP_LOGE(BLE_LOG_TAG, "Failed to initialize log control block!"); return -1; @@ -427,7 +428,7 @@ IRAM_ATTR static bool spi_out_log_cb_write(spi_out_log_cb_t *log_cb, const uint8 memcpy(buf, (const uint8_t *)&head, SPI_OUT_FRAME_HEAD_LEN); memcpy(buf + SPI_OUT_FRAME_HEAD_LEN, addr, len); - if (len_append) { + if (len_append && addr_append) { memcpy(buf + SPI_OUT_FRAME_HEAD_LEN + len, addr_append, len_append); } memcpy(buf + SPI_OUT_FRAME_HEAD_LEN + total_length, &checksum, SPI_OUT_FRAME_TAIL_LEN); @@ -520,7 +521,7 @@ static int spi_out_ul_log_init(void) } // Initialize string buffer - ul_log_str_buf = (uint8_t *)malloc(SPI_OUT_UL_LOG_STR_BUF_SIZE); + ul_log_str_buf = (uint8_t *)SPI_OUT_MALLOC(SPI_OUT_UL_LOG_STR_BUF_SIZE); if (!ul_log_str_buf) { ESP_LOGE(BLE_LOG_TAG, "Failed to initialize string buffer for upper layer task log!"); goto str_buf_init_failed; diff --git a/components/bt/common/ble_log/include/ble_log/ble_log_spi_out.h b/components/bt/common/ble_log/include/ble_log/ble_log_spi_out.h index 4d251c6d08a..3a4f8d9020a 100644 --- a/components/bt/common/ble_log/include/ble_log/ble_log_spi_out.h +++ b/components/bt/common/ble_log/include/ble_log/ble_log_spi_out.h @@ -13,6 +13,7 @@ #include "esp_timer.h" #include "esp_log.h" #include "freertos/semphr.h" +#include "esp_heap_caps.h" // Public enums enum { From af628e5ccbe063d442217744877cb34ccc826e2c Mon Sep 17 00:00:00 2001 From: Astha Verma Date: Thu, 12 Jun 2025 08:54:08 +0530 Subject: [PATCH 095/213] fix(nimble): Added parameter in peer_init for included service allocation --- components/bt/host/nimble/Kconfig.in | 8 +- components/bt/host/nimble/nimble | 2 +- .../nimble/ble_cts/cts_cent/main/main.c | 5 + .../enc_adv_data_cent/main/main.c | 5 + .../nimble/ble_gattc_gatts_coex/main/main.c | 565 ++++++++++++++++++ .../nimble/ble_htp/htp_cent/main/main.c | 6 +- .../ble_l2cap_coc/coc_blecent/main/main.c | 6 +- .../ble_multi_conn_cent/main/main.c | 6 +- .../nimble/ble_periodic_sync/main/main.c | 6 +- .../nimble/ble_phy/phy_cent/main/main.c | 6 +- .../proximity_sensor_cent/main/main.c | 6 +- .../nimble/ble_spp/spp_client/main/main.c | 6 +- .../nimble/common/nimble_central_utils/peer.c | 15 +- .../blecent_throughput/main/gattc.h | 15 + .../blecent_throughput/main/main.c | 6 +- .../blecent_throughput/main/peer.c | 243 +++++++- 16 files changed, 886 insertions(+), 20 deletions(-) create mode 100644 examples/bluetooth/nimble/ble_gattc_gatts_coex/main/main.c diff --git a/components/bt/host/nimble/Kconfig.in b/components/bt/host/nimble/Kconfig.in index 08caeba646c..117461966db 100644 --- a/components/bt/host/nimble/Kconfig.in +++ b/components/bt/host/nimble/Kconfig.in @@ -750,9 +750,11 @@ config BT_NIMBLE_GATT_CACHING_INCLUDE_SERVICES Enable this option to include *included services* (e.g., services referenced by other services) in the GATT database cache. Disabling this will skip caching of included service entries. config BT_NIMBLE_INCL_SVC_DISCOVERY - bool "Enable Included service discovery" - default y if BT_NIMBLE_GATT_CACHING_INCLUDE_SERVICES - default n + bool + default y if BT_NIMBLE_GATT_CACHING && BT_NIMBLE_GATT_CACHING_INCLUDE_SERVICES + default n if BT_NIMBLE_GATT_CACHING && !BT_NIMBLE_GATT_CACHING_INCLUDE_SERVICES + default n if !BT_NIMBLE_GATT_CACHING + prompt "Enable Included service discovery" if !BT_NIMBLE_GATT_CACHING help Enable this option to start discovery for included service. config BT_NIMBLE_GATT_CACHING_MAX_CONNS diff --git a/components/bt/host/nimble/nimble b/components/bt/host/nimble/nimble index 84e02a6b820..0e3d2d39bb7 160000 --- a/components/bt/host/nimble/nimble +++ b/components/bt/host/nimble/nimble @@ -1 +1 @@ -Subproject commit 84e02a6b820734de411ae9bdc8829d8ef6128205 +Subproject commit 0e3d2d39bb7dad01a70b6e810014c43cea235d24 diff --git a/examples/bluetooth/nimble/ble_cts/cts_cent/main/main.c b/examples/bluetooth/nimble/ble_cts/cts_cent/main/main.c index cc500176113..efe14e368e6 100644 --- a/examples/bluetooth/nimble/ble_cts/cts_cent/main/main.c +++ b/examples/bluetooth/nimble/ble_cts/cts_cent/main/main.c @@ -568,8 +568,13 @@ app_main(void) ble_hs_cfg.store_status_cb = ble_store_util_status_rr; /* Initialize data structures to track connected peers. */ +#if MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES) + rc = peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64, 64); + assert(rc == 0); +#else rc = peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64); assert(rc == 0); +#endif #if CONFIG_BT_NIMBLE_GAP_SERVICE /* Set the default device name. */ diff --git a/examples/bluetooth/nimble/ble_enc_adv_data/enc_adv_data_cent/main/main.c b/examples/bluetooth/nimble/ble_enc_adv_data/enc_adv_data_cent/main/main.c index 441b2a9eed2..1b3e77574d6 100644 --- a/examples/bluetooth/nimble/ble_enc_adv_data/enc_adv_data_cent/main/main.c +++ b/examples/bluetooth/nimble/ble_enc_adv_data/enc_adv_data_cent/main/main.c @@ -622,8 +622,13 @@ app_main(void) ble_hs_cfg.sm_io_cap = BLE_SM_IO_CAP_KEYBOARD_ONLY; /* Initialize data structures to track connected peers. */ +#if MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES) + rc = peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64, 64); + assert(rc == 0); +#else rc = peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64); assert(rc == 0); +#endif #if CONFIG_BT_NIMBLE_GAP_SERVICE /* Set the default device name. */ diff --git a/examples/bluetooth/nimble/ble_gattc_gatts_coex/main/main.c b/examples/bluetooth/nimble/ble_gattc_gatts_coex/main/main.c new file mode 100644 index 00000000000..a3b60e33630 --- /dev/null +++ b/examples/bluetooth/nimble/ble_gattc_gatts_coex/main/main.c @@ -0,0 +1,565 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +#include "host/ble_hs.h" +#include "host/util/util.h" +#include "services/gap/ble_svc_gap.h" +#include "services/gatt/ble_svc_gatt.h" +#include "nimble/nimble_port.h" +#include "nimble/nimble_port_freertos.h" +#include "nvs_flash.h" +#include "blecoex.h" +#include "services/ans/ble_svc_ans.h" + +static uint8_t own_addr_type; +static int blecoex_gap_event(struct ble_gap_event *event, void *arg); +void ble_coex_advertise(void); +void ble_coex_scan(void); +static bool client_connect = 0; + +static int gatt_svr_access_cb(uint16_t conn_handle, uint16_t attr_handle, + struct ble_gatt_access_ctxt *ctxt, void *arg) { + if (ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR) { + static uint8_t data[1] = {42}; // Example value + os_mbuf_append(ctxt->om, data, sizeof(data)); + } + return 0; +} + +static const ble_uuid128_t gatt_svr_svc_uuid = + BLE_UUID128_INIT(0x2d, 0x71, 0xa2, 0x59, 0xb4, 0x58, 0xc8, 0x12, + 0x99, 0x99, 0x43, 0x95, 0x12, 0x2f, 0x46, 0x59); + +/* A characteristic that can be subscribed to */ +static uint16_t gatt_svr_chr_val_handle; +static const ble_uuid128_t gatt_svr_chr_uuid = + BLE_UUID128_INIT(0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x22, 0x22, 0x22, 0x22, 0x33, 0x33, 0x33, 0x33); + +/* A custom descriptor */ +static const ble_uuid128_t gatt_svr_dsc_uuid = + BLE_UUID128_INIT(0x01, 0x01, 0x01, 0x01, 0x12, 0x12, 0x12, 0x12, + 0x23, 0x23, 0x23, 0x23, 0x34, 0x34, 0x34, 0x34); + +static const struct ble_gatt_svc_def gatt_svr_svcs[] = { + { + /*** Service ***/ + .type = BLE_GATT_SVC_TYPE_PRIMARY, + .uuid = &gatt_svr_svc_uuid.u, + .characteristics = (struct ble_gatt_chr_def[]) + { { + /*** This characteristic can be subscribed to by writing 0x00 and 0x01 to the CCCD ***/ + .uuid = &gatt_svr_chr_uuid.u, + .access_cb = gatt_svr_access_cb, + .flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_NOTIFY | BLE_GATT_CHR_F_INDICATE, + .val_handle = &gatt_svr_chr_val_handle, + .descriptors = (struct ble_gatt_dsc_def[]) + { { + .uuid = &gatt_svr_dsc_uuid.u, + .att_flags = BLE_ATT_F_READ, + .access_cb = gatt_svr_access_cb, + }, { + 0, /* No more descriptors in this characteristic */ + } + }, + }, { + 0, /* No more characteristics in this service. */ + } + }, + }, + + { + 0, /* No more services. */ + }, +}; + +static int +blecoex_should_connect(const struct ble_gap_disc_desc *disc) +{ + struct ble_hs_adv_fields fields; + int rc; + int i; + + /* The device has to be advertising connectability. */ + if (disc->event_type != BLE_HCI_ADV_RPT_EVTYPE_ADV_IND && + disc->event_type != BLE_HCI_ADV_RPT_EVTYPE_DIR_IND) { + + return 0; + } + + rc = ble_hs_adv_parse_fields(&fields, disc->data, disc->length_data); + if (rc != 0) { + return 0; + } + + /* The device has to advertise support for the Alert Notification + * service (0x1811). + */ + for (i = 0; i < fields.num_uuids16; i++) { + if (ble_uuid_u16(&fields.uuids16[i].u) == BLECOEX_SVC_ALERT_UUID) { + return 1; + } + } + + return 0; +} + +static void +connect_if_interesting(void *disc) +{ + uint8_t own_addr_type; + int rc; + ble_addr_t *addr; + + /* Don't do anything if we don't care about this advertiser. */ + if (!blecoex_should_connect((struct ble_gap_disc_desc *)disc)) { + return; + } + + /* Scanning must be stopped before a connection can be initiated. */ + rc = ble_gap_disc_cancel(); + if (rc != 0) { + MODLOG_DFLT(DEBUG, "Failed to cancel scan; rc=%d\n", rc); + return; + } + + /* Figure out address to use for connect (no privacy for now) */ + rc = ble_hs_id_infer_auto(0, &own_addr_type); + if (rc != 0) { + MODLOG_DFLT(ERROR, "error determining address type; rc=%d\n", rc); + return; + } + + /* Try to connect the the advertiser. Allow 30 seconds (30000 ms) for + * timeout. + */ + addr = &((struct ble_gap_disc_desc *)disc)->addr; + + rc = ble_gap_connect(own_addr_type, addr, 30000, NULL, + blecoex_gap_event, NULL); + if (rc != 0) { + MODLOG_DFLT(ERROR, "Failed to connect to device \n"); + return; + } + + client_connect = 1; +} + +static int +blecent_on_subscribe(uint16_t conn_handle, + const struct ble_gatt_error *error, + struct ble_gatt_attr *attr, + void *arg) +{ + MODLOG_DFLT(INFO, "Subscribe complete; status=%d conn_handle=%d " + "attr_handle=%d\n", + error->status, conn_handle, attr->handle); + + /* Terminate connection */ + ble_gap_terminate(conn_handle, BLE_ERR_REM_USER_CONN_TERM); + + return 0; +} + +static int +blecent_on_write(uint16_t conn_handle, + const struct ble_gatt_error *error, + struct ble_gatt_attr *attr, + void *arg) +{ + MODLOG_DFLT(INFO, + "Write complete; status=%d conn_handle=%d attr_handle=%d\n", + error->status, conn_handle, attr->handle); + + /* Subscribe to notifications for the Unread Alert Status characteristic. + * A central enables notifications by writing two bytes (1, 0) to the + * characteristic's client-characteristic-configuration-descriptor (CCCD). + */ + const struct peer_dsc *dsc; + uint8_t value[2]; + int rc; + const struct peer *peer = peer_find(conn_handle); + + dsc = peer_dsc_find_uuid(peer, + BLE_UUID16_DECLARE(BLECOEX_SVC_ALERT_UUID), + BLE_UUID16_DECLARE(BLECOEX_CHR_UNR_ALERT_STAT_UUID), + BLE_UUID16_DECLARE(BLE_GATT_DSC_CLT_CFG_UUID16)); + if (dsc == NULL) { + MODLOG_DFLT(ERROR, "Error: Peer lacks a CCCD for the Unread Alert " + "Status characteristic\n"); + goto err; + } + + value[0] = 1; + value[1] = 0; + rc = ble_gattc_write_flat(conn_handle, dsc->dsc.handle, + value, sizeof value, blecent_on_subscribe, NULL); + if (rc != 0) { + MODLOG_DFLT(ERROR, "Error: Failed to subscribe to characteristic; " + "rc=%d\n", rc); + goto err; + } + + return 0; +err: + /* Terminate the connection. */ + return ble_gap_terminate(peer->conn_handle, BLE_ERR_REM_USER_CONN_TERM); +} + + +static int +blecent_on_read(uint16_t conn_handle, + const struct ble_gatt_error *error, + struct ble_gatt_attr *attr, + void *arg) +{ + MODLOG_DFLT(INFO, "Read complete; status=%d conn_handle=%d", error->status, + conn_handle); + if (error->status == 0) { + MODLOG_DFLT(INFO, " attr_handle=%d value=", attr->handle); + print_mbuf(attr->om); + } + MODLOG_DFLT(INFO, "\n"); + + /* Write two bytes (99, 100) to the alert-notification-control-point + * characteristic. + */ + const struct peer_chr *chr; + uint8_t value[2]; + int rc; + const struct peer *peer = peer_find(conn_handle); + + chr = peer_chr_find_uuid(peer, + BLE_UUID16_DECLARE(BLECOEX_SVC_ALERT_UUID), + BLE_UUID16_DECLARE(BLECOEX_CHR_ALERT_NOT_CTRL_PT)); + if (chr == NULL) { + MODLOG_DFLT(ERROR, "Error: Peer doesn't support the Alert " + "Notification Control Point characteristic\n"); + goto err; + } + value[0] = 99; + value[1] = 100; + rc = ble_gattc_write_flat(conn_handle, chr->chr.val_handle, + value, sizeof value, blecent_on_write, NULL); + if (rc != 0) { + MODLOG_DFLT(ERROR, "Error: Failed to write characteristic; rc=%d\n", + rc); + goto err; + } + + return 0; +err: + /* Terminate the connection. */ + return ble_gap_terminate(peer->conn_handle, BLE_ERR_REM_USER_CONN_TERM); +} + + +static void +blecent_read_write_subscribe(const struct peer *peer) +{ + const struct peer_chr *chr; + int rc; + + /* Read the supported-new-alert-category characteristic. */ + chr = peer_chr_find_uuid(peer, + BLE_UUID16_DECLARE(BLECOEX_SVC_ALERT_UUID), + BLE_UUID16_DECLARE(BLECOEX_CHR_SUP_NEW_ALERT_CAT_UUID)); + if (chr == NULL) { + MODLOG_DFLT(ERROR, "Error: Peer doesn't support the Supported New " + "Alert Category characteristic\n"); + goto err; + } + + rc = ble_gattc_read(peer->conn_handle, chr->chr.val_handle, + blecent_on_read, NULL); + if (rc != 0) { + MODLOG_DFLT(ERROR, "Error: Failed to read characteristic; rc=%d\n", + rc); + goto err; + } + + return; +err: + /* Terminate the connection. */ + ble_gap_terminate(peer->conn_handle, BLE_ERR_REM_USER_CONN_TERM); +} + + +static void +blecent_on_disc_complete(const struct peer *peer, int status, void *arg) +{ + + if (status != 0) { + /* Service discovery failed. Terminate the connection. */ + MODLOG_DFLT(ERROR, "Error: Service discovery failed; status=%d " + "conn_handle=%d\n", status, peer->conn_handle); + ble_gap_terminate(peer->conn_handle, BLE_ERR_REM_USER_CONN_TERM); + return; + } + + /* Service discovery has completed successfully. Now we have a complete + * list of services, characteristics, and descriptors that the peer + * supports. + */ + MODLOG_DFLT(INFO, "Service discovery complete; status=%d " + "conn_handle=%d\n", status, peer->conn_handle); + + /* Now perform three GATT procedures against the peer: read, + * write, and subscribe to notifications for the ANS service. + */ + blecent_read_write_subscribe(peer); +} + +static void restart_coex(void) +{ + client_connect = 0; + ble_gap_adv_stop(); + ble_coex_advertise(); +//TODO: Current example only restarts advertising. +#if 0 + ble_gap_disc_cancel(); + ble_coex_scan(); +#endif +} + +static int +blecoex_gap_event(struct ble_gap_event *event, void *arg) +{ + struct ble_gap_conn_desc desc; + int rc; + + switch (event->type) { + case BLE_GAP_EVENT_DISC: + connect_if_interesting(&event->disc); + return 0; + + case BLE_GAP_EVENT_CONNECT: + MODLOG_DFLT(INFO, "%s connection %s; status=%d ", + client_connect == 1 ? "Client" : "Server", + event->connect.status == 0 ? "established" : "failed", + event->connect.status); + + if (event->connect.status == 0 ) { + rc = ble_gap_conn_find(event->connect.conn_handle, &desc); + assert(rc == 0); + MODLOG_DFLT(INFO, "\n"); + + const uint8_t *u8p; + MODLOG_DFLT(INFO, " peer_ota_addr_type=%d peer_ota_addr=", + desc.peer_ota_addr.type); + u8p = desc.peer_ota_addr.val; + MODLOG_DFLT(INFO, "%02x:%02x:%02x:%02x:%02x:%02x", + u8p[5], u8p[4], u8p[3], u8p[2], u8p[1], u8p[0]); + MODLOG_DFLT(INFO, " peer_id_addr_type=%d peer_id_addr=", + desc.peer_id_addr.type); + u8p = desc.peer_id_addr.val; + MODLOG_DFLT(INFO, "%02x:%02x:%02x:%02x:%02x:%02x", + u8p[5], u8p[4], u8p[3], u8p[2], u8p[1], u8p[0]); + + } + + if (client_connect == 1 ) { + client_connect = 2; + + /* Remember peer. */ + rc = peer_add(event->connect.conn_handle); + if (rc != 0) { + MODLOG_DFLT(ERROR, "Failed to add peer; rc=%d\n", rc); + restart_coex(); + } + + /* Perform service discovery */ + rc = peer_disc_all(event->connect.conn_handle, + blecent_on_disc_complete, NULL); + if(rc != 0) { + MODLOG_DFLT(ERROR, "Failed to discover services; rc=%d\n", rc); + restart_coex(); + } + } + return 0; + + case BLE_GAP_EVENT_DISCONNECT: + MODLOG_DFLT(INFO, "Disconnect \n"); + restart_coex(); + return 0; + + case BLE_GAP_EVENT_DISC_COMPLETE: + MODLOG_DFLT(INFO, "Discovery completed \n"); + return 0; + + case BLE_GAP_EVENT_SUBSCRIBE: + MODLOG_DFLT(INFO, "subscribe event; conn_handle=%d attr_handle=%d " + "reason=%d prevn=%d curn=%d previ=%d curi=%d\n", + event->subscribe.conn_handle, + event->subscribe.attr_handle, + event->subscribe.reason, + event->subscribe.prev_notify, + event->subscribe.cur_notify, + event->subscribe.prev_indicate, + event->subscribe.cur_indicate); + return 0; + + + default: + return 0; + } +} + +void +ble_coex_scan(void) +{ + uint8_t own_addr_type; + struct ble_gap_disc_params disc_params = {0}; + int rc; + + /* Figure out address to use while advertising (no privacy for now) */ + rc = ble_hs_id_infer_auto(0, &own_addr_type); + if (rc != 0) { + MODLOG_DFLT(ERROR, "error determining address type; rc=%d\n", rc); + return; + } + + /* Tell the controller to filter duplicates; we don't want to process + * repeated advertisements from the same device. + */ + disc_params.filter_duplicates = 1; + + /** + * Perform a passive scan. I.e., don't send follow-up scan requests to + * each advertiser. + */ + disc_params.passive = 1; + + /* Use defaults for the rest of the parameters. */ + disc_params.itvl = 0; + disc_params.window = 0; + disc_params.filter_policy = 0; + disc_params.limited = 0; + + /* Start discovery for 120 seconds */ + rc = ble_gap_disc(own_addr_type, (120*1000) , &disc_params, + blecoex_gap_event, NULL); + if (rc != 0) { + MODLOG_DFLT(ERROR, "Error initiating GAP discovery procedure; rc=%d\n", + rc); + } +} + +void +ble_coex_advertise(void) +{ + struct ble_gap_adv_params adv_params; + struct ble_hs_adv_fields fields; + const char *name; + int rc; + + /** + * Set the advertisement data included in our advertisements: + * o Flags (indicates advertisement type and other general info). + * o Advertising tx power. + * o Device name. + * o 16-bit service UUIDs (alert notifications). + */ + + memset(&fields, 0, sizeof fields); + + /* Advertise two flags: + * o Discoverability in forthcoming advertisement (general) + * o BLE-only (BR/EDR unsupported). + */ + fields.flags = BLE_HS_ADV_F_DISC_GEN | + BLE_HS_ADV_F_BREDR_UNSUP; + + /* Indicate that the TX power level field should be included; have the + * stack fill this value automatically. This is done by assigning the + * special value BLE_HS_ADV_TX_PWR_LVL_AUTO. + */ + fields.tx_pwr_lvl_is_present = 1; + fields.tx_pwr_lvl = BLE_HS_ADV_TX_PWR_LVL_AUTO; + + name = ble_svc_gap_device_name(); + fields.name = (uint8_t *)name; + fields.name_len = strlen(name); + fields.name_is_complete = 1; + + fields.uuids16 = (ble_uuid16_t[]) { + BLE_UUID16_INIT(BLECOEX_SVC_ALERT_UUID) + }; + fields.num_uuids16 = 1; + fields.uuids16_is_complete = 1; + + rc = ble_gap_adv_set_fields(&fields); + if (rc != 0) { + MODLOG_DFLT(ERROR, "error setting advertisement data; rc=%d\n", rc); + return; + } + + /* Begin advertising. */ + memset(&adv_params, 0, sizeof adv_params); + adv_params.conn_mode = BLE_GAP_CONN_MODE_UND; + adv_params.disc_mode = BLE_GAP_DISC_MODE_GEN; + rc = ble_gap_adv_start(own_addr_type, NULL, BLE_HS_FOREVER, + &adv_params, blecoex_gap_event, NULL); + if (rc != 0) { + MODLOG_DFLT(ERROR, "error enabling advertisement; rc=%d\n", rc); + return; + } +} + +static void on_sync(void) +{ + int rc; + + ble_hs_util_ensure_addr(0); + + ble_hs_id_infer_auto(0, &own_addr_type); + ble_svc_gap_device_name_set("NimBLE Coex"); + ble_coex_advertise(); + + // Start scanning as a client + rc = ble_hs_util_ensure_addr(0); + assert(rc == 0); + + ble_coex_scan(); +} + +void ble_hs_task(void *param) +{ + MODLOG_DFLT(INFO, "BLE Host Task Started"); + /* This function will return only when nimble_port_stop() is executed */ + nimble_port_run(); + + nimble_port_freertos_deinit(); +} + + +void app_main(void) +{ + /* Initialize NVS — it is used to store PHY calibration data */ + esp_err_t ret = nvs_flash_init(); + + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + nimble_port_init(); + + ble_hs_cfg.sync_cb = on_sync; +#if MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES) + peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64, 64); +#else + peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64); +#endif + ble_svc_gap_init(); + ble_svc_gatt_init(); + ble_svc_ans_init(); + + ble_gatts_count_cfg(gatt_svr_svcs); + ble_gatts_add_svcs(gatt_svr_svcs); + + nimble_port_freertos_init(ble_hs_task); +} diff --git a/examples/bluetooth/nimble/ble_htp/htp_cent/main/main.c b/examples/bluetooth/nimble/ble_htp/htp_cent/main/main.c index 0ac1b7d6019..510139146eb 100644 --- a/examples/bluetooth/nimble/ble_htp/htp_cent/main/main.c +++ b/examples/bluetooth/nimble/ble_htp/htp_cent/main/main.c @@ -698,9 +698,13 @@ app_main(void) ble_hs_cfg.store_status_cb = ble_store_util_status_rr; /* Initialize data structures to track connected peers. */ +#if MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES) + rc = peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64, 64); + assert(rc == 0); +#else rc = peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64); assert(rc == 0); - +#endif #if CONFIG_BT_NIMBLE_GAP_SERVICE /* Set the default device name. */ rc = ble_svc_gap_device_name_set("nimble-htp-cent"); diff --git a/examples/bluetooth/nimble/ble_l2cap_coc/coc_blecent/main/main.c b/examples/bluetooth/nimble/ble_l2cap_coc/coc_blecent/main/main.c index 644e19476dc..209d5e2e841 100644 --- a/examples/bluetooth/nimble/ble_l2cap_coc/coc_blecent/main/main.c +++ b/examples/bluetooth/nimble/ble_l2cap_coc/coc_blecent/main/main.c @@ -572,9 +572,13 @@ app_main(void) #endif /* Initialize data structures to track connected peers. */ +#if MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES) + rc = peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64, 64); + assert(rc == 0); +#else rc = peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64); assert(rc == 0); - +#endif #if CONFIG_BT_NIMBLE_GAP_SERVICE /* Set the default device name. */ rc = ble_svc_gap_device_name_set("blecent-l2coc"); diff --git a/examples/bluetooth/nimble/ble_multi_conn/ble_multi_conn_cent/main/main.c b/examples/bluetooth/nimble/ble_multi_conn/ble_multi_conn_cent/main/main.c index 4b5c47f1bc5..6acd00750c5 100644 --- a/examples/bluetooth/nimble/ble_multi_conn/ble_multi_conn_cent/main/main.c +++ b/examples/bluetooth/nimble/ble_multi_conn/ble_multi_conn_cent/main/main.c @@ -454,9 +454,13 @@ app_main(void) ble_hs_cfg.store_status_cb = ble_store_util_status_rr; /* Initialize data structures to track connected peers. */ +#if MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES) + rc = peer_init(BLE_PEER_MAX_NUM, BLE_PEER_MAX_NUM, BLE_PEER_MAX_NUM, BLE_PEER_MAX_NUM, BLE_PEER_MAX_NUM); + assert(rc == 0); +#else rc = peer_init(BLE_PEER_MAX_NUM, BLE_PEER_MAX_NUM, BLE_PEER_MAX_NUM, BLE_PEER_MAX_NUM); assert(rc == 0); - +#endif /* Set the default device name. We will act as both central and peripheral. */ rc = ble_svc_gap_device_name_set("esp-ble-role-coex"); assert(rc == 0); diff --git a/examples/bluetooth/nimble/ble_periodic_sync/main/main.c b/examples/bluetooth/nimble/ble_periodic_sync/main/main.c index 869a4d32bc3..567338d5d25 100644 --- a/examples/bluetooth/nimble/ble_periodic_sync/main/main.c +++ b/examples/bluetooth/nimble/ble_periodic_sync/main/main.c @@ -203,9 +203,13 @@ app_main(void) ble_hs_cfg.store_status_cb = ble_store_util_status_rr; /* Initialize data structures to track connected peers. */ +#if MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES) + rc = peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64, 64); + assert(rc == 0); +#else rc = peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64); assert(rc == 0); - +#endif #if CONFIG_BT_NIMBLE_GAP_SERVICE /* Set the default device name. */ rc = ble_svc_gap_device_name_set("nimble_periodic_sync"); diff --git a/examples/bluetooth/nimble/ble_phy/phy_cent/main/main.c b/examples/bluetooth/nimble/ble_phy/phy_cent/main/main.c index c6520f98fce..09eb5f6cc61 100644 --- a/examples/bluetooth/nimble/ble_phy/phy_cent/main/main.c +++ b/examples/bluetooth/nimble/ble_phy/phy_cent/main/main.c @@ -553,9 +553,13 @@ app_main(void) ble_hs_cfg.store_status_cb = ble_store_util_status_rr; /* Initialize data structures to track connected peers. */ +#if MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES) + rc = peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64, 64); + assert(rc == 0); +#else rc = peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64); assert(rc == 0); - +#endif #if CONFIG_BT_NIMBLE_GAP_SERVICE /* Set the default device name. */ rc = ble_svc_gap_device_name_set("blecent-phy"); diff --git a/examples/bluetooth/nimble/ble_proximity_sensor/proximity_sensor_cent/main/main.c b/examples/bluetooth/nimble/ble_proximity_sensor/proximity_sensor_cent/main/main.c index 452c881554f..4c73890b93b 100644 --- a/examples/bluetooth/nimble/ble_proximity_sensor/proximity_sensor_cent/main/main.c +++ b/examples/bluetooth/nimble/ble_proximity_sensor/proximity_sensor_cent/main/main.c @@ -722,9 +722,13 @@ app_main(void) ble_hs_cfg.store_status_cb = ble_store_util_status_rr; /* Initialize data structures to track connected peers. */ +#if MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES) + rc = peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64, 64); + assert(rc == 0); +#else rc = peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64); assert(rc == 0); - +#endif #if CONFIG_BT_NIMBLE_GAP_SERVICE /* Set the default device name. */ rc = ble_svc_gap_device_name_set("nimble-prox-cent"); diff --git a/examples/bluetooth/nimble/ble_spp/spp_client/main/main.c b/examples/bluetooth/nimble/ble_spp/spp_client/main/main.c index 8e9136de969..4b479214c39 100644 --- a/examples/bluetooth/nimble/ble_spp/spp_client/main/main.c +++ b/examples/bluetooth/nimble/ble_spp/spp_client/main/main.c @@ -488,9 +488,13 @@ app_main(void) ble_hs_cfg.store_status_cb = ble_store_util_status_rr; /* Initialize data structures to track connected peers. */ +#if MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES) + rc = peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64, 64); + assert(rc == 0); +#else rc = peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64); assert(rc == 0); - +#endif #if CONFIG_BT_NIMBLE_GAP_SERVICE /* Set the default device name. */ rc = ble_svc_gap_device_name_set("nimble-ble-spp-client"); diff --git a/examples/bluetooth/nimble/common/nimble_central_utils/peer.c b/examples/bluetooth/nimble/common/nimble_central_utils/peer.c index 117b36f5c1f..e4a2070cfb5 100644 --- a/examples/bluetooth/nimble/common/nimble_central_utils/peer.c +++ b/examples/bluetooth/nimble/common/nimble_central_utils/peer.c @@ -602,13 +602,16 @@ peer_disc_incs(struct peer *peer) } } } - svc = peer->cur_svc; - rc = ble_gattc_find_inc_svcs(peer->conn_handle, - svc->svc.start_handle, - svc->svc.end_handle, - peer_inc_disced, peer); - if (rc != 0) { + if (svc != NULL && !peer_svc_is_empty(svc)) { + rc = ble_gattc_find_inc_svcs(peer->conn_handle, + svc->svc.start_handle, + svc->svc.end_handle, + peer_inc_disced, peer); + if (rc != 0) { + peer_disc_chrs(peer); + } + } else { peer_disc_chrs(peer); } } diff --git a/examples/bluetooth/nimble/throughput_app/blecent_throughput/main/gattc.h b/examples/bluetooth/nimble/throughput_app/blecent_throughput/main/gattc.h index 99834981230..aea4a3762fe 100644 --- a/examples/bluetooth/nimble/throughput_app/blecent_throughput/main/gattc.h +++ b/examples/bluetooth/nimble/throughput_app/blecent_throughput/main/gattc.h @@ -50,10 +50,21 @@ struct peer_chr { }; SLIST_HEAD(peer_chr_list, peer_chr); +#if MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES) +struct peer_incl_svc { + SLIST_ENTRY(peer_incl_svc) next; + struct ble_gatt_incl_svc svc; +}; +SLIST_HEAD(peer_incl_svc_list, peer_incl_svc); +#endif + struct peer_svc { SLIST_ENTRY(peer_svc) next; struct ble_gatt_svc svc; +#if MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES) + struct peer_incl_svc_list incl_svc; +#endif struct peer_chr_list chrs; }; SLIST_HEAD(peer_svc_list, peer_svc); @@ -90,7 +101,11 @@ const struct peer_svc * peer_svc_find_uuid(const struct peer *peer, const ble_uuid_t *uuid); int peer_delete(uint16_t conn_handle); int peer_add(uint16_t conn_handle); +#if MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES) +int peer_init(int max_peers, int max_svcs, int max_incl_svcs, int max_chrs, int max_dscs); +#else int peer_init(int max_peers, int max_svcs, int max_chrs, int max_dscs); +#endif struct peer * peer_find(uint16_t conn_handle); /* Console */ diff --git a/examples/bluetooth/nimble/throughput_app/blecent_throughput/main/main.c b/examples/bluetooth/nimble/throughput_app/blecent_throughput/main/main.c index 2bfbf5e0401..49d1007a94a 100644 --- a/examples/bluetooth/nimble/throughput_app/blecent_throughput/main/main.c +++ b/examples/bluetooth/nimble/throughput_app/blecent_throughput/main/main.c @@ -938,9 +938,13 @@ app_main(void) ble_hs_cfg.store_status_cb = ble_store_util_status_rr; /* Initialize data structures to track connected peers. */ +#if MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES) + rc = peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64, 64); + assert(rc == 0); +#else rc = peer_init(MYNEWT_VAL(BLE_MAX_CONNECTIONS), 64, 64, 64); assert(rc == 0); - +#endif /* Set the default device name. */ rc = ble_svc_gap_device_name_set("gattc-throughput"); assert(rc == 0); diff --git a/examples/bluetooth/nimble/throughput_app/blecent_throughput/main/peer.c b/examples/bluetooth/nimble/throughput_app/blecent_throughput/main/peer.c index e7e655cd1f7..4ef4ab09d97 100644 --- a/examples/bluetooth/nimble/throughput_app/blecent_throughput/main/peer.c +++ b/examples/bluetooth/nimble/throughput_app/blecent_throughput/main/peer.c @@ -12,6 +12,11 @@ static void *peer_svc_mem; static struct os_mempool peer_svc_pool; +#if MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES) +static void *peer_incl_svc_mem; +static struct os_mempool peer_incl_svc_pool; +#endif + static void *peer_chr_mem; static struct os_mempool peer_chr_pool; @@ -44,7 +49,13 @@ static int peer_dsc_disced(uint16_t conn_handle, const struct ble_gatt_error *error, uint16_t chr_val_handle, const struct ble_gatt_dsc *dsc, void *arg); - +#if MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES) +static int +peer_inc_disced(uint16_t conn_handle, const struct ble_gatt_error *error, + const struct ble_gatt_incl_svc *service, void *arg); +static void +peer_disc_incs(struct peer *peer); +#endif struct peer * peer_find(uint16_t conn_handle) { @@ -420,6 +431,193 @@ peer_disc_chrs(struct peer *peer) peer_disc_dscs(peer); } +#if (MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES)) +static struct peer_incl_svc * +peer_incl_svc_find_prev(const struct peer_svc *svc, uint16_t incl_svc_handle) +{ + struct peer_incl_svc *prev; + struct peer_incl_svc *incl_svc; + + prev = NULL; + SLIST_FOREACH(incl_svc, &svc->incl_svc, next) { + if (incl_svc->svc.handle >= incl_svc_handle) { + break; + } + + prev = incl_svc; + } + + return prev; +} + +static struct peer_incl_svc * +peer_incl_svc_find(const struct peer_svc *svc, uint16_t incl_svc_handle, + struct peer_incl_svc **out_prev) +{ + struct peer_incl_svc *prev; + struct peer_incl_svc *incl_svc; + + prev = peer_incl_svc_find_prev(svc, incl_svc_handle); + if (prev == NULL) { + incl_svc = SLIST_FIRST(&svc->incl_svc); + } else { + incl_svc = SLIST_NEXT(prev, next); + } + + if (incl_svc != NULL && incl_svc->svc.handle != incl_svc_handle) { + incl_svc = NULL; + } + + if (out_prev != NULL) { + *out_prev = prev; + } + return incl_svc; +} + +static void +peer_incl_svc_delete(struct peer_incl_svc *incl_svc) +{ + os_memblock_put(&peer_incl_svc_pool, incl_svc); +} + +static int +peer_inc_add(struct peer *peer, uint16_t svc_start_handle, + const struct ble_gatt_incl_svc *gatt_incl_svc) +{ + struct peer_incl_svc *incl_svc; + struct peer_incl_svc *incl_svc_prev; + struct peer_svc *cur_svc; + struct peer_svc *svc; + struct peer_svc *prev; + + svc = peer_svc_find(peer, gatt_incl_svc->start_handle, &prev); + + if (!svc) { + /* secondary service */ + svc = os_memblock_get(&peer_svc_pool); + if (svc == NULL) { + /* out of memory */ + return BLE_HS_ENOMEM; + } + + memset(svc, 0, sizeof *svc); + svc->svc.start_handle = gatt_incl_svc->start_handle; + svc->svc.end_handle = gatt_incl_svc->end_handle; + memcpy(&svc->svc.uuid, &gatt_incl_svc->uuid, sizeof(ble_uuid_any_t)); + + SLIST_INIT(&svc->chrs); + SLIST_INIT(&svc->incl_svc); + + if (prev == NULL) { + SLIST_INSERT_HEAD(&peer->svcs, svc, next); + } else { + SLIST_INSERT_AFTER(prev, svc, next); + } + } + + /* Including the services into inlucding list */ + + cur_svc = peer_svc_find_range(peer, gatt_incl_svc->handle); + + if (cur_svc == NULL) { + /* Can't find service for discovered included service; this shouldn't + * happen. + */ + assert(0); + return BLE_HS_EUNKNOWN; + } + + incl_svc = peer_incl_svc_find(cur_svc, gatt_incl_svc->handle, &incl_svc_prev); + if (incl_svc != NULL) { + /* Already discovered */ + return 0; + } + + incl_svc = os_memblock_get(&peer_incl_svc_pool); + if (incl_svc == NULL) { + return BLE_HS_ENOMEM; + } + + incl_svc->svc = *gatt_incl_svc; + + if (incl_svc_prev == NULL) { + SLIST_INSERT_HEAD(&cur_svc->incl_svc, incl_svc, next); + } else { + SLIST_INSERT_AFTER(incl_svc_prev, incl_svc, next); + } + + BLE_HS_LOG(DEBUG, "Inc Service added with handle = %d", gatt_incl_svc->handle); + + return 0; +} + + +static int +peer_inc_disced(uint16_t conn_handle, const struct ble_gatt_error *error, + const struct ble_gatt_incl_svc *service, void *arg) +{ + struct peer *peer; + int rc; + + peer = arg; + assert(peer->conn_handle == conn_handle); + + switch (error->status) { + case 0: + rc = peer_inc_add(peer, peer->cur_svc->svc.start_handle, service); + break; + + case BLE_HS_EDONE: + peer_disc_incs(peer); + rc = 0; + break; + + default: + rc = error->status; + break; + } + + if (rc != 0) { + /* Error; abort discovery. */ + peer_disc_complete(peer, rc); + } + + return rc; +} + +static void +peer_disc_incs(struct peer *peer) +{ + struct peer_svc *svc; + int rc; + + if (peer->cur_svc == NULL) { + peer->cur_svc = SLIST_FIRST(&peer->svcs); + } else { + peer->cur_svc = SLIST_NEXT(peer->cur_svc, next); + if (peer->cur_svc == NULL) { + if (peer->disc_prev_chr_val > 0) { + peer_disc_chrs(peer); + return; + } + } + } + + svc = peer->cur_svc; + if (svc != NULL && !peer_svc_is_empty(svc)) { + rc = ble_gattc_find_inc_svcs(peer->conn_handle, + svc->svc.start_handle, + svc->svc.end_handle, + peer_inc_disced, peer); + if (rc != 0) { + peer_disc_chrs(peer); + } + } else { + peer_disc_chrs(peer); + } +} +#endif + int peer_svc_is_empty(const struct peer_svc *svc) { @@ -576,6 +774,14 @@ peer_svc_delete(struct peer_svc *svc) { struct peer_chr *chr; +#if MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES) + struct peer_incl_svc *incl_svc; + + while ((incl_svc = SLIST_FIRST(&svc->incl_svc)) != NULL) { + SLIST_REMOVE_HEAD(&svc->incl_svc, next); + peer_incl_svc_delete(incl_svc); + } +#endif while ((chr = SLIST_FIRST(&svc->chrs)) != NULL) { SLIST_REMOVE_HEAD(&svc->chrs, next); peer_chr_delete(chr); @@ -600,10 +806,16 @@ peer_svc_disced(uint16_t conn_handle, const struct ble_gatt_error *error, break; case BLE_HS_EDONE: - /* All services discovered; start discovering characteristics. */ + /* All services discovered; start discovering incs.*/ +#if (MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES)) + peer->cur_svc = NULL; + peer_disc_incs(peer); +#else + /* All services discovered; start discovering characteristics. */ if (peer->disc_prev_chr_val > 0) { peer_disc_chrs(peer); } +#endif rc = 0; break; @@ -711,6 +923,11 @@ peer_free_mem(void) free(peer_svc_mem); peer_svc_mem = NULL; +#if MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES) + free(peer_incl_svc_mem); + peer_incl_svc_mem = NULL; +#endif + free(peer_chr_mem); peer_chr_mem = NULL; @@ -718,8 +935,13 @@ peer_free_mem(void) peer_dsc_mem = NULL; } +#if MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES) +int +peer_init(int max_peers, int max_svcs, int max_incl_svcs, int max_chrs, int max_dscs) +#else int peer_init(int max_peers, int max_svcs, int max_chrs, int max_dscs) +#endif { int rc; @@ -756,6 +978,23 @@ peer_init(int max_peers, int max_svcs, int max_chrs, int max_dscs) goto err; } +#if MYNEWT_VAL(BLE_INCL_SVC_DISCOVERY) || MYNEWT_VAL(BLE_GATT_CACHING_INCLUDE_SERVICES) + peer_incl_svc_mem = malloc( + OS_MEMPOOL_BYTES(max_incl_svcs, sizeof(struct peer_incl_svc))); + + if (peer_incl_svc_mem == NULL) { + rc = BLE_HS_ENOMEM; + goto err; + } + + rc = os_mempool_init(&peer_incl_svc_pool, max_incl_svcs, + sizeof(struct peer_incl_svc), peer_incl_svc_mem, + "peer_incl_svc_pool"); + if (rc != 0) { + rc = BLE_HS_EOS; + goto err; + } +#endif peer_chr_mem = malloc( OS_MEMPOOL_BYTES(max_chrs, sizeof (struct peer_chr))); if (peer_chr_mem == NULL) { From 8e67d9a912df97dabf3cf238c922af0ae0263f54 Mon Sep 17 00:00:00 2001 From: armando Date: Wed, 25 Jun 2025 10:36:06 +0800 Subject: [PATCH 096/213] change(mmu): remove paddr remap warning log --- components/esp_mm/esp_mmu_map.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/components/esp_mm/esp_mmu_map.c b/components/esp_mm/esp_mmu_map.c index 32dadf7a822..8048675e6f4 100644 --- a/components/esp_mm/esp_mmu_map.c +++ b/components/esp_mm/esp_mmu_map.c @@ -514,7 +514,9 @@ esp_err_t esp_mmu_map(esp_paddr_t paddr_start, size_t size, mmu_target_t target, */ const uint32_t new_paddr_offset = paddr_start - mem_block->paddr_start; *out_ptr = (void *)mem_block->vaddr_start + new_paddr_offset; - ESP_GOTO_ON_FALSE(false, ESP_ERR_INVALID_STATE, err, TAG, "paddr block is mapped already, vaddr_start: %p, size: 0x%x", (void *)mem_block->vaddr_start, mem_block->size); + ESP_LOGD(TAG, "paddr block is mapped already, vaddr_start: %p, size: 0x%x", (void *)mem_block->vaddr_start, mem_block->size); + ret = ESP_ERR_INVALID_STATE; + goto err; } if (!allow_overlap && is_overlapped) { From f373165b24694fbc614419a85545fd237c80ed95 Mon Sep 17 00:00:00 2001 From: zhangyanjiao Date: Wed, 11 Dec 2024 17:56:01 +0800 Subject: [PATCH 097/213] fix(wifi): Added CVE-2024-53845 to vulnerabilities list --- docs/en/security/vulnerabilities.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/en/security/vulnerabilities.rst b/docs/en/security/vulnerabilities.rst index 00d87aad5ff..6cda3b51d01 100644 --- a/docs/en/security/vulnerabilities.rst +++ b/docs/en/security/vulnerabilities.rst @@ -10,6 +10,17 @@ This page briefly lists all of the vulnerabilities that are discovered and fixed CVE-2024 -------- +CVE-2024-53845 +~~~~~~~~~~~~~~ + +AES/CBC Constant IV Vulnerability in ESPTouch v2 + +* Espressif Advisory: NA (Published on GitHub) +* Impact: Applicable for ESP-IDF +* Resolution: Please see advisory for details +* Advisory pointer: `GHSA-wm57-466g-mhrr`_ + + CVE-2024-30949 ~~~~~~~~~~~~~~ @@ -183,3 +194,4 @@ Security Advisory Concerning Wi-Fi Authentication Bypass .. _`AR2024-003`: https://www.espressif.com/sites/default/files/advisory_downloads/AR2024-003%20Security%20Advisory%20for%20PEAP%20Phase-2%20authentication%20EN.pdf .. _`GHSA-22x6-3756-pfp8` : https://github.com/espressif/esp-idf/security/advisories/GHSA-22x6-3756-pfp8 .. _`GHSA-7f7f-jj2q-28wm` : https://github.com/espressif/esp-idf/security/advisories/GHSA-7f7f-jj2q-28wm +.. _`GHSA-wm57-466g-mhrr` : https://github.com/espressif/esp-idf/security/advisories/GHSA-wm57-466g-mhrr From cf21272c94b35331ac9663a3919af4c77ff4c6dd Mon Sep 17 00:00:00 2001 From: zhangyanjiao Date: Thu, 12 Jun 2025 15:51:21 +0800 Subject: [PATCH 098/213] fix(wifi): Added CVE-2025-52471 to vulnerabilities list --- docs/en/security/vulnerabilities.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/en/security/vulnerabilities.rst b/docs/en/security/vulnerabilities.rst index 6cda3b51d01..4522645d23e 100644 --- a/docs/en/security/vulnerabilities.rst +++ b/docs/en/security/vulnerabilities.rst @@ -7,6 +7,20 @@ This page briefly lists all of the vulnerabilities that are discovered and fixed .. note:: Please refer to ``latest`` version of this documentation guide for up-to-date information. +CVE-2025 +-------- + +CVE-2025-52471 +~~~~~~~~~~~~~~ + +ESP-NOW Integer Underflow Vulnerability Advisory + +* Espressif Advisory: NA (Published on GitHub) +* Impact: Applicable for ESP-IDF +* Resolution: Please see advisory for details +* Advisory pointer: `GHSA-hqhh-cp47-fv5g`_ + + CVE-2024 -------- @@ -195,3 +209,4 @@ Security Advisory Concerning Wi-Fi Authentication Bypass .. _`GHSA-22x6-3756-pfp8` : https://github.com/espressif/esp-idf/security/advisories/GHSA-22x6-3756-pfp8 .. _`GHSA-7f7f-jj2q-28wm` : https://github.com/espressif/esp-idf/security/advisories/GHSA-7f7f-jj2q-28wm .. _`GHSA-wm57-466g-mhrr` : https://github.com/espressif/esp-idf/security/advisories/GHSA-wm57-466g-mhrr +.. _`GHSA-hqhh-cp47-fv5g` : https://github.com/espressif/esp-idf/security/advisories/GHSA-hqhh-cp47-fv5g From 9d2cfcd0949f6073d2d08a61f72fb43292ad6db1 Mon Sep 17 00:00:00 2001 From: "harshal.patil" Date: Fri, 20 Jun 2025 10:50:28 +0530 Subject: [PATCH 099/213] fix(bootlaoder): Fix documentation as ESP32 does not support secure download mode --- components/bootloader/Kconfig.projbuild | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bootloader/Kconfig.projbuild b/components/bootloader/Kconfig.projbuild index 6c86b14e288..f949ee693d2 100644 --- a/components/bootloader/Kconfig.projbuild +++ b/components/bootloader/Kconfig.projbuild @@ -1223,7 +1223,7 @@ menu "Security features" It is also possible to enable secure download mode at runtime by calling esp_efuse_enable_rom_secure_download_mode() - Note: Secure Download mode is not available for ESP32 (includes revisions till ECO3). + Note: Secure Download mode is not available for ESP32. config SECURE_INSECURE_ALLOW_DL_MODE bool "UART ROM download mode (Enabled (not recommended))" From f9dc7e7491ad7db9870800e33faed2f8ab79d3b8 Mon Sep 17 00:00:00 2001 From: zwx Date: Wed, 4 Jun 2025 12:28:06 +0800 Subject: [PATCH 100/213] feat(openthread): support openthread cli console command register --- components/openthread/Kconfig | 7 ++++ .../openthread/include/esp_openthread_cli.h | 30 ++++++++++++-- .../openthread/src/esp_openthread_cli.c | 40 +++++++++++++++++-- 3 files changed, 71 insertions(+), 6 deletions(-) diff --git a/components/openthread/Kconfig b/components/openthread/Kconfig index bca02ec1fb2..afbd187b93f 100644 --- a/components/openthread/Kconfig +++ b/components/openthread/Kconfig @@ -44,6 +44,13 @@ menu "OpenThread" default y help Select this option to enable Command-Line Interface in OpenThread. + + config OPENTHREAD_CONSOLE_COMMAND_PREFIX + string "The prefix of the openthread CLI command registered on the esp console" + default "ot" + help + A prefix string used before a Thread CLI command, allowing the ESP console to identify + it and delegate the remaining command to the OpenThread callback for processing. endmenu menu "Thread Core Features" diff --git a/components/openthread/include/esp_openthread_cli.h b/components/openthread/include/esp_openthread_cli.h index 554d0c755cc..0bc7741a9c5 100644 --- a/components/openthread/include/esp_openthread_cli.h +++ b/components/openthread/include/esp_openthread_cli.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -13,6 +13,14 @@ extern "C" { /** * @brief This function initializes the OpenThread command line interface(CLI). * + * @note There are two ways to initialize the OpenThread CLI: + * 1. By creating a dedicated task via `esp_openthread_cli_create_task` + * + * 2. By registering a console command with the ESP console via + * `esp_openthread_cli_console_command_register` + * If using this approach, the user must initialize the interface used + * by the console and also initialize esp_console manually. Additionally, + * the `host_connection_mode` should be set to `HOST_CONNECTION_MODE_NONE`. */ void esp_openthread_cli_init(void); @@ -34,11 +42,27 @@ esp_err_t esp_openthread_cli_input(const char *line); /** * @brief This function launches an exclusive loop for the OpenThread CLI. * - * @param[in] priority The priority of the created task. - * */ void esp_openthread_cli_create_task(void); +/** + * @brief This function registers an ESP Console command for the OpenThread CLI. + * + * @return + * - ESP_OK on success + * - ESP_ERR_NO_MEM if allocation has failed + */ +esp_err_t esp_openthread_cli_console_command_register(void); + +/** + * @brief This function deregisters the ESP Console command for the OpenThread CLI. + * + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if command is not registered + */ +esp_err_t esp_openthread_cli_console_command_unregister(void); + #ifdef __cplusplus } #endif diff --git a/components/openthread/src/esp_openthread_cli.c b/components/openthread/src/esp_openthread_cli.c index b2a76a4df0c..b7e1b933f90 100644 --- a/components/openthread/src/esp_openthread_cli.c +++ b/components/openthread/src/esp_openthread_cli.c @@ -1,14 +1,13 @@ /* - * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ -#include "esp_openthread_cli.h" #include #include - +#include "sdkconfig.h" #include "openthread/cli.h" #include "esp_check.h" @@ -16,6 +15,7 @@ #include "esp_log.h" #include "esp_openthread.h" #include "esp_openthread_common_macro.h" +#include "esp_openthread_cli.h" #include "esp_openthread_task_queue.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" @@ -63,6 +63,40 @@ esp_err_t esp_openthread_cli_input(const char *line) return esp_openthread_task_queue_post(line_handle_task, line_copy); } +static int ot_cli_console_callback(int argc, char **argv) +{ + char cli_cmd[OT_CLI_MAX_LINE_LENGTH] = {0}; + strncpy(cli_cmd, argv[1], sizeof(cli_cmd) - strlen(cli_cmd) - 1); + for (int i = 2; i < argc; i++) { + strncat(cli_cmd, " ", sizeof(cli_cmd) - strlen(cli_cmd) - 1); + strncat(cli_cmd, argv[i], sizeof(cli_cmd) - strlen(cli_cmd) - 1); + } + s_cli_task = xTaskGetCurrentTaskHandle(); + if (esp_openthread_cli_input(cli_cmd) == ESP_OK) { + xTaskNotifyWait(0, 0, NULL, portMAX_DELAY); + } else { + printf("Openthread task is busy, failed to run command: %s\n", cli_cmd); + } + s_cli_task = NULL; + return 0; +} + +esp_err_t esp_openthread_cli_console_command_register(void) +{ + esp_console_cmd_t cmd = { + .command = CONFIG_OPENTHREAD_CONSOLE_COMMAND_PREFIX, + .help = "Execute `"CONFIG_OPENTHREAD_CONSOLE_COMMAND_PREFIX" ...` to run openthread cli", + .hint = NULL, + .func = ot_cli_console_callback, + }; + return esp_console_cmd_register(&cmd); +} + +esp_err_t esp_openthread_cli_console_command_unregister(void) +{ + return esp_console_cmd_deregister(CONFIG_OPENTHREAD_CONSOLE_COMMAND_PREFIX); +} + static void ot_cli_loop(void *context) { int ret = 0; From 84ac9e2054a590bb459d5adc6ad3030c405e9f19 Mon Sep 17 00:00:00 2001 From: Xu Si Yu Date: Fri, 30 May 2025 19:57:02 +0800 Subject: [PATCH 101/213] feat(openthread): optimize trel reception --- components/openthread/Kconfig | 8 + .../private_include/esp_openthread_common.h | 15 ++ .../private_include/esp_openthread_radio.h | 21 +++ .../src/port/esp_openthread_radio.c | 8 +- .../openthread/src/port/esp_openthread_trel.c | 163 +++++++++++------- examples/openthread/ot_br/main/esp_ot_br.c | 19 +- .../openthread/ot_trel/main/esp_ot_trel.c | 3 +- 7 files changed, 164 insertions(+), 73 deletions(-) create mode 100644 components/openthread/private_include/esp_openthread_common.h diff --git a/components/openthread/Kconfig b/components/openthread/Kconfig index afbd187b93f..00dc172ed7c 100644 --- a/components/openthread/Kconfig +++ b/components/openthread/Kconfig @@ -137,6 +137,14 @@ menu "OpenThread" default 12390 help Configure the port number of TREL service. + + config OPENTHREAD_TREL_BUFFER_SIZE + int "The receive buffer size of openthread trel" + depends on OPENTHREAD_RADIO_TREL + range 10 255 + default 50 + help + Configure the receive buffer size of TREL service. endmenu menu "Thread 15.4 Radio Link" diff --git a/components/openthread/private_include/esp_openthread_common.h b/components/openthread/private_include/esp_openthread_common.h new file mode 100644 index 00000000000..321b3c8e07e --- /dev/null +++ b/components/openthread/private_include/esp_openthread_common.h @@ -0,0 +1,15 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include + +typedef struct { + uint8_t head; + uint8_t tail; + atomic_uint_fast8_t used; +} esp_openthread_circular_queue_info_t; diff --git a/components/openthread/private_include/esp_openthread_radio.h b/components/openthread/private_include/esp_openthread_radio.h index 4b9aa4555f6..ae7550471b1 100644 --- a/components/openthread/private_include/esp_openthread_radio.h +++ b/components/openthread/private_include/esp_openthread_radio.h @@ -84,6 +84,27 @@ void esp_openthread_set_coex_config(esp_ieee802154_coex_config_t config); * */ esp_ieee802154_coex_config_t esp_openthread_get_coex_config(void); + +/** + * @brief This function updates the TREL fds and timeouts to the main loop. + * + * @param[inout] mainloop The main loop context. + * + */ +void esp_openthread_trel_update(esp_openthread_mainloop_context_t *mainloop); + +/** + * @brief This function performs the OpenThread TREL process. + * + * @param[in] instance The OpenThread instance. + * @param[in] mainloop The main loop context. + * + * @return + * - ESP_OK on success + * - ESP_FAIL on failure + * + */ +esp_err_t esp_openthread_trel_process(otInstance *aInstance, const esp_openthread_mainloop_context_t *mainloop); #endif #ifdef __cplusplus diff --git a/components/openthread/src/port/esp_openthread_radio.c b/components/openthread/src/port/esp_openthread_radio.c index 28062b4afd5..cc9a4a280b8 100644 --- a/components/openthread/src/port/esp_openthread_radio.c +++ b/components/openthread/src/port/esp_openthread_radio.c @@ -4,7 +4,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include #include "esp_openthread_radio.h" #include "esp_err.h" @@ -13,6 +12,7 @@ #include "esp_ieee802154.h" #include "esp_ieee802154_types.h" #include "esp_mac.h" +#include "esp_openthread_common.h" #include "esp_openthread_common_macro.h" #include "esp_openthread_platform.h" #include "esp_openthread_types.h" @@ -52,12 +52,6 @@ typedef struct { uint8_t psdu[OT_RADIO_FRAME_MAX_SIZE]; } esp_openthread_radio_tx_psdu; -typedef struct { - uint8_t head; - uint8_t tail; - atomic_uint_fast8_t used; -} esp_openthread_circular_queue_info_t; - static otRadioFrame s_transmit_frame; static esp_openthread_radio_tx_psdu s_transmit_psdu; diff --git a/components/openthread/src/port/esp_openthread_trel.c b/components/openthread/src/port/esp_openthread_trel.c index 3c56e7a1c17..eae1c04219f 100644 --- a/components/openthread/src/port/esp_openthread_trel.c +++ b/components/openthread/src/port/esp_openthread_trel.c @@ -18,10 +18,12 @@ #include "esp_netif_ip_addr.h" #include "esp_openthread.h" #include "esp_openthread_border_router.h" +#include "esp_openthread_common.h" #include "esp_openthread_common_macro.h" #include "esp_openthread_lock.h" +#include "esp_openthread_platform.h" #include "esp_openthread_radio.h" -#include "esp_openthread_task_queue.h" +#include "esp_vfs_eventfd.h" #include "lwip/pbuf.h" #include "lwip/tcpip.h" #include "lwip/udp.h" @@ -54,6 +56,10 @@ typedef struct { static ot_trel_t s_ot_trel = {CONFIG_OPENTHREAD_TREL_PORT, NULL}; static bool s_is_service_registered = false; +static ot_trel_recv_task_t s_trel_receive_buffer[CONFIG_OPENTHREAD_TREL_BUFFER_SIZE]; +static esp_openthread_circular_queue_info_t s_recv_queue = {.head = 0, .tail = 0, .used = 0}; +static const char *s_trel_workflow = "trel"; +static int s_trel_event_fd = -1; static void trel_browse_notifier(mdns_result_t *result) { @@ -89,55 +95,27 @@ static void trel_browse_notifier(mdns_result_t *result) } } -static void trel_recv_task(void *ctx) -{ - esp_err_t ret = ESP_OK; - OT_UNUSED_VARIABLE(ret); - ot_trel_recv_task_t *task_ctx = (ot_trel_recv_task_t *)ctx; - struct pbuf *recv_buf = task_ctx->p; - uint8_t *data_buf = (uint8_t *)recv_buf->payload; - uint8_t *data_buf_to_free = NULL; - uint16_t length = recv_buf->len; - - if (recv_buf->next != NULL) { - data_buf = (uint8_t *)malloc(recv_buf->tot_len); - ESP_GOTO_ON_FALSE(data_buf, ESP_ERR_NO_MEM, exit, OT_PLAT_LOG_TAG, "Failed to allocate data buf when receiving Thread TREL message"); - length = recv_buf->tot_len; - data_buf_to_free = data_buf; - pbuf_copy_partial(recv_buf, data_buf, recv_buf->tot_len, 0); - } - otPlatTrelHandleReceived(esp_openthread_get_instance(), data_buf, length, task_ctx->source_addr); - -exit: - if (recv_buf) { - pbuf_free(recv_buf); - } - free(data_buf_to_free); - free(task_ctx->source_addr); - free(task_ctx); -} - -// TZ-1704 static void handle_trel_udp_recv(void *ctx, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, uint16_t port) { esp_err_t ret = ESP_OK; + otSockAddr *source_addr = NULL; + uint64_t event_trel_rx = 1; ESP_LOGD(OT_PLAT_LOG_TAG, "Receive from %s:%d", ip6addr_ntoa(&(addr->u_addr.ip6)), port); + ESP_GOTO_ON_FALSE(atomic_load(&s_recv_queue.used) < CONFIG_OPENTHREAD_TREL_BUFFER_SIZE, ESP_ERR_NO_MEM, exit, OT_PLAT_LOG_TAG, "trel receive buffer full!"); + source_addr = (otSockAddr *)malloc(sizeof(otSockAddr)); + ESP_GOTO_ON_FALSE(source_addr, ESP_ERR_NO_MEM, exit, OT_PLAT_LOG_TAG, "Failed to allocate buf for Thread TREL"); - ot_trel_recv_task_t *task_ctx = (ot_trel_recv_task_t *)malloc(sizeof(ot_trel_recv_task_t)); - ESP_GOTO_ON_FALSE(task_ctx, ESP_ERR_NO_MEM, exit, OT_PLAT_LOG_TAG, "Failed to allocate buf for Thread TREL"); - task_ctx->p = p; - task_ctx->source_addr = (otSockAddr *)malloc(sizeof(otSockAddr)); - ESP_GOTO_ON_FALSE(task_ctx->source_addr, ESP_ERR_NO_MEM, exit, OT_PLAT_LOG_TAG, "Failed to allocate buf for Thread TREL"); - memset(task_ctx->source_addr, 0, sizeof(otSockAddr)); - task_ctx->source_addr->mPort = port; - memcpy(&task_ctx->source_addr->mAddress.mFields.m32, addr->u_addr.ip6.addr, sizeof(addr->u_addr.ip6.addr)); - - ESP_GOTO_ON_ERROR(esp_openthread_task_queue_post(trel_recv_task, task_ctx), exit, OT_PLAT_LOG_TAG, "Failed to receive OpenThread TREL message"); + memset(source_addr, 0, sizeof(otSockAddr)); + source_addr->mPort = port; + memcpy(&source_addr->mAddress.mFields.m32, addr->u_addr.ip6.addr, sizeof(addr->u_addr.ip6.addr)); + s_trel_receive_buffer[s_recv_queue.tail].source_addr = source_addr; + s_trel_receive_buffer[s_recv_queue.tail].p = p; + s_recv_queue.tail = (s_recv_queue.tail + 1) % CONFIG_OPENTHREAD_TREL_BUFFER_SIZE; + atomic_fetch_add(&s_recv_queue.used, 1); + assert(write(s_trel_event_fd, &event_trel_rx, sizeof(event_trel_rx)) == sizeof(event_trel_rx)); exit: if (ret != ESP_OK) { - free(task_ctx->source_addr); - free(task_ctx); if (p) { pbuf_free(p); } @@ -146,25 +124,76 @@ exit: static esp_err_t ot_new_trel(void *ctx) { - ot_trel_t *task = (ot_trel_t *)ctx; + s_ot_trel.trel_pcb = udp_new(); + ESP_RETURN_ON_FALSE(s_ot_trel.trel_pcb != NULL, ESP_ERR_NO_MEM, OT_PLAT_LOG_TAG, "Failed to create a new UDP pcb"); + udp_bind(s_ot_trel.trel_pcb, IP6_ADDR_ANY, s_ot_trel.port); + udp_recv(s_ot_trel.trel_pcb, handle_trel_udp_recv, NULL); + return ESP_OK; +} + +void esp_openthread_trel_update(esp_openthread_mainloop_context_t *mainloop) +{ + FD_SET(s_trel_event_fd, &mainloop->read_fds); + if (s_trel_event_fd > mainloop->max_fd) { + mainloop->max_fd = s_trel_event_fd; + } +} + +esp_err_t esp_openthread_trel_process(otInstance *aInstance, const esp_openthread_mainloop_context_t *mainloop) +{ + uint64_t event_read = 0; + assert(read(s_trel_event_fd, &event_read, sizeof(event_read)) == sizeof(event_read)); + struct pbuf *recv_buf = NULL; + uint8_t *data_buf = NULL; + uint16_t length = 0; + otSockAddr *source_addr = NULL; + + while (atomic_load(&s_recv_queue.used)) { + if (s_trel_receive_buffer[s_recv_queue.head].p != NULL) { + + uint8_t *data_buf_to_free = NULL; + bool should_handle = true; + recv_buf = s_trel_receive_buffer[s_recv_queue.head].p; + data_buf = (uint8_t *)recv_buf->payload; + length = recv_buf->len; + source_addr = s_trel_receive_buffer[s_recv_queue.head].source_addr; + + if (recv_buf->next != NULL) { + data_buf = (uint8_t *)malloc(recv_buf->tot_len); + if (data_buf) { + pbuf_copy_partial(recv_buf, data_buf, recv_buf->tot_len, 0); + } else { + should_handle = false; + } + length = recv_buf->tot_len; + data_buf_to_free = data_buf; + } + if (should_handle) { + otPlatTrelHandleReceived(aInstance, data_buf, length, source_addr); + } + pbuf_free(recv_buf); + free(data_buf_to_free); + free(source_addr); + + s_recv_queue.head = (s_recv_queue.head + 1) % CONFIG_OPENTHREAD_TREL_BUFFER_SIZE; + atomic_fetch_sub(&s_recv_queue.used, 1); + } + } - task->trel_pcb = udp_new(); - ESP_RETURN_ON_FALSE(task->trel_pcb != NULL, ESP_ERR_NO_MEM, OT_PLAT_LOG_TAG, "Failed to create a new UDP pcb"); - udp_bind(task->trel_pcb, IP6_ADDR_ANY, task->port); - udp_recv(task->trel_pcb, handle_trel_udp_recv, NULL); return ESP_OK; } void otPlatTrelEnable(otInstance *aInstance, uint16_t *aUdpPort) { + ESP_RETURN_ON_FALSE(s_trel_event_fd == -1, , OT_PLAT_LOG_TAG, "ot trel has been initialized."); + s_trel_event_fd = eventfd(0, 0); + assert(s_trel_event_fd >= 0); *aUdpPort = s_ot_trel.port; esp_openthread_task_switching_lock_release(); - esp_err_t err = esp_netif_tcpip_exec(ot_new_trel, &s_ot_trel); - if (err != ESP_OK) { - ESP_LOGE(OT_PLAT_LOG_TAG, "Fail to create trel udp"); - } + ESP_ERROR_CHECK(esp_netif_tcpip_exec(ot_new_trel, NULL)); mdns_browse_new(TREL_MDNS_TYPE, TREL_MDNS_PROTO, trel_browse_notifier); esp_openthread_task_switching_lock_acquire(portMAX_DELAY); + ESP_ERROR_CHECK(esp_openthread_platform_workflow_register(&esp_openthread_trel_update, &esp_openthread_trel_process, s_trel_workflow)); } static esp_err_t trel_send_task(void *ctx) @@ -263,23 +292,41 @@ void otPlatTrelResetCounters(otInstance *aInstance) memset(&s_trel_counters, 0, sizeof(otPlatTrelCounters)); } -static void trel_disable_task(void *ctx) +static esp_err_t trel_disable_task(void *ctx) { - struct udp_pcb *pcb = (struct udp_pcb *)ctx; - udp_remove(pcb); + if (ctx) { + struct udp_pcb *pcb = (struct udp_pcb *)ctx; + udp_remove(pcb); + } + return ESP_OK; +} + +static void free_all_buffer(void) +{ + while (atomic_load(&s_recv_queue.used)) { + if (s_trel_receive_buffer[s_recv_queue.head].p != NULL) { + pbuf_free(s_trel_receive_buffer[s_recv_queue.head].p); + free(s_trel_receive_buffer[s_recv_queue.head].source_addr); + s_recv_queue.head = (s_recv_queue.head + 1) % CONFIG_OPENTHREAD_TREL_BUFFER_SIZE; + atomic_fetch_sub(&s_recv_queue.used, 1); + } + } } void otPlatTrelDisable(otInstance *aInstance) { + ESP_RETURN_ON_FALSE(s_trel_event_fd >= 0, , OT_PLAT_LOG_TAG, "ot trel is not initialized."); esp_openthread_task_switching_lock_release(); - if (s_ot_trel.trel_pcb) { - tcpip_callback(trel_disable_task, s_ot_trel.trel_pcb); - } + esp_netif_tcpip_exec(trel_disable_task, s_ot_trel.trel_pcb); + s_ot_trel.trel_pcb = NULL; mdns_service_remove(TREL_MDNS_TYPE, TREL_MDNS_PROTO); s_is_service_registered = false; mdns_browse_delete(TREL_MDNS_TYPE, TREL_MDNS_PROTO); esp_openthread_task_switching_lock_acquire(portMAX_DELAY); - s_ot_trel.trel_pcb = NULL; + esp_openthread_platform_workflow_unregister(s_trel_workflow); + free_all_buffer(); + close(s_trel_event_fd); + s_trel_event_fd = -1; } const otPlatTrelCounters *otPlatTrelGetCounters(otInstance *aInstance) diff --git a/examples/openthread/ot_br/main/esp_ot_br.c b/examples/openthread/ot_br/main/esp_ot_br.c index bbd5ae3f0a3..ffcfd391579 100644 --- a/examples/openthread/ot_br/main/esp_ot_br.c +++ b/examples/openthread/ot_br/main/esp_ot_br.c @@ -199,15 +199,20 @@ void app_main(void) // * netif // * task queue // * border router - esp_vfs_eventfd_config_t eventfd_config = { + size_t max_eventfd = 3; + #if CONFIG_OPENTHREAD_RADIO_NATIVE || CONFIG_OPENTHREAD_RADIO_SPINEL_SPI - // * radio driver (A native radio device needs a eventfd for radio driver.) - // * SpiSpinelInterface (The Spi Spinel Interface needs a eventfd.) - // The above will not exist at the same time. - .max_fds = 4, -#else - .max_fds = 3, + // * radio driver (A native radio device needs a eventfd for radio driver.) + // * SpiSpinelInterface (The Spi Spinel Interface needs a eventfd.) + // The above will not exist at the same time. + max_eventfd++; #endif +#if CONFIG_OPENTHREAD_RADIO_TREL + // * TREL reception (The Thread Radio Encapsulation Link needs a eventfd for reception.) + max_eventfd++; +#endif + esp_vfs_eventfd_config_t eventfd_config = { + .max_fds = max_eventfd, }; ESP_ERROR_CHECK(esp_vfs_eventfd_register(&eventfd_config)); ESP_ERROR_CHECK(nvs_flash_init()); diff --git a/examples/openthread/ot_trel/main/esp_ot_trel.c b/examples/openthread/ot_trel/main/esp_ot_trel.c index 05b7251da4f..a333eface5f 100644 --- a/examples/openthread/ot_trel/main/esp_ot_trel.c +++ b/examples/openthread/ot_trel/main/esp_ot_trel.c @@ -125,8 +125,9 @@ void app_main(void) // Used eventfds: // * netif // * ot task queue + // * ot trel esp_vfs_eventfd_config_t eventfd_config = { - .max_fds = 2, + .max_fds = 3, }; ESP_ERROR_CHECK(nvs_flash_init()); From 75ae28d232d79cc6f8b2fcb2abc2b10c351c056c Mon Sep 17 00:00:00 2001 From: Xu Si Yu Date: Thu, 29 May 2025 16:21:36 +0800 Subject: [PATCH 102/213] feat(openthread): handle MeshCoP mDNS service in state change callback --- .../include/esp_openthread_border_router.h | 8 ++++ .../include/esp_openthread_meshcop_mdns.h | 41 +++++++++++++++++++ .../private_include/esp_openthread_state.h | 7 +++- .../src/port/esp_openthread_state.c | 21 ++++++++++ 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 components/openthread/include/esp_openthread_meshcop_mdns.h diff --git a/components/openthread/include/esp_openthread_border_router.h b/components/openthread/include/esp_openthread_border_router.h index 6fe915bc537..e78c28bddd1 100644 --- a/components/openthread/include/esp_openthread_border_router.h +++ b/components/openthread/include/esp_openthread_border_router.h @@ -76,6 +76,14 @@ esp_netif_t *esp_openthread_get_backbone_netif(void); */ esp_err_t esp_openthread_set_meshcop_instance_name(const char *instance_name); +/** + * @brief Gets the meshcop(e) instance name. + * + * @return The instance name. + * + */ +const char* esp_openthread_get_meshcop_instance_name(void); + #ifdef __cplusplus } #endif diff --git a/components/openthread/include/esp_openthread_meshcop_mdns.h b/components/openthread/include/esp_openthread_meshcop_mdns.h new file mode 100644 index 00000000000..4e2c5926fab --- /dev/null +++ b/components/openthread/include/esp_openthread_meshcop_mdns.h @@ -0,0 +1,41 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include "esp_openthread.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Publishes the OpenThread meshcop service in mDNS + * + * @param[in] instance_name Instance name of meshcop mDNS service + * + * @return + * - ESP_OK success + * - ESP_ERR_NO_MEM memory error + * - ESP_FAIL failed to add service + * + */ +esp_err_t esp_openthread_publish_meshcop_mdns(const char *instance_name); + +/** + * @brief Removes the OpenThread meshcop service in mDNS + * + * @return + * - ESP_OK success + * - ESP_ERR_NO_MEM memory error + * - ESP_FAIL failed to remove service + * + */ +esp_err_t esp_openthread_remove_meshcop_mdns(void); + +#ifdef __cplusplus +} +#endif diff --git a/components/openthread/private_include/esp_openthread_state.h b/components/openthread/private_include/esp_openthread_state.h index e2ee3508059..91d69c4283c 100644 --- a/components/openthread/private_include/esp_openthread_state.h +++ b/components/openthread/private_include/esp_openthread_state.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -10,6 +10,11 @@ #include #include +#define ESP_OPENTHREAD_BORDER_ROUTER_FLAG_OF_INTEREST \ + (OT_CHANGED_THREAD_ROLE | OT_CHANGED_THREAD_EXT_PANID | OT_CHANGED_THREAD_NETWORK_NAME | \ + OT_CHANGED_ACTIVE_DATASET | OT_CHANGED_THREAD_PARTITION_ID | OT_CHANGED_THREAD_BACKBONE_ROUTER_STATE | \ + OT_CHANGED_PSKC) + #ifdef __cplusplus extern "C" { #endif diff --git a/components/openthread/src/port/esp_openthread_state.c b/components/openthread/src/port/esp_openthread_state.c index 153d343ea1e..bc2641d9053 100644 --- a/components/openthread/src/port/esp_openthread_state.c +++ b/components/openthread/src/port/esp_openthread_state.c @@ -10,7 +10,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -19,6 +21,19 @@ #define TAG "OT_STATE" +#if CONFIG_OPENTHREAD_BORDER_ROUTER +static void handle_ot_border_router_state_changed(otInstance* instance) +{ + otDeviceRole role = otThreadGetDeviceRole(esp_openthread_get_instance()); + + if (role == OT_DEVICE_ROLE_CHILD || role == OT_DEVICE_ROLE_ROUTER || role == OT_DEVICE_ROLE_LEADER) { + esp_openthread_publish_meshcop_mdns(esp_openthread_get_meshcop_instance_name()); + } else { + esp_openthread_remove_meshcop_mdns(); + } +} +#endif + static void handle_ot_netif_state_change(otInstance* instance) { if (otIp6IsEnabled(instance)) { @@ -123,6 +138,12 @@ static void ot_state_change_callback(otChangedFlags changed_flags, void* ctx) return; } +#if CONFIG_OPENTHREAD_BORDER_ROUTER + if (changed_flags & ESP_OPENTHREAD_BORDER_ROUTER_FLAG_OF_INTEREST) { + handle_ot_border_router_state_changed(instance); + } +#endif + if (changed_flags & OT_CHANGED_THREAD_ROLE) { handle_ot_role_change(instance); } From 05a3159e597f25885e14221ba8e7ba1e5da63b0b Mon Sep 17 00:00:00 2001 From: Xu Si Yu Date: Thu, 29 May 2025 16:50:41 +0800 Subject: [PATCH 103/213] feat(openthread): update openthread upstream --- components/openthread/openthread | 2 +- components/openthread/sbom_openthread.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/openthread/openthread b/components/openthread/openthread index ec2b0d48735..b945928d722 160000 --- a/components/openthread/openthread +++ b/components/openthread/openthread @@ -1 +1 @@ -Subproject commit ec2b0d487356d2955346457a6515201039140037 +Subproject commit b945928d722177cd9caeab2e1025499628c101ef diff --git a/components/openthread/sbom_openthread.yml b/components/openthread/sbom_openthread.yml index 789349f8276..51447eac610 100644 --- a/components/openthread/sbom_openthread.yml +++ b/components/openthread/sbom_openthread.yml @@ -5,4 +5,4 @@ supplier: 'Organization: Espressif Systems (Shanghai) CO LTD' originator: 'Organization: Google LLC' description: OpenThread released by Google is an open-source implementation of the Thread networking url: https://github.com/espressif/openthread -hash: ec2b0d487356d2955346457a6515201039140037 +hash: b945928d722177cd9caeab2e1025499628c101ef From cb649d72018615e466935cc4d6875107aa8f9400 Mon Sep 17 00:00:00 2001 From: Marek Fiala Date: Fri, 11 Apr 2025 13:00:37 +0200 Subject: [PATCH 104/213] feat(tools): Update ccache 4.10.2 -> 4.11.2 Closes https://github.com/espressif/idf-installer/issues/305 --- tools/test_idf_tools/test_idf_tools.py | 404 ++++++++++++++----------- tools/tools.json | 10 +- 2 files changed, 227 insertions(+), 187 deletions(-) diff --git a/tools/test_idf_tools/test_idf_tools.py b/tools/test_idf_tools/test_idf_tools.py index 9bd6872d983..4966311a776 100755 --- a/tools/test_idf_tools/test_idf_tools.py +++ b/tools/test_idf_tools/test_idf_tools.py @@ -651,42 +651,42 @@ class TestUsageWin(TestUsage): self.assertIn('version installed in tools directory: ' + tool_version, output) output = self.run_idf_tools_with_action(['export']) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'esp32ulp-elf', ESP32ULP_VERSION, 'esp32ulp-elf', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'xtensa-esp-elf', XTENSA_ELF_VERSION, 'xtensa-esp-elf', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'openocd-esp32', OPENOCD_VERSION, 'openocd-esp32', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'riscv32-esp-elf', RISCV_ELF_VERSION, 'riscv32-esp-elf', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'xtensa-esp-elf-gdb', XTENSA_ESP_GDB_VERSION, 'xtensa-esp-elf-gdb', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'riscv32-esp-elf-gdb', RISCV_ESP_GDB_VERSION, 'riscv32-esp-elf-gdb', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'esp-rom-elfs', ESP_ROM_ELFS_VERSION - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', CMAKE, CMAKE_VERSION, 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', NINJA, NINJA_VERSION - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', IDF_EXE, IDF_EXE_VERSION - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', CCACHE, CCACHE_VERSION, 'ccache-4.10.2-windows-x86_64' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', DFU_UTIL, DFU_UTIL_VERSION, 'dfu-util-0.11-win64' - ), output) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', 'esp32ulp-elf', ESP32ULP_VERSION, 'esp32ulp-elf', 'bin'), output + ) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', 'xtensa-esp-elf', XTENSA_ELF_VERSION, 'xtensa-esp-elf', 'bin'), + output, + ) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', 'openocd-esp32', OPENOCD_VERSION, 'openocd-esp32', 'bin'), output + ) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', 'riscv32-esp-elf', RISCV_ELF_VERSION, 'riscv32-esp-elf', 'bin'), + output, + ) + self.assertIn( + os.path.join( + self.temp_tools_dir, 'tools', 'xtensa-esp-elf-gdb', XTENSA_ESP_GDB_VERSION, 'xtensa-esp-elf-gdb', 'bin' + ), + output, + ) + self.assertIn( + os.path.join( + self.temp_tools_dir, 'tools', 'riscv32-esp-elf-gdb', RISCV_ESP_GDB_VERSION, 'riscv32-esp-elf-gdb', 'bin' + ), + output, + ) + self.assertIn(os.path.join(self.temp_tools_dir, 'tools', 'esp-rom-elfs', ESP_ROM_ELFS_VERSION), output) + self.assertIn(os.path.join(self.temp_tools_dir, 'tools', CMAKE, CMAKE_VERSION, 'bin'), output) + self.assertIn(os.path.join(self.temp_tools_dir, 'tools', NINJA, NINJA_VERSION), output) + self.assertIn(os.path.join(self.temp_tools_dir, 'tools', IDF_EXE, IDF_EXE_VERSION), output) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', CCACHE, CCACHE_VERSION, 'ccache-4.11.2-windows-x86_64'), output + ) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', DFU_UTIL, DFU_UTIL_VERSION, 'dfu-util-0.11-win64'), output + ) output = self.run_idf_tools_with_action(['list', '--outdated']) self.assertEqual('', output) @@ -744,42 +744,50 @@ class TestUsageWin(TestUsage): self.assertNotIn('version installed in tools directory: ' + DFU_UTIL_VERSION, output) output = self.run_idf_tools_with_action(['export']) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'esp32ulp-elf', ESP32ULP_VERSION, 'esp32ulp-elf', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'xtensa-esp-elf', XTENSA_ELF_VERSION, 'xtensa-esp-elf', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'openocd-esp32', OPENOCD_VERSION, 'openocd-esp32', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'xtensa-esp-elf-gdb', XTENSA_ESP_GDB_VERSION, 'xtensa-esp-elf-gdb', 'bin' - ), output) - self.assertNotIn(os.path.join( - self.temp_tools_dir, 'tools', 'riscv32-esp-elf', RISCV_ELF_VERSION, 'riscv32-esp-elf', 'bin' - ), output) - self.assertNotIn(os.path.join( - self.temp_tools_dir, 'tools', 'riscv32-esp-elf-gdb', RISCV_ESP_GDB_VERSION, 'riscv32-esp-elf-gdb', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'esp-rom-elfs', ESP_ROM_ELFS_VERSION, - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', CMAKE, CMAKE_VERSION, 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', NINJA, NINJA_VERSION - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', IDF_EXE, IDF_EXE_VERSION - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', CCACHE, CCACHE_VERSION, 'ccache-4.10.2-windows-x86_64' - ), output) - self.assertNotIn(os.path.join( - self.temp_tools_dir, 'tools', DFU_UTIL, DFU_UTIL_VERSION, 'dfu-util-0.11-win64' - ), output) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', 'esp32ulp-elf', ESP32ULP_VERSION, 'esp32ulp-elf', 'bin'), output + ) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', 'xtensa-esp-elf', XTENSA_ELF_VERSION, 'xtensa-esp-elf', 'bin'), + output, + ) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', 'openocd-esp32', OPENOCD_VERSION, 'openocd-esp32', 'bin'), output + ) + self.assertIn( + os.path.join( + self.temp_tools_dir, 'tools', 'xtensa-esp-elf-gdb', XTENSA_ESP_GDB_VERSION, 'xtensa-esp-elf-gdb', 'bin' + ), + output, + ) + self.assertNotIn( + os.path.join(self.temp_tools_dir, 'tools', 'riscv32-esp-elf', RISCV_ELF_VERSION, 'riscv32-esp-elf', 'bin'), + output, + ) + self.assertNotIn( + os.path.join( + self.temp_tools_dir, 'tools', 'riscv32-esp-elf-gdb', RISCV_ESP_GDB_VERSION, 'riscv32-esp-elf-gdb', 'bin' + ), + output, + ) + self.assertIn( + os.path.join( + self.temp_tools_dir, + 'tools', + 'esp-rom-elfs', + ESP_ROM_ELFS_VERSION, + ), + output, + ) + self.assertIn(os.path.join(self.temp_tools_dir, 'tools', CMAKE, CMAKE_VERSION, 'bin'), output) + self.assertIn(os.path.join(self.temp_tools_dir, 'tools', NINJA, NINJA_VERSION), output) + self.assertIn(os.path.join(self.temp_tools_dir, 'tools', IDF_EXE, IDF_EXE_VERSION), output) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', CCACHE, CCACHE_VERSION, 'ccache-4.11.2-windows-x86_64'), output + ) + self.assertNotIn( + os.path.join(self.temp_tools_dir, 'tools', DFU_UTIL, DFU_UTIL_VERSION, 'dfu-util-0.11-win64'), output + ) def test_tools_for_esp32c3_win(self): required_tools_installed = 8 @@ -806,39 +814,44 @@ class TestUsageWin(TestUsage): self.assertNotIn('version installed in tools directory: ' + DFU_UTIL_VERSION, output) output = self.run_idf_tools_with_action(['export']) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'openocd-esp32', OPENOCD_VERSION, 'openocd-esp32', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'riscv32-esp-elf', RISCV_ELF_VERSION, 'riscv32-esp-elf', 'bin' - ), output) - self.assertNotIn(os.path.join( - self.temp_tools_dir, 'tools', 'esp32ulp-elf', ESP32ULP_VERSION, 'esp32ulp-elf', 'bin' - ), output) - self.assertNotIn(os.path.join( - self.temp_tools_dir, 'tools', 'xtensa-esp-elf', XTENSA_ELF_VERSION, 'xtensa-esp-elf', 'bin' - ), output) - self.assertNotIn(os.path.join( - self.temp_tools_dir, 'tools', 'xtensa-esp-elf-gdb', XTENSA_ESP_GDB_VERSION, 'xtensa-esp-elf-gdb', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'esp-rom-elfs', ESP_ROM_ELFS_VERSION, - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', CMAKE, CMAKE_VERSION, 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', NINJA, NINJA_VERSION - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', IDF_EXE, IDF_EXE_VERSION - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', CCACHE, CCACHE_VERSION, 'ccache-4.10.2-windows-x86_64' - ), output) - self.assertNotIn(os.path.join( - self.temp_tools_dir, 'tools', DFU_UTIL, DFU_UTIL_VERSION, 'dfu-util-0.11-win64' - ), output) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', 'openocd-esp32', OPENOCD_VERSION, 'openocd-esp32', 'bin'), output + ) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', 'riscv32-esp-elf', RISCV_ELF_VERSION, 'riscv32-esp-elf', 'bin'), + output, + ) + self.assertNotIn( + os.path.join(self.temp_tools_dir, 'tools', 'esp32ulp-elf', ESP32ULP_VERSION, 'esp32ulp-elf', 'bin'), output + ) + self.assertNotIn( + os.path.join(self.temp_tools_dir, 'tools', 'xtensa-esp-elf', XTENSA_ELF_VERSION, 'xtensa-esp-elf', 'bin'), + output, + ) + self.assertNotIn( + os.path.join( + self.temp_tools_dir, 'tools', 'xtensa-esp-elf-gdb', XTENSA_ESP_GDB_VERSION, 'xtensa-esp-elf-gdb', 'bin' + ), + output, + ) + self.assertIn( + os.path.join( + self.temp_tools_dir, + 'tools', + 'esp-rom-elfs', + ESP_ROM_ELFS_VERSION, + ), + output, + ) + self.assertIn(os.path.join(self.temp_tools_dir, 'tools', CMAKE, CMAKE_VERSION, 'bin'), output) + self.assertIn(os.path.join(self.temp_tools_dir, 'tools', NINJA, NINJA_VERSION), output) + self.assertIn(os.path.join(self.temp_tools_dir, 'tools', IDF_EXE, IDF_EXE_VERSION), output) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', CCACHE, CCACHE_VERSION, 'ccache-4.11.2-windows-x86_64'), output + ) + self.assertNotIn( + os.path.join(self.temp_tools_dir, 'tools', DFU_UTIL, DFU_UTIL_VERSION, 'dfu-util-0.11-win64'), output + ) def test_tools_for_esp32s2_win(self): required_tools_installed = 11 @@ -864,42 +877,50 @@ class TestUsageWin(TestUsage): self.assertIn('version installed in tools directory: ' + tool_version, output) output = self.run_idf_tools_with_action(['export']) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'xtensa-esp-elf', XTENSA_ELF_VERSION, 'xtensa-esp-elf', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'openocd-esp32', OPENOCD_VERSION, 'openocd-esp32', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'esp32ulp-elf', ESP32ULP_VERSION, 'esp32ulp-elf', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'riscv32-esp-elf', RISCV_ELF_VERSION, 'riscv32-esp-elf', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'xtensa-esp-elf-gdb', XTENSA_ESP_GDB_VERSION, 'xtensa-esp-elf-gdb', 'bin' - ), output) - self.assertNotIn(os.path.join( - self.temp_tools_dir, 'tools', 'riscv32-esp-elf-gdb', RISCV_ESP_GDB_VERSION, 'riscv32-esp-elf-gdb', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'esp-rom-elfs', ESP_ROM_ELFS_VERSION, - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', CMAKE, CMAKE_VERSION, 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', NINJA, NINJA_VERSION - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', IDF_EXE, IDF_EXE_VERSION - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', CCACHE, CCACHE_VERSION, 'ccache-4.10.2-windows-x86_64' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', DFU_UTIL, DFU_UTIL_VERSION, 'dfu-util-0.11-win64' - ), output) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', 'xtensa-esp-elf', XTENSA_ELF_VERSION, 'xtensa-esp-elf', 'bin'), + output, + ) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', 'openocd-esp32', OPENOCD_VERSION, 'openocd-esp32', 'bin'), output + ) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', 'esp32ulp-elf', ESP32ULP_VERSION, 'esp32ulp-elf', 'bin'), output + ) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', 'riscv32-esp-elf', RISCV_ELF_VERSION, 'riscv32-esp-elf', 'bin'), + output, + ) + self.assertIn( + os.path.join( + self.temp_tools_dir, 'tools', 'xtensa-esp-elf-gdb', XTENSA_ESP_GDB_VERSION, 'xtensa-esp-elf-gdb', 'bin' + ), + output, + ) + self.assertNotIn( + os.path.join( + self.temp_tools_dir, 'tools', 'riscv32-esp-elf-gdb', RISCV_ESP_GDB_VERSION, 'riscv32-esp-elf-gdb', 'bin' + ), + output, + ) + self.assertIn( + os.path.join( + self.temp_tools_dir, + 'tools', + 'esp-rom-elfs', + ESP_ROM_ELFS_VERSION, + ), + output, + ) + self.assertIn(os.path.join(self.temp_tools_dir, 'tools', CMAKE, CMAKE_VERSION, 'bin'), output) + self.assertIn(os.path.join(self.temp_tools_dir, 'tools', NINJA, NINJA_VERSION), output) + self.assertIn(os.path.join(self.temp_tools_dir, 'tools', IDF_EXE, IDF_EXE_VERSION), output) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', CCACHE, CCACHE_VERSION, 'ccache-4.11.2-windows-x86_64'), output + ) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', DFU_UTIL, DFU_UTIL_VERSION, 'dfu-util-0.11-win64'), output + ) def test_tools_for_esp32s3_win(self): required_tools_installed = 11 @@ -927,42 +948,50 @@ class TestUsageWin(TestUsage): self.assertIn('version installed in tools directory: ' + tool_version, output) output = self.run_idf_tools_with_action(['export']) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'openocd-esp32', OPENOCD_VERSION, 'openocd-esp32', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'xtensa-esp-elf', XTENSA_ELF_VERSION, 'xtensa-esp-elf', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'esp32ulp-elf', ESP32ULP_VERSION, 'esp32ulp-elf', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'riscv32-esp-elf', RISCV_ELF_VERSION, 'riscv32-esp-elf', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'xtensa-esp-elf-gdb', XTENSA_ESP_GDB_VERSION, 'xtensa-esp-elf-gdb', 'bin' - ), output) - self.assertNotIn(os.path.join( - self.temp_tools_dir, 'tools', 'riscv32-esp-elf-gdb', RISCV_ESP_GDB_VERSION, 'riscv32-esp-elf-gdb', 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', 'esp-rom-elfs', ESP_ROM_ELFS_VERSION, - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', CMAKE, CMAKE_VERSION, 'bin' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', NINJA, NINJA_VERSION - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', IDF_EXE, IDF_EXE_VERSION - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', CCACHE, CCACHE_VERSION, 'ccache-4.10.2-windows-x86_64' - ), output) - self.assertIn(os.path.join( - self.temp_tools_dir, 'tools', DFU_UTIL, DFU_UTIL_VERSION, 'dfu-util-0.11-win64' - ), output) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', 'openocd-esp32', OPENOCD_VERSION, 'openocd-esp32', 'bin'), output + ) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', 'xtensa-esp-elf', XTENSA_ELF_VERSION, 'xtensa-esp-elf', 'bin'), + output, + ) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', 'esp32ulp-elf', ESP32ULP_VERSION, 'esp32ulp-elf', 'bin'), output + ) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', 'riscv32-esp-elf', RISCV_ELF_VERSION, 'riscv32-esp-elf', 'bin'), + output, + ) + self.assertIn( + os.path.join( + self.temp_tools_dir, 'tools', 'xtensa-esp-elf-gdb', XTENSA_ESP_GDB_VERSION, 'xtensa-esp-elf-gdb', 'bin' + ), + output, + ) + self.assertNotIn( + os.path.join( + self.temp_tools_dir, 'tools', 'riscv32-esp-elf-gdb', RISCV_ESP_GDB_VERSION, 'riscv32-esp-elf-gdb', 'bin' + ), + output, + ) + self.assertIn( + os.path.join( + self.temp_tools_dir, + 'tools', + 'esp-rom-elfs', + ESP_ROM_ELFS_VERSION, + ), + output, + ) + self.assertIn(os.path.join(self.temp_tools_dir, 'tools', CMAKE, CMAKE_VERSION, 'bin'), output) + self.assertIn(os.path.join(self.temp_tools_dir, 'tools', NINJA, NINJA_VERSION), output) + self.assertIn(os.path.join(self.temp_tools_dir, 'tools', IDF_EXE, IDF_EXE_VERSION), output) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', CCACHE, CCACHE_VERSION, 'ccache-4.11.2-windows-x86_64'), output + ) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', DFU_UTIL, DFU_UTIL_VERSION, 'dfu-util-0.11-win64'), output + ) def test_tools_for_esp32p4_win(self): required_tools_installed = 8 @@ -994,11 +1023,22 @@ class TestUsageWin(TestUsage): self.assertIn(os.path.join(self.temp_tools_dir, 'tools', CMAKE, CMAKE_VERSION, 'bin'), output) self.assertIn(os.path.join(self.temp_tools_dir, 'tools', NINJA, NINJA_VERSION), output) self.assertIn(os.path.join(self.temp_tools_dir, 'tools', IDF_EXE, IDF_EXE_VERSION), output) - self.assertIn(os.path.join(self.temp_tools_dir, 'tools', CCACHE, CCACHE_VERSION, 'ccache-4.10.2-windows-x86_64'), output) - self.assertNotIn(os.path.join(self.temp_tools_dir, 'tools', XTENSA_ELF, XTENSA_ELF_VERSION, XTENSA_ELF, 'bin'), output) - self.assertNotIn(os.path.join(self.temp_tools_dir, 'tools', ESP32ULP, ESP32ULP_VERSION, ESP32ULP, 'bin'), output) - self.assertNotIn(os.path.join(self.temp_tools_dir, 'tools', XTENSA_ESP_GDB, XTENSA_ESP_GDB_VERSION, XTENSA_ESP_GDB, 'bin'), output) - self.assertNotIn(os.path.join(self.temp_tools_dir, 'tools', DFU_UTIL, DFU_UTIL_VERSION, 'dfu-util-0.11-win64'), output) + self.assertIn( + os.path.join(self.temp_tools_dir, 'tools', CCACHE, CCACHE_VERSION, 'ccache-4.11.2-windows-x86_64'), output + ) + self.assertNotIn( + os.path.join(self.temp_tools_dir, 'tools', XTENSA_ELF, XTENSA_ELF_VERSION, XTENSA_ELF, 'bin'), output + ) + self.assertNotIn( + os.path.join(self.temp_tools_dir, 'tools', ESP32ULP, ESP32ULP_VERSION, ESP32ULP, 'bin'), output + ) + self.assertNotIn( + os.path.join(self.temp_tools_dir, 'tools', XTENSA_ESP_GDB, XTENSA_ESP_GDB_VERSION, XTENSA_ESP_GDB, 'bin'), + output, + ) + self.assertNotIn( + os.path.join(self.temp_tools_dir, 'tools', DFU_UTIL, DFU_UTIL_VERSION, 'dfu-util-0.11-win64'), output + ) # a different test for qemu because of "on_request" def test_tools_for_qemu_with_required_win(self): diff --git a/tools/tools.json b/tools/tools.json index ca7f86be8fd..a42921281e0 100644 --- a/tools/tools.json +++ b/tools/tools.json @@ -759,7 +759,7 @@ "description": "Ccache (compiler cache)", "export_paths": [ [ - "ccache-4.10.2-windows-x86_64" + "ccache-4.11.2-windows-x86_64" ] ], "export_vars": { @@ -787,12 +787,12 @@ "version_regex": "ccache version ([0-9.]+)", "versions": [ { - "name": "4.10.2", + "name": "4.11.2", "status": "recommended", "win64": { - "sha256": "6252f081876a9a9f700fae13a5aec5d0d486b28261d7f1f72ac11c7ad9df4da9", - "size": 1610890, - "url": "https://github.com/ccache/ccache/releases/download/v4.10.2/ccache-4.10.2-windows-x86_64.zip" + "sha256": "1f39f3ad5aae3fe915e99ad1302633bc8f6718e58fa7c0de2b0ba7e080f0f08c", + "size": 1642225, + "url": "https://github.com/ccache/ccache/releases/download/v4.11.2/ccache-4.11.2-windows-x86_64.zip" } } ] From 25d878981529b54ffe4a0ecbfec9713f9126cbe8 Mon Sep 17 00:00:00 2001 From: Xu Si Yu Date: Mon, 30 Jun 2025 09:50:43 +0000 Subject: [PATCH 105/213] feat(openthread): update border router lib * esp-openthread: thread_zigbee/esp-openthread@16bfed5ec * openthread: espressif/openthread@b945928d7 * esp-idf: espressif/esp-idf@05a3159e5 --- components/openthread/lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/openthread/lib b/components/openthread/lib index d4d4738d0d7..24a1ecd851c 160000 --- a/components/openthread/lib +++ b/components/openthread/lib @@ -1 +1 @@ -Subproject commit d4d4738d0d757dbcead167179ecf829a8c1d477b +Subproject commit 24a1ecd851c188aa9bc23578a0a39d20c77fba7f From 7f07eba674ea53fd5d0ce4b50980648fda3b6923 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Mon, 9 Jun 2025 09:03:53 +0200 Subject: [PATCH 106/213] fix(lwip): Fix appending DHCP option with HW-ID --- components/lwip/Kconfig | 6 +++--- components/lwip/port/hooks/lwip_default_hooks.c | 17 ++++++++++++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/components/lwip/Kconfig b/components/lwip/Kconfig index 33f87955b22..574025461de 100644 --- a/components/lwip/Kconfig +++ b/components/lwip/Kconfig @@ -371,9 +371,9 @@ menu "LWIP" config LWIP_DHCP_OPTIONS_LEN int "DHCP total option length" - default 68 if LWIP_DHCP_DISABLE_VENDOR_CLASS_ID - default 108 if !LWIP_DHCP_DISABLE_VENDOR_CLASS_ID - range 68 255 + default 69 if LWIP_DHCP_DISABLE_VENDOR_CLASS_ID + default 109 if !LWIP_DHCP_DISABLE_VENDOR_CLASS_ID + range 69 255 depends on LWIP_IPV4 help Set total length of outgoing DHCP option msg. Generally bigger value means it can carry more diff --git a/components/lwip/port/hooks/lwip_default_hooks.c b/components/lwip/port/hooks/lwip_default_hooks.c index ce951695845..b8b5bcc79ee 100644 --- a/components/lwip/port/hooks/lwip_default_hooks.c +++ b/components/lwip/port/hooks/lwip_default_hooks.c @@ -8,10 +8,20 @@ #include "lwip/prot/dhcp.h" #include "lwip/dhcp.h" #include "lwip/prot/iana.h" +#include "esp_log.h" #include #define __weak __attribute__((weak)) +/** + * Default lwip behavior is to silence LWIP_ERROR() if LWIP_DEBUG is not set. + * In some case (if IDF hooks are used), we need to log the error message + * instead of silently ignoring it -- using this macro + */ +#define LWIP_ERROR_LOG(message, expression, handler) do { if (!(expression)) { \ + ESP_LOGE("LWIP_ERROR", message); \ + handler;}} while(0) + #ifdef CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT struct netif *__weak lwip_hook_ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest) @@ -243,8 +253,9 @@ void dhcp_append_extra_opts(struct netif *netif, uint8_t state, struct dhcp_msg state == DHCP_STATE_REQUESTING || state == DHCP_STATE_BACKING_OFF || state == DHCP_STATE_SELECTING) { size_t i; u8_t *options = msg_out->options + *options_out_len; - LWIP_ERROR("dhcp_append(client_id): options_out_len + 3 + netif->hwaddr_len <= DHCP_OPTIONS_LEN", - *options_out_len + 3U + netif->hwaddr_len <= DHCP_OPTIONS_LEN, return;); + /* size of this option is not hwaddr_len, but hwaddr_len + 1 (IANA_HWTYPE_ETHERNET) */ + LWIP_ERROR_LOG("dhcp_append(client_id): options_out_len + 3 + (netif->hwaddr_len + 1) <= DHCP_OPTIONS_LEN, please increase LWIP_DHCP_OPTIONS_LEN", + *options_out_len + 3U + (netif->hwaddr_len + 1) <= DHCP_OPTIONS_LEN, return;); *options_out_len = *options_out_len + netif->hwaddr_len + 3; *options++ = DHCP_OPTION_CLIENT_ID; *options++ = netif->hwaddr_len + 1; /* option size */ @@ -274,7 +285,7 @@ void dhcp_append_extra_opts(struct netif *netif, uint8_t state, struct dhcp_msg } #endif /* LWIP_NETIF_HOSTNAME */ } - LWIP_ERROR("dhcp_append(vci): options_out_len + 3 + vci_size <= DHCP_OPTIONS_LEN", + LWIP_ERROR_LOG("dhcp_append(vci): options_out_len + 3 + vci_size <= DHCP_OPTIONS_LEN, please increase LWIP_DHCP_OPTIONS_LEN", *options_out_len + 3U + len <= DHCP_OPTIONS_LEN, return;); if (p) { u8_t *options = msg_out->options + *options_out_len; From 2e173e77548d423ddbc0afb042c2b9c9c68a1ef4 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Mon, 14 Apr 2025 18:49:43 +0200 Subject: [PATCH 107/213] fix(esp_netif): Fix incorrect DHCP call for PPP interfaces Closes https://github.com/espressif/esp-protocols/issues/800 --- components/esp_netif/lwip/esp_netif_lwip.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/components/esp_netif/lwip/esp_netif_lwip.c b/components/esp_netif/lwip/esp_netif_lwip.c index e7c538bdee8..8769284b100 100644 --- a/components/esp_netif/lwip/esp_netif_lwip.c +++ b/components/esp_netif/lwip/esp_netif_lwip.c @@ -1387,7 +1387,14 @@ static void esp_netif_internal_dhcpc_cb(struct netif *netif) ESP_LOGE(TAG, "dhcpc cb: failed to post got ip event (%x)", ret); } #ifdef CONFIG_LWIP_DHCP_RESTORE_LAST_IP - dhcp_ip_addr_store(netif); + /* + * Store the IP address only for non-Point-to-Point interfaces. + * P2P interfaces (like PPP) have dynamic addressing that shouldn't be stored + * for later restoration, as they're negotiated on each connection. + */ + if (!_IS_NETIF_ANY_POINT2POINT_TYPE(esp_netif)) { + dhcp_ip_addr_store(netif); + } #endif /* CONFIG_LWIP_DHCP_RESTORE_LAST_IP */ } else { ESP_LOGD(TAG, "if%p ip unchanged", esp_netif); From c43c0b1e9c6848e6b2882488ada6cc7d597f3b8e Mon Sep 17 00:00:00 2001 From: Simonas Kazlauskas Date: Tue, 24 Jun 2025 17:34:52 +0300 Subject: [PATCH 108/213] feat(openthread): support rcp based on USB Serial JTAG --- components/openthread/CMakeLists.txt | 2 +- components/openthread/Kconfig | 6 +++++ .../openthread/include/esp_openthread_types.h | 1 + .../private_include/esp_openthread_uart.h | 14 +++++++++- .../openthread-core-esp32x-radio-config.h | 2 +- .../src/esp_openthread_platform.cpp | 8 +++++- .../openthread/src/ncp/esp_openthread_ncp.cpp | 4 +-- .../openthread/src/port/esp_openthread_uart.c | 27 +++++++++++++++++-- .../openthread/ot_rcp/main/esp_ot_config.h | 10 +++++-- .../openthread/ot_rcp/sdkconfig.ci.rcp_usb | 1 + 10 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 examples/openthread/ot_rcp/sdkconfig.ci.rcp_usb diff --git a/components/openthread/CMakeLists.txt b/components/openthread/CMakeLists.txt index 49f91d3be7f..dc3938e76f1 100644 --- a/components/openthread/CMakeLists.txt +++ b/components/openthread/CMakeLists.txt @@ -171,7 +171,7 @@ if(CONFIG_OPENTHREAD_ENABLED) if(CONFIG_OPENTHREAD_NCP_VENDOR_HOOK) list(APPEND src_dirs "src/ncp") - if(CONFIG_OPENTHREAD_RCP_UART) + if(CONFIG_OPENTHREAD_RCP_UART OR CONFIG_OPENTHREAD_RCP_USB_SERIAL_JTAG) list(APPEND exclude_srcs "src/ncp/esp_openthread_ncp_spi.cpp") elseif(CONFIG_OPENTHREAD_RCP_SPI) diff --git a/components/openthread/Kconfig b/components/openthread/Kconfig index 54ecce875a2..573825c0616 100644 --- a/components/openthread/Kconfig +++ b/components/openthread/Kconfig @@ -181,6 +181,12 @@ menu "OpenThread" select GPIO_CTRL_FUNC_IN_IRAM help Select this to enable SPI connection to host. + + config OPENTHREAD_RCP_USB_SERIAL_JTAG + depends on ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG && !OPENTHREAD_CONSOLE_TYPE_USB_SERIAL_JTAG + bool "USB RCP" + help + Select this to enable connection to host over USB JTAG serial. endchoice config OPENTHREAD_NCP_VENDOR_HOOK diff --git a/components/openthread/include/esp_openthread_types.h b/components/openthread/include/esp_openthread_types.h index 364d596100b..c5f4f4cba67 100644 --- a/components/openthread/include/esp_openthread_types.h +++ b/components/openthread/include/esp_openthread_types.h @@ -150,6 +150,7 @@ typedef enum { HOST_CONNECTION_MODE_CLI_USB, /*!< CLI USB connection to the host */ HOST_CONNECTION_MODE_RCP_UART, /*!< RCP UART connection to the host */ HOST_CONNECTION_MODE_RCP_SPI, /*!< RCP SPI connection to the host */ + HOST_CONNECTION_MODE_RCP_USB, /*!< RCP USB Serial JTAG connection to the host */ HOST_CONNECTION_MODE_MAX, /*!< Using for parameter check */ } esp_openthread_host_connection_mode_t; diff --git a/components/openthread/private_include/esp_openthread_uart.h b/components/openthread/private_include/esp_openthread_uart.h index 50b5f447060..8a01690646d 100644 --- a/components/openthread/private_include/esp_openthread_uart.h +++ b/components/openthread/private_include/esp_openthread_uart.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -64,6 +64,18 @@ esp_err_t esp_openthread_host_cli_usb_init(const esp_openthread_platform_config_ */ esp_err_t esp_openthread_host_rcp_uart_init(const esp_openthread_platform_config_t *config); +/** + * @brief Initializes the RCP USB for OpenThread host connection. + * + * @param[in] config The platform configuration. + * + * @return + * - ESP_OK on success + * - ESP_ERROR on failure + * + */ +esp_err_t esp_openthread_host_rcp_usb_init(const esp_openthread_platform_config_t *config); + /** * @brief Deintializes the uart for OpenThread host connection. * diff --git a/components/openthread/private_include/openthread-core-esp32x-radio-config.h b/components/openthread/private_include/openthread-core-esp32x-radio-config.h index 009635bac75..8be7e0de72b 100644 --- a/components/openthread/private_include/openthread-core-esp32x-radio-config.h +++ b/components/openthread/private_include/openthread-core-esp32x-radio-config.h @@ -91,7 +91,7 @@ #ifdef OPENTHREAD_CONFIG_NCP_HDLC_ENABLE #error `OPENTHREAD_CONFIG_NCP_HDLC_ENABLE` is redefined. #endif -#define OPENTHREAD_CONFIG_NCP_HDLC_ENABLE CONFIG_OPENTHREAD_RCP_UART +#define OPENTHREAD_CONFIG_NCP_HDLC_ENABLE (CONFIG_OPENTHREAD_RCP_UART || CONFIG_OPENTHREAD_RCP_USB_SERIAL_JTAG) /** * @def OPENTHREAD_LIB_SPINEL_RX_FRAME_BUFFER_SIZE diff --git a/components/openthread/src/esp_openthread_platform.cpp b/components/openthread/src/esp_openthread_platform.cpp index 51bfd779042..f16891d69c2 100644 --- a/components/openthread/src/esp_openthread_platform.cpp +++ b/components/openthread/src/esp_openthread_platform.cpp @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -106,6 +106,12 @@ static esp_err_t esp_openthread_host_interface_init(const esp_openthread_platfor "esp_openthread_host_rcp_uart_init failed"); break; #endif +#if CONFIG_OPENTHREAD_RCP_USB_SERIAL_JTAG + case HOST_CONNECTION_MODE_RCP_USB: + ESP_RETURN_ON_ERROR(esp_openthread_host_rcp_usb_init(config), OT_PLAT_LOG_TAG, + "esp_openthread_host_rcp_usb_init failed"); + break; +#endif #if CONFIG_OPENTHREAD_CONSOLE_TYPE_UART case HOST_CONNECTION_MODE_CLI_UART: ESP_RETURN_ON_ERROR(esp_openthread_host_cli_uart_init(config), OT_PLAT_LOG_TAG, diff --git a/components/openthread/src/ncp/esp_openthread_ncp.cpp b/components/openthread/src/ncp/esp_openthread_ncp.cpp index c9ddd03e3ea..94c31113dec 100644 --- a/components/openthread/src/ncp/esp_openthread_ncp.cpp +++ b/components/openthread/src/ncp/esp_openthread_ncp.cpp @@ -13,11 +13,11 @@ #include "esp_coex_i154.h" #endif -#if CONFIG_OPENTHREAD_RCP_UART +#if (CONFIG_OPENTHREAD_RCP_UART || CONFIG_OPENTHREAD_RCP_USB_SERIAL_JTAG) #include "utils/uart.h" #endif -#if CONFIG_OPENTHREAD_RCP_UART +#if (CONFIG_OPENTHREAD_RCP_UART || CONFIG_OPENTHREAD_RCP_USB_SERIAL_JTAG) extern "C" { static int NcpSend(const uint8_t *aBuf, uint16_t aBufLength) { diff --git a/components/openthread/src/port/esp_openthread_uart.c b/components/openthread/src/port/esp_openthread_uart.c index 4d2f0313594..6893d0400e3 100644 --- a/components/openthread/src/port/esp_openthread_uart.c +++ b/components/openthread/src/port/esp_openthread_uart.c @@ -31,7 +31,7 @@ static int s_uart_fd; static uint8_t s_uart_buffer[ESP_OPENTHREAD_UART_BUFFER_SIZE]; static const char *uart_workflow = "uart"; -#if (CONFIG_OPENTHREAD_CLI || (CONFIG_OPENTHREAD_RADIO && CONFIG_OPENTHREAD_RCP_UART)) +#if (CONFIG_OPENTHREAD_CLI || (CONFIG_OPENTHREAD_RADIO && (CONFIG_OPENTHREAD_RCP_UART || CONFIG_OPENTHREAD_RCP_USB_SERIAL_JTAG))) otError otPlatUartEnable(void) { return OT_ERROR_NONE; @@ -116,6 +116,7 @@ esp_err_t esp_openthread_host_cli_uart_init(const esp_openthread_platform_config } #endif +#if CONFIG_OPENTHREAD_RCP_UART esp_err_t esp_openthread_host_rcp_uart_init(const esp_openthread_platform_config_t *config) { esp_err_t ret = ESP_OK; @@ -135,6 +136,28 @@ esp_err_t esp_openthread_host_rcp_uart_init(const esp_openthread_platform_config return ret; } +#endif + +#if CONFIG_OPENTHREAD_RCP_USB_SERIAL_JTAG +esp_err_t esp_openthread_host_rcp_usb_init(const esp_openthread_platform_config_t *config) +{ + esp_err_t ret = ESP_OK; + + usb_serial_jtag_vfs_set_rx_line_endings(ESP_LINE_ENDINGS_LF); + usb_serial_jtag_vfs_set_tx_line_endings(ESP_LINE_ENDINGS_LF); + + ESP_ERROR_CHECK(usb_serial_jtag_driver_install((usb_serial_jtag_driver_config_t *)&config->host_config.host_usb_config)); + ESP_ERROR_CHECK(usb_serial_jtag_vfs_register()); + usb_serial_jtag_vfs_use_driver(); + + s_uart_fd = open("/dev/usbserjtag", O_RDWR | O_NONBLOCK); + ESP_RETURN_ON_FALSE(s_uart_fd >= 0, ESP_FAIL, OT_PLAT_LOG_TAG, "open usbserjtag failed"); + ret = esp_openthread_platform_workflow_register(&esp_openthread_uart_update, &esp_openthread_uart_process, + uart_workflow); + + return ret; +} +#endif void esp_openthread_uart_deinit() { @@ -159,7 +182,7 @@ esp_err_t esp_openthread_uart_process(otInstance *instance, const esp_openthread int rval = read(s_uart_fd, s_uart_buffer, sizeof(s_uart_buffer)); if (rval > 0) { -#if (CONFIG_OPENTHREAD_CLI || (CONFIG_OPENTHREAD_RADIO && CONFIG_OPENTHREAD_RCP_UART)) +#if (CONFIG_OPENTHREAD_CLI || (CONFIG_OPENTHREAD_RADIO && (CONFIG_OPENTHREAD_RCP_UART || CONFIG_OPENTHREAD_RCP_USB_SERIAL_JTAG))) otPlatUartReceived(s_uart_buffer, (uint16_t)rval); #endif } else if (rval < 0) { diff --git a/examples/openthread/ot_rcp/main/esp_ot_config.h b/examples/openthread/ot_rcp/main/esp_ot_config.h index 71c74dfcb3c..d7a11503297 100644 --- a/examples/openthread/ot_rcp/main/esp_ot_config.h +++ b/examples/openthread/ot_rcp/main/esp_ot_config.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: CC0-1.0 * @@ -52,7 +52,7 @@ .tx_pin = OPENTHREAD_RCP_UART_TX_PIN, \ }, \ } -#else // CONFIG_OPENTHREAD_RCP_SPI +#elif CONFIG_OPENTHREAD_RCP_SPI // CONFIG_OPENTHREAD_RCP_SPI #define ESP_OPENTHREAD_DEFAULT_HOST_CONFIG() \ { \ .host_connection_mode = HOST_CONNECTION_MODE_RCP_SPI, \ @@ -75,6 +75,12 @@ .intr_pin = 9, \ }, \ } +#else // CONFIG_OPENTHREAD_RCP_USB_SERIAL_JTAG +#define ESP_OPENTHREAD_DEFAULT_HOST_CONFIG() \ + { \ + .host_connection_mode = HOST_CONNECTION_MODE_RCP_USB, \ + .host_usb_config = USB_SERIAL_JTAG_DRIVER_CONFIG_DEFAULT(), \ + } #endif #define ESP_OPENTHREAD_DEFAULT_PORT_CONFIG() \ diff --git a/examples/openthread/ot_rcp/sdkconfig.ci.rcp_usb b/examples/openthread/ot_rcp/sdkconfig.ci.rcp_usb new file mode 100644 index 00000000000..7735b15871a --- /dev/null +++ b/examples/openthread/ot_rcp/sdkconfig.ci.rcp_usb @@ -0,0 +1 @@ +CONFIG_OPENTHREAD_RCP_USB_SERIAL_JTAG=y From 820a5c9aa50d1c168fb65569fa91dc263761a7cf Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Wed, 11 Jun 2025 22:24:28 +0200 Subject: [PATCH 109/213] fix(apptrace): calculate crc16 of the current block before swap --- components/app_trace/app_trace_membufs_proto.c | 2 +- components/app_trace/port/riscv/port.c | 4 ++-- components/app_trace/port/xtensa/port.c | 18 +++++++++--------- .../esp_app_trace_membufs_proto.h | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/components/app_trace/app_trace_membufs_proto.c b/components/app_trace/app_trace_membufs_proto.c index ced8e7a344e..f27e86cb962 100644 --- a/components/app_trace/app_trace_membufs_proto.c +++ b/components/app_trace/app_trace_membufs_proto.c @@ -92,7 +92,7 @@ static esp_err_t esp_apptrace_membufs_swap(esp_apptrace_membufs_proto_data_t *pr // switch to new block proto->state.in_block++; - proto->hw->swap(new_block_num); + proto->hw->swap(new_block_num, proto->state.markers[prev_block_num]); // handle data from host esp_hostdata_hdr_t *hdr = (esp_hostdata_hdr_t *)proto->blocks[new_block_num].start; diff --git a/components/app_trace/port/riscv/port.c b/components/app_trace/port/riscv/port.c index 14fe223623c..8b014e0dd1e 100644 --- a/components/app_trace/port/riscv/port.c +++ b/components/app_trace/port/riscv/port.c @@ -50,7 +50,7 @@ static uint8_t *esp_apptrace_riscv_down_buffer_get(esp_apptrace_riscv_data_t *hw static esp_err_t esp_apptrace_riscv_down_buffer_put(esp_apptrace_riscv_data_t *hw_data, uint8_t *ptr, esp_apptrace_tmo_t *tmo); static bool esp_apptrace_riscv_host_is_connected(esp_apptrace_riscv_data_t *hw_data); static esp_err_t esp_apptrace_riscv_buffer_swap_start(uint32_t curr_block_id); -static esp_err_t esp_apptrace_riscv_buffer_swap(uint32_t new_block_id); +static esp_err_t esp_apptrace_riscv_buffer_swap(uint32_t new_block_id, uint32_t prev_block_len); static esp_err_t esp_apptrace_riscv_buffer_swap_end(uint32_t new_block_id, uint32_t prev_block_len); static bool esp_apptrace_riscv_host_data_pending(void); @@ -353,7 +353,7 @@ static esp_err_t esp_apptrace_riscv_buffer_swap_end(uint32_t new_block_id, uint3 return ESP_OK; } -static esp_err_t esp_apptrace_riscv_buffer_swap(uint32_t new_block_id) +static esp_err_t esp_apptrace_riscv_buffer_swap(uint32_t new_block_id, uint32_t prev_block_len) { /* do nothing */ return ESP_OK; diff --git a/components/app_trace/port/xtensa/port.c b/components/app_trace/port/xtensa/port.c index aba6b15a72b..c86584cb313 100644 --- a/components/app_trace/port/xtensa/port.c +++ b/components/app_trace/port/xtensa/port.c @@ -208,7 +208,7 @@ static uint8_t *esp_apptrace_trax_down_buffer_get(esp_apptrace_trax_data_t *hw_d static esp_err_t esp_apptrace_trax_down_buffer_put(esp_apptrace_trax_data_t *hw_data, uint8_t *ptr, esp_apptrace_tmo_t *tmo); static bool esp_apptrace_trax_host_is_connected(esp_apptrace_trax_data_t *hw_data); static esp_err_t esp_apptrace_trax_buffer_swap_start(uint32_t curr_block_id); -static esp_err_t esp_apptrace_trax_buffer_swap(uint32_t new_block_id); +static esp_err_t esp_apptrace_trax_buffer_swap(uint32_t new_block_id, uint32_t prev_block_len); static esp_err_t esp_apptrace_trax_buffer_swap_end(uint32_t new_block_id, uint32_t prev_block_len); static bool esp_apptrace_trax_host_data_pending(void); @@ -526,21 +526,21 @@ static esp_err_t esp_apptrace_trax_buffer_swap_end(uint32_t new_block_id, uint32 uint32_t ctrl_reg = eri_read(ESP_APPTRACE_TRAX_CTRL_REG); uint32_t host_connected = ESP_APPTRACE_TRAX_HOST_CONNECT & ctrl_reg; - /* calculate CRC16 of the already switched block */ - if (prev_block_len > 0) { - const uint8_t *prev_block_start = s_trax_blocks[!((new_block_id % 2))]; - uint16_t crc16 = esp_rom_crc16_le(0, prev_block_start, prev_block_len); - eri_write(ESP_APPTRACE_TRAX_CRC16_REG, crc16 | ESP_APPTRACE_CRC_INDICATOR); - ESP_APPTRACE_LOGD("CRC16:%x %d @%x", crc16, prev_block_len, prev_block_start); - } eri_write(ESP_APPTRACE_TRAX_CTRL_REG, ESP_APPTRACE_TRAX_BLOCK_ID(new_block_id) | host_connected | ESP_APPTRACE_TRAX_BLOCK_LEN(prev_block_len)); esp_apptrace_trax_buffer_swap_unlock(); return ESP_OK; } -static esp_err_t esp_apptrace_trax_buffer_swap(uint32_t new_block_id) +static esp_err_t esp_apptrace_trax_buffer_swap(uint32_t new_block_id, uint32_t prev_block_len) { + /* Before switching to the new block, calculate CRC16 of the current block */ + if (prev_block_len > 0) { + const uint8_t *prev_block_start = s_trax_blocks[!((new_block_id % 2))]; + uint16_t crc16 = esp_rom_crc16_le(0, prev_block_start, prev_block_len); + eri_write(ESP_APPTRACE_TRAX_CRC16_REG, crc16 | ESP_APPTRACE_CRC_INDICATOR); + ESP_APPTRACE_LOGD("CRC16:%x %d @%x", crc16, prev_block_len, prev_block_start); + } esp_apptrace_trax_select_memory_block(new_block_id); return ESP_OK; } diff --git a/components/app_trace/private_include/esp_app_trace_membufs_proto.h b/components/app_trace/private_include/esp_app_trace_membufs_proto.h index 8b71cb5b487..fb1ef53a5da 100644 --- a/components/app_trace/private_include/esp_app_trace_membufs_proto.h +++ b/components/app_trace/private_include/esp_app_trace_membufs_proto.h @@ -29,7 +29,7 @@ typedef struct { typedef struct { esp_err_t (*swap_start)(uint32_t curr_block_id); - esp_err_t (*swap)(uint32_t new_block_id); + esp_err_t (*swap)(uint32_t new_block_id, uint32_t prev_block_len); esp_err_t (*swap_end)(uint32_t new_block_id, uint32_t prev_block_len); bool (*host_data_pending)(void); } esp_apptrace_membufs_proto_hw_t; From eb7a19554a9acba1e86a8ea14b0649103ea799b9 Mon Sep 17 00:00:00 2001 From: chendejin Date: Mon, 30 Jun 2025 17:25:13 +0800 Subject: [PATCH 110/213] feat(openthread): move mesh local address judeging function to public --- .../openthread/include/esp_openthread_netif_glue.h | 11 +++++++++++ .../private_include/esp_openthread_netif_glue_priv.h | 11 ----------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/components/openthread/include/esp_openthread_netif_glue.h b/components/openthread/include/esp_openthread_netif_glue.h index 3d70c8a7f74..31197195f45 100644 --- a/components/openthread/include/esp_openthread_netif_glue.h +++ b/components/openthread/include/esp_openthread_netif_glue.h @@ -76,6 +76,17 @@ esp_netif_t *esp_openthread_get_netif(void); */ void esp_openthread_register_meshcop_e_handler(esp_event_handler_t handler, bool for_publish); +/** + * @brief This function judges the target address is openthread mesh local or not. + * + * @param[in] address The address. + * + * @return + * - True if the address is openthread mesh local, otherwise false + * + */ +bool is_openthread_internal_mesh_local_addr(const otIp6Address *address); + #ifdef __cplusplus } #endif diff --git a/components/openthread/private_include/esp_openthread_netif_glue_priv.h b/components/openthread/private_include/esp_openthread_netif_glue_priv.h index d5a9d1c0729..ceebe3db4d9 100644 --- a/components/openthread/private_include/esp_openthread_netif_glue_priv.h +++ b/components/openthread/private_include/esp_openthread_netif_glue_priv.h @@ -36,17 +36,6 @@ void esp_openthread_netif_glue_update(esp_openthread_mainloop_context_t *mainloo */ esp_err_t esp_openthread_netif_glue_process(otInstance *instance, const esp_openthread_mainloop_context_t *mainloop); -/** - * @brief This function judges the target address is openthread mesh local or not. - * - * @param[in] address The address. - * - * @return - * - True if the address is openthread mesh local, otherwise false - * - */ -bool is_openthread_internal_mesh_local_addr(const otIp6Address *address); - #ifdef __cplusplus } #endif From a03919a2f70164378952098c5aefda98dfae7542 Mon Sep 17 00:00:00 2001 From: Chen Dejin Date: Tue, 1 Jul 2025 03:13:04 +0000 Subject: [PATCH 111/213] fix(openthread/discovery): use mesh local for self-hosted service if OMR is not preferred * esp-openthread: thread_zigbee/esp-openthread@f54481eb0 * openthread: espressif/openthread@b945928d7 * esp-idf: espressif/esp-idf@eb7a19554 --- components/openthread/lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/openthread/lib b/components/openthread/lib index 24a1ecd851c..d42fd889dd9 160000 --- a/components/openthread/lib +++ b/components/openthread/lib @@ -1 +1 @@ -Subproject commit 24a1ecd851c188aa9bc23578a0a39d20c77fba7f +Subproject commit d42fd889dd9a0a5c0e016ee1bd24750df54cb0c2 From 87dd86f98f7b6bfea6dab5e9deb0e804f443ab56 Mon Sep 17 00:00:00 2001 From: Alexey Lapshin Date: Tue, 25 Mar 2025 08:27:05 +0000 Subject: [PATCH 112/213] feat(tools): update gdb version to 16.2_20250324 Closes https://github.com/espressif/esp-idf/issues/16219 --- tools/tools.json | 112 +++++++++++++++++++++++------------------------ 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/tools/tools.json b/tools/tools.json index a42921281e0..90896b470c2 100644 --- a/tools/tools.json +++ b/tools/tools.json @@ -26,51 +26,51 @@ "versions": [ { "linux-amd64": { - "sha256": "9d68472d4cba5cf8c2b79d94f86f92c828e76a632bd1e6be5e7706e5b304d36e", - "size": 31010320, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/xtensa-esp-elf-gdb-14.2_20240403-x86_64-linux-gnu.tar.gz" + "sha256": "27b58ab12248e04277c4fdc74038cf0a001d5142df091ab94939ad35053738fd", + "size": 36361058, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/xtensa-esp-elf-gdb-16.2_20250324-x86_64-linux-gnu.tar.gz" }, "linux-arm64": { - "sha256": "bdabc3217994815fc311c4e16e588b78f6596b5ad4ffa46c80b40e982cfb1e66", - "size": 30954580, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/xtensa-esp-elf-gdb-14.2_20240403-aarch64-linux-gnu.tar.gz" + "sha256": "24f85aa778e1605098a13ff7bd29d5760767faf012705c8915cb08b32cad0206", + "size": 35442104, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/xtensa-esp-elf-gdb-16.2_20250324-aarch64-linux-gnu.tar.gz" }, "linux-armel": { - "sha256": "d54b8d703ba897b28c627da3d27106a3906dd01ba298778a67064710bc33c76d", - "size": 28697281, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/xtensa-esp-elf-gdb-14.2_20240403-arm-linux-gnueabi.tar.gz" + "sha256": "c73e43038b6d50374cd0ee714370ce748189e0b00404d581babd2bb0115c4785", + "size": 31260410, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/xtensa-esp-elf-gdb-16.2_20250324-arm-linux-gnueabi.tar.gz" }, "linux-armhf": { - "sha256": "6187d1dd54e57927f7a7b804ff431fe0a295d5d5638c7654ee2bb7c3e0e84d4b", - "size": 26906258, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/xtensa-esp-elf-gdb-14.2_20240403-arm-linux-gnueabihf.tar.gz" + "sha256": "5be24888e864faa22f89c999b6a7c57285763baa41bbe959abec189bd4277cd3", + "size": 31195042, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/xtensa-esp-elf-gdb-16.2_20250324-arm-linux-gnueabihf.tar.gz" }, "linux-i686": { - "sha256": "64d3bc992ed8fdec383d49e8b803ac494605a38117c8293db8da055037de96b0", - "size": 29890994, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/xtensa-esp-elf-gdb-14.2_20240403-i586-linux-gnu.tar.gz" + "sha256": "dc7b8aad0fb1c6a1abfdb8dff4f08221ea08a0f28fb837f181969ac1174d4dc6", + "size": 35067894, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/xtensa-esp-elf-gdb-16.2_20250324-i586-linux-gnu.tar.gz" }, "macos": { - "sha256": "023e74b3fda793da4bc0509b02de776ee0dad6efaaac17bef5916fb7dc9c26b9", - "size": 44446611, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/xtensa-esp-elf-gdb-14.2_20240403-x86_64-apple-darwin14.tar.gz" + "sha256": "398c429cfe696bad01d636c5488cadc87b20471c1b5ed02c60eee5ef2a775c93", + "size": 54992785, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/xtensa-esp-elf-gdb-16.2_20250324-x86_64-apple-darwin21.1.tar.gz" }, "macos-arm64": { - "sha256": "ea757c6bf8c25238f6d2fdcc6bbab25a1b00608a0f9e19b7ddd2f37ddbdc3fb1", - "size": 37021423, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/xtensa-esp-elf-gdb-14.2_20240403-aarch64-apple-darwin21.1.tar.gz" + "sha256": "b6d85c0d76d653bb55f9d06b0cd509eab7e99db541c88b8c849c64827e9d74a9", + "size": 43538967, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/xtensa-esp-elf-gdb-16.2_20250324-aarch64-apple-darwin21.1.tar.gz" }, - "name": "14.2_20240403", + "name": "16.2_20250324", "status": "recommended", "win32": { - "sha256": "322e8d9b700dc32d8158e3dc55fb85ec55de48d0bb7789375ee39a28d5d655e2", - "size": 26302466, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/xtensa-esp-elf-gdb-14.2_20240403-i686-w64-mingw32.zip" + "sha256": "f748d6b65fdf66733b82e12d0d85a05e3134122416280379df129cfebe2aa4b2", + "size": 32189419, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/xtensa-esp-elf-gdb-16.2_20250324-i686-w64-mingw32.zip" }, "win64": { - "sha256": "a27a2fe20f192f8e0a51b8936428b4e1cf8935cfe008ee445cc49f6fc7f6db2e", - "size": 28366035, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/xtensa-esp-elf-gdb-14.2_20240403-x86_64-w64-mingw32.zip" + "sha256": "e970fc3ec8a1d0acee2432e91e0a01b348613a0425aacfa981b2fc505fe920cc", + "size": 32290997, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/xtensa-esp-elf-gdb-16.2_20250324-x86_64-w64-mingw32.zip" } } ] @@ -105,51 +105,51 @@ "versions": [ { "linux-amd64": { - "sha256": "ce004bc0bbd71b246800d2d13b239218b272a38bd528e316f21f1af2db8a4b13", - "size": 30707431, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/riscv32-esp-elf-gdb-14.2_20240403-x86_64-linux-gnu.tar.gz" + "sha256": "f9b172d8d72d0a1e2b0b80127df29263a0cb0d0c4e998e09c27031bfac09f3ec", + "size": 36528201, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/riscv32-esp-elf-gdb-16.2_20250324-x86_64-linux-gnu.tar.gz" }, "linux-arm64": { - "sha256": "ba10f2866c61410b88c65957274280b1a62e3bed05131654ed9b6758efe18e55", - "size": 30824065, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/riscv32-esp-elf-gdb-14.2_20240403-aarch64-linux-gnu.tar.gz" + "sha256": "68bb6a85fb58b8a738f799e8fb4fa1f56cfeffc4de803ceb03c8a33cb2cd919d", + "size": 35643464, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/riscv32-esp-elf-gdb-16.2_20250324-aarch64-linux-gnu.tar.gz" }, "linux-armel": { - "sha256": "88539db5d987f28827efac7e26080a2803b9b539342ccd2963ccfdd56d7f08f7", - "size": 29000575, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/riscv32-esp-elf-gdb-14.2_20240403-arm-linux-gnueabi.tar.gz" + "sha256": "673038ab9fb2b7391ff9252824194e3b9e40668efe9ce54d1e582a9d6c51f04a", + "size": 32154574, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/riscv32-esp-elf-gdb-16.2_20250324-arm-linux-gnueabi.tar.gz" }, "linux-armhf": { - "sha256": "b45b9711d6a87d4c2f688a9599ce850ce02f477756e3e797c4a6c1c549127fcb", - "size": 27157938, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/riscv32-esp-elf-gdb-14.2_20240403-arm-linux-gnueabihf.tar.gz" + "sha256": "e5fefa9b155c6b02e0291e2fecea17b1168a820838ffbdcb7ce76cbe9867e7b5", + "size": 32034954, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/riscv32-esp-elf-gdb-16.2_20250324-arm-linux-gnueabihf.tar.gz" }, "linux-i686": { - "sha256": "0e628ee37438ab6ba05eb889a76d09e50cb98e0020a16b8e2b935c5cf19b4ed2", - "size": 29947521, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/riscv32-esp-elf-gdb-14.2_20240403-i586-linux-gnu.tar.gz" + "sha256": "62f05d5fe08145b25e423dd0b3f1ae260be99abf5462b8cfd918bf2231e26e30", + "size": 35410891, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/riscv32-esp-elf-gdb-16.2_20250324-i586-linux-gnu.tar.gz" }, "macos": { - "sha256": "8f6bda832d70dad5860a639d55aba4237bd10cbac9f4822db1eece97357b34a9", - "size": 44196117, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/riscv32-esp-elf-gdb-14.2_20240403-x86_64-apple-darwin14.tar.gz" + "sha256": "63ae12cfbab648e2d2ca7a700a0c615c4f36a6fbe6876c11ba108115ee0d60f2", + "size": 55359246, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/riscv32-esp-elf-gdb-16.2_20250324-x86_64-apple-darwin21.1.tar.gz" }, "macos-arm64": { - "sha256": "d88b6116e86456c8480ce9bc95aed375a35c0d091f1da0a53b86be0e6ef3d320", - "size": 36794404, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/riscv32-esp-elf-gdb-14.2_20240403-aarch64-apple-darwin21.1.tar.gz" + "sha256": "bfbe49774f839020cef988537da0a06896dfe4a382674c62285361ed9bd4aee3", + "size": 43926592, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/riscv32-esp-elf-gdb-16.2_20250324-aarch64-apple-darwin21.1.tar.gz" }, - "name": "14.2_20240403", + "name": "16.2_20250324", "status": "recommended", "win32": { - "sha256": "d6e7ce05805b0d8d4dd138ad239b98a1adf8da98941867d60760eb1ae5361730", - "size": 26486295, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/riscv32-esp-elf-gdb-14.2_20240403-i686-w64-mingw32.zip" + "sha256": "e8b84eec990ff514729b3770edf2b543f36670f43663ce0c3b624fb4884812ca", + "size": 32914955, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/riscv32-esp-elf-gdb-16.2_20250324-i686-w64-mingw32.zip" }, "win64": { - "sha256": "5c9f211dc46daf6b96fad09d709284a0f0186fef8947d9f6edd6bca5b5ad4317", - "size": 27942579, - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/riscv32-esp-elf-gdb-14.2_20240403-x86_64-w64-mingw32.zip" + "sha256": "37c79178900c19ca7487c26af4b5ad6b0d3f34683bd0e9c2ddd39038c999e429", + "size": 32667353, + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/riscv32-esp-elf-gdb-16.2_20250324-x86_64-w64-mingw32.zip" } } ] From 57b1127ee3d792266a90c159b2c54e80788c30b8 Mon Sep 17 00:00:00 2001 From: Alexey Lapshin Date: Mon, 23 Sep 2024 16:27:11 +0700 Subject: [PATCH 113/213] fix(gdbstub): remove QThreadEvents+ from qSupported --- components/esp_gdbstub/src/gdbstub.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/esp_gdbstub/src/gdbstub.c b/components/esp_gdbstub/src/gdbstub.c index 916fc1feb4e..68ae4fe75a2 100644 --- a/components/esp_gdbstub/src/gdbstub.c +++ b/components/esp_gdbstub/src/gdbstub.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -696,7 +696,7 @@ static void handle_P_command(const unsigned char *cmd, int len) static void handle_qSupported_command(const unsigned char *cmd, int len) { esp_gdbstub_send_start(); - esp_gdbstub_send_str("qSupported:multiprocess+;swbreak-;hwbreak+;qRelocInsn+;fork-events+;vfork-events+;exec-events+;vContSupported+;QThreadEvents+;no-resumed+"); + esp_gdbstub_send_str("qSupported:multiprocess+;swbreak-;hwbreak+;qRelocInsn+;fork-events+;vfork-events+;exec-events+;vContSupported+;no-resumed+"); esp_gdbstub_send_end(); } From 99da2b8c2d080d7adc5442f378e54bc2e44e4579 Mon Sep 17 00:00:00 2001 From: "hrushikesh.bhosale" Date: Thu, 26 Jun 2025 16:22:50 +0530 Subject: [PATCH 114/213] feat(esp_tls): Added hidden config in esp-tls for dynamic buffer strategy configuration Added the hidden config in the esp-tls component for the dynamic buffer strategy configuration feature. So that external components like ota can findout whether this feature is supported or not --- components/esp-tls/Kconfig | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/components/esp-tls/Kconfig b/components/esp-tls/Kconfig index 81d5a365fc3..1fa28008fdf 100644 --- a/components/esp-tls/Kconfig +++ b/components/esp-tls/Kconfig @@ -114,4 +114,12 @@ menu "ESP-TLS" Enable a fuller set of OCSP checks: checking revocation status of intermediate certificates, optional fallbacks to CRLs, etc. + config ESP_TLS_DYN_BUF_STRATEGY_SUPPORTED + bool + default y + help + Enable support for dynamic buffer strategy for ESP-TLS. This is the hidden config option kept + for external components like OTA, to find out whether the dynamic buffer strategy is supported + for particular ESP-IDF version. + endmenu From 8fb0366f70e87f93a73e8f74abc04b9ac0df8a76 Mon Sep 17 00:00:00 2001 From: Tomas Rezucha Date: Tue, 3 Dec 2024 08:52:48 +0100 Subject: [PATCH 115/213] feat(usb/host): Add option to choose peripheral for USB host library Starting with ESP32-P4 we can have targets that have more than 1 USB-OTG peripheral. This commit adds an option to choose which peripherals will be used by USB Host lib. Internally, we will still have only 1 Root HUB but with multiple Root ports. --- components/soc/include/soc/usb_dwc_periph.h | 2 +- components/usb/hcd_dwc.c | 125 +++++++++++------- components/usb/hub.c | 13 +- components/usb/include/usb/usb_host.h | 7 + components/usb/private_include/hcd.h | 10 +- components/usb/private_include/hub.h | 1 + components/usb/usb_host.c | 24 +++- .../en/api-reference/peripherals/usb_host.rst | 2 +- .../usb_host_lib/main/usb_host_lib_main.c | 2 + 9 files changed, 122 insertions(+), 64 deletions(-) diff --git a/components/soc/include/soc/usb_dwc_periph.h b/components/soc/include/soc/usb_dwc_periph.h index 185a6bdb376..f35664d0c95 100644 --- a/components/soc/include/soc/usb_dwc_periph.h +++ b/components/soc/include/soc/usb_dwc_periph.h @@ -106,9 +106,9 @@ extern const usb_dwc_info_t usb_dwc_info; /* ------------------------------- Deprecated ------------------------------- */ /* Todo: Remove in ESP-IDF v6.0 (IDF-9052) */ #include -#include "soc/periph_defs.h" #if SOC_USB_OTG_SUPPORTED +#include "soc/periph_defs.h" /* Stores a bunch of USB-peripheral data. diff --git a/components/usb/hcd_dwc.c b/components/usb/hcd_dwc.c index 94c63a20be3..e051e282df8 100644 --- a/components/usb/hcd_dwc.c +++ b/components/usb/hcd_dwc.c @@ -43,7 +43,7 @@ #define CTRL_EP_MAX_MPS_LS 8 // Largest Maximum Packet Size for Low Speed control endpoints #define CTRL_EP_MAX_MPS_HSFS 64 // Largest Maximum Packet Size for High & Full Speed control endpoints -#define NUM_PORTS 1 // The controller only has one port. +#define NUM_PORTS SOC_USB_OTG_PERIPH_NUM // Each peripheral is a root port // ----------------------- Configs ------------------------- @@ -108,7 +108,6 @@ DEFINE_CRIT_SECTION_LOCK_STATIC(hcd_lock); * For other SOCs this is no-operation */ #if SOC_CACHE_INTERNAL_MEM_VIA_L1CACHE -#define ALIGN_UP_BY(num, align) (((num) + ((align) - 1)) & ~((align) - 1)) #define CACHE_SYNC_FRAME_LIST(frame_list) cache_sync_frame_list(frame_list) #define CACHE_SYNC_XFER_DESCRIPTOR_LIST_M2C(buffer) cache_sync_xfer_descriptor_list(buffer, true) #define CACHE_SYNC_XFER_DESCRIPTOR_LIST_C2M(buffer) cache_sync_xfer_descriptor_list(buffer, false) @@ -257,15 +256,15 @@ struct port_obj { void *callback_arg; SemaphoreHandle_t port_mux; void *context; + intr_handle_t isr_hdl; // Interrupt handle for this root port (USB-OTG peripheral) }; /** * @brief Object representing the HCD */ typedef struct { - // Ports (Hardware only has one) - port_t *port_obj; - intr_handle_t isr_hdl; + // Ports: Each peripheral is a root port + port_t *port_obj[NUM_PORTS]; } hcd_obj_t; static hcd_obj_t *s_hcd_obj = NULL; // Note: "s_" is for the static pointer @@ -1041,52 +1040,66 @@ esp_err_t hcd_install(const hcd_config_t *config) HCD_CHECK_FROM_CRIT(s_hcd_obj == NULL, ESP_ERR_INVALID_STATE); HCD_EXIT_CRITICAL(); + // Check if peripheral_map does not have bits set outside of valid range. Valid bits are BIT0 - BIT(NUM_PORTS - 1) + HCD_CHECK((config->peripheral_map != 0) && (config->peripheral_map < BIT(NUM_PORTS)), ESP_ERR_INVALID_ARG); + esp_err_t err_ret; + // Allocate memory for the driver object hcd_obj_t *p_hcd_obj_dmy = calloc(1, sizeof(hcd_obj_t)); if (p_hcd_obj_dmy == NULL) { return ESP_ERR_NO_MEM; } - // Allocate each port object (the hardware currently only has one port) - p_hcd_obj_dmy->port_obj = port_obj_alloc(); - if (p_hcd_obj_dmy->port_obj == NULL) { - err_ret = ESP_ERR_NO_MEM; - goto port_alloc_err; - } - // Allocate interrupt - err_ret = esp_intr_alloc(usb_dwc_info.controllers[0].irq, - config->intr_flags | ESP_INTR_FLAG_INTRDISABLED, // The interrupt must be disabled until the port is initialized - intr_hdlr_main, - (void *)p_hcd_obj_dmy->port_obj, - &p_hcd_obj_dmy->isr_hdl); - if (err_ret != ESP_OK) { - ESP_LOGE(HCD_DWC_TAG, "Interrupt alloc error: %s", esp_err_to_name(err_ret)); - goto intr_alloc_err; - } - // Apply custom FIFO config if provided, otherwise mark as default (all zeros) - memset(&p_hcd_obj_dmy->port_obj->fifo_config, 0, sizeof(p_hcd_obj_dmy->port_obj->fifo_config)); - if (config->fifo_config != NULL) { - // Convert and validate user-provided config - err_ret = convert_fifo_config_to_hal_config(config->fifo_config, &p_hcd_obj_dmy->port_obj->fifo_config); - if (err_ret != ESP_OK) { - goto assign_err; + + // Allocate each port object + for (int i = 0; i < NUM_PORTS; i++) { + if (BIT(i) & config->peripheral_map) { + p_hcd_obj_dmy->port_obj[i] = port_obj_alloc(); + if (p_hcd_obj_dmy->port_obj[i] == NULL) { + err_ret = ESP_ERR_NO_MEM; + goto clean_up; + } + // Allocate interrupt + const int irq_index = usb_dwc_info.controllers[i].irq; + err_ret = esp_intr_alloc(irq_index, + config->intr_flags | ESP_INTR_FLAG_INTRDISABLED, // The interrupt must be disabled until the port is initialized + intr_hdlr_main, + (void *)p_hcd_obj_dmy->port_obj[i], + &p_hcd_obj_dmy->port_obj[i]->isr_hdl); + if (err_ret != ESP_OK) { + ESP_LOGE(HCD_DWC_TAG, "Interrupt alloc error: %s", esp_err_to_name(err_ret)); + goto clean_up; + } + + // Apply custom FIFO config if provided + if (config->fifo_config != NULL) { + // Convert and validate user-provided config + err_ret = convert_fifo_config_to_hal_config(config->fifo_config, &p_hcd_obj_dmy->port_obj[i]->fifo_config); + if (err_ret != ESP_OK) { + goto clean_up; + } + } } } + HCD_ENTER_CRITICAL(); if (s_hcd_obj != NULL) { HCD_EXIT_CRITICAL(); err_ret = ESP_ERR_INVALID_STATE; - goto assign_err; + goto clean_up; } s_hcd_obj = p_hcd_obj_dmy; HCD_EXIT_CRITICAL(); return ESP_OK; -assign_err: - esp_intr_free(p_hcd_obj_dmy->isr_hdl); -intr_alloc_err: - port_obj_free(p_hcd_obj_dmy->port_obj); -port_alloc_err: +clean_up: + // Free resources + for (int i = 0; i < NUM_PORTS; i++) { + if (p_hcd_obj_dmy->port_obj[i]) { + esp_intr_free(p_hcd_obj_dmy->port_obj[i]->isr_hdl); + port_obj_free(p_hcd_obj_dmy->port_obj[i]); + } + } free(p_hcd_obj_dmy); return err_ret; } @@ -1094,8 +1107,14 @@ port_alloc_err: esp_err_t hcd_uninstall(void) { HCD_ENTER_CRITICAL(); - // Check that all ports have been disabled (there's only one port) - if (s_hcd_obj == NULL || s_hcd_obj->port_obj->initialized) { + // Check that all ports have been disabled + bool all_ports_disabled = true; + for (int i = 0; i < NUM_PORTS; i++) { + if (s_hcd_obj->port_obj[i]) { + all_ports_disabled = all_ports_disabled && !(s_hcd_obj->port_obj[i]->initialized); + } + } + if (s_hcd_obj == NULL || !all_ports_disabled) { HCD_EXIT_CRITICAL(); return ESP_ERR_INVALID_STATE; } @@ -1104,8 +1123,12 @@ esp_err_t hcd_uninstall(void) HCD_EXIT_CRITICAL(); // Free resources - port_obj_free(p_hcd_obj_dmy->port_obj); - esp_intr_free(p_hcd_obj_dmy->isr_hdl); + for (int i = 0; i < NUM_PORTS; i++) { + if (p_hcd_obj_dmy->port_obj[i]) { + esp_intr_free(p_hcd_obj_dmy->port_obj[i]->isr_hdl); + port_obj_free(p_hcd_obj_dmy->port_obj[i]); + } + } free(p_hcd_obj_dmy); return ESP_OK; } @@ -1366,13 +1389,13 @@ exit: esp_err_t hcd_port_init(int port_number, const hcd_port_config_t *port_config, hcd_port_handle_t *port_hdl) { - HCD_CHECK(port_number > 0 && port_config != NULL && port_hdl != NULL, ESP_ERR_INVALID_ARG); - HCD_CHECK(port_number <= NUM_PORTS, ESP_ERR_NOT_FOUND); + HCD_CHECK(port_number >= 0 && port_config != NULL && port_hdl != NULL, ESP_ERR_INVALID_ARG); + HCD_CHECK(port_number < NUM_PORTS, ESP_ERR_NOT_FOUND); HCD_ENTER_CRITICAL(); - HCD_CHECK_FROM_CRIT(s_hcd_obj != NULL && !s_hcd_obj->port_obj->initialized, ESP_ERR_INVALID_STATE); + HCD_CHECK_FROM_CRIT(s_hcd_obj != NULL && !s_hcd_obj->port_obj[port_number]->initialized, ESP_ERR_INVALID_STATE); // Port object memory and resources (such as the mutex) already be allocated. Just need to initialize necessary fields only - port_t *port_obj = s_hcd_obj->port_obj; + port_t *port_obj = s_hcd_obj->port_obj[port_number]; TAILQ_INIT(&port_obj->pipes_idle_tailq); TAILQ_INIT(&port_obj->pipes_active_tailq); port_obj->state = HCD_PORT_STATE_NOT_POWERED; @@ -1380,18 +1403,24 @@ esp_err_t hcd_port_init(int port_number, const hcd_port_config_t *port_config, h port_obj->callback = port_config->callback; port_obj->callback_arg = port_config->callback_arg; port_obj->context = port_config->context; - usb_dwc_hal_init(port_obj->hal, 0); + + // USB-HAL's size is dependent on its configuration, namely on number of channels in the configuration + // We must first initialize the HAL, to get the number of channels and then allocate memory for the channels + ESP_COMPILER_DIAGNOSTIC_PUSH_IGNORE("-Wanalyzer-malloc-leak") // False positive + usb_dwc_hal_init(port_obj->hal, port_number); port_obj->hal->channels.hdls = calloc(port_obj->hal->constant_config.chan_num_total, sizeof(usb_dwc_hal_chan_t*)); HCD_CHECK_FROM_CRIT(port_obj->hal->channels.hdls != NULL, ESP_ERR_NO_MEM); + ESP_COMPILER_DIAGNOSTIC_POP("-Wanalyzer-malloc-leak") + port_obj->initialized = true; - // Clear the frame list. We set the frame list register and enable periodic scheduling after a successful reset + // Clear the frame list. We will set the frame list register and enable periodic scheduling after a successful reset memset(port_obj->frame_list, 0, FRAME_LIST_LEN * sizeof(uint32_t)); // If FIFO config is zeroed -> calculate from bias if (_is_fifo_config_by_bias(&port_obj->fifo_config)) { // Calculate default FIFO sizes based on Kconfig bias settings _calculate_fifo_from_bias(port_obj, port_obj->hal); } - esp_intr_enable(s_hcd_obj->isr_hdl); + esp_intr_enable(port_obj->isr_hdl); *port_hdl = (hcd_port_handle_t)port_obj; HCD_EXIT_CRITICAL(); ESP_LOGD(HCD_DWC_TAG, "FIFO config lines: RX=%" PRIu32 ", PTX=%" PRIu32 ", NPTX=%" PRIu32, @@ -1413,7 +1442,7 @@ esp_err_t hcd_port_deinit(hcd_port_handle_t port_hdl) && port->task_waiting_port_notif == NULL, ESP_ERR_INVALID_STATE); port->initialized = false; - esp_intr_disable(s_hcd_obj->isr_hdl); + esp_intr_disable(port->isr_hdl); free(port->hal->channels.hdls); usb_dwc_hal_deinit(port->hal); HCD_EXIT_CRITICAL(); @@ -1529,7 +1558,7 @@ esp_err_t hcd_port_recover(hcd_port_handle_t port_hdl) ESP_ERR_INVALID_STATE); // We are about to do a soft reset on the peripheral. Disable the peripheral throughout - esp_intr_disable(s_hcd_obj->isr_hdl); + esp_intr_disable(port->isr_hdl); usb_dwc_hal_core_soft_reset(port->hal); port->state = HCD_PORT_STATE_NOT_POWERED; port->last_event = HCD_PORT_EVENT_NONE; @@ -1537,7 +1566,7 @@ esp_err_t hcd_port_recover(hcd_port_handle_t port_hdl) // Clear the frame list. We set the frame list register and enable periodic scheduling after a successful reset memset(port->frame_list, 0, FRAME_LIST_LEN * sizeof(uint32_t)); - esp_intr_enable(s_hcd_obj->isr_hdl); + esp_intr_enable(port->isr_hdl); HCD_EXIT_CRITICAL(); return ESP_OK; } diff --git a/components/usb/hub.c b/components/usb/hub.c index d9a2c2b0385..dccd92ba445 100644 --- a/components/usb/hub.c +++ b/components/usb/hub.c @@ -11,6 +11,7 @@ #include #include "esp_err.h" #include "esp_heap_caps.h" +#include "esp_bit_defs.h" #include "esp_private/critical_section.h" #include "esp_log.h" #include "usb_private.h" @@ -27,8 +28,6 @@ Implementation of the HUB driver that only supports the Root Hub with a single p implement the bare minimum to control the root HCD port. */ -#define HUB_ROOT_PORT_NUM 1 // HCD only supports one port - #ifdef CONFIG_USB_HOST_HW_BUFFER_BIAS_IN #define HUB_ROOT_HCD_PORT_FIFO_BIAS HCD_PORT_FIFO_BIAS_RX #elif CONFIG_USB_HOST_HW_BUFFER_BIAS_PERIODIC_OUT @@ -60,7 +59,6 @@ typedef enum { ROOT_PORT_STATE_POWERED, /**< Root port is powered, device is not connected */ ROOT_PORT_STATE_DISABLED, /**< A device is connected but is disabled (i.e., not reset, no SOFs are sent) */ ROOT_PORT_STATE_ENABLED, /**< A device is connected, port has been reset, SOFs are sent */ - ROOT_PORT_STATE_RECOVERY, /**< Root port encountered an error and needs to be recovered */ } root_port_state_t; /** @@ -566,7 +564,14 @@ esp_err_t hub_install(hub_config_t *hub_config, void **client_ret) .context = NULL, }; hcd_port_handle_t root_port_hdl; - ret = hcd_port_init(HUB_ROOT_PORT_NUM, &port_config, &root_port_hdl); + + // Right now we support only one root port, can be extended in future + int root_port_index = 0; + if (hub_config->port_map & BIT1) { + root_port_index = 1; + } + + ret = hcd_port_init(root_port_index, &port_config, &root_port_hdl); if (ret != ESP_OK) { ESP_LOGE(HUB_DRIVER_TAG, "HCD Port init error: %s", esp_err_to_name(ret)); goto err; diff --git a/components/usb/include/usb/usb_host.h b/components/usb/include/usb/usb_host.h index 001327d809f..992d783deab 100644 --- a/components/usb/include/usb/usb_host.h +++ b/components/usb/include/usb/usb_host.h @@ -121,6 +121,13 @@ typedef struct { } fifo_settings_custom; /**< Optional custom FIFO configuration (advanced use). RX and NPTX must be > 0. If all fields are zero, a default configuration will be selected based on Kconfig bias. */ + unsigned peripheral_map; /**< Selects the USB peripheral(s) to use. + - On targets with multiple USB peripherals, this field can be used to specify which ones to enable. + - Set to 0 to use the default peripheral. + - On High-Speed capable targets, the default is the High-Speed peripheral. + - On Full-Speed only targets, the default is the Full-Speed peripheral. + - Example: peripheral_map = BIT1; installs USB host on peripheral 1. + - The mapping of bits to specific peripherals is defined in the USB_DWC_LL_GET_HW() macro. */ } usb_host_config_t; /** diff --git a/components/usb/private_include/hcd.h b/components/usb/private_include/hcd.h index 2920a11b997..eeb1f22709f 100644 --- a/components/usb/private_include/hcd.h +++ b/components/usb/private_include/hcd.h @@ -154,9 +154,10 @@ typedef struct { * @brief HCD configuration structure */ typedef struct { - int intr_flags; /**< Interrupt flags for HCD interrupt */ - const hcd_fifo_settings_t *fifo_config;/**< Optional pointer to custom FIFO config. - If NULL, default configuration is used. */ + int intr_flags; /**< Interrupt flags for HCD interrupt */ + const hcd_fifo_settings_t *fifo_config; /**< Optional pointer to custom FIFO config. + If NULL, default configuration is used. */ + unsigned peripheral_map; /**< Bit map of USB-OTG peripherals that belong to HCD. Set to zero to use default */ } hcd_config_t; /** @@ -166,6 +167,7 @@ typedef struct { hcd_port_callback_t callback; /**< HCD port event callback */ void *callback_arg; /**< User argument for HCD port callback */ void *context; /**< Context variable used to associate the port with upper layer object */ + unsigned peripheral_idx; /**< Index of USB peripheral this port belongs to. Index numbers are defined in USB_DWC_LL_GET_HW */ } hcd_port_config_t; /** @@ -225,8 +227,6 @@ esp_err_t hcd_uninstall(void); * * After a port is initialized, it will be put into the HCD_PORT_STATE_NOT_POWERED state. * - * @note The host controller only has one port, thus the only valid port_number is 1 - * * @param[in] port_number Port number * @param[in] port_config Port configuration * @param[out] port_hdl Port handle diff --git a/components/usb/private_include/hub.h b/components/usb/private_include/hub.h index c5ca0aec88b..e47e11c1891 100644 --- a/components/usb/private_include/hub.h +++ b/components/usb/private_include/hub.h @@ -60,6 +60,7 @@ typedef void (*hub_event_cb_t)(hub_event_data_t *event_data, void *arg); * @brief Hub driver configuration */ typedef struct { + unsigned port_map; /**< Bitmap of root ports to enable */ usb_proc_req_cb_t proc_req_cb; /**< Processing request callback */ void *proc_req_cb_arg; /**< Processing request callback argument */ hub_event_cb_t event_cb; /**< Hub event callback */ diff --git a/components/usb/usb_host.c b/components/usb/usb_host.c index f75459d64e5..98c04c4433c 100644 --- a/components/usb/usb_host.c +++ b/components/usb/usb_host.c @@ -17,9 +17,11 @@ Warning: The USB Host Library API is still a beta version and may be subject to #include "freertos/queue.h" #include "freertos/semphr.h" #include "esp_private/critical_section.h" +#include "soc/usb_dwc_periph.h" #include "esp_err.h" #include "esp_log.h" #include "esp_heap_caps.h" +#include "esp_bit_defs.h" #include "hub.h" #include "enum.h" #include "usbh.h" @@ -466,16 +468,26 @@ esp_err_t usb_host_install(const usb_host_config_t *config) - Hub */ + // For backward compatibility accept 0 too + const unsigned peripheral_map = config->peripheral_map == 0 ? BIT0 : config->peripheral_map; + // Install USB PHY (if necessary). USB PHY driver will also enable the underlying Host Controller if (!config->skip_phy_setup) { + bool init_utmi_phy = false; // Default value for Linux simulation + +#if SOC_USB_OTG_SUPPORTED // In case we run on a real target, select the PHY from usb_dwc_info description structure + // Right now we support only one peripheral, can be extended in future + int peripheral_index = 0; + if (peripheral_map & BIT1) { + peripheral_index = 1; + } + init_utmi_phy = (usb_dwc_info.controllers[peripheral_index].supported_phys == USB_PHY_INST_UTMI_0); +#endif // SOC_USB_OTG_SUPPORTED + // Host Library defaults to internal PHY usb_phy_config_t phy_config = { .controller = USB_PHY_CTRL_OTG, -#if CONFIG_IDF_TARGET_ESP32P4 // ESP32-P4 has 2 USB-DWC peripherals, each with its dedicated PHY. We support HS+UTMI only ATM. - .target = USB_PHY_TARGET_UTMI, -#else - .target = USB_PHY_TARGET_INT, -#endif + .target = init_utmi_phy ? USB_PHY_TARGET_UTMI : USB_PHY_TARGET_INT, .otg_mode = USB_OTG_MODE_HOST, .otg_speed = USB_PHY_SPEED_UNDEFINED, // In Host mode, the speed is determined by the connected device .ext_io_conf = NULL, @@ -493,6 +505,7 @@ esp_err_t usb_host_install(const usb_host_config_t *config) hcd_fifo_settings_t user_fifo_config; hcd_config_t hcd_config = { .intr_flags = config->intr_flags, + .peripheral_map = peripheral_map, .fifo_config = NULL, // Default: use bias strategy from Kconfig }; @@ -547,6 +560,7 @@ esp_err_t usb_host_install(const usb_host_config_t *config) // Install Hub hub_config_t hub_config = { + .port_map = peripheral_map, // Each USB-OTG peripheral maps to a root port .proc_req_cb = proc_req_callback, .proc_req_cb_arg = NULL, .event_cb = hub_event_callback, diff --git a/docs/en/api-reference/peripherals/usb_host.rst b/docs/en/api-reference/peripherals/usb_host.rst index d90b6dc8197..9446d3a306c 100644 --- a/docs/en/api-reference/peripherals/usb_host.rst +++ b/docs/en/api-reference/peripherals/usb_host.rst @@ -33,6 +33,7 @@ The Host Library has the following features: :esp32p4: - Supports High Speed (HS), Full Speed (FS) and Low Speed (LS) Devices. - Supports all four transfer types: Control, Bulk, Interrupt, and Isochronous. :esp32p4: - Supports High-Bandwidth Isochronous endpoints. + :esp32p4: - {IDF_TARGET_NAME} includes two USB 2.0 OTG peripherals: one High-Speed and one Full-Speed. Both support USB Host functionality; however, due to a current software limitation, only one can operate as a USB Host at a time. Support for dual USB Host operation is planned for a future update. - Allows multiple class drivers to run simultaneously, i.e., multiple clients of the Host Library. - A single device can be used by multiple clients simultaneously, e.g., composite devices. - The Host Library itself and the underlying Host Stack does not internally instantiate any OS tasks. The number of tasks is entirely controlled by how the Host Library interface is used. However, a general rule of thumb regarding the number of tasks is ``(the number of host class drivers running + 1)``. @@ -46,7 +47,6 @@ Currently, the Host Library and the underlying Host Stack has the following limi - Only supports Asynchronous transfers. - Only supports using one configuration. Changing to other configurations after enumeration is not supported yet. - Transfer timeouts are not supported yet. - :esp32p4: - {IDF_TARGET_NAME} contains two USB-OTG peripherals USB 2.0 OTG High-Speed and USB 2.0 OTG Full-Speed. Only the High-Speed instance is supported now. - The External Hub Driver: Remote Wakeup feature is not supported (External Hubs are active, even if there are no devices inserted). - The External Hub Driver: Doesn't handle error cases (overcurrent handling, errors during initialization etc. are not implemented yet). - The External Hub Driver: No Interface selection. The Driver uses the first available Interface with Hub Class code (09h). diff --git a/examples/peripherals/usb/host/usb_host_lib/main/usb_host_lib_main.c b/examples/peripherals/usb/host/usb_host_lib/main/usb_host_lib_main.c index f1a2dc348a5..a7da50caacc 100644 --- a/examples/peripherals/usb/host/usb_host_lib/main/usb_host_lib_main.c +++ b/examples/peripherals/usb/host/usb_host_lib/main/usb_host_lib_main.c @@ -113,8 +113,10 @@ static void usb_host_lib_task(void *arg) # ifdef ENABLE_ENUM_FILTER_CALLBACK .enum_filter_cb = set_config_cb, # endif // ENABLE_ENUM_FILTER_CALLBACK + .peripheral_map = BIT0, }; ESP_ERROR_CHECK(usb_host_install(&host_config)); + ESP_LOGI(TAG, "USB Host installed with peripheral map 0x%x", host_config.peripheral_map); //Signalize the app_main, the USB host library has been installed xTaskNotifyGive(arg); From e48a920176f27cfabe84803302cca2ad5b1edfe6 Mon Sep 17 00:00:00 2001 From: Zhang Shuxian Date: Thu, 8 May 2025 14:21:46 +0800 Subject: [PATCH 116/213] docs: Update CN for usb_host.rst --- docs/en/api-reference/peripherals/usb_host.rst | 2 +- docs/zh_CN/api-reference/peripherals/usb_host.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/api-reference/peripherals/usb_host.rst b/docs/en/api-reference/peripherals/usb_host.rst index 9446d3a306c..b81613bcc04 100644 --- a/docs/en/api-reference/peripherals/usb_host.rst +++ b/docs/en/api-reference/peripherals/usb_host.rst @@ -33,7 +33,7 @@ The Host Library has the following features: :esp32p4: - Supports High Speed (HS), Full Speed (FS) and Low Speed (LS) Devices. - Supports all four transfer types: Control, Bulk, Interrupt, and Isochronous. :esp32p4: - Supports High-Bandwidth Isochronous endpoints. - :esp32p4: - {IDF_TARGET_NAME} includes two USB 2.0 OTG peripherals: one High-Speed and one Full-Speed. Both support USB Host functionality; however, due to a current software limitation, only one can operate as a USB Host at a time. Support for dual USB Host operation is planned for a future update. + :esp32p4: - {IDF_TARGET_NAME} includes two USB 2.0 OTG peripherals: one High-Speed and one Full-Speed. Both support USB Host functionality. However, due to a current software limitation, only one can operate as a USB Host at a time. Support for dual USB Host operation is planned for a future update. - Allows multiple class drivers to run simultaneously, i.e., multiple clients of the Host Library. - A single device can be used by multiple clients simultaneously, e.g., composite devices. - The Host Library itself and the underlying Host Stack does not internally instantiate any OS tasks. The number of tasks is entirely controlled by how the Host Library interface is used. However, a general rule of thumb regarding the number of tasks is ``(the number of host class drivers running + 1)``. diff --git a/docs/zh_CN/api-reference/peripherals/usb_host.rst b/docs/zh_CN/api-reference/peripherals/usb_host.rst index 61350c9c5d4..871203d9fae 100644 --- a/docs/zh_CN/api-reference/peripherals/usb_host.rst +++ b/docs/zh_CN/api-reference/peripherals/usb_host.rst @@ -33,6 +33,7 @@ USB 主机库(以下简称主机库)是 USB 主机栈的最底层,提供 :esp32p4: - 支持高速 (HS)、全速 (FS) 和低速 (LS) 设备。 - 支持四种传输类型,即控制传输、块传输、中断传输和同步传输。 :esp32p4: - 支持高带宽等时性端点。 + :esp32p4: - {IDF_TARGET_NAME} 包含两个 USB 2.0 OTG 外设:USB 2.0 OTG 高速和 USB 2.0 OTG 全速,二者均支持 USB 主机功能。但由于当前软件的限制,同一时间仅能有一个作为 USB 主机工作。未来版本计划支持两个 USB 主机同时运行。 - 支持多个 Class 驱动程序同时运行,即主机的多个客户端同时运行。 - 单个设备可以由多个客户端同时使用,如复合设备。 - 主机库及其底层主机栈不会在内部自动创建操作系统任务,任务数量完全由主机库接口的使用方式决定。一般来说,任务数量为 ``(运行中的主机 Class 驱动程序数量 + 1)``。 @@ -46,7 +47,6 @@ USB 主机库(以下简称主机库)是 USB 主机栈的最底层,提供 - 仅支持异步传输。 - 仅支持使用发现的首个配置,尚不支持变更为其他配置。 - 尚不支持传输超时。 - :esp32p4: - {IDF_TARGET_NAME} 包含两个 USB-OTG 外设:USB 2.0 OTG 高速和 USB 2.0 OTG 全速。目前仅支持高速实例。 - 外部 Hub 驱动:不支持远程唤醒功能(即使没有设备插入,外部 Hub 也处于工作状态)。 - 外部 Hub 驱动:不处理错误用例(尚未实现过流处理、初始化错误等功能)。 - 外部 Hub 驱动:不支持接口选择。驱动程序使用具有 Hub 类代码 (09h) 的第一个可用接口。 From aca02616b6daf5f2c53a958f659540a926c17b46 Mon Sep 17 00:00:00 2001 From: Peter Macko Date: Tue, 17 Jun 2025 15:32:39 +0200 Subject: [PATCH 117/213] ci: macOS runners - set CCACHE back to 50GB to help VMs --- .gitlab/ci/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab/ci/build.yml b/.gitlab/ci/build.yml index f3d0f7df4d3..df6a07fda45 100644 --- a/.gitlab/ci/build.yml +++ b/.gitlab/ci/build.yml @@ -237,7 +237,7 @@ pytest_build_system_macos: PYENV_VERSION: "3.8" # CCACHE_DIR: "/cache/idf_ccache". On macOS, you cannot write to this folder due to insufficient permissions. CCACHE_DIR: "" # ccache will use "$HOME/Library/Caches/ccache". - CCACHE_MAXSIZE: "5G" # To preserve the limited Macbook storage. CCACHE automatically prunes old caches to fit the set limit. + build_docker: extends: - .before_script:minimal From 33c3a2ab454112bb7a07ee7969eaf041ee437c89 Mon Sep 17 00:00:00 2001 From: "sonika.rathi" Date: Tue, 24 Jun 2025 13:48:38 +0200 Subject: [PATCH 118/213] fix(sdmmc): fix sdmmc initialization issue in caused by CMD52 CRC error --- components/sdmmc/sdmmc_io.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/components/sdmmc/sdmmc_io.c b/components/sdmmc/sdmmc_io.c index 64492f2da3f..4c42ab96386 100644 --- a/components/sdmmc/sdmmc_io.c +++ b/components/sdmmc/sdmmc_io.c @@ -66,9 +66,12 @@ esp_err_t sdmmc_io_reset(sdmmc_card_t* card) { uint8_t sdio_reset = CCCR_CTL_RES; esp_err_t err = sdmmc_io_rw_direct(card, 0, SD_IO_CCCR_CTL, SD_ARG_CMD52_WRITE, &sdio_reset); - if (err == ESP_ERR_TIMEOUT || (host_is_spi(card) && err == ESP_ERR_NOT_SUPPORTED)) { + if (err == ESP_ERR_TIMEOUT || (host_is_spi(card) && err == ESP_ERR_NOT_SUPPORTED) || err == ESP_ERR_INVALID_CRC) { /* Non-IO cards are allowed to time out (in SD mode) or * return "invalid command" error (in SPI mode). + * CRC errors are also allowed as the card may be in a state where + * CRC is enabled from a previous session, especially after ESP32 restart + * without power cycling the SD card. */ } else if (err == ESP_ERR_NOT_FOUND) { ESP_LOGD(TAG, "%s: card not present", __func__); From fc13f2f5ccb151e2ff3d07366ab97b8b2e7100e7 Mon Sep 17 00:00:00 2001 From: gaoxu Date: Wed, 21 May 2025 11:43:10 +0800 Subject: [PATCH 119/213] fix(cam): decrease i2c sccb frequency for camera --- .../sensor_init/include/example_sensor_init_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/peripherals/camera/common_components/sensor_init/include/example_sensor_init_config.h b/examples/peripherals/camera/common_components/sensor_init/include/example_sensor_init_config.h index dd3acc47201..1aa6a81dc05 100644 --- a/examples/peripherals/camera/common_components/sensor_init/include/example_sensor_init_config.h +++ b/examples/peripherals/camera/common_components/sensor_init/include/example_sensor_init_config.h @@ -10,7 +10,7 @@ extern "C" { #endif -#define EXAMPLE_CAM_SCCB_FREQ (100000) +#define EXAMPLE_CAM_SCCB_FREQ (10 * 1000) #ifdef __cplusplus } From f9889909bb8c6deffc68dd69fecb9204cc302944 Mon Sep 17 00:00:00 2001 From: gaoxu Date: Wed, 21 May 2025 11:43:44 +0800 Subject: [PATCH 120/213] fix(cam): fix dvp can not get cam_buffer --- .../esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c b/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c index a3627d157de..97e803ed062 100644 --- a/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c +++ b/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c @@ -146,8 +146,11 @@ static IRAM_ATTR esp_err_t esp_cam_ctlr_dvp_start_trans(esp_cam_ctlr_dvp_cam_t * ESP_RETURN_ON_ERROR_ISR(esp_cam_ctlr_dvp_dma_stop(&ctlr->dma), TAG, "failed to stop DMA"); } - if (ctlr->cbs.on_get_new_trans && ctlr->cbs.on_get_new_trans(&(ctlr->base), &trans, ctlr->cbs_user_data)) { - buffer_ready = true; + if (ctlr->cbs.on_get_new_trans) { + ctlr->cbs.on_get_new_trans(&(ctlr->base), &trans, ctlr->cbs_user_data); + if (trans.buffer) { + buffer_ready = true; + } } else if (!ctlr->bk_buffer_dis) { trans.buffer = ctlr->backup_buffer; trans.buflen = ctlr->fb_size_in_bytes; @@ -719,13 +722,14 @@ esp_err_t esp_cam_new_dvp_ctlr(const esp_cam_ctlr_dvp_config_t *config, esp_cam_ .port = config->ctlr_id, .byte_swap_en = config->byte_swap_en, }; - cam_hal_init(&ctlr->hal, &cam_hal_config); if (!config->pin_dont_init) { ESP_GOTO_ON_ERROR(esp_cam_ctlr_dvp_init(config->ctlr_id, config->clk_src, config->pin), fail5, TAG, "failed to initialize clock and GPIO"); } + cam_hal_init(&ctlr->hal, &cam_hal_config); + ctlr->ctlr_id = config->ctlr_id; ctlr->fb_size_in_bytes = fb_size_in_bytes; ctlr->dvp_fsm = ESP_CAM_CTLR_DVP_CAM_FSM_INIT; From 061967b55d498dcb93f9d7bdb56b359b70db3662 Mon Sep 17 00:00:00 2001 From: gaoxu Date: Mon, 2 Jun 2025 12:51:32 +0800 Subject: [PATCH 121/213] feat(cam): add esp32p4 dvp example --- examples/peripherals/.build-test-rules.yml | 7 + .../peripherals/camera/dvp_dsi/CMakeLists.txt | 8 + examples/peripherals/camera/dvp_dsi/README.md | 156 +++++++++++++++ .../camera/dvp_dsi/main/CMakeLists.txt | 4 + .../camera/dvp_dsi/main/Kconfig.projbuild | 45 +++++ .../camera/dvp_dsi/main/dvp_dsi_main.c | 184 ++++++++++++++++++ .../camera/dvp_dsi/main/example_config.h | 57 ++++++ .../camera/dvp_dsi/main/idf_component.yml | 7 + .../camera/dvp_dsi/pytest_dvp_dsi.py | 11 ++ .../camera/dvp_dsi/sdkconfig.defaults | 1 + .../camera/dvp_dsi/sdkconfig.defaults.esp32p4 | 4 + 11 files changed, 484 insertions(+) create mode 100644 examples/peripherals/camera/dvp_dsi/CMakeLists.txt create mode 100644 examples/peripherals/camera/dvp_dsi/README.md create mode 100644 examples/peripherals/camera/dvp_dsi/main/CMakeLists.txt create mode 100644 examples/peripherals/camera/dvp_dsi/main/Kconfig.projbuild create mode 100644 examples/peripherals/camera/dvp_dsi/main/dvp_dsi_main.c create mode 100644 examples/peripherals/camera/dvp_dsi/main/example_config.h create mode 100644 examples/peripherals/camera/dvp_dsi/main/idf_component.yml create mode 100644 examples/peripherals/camera/dvp_dsi/pytest_dvp_dsi.py create mode 100644 examples/peripherals/camera/dvp_dsi/sdkconfig.defaults create mode 100644 examples/peripherals/camera/dvp_dsi/sdkconfig.defaults.esp32p4 diff --git a/examples/peripherals/.build-test-rules.yml b/examples/peripherals/.build-test-rules.yml index 2a50ea7602a..d5b71903ae2 100644 --- a/examples/peripherals/.build-test-rules.yml +++ b/examples/peripherals/.build-test-rules.yml @@ -32,6 +32,13 @@ examples/peripherals/analog_comparator: - esp_driver_gpio - esp_driver_ana_cmpr +examples/peripherals/camera/dvp_dsi: + disable: + - if: SOC_LCDCAM_CAM_SUPPORTED != 1 or SOC_MIPI_DSI_SUPPORTED != 1 + depends_components: + - esp_lcd + - esp_driver_cam + examples/peripherals/camera/dvp_isp_dsi: disable: - if: SOC_ISP_DVP_SUPPORTED != 1 or SOC_MIPI_DSI_SUPPORTED != 1 diff --git a/examples/peripherals/camera/dvp_dsi/CMakeLists.txt b/examples/peripherals/camera/dvp_dsi/CMakeLists.txt new file mode 100644 index 00000000000..df4e6c36524 --- /dev/null +++ b/examples/peripherals/camera/dvp_dsi/CMakeLists.txt @@ -0,0 +1,8 @@ +# The following lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +idf_build_set_property(MINIMAL_BUILD ON) +project(dvp_dsi) diff --git a/examples/peripherals/camera/dvp_dsi/README.md b/examples/peripherals/camera/dvp_dsi/README.md new file mode 100644 index 00000000000..f6408ca4f26 --- /dev/null +++ b/examples/peripherals/camera/dvp_dsi/README.md @@ -0,0 +1,156 @@ +| Supported Targets | ESP32-P4 | +| ----------------- | -------- | + + +# DVP Camera display via DSI example + +## Overview + +This example demonstrates how to use the esp_driver_cam component to capture DVP camera sensor signals and display it via DSI interface. This example will auto-detect camera sensors via [ESP camera sensor driver](https://components.espressif.com/components/espressif/esp_cam_sensor) and capture camera sensor signals via DVP interface and display it via DSI interface. + +## Usage + +The subsections below give only absolutely necessary information. For full steps to configure ESP-IDF and use it to build and run projects, see [ESP-IDF Getting Started](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html#get-started). + + +### Hardware Required + +- OV2640 camera sensor, or other camera sensors with DVP port that can output RGB565 format color data +- EK79007 LCD screen +- ESP32P4 devkit + +**Note:** For EK79007 you will need to connect following pins: +- 5V - 5V +- GND - GND +- RST_LCD - 3V3 + +You can also connect camera sensors and LCD screens from other vendors to the ESP chip, you can find corresponding camera or LCD drivers from [ESP Component Registry](https://components.espressif.com), or design your own customized drivers. + + + GND GND + ┌────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────┐ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ ┌───────────────┴─────────────┴──────────────────┐ │ + │ │ │ ┌──────────┴───────────┐ + │ │ │ DSI DATA 1P │ │ + │ │ ├───────────────────────────┤ │ + ┌───────────┴─────────┐ │ │ │ │ + │ │ │ │ DSI DATA 1N │ │ + │ │ │ ├───────────────────────────┤ │ + │ │ XCLK │ ESP32-P4 │ │ │ + │ DVP Camera ├──────────────────────┤ │ DSI CLK N │ LCD Screen │ + │ │ │ ├───────────────────────────┤ │ + │ │ D0~7 │ │ │ │ + │ ├──────────────────────┤ │ DSI CLK P │ │ + │ │ │ ├───────────────────────────┤ │ + │ │ PCLK │ │ │ │ + │ ├──────────────────────┤ │ DSI DATA 0P │ │ + │ │ │ ├───────────────────────────┤ │ + │ │ VSYNC │ │ │ │ + │ ├──────────────────────┤ │ DSI DATA 0N │ │ + │ │ │ ├───────────────────────────┤ │ + │ │ DE (HREF) │ │ │ │ + │ ├──────────────────────┤ │ └──────────────────────┘ + │ │ │ │ + └───────┬──┬──────────┘ │ │ + │ │ I2C SCL │ │ + │ └─────────────────────────────────┤ │ + │ I2C SDA │ │ + └────────────────────────────────────┤ │ + └────────────────────────────────────────────────┘ + + +### Set Chip Target + +First of all, your target must be supported by both: + +- **By your ESP-IDF version**: For the full list of supported targets, run: + ``` + idf.py --list-targets + ``` +- **By this example**: For the full list of supported targets, refer to the supported targets table at the top of this README. + +After you make sure that your target is supported, go to your example project directory and [set the chip target](https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/tools/idf-py.html#select-the-target-chip-set-target): + +``` +idf.py set-target +``` + +For example, to set esp32-P4 as the chip target, run: + +``` +idf.py set-target esp32p4 +``` + + +### Configure the Project + +For information about Kconfig options, see [Project Configuration](https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/kconfig.html) > _Name of relevant section(s)_. + +To conveniently check or modify Kconfig options for this example in a project configuration menu, run: + +``` +idf.py menuconfig +``` + +``` +Set CONFIG_CAMERA_OV2640 to y +``` + +Remember to select the LCD screen model and set corresponding correct horizontal/vertical resolution in ``menuconfig`` > ``Example DSI Configuration``. + +Available options for the camera sensor output horizontal/vertical resolution can be seen in ``menuconfig`` > ``Example Configuration``. + + +### Build and Flash + +Execute the following command to build the project, flash it to your development board, and run the monitor tool to view the serial output: + +``` +idf.py build flash monitor +``` + +This command can be reduced to `idf.py flash monitor`. + +If the above command fails, check the log on the serial monitor which usually provides information on the possible cause of the issue. + +To exit the serial monitor, use `Ctrl` + `]`. + + +## Example Output + +If you see the following console output, your example should be running correctly: + +``` +I (1481) main_task: Calling app_main() +I (1481) ek79007: version: 1.0.2 +I (1701) ov2640: Detected Camera sensor PID=0x26 +I (1701) sensor_init: fmt[0].name:DVP_8bit_20Minput_RGB565_640x480_6fps +I (1701) sensor_init: fmt[1].name:DVP_8bit_20Minput_YUV422_640x480_6fps +I (1711) sensor_init: fmt[2].name:DVP_8bit_20Minput_JPEG_640x480_25fps +I (1711) sensor_init: fmt[3].name:DVP_8bit_20Minput_RGB565_240x240_25fps +I (1721) sensor_init: fmt[4].name:DVP_8bit_20Minput_YUV422_240x240_25fps +I (1721) sensor_init: fmt[5].name:DVP_8bit_20Minput_JPEG_320x240_50fps +I (1731) sensor_init: fmt[6].name:DVP_8bit_20Minput_JPEG_1280x720_12fps +I (1741) sensor_init: fmt[7].name:DVP_8bit_20Minput_JPEG_1600x1200_12fps +I (1741) sensor_init: fmt[8].name:DVP_8bit_20Minput_RAW8_800x640_30fps +I (1751) sensor_init: fmt[9].name:DVP_8bit_20Minput_RAW8_800x640_15fps +I (1761) sensor_init: fmt[10].name:DVP_8bit_20Minput_RAW8_800x800_15fps +I (1761) sensor_init: fmt[11].name:DVP_8bit_20Minput_RAW8_1024x600_15fps +I (8291) sensor_init: Format in use:DVP_8bit_20Minput_RGB565_640x480_6fps + +``` + + +## Reference + +- Link to the ESP-IDF feature's API reference, for example [ESP-IDF: Camera Controller Driver](https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/camera_driver.html) +- [ESP-IDF Getting Started](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html#get-started) +- [Project Configuration](https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/kconfig.html) (Kconfig Options) diff --git a/examples/peripherals/camera/dvp_dsi/main/CMakeLists.txt b/examples/peripherals/camera/dvp_dsi/main/CMakeLists.txt new file mode 100644 index 00000000000..300b506de94 --- /dev/null +++ b/examples/peripherals/camera/dvp_dsi/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "dvp_dsi_main.c" + INCLUDE_DIRS "." + REQUIRES esp_mm esp_driver_cam esp_driver_i2c dsi_init sensor_init + ) diff --git a/examples/peripherals/camera/dvp_dsi/main/Kconfig.projbuild b/examples/peripherals/camera/dvp_dsi/main/Kconfig.projbuild new file mode 100644 index 00000000000..c0057383a34 --- /dev/null +++ b/examples/peripherals/camera/dvp_dsi/main/Kconfig.projbuild @@ -0,0 +1,45 @@ +menu "Example Configuration" + config EXAMPLE_USED_LDO_CHAN_ID + int "Occupied channel ID of the LDO to power on the MIPI DSI PHY" + default 3 + help + Example used LDO channel ID, you may check datasheet to know more details. + + config EXAMPLE_USED_LDO_VOLTAGE_MV + int "Occupied LDO voltage in mV" + default 2500 + range 0 3300 + help + Example used LDO voltage, in mV + + choice EXAMPLE_CAM_HRES + bool "Set camera horizontal resolution" + default EXAMPLE_CAM_HRES_640 + + config EXAMPLE_CAM_HRES_640 + bool "640" + config EXAMPLE_CAM_HRES_240 + bool "240" + endchoice + + config EXAMPLE_CAM_HRES + int + default 640 if EXAMPLE_CAM_HRES_640 + default 240 if EXAMPLE_CAM_HRES_240 + + choice EXAMPLE_CAM_VRES + bool "Set camera vertical resolution" + default EXAMPLE_CAM_VRES_480 if EXAMPLE_CAM_HRES_640 + default EXAMPLE_CAM_VRES_240 if EXAMPLE_CAM_HRES_240 + + config EXAMPLE_CAM_VRES_480 + bool "480" + config EXAMPLE_CAM_VRES_240 + bool "240" + endchoice + + config EXAMPLE_CAM_VRES + int + default 480 if EXAMPLE_CAM_VRES_480 + default 240 if EXAMPLE_CAM_VRES_240 +endmenu diff --git a/examples/peripherals/camera/dvp_dsi/main/dvp_dsi_main.c b/examples/peripherals/camera/dvp_dsi/main/dvp_dsi_main.c new file mode 100644 index 00000000000..2cc372ac5c2 --- /dev/null +++ b/examples/peripherals/camera/dvp_dsi/main/dvp_dsi_main.c @@ -0,0 +1,184 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include +#include "sdkconfig.h" +#include "esp_attr.h" +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "esp_lcd_mipi_dsi.h" +#include "esp_lcd_panel_ops.h" +#include "esp_ldo_regulator.h" +#include "esp_cache.h" +#include "driver/i2c_master.h" +#include "esp_cam_ctlr.h" +#include "esp_cam_ctlr_dvp.h" +#include "example_dsi_init.h" +#include "example_dsi_init_config.h" +#include "example_sensor_init.h" +#include "example_config.h" + +static const char *TAG = "dvp_dsi"; + +typedef struct { + esp_lcd_panel_handle_t panel_hdl; + void *cam_buf; +} display_update_param_t; + +static bool s_camera_get_new_vb(esp_cam_ctlr_handle_t handle, esp_cam_ctlr_trans_t *trans, void *user_data); +static bool s_camera_get_finished_trans(esp_cam_ctlr_handle_t handle, esp_cam_ctlr_trans_t *trans, void *user_data); + +static bool example_display_update_ready(esp_lcd_panel_handle_t panel, esp_lcd_dpi_panel_event_data_t *edata, void *user_ctx) +{ + display_update_param_t *param = (display_update_param_t *)user_ctx; + esp_lcd_panel_draw_bitmap(param->panel_hdl, 0, 0, CONFIG_EXAMPLE_CAM_HRES, CONFIG_EXAMPLE_CAM_VRES, param->cam_buf); + return false; +} + +void app_main(void) +{ + esp_err_t ret = ESP_FAIL; + esp_lcd_dsi_bus_handle_t mipi_dsi_bus = NULL; + esp_lcd_panel_io_handle_t mipi_dbi_io = NULL; + esp_lcd_panel_handle_t mipi_dpi_panel = NULL; + void *frame_buffer = NULL; + size_t frame_buffer_size = 0; + + //mipi ldo + esp_ldo_channel_handle_t ldo_mipi_phy = NULL; + esp_ldo_channel_config_t ldo_mipi_phy_config = { + .chan_id = CONFIG_EXAMPLE_USED_LDO_CHAN_ID, + .voltage_mv = CONFIG_EXAMPLE_USED_LDO_VOLTAGE_MV, + }; + ESP_ERROR_CHECK(esp_ldo_acquire_channel(&ldo_mipi_phy_config, &ldo_mipi_phy)); + + //---------------DSI Init------------------// + example_dsi_resource_alloc(&mipi_dsi_bus, &mipi_dbi_io, &mipi_dpi_panel, &frame_buffer); + + //---------------Necessary variable config------------------// + frame_buffer_size = CONFIG_EXAMPLE_MIPI_DSI_DISP_HRES * CONFIG_EXAMPLE_MIPI_DSI_DISP_VRES * EXAMPLE_RGB565_BITS_PER_PIXEL / 8; + + ESP_LOGD(TAG, "CONFIG_EXAMPLE_MIPI_DSI_DISP_HRES: %d, CONFIG_EXAMPLE_MIPI_DSI_DISP_VRES: %d, bits per pixel: %d", CONFIG_EXAMPLE_MIPI_DSI_DISP_HRES, CONFIG_EXAMPLE_MIPI_DSI_DISP_VRES, EXAMPLE_RGB565_BITS_PER_PIXEL); + ESP_LOGD(TAG, "frame_buffer_size: %zu", frame_buffer_size); + ESP_LOGD(TAG, "frame_buffer: %p", frame_buffer); + + size_t cam_buffer_size = CONFIG_EXAMPLE_CAM_HRES * CONFIG_EXAMPLE_CAM_VRES * EXAMPLE_RGB565_BITS_PER_PIXEL / 8; + void *cam_buffer = heap_caps_calloc(1, cam_buffer_size, MALLOC_CAP_DMA | MALLOC_CAP_SPIRAM); + if (!cam_buffer) { + ESP_LOGE(TAG, "no mem for cam_buffer"); + return; + } + esp_cam_ctlr_trans_t cam_trans = { + .buffer = cam_buffer, + .buflen = cam_buffer_size, + }; + + //----------CAM Controller Init------------// + esp_cam_ctlr_handle_t cam_handle = NULL; + esp_cam_ctlr_dvp_pin_config_t pin_cfg = { + .data_width = EXAMPLE_DVP_CAM_DATA_WIDTH, + .data_io = { + EXAMPLE_DVP_CAM_D0_IO, + EXAMPLE_DVP_CAM_D1_IO, + EXAMPLE_DVP_CAM_D2_IO, + EXAMPLE_DVP_CAM_D3_IO, + EXAMPLE_DVP_CAM_D4_IO, + EXAMPLE_DVP_CAM_D5_IO, + EXAMPLE_DVP_CAM_D6_IO, + EXAMPLE_DVP_CAM_D7_IO, + }, + .vsync_io = EXAMPLE_DVP_CAM_VSYNC_IO, + .de_io = EXAMPLE_DVP_CAM_DE_IO, + .pclk_io = EXAMPLE_DVP_CAM_PCLK_IO, + .xclk_io = EXAMPLE_DVP_CAM_XCLK_IO, // Set XCLK pin to generate XCLK signal + }; + + esp_cam_ctlr_dvp_config_t dvp_config = { + .ctlr_id = 0, + .clk_src = CAM_CLK_SRC_DEFAULT, + .h_res = CONFIG_EXAMPLE_CAM_HRES, + .v_res = CONFIG_EXAMPLE_CAM_VRES, + .input_data_color_type = CAM_CTLR_COLOR_RGB565, + .dma_burst_size = 128, + .pin_dont_init = false, + .pin = &pin_cfg, + .bk_buffer_dis = 1, + }; + + ret = esp_cam_new_dvp_ctlr(&dvp_config, &cam_handle); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "dvp init fail[%d]", ret); + return; + } + + //--------Camera Sensor and SCCB Init-----------// + example_sensor_config_t cam_sensor_config = { + .i2c_port_num = I2C_NUM_0, + .i2c_sda_io_num = EXAMPLE_DVP_CAM_SCCB_SDA_IO, + .i2c_scl_io_num = EXAMPLE_DVP_CAM_SCCB_SCL_IO, + .port = ESP_CAM_SENSOR_DVP, + .format_name = EXAMPLE_CAM_FORMAT, + }; + example_sensor_handle_t sensor_handle = { + .sccb_handle = NULL, + .i2c_bus_handle = NULL, + }; + example_sensor_init(&cam_sensor_config, &sensor_handle); + + esp_cam_ctlr_evt_cbs_t cbs = { + .on_get_new_trans = s_camera_get_new_vb, + .on_trans_finished = s_camera_get_finished_trans, + }; + if (esp_cam_ctlr_register_event_callbacks(cam_handle, &cbs, &cam_trans) != ESP_OK) { + ESP_LOGE(TAG, "ops register fail"); + return; + } + + ESP_ERROR_CHECK(esp_cam_ctlr_enable(cam_handle)); + + //---------------DPI Reset------------------// + example_dpi_panel_reset(mipi_dpi_panel); + + //init to all white + memset(frame_buffer, 0xFF, frame_buffer_size); + esp_cache_msync((void *)frame_buffer, frame_buffer_size, ESP_CACHE_MSYNC_FLAG_DIR_C2M); + + example_dpi_panel_init(mipi_dpi_panel); + + if (esp_cam_ctlr_start(cam_handle) != ESP_OK) { + ESP_LOGE(TAG, "Driver start fail"); + return; + } + + // Register DPI panel event callback for display update ready notification + display_update_param_t display_update_param = { + .panel_hdl = mipi_dpi_panel, + .cam_buf = cam_buffer, + }; + esp_lcd_dpi_panel_event_callbacks_t dpi_cbs = { + .on_color_trans_done = example_display_update_ready, + }; + ESP_ERROR_CHECK(esp_lcd_dpi_panel_register_event_callbacks(mipi_dpi_panel, &dpi_cbs, &display_update_param)); + esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, CONFIG_EXAMPLE_CAM_HRES, CONFIG_EXAMPLE_CAM_VRES, cam_buffer); + + while (1) { + vTaskDelay(100 / portTICK_PERIOD_MS); + } +} + +static bool s_camera_get_new_vb(esp_cam_ctlr_handle_t handle, esp_cam_ctlr_trans_t *trans, void *user_data) +{ + esp_cam_ctlr_trans_t cam_trans = *(esp_cam_ctlr_trans_t *)user_data; + trans->buffer = cam_trans.buffer; + trans->buflen = cam_trans.buflen; + return false; +} + +static bool s_camera_get_finished_trans(esp_cam_ctlr_handle_t handle, esp_cam_ctlr_trans_t *trans, void *user_data) +{ + return false; +} diff --git a/examples/peripherals/camera/dvp_dsi/main/example_config.h b/examples/peripherals/camera/dvp_dsi/main/example_config.h new file mode 100644 index 00000000000..b297650636c --- /dev/null +++ b/examples/peripherals/camera/dvp_dsi/main/example_config.h @@ -0,0 +1,57 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include "sdkconfig.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define EXAMPLE_RGB565_BITS_PER_PIXEL (16) + +#define EXAMPLE_DVP_CAM_SCCB_SCL_IO (33) +#define EXAMPLE_DVP_CAM_SCCB_SDA_IO (32) + +#define EXAMPLE_DVP_CAM_XCLK_FREQ_HZ (20000000) + +#define EXAMPLE_DVP_CAM_DATA_WIDTH (8) +#define EXAMPLE_DVP_CAM_D0_IO (53) +#define EXAMPLE_DVP_CAM_D1_IO (54) +#define EXAMPLE_DVP_CAM_D2_IO (26) +#define EXAMPLE_DVP_CAM_D3_IO (1) +#define EXAMPLE_DVP_CAM_D4_IO (0) +#define EXAMPLE_DVP_CAM_D5_IO (45) +#define EXAMPLE_DVP_CAM_D6_IO (46) +#define EXAMPLE_DVP_CAM_D7_IO (47) +#define EXAMPLE_DVP_CAM_XCLK_IO (20) +#define EXAMPLE_DVP_CAM_PCLK_IO (21) +#define EXAMPLE_DVP_CAM_DE_IO (22) +#define EXAMPLE_DVP_CAM_VSYNC_IO (23) +#define EXAMPLE_DVP_CAM_HSYNC_IO (-1) + +#if CONFIG_EXAMPLE_CAM_HRES_640 + +#if CONFIG_EXAMPLE_CAM_VRES_480 +#define EXAMPLE_CAM_FORMAT "DVP_8bit_20Minput_RGB565_640x480_6fps" +#endif + +#elif CONFIG_EXAMPLE_CAM_HRES_240 + +#if CONFIG_EXAMPLE_CAM_VRES_240 +#define EXAMPLE_CAM_FORMAT "DVP_8bit_20Minput_RGB565_240x240_25fps" +#endif + +#endif + +#ifndef EXAMPLE_CAM_FORMAT +#error "Unsupported camera format! Please adjust EXAMPLE_CAM_HRES and EXAMPLE_CAM_VRES in menuconfig" +#endif + +#ifdef __cplusplus +} +#endif diff --git a/examples/peripherals/camera/dvp_dsi/main/idf_component.yml b/examples/peripherals/camera/dvp_dsi/main/idf_component.yml new file mode 100644 index 00000000000..5aeb9ac3f51 --- /dev/null +++ b/examples/peripherals/camera/dvp_dsi/main/idf_component.yml @@ -0,0 +1,7 @@ +dependencies: + idf: + version: ">=5.3.0" + dsi_init: + path: ${IDF_PATH}/examples/peripherals/camera/common_components/dsi_init + sensor_init: + path: ${IDF_PATH}/examples/peripherals/camera/common_components/sensor_init diff --git a/examples/peripherals/camera/dvp_dsi/pytest_dvp_dsi.py b/examples/peripherals/camera/dvp_dsi/pytest_dvp_dsi.py new file mode 100644 index 00000000000..4a5ee1803c2 --- /dev/null +++ b/examples/peripherals/camera/dvp_dsi/pytest_dvp_dsi.py @@ -0,0 +1,11 @@ +# SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 +import pytest +from pytest_embedded import Dut +from pytest_embedded_idf.utils import idf_parametrize + + +@pytest.mark.generic +@idf_parametrize('target', ['esp32p4'], indirect=['target']) +def test_dvp_dsi(dut: Dut) -> None: + dut.expect_exact('Calling app_main()') diff --git a/examples/peripherals/camera/dvp_dsi/sdkconfig.defaults b/examples/peripherals/camera/dvp_dsi/sdkconfig.defaults new file mode 100644 index 00000000000..dc0f8f7a839 --- /dev/null +++ b/examples/peripherals/camera/dvp_dsi/sdkconfig.defaults @@ -0,0 +1 @@ +CONFIG_CAMERA_OV2640=y diff --git a/examples/peripherals/camera/dvp_dsi/sdkconfig.defaults.esp32p4 b/examples/peripherals/camera/dvp_dsi/sdkconfig.defaults.esp32p4 new file mode 100644 index 00000000000..49f03baabba --- /dev/null +++ b/examples/peripherals/camera/dvp_dsi/sdkconfig.defaults.esp32p4 @@ -0,0 +1,4 @@ +CONFIG_IDF_EXPERIMENTAL_FEATURES=y +CONFIG_SPIRAM=y +CONFIG_SPIRAM_SPEED_200M=y +CONFIG_EXAMPLE_MIPI_DSI_DISP_USE_DMA2D=y From e4e0a6be4fa630e1036a9cc500dcc1bafa40b6dd Mon Sep 17 00:00:00 2001 From: gaoxu Date: Mon, 2 Jun 2025 14:56:00 +0800 Subject: [PATCH 122/213] fix(cam): fix dvp do not generate clock --- .../dvp/include/esp_cam_ctlr_dvp.h | 2 + .../dvp/src/esp_cam_ctlr_dvp_cam.c | 10 +++ .../test_apps/dvp/main/test_dvp_driver.c | 89 ++++++++++++++++++- .../camera/dvp_dsi/main/dvp_dsi_main.c | 2 +- 4 files changed, 101 insertions(+), 2 deletions(-) diff --git a/components/esp_driver_cam/dvp/include/esp_cam_ctlr_dvp.h b/components/esp_driver_cam/dvp/include/esp_cam_ctlr_dvp.h index 01cd362a90d..032ab47a21e 100644 --- a/components/esp_driver_cam/dvp/include/esp_cam_ctlr_dvp.h +++ b/components/esp_driver_cam/dvp/include/esp_cam_ctlr_dvp.h @@ -43,10 +43,12 @@ typedef struct esp_cam_ctlr_dvp_config { uint32_t bk_buffer_dis : 1; /*!< Disable backup buffer */ uint32_t pin_dont_init : 1; /*!< Don't initialize DVP pins if users have called "esp_cam_ctlr_dvp_init" before */ uint32_t pic_format_jpeg : 1; /*!< Input picture format is JPEG, if set this flag and "input_data_color_type" will be ignored */ + uint32_t external_xtal : 1; /*!< Using external XTAL, if set, xclk_io and dvp output clock will be ignored */ }; /*!< Boolean Flags */ uint32_t dma_burst_size; /*!< DVP DMA burst transmission block size, set to 0 means to disable the data burst, other value must be power of 2, e.g., 4/8/16/32/64/128 */ + uint32_t xclk_freq; /*!< DVP output clock frequency in HZ, only valid if `external_xtal` is set to true */ const esp_cam_ctlr_dvp_pin_config_t *pin; /*!< DVP pin configuration, this will be ignored by "esp_cam_new_dvp_ctlr" if "pin_dont_init" is set */ } esp_cam_ctlr_dvp_config_t; diff --git a/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c b/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c index 97e803ed062..7a8e0df084a 100644 --- a/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c +++ b/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c @@ -690,6 +690,9 @@ esp_err_t esp_cam_new_dvp_ctlr(const esp_cam_ctlr_dvp_config_t *config, esp_cam_ ESP_RETURN_ON_FALSE(config && ret_handle, ESP_ERR_INVALID_ARG, TAG, "invalid argument: config or ret_handle is null"); ESP_RETURN_ON_FALSE(config->ctlr_id < CAP_DVP_PERIPH_NUM, ESP_ERR_INVALID_ARG, TAG, "invalid argument: ctlr_id >= %d", CAP_DVP_PERIPH_NUM); ESP_RETURN_ON_FALSE(config->pin_dont_init || config->pin, ESP_ERR_INVALID_ARG, TAG, "invalid argument: pin_dont_init is unset and pin is null"); + ESP_RETURN_ON_FALSE(config->external_xtal || config->pin_dont_init || config->pin->xclk_io != GPIO_NUM_NC, ESP_ERR_INVALID_ARG, TAG, "invalid argument: xclk_io is not set"); + ESP_RETURN_ON_FALSE(config->external_xtal || config->xclk_freq, ESP_ERR_INVALID_ARG, TAG, "invalid argument: xclk_freq is not set"); + ESP_RETURN_ON_ERROR(esp_cache_get_alignment(MALLOC_CAP_SPIRAM | MALLOC_CAP_DMA, &alignment_size), TAG, "failed to get cache alignment"); ESP_RETURN_ON_ERROR(esp_cam_ctlr_dvp_cam_get_frame_size(config, &fb_size_in_bytes), TAG, "invalid argument: input frame pixel format is not supported"); ESP_RETURN_ON_ERROR(dvp_shared_ctrl_claim_io_signals(), TAG, "failed to claim io signals"); @@ -724,10 +727,17 @@ esp_err_t esp_cam_new_dvp_ctlr(const esp_cam_ctlr_dvp_config_t *config, esp_cam_ }; if (!config->pin_dont_init) { + // Initialzie DVP clock and GPIO internally ESP_GOTO_ON_ERROR(esp_cam_ctlr_dvp_init(config->ctlr_id, config->clk_src, config->pin), fail5, TAG, "failed to initialize clock and GPIO"); } + if (!config->external_xtal) { + // Generate DVP xtal clock internally + ESP_GOTO_ON_ERROR(esp_cam_ctlr_dvp_output_clock(config->ctlr_id, config->clk_src, config->xclk_freq), + fail5, TAG, "failed to generate xtal clock"); + } + cam_hal_init(&ctlr->hal, &cam_hal_config); ctlr->ctlr_id = config->ctlr_id; diff --git a/components/esp_driver_cam/test_apps/dvp/main/test_dvp_driver.c b/components/esp_driver_cam/test_apps/dvp/main/test_dvp_driver.c index 4f6b7041e81..ec99cc5202a 100644 --- a/components/esp_driver_cam/test_apps/dvp/main/test_dvp_driver.c +++ b/components/esp_driver_cam/test_apps/dvp/main/test_dvp_driver.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -20,6 +20,7 @@ TEST_CASE("TEST DVP driver allocation", "[DVP]") .dma_burst_size = 128, .byte_swap_en = false, .pin_dont_init = true, + .external_xtal = true, }; esp_cam_ctlr_handle_t handle = NULL; TEST_ESP_OK(esp_cam_new_dvp_ctlr(&dvp_config, &handle)); @@ -45,6 +46,7 @@ TEST_CASE("TEST DVP driver allocation with JPEG input", "[DVP]") .byte_swap_en = false, .pin_dont_init = true, .pic_format_jpeg = true, + .external_xtal = true, }; esp_cam_ctlr_handle_t handle = NULL; TEST_ESP_OK(esp_cam_new_dvp_ctlr(&dvp_config, &handle)); @@ -71,6 +73,7 @@ TEST_CASE("TEST DVP driver no backup buffer usage", "[DVP]") .byte_swap_en = false, .bk_buffer_dis = true, .pin_dont_init = true, + .external_xtal = true, }; esp_cam_ctlr_handle_t handle = NULL; TEST_ESP_OK(esp_cam_new_dvp_ctlr(&dvp_config, &handle)); @@ -84,3 +87,87 @@ TEST_CASE("TEST DVP driver no backup buffer usage", "[DVP]") TEST_ASSERT_EQUAL((dvp_config.h_res * dvp_config.v_res * 2), bk_buffer_len); // out type RGB565 using 2 byte / pixel TEST_ESP_OK(esp_cam_ctlr_del(handle)); } + +TEST_CASE("TEST DVP driver intern/extern init", "[DVP]") +{ + esp_cam_ctlr_dvp_config_t dvp_config = { + .ctlr_id = 0, + .clk_src = CAM_CLK_SRC_DEFAULT, + .h_res = 800, + .v_res = 640, + .input_data_color_type = CAM_CTLR_COLOR_RGB565, + .dma_burst_size = 128, + .byte_swap_en = false, + .external_xtal = true, + }; + esp_cam_ctlr_handle_t handle = NULL; + + //Init externally, do not check pin + dvp_config.pin_dont_init = true; + TEST_ESP_OK(esp_cam_new_dvp_ctlr(&dvp_config, &handle)); + TEST_ESP_OK(esp_cam_ctlr_del(handle)); + + //Init internally but not set pin + dvp_config.pin_dont_init = false; + TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_cam_new_dvp_ctlr(&dvp_config, &handle)); + + //Init internally and set pin + esp_cam_ctlr_dvp_pin_config_t pin_cfg = { + .data_width = 8, + }; + dvp_config.pin = &pin_cfg; + TEST_ESP_OK(esp_cam_new_dvp_ctlr(&dvp_config, &handle)); + TEST_ESP_OK(esp_cam_ctlr_del(handle)); +} + +TEST_CASE("TEST DVP driver intern/extern generate xclk", "[DVP]") +{ + esp_cam_ctlr_dvp_config_t dvp_config = { + .ctlr_id = 0, + .clk_src = CAM_CLK_SRC_DEFAULT, + .h_res = 800, + .v_res = 640, + .input_data_color_type = CAM_CTLR_COLOR_RGB565, + .dma_burst_size = 128, + .byte_swap_en = false, + .external_xtal = true, + }; + esp_cam_ctlr_handle_t handle = NULL; + + //Init externally, generate xclk externally, check nothing + dvp_config.pin_dont_init = true; + dvp_config.external_xtal = true; + TEST_ESP_OK(esp_cam_new_dvp_ctlr(&dvp_config, &handle)); + TEST_ESP_OK(esp_cam_ctlr_del(handle)); + + //Init externally, generate xclk internally, do not check pin, check xclk_freq + dvp_config.pin_dont_init = true; + dvp_config.external_xtal = false; + TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_cam_new_dvp_ctlr(&dvp_config, &handle)); + dvp_config.xclk_freq = 20000000; + TEST_ESP_OK(esp_cam_new_dvp_ctlr(&dvp_config, &handle)); + TEST_ESP_OK(esp_cam_ctlr_del(handle)); + + esp_cam_ctlr_dvp_pin_config_t pin_cfg = { + .data_width = 8, + .xclk_io = GPIO_NUM_NC, + }; + + //Init internally, generate xclk externally, check nothing + dvp_config.pin = &pin_cfg; + dvp_config.pin_dont_init = false; + dvp_config.external_xtal = true; + TEST_ESP_OK(esp_cam_new_dvp_ctlr(&dvp_config, &handle)); + TEST_ESP_OK(esp_cam_ctlr_del(handle)); + + //Init internally, generate xclk internally, check xclk_io and xclk_freq + dvp_config.pin = &pin_cfg; + dvp_config.pin_dont_init = false; + dvp_config.external_xtal = false; + TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_cam_new_dvp_ctlr(&dvp_config, &handle)); + + pin_cfg.xclk_io = 20; + dvp_config.pin = &pin_cfg; + TEST_ESP_OK(esp_cam_new_dvp_ctlr(&dvp_config, &handle)); + TEST_ESP_OK(esp_cam_ctlr_del(handle)); +} diff --git a/examples/peripherals/camera/dvp_dsi/main/dvp_dsi_main.c b/examples/peripherals/camera/dvp_dsi/main/dvp_dsi_main.c index 2cc372ac5c2..5e5f6d4053e 100644 --- a/examples/peripherals/camera/dvp_dsi/main/dvp_dsi_main.c +++ b/examples/peripherals/camera/dvp_dsi/main/dvp_dsi_main.c @@ -104,9 +104,9 @@ void app_main(void) .v_res = CONFIG_EXAMPLE_CAM_VRES, .input_data_color_type = CAM_CTLR_COLOR_RGB565, .dma_burst_size = 128, - .pin_dont_init = false, .pin = &pin_cfg, .bk_buffer_dis = 1, + .xclk_freq = EXAMPLE_DVP_CAM_XCLK_FREQ_HZ, }; ret = esp_cam_new_dvp_ctlr(&dvp_config, &cam_handle); From 9e47bd79e446381c3e9e49da4b7cb0554400e37a Mon Sep 17 00:00:00 2001 From: gaoxu Date: Mon, 2 Jun 2025 15:57:50 +0800 Subject: [PATCH 123/213] docs(camera): add lcd_cam dvp driver docs for camera --- .../peripherals/camera_driver.rst | 55 ++++++++++++++++++- .../peripherals/camera_driver.rst | 55 ++++++++++++++++++- 2 files changed, 106 insertions(+), 4 deletions(-) diff --git a/docs/en/api-reference/peripherals/camera_driver.rst b/docs/en/api-reference/peripherals/camera_driver.rst index 501aae81ce1..e4b106c8f5f 100644 --- a/docs/en/api-reference/peripherals/camera_driver.rst +++ b/docs/en/api-reference/peripherals/camera_driver.rst @@ -10,8 +10,9 @@ Introduction .. list:: - : SOC_MIPI_CSI_SUPPORTED : - MIPI Camera Serial Interface (CSI) - : SOC_ISP_DVP_SUPPORTED : - ISP Digital Video Port (ISP DVP) + : SOC_MIPI_CSI_SUPPORTED : - MIPI Camera Serial Interface (MIPI CSI) + : SOC_ISP_DVP_SUPPORTED : - Digital Video Port through ISP module (ISP DVP) + : SOC_LCDCAM_CAM_SUPPORTED : - Digital Video Port through LCD_CAM module(LCD_CAM DVP) The camera controller driver is designed for this hardware peripheral. @@ -38,6 +39,14 @@ Resource Allocation Install Camera Controller Driver ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Camera controller driver can be implemented in one of following ways: + +.. list:: + + : SOC_MIPI_CSI_SUPPORTED : - :cpp:func:`esp_cam_new_csi_ctlr` + : SOC_ISP_DVP_SUPPORTED : - :cpp:func:`esp_cam_new_isp_dvp_ctlr` + : SOC_LCDCAM_CAM_SUPPORTED : - :cpp:func:`esp_cam_new_lcd_cam_ctlr` + .. only:: SOC_MIPI_CSI_SUPPORTED A camera controller driver can be implemented by the CSI peripheral, which requires the configuration that specified by :cpp:type:`esp_cam_ctlr_csi_config_t`. @@ -95,6 +104,48 @@ Install Camera Controller Driver }; ESP_ERROR_CHECK(esp_cam_new_isp_dvp_ctlr(isp_proc, &dvp_ctlr_config, &cam_handle)); +.. only:: SOC_LCDCAM_CAM_SUPPORTED + + A camera controller driver can be implemented by the DVP port of LCD_CAM, which requires the configuration that specified by :cpp:type:`esp_cam_ctlr_dvp_config_t`. + + :cpp:member:`esp_cam_ctlr_dvp_config_t::exexternal_xtal`: set this to use externally generated xclk, otherwise the camera driver will generate it internally. + + If :cpp:type:`esp_cam_ctlr_lcd_cam_cfg_t` is specified, users can call :cpp:func:`esp_cam_new_lcd_cam_ctlr` to allocate and initialize a DVP camera controller handle. This function will return an DVP camera controller handle if it runs correctly. You can take following code as reference. + + .. code:: c + + esp_cam_ctlr_handle_t cam_handle = NULL; + esp_cam_ctlr_dvp_pin_config_t pin_cfg = { + .data_width = EXAMPLE_DVP_CAM_DATA_WIDTH, + .data_io = { + EXAMPLE_DVP_CAM_D0_IO, + EXAMPLE_DVP_CAM_D1_IO, + EXAMPLE_DVP_CAM_D2_IO, + EXAMPLE_DVP_CAM_D3_IO, + EXAMPLE_DVP_CAM_D4_IO, + EXAMPLE_DVP_CAM_D5_IO, + EXAMPLE_DVP_CAM_D6_IO, + EXAMPLE_DVP_CAM_D7_IO, + }, + .vsync_io = EXAMPLE_DVP_CAM_VSYNC_IO, + .de_io = EXAMPLE_DVP_CAM_DE_IO, + .pclk_io = EXAMPLE_DVP_CAM_PCLK_IO, + .xclk_io = EXAMPLE_DVP_CAM_XCLK_IO, // Set XCLK pin to generate XCLK signal + }; + esp_cam_ctlr_dvp_config_t dvp_config = { + .ctlr_id = 0, + .clk_src = CAM_CLK_SRC_DEFAULT, + .h_res = CONFIG_EXAMPLE_CAM_HRES, + .v_res = CONFIG_EXAMPLE_CAM_VRES, + .input_data_color_type = CAM_CTLR_COLOR_RGB565, + .dma_burst_size = 128, + .pin = &pin_cfg, + .bk_buffer_dis = 1, + .xclk_freq = EXAMPLE_DVP_CAM_XCLK_FREQ_HZ, + }; + + ESP_ERROR_CHECK(esp_cam_new_dvp_ctlr(&dvp_config, &cam_handle)); + Uninstall Camera Controller Driver ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/zh_CN/api-reference/peripherals/camera_driver.rst b/docs/zh_CN/api-reference/peripherals/camera_driver.rst index b518772f154..9995f4c5105 100644 --- a/docs/zh_CN/api-reference/peripherals/camera_driver.rst +++ b/docs/zh_CN/api-reference/peripherals/camera_driver.rst @@ -10,8 +10,9 @@ .. list:: - : SOC_MIPI_CSI_SUPPORTED : - MIPI 摄像头串行接口 (CSI) - : SOC_ISP_DVP_SUPPORTED : - ISP 数字视频端口 (ISP DVP) + : SOC_MIPI_CSI_SUPPORTED : - MIPI 摄像头串行接口 (MIPI CSI) + : SOC_ISP_DVP_SUPPORTED : - ISP的DVP端口 (ISP DVP) + : SOC_LCDCAM_CAM_SUPPORTED : - LCD_CAM的DVP端口 (LCD_CAM DVP) 摄像头控制器驱动程序是为上述硬件外设而设计的。 @@ -38,6 +39,14 @@ 安装摄像头控制器驱动程序 ~~~~~~~~~~~~~~~~~~~~~~~~ +摄像头控制器驱动程序可以通过以下方式之一安装: + +.. list:: + + : SOC_MIPI_CSI_SUPPORTED : - :cpp:func:`esp_cam_new_csi_ctlr` + : SOC_ISP_DVP_SUPPORTED : - :cpp:func:`esp_cam_new_isp_dvp_ctlr` + : SOC_LCDCAM_CAM_SUPPORTED : - :cpp:func:`esp_cam_new_lcd_cam_ctlr` + .. only:: SOC_MIPI_CSI_SUPPORTED 摄像头控制器驱动程序可以通过 CSI 外设实现,需要应用 :cpp:type:`esp_cam_ctlr_csi_config_t` 指定的配置。 @@ -95,6 +104,48 @@ }; ESP_ERROR_CHECK(esp_cam_new_isp_dvp_ctlr(isp_proc, &dvp_ctlr_config, &cam_handle)); +.. only:: SOC_LCDCAM_CAM_SUPPORTED + + 摄像头控制器驱动程序可以通过 LCD_CAM外设实现,需要应用 :cpp:type:`esp_cam_ctlr_dvp_config_t` 和 :cpp:type:`esp_cam_ctlr_dvp_pin_config_t` 指定的配置。 + + :cpp:member:`esp_cam_ctlr_dvp_config_t::exexternal_xtal`:使用外部生成的 xclk,或者使用驱动内部内部生成的 xclk。 + + 如果指定了 :cpp:type:`esp_cam_ctlr_dvp_config_t` 中的配置,就可以调用 :cpp:func:`esp_cam_new_dvp_ctlr` 来分配和初始化 DVP 摄像头控制器句柄。如果函数运行正确,将返回一个 DVP 摄像头控制器句柄。请参考以下代码。 + + .. code:: c + + esp_cam_ctlr_handle_t cam_handle = NULL; + esp_cam_ctlr_dvp_pin_config_t pin_cfg = { + .data_width = EXAMPLE_DVP_CAM_DATA_WIDTH, + .data_io = { + EXAMPLE_DVP_CAM_D0_IO, + EXAMPLE_DVP_CAM_D1_IO, + EXAMPLE_DVP_CAM_D2_IO, + EXAMPLE_DVP_CAM_D3_IO, + EXAMPLE_DVP_CAM_D4_IO, + EXAMPLE_DVP_CAM_D5_IO, + EXAMPLE_DVP_CAM_D6_IO, + EXAMPLE_DVP_CAM_D7_IO, + }, + .vsync_io = EXAMPLE_DVP_CAM_VSYNC_IO, + .de_io = EXAMPLE_DVP_CAM_DE_IO, + .pclk_io = EXAMPLE_DVP_CAM_PCLK_IO, + .xclk_io = EXAMPLE_DVP_CAM_XCLK_IO, // Set XCLK pin to generate XCLK signal + }; + esp_cam_ctlr_dvp_config_t dvp_config = { + .ctlr_id = 0, + .clk_src = CAM_CLK_SRC_DEFAULT, + .h_res = CONFIG_EXAMPLE_CAM_HRES, + .v_res = CONFIG_EXAMPLE_CAM_VRES, + .input_data_color_type = CAM_CTLR_COLOR_RGB565, + .dma_burst_size = 128, + .pin = &pin_cfg, + .bk_buffer_dis = 1, + .xclk_freq = EXAMPLE_DVP_CAM_XCLK_FREQ_HZ, + }; + + ESP_ERROR_CHECK(esp_cam_new_dvp_ctlr(&dvp_config, &cam_handle)); + 卸载摄像头控制器驱动程序 ~~~~~~~~~~~~~~~~~~~~~~~~ From ba1ca47fac8ea571dffbdd991e3da0fb84b75fbe Mon Sep 17 00:00:00 2001 From: gaoxu Date: Tue, 29 Apr 2025 15:58:43 +0800 Subject: [PATCH 124/213] feat(cam): add cam sensor handle and deinit api --- .../sensor_init/example_sensor_init.c | 14 +++++++++---- .../sensor_init/include/example_sensor_init.h | 21 ++++++++++++++++--- .../dvp_isp_dsi/main/dvp_isp_dsi_main.c | 7 +++++-- .../mipi_isp_dsi/main/mipi_isp_dsi_main.c | 9 +++++--- .../isp/multi_pipelines/main/isp_dsi_main.c | 11 ++++++---- 5 files changed, 46 insertions(+), 16 deletions(-) diff --git a/examples/peripherals/camera/common_components/sensor_init/example_sensor_init.c b/examples/peripherals/camera/common_components/sensor_init/example_sensor_init.c index 77a6f6636ce..4b315d7d01d 100644 --- a/examples/peripherals/camera/common_components/sensor_init/example_sensor_init.c +++ b/examples/peripherals/camera/common_components/sensor_init/example_sensor_init.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -19,7 +19,7 @@ static const char *TAG = "sensor_init"; -void example_sensor_init(example_sensor_config_t *sensor_config, i2c_master_bus_handle_t *out_i2c_bus_handle) +void example_sensor_init(example_sensor_config_t *sensor_config, example_sensor_handle_t *out_sensor_handle) { esp_err_t ret = ESP_FAIL; @@ -95,6 +95,12 @@ void example_sensor_init(example_sensor_config_t *sensor_config, i2c_master_bus_ ESP_LOGE(TAG, "Start stream fail"); } ESP_ERROR_CHECK(ret); - - *out_i2c_bus_handle = i2c_bus_handle; + out_sensor_handle->i2c_bus_handle = i2c_bus_handle; + out_sensor_handle->sccb_handle = cam_config.sccb_handle; +} + +void example_sensor_deinit(example_sensor_handle_t sensor_handle) +{ + ESP_ERROR_CHECK(esp_sccb_del_i2c_io(sensor_handle.sccb_handle)); + ESP_ERROR_CHECK(i2c_del_master_bus(sensor_handle.i2c_bus_handle)); } diff --git a/examples/peripherals/camera/common_components/sensor_init/include/example_sensor_init.h b/examples/peripherals/camera/common_components/sensor_init/include/example_sensor_init.h index 866cb3dd95f..745a99caa39 100644 --- a/examples/peripherals/camera/common_components/sensor_init/include/example_sensor_init.h +++ b/examples/peripherals/camera/common_components/sensor_init/include/example_sensor_init.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -13,6 +13,14 @@ extern "C" { #endif +/** + * @brief Handle of SCCB interface and sensor + */ +typedef struct { + esp_sccb_io_handle_t sccb_handle; /*!< SCCB io handle that created by `sccb_new_i2c_io` */ + i2c_master_bus_handle_t i2c_bus_handle; /*!< I2C bus handle that created by `i2c_new_master_bus` */ +} example_sensor_handle_t; + /** * @brief Configuration of SCCB interface and sensor */ @@ -28,9 +36,16 @@ typedef struct { * @brief SCCB Interface and Sensor Init * * @param[in] sensor_config Camera sensor configuration - * @param[out] out_i2c_bus_handle I2C bus handle + * @param[out] out_sensor_handle Camera sensor handle */ -void example_sensor_init(example_sensor_config_t *sensor_config, i2c_master_bus_handle_t *out_i2c_bus_handle); +void example_sensor_init(example_sensor_config_t *sensor_config, example_sensor_handle_t *out_sensor_handle); + +/** + * @brief SCCB Interface and Sensor Deinit + * + * @param[in] out_sensor_handle Camera sensor handle + */ +void example_sensor_deinit(example_sensor_handle_t sensor_handle); #ifdef __cplusplus } diff --git a/examples/peripherals/camera/dvp_isp_dsi/main/dvp_isp_dsi_main.c b/examples/peripherals/camera/dvp_isp_dsi/main/dvp_isp_dsi_main.c index 144be169e68..52dbb721e91 100644 --- a/examples/peripherals/camera/dvp_isp_dsi/main/dvp_isp_dsi_main.c +++ b/examples/peripherals/camera/dvp_isp_dsi/main/dvp_isp_dsi_main.c @@ -101,8 +101,11 @@ void app_main(void) .port = ESP_CAM_SENSOR_DVP, .format_name = EXAMPLE_CAM_FORMAT, }; - i2c_master_bus_handle_t i2c_bus_handle = NULL; - example_sensor_init(&cam_sensor_config, &i2c_bus_handle); + example_sensor_handle_t sensor_handle = { + .sccb_handle = NULL, + .i2c_bus_handle = NULL, + }; + example_sensor_init(&cam_sensor_config, &sensor_handle); //---------------ISP Init------------------// isp_proc_handle_t isp_proc = NULL; diff --git a/examples/peripherals/camera/mipi_isp_dsi/main/mipi_isp_dsi_main.c b/examples/peripherals/camera/mipi_isp_dsi/main/mipi_isp_dsi_main.c index 34ef7368e0a..d7f3645da61 100644 --- a/examples/peripherals/camera/mipi_isp_dsi/main/mipi_isp_dsi_main.c +++ b/examples/peripherals/camera/mipi_isp_dsi/main/mipi_isp_dsi_main.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -66,7 +66,10 @@ void app_main(void) }; //--------Camera Sensor and SCCB Init-----------// - i2c_master_bus_handle_t i2c_bus_handle = NULL; + example_sensor_handle_t sensor_handle = { + .sccb_handle = NULL, + .i2c_bus_handle = NULL, + }; example_sensor_config_t cam_sensor_config = { .i2c_port_num = I2C_NUM_0, .i2c_sda_io_num = EXAMPLE_MIPI_CSI_CAM_SCCB_SDA_IO, @@ -74,7 +77,7 @@ void app_main(void) .port = ESP_CAM_SENSOR_MIPI_CSI, .format_name = EXAMPLE_CAM_FORMAT, }; - example_sensor_init(&cam_sensor_config, &i2c_bus_handle); + example_sensor_init(&cam_sensor_config, &sensor_handle); //---------------CSI Init------------------// esp_cam_ctlr_csi_config_t csi_config = { diff --git a/examples/peripherals/isp/multi_pipelines/main/isp_dsi_main.c b/examples/peripherals/isp/multi_pipelines/main/isp_dsi_main.c index 67d1a3d857c..018f522d617 100644 --- a/examples/peripherals/isp/multi_pipelines/main/isp_dsi_main.c +++ b/examples/peripherals/isp/multi_pipelines/main/isp_dsi_main.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -223,7 +223,10 @@ void app_main(void) }; //--------Camera Sensor and SCCB Init-----------// - i2c_master_bus_handle_t i2c_bus_handle = NULL; + example_sensor_handle_t sensor_handle = { + .sccb_handle = NULL, + .i2c_bus_handle = NULL, + }; example_sensor_config_t cam_sensor_config = { .i2c_port_num = I2C_NUM_0, .i2c_sda_io_num = EXAMPLE_MIPI_CSI_CAM_SCCB_SDA_IO, @@ -231,7 +234,7 @@ void app_main(void) .port = ESP_CAM_SENSOR_MIPI_CSI, .format_name = EXAMPLE_CAM_FORMAT, }; - example_sensor_init(&cam_sensor_config, &i2c_bus_handle); + example_sensor_init(&cam_sensor_config, &sensor_handle); //---------------VCM SCCB Init------------------// esp_sccb_io_handle_t dw9714_io_handle = NULL; @@ -240,7 +243,7 @@ void app_main(void) .device_address = EXAMPLE_DW9714_DEV_ADDR, .dev_addr_length = I2C_ADDR_BIT_LEN_7, }; - ESP_ERROR_CHECK(sccb_new_i2c_io(i2c_bus_handle, &i2c_config, &dw9714_io_handle)); + ESP_ERROR_CHECK(sccb_new_i2c_io(sensor_handle.i2c_bus_handle, &i2c_config, &dw9714_io_handle)); //---------------CSI Init------------------// esp_cam_ctlr_csi_config_t csi_config = { From e7899b1d61434674e95fc23572360a641e445880 Mon Sep 17 00:00:00 2001 From: Dong Heng Date: Tue, 24 Jun 2025 16:09:14 +0800 Subject: [PATCH 125/213] fix(esp_driver_cam): Fix DVP get trans buffer error --- components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c b/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c index 7a8e0df084a..b1ab042c74f 100644 --- a/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c +++ b/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c @@ -138,7 +138,7 @@ static esp_err_t esp_cam_ctlr_dvp_config_input_gpio(int pin, int signal, bool in static IRAM_ATTR esp_err_t esp_cam_ctlr_dvp_start_trans(esp_cam_ctlr_dvp_cam_t *ctlr) { bool buffer_ready = false; - esp_cam_ctlr_trans_t trans; + esp_cam_ctlr_trans_t trans = {0}; if (ctlr->cur_buf) { ctlr->cur_buf = NULL; @@ -151,7 +151,9 @@ static IRAM_ATTR esp_err_t esp_cam_ctlr_dvp_start_trans(esp_cam_ctlr_dvp_cam_t * if (trans.buffer) { buffer_ready = true; } - } else if (!ctlr->bk_buffer_dis) { + } + + if (!buffer_ready && !ctlr->bk_buffer_dis) { trans.buffer = ctlr->backup_buffer; trans.buflen = ctlr->fb_size_in_bytes; buffer_ready = true; From ca3f31393825aa5c8c1689fcdd1b4c4cd35f632f Mon Sep 17 00:00:00 2001 From: Song Ruo Jing Date: Thu, 17 Apr 2025 19:20:54 +0800 Subject: [PATCH 126/213] feat(isp_dvp): add SC030IOT camera support to dvp_isp_dsi example --- .../isp_dvp/include/esp_cam_ctlr_isp_dvp.h | 8 ++-- .../dsi_init/Kconfig.projbuild | 7 ++++ .../dsi_init/example_dsi_init.c | 6 ++- .../sensor_init/example_sensor_init.c | 4 ++ .../peripherals/camera/dvp_isp_dsi/README.md | 4 +- .../camera/dvp_isp_dsi/main/Kconfig.projbuild | 26 ++++++++---- .../dvp_isp_dsi/main/dvp_isp_dsi_main.c | 41 ++++++++++++++++--- .../camera/dvp_isp_dsi/main/example_config.h | 32 ++++++++++----- .../camera/dvp_isp_dsi/sdkconfig.defaults | 5 +-- .../dvp_isp_dsi/sdkconfig.defaults.esp32p4 | 3 ++ .../camera/mipi_isp_dsi/sdkconfig.defaults | 3 -- .../mipi_isp_dsi/sdkconfig.defaults.esp32p4 | 3 ++ 12 files changed, 103 insertions(+), 39 deletions(-) create mode 100644 examples/peripherals/camera/dvp_isp_dsi/sdkconfig.defaults.esp32p4 create mode 100644 examples/peripherals/camera/mipi_isp_dsi/sdkconfig.defaults.esp32p4 diff --git a/components/esp_driver_cam/isp_dvp/include/esp_cam_ctlr_isp_dvp.h b/components/esp_driver_cam/isp_dvp/include/esp_cam_ctlr_isp_dvp.h index 10861262fae..6921ed0f23b 100644 --- a/components/esp_driver_cam/isp_dvp/include/esp_cam_ctlr_isp_dvp.h +++ b/components/esp_driver_cam/isp_dvp/include/esp_cam_ctlr_isp_dvp.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -28,9 +28,9 @@ typedef struct { int de_io; ///< ISP DVP de IO numbers struct { uint32_t pclk_invert: 1; ///< The pclk is inverted - uint32_t hsync_invert: 1; ///< The hsync signal is inverted - uint32_t vsync_invert: 1; ///< The vsync signal is inverted - uint32_t de_invert: 1; ///< The de signal is inverted + uint32_t hsync_invert: 1; ///< The hsync signal is inverted (i.e. active low) + uint32_t vsync_invert: 1; ///< The vsync signal is inverted (i.e. active high) + uint32_t de_invert: 1; ///< The de signal is inverted (i.e. active low) } io_flags; ///< ISP DVP IO flags int queue_items; ///< Queue items struct { diff --git a/examples/peripherals/camera/common_components/dsi_init/Kconfig.projbuild b/examples/peripherals/camera/common_components/dsi_init/Kconfig.projbuild index e433698706b..9397e0196f5 100644 --- a/examples/peripherals/camera/common_components/dsi_init/Kconfig.projbuild +++ b/examples/peripherals/camera/common_components/dsi_init/Kconfig.projbuild @@ -45,4 +45,11 @@ menu "Example DSI Configuration" int default 600 if EXAMPLE_MIPI_DSI_DISP_VRES_600 default 1280 if EXAMPLE_MIPI_DSI_DISP_VRES_1280 + + config EXAMPLE_MIPI_DSI_DISP_USE_DMA2D + bool "Use DMA2D to copy data to frame buffer" + default n + help + Enable this option, DMA2D will be used to copy data to the target frame buffer. + This can save some CPU time and improve the performance. endmenu diff --git a/examples/peripherals/camera/common_components/dsi_init/example_dsi_init.c b/examples/peripherals/camera/common_components/dsi_init/example_dsi_init.c index 955f45d7942..3cd506cfc0c 100644 --- a/examples/peripherals/camera/common_components/dsi_init/example_dsi_init.c +++ b/examples/peripherals/camera/common_components/dsi_init/example_dsi_init.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -13,6 +13,7 @@ #include "esp_lcd_ek79007.h" #include "example_dsi_init.h" #include "example_dsi_init_config.h" +#include "sdkconfig.h" void example_dsi_resource_alloc(esp_lcd_dsi_bus_handle_t *mipi_dsi_bus, esp_lcd_panel_io_handle_t *mipi_dbi_io, esp_lcd_panel_handle_t *mipi_dpi_panel, void **frame_buffer) { @@ -47,6 +48,9 @@ void example_dsi_resource_alloc(esp_lcd_dsi_bus_handle_t *mipi_dsi_bus, esp_lcd_ .vsync_pulse_width = EXAMPLE_MIPI_DSI_IMAGE_VSYNC, .vsync_front_porch = EXAMPLE_MIPI_DSI_IMAGE_VFP, }, +#if CONFIG_EXAMPLE_MIPI_DSI_DISP_USE_DMA2D + .flags.use_dma2d = true, +#endif }; #if CONFIG_EXAMPLE_LCD_PATTERN_ILI9881C diff --git a/examples/peripherals/camera/common_components/sensor_init/example_sensor_init.c b/examples/peripherals/camera/common_components/sensor_init/example_sensor_init.c index 4b315d7d01d..c5a0688d656 100644 --- a/examples/peripherals/camera/common_components/sensor_init/example_sensor_init.c +++ b/examples/peripherals/camera/common_components/sensor_init/example_sensor_init.c @@ -81,6 +81,10 @@ void example_sensor_init(example_sensor_config_t *sensor_config, example_sensor_ cam_cur_fmt = (esp_cam_sensor_format_t *) & (parray[i]); } } + if (!cam_cur_fmt) { + ESP_LOGE(TAG, "Unsupported format"); + ESP_ERROR_CHECK(ESP_ERR_INVALID_ARG); + } ret = esp_cam_sensor_set_format(cam, (const esp_cam_sensor_format_t *) cam_cur_fmt); if (ret != ESP_OK) { diff --git a/examples/peripherals/camera/dvp_isp_dsi/README.md b/examples/peripherals/camera/dvp_isp_dsi/README.md index dda9ad49a58..ca481049f9d 100644 --- a/examples/peripherals/camera/dvp_isp_dsi/README.md +++ b/examples/peripherals/camera/dvp_isp_dsi/README.md @@ -15,7 +15,7 @@ The subsections below give only absolutely necessary information. For full steps ### Hardware Required -- OV2640 camera sensor, or other camera sensors with DVP port that can output raw format color data +- OV2640 / SC030IOT camera sensor, or other camera sensors with DVP port that can output raw format color data - EK79007 or ILI9881C LCD screen - ESP32P4 devkit @@ -106,7 +106,7 @@ Set CONFIG_CAMERA_OV2640 to y Remember to select the LCD screen model and set corresponding correct horizontal/vertical resolution in ``menuconfig`` > ``Example DSI Configuration``. -Available options for the camera sensor output horizontal/vertical resolution can be seen in ``menuconfig`` > ``Example Configuration``. Note that the horizontal resolution for the camera should be the same as the LCD screen horizontal resolution. +Available options for the camera sensor output horizontal/vertical resolution can be seen in ``menuconfig`` > ``Example Configuration``. ### Build and Flash diff --git a/examples/peripherals/camera/dvp_isp_dsi/main/Kconfig.projbuild b/examples/peripherals/camera/dvp_isp_dsi/main/Kconfig.projbuild index 9366f21f792..dec207d165b 100644 --- a/examples/peripherals/camera/dvp_isp_dsi/main/Kconfig.projbuild +++ b/examples/peripherals/camera/dvp_isp_dsi/main/Kconfig.projbuild @@ -18,40 +18,48 @@ menu "Example Configuration" choice EXAMPLE_CAM_HRES bool "Set camera horizontal resolution" - default EXAMPLE_CAM_HRES_1024 if EXAMPLE_MIPI_DSI_DISP_HRES_1024 - default EXAMPLE_CAM_HRES_800 if EXAMPLE_MIPI_DSI_DISP_HRES_800 + default EXAMPLE_CAM_HRES_640 config EXAMPLE_CAM_HRES_1024 - depends on EXAMPLE_MIPI_DSI_DISP_HRES_1024 + depends on EXAMPLE_MIPI_DSI_DISP_HRES >= 1024 bool "1024" config EXAMPLE_CAM_HRES_800 - depends on EXAMPLE_MIPI_DSI_DISP_HRES_800 + depends on EXAMPLE_MIPI_DSI_DISP_HRES >= 800 bool "800" + config EXAMPLE_CAM_HRES_640 + depends on EXAMPLE_MIPI_DSI_DISP_HRES >= 640 + bool "640" endchoice config EXAMPLE_CAM_HRES int default 1024 if EXAMPLE_CAM_HRES_1024 default 800 if EXAMPLE_CAM_HRES_800 + default 640 if EXAMPLE_CAM_HRES_640 choice EXAMPLE_CAM_VRES bool "Set camera vertical resolution" - default EXAMPLE_CAM_VRES_600 if EXAMPLE_MIPI_DSI_DISP_VRES_600 - default EXAMPLE_CAM_VRES_640 if EXAMPLE_MIPI_DSI_DISP_VRES_1280 + default EXAMPLE_CAM_VRES_600 if EXAMPLE_CAM_HRES_1024 + default EXAMPLE_CAM_VRES_640 if EXAMPLE_CAM_HRES_800 + default EXAMPLE_CAM_VRES_480 if EXAMPLE_CAM_HRES_640 + config EXAMPLE_CAM_VRES_480 + depends on EXAMPLE_MIPI_DSI_DISP_VRES >= 480 + bool "480" config EXAMPLE_CAM_VRES_600 - depends on EXAMPLE_MIPI_DSI_DISP_VRES_600 + depends on EXAMPLE_MIPI_DSI_DISP_VRES >= 600 bool "600" config EXAMPLE_CAM_VRES_640 - depends on EXAMPLE_MIPI_DSI_DISP_VRES_1280 + depends on EXAMPLE_MIPI_DSI_DISP_VRES >= 640 bool "640" config EXAMPLE_CAM_VRES_800 - depends on EXAMPLE_MIPI_DSI_DISP_VRES_1280 + depends on EXAMPLE_MIPI_DSI_DISP_VRES >= 800 bool "800" endchoice config EXAMPLE_CAM_VRES int + default 480 if EXAMPLE_CAM_VRES_480 default 600 if EXAMPLE_CAM_VRES_600 default 640 if EXAMPLE_CAM_VRES_640 default 800 if EXAMPLE_CAM_VRES_800 diff --git a/examples/peripherals/camera/dvp_isp_dsi/main/dvp_isp_dsi_main.c b/examples/peripherals/camera/dvp_isp_dsi/main/dvp_isp_dsi_main.c index 52dbb721e91..6b56a122336 100644 --- a/examples/peripherals/camera/dvp_isp_dsi/main/dvp_isp_dsi_main.c +++ b/examples/peripherals/camera/dvp_isp_dsi/main/dvp_isp_dsi_main.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -26,6 +26,11 @@ static const char *TAG = "dvp_isp_dsi"; +typedef struct { + esp_lcd_panel_handle_t panel_hdl; + void *cam_buf; +} display_update_param_t; + static bool s_camera_get_new_vb(esp_cam_ctlr_handle_t handle, esp_cam_ctlr_trans_t *trans, void *user_data); static bool s_camera_get_finished_trans(esp_cam_ctlr_handle_t handle, esp_cam_ctlr_trans_t *trans, void *user_data); @@ -54,6 +59,13 @@ static void s_ledc_generate_dvp_xclk(void) ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel)); } +static bool example_display_update_ready(esp_lcd_panel_handle_t panel, esp_lcd_dpi_panel_event_data_t *edata, void *user_ctx) +{ + display_update_param_t *param = (display_update_param_t *)user_ctx; + esp_lcd_panel_draw_bitmap(param->panel_hdl, 0, 0, CONFIG_EXAMPLE_CAM_HRES, CONFIG_EXAMPLE_CAM_VRES, param->cam_buf); + return false; +} + void app_main(void) { esp_err_t ret = ESP_FAIL; @@ -80,15 +92,21 @@ void app_main(void) example_dsi_resource_alloc(&mipi_dsi_bus, &mipi_dbi_io, &mipi_dpi_panel, &frame_buffer); //---------------Necessary variable config------------------// - frame_buffer_size = CONFIG_EXAMPLE_CAM_HRES * CONFIG_EXAMPLE_MIPI_DSI_DISP_VRES * EXAMPLE_RGB565_BITS_PER_PIXEL / 8; + frame_buffer_size = CONFIG_EXAMPLE_MIPI_DSI_DISP_HRES * CONFIG_EXAMPLE_MIPI_DSI_DISP_VRES * EXAMPLE_RGB565_BITS_PER_PIXEL / 8; - ESP_LOGD(TAG, "CONFIG_EXAMPLE_CAM_HRES: %d, CONFIG_EXAMPLE_MIPI_DSI_DISP_VRES: %d, bits per pixel: %d", CONFIG_EXAMPLE_CAM_HRES, CONFIG_EXAMPLE_MIPI_DSI_DISP_VRES, EXAMPLE_RGB565_BITS_PER_PIXEL); + ESP_LOGD(TAG, "CONFIG_EXAMPLE_MIPI_DSI_DISP_HRES: %d, CONFIG_EXAMPLE_MIPI_DSI_DISP_VRES: %d, bits per pixel: %d", CONFIG_EXAMPLE_MIPI_DSI_DISP_HRES, CONFIG_EXAMPLE_MIPI_DSI_DISP_VRES, EXAMPLE_RGB565_BITS_PER_PIXEL); ESP_LOGD(TAG, "frame_buffer_size: %zu", frame_buffer_size); ESP_LOGD(TAG, "frame_buffer: %p", frame_buffer); + size_t cam_buffer_size = CONFIG_EXAMPLE_CAM_HRES * CONFIG_EXAMPLE_CAM_VRES * EXAMPLE_RGB565_BITS_PER_PIXEL / 8; + void *cam_buffer = heap_caps_calloc(1, cam_buffer_size, MALLOC_CAP_DMA | MALLOC_CAP_SPIRAM); + if (!cam_buffer) { + ESP_LOGE(TAG, "no mem for cam_buffer"); + return; + } esp_cam_ctlr_trans_t cam_trans = { - .buffer = frame_buffer, - .buflen = frame_buffer_size, + .buffer = cam_buffer, + .buflen = cam_buffer_size, }; //--------Camera Sensor and SCCB Init-----------// @@ -140,7 +158,7 @@ void app_main(void) .hsync_io = EXAMPLE_ISP_DVP_CAM_HSYNC_IO, .vsync_io = EXAMPLE_ISP_DVP_CAM_VSYNC_IO, .de_io = EXAMPLE_ISP_DVP_CAM_DE_IO, - .io_flags.vsync_invert = 1, + .io_flags.vsync_invert = 1, // active high .queue_items = 10, }; ret = esp_cam_new_isp_dvp_ctlr(isp_proc, &dvp_config, &cam_handle); @@ -174,6 +192,17 @@ void app_main(void) return; } + // Register DPI panel event callback for display update ready notification + display_update_param_t display_update_param = { + .panel_hdl = mipi_dpi_panel, + .cam_buf = cam_buffer, + }; + esp_lcd_dpi_panel_event_callbacks_t dpi_cbs = { + .on_color_trans_done = example_display_update_ready, + }; + ESP_ERROR_CHECK(esp_lcd_dpi_panel_register_event_callbacks(mipi_dpi_panel, &dpi_cbs, &display_update_param)); + esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, CONFIG_EXAMPLE_CAM_HRES, CONFIG_EXAMPLE_CAM_VRES, cam_buffer); + while (1) { ESP_ERROR_CHECK(esp_cam_ctlr_receive(cam_handle, &cam_trans, ESP_CAM_CTLR_MAX_DELAY)); } diff --git a/examples/peripherals/camera/dvp_isp_dsi/main/example_config.h b/examples/peripherals/camera/dvp_isp_dsi/main/example_config.h index 0bf8bd5941c..81b3188c62b 100644 --- a/examples/peripherals/camera/dvp_isp_dsi/main/example_config.h +++ b/examples/peripherals/camera/dvp_isp_dsi/main/example_config.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -20,36 +20,46 @@ extern "C" { #define EXAMPLE_ISP_DVP_CAM_XCLK_FREQ_HZ (20000000) #define EXAMPLE_ISP_DVP_CAM_DATA_WIDTH (8) -#define EXAMPLE_ISP_DVP_CAM_D0_IO (8) -#define EXAMPLE_ISP_DVP_CAM_D1_IO (9) -#define EXAMPLE_ISP_DVP_CAM_D2_IO (10) -#define EXAMPLE_ISP_DVP_CAM_D3_IO (4) -#define EXAMPLE_ISP_DVP_CAM_D4_IO (5) +#define EXAMPLE_ISP_DVP_CAM_D0_IO (53) +#define EXAMPLE_ISP_DVP_CAM_D1_IO (54) +#define EXAMPLE_ISP_DVP_CAM_D2_IO (26) +#define EXAMPLE_ISP_DVP_CAM_D3_IO (1) +#define EXAMPLE_ISP_DVP_CAM_D4_IO (0) #define EXAMPLE_ISP_DVP_CAM_D5_IO (45) #define EXAMPLE_ISP_DVP_CAM_D6_IO (46) #define EXAMPLE_ISP_DVP_CAM_D7_IO (47) #define EXAMPLE_ISP_DVP_CAM_XCLK_IO (20) #define EXAMPLE_ISP_DVP_CAM_PCLK_IO (21) -#define EXAMPLE_ISP_DVP_CAM_DE_IO (2) +#define EXAMPLE_ISP_DVP_CAM_DE_IO (22) #define EXAMPLE_ISP_DVP_CAM_VSYNC_IO (23) #define EXAMPLE_ISP_DVP_CAM_HSYNC_IO (-1) -#if CONFIG_EXAMPLE_CAM_HRES_800 +#if CONFIG_EXAMPLE_CAM_HRES_640 + +#if CONFIG_EXAMPLE_CAM_VRES_480 +#define EXAMPLE_CAM_FORMAT "DVP_8bit_20Minput_RAW8_640x480_26fps" // sc030iot +#endif + +#elif CONFIG_EXAMPLE_CAM_HRES_800 #if CONFIG_EXAMPLE_CAM_VRES_640 -#define EXAMPLE_CAM_FORMAT "DVP_8bit_20Minput_RAW8_800x640_15fps" +#define EXAMPLE_CAM_FORMAT "DVP_8bit_20Minput_RAW8_800x640_15fps" // ov2640 #elif CONFIG_EXAMPLE_CAM_VRES_800 -#define EXAMPLE_CAM_FORMAT "DVP_8bit_20Minput_RAW8_800x800_15fps" +#define EXAMPLE_CAM_FORMAT "DVP_8bit_20Minput_RAW8_800x800_15fps" // ov2640 #endif #elif CONFIG_EXAMPLE_CAM_HRES_1024 #if CONFIG_EXAMPLE_CAM_VRES_600 -#define EXAMPLE_CAM_FORMAT "DVP_8bit_20Minput_RAW8_1024x600_15fps" +#define EXAMPLE_CAM_FORMAT "DVP_8bit_20Minput_RAW8_1024x600_15fps" // ov2640 #endif #endif +#ifndef EXAMPLE_CAM_FORMAT +#error "Unsupported camera format! Please adjust EXAMPLE_CAM_HRES and EXAMPLE_CAM_VRES in menuconfig" +#endif + #ifdef __cplusplus } #endif diff --git a/examples/peripherals/camera/dvp_isp_dsi/sdkconfig.defaults b/examples/peripherals/camera/dvp_isp_dsi/sdkconfig.defaults index 3e05d2e5e64..0204a38fcf8 100644 --- a/examples/peripherals/camera/dvp_isp_dsi/sdkconfig.defaults +++ b/examples/peripherals/camera/dvp_isp_dsi/sdkconfig.defaults @@ -1,4 +1,3 @@ -CONFIG_SPIRAM=y -CONFIG_IDF_EXPERIMENTAL_FEATURES=y -CONFIG_SPIRAM_SPEED_200M=y CONFIG_CAMERA_OV2640=y +CONFIG_CAMERA_SC030IOT=y +CONFIG_EXAMPLE_MIPI_DSI_DISP_USE_DMA2D=y diff --git a/examples/peripherals/camera/dvp_isp_dsi/sdkconfig.defaults.esp32p4 b/examples/peripherals/camera/dvp_isp_dsi/sdkconfig.defaults.esp32p4 new file mode 100644 index 00000000000..2c02a3b7ee1 --- /dev/null +++ b/examples/peripherals/camera/dvp_isp_dsi/sdkconfig.defaults.esp32p4 @@ -0,0 +1,3 @@ +CONFIG_IDF_EXPERIMENTAL_FEATURES=y +CONFIG_SPIRAM=y +CONFIG_SPIRAM_SPEED_200M=y diff --git a/examples/peripherals/camera/mipi_isp_dsi/sdkconfig.defaults b/examples/peripherals/camera/mipi_isp_dsi/sdkconfig.defaults index 6192f176b4a..2a44a906d86 100644 --- a/examples/peripherals/camera/mipi_isp_dsi/sdkconfig.defaults +++ b/examples/peripherals/camera/mipi_isp_dsi/sdkconfig.defaults @@ -1,5 +1,2 @@ -CONFIG_SPIRAM=y -CONFIG_IDF_EXPERIMENTAL_FEATURES=y -CONFIG_SPIRAM_SPEED_200M=y CONFIG_CAMERA_SC2336=y CONFIG_CAMERA_OV5647=y diff --git a/examples/peripherals/camera/mipi_isp_dsi/sdkconfig.defaults.esp32p4 b/examples/peripherals/camera/mipi_isp_dsi/sdkconfig.defaults.esp32p4 new file mode 100644 index 00000000000..2c02a3b7ee1 --- /dev/null +++ b/examples/peripherals/camera/mipi_isp_dsi/sdkconfig.defaults.esp32p4 @@ -0,0 +1,3 @@ +CONFIG_IDF_EXPERIMENTAL_FEATURES=y +CONFIG_SPIRAM=y +CONFIG_SPIRAM_SPEED_200M=y From 6d9484e029269163b7bf81b5090774d53b08ff18 Mon Sep 17 00:00:00 2001 From: Rahul Tank Date: Thu, 26 Jun 2025 10:35:34 +0530 Subject: [PATCH 127/213] fix(nimble): Add missing ble_hs_unlock() call --- components/bt/host/nimble/nimble | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/host/nimble/nimble b/components/bt/host/nimble/nimble index 0e3d2d39bb7..04a97c0c15a 160000 --- a/components/bt/host/nimble/nimble +++ b/components/bt/host/nimble/nimble @@ -1 +1 @@ -Subproject commit 0e3d2d39bb7dad01a70b6e810014c43cea235d24 +Subproject commit 04a97c0c15a03038c8eef53b1e2002b6f6c4c69b From 2dcfc31c05726a1f7c4ad8dbc109d9ff4fef86d4 Mon Sep 17 00:00:00 2001 From: Chen Jichang Date: Thu, 19 Jun 2025 11:31:22 +0800 Subject: [PATCH 128/213] fix(pcnt): fix the accum_value missing when overflow --- components/esp_driver_pcnt/README.md | 39 +++++++++++ components/esp_driver_pcnt/src/pulse_cnt.c | 64 +++++++++++++------ docs/en/api-reference/peripherals/pcnt.rst | 4 ++ docs/zh_CN/api-reference/peripherals/pcnt.rst | 4 ++ 4 files changed, 93 insertions(+), 18 deletions(-) create mode 100644 components/esp_driver_pcnt/README.md diff --git a/components/esp_driver_pcnt/README.md b/components/esp_driver_pcnt/README.md new file mode 100644 index 00000000000..a1f445eba48 --- /dev/null +++ b/components/esp_driver_pcnt/README.md @@ -0,0 +1,39 @@ +# PCNT Driver Design + +## Concurrency + +The count value and the overflow state of the count value are located in *different* registers, resulting in the software being unable to obtain information from both of them in the same read instruction. + +The race condition case is as follow: + +```mermaid +sequenceDiagram + participant HW as PCNT Hardware + participant CPU0_ISR as CPU0_ISR + participant CPU1_Task as CPU1_Task (pcnt_unit_get_count) + participant REG as Reg and Soft accum counter State + + CPU1_Task->>CPU1_Task: Call pcnt_unit_get_count() + Note over REG: intr_status = 0
cnt_reg = cnt_value
accum_value = old_value + CPU1_Task->>CPU1_Task: portENTER_CRITICAL_SAFE() + CPU1_Task->>REG: Read intr_status + Note over CPU1_Task: intr_status=0, no need to do compensation + HW->>REG: Overflow interrupt triggered + Note over REG: intr_status = 1
cnt_reg = 0
accum_value = old_value + REG->>CPU0_ISR: ISR is called + CPU0_ISR->>CPU0_ISR: try portENTER_CRITICAL_SAFE() but spin + + CPU1_Task->>REG: Read cnt_reg(0) + accum_value(old) + CPU1_Task->>CPU1_Task: portEXIT_CRITICAL_SAFE() + + CPU0_ISR->>CPU0_ISR: portENTER_CRITICAL_SAFE() + CPU0_ISR->>REG: Clear interrupt status and update accum_value + Note over REG: intr_status = 0
accum_value = new_value + CPU0_ISR->>CPU0_ISR: portEXIT_CRITICAL_SAFE() + + Note over CPU0_ISR: Process events + Note over CPU1_Task: Return incorrect count ❌ + +``` + +In the software, we determine whether to perform compensation by checking whether the count value exceeds half of the limit. This can prevent counting errors when the overflow frequency is not high. diff --git a/components/esp_driver_pcnt/src/pulse_cnt.c b/components/esp_driver_pcnt/src/pulse_cnt.c index fa5648b9611..63c313eb2dd 100644 --- a/components/esp_driver_pcnt/src/pulse_cnt.c +++ b/components/esp_driver_pcnt/src/pulse_cnt.c @@ -497,10 +497,37 @@ esp_err_t pcnt_unit_get_count(pcnt_unit_handle_t unit, int *value) pcnt_group_t *group = NULL; ESP_RETURN_ON_FALSE_ISR(unit && value, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); group = unit->group; + int temp_value = 0; // the accum_value is also accessed by the ISR, so adding a critical section portENTER_CRITICAL_SAFE(&unit->spinlock); - *value = pcnt_ll_get_count(group->hal.dev, unit->unit_id) + unit->accum_value; + temp_value = pcnt_ll_get_count(group->hal.dev, unit->unit_id) ; + // Check for pending overflow interrupts that haven't been processed yet + // Add compensation to get accurate count + if (unit->flags.accum_count) { + uint32_t intr_status = pcnt_ll_get_intr_status(group->hal.dev); + if (intr_status & PCNT_LL_UNIT_WATCH_EVENT(unit->unit_id)) { + uint32_t event_status = pcnt_ll_get_event_status(group->hal.dev, unit->unit_id); + + // TODO: DIG-683 + // Note, the overflow may be triggered between `pcnt_ll_get_count` and `pcnt_ll_get_event_status` + // In this case, we don't want to do the compensation. + // so we should check the count value is greater(less) than the low(high) limit / 2 to filter this case. + // This workaround is only valid for the case that the counter won't overflow twice between `pcnt_ll_get_count()` and `pcnt_ll_get_intr_status()` + if (event_status & BIT(PCNT_LL_WATCH_EVENT_LOW_LIMIT) && temp_value >= unit->low_limit / 2) { + temp_value += unit->low_limit; + } else if (event_status & BIT(PCNT_LL_WATCH_EVENT_HIGH_LIMIT) && temp_value <= unit->high_limit / 2) { + temp_value += unit->high_limit; + } +#if SOC_PCNT_SUPPORT_STEP_NOTIFY && PCNT_LL_STEP_NOTIFY_DIR_LIMIT + else if (event_status & BIT(PCNT_LL_STEP_EVENT_REACH_LIMIT) && abs(temp_value) <= abs(unit->step_limit) / 2) { + temp_value += unit->step_limit; + } +#endif + } + } + + *value = temp_value + unit->accum_value; portEXIT_CRITICAL_SAFE(&unit->spinlock); return ESP_OK; @@ -951,11 +978,27 @@ IRAM_ATTR static void pcnt_default_isr(void *args) uint32_t intr_status = pcnt_ll_get_intr_status(group->hal.dev); if (intr_status & PCNT_LL_UNIT_WATCH_EVENT(unit_id)) { - pcnt_ll_clear_intr_status(group->hal.dev, PCNT_LL_UNIT_WATCH_EVENT(unit_id)); - // event status word contains information about the real watch event type uint32_t event_status = pcnt_ll_get_event_status(group->hal.dev, unit_id); + // clear interrupt status and update accum_value atomically + portENTER_CRITICAL_ISR(&unit->spinlock); + pcnt_ll_clear_intr_status(group->hal.dev, PCNT_LL_UNIT_WATCH_EVENT(unit_id)); + + if (unit->flags.accum_count) { + if (event_status & BIT(PCNT_LL_WATCH_EVENT_LOW_LIMIT)) { + unit->accum_value += unit->low_limit; + } else if (event_status & BIT(PCNT_LL_WATCH_EVENT_HIGH_LIMIT)) { + unit->accum_value += unit->high_limit; + } +#if SOC_PCNT_SUPPORT_STEP_NOTIFY && PCNT_LL_STEP_NOTIFY_DIR_LIMIT + else if (event_status & BIT(PCNT_LL_STEP_EVENT_REACH_LIMIT)) { + unit->accum_value += unit->step_limit; + } +#endif + } + portEXIT_CRITICAL_ISR(&unit->spinlock); + int count_value = 0; pcnt_unit_zero_cross_mode_t zc_mode = PCNT_UNIT_ZERO_CROSS_INVALID; @@ -973,11 +1016,6 @@ IRAM_ATTR static void pcnt_default_isr(void *args) event_status &= ~BIT(PCNT_LL_STEP_EVENT_REACH_LIMIT); // adjust current count value to the step limit count_value = unit->step_limit; - if (unit->flags.accum_count) { - portENTER_CRITICAL_ISR(&unit->spinlock); - unit->accum_value += unit->step_limit; - portEXIT_CRITICAL_ISR(&unit->spinlock); - } } // step event may happen with other pointer event at the same time, we don't need to process them again event_status &= ~(BIT(PCNT_LL_WATCH_EVENT_LOW_LIMIT) | BIT(PCNT_LL_WATCH_EVENT_HIGH_LIMIT) | @@ -988,20 +1026,10 @@ IRAM_ATTR static void pcnt_default_isr(void *args) event_status &= ~(BIT(PCNT_LL_WATCH_EVENT_LOW_LIMIT)); // adjust the count value to reflect the actual watch point value count_value = unit->low_limit; - if (unit->flags.accum_count) { - portENTER_CRITICAL_ISR(&unit->spinlock); - unit->accum_value += unit->low_limit; - portEXIT_CRITICAL_ISR(&unit->spinlock); - } } else if (event_status & BIT(PCNT_LL_WATCH_EVENT_HIGH_LIMIT)) { event_status &= ~(BIT(PCNT_LL_WATCH_EVENT_HIGH_LIMIT)); // adjust the count value to reflect the actual watch point value count_value = unit->high_limit; - if (unit->flags.accum_count) { - portENTER_CRITICAL_ISR(&unit->spinlock); - unit->accum_value += unit->high_limit; - portEXIT_CRITICAL_ISR(&unit->spinlock); - } } else if (event_status & BIT(PCNT_LL_WATCH_EVENT_THRES0)) { event_status &= ~(BIT(PCNT_LL_WATCH_EVENT_THRES0)); // adjust the count value to reflect the actual watch point value diff --git a/docs/en/api-reference/peripherals/pcnt.rst b/docs/en/api-reference/peripherals/pcnt.rst index 315de62501a..5eff1bcd6a7 100644 --- a/docs/en/api-reference/peripherals/pcnt.rst +++ b/docs/en/api-reference/peripherals/pcnt.rst @@ -326,6 +326,10 @@ The internal hardware counter will be cleared to zero automatically when it reac :cpp:func:`pcnt_unit_clear_count` resets the accumulated count value as well. +.. note:: + + When enabling the count overflow compensation, it is recommended to use as large a high/low count limit as possible, as it can avoid frequent interrupt triggering, improve system performance, and avoid compensation failure due to multiple overflows. + .. _pcnt-power-management: Power Management diff --git a/docs/zh_CN/api-reference/peripherals/pcnt.rst b/docs/zh_CN/api-reference/peripherals/pcnt.rst index 8f67a551cc1..713293a9962 100644 --- a/docs/zh_CN/api-reference/peripherals/pcnt.rst +++ b/docs/zh_CN/api-reference/peripherals/pcnt.rst @@ -326,6 +326,10 @@ PCNT 内部的硬件计数器会在计数达到高/低门限的时候自动清 :cpp:func:`pcnt_unit_clear_count` 会复位该软件累加器。 +.. note:: + + 启用计数溢出补偿时,建议使用尽可能大的高/低计数门限,因为它可以避免中断被频繁触发,提高系统性能,并且避免由于多次溢出而导致的补偿失败。 + .. _pcnt-power-management: 电源管理 From 42123b3115e5ec510978cc70bc50b76bffcde3d9 Mon Sep 17 00:00:00 2001 From: armando Date: Wed, 2 Jul 2025 10:20:00 +0800 Subject: [PATCH 129/213] doc(flash): updated 32bit addr support doc --- .../spi_flash/spi_flash_optional_feature.rst | 14 ++++++++++---- .../spi_flash/spi_flash_optional_feature.rst | 14 ++++++++++---- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/docs/en/api-reference/peripherals/spi_flash/spi_flash_optional_feature.rst b/docs/en/api-reference/peripherals/spi_flash/spi_flash_optional_feature.rst index 8b99de0c0ab..b455d241e26 100644 --- a/docs/en/api-reference/peripherals/spi_flash/spi_flash_optional_feature.rst +++ b/docs/en/api-reference/peripherals/spi_flash/spi_flash_optional_feature.rst @@ -163,17 +163,23 @@ Restrictions .. important:: - Over 16 MB space on flash mentioned above can be only used for ``data saving``, like file system. + The part of flash above 16 MB can be used for data storage, for example using a file system. Mapping data/instructions to 32-bit physical address space (so as to be accessed by the CPU) needs the support of MMU. However {IDF_TARGET_NAME} doesn't support this feature. Only ESP32-S3 and ESP32-P4 supports this up to now. .. only:: SOC_SPI_MEM_SUPPORT_CACHE_32BIT_ADDR_MAP - By default, space over 16 MB on flash mentioned above can be used for ``data saving``, like file system. + For Quad flash chips, by default, the part of flash above 16 MB can be used for data storage, for example using a file system. - Furthermore, to map data/instructions to 32-bit physical address space (so as to be accessed by the CPU), please enable the config ``IDF_EXPERIMENTAL_FEATURES`` and ``BOOTLOADER_CACHE_32BIT_ADDR_QUAD_FLASH``. + *Experimental Feature*: To enable full support for Quad flash addresses above 16MB (for both code execution and data access), enable this experimental feature by setting below options to ``y``: + - :ref:`CONFIG_IDF_EXPERIMENTAL_FEATURES` + - :ref:`CONFIG_BOOTLOADER_CACHE_32BIT_ADDR_QUAD_FLASH` - Please note that, this option is experimental, which means that it can not be used on all flash chips stably. For more information, please contact `Espressif's business team `_. + Please note that, this option is experimental, which means that it can not be used on all Quad flash chips stably. For more information, please contact `Espressif's business team `_. + + .. only:: SOC_SPI_MEM_SUPPORT_OPI_MODE + + For Octal flash chips, this feature is enabled by default if :ref:`CONFIG_ESPTOOLPY_OCT_FLASH` is enabled. .. _oct-flash-doc: diff --git a/docs/zh_CN/api-reference/peripherals/spi_flash/spi_flash_optional_feature.rst b/docs/zh_CN/api-reference/peripherals/spi_flash/spi_flash_optional_feature.rst index 4123c8ea887..dab23edc7f4 100644 --- a/docs/zh_CN/api-reference/peripherals/spi_flash/spi_flash_optional_feature.rst +++ b/docs/zh_CN/api-reference/peripherals/spi_flash/spi_flash_optional_feature.rst @@ -163,17 +163,23 @@ QSPI flash 芯片的 32 位地址支持 .. important:: - 上述超过 16 MB 内存的 flash 区域只能用于 ``数据保存``,如文件系统。 + 上述超过 16 MB 内存的 flash 区域可用于数据存储,例如使用文件系统。 将数据或指令映射到 32 位物理地址空间(以便由 CPU 访问)需要 MMU 的支持。但 {IDF_TARGET_NAME} 并不支持此功能。目前只有 ESP32-S3 和 ESP32-P4 支持此功能。 .. only:: SOC_SPI_MEM_SUPPORT_CACHE_32BIT_ADDR_MAP - 默认情况下,上述超过 16 MB 内存的 flash 区域可用于 ``数据保存``,如文件系统。 + 默认情况下,上述超过 16 MB 内存的 flash 区域可用于数据存储,例如使用文件系统。 - 此外,要将数据或指令映射到 32 位物理地址空间(以便由 CPU 访问),请启用配置 ``IDF_EXPERIMENTAL_FEATURES`` 和 ``BOOTLOADER_CACHE_32BIT_ADDR_QUAD_FLASH``。 + *实验性功能*:如需在超过 16 MB 的四线 flash 区域实现完整支持(包括代码执行和数据访问),请启用以下实验性配置选项: + - :ref:`CONFIG_IDF_EXPERIMENTAL_FEATURES` + - :ref:`CONFIG_BOOTLOADER_CACHE_32BIT_ADDR_QUAD_FLASH` - 请注意,此选项为实验性选项,无法在所有 flash 芯片上稳定使用,详情请咨询 `乐鑫商务部 `_。 + 请注意,此选项为实验性功能,无法在所有四线 flash 芯片上稳定使用。详情请咨询 `乐鑫商务部 `_。 + + .. only:: SOC_SPI_MEM_SUPPORT_OPI_MODE + + 对于八线 flash 芯片,如果启用了 :ref:`CONFIG_ESPTOOLPY_OCT_FLASH`,则该功能默认启用。 .. _oct-flash-doc: From cd3b7f052c4d2b319f23038a41f4ac0c66d97504 Mon Sep 17 00:00:00 2001 From: Zhangwx Date: Fri, 13 Jun 2025 12:17:49 +0800 Subject: [PATCH 130/213] feat(phy): add a config for pll track feature --- components/esp_phy/Kconfig | 30 ++++++++++++++++++++++ components/esp_phy/src/phy_common.c | 6 ++++- components/esp_phy/src/phy_init.c | 6 ++--- components/esp_phy/src/phy_init_esp32hxx.c | 6 +++++ 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/components/esp_phy/Kconfig b/components/esp_phy/Kconfig index 75b5be45cd4..93661e0973f 100644 --- a/components/esp_phy/Kconfig +++ b/components/esp_phy/Kconfig @@ -166,6 +166,12 @@ menu "PHY" high interference, enable this option will sacrifice Wi-Fi OFDM receive performance. But to guarantee 11b receive performance serves as a bottom line in this case. + config ESP_PHY_PLL_TRACK_PERIOD_MS + int "Set the period of the pll track" + default 1000 + help + Set the period of the pll track. + config ESP_PHY_PLL_TRACK_DEBUG bool "Enable pll track logging" default n @@ -177,5 +183,29 @@ menu "PHY" default n help Select to support record and query phy used time. + + config ESP_PHY_IRAM_OPT + bool "PHY IRAM speed optimization" + default y + help + Select this option to place frequently called PHY library functions in IRAM. + When this option is disabled, more than 1.1Kbytes of IRAM memory will be saved, + but PHY performance will be reduced. This config only affect esp32c2 now. + + menuconfig ESP_PHY_DEBUG + bool "Enable PHY Debug" + default n + help + Enabling this option allows different kinds of phy debugging features. + + config ESP_PHY_DISABLE_PLL_TRACK + bool "Disable phy pll track(only for experimental)" + depends on ESP_PHY_DEBUG + default n + help + Disable pll track. This configuration option is used for experimental. + PLL track helps the PHY module adapt to temperature changes, ensuring stable performance. + When pll enabled, the ESP PHY module will periodically track and adjust PLL parameters. + endif endmenu # PHY diff --git a/components/esp_phy/src/phy_common.c b/components/esp_phy/src/phy_common.c index 2003cd02ad9..16c387f7e2a 100644 --- a/components/esp_phy/src/phy_common.c +++ b/components/esp_phy/src/phy_common.c @@ -26,6 +26,7 @@ static const char* TAG = "phy_comm"; static volatile uint16_t s_phy_modem_flag = 0; +#if !CONFIG_ESP_PHY_DISABLE_PLL_TRACK extern void phy_param_track_tot(bool en_wifi, bool en_ble_154); static esp_timer_handle_t phy_track_pll_timer; #if CONFIG_ESP_WIFI_ENABLED @@ -34,8 +35,9 @@ static volatile int64_t s_wifi_prev_timestamp; #if CONFIG_IEEE802154_ENABLED || CONFIG_BT_ENABLED static volatile int64_t s_bt_154_prev_timestamp; #endif -#define PHY_TRACK_PLL_PERIOD_IN_US 1000000 +#define PHY_TRACK_PLL_PERIOD_IN_US (CONFIG_ESP_PHY_PLL_TRACK_PERIOD_MS * 1000) static void phy_track_pll_internal(void); +#endif static esp_phy_ant_gpio_config_t s_phy_ant_gpio_config = { 0 }; static esp_phy_ant_config_t s_phy_ant_config = { 0 }; @@ -47,6 +49,7 @@ bool phy_enabled_modem_contains(esp_phy_modem_t modem) } #endif +#if !CONFIG_ESP_PHY_DISABLE_PLL_TRACK void phy_track_pll(void) { // Light sleep scenario: enabling and disabling PHY frequently, the timer will not get triggered. @@ -121,6 +124,7 @@ void phy_track_pll_deinit(void) ESP_ERROR_CHECK(esp_timer_stop(phy_track_pll_timer)); ESP_ERROR_CHECK(esp_timer_delete(phy_track_pll_timer)); } +#endif void phy_set_modem_flag(esp_phy_modem_t modem) { diff --git a/components/esp_phy/src/phy_init.c b/components/esp_phy/src/phy_init.c index 1e902a318b4..c33b6cb5d99 100644 --- a/components/esp_phy/src/phy_init.c +++ b/components/esp_phy/src/phy_init.c @@ -329,7 +329,7 @@ void esp_phy_enable(esp_phy_modem_t modem) #endif // ESP32 will track pll in the wifi/BT modem interrupt handler. -#if !CONFIG_IDF_TARGET_ESP32 +#if !CONFIG_IDF_TARGET_ESP32 && !CONFIG_ESP_PHY_DISABLE_PLL_TRACK phy_track_pll_init(); #endif @@ -340,7 +340,7 @@ void esp_phy_enable(esp_phy_modem_t modem) } phy_set_modem_flag(modem); -#if !CONFIG_IDF_TARGET_ESP32 +#if !CONFIG_IDF_TARGET_ESP32 && !CONFIG_ESP_PHY_DISABLE_PLL_TRACK // Immediately track pll when phy enabled. phy_track_pll(); #endif @@ -360,7 +360,7 @@ void esp_phy_disable(esp_phy_modem_t modem) phy_clr_modem_flag(modem); if (phy_get_modem_flag() == 0) { // ESP32 will track pll in the wifi/BT modem interrupt handler. -#if !CONFIG_IDF_TARGET_ESP32 +#if !CONFIG_IDF_TARGET_ESP32 && !CONFIG_ESP_PHY_DISABLE_PLL_TRACK phy_track_pll_deinit(); #endif #if SOC_PM_MODEM_RETENTION_BY_BACKUPDMA diff --git a/components/esp_phy/src/phy_init_esp32hxx.c b/components/esp_phy/src/phy_init_esp32hxx.c index 9ff88d452fe..af45ae733ae 100644 --- a/components/esp_phy/src/phy_init_esp32hxx.c +++ b/components/esp_phy/src/phy_init_esp32hxx.c @@ -113,11 +113,15 @@ void esp_phy_enable(esp_phy_modem_t modem) } else { phy_wakeup_init(); } +#if !CONFIG_ESP_PHY_DISABLE_PLL_TRACK phy_track_pll_init(); +#endif } phy_set_modem_flag(modem); // Immediately track pll when phy enabled. +#if !CONFIG_ESP_PHY_DISABLE_PLL_TRACK phy_track_pll(); +#endif #if CONFIG_ESP_PHY_RECORD_USED_TIME phy_record_time(true, modem); #endif @@ -133,7 +137,9 @@ void esp_phy_disable(esp_phy_modem_t modem) phy_clr_modem_flag(modem); if (phy_get_modem_flag() == 0) { +#if !CONFIG_ESP_PHY_DISABLE_PLL_TRACK phy_track_pll_deinit(); +#endif phy_close_rf(); phy_xpd_tsens(); #if SOC_MODEM_CLOCK_IS_INDEPENDENT From e8612772d5c6a49eebe01ae8eb24090813b3e385 Mon Sep 17 00:00:00 2001 From: yinqingzhao Date: Fri, 13 Jun 2025 14:26:03 +0800 Subject: [PATCH 131/213] feat(wifi): set phy pll track disable default --- examples/wifi/iperf/sdkconfig.defaults | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/wifi/iperf/sdkconfig.defaults b/examples/wifi/iperf/sdkconfig.defaults index f096b6f0615..7e44f9266f1 100644 --- a/examples/wifi/iperf/sdkconfig.defaults +++ b/examples/wifi/iperf/sdkconfig.defaults @@ -13,3 +13,9 @@ CONFIG_LWIP_TCPIP_TASK_PRIO=23 CONFIG_IPERF_TRAFFIC_TASK_PRIORITY=23 CONFIG_IPERF_REPORT_TASK_PRIORITY=24 CONFIG_COMPILER_OPTIMIZATION_PERF=y + +CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE=y + +# These two configurations disable the phy pll track feature, only used for experimental +CONFIG_ESP_PHY_DEBUG=y +CONFIG_ESP_PHY_DISABLE_PLL_TRACK=y From 5e2b0636a9e1250eac58172b92428543863ac56d Mon Sep 17 00:00:00 2001 From: Rahul Tank Date: Wed, 30 Apr 2025 12:52:27 +0530 Subject: [PATCH 132/213] fix(nimble): Handle 0x3e disconnect during rem feat/ read version --- components/bt/host/nimble/nimble | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/host/nimble/nimble b/components/bt/host/nimble/nimble index 04a97c0c15a..f18c4789aff 160000 --- a/components/bt/host/nimble/nimble +++ b/components/bt/host/nimble/nimble @@ -1 +1 @@ -Subproject commit 04a97c0c15a03038c8eef53b1e2002b6f6c4c69b +Subproject commit f18c4789afff6ed1d4ecb74028ea666f8e85510a From 11b7dfabe254d020e21959015e5d709762602b29 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Fri, 13 Jun 2025 20:13:49 +0800 Subject: [PATCH 133/213] change(ble): [AUTO_MR] Update lib_esp32h2 to b8770ab2 --- components/bt/controller/lib_esp32h2/esp32h2-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32h2/esp32h2-bt-lib b/components/bt/controller/lib_esp32h2/esp32h2-bt-lib index 82cbc1dd934..7ac752b47c7 160000 --- a/components/bt/controller/lib_esp32h2/esp32h2-bt-lib +++ b/components/bt/controller/lib_esp32h2/esp32h2-bt-lib @@ -1 +1 @@ -Subproject commit 82cbc1dd9345010e7e6d78f8a7b022a7ae669e87 +Subproject commit 7ac752b47c70f43cf08751fec85654a68ae4fc83 From 6dfaa7caecacf68000bf81e02752fc7e5948e766 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Fri, 13 Jun 2025 20:13:49 +0800 Subject: [PATCH 134/213] change(ble): [AUTO_MR] Update lib_esp32c5 to b8770ab2 --- components/bt/controller/lib_esp32c5/esp32c5-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c5/esp32c5-bt-lib b/components/bt/controller/lib_esp32c5/esp32c5-bt-lib index 40a1921b1f2..cfcd6049a67 160000 --- a/components/bt/controller/lib_esp32c5/esp32c5-bt-lib +++ b/components/bt/controller/lib_esp32c5/esp32c5-bt-lib @@ -1 +1 @@ -Subproject commit 40a1921b1f2993eb7558309e73fef837a8a28a15 +Subproject commit cfcd6049a6742361240e71f2c532f9ca4006c03b From ea7689c5032ac72d39293d78260d410a6086f3de Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Fri, 13 Jun 2025 20:13:49 +0800 Subject: [PATCH 135/213] change(ble): [AUTO_MR] Update lib_esp32c6 to b8770ab2 --- components/bt/controller/lib_esp32c6/esp32c6-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c6/esp32c6-bt-lib b/components/bt/controller/lib_esp32c6/esp32c6-bt-lib index 250e75199e8..47fde85c478 160000 --- a/components/bt/controller/lib_esp32c6/esp32c6-bt-lib +++ b/components/bt/controller/lib_esp32c6/esp32c6-bt-lib @@ -1 +1 @@ -Subproject commit 250e75199e8772a9ce44c53e7747063107d36155 +Subproject commit 47fde85c4789cc5e7487d5e1244f9012c3fadf2a From 39e7147613a99063de91e889c66e651a88157ff6 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Fri, 13 Jun 2025 20:13:49 +0800 Subject: [PATCH 136/213] change(ble): [AUTO_MR] Update lib_esp32c2 to e865b4f9 --- components/bt/controller/lib_esp32c2/esp32c2-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c2/esp32c2-bt-lib b/components/bt/controller/lib_esp32c2/esp32c2-bt-lib index 3ad00705899..64ba4e23f3b 160000 --- a/components/bt/controller/lib_esp32c2/esp32c2-bt-lib +++ b/components/bt/controller/lib_esp32c2/esp32c2-bt-lib @@ -1 +1 @@ -Subproject commit 3ad007058995a523c2cd212bcef4c6937533871e +Subproject commit 64ba4e23f3bb2e8ecf26f7901b0657a950682d3d From 640e44eff80e53489203bfbef9e8b286de7a5d28 Mon Sep 17 00:00:00 2001 From: cjin Date: Tue, 24 Jun 2025 12:30:44 +0800 Subject: [PATCH 137/213] change(ble): update lib_esp32c5 to ea6c58c7 --- components/bt/controller/lib_esp32c5/esp32c5-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c5/esp32c5-bt-lib b/components/bt/controller/lib_esp32c5/esp32c5-bt-lib index cfcd6049a67..effd35f8c8f 160000 --- a/components/bt/controller/lib_esp32c5/esp32c5-bt-lib +++ b/components/bt/controller/lib_esp32c5/esp32c5-bt-lib @@ -1 +1 @@ -Subproject commit cfcd6049a6742361240e71f2c532f9ca4006c03b +Subproject commit effd35f8c8f7a0b7363dc70f13162600b512cd7d From 9f3be8aa92eca4dba702edc7e05f1514b835464c Mon Sep 17 00:00:00 2001 From: cjin Date: Tue, 24 Jun 2025 12:31:23 +0800 Subject: [PATCH 138/213] change(ble): update lib_esp32h2 to ea6c58c7 --- components/bt/controller/lib_esp32h2/esp32h2-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32h2/esp32h2-bt-lib b/components/bt/controller/lib_esp32h2/esp32h2-bt-lib index 7ac752b47c7..e90088b3563 160000 --- a/components/bt/controller/lib_esp32h2/esp32h2-bt-lib +++ b/components/bt/controller/lib_esp32h2/esp32h2-bt-lib @@ -1 +1 @@ -Subproject commit 7ac752b47c70f43cf08751fec85654a68ae4fc83 +Subproject commit e90088b35639ee9b41ab67fcd5b8dab5395cfacb From 5845d3a7df8b7d6a85cf17f0cb8fb7c3f9da6101 Mon Sep 17 00:00:00 2001 From: cjin Date: Tue, 24 Jun 2025 12:31:47 +0800 Subject: [PATCH 139/213] change(ble): update lib_esp32c6 and esp32c61 to ea6c58c7 --- components/bt/controller/lib_esp32c6/esp32c6-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c6/esp32c6-bt-lib b/components/bt/controller/lib_esp32c6/esp32c6-bt-lib index 47fde85c478..fa4b7f913d6 160000 --- a/components/bt/controller/lib_esp32c6/esp32c6-bt-lib +++ b/components/bt/controller/lib_esp32c6/esp32c6-bt-lib @@ -1 +1 @@ -Subproject commit 47fde85c4789cc5e7487d5e1244f9012c3fadf2a +Subproject commit fa4b7f913d6b65ea30b8d06eb1e62dc1b86b7843 From a4b08004448db5a0cbd4dfff6aa3d1acc015b241 Mon Sep 17 00:00:00 2001 From: cjin Date: Mon, 16 Jun 2025 10:38:19 +0800 Subject: [PATCH 140/213] feat(ble): add sm count reserve cnt setting on ESP32-C5 --- components/bt/controller/esp32c5/Kconfig.in | 31 +++++++++++++++++++ components/bt/controller/esp32c5/esp_bt_cfg.h | 3 ++ .../bt/include/esp32c5/include/esp_bt.h | 6 +++- 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/components/bt/controller/esp32c5/Kconfig.in b/components/bt/controller/esp32c5/Kconfig.in index 2e6db9fdf6f..2982b6da8eb 100644 --- a/components/bt/controller/esp32c5/Kconfig.in +++ b/components/bt/controller/esp32c5/Kconfig.in @@ -812,3 +812,34 @@ config BT_LE_CTRL_FAST_CONN_DATA_TX_EN help If this option is enabled, The Controller will continue to Send an empty PDU after sending valid connection data within an interval. + +menu "Reserved Memory Config" + config BT_LE_EXT_ADV_RESERVED_MEMORY_COUNT + int "The value of reserved EXT ADV memory count at initialization" + range 0 4 + default 2 + help + This value sets the number the Controller will allocate for extended advertisement + instances at initialization process. If more extended advertisement instances are + enabled, those memory will be dynamically allocated. + Using reduced amount of reserved memory will save heap size at the cost of extra + time consumption at advertising start process and possible advertising start failure + due to memory shortage. + The actual reserved memory count will be the minimum value between the maximum + extended advertisement instances and the BT_LE_EXT_ADV_RESERVED_MEMORY_COUNT. + + + config BT_LE_CONN_RESERVED_MEMORY_COUNT + int "The value of reserved CONN memory count at initialization" + range 0 70 + default 2 + help + This value sets the number the Controller will allocate for connection instances + at the initialization process. If more connection instances are enabled, those + memory will be dynamically allocated. + Using reduced amount of reserved memory will save heap size at the cost of extra + time consumption at connection establishment process and possible connection + establishment failure due to memory shortage. + The actual reserved memory count will be the minimum value between the maximum + connection instances and the BT_LE_CONN_RESERVED_MEMORY_COUNT. +endmenu diff --git a/components/bt/controller/esp32c5/esp_bt_cfg.h b/components/bt/controller/esp32c5/esp_bt_cfg.h index 48a845a3fa8..01f9dc61826 100644 --- a/components/bt/controller/esp32c5/esp_bt_cfg.h +++ b/components/bt/controller/esp32c5/esp_bt_cfg.h @@ -280,6 +280,9 @@ extern "C" { #define BLE_LL_TX_PWR_DBM_N (CONFIG_BT_LE_DFT_TX_POWER_LEVEL_DBM_EFF) +#define BLE_LL_ADV_SM_RESERVE_CNT_N MIN(DEFAULT_BT_LE_MAX_EXT_ADV_INSTANCES, CONFIG_BT_LE_EXT_ADV_RESERVED_MEMORY_COUNT) +#define BLE_LL_CONN_SM_RESERVE_CNT_N MIN(DEFAULT_BT_LE_MAX_CONNECTIONS, CONFIG_BT_LE_CONN_RESERVED_MEMORY_COUNT) + #define RUN_BQB_TEST (0) #define RUN_QA_TEST (0) #define NIMBLE_DISABLE_SCAN_BACKOFF (0) diff --git a/components/bt/include/esp32c5/include/esp_bt.h b/components/bt/include/esp32c5/include/esp_bt.h index 91b1da306ad..ce490db77ac 100644 --- a/components/bt/include/esp32c5/include/esp_bt.h +++ b/components/bt/include/esp32c5/include/esp_bt.h @@ -159,7 +159,7 @@ esp_err_t esp_ble_tx_power_set_enhanced(esp_ble_enhanced_power_type_t power_type */ esp_power_level_t esp_ble_tx_power_get_enhanced(esp_ble_enhanced_power_type_t power_type, uint16_t handle); -#define CONFIG_VERSION 0x20250526 +#define CONFIG_VERSION 0x20250606 #define CONFIG_MAGIC 0x5A5AA5A5 /** @@ -232,6 +232,8 @@ typedef struct { - 0 - Disable - 1 - Enable (default) */ int8_t ch39_txpwr; /*!< BLE transmit power (in dBm) used for BLE advertising on channel 39. */ + uint8_t adv_rsv_cnt; /*!< BLE adv state machine reserve count number */ + uint8_t conn_rsv_cnt; /*!< BLE conn state machine reserve count number */ uint32_t config_magic; /*!< Magic number for configuration validation */ } esp_bt_controller_config_t; @@ -291,6 +293,8 @@ typedef struct { .skip_unnecessary_checks_en = 0, \ .fast_conn_data_tx_en = DEFAULT_BT_LE_CTRL_FAST_CONN_DATA_TX_EN, \ .ch39_txpwr = BLE_LL_TX_PWR_DBM_N, \ + .adv_rsv_cnt = BLE_LL_ADV_SM_RESERVE_CNT_N, \ + .conn_rsv_cnt = BLE_LL_CONN_SM_RESERVE_CNT_N, \ .config_magic = CONFIG_MAGIC, \ } From 1653442b7bc375752aea61582cbde9fa4cce461c Mon Sep 17 00:00:00 2001 From: cjin Date: Mon, 16 Jun 2025 10:38:39 +0800 Subject: [PATCH 141/213] feat(ble): add sm count reserve cnt setting on ESP32-C6 and ESP32-C61 --- components/bt/controller/esp32c6/Kconfig.in | 31 +++++++++++++++++++ components/bt/controller/esp32c6/esp_bt_cfg.h | 3 ++ .../bt/include/esp32c6/include/esp_bt.h | 8 ++++- 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/components/bt/controller/esp32c6/Kconfig.in b/components/bt/controller/esp32c6/Kconfig.in index 949349aaaf7..8f3c33630bd 100644 --- a/components/bt/controller/esp32c6/Kconfig.in +++ b/components/bt/controller/esp32c6/Kconfig.in @@ -846,3 +846,34 @@ config BT_LE_CTRL_FAST_CONN_DATA_TX_EN help If this option is enabled, The Controller will continue to Send an empty PDU after sending valid connection data within an interval. + +menu "Reserved Memory Config" + config BT_LE_EXT_ADV_RESERVED_MEMORY_COUNT + int "The value of reserved EXT ADV memory count at initialization" + range 0 4 + default 2 + help + This value sets the number the Controller will allocate for extended advertisement + instances at initialization process. If more extended advertisement instances are + enabled, those memory will be dynamically allocated. + Using reduced amount of reserved memory will save heap size at the cost of extra + time consumption at advertising start process and possible advertising start failure + due to memory shortage. + The actual reserved memory count will be the minimum value between the maximum + extended advertisement instances and the BT_LE_EXT_ADV_RESERVED_MEMORY_COUNT. + + + config BT_LE_CONN_RESERVED_MEMORY_COUNT + int "The value of reserved CONN memory count at initialization" + range 0 70 + default 2 + help + This value sets the number the Controller will allocate for connection instances + at the initialization process. If more connection instances are enabled, those + memory will be dynamically allocated. + Using reduced amount of reserved memory will save heap size at the cost of extra + time consumption at connection establishment process and possible connection + establishment failure due to memory shortage. + The actual reserved memory count will be the minimum value between the maximum + connection instances and the BT_LE_CONN_RESERVED_MEMORY_COUNT. +endmenu diff --git a/components/bt/controller/esp32c6/esp_bt_cfg.h b/components/bt/controller/esp32c6/esp_bt_cfg.h index f22c4c75be3..6def839e567 100644 --- a/components/bt/controller/esp32c6/esp_bt_cfg.h +++ b/components/bt/controller/esp32c6/esp_bt_cfg.h @@ -283,6 +283,9 @@ extern "C" { #define BLE_LL_TX_PWR_DBM_N (CONFIG_BT_LE_DFT_TX_POWER_LEVEL_DBM_EFF) +#define BLE_LL_ADV_SM_RESERVE_CNT_N MIN(DEFAULT_BT_LE_MAX_EXT_ADV_INSTANCES, CONFIG_BT_LE_EXT_ADV_RESERVED_MEMORY_COUNT) +#define BLE_LL_CONN_SM_RESERVE_CNT_N MIN(DEFAULT_BT_LE_MAX_CONNECTIONS, CONFIG_BT_LE_CONN_RESERVED_MEMORY_COUNT) + #define RUN_BQB_TEST (0) #define RUN_QA_TEST (0) #define NIMBLE_DISABLE_SCAN_BACKOFF (0) diff --git a/components/bt/include/esp32c6/include/esp_bt.h b/components/bt/include/esp32c6/include/esp_bt.h index c035b4a6cc9..f0c0c556445 100644 --- a/components/bt/include/esp32c6/include/esp_bt.h +++ b/components/bt/include/esp32c6/include/esp_bt.h @@ -156,7 +156,7 @@ esp_err_t esp_ble_tx_power_set_enhanced(esp_ble_enhanced_power_type_t power_type */ esp_power_level_t esp_ble_tx_power_get_enhanced(esp_ble_enhanced_power_type_t power_type, uint16_t handle); -#define CONFIG_VERSION 0x20250526 +#define CONFIG_VERSION 0x20250606 #define CONFIG_MAGIC 0x5A5AA5A5 /** @@ -232,6 +232,8 @@ typedef struct { - 0 - Disable - 1 - Enable (default) */ int8_t ch39_txpwr; /*!< BLE transmit power (in dBm) used for BLE advertising on channel 39. */ + uint8_t adv_rsv_cnt; /*!< BLE adv state machine reserve count number */ + uint8_t conn_rsv_cnt; /*!< BLE conn state machine reserve count number */ uint32_t config_magic; /*!< Magic number for configuration validation */ } esp_bt_controller_config_t; @@ -294,6 +296,8 @@ typedef struct { .skip_unnecessary_checks_en = 0, \ .fast_conn_data_tx_en = DEFAULT_BT_LE_CTRL_FAST_CONN_DATA_TX_EN, \ .ch39_txpwr = BLE_LL_TX_PWR_DBM_N, \ + .adv_rsv_cnt = BLE_LL_ADV_SM_RESERVE_CNT_N, \ + .conn_rsv_cnt = BLE_LL_CONN_SM_RESERVE_CNT_N, \ .config_magic = CONFIG_MAGIC, \ } #elif CONFIG_IDF_TARGET_ESP32C61 @@ -353,6 +357,8 @@ typedef struct { .skip_unnecessary_checks_en = 0, \ .fast_conn_data_tx_en = DEFAULT_BT_LE_CTRL_FAST_CONN_DATA_TX_EN, \ .ch39_txpwr = BLE_LL_TX_PWR_DBM_N, \ + .adv_rsv_cnt = BLE_LL_ADV_SM_RESERVE_CNT_N, \ + .conn_rsv_cnt = BLE_LL_CONN_SM_RESERVE_CNT_N, \ .config_magic = CONFIG_MAGIC, \ } #endif From 884573a41936489464473ba510855c6f31f85a85 Mon Sep 17 00:00:00 2001 From: cjin Date: Mon, 16 Jun 2025 10:38:55 +0800 Subject: [PATCH 142/213] feat(ble): add sm count reserve cnt setting on ESP32-H2 --- components/bt/controller/esp32h2/Kconfig.in | 31 +++++++++++++++++++ components/bt/controller/esp32h2/esp_bt_cfg.h | 3 ++ .../bt/include/esp32h2/include/esp_bt.h | 6 +++- 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/components/bt/controller/esp32h2/Kconfig.in b/components/bt/controller/esp32h2/Kconfig.in index 14330540e05..2f914a10752 100644 --- a/components/bt/controller/esp32h2/Kconfig.in +++ b/components/bt/controller/esp32h2/Kconfig.in @@ -850,3 +850,34 @@ config BT_LE_CTRL_FAST_CONN_DATA_TX_EN help If this option is enabled, The Controller will continue to Send an empty PDU after sending valid connection data within an interval. + +menu "Reserved Memory Config" + config BT_LE_EXT_ADV_RESERVED_MEMORY_COUNT + int "The value of reserved EXT ADV memory count at initialization" + range 0 4 + default 2 + help + This value sets the number the Controller will allocate for extended advertisement + instances at initialization process. If more extended advertisement instances are + enabled, those memory will be dynamically allocated. + Using reduced amount of reserved memory will save heap size at the cost of extra + time consumption at advertising start process and possible advertising start failure + due to memory shortage. + The actual reserved memory count will be the minimum value between the maximum + extended advertisement instances and the BT_LE_EXT_ADV_RESERVED_MEMORY_COUNT. + + + config BT_LE_CONN_RESERVED_MEMORY_COUNT + int "The value of reserved CONN memory count at initialization" + range 0 70 + default 2 + help + This value sets the number the Controller will allocate for connection instances + at the initialization process. If more connection instances are enabled, those + memory will be dynamically allocated. + Using reduced amount of reserved memory will save heap size at the cost of extra + time consumption at connection establishment process and possible connection + establishment failure due to memory shortage. + The actual reserved memory count will be the minimum value between the maximum connection instances and + the BT_LE_CONN_RESERVED_MEMORY_COUNT. +endmenu diff --git a/components/bt/controller/esp32h2/esp_bt_cfg.h b/components/bt/controller/esp32h2/esp_bt_cfg.h index 48a845a3fa8..01f9dc61826 100644 --- a/components/bt/controller/esp32h2/esp_bt_cfg.h +++ b/components/bt/controller/esp32h2/esp_bt_cfg.h @@ -280,6 +280,9 @@ extern "C" { #define BLE_LL_TX_PWR_DBM_N (CONFIG_BT_LE_DFT_TX_POWER_LEVEL_DBM_EFF) +#define BLE_LL_ADV_SM_RESERVE_CNT_N MIN(DEFAULT_BT_LE_MAX_EXT_ADV_INSTANCES, CONFIG_BT_LE_EXT_ADV_RESERVED_MEMORY_COUNT) +#define BLE_LL_CONN_SM_RESERVE_CNT_N MIN(DEFAULT_BT_LE_MAX_CONNECTIONS, CONFIG_BT_LE_CONN_RESERVED_MEMORY_COUNT) + #define RUN_BQB_TEST (0) #define RUN_QA_TEST (0) #define NIMBLE_DISABLE_SCAN_BACKOFF (0) diff --git a/components/bt/include/esp32h2/include/esp_bt.h b/components/bt/include/esp32h2/include/esp_bt.h index 0aafa744bd7..b33f8b7359d 100644 --- a/components/bt/include/esp32h2/include/esp_bt.h +++ b/components/bt/include/esp32h2/include/esp_bt.h @@ -161,7 +161,7 @@ esp_err_t esp_ble_tx_power_set_enhanced(esp_ble_enhanced_power_type_t power_type */ esp_power_level_t esp_ble_tx_power_get_enhanced(esp_ble_enhanced_power_type_t power_type, uint16_t handle); -#define CONFIG_VERSION 0x20250526 +#define CONFIG_VERSION 0x20250606 #define CONFIG_MAGIC 0x5A5AA5A5 /** @@ -234,6 +234,8 @@ typedef struct { - 0 - Disable - 1 - Enable (default) */ int8_t ch39_txpwr; /*!< BLE transmit power (in dBm) used for BLE advertising on channel 39. */ + uint8_t adv_rsv_cnt; /*!< BLE adv state machine reserve count number */ + uint8_t conn_rsv_cnt; /*!< BLE conn state machine reserve count number */ uint32_t config_magic; /*!< Configuration magic value */ } esp_bt_controller_config_t; @@ -294,6 +296,8 @@ typedef struct { .skip_unnecessary_checks_en = 0, \ .fast_conn_data_tx_en = DEFAULT_BT_LE_CTRL_FAST_CONN_DATA_TX_EN, \ .ch39_txpwr = BLE_LL_TX_PWR_DBM_N, \ + .adv_rsv_cnt = BLE_LL_ADV_SM_RESERVE_CNT_N, \ + .conn_rsv_cnt = BLE_LL_CONN_SM_RESERVE_CNT_N, \ .config_magic = CONFIG_MAGIC, \ } From 37d25de5313b7e07e98ce43ee0275be4ca9f4fc9 Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Fri, 27 Jun 2025 20:04:13 +0800 Subject: [PATCH 143/213] fix(esp_system): force enable uart0 sclk in esp_restart --- components/esp_system/port/soc/esp32c5/system_internal.c | 5 +++++ components/esp_system/port/soc/esp32c6/system_internal.c | 5 +++++ components/esp_system/port/soc/esp32c61/system_internal.c | 5 +++++ components/esp_system/port/soc/esp32h2/system_internal.c | 5 +++++ 4 files changed, 20 insertions(+) diff --git a/components/esp_system/port/soc/esp32c5/system_internal.c b/components/esp_system/port/soc/esp32c5/system_internal.c index 76d7037d8ca..4afbaf9c494 100644 --- a/components/esp_system/port/soc/esp32c5/system_internal.c +++ b/components/esp_system/port/soc/esp32c5/system_internal.c @@ -22,6 +22,7 @@ #include "soc/rtc_periph.h" #include "soc/uart_reg.h" #include "hal/wdt_hal.h" +#include "hal/uart_ll.h" #if SOC_MODEM_CLOCK_SUPPORTED #include "hal/modem_syscon_ll.h" #include "hal/modem_lpcon_ll.h" @@ -78,6 +79,10 @@ void IRAM_ATTR esp_system_reset_modules_on_exit(void) CLEAR_PERI_REG_MASK(PCR_HMAC_CONF_REG, PCR_HMAC_RST_EN); CLEAR_PERI_REG_MASK(PCR_RSA_CONF_REG, PCR_RSA_RST_EN); CLEAR_PERI_REG_MASK(PCR_SHA_CONF_REG, PCR_SHA_RST_EN); + + // UART's sclk is controlled in the PCR register and does not reset with the UART module. The ROM missed enabling + // it when initializing the ROM UART. If it is not turned on, it will trigger LP_WDT in the ROM. + uart_ll_sclk_enable(&UART0); } /* "inner" restart function for after RTOS, interrupts & anything else on this diff --git a/components/esp_system/port/soc/esp32c6/system_internal.c b/components/esp_system/port/soc/esp32c6/system_internal.c index 9a7bd4189fb..5d4bf93131c 100644 --- a/components/esp_system/port/soc/esp32c6/system_internal.c +++ b/components/esp_system/port/soc/esp32c6/system_internal.c @@ -20,6 +20,7 @@ #include "esp_private/rtc_clk.h" #include "soc/rtc_periph.h" #include "soc/uart_reg.h" +#include "hal/uart_ll.h" #include "hal/wdt_hal.h" #include "hal/modem_syscon_ll.h" #include "hal/modem_lpcon_ll.h" @@ -75,6 +76,10 @@ void IRAM_ATTR esp_system_reset_modules_on_exit(void) CLEAR_PERI_REG_MASK(PCR_HMAC_CONF_REG, PCR_HMAC_RST_EN); CLEAR_PERI_REG_MASK(PCR_RSA_CONF_REG, PCR_RSA_RST_EN); CLEAR_PERI_REG_MASK(PCR_SHA_CONF_REG, PCR_SHA_RST_EN); + + // UART's sclk is controlled in the PCR register and does not reset with the UART module. The ROM missed enabling + // it when initializing the ROM UART. If it is not turned on, it will trigger LP_WDT in the ROM. + uart_ll_sclk_enable(&UART0); } /* "inner" restart function for after RTOS, interrupts & anything else on this diff --git a/components/esp_system/port/soc/esp32c61/system_internal.c b/components/esp_system/port/soc/esp32c61/system_internal.c index dac6f938161..bfe80c1055c 100644 --- a/components/esp_system/port/soc/esp32c61/system_internal.c +++ b/components/esp_system/port/soc/esp32c61/system_internal.c @@ -20,6 +20,7 @@ #include "esp_private/rtc_clk.h" #include "soc/rtc_periph.h" #include "soc/uart_reg.h" +#include "hal/uart_ll.h" #include "hal/wdt_hal.h" #include "esp_private/cache_err_int.h" @@ -78,6 +79,10 @@ void IRAM_ATTR esp_system_reset_modules_on_exit(void) CLEAR_PERI_REG_MASK(PCR_HMAC_CONF_REG, PCR_HMAC_RST_EN); CLEAR_PERI_REG_MASK(PCR_RSA_CONF_REG, PCR_RSA_RST_EN); CLEAR_PERI_REG_MASK(PCR_SHA_CONF_REG, PCR_SHA_RST_EN); + + // UART's sclk is controlled in the PCR register and does not reset with the UART module. The ROM missed enabling + // it when initializing the ROM UART. If it is not turned on, it will trigger LP_WDT in the ROM. + uart_ll_sclk_enable(&UART0); } /* "inner" restart function for after RTOS, interrupts & anything else on this diff --git a/components/esp_system/port/soc/esp32h2/system_internal.c b/components/esp_system/port/soc/esp32h2/system_internal.c index 49425511823..e08beb85eae 100644 --- a/components/esp_system/port/soc/esp32h2/system_internal.c +++ b/components/esp_system/port/soc/esp32h2/system_internal.c @@ -23,6 +23,7 @@ #include "soc/uart_reg.h" #include "hal/wdt_hal.h" #include "hal/spimem_flash_ll.h" +#include "hal/uart_ll.h" #include "esp_private/cache_err_int.h" #include "esp_private/mspi_timing_tuning.h" @@ -73,6 +74,10 @@ void IRAM_ATTR esp_system_reset_modules_on_exit(void) CLEAR_PERI_REG_MASK(PCR_HMAC_CONF_REG, PCR_HMAC_RST_EN); CLEAR_PERI_REG_MASK(PCR_RSA_CONF_REG, PCR_RSA_RST_EN); CLEAR_PERI_REG_MASK(PCR_SHA_CONF_REG, PCR_SHA_RST_EN); + + // UART's sclk is controlled in the PCR register and does not reset with the UART module. The ROM missed enabling + // it when initializing the ROM UART. If it is not turned on, it will trigger LP_WDT in the ROM. + uart_ll_sclk_enable(&UART0); } /* "inner" restart function for after RTOS, interrupts & anything else on this From 900ecc4d03c3e18b90521f30bbbfa7b2032dd34a Mon Sep 17 00:00:00 2001 From: xiongweichao Date: Tue, 1 Jul 2025 19:17:20 +0800 Subject: [PATCH 144/213] fix(ble): keep the log of the bluetooth sleep clock source consistent --- components/bt/controller/esp32/bt.c | 2 ++ components/bt/controller/esp32c3/Kconfig.in | 4 ++-- components/bt/controller/esp32c3/bt.c | 10 +++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/components/bt/controller/esp32/bt.c b/components/bt/controller/esp32/bt.c index 4f95d120bab..d1a3ddadb13 100644 --- a/components/bt/controller/esp32/bt.c +++ b/components/bt/controller/esp32/bt.c @@ -1540,12 +1540,14 @@ static esp_err_t btdm_low_power_mode_init(void) bool select_src_ret __attribute__((unused)); bool set_div_ret __attribute__((unused)); if (btdm_lpclk_sel == ESP_BT_SLEEP_CLOCK_MAIN_XTAL) { + ESP_LOGI(BTDM_LOG_TAG, "Using main XTAL as clock source"); select_src_ret = btdm_lpclk_select_src(BTDM_LPCLK_SEL_XTAL); set_div_ret = btdm_lpclk_set_div(esp_clk_xtal_freq() * 2 / MHZ - 1); assert(select_src_ret && set_div_ret); btdm_lpcycle_us_frac = RTC_CLK_CAL_FRACT; btdm_lpcycle_us = 2 << (btdm_lpcycle_us_frac); } else { // btdm_lpclk_sel == BTDM_LPCLK_SEL_XTAL32K + ESP_LOGI(BTDM_LOG_TAG, "Using external 32.768 kHz crystal/oscillator as clock source"); select_src_ret = btdm_lpclk_select_src(BTDM_LPCLK_SEL_XTAL32K); set_div_ret = btdm_lpclk_set_div(0); assert(select_src_ret && set_div_ret); diff --git a/components/bt/controller/esp32c3/Kconfig.in b/components/bt/controller/esp32c3/Kconfig.in index 98579251431..8ec833c8cc5 100644 --- a/components/bt/controller/esp32c3/Kconfig.in +++ b/components/bt/controller/esp32c3/Kconfig.in @@ -414,10 +414,10 @@ menu "MODEM SLEEP Options" modem sleep to be used with both DFS and light sleep. config BT_CTRL_LPCLK_SEL_RTC_SLOW - bool "Internal 150kHz RC oscillator" + bool "Internal 136kHz RC oscillator" depends on RTC_CLK_SRC_INT_RC help - Internal 150kHz RC oscillator. The accuracy of this clock is a lot larger than 500ppm which is required + Internal 136kHz RC oscillator. The accuracy of this clock is a lot larger than 500ppm which is required in Bluetooth communication, so don't select this option in scenarios such as BLE connection state. endchoice diff --git a/components/bt/controller/esp32c3/bt.c b/components/bt/controller/esp32c3/bt.c index 492aad634ea..dc7cd3e950d 100644 --- a/components/bt/controller/esp32c3/bt.c +++ b/components/bt/controller/esp32c3/bt.c @@ -1651,15 +1651,11 @@ static esp_err_t btdm_low_power_mode_init(esp_bt_controller_config_t *cfg) #endif } } else if (s_lp_cntl.lpclk_sel == ESP_BT_SLEEP_CLOCK_RTC_SLOW) { // Internal 136kHz RC oscillator - if (rtc_clk_slow_src_get() == SOC_RTC_SLOW_CLK_SRC_RC_SLOW) { - ESP_LOGW(BT_LOG_TAG, "Internal 136kHz RC oscillator. The accuracy of this clock is a lot larger than 500ppm which is " - "required in Bluetooth communication, so don't select this option in scenarios such as BLE connection state."); - } else { + if (rtc_clk_slow_src_get() != SOC_RTC_SLOW_CLK_SRC_RC_SLOW) { ESP_LOGW(BT_LOG_TAG, "Internal 136kHz RC oscillator not detected."); assert(0); } } else if (s_lp_cntl.lpclk_sel == ESP_BT_SLEEP_CLOCK_MAIN_XTAL) { - ESP_LOGI(BT_LOG_TAG, "Bluetooth will use main XTAL as Bluetooth sleep clock."); #if !CONFIG_BT_CTRL_MAIN_XTAL_PU_DURING_LIGHT_SLEEP s_lp_cntl.no_light_sleep = 1; #endif @@ -1671,6 +1667,7 @@ static esp_err_t btdm_low_power_mode_init(esp_bt_controller_config_t *cfg) bool select_src_ret __attribute__((unused)); bool set_div_ret __attribute__((unused)); if (s_lp_cntl.lpclk_sel == ESP_BT_SLEEP_CLOCK_MAIN_XTAL) { + ESP_LOGI(BT_LOG_TAG, "Using main XTAL as clock source"); #ifdef CONFIG_BT_CTRL_MAIN_XTAL_PU_DURING_LIGHT_SLEEP ESP_ERROR_CHECK(esp_sleep_pd_config(ESP_PD_DOMAIN_XTAL, ESP_PD_OPTION_ON)); s_lp_cntl.main_xtal_pu = 1; @@ -1681,6 +1678,7 @@ static esp_err_t btdm_low_power_mode_init(esp_bt_controller_config_t *cfg) btdm_lpcycle_us_frac = RTC_CLK_CAL_FRACT; btdm_lpcycle_us = 1 << (btdm_lpcycle_us_frac); } else if (s_lp_cntl.lpclk_sel == ESP_BT_SLEEP_CLOCK_EXT_32K_XTAL) { + ESP_LOGI(BT_LOG_TAG, "Using external 32.768 kHz crystal/oscillator as clock source"); select_src_ret = btdm_lpclk_select_src(BTDM_LPCLK_SEL_XTAL32K); set_div_ret = btdm_lpclk_set_div(0); assert(select_src_ret && set_div_ret); @@ -1689,6 +1687,8 @@ static esp_err_t btdm_low_power_mode_init(esp_bt_controller_config_t *cfg) (1000000 >> (15 - RTC_CLK_CAL_FRACT)); assert(btdm_lpcycle_us != 0); } else if (s_lp_cntl.lpclk_sel == ESP_BT_SLEEP_CLOCK_RTC_SLOW) { + ESP_LOGW(BT_LOG_TAG, "Using 136 kHz RC as clock source. The accuracy of this clock is a lot larger than 500ppm which is " + "required in Bluetooth communication, so don't select this option in scenarios such as BLE connection state."); select_src_ret = btdm_lpclk_select_src(BTDM_LPCLK_SEL_RTC_SLOW); set_div_ret = btdm_lpclk_set_div(0); assert(select_src_ret && set_div_ret); From 974b70a8cfb4d837b852fac440f4dabd083ef403 Mon Sep 17 00:00:00 2001 From: Ashish Sharma Date: Thu, 29 May 2025 16:49:17 +0800 Subject: [PATCH 145/213] docs(system/esp_https_ota): adds ECIES-256 to pre-enc ota design doc --- docs/en/api-reference/system/esp_https_ota.rst | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/docs/en/api-reference/system/esp_https_ota.rst b/docs/en/api-reference/system/esp_https_ota.rst index 623959968dd..21e8e0d0268 100644 --- a/docs/en/api-reference/system/esp_https_ota.rst +++ b/docs/en/api-reference/system/esp_https_ota.rst @@ -71,16 +71,17 @@ Pre-encrypted firmware distribution ensures that the firmware image stays encryp Design ^^^^^^ -* This scheme requires a unique RSA-3072 public-private key pair to be generated first. The public key stays on the OTA update server for encryption purpose and the private key is part of the device (e.g., embedded in firmware) for decryption purpose. -* Pre-encrypted firmware is encrypted using AES-GCM key which is then appended to the image as header (along with config parameters). -* Further the AES-GCM key gets encrypted using RSA public key and the resultant image gets hosted on the OTA update server. -* On the device side, first the AES-GCM key is retrieved by decrypting the image header using RSA private key available to the device. -* Finally, the contents of the image are decrypted using AES-GCM key (and config parameters) and written to the flash storage. +Pre-encrypted firmware is a **transport security scheme** that ensures firmware images remain encrypted **in transit** from the OTA server to the device (irrespective of the underlying transport security). This approach differs from :doc:`../../security/flash-encryption` in several key ways: -This whole workflow is managed by an external component `esp_encrypted_image `_ and it gets plugged into the OTA update framework through decryption callback (:cpp:member:`esp_https_ota_config_t::decrypt_cb`) mechanism. +* **Key Management**: Uses externally managed encryption keys rather than per-device unique keys generated internally +* **Flash Offset Independence**: Generates consistent ciphertext regardless of flash partition location (``ota_0``, ``ota_1``, etc.) +* **Transport Protection**: Provides encryption protection during firmware distribution, not device-level storage security -.. note:: - The supported scheme is based on RSA-3072 and the private key on device side must be protected using platform security features. +**Important Security Note**: Pre-encrypted firmware does not provide device-level security on its own. Once received, the firmware is decrypted on the device and stored according to the device's flash encryption configuration. For device-level security, flash encryption must be separately enabled. + +This process is managed by the `esp_encrypted_img `_ component, which integrates with the OTA update framework via the decryption callback (:cpp:member:`esp_https_ota_config_t::decrypt_cb`). + +For detailed information on the image format, key generation, and implementation details, refer to the `esp_encrypted_img component documentation `_. OTA System Events ----------------- From 6160c164e8278f6f5730df90922a27dd93caa755 Mon Sep 17 00:00:00 2001 From: renpeiying Date: Tue, 1 Jul 2025 11:46:29 +0800 Subject: [PATCH 146/213] docs: Update CN translation for esp_http_ota.rst --- .../api-reference/system/esp_https_ota.rst | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/docs/zh_CN/api-reference/system/esp_https_ota.rst b/docs/zh_CN/api-reference/system/esp_https_ota.rst index 9e8dd4d77d1..8896d9e6601 100644 --- a/docs/zh_CN/api-reference/system/esp_https_ota.rst +++ b/docs/zh_CN/api-reference/system/esp_https_ota.rst @@ -71,16 +71,17 @@ mbedTLS Rx buffer 的默认大小为 16 KB,但如果将 ``partial_http_downloa 设计 ^^^^ -* 该方案需首先生成一个唯一的 RSA-3072 公钥—私钥对。公钥保留在 OTA 更新服务器上,用于加密,而私钥作为设备的一部分,例如内嵌于固件中,用于解密。 -* 预加密固件使用 AES-GCM 密钥进行加密,并将该密钥(及其配置参数)作为标头附加到镜像中。 -* 此外,AES-GCM 密钥使用 RSA 公钥进行加密,生成的镜像会托管到 OTA 更新服务器上。 -* 在设备端,首先使用可用的 RSA 私钥解密镜像标头,从而获取 AES-GCM 密钥。 -* 最后,使用 AES-GCM 密钥(和配置参数)解密镜像内容,并将其写入 flash。 +预加密固件是一种 **传输安全方案**,用于确保固件镜像在从 OTA 服务器传输到设备的过程中始终处于加密状态(与底层传输安全无关)。这种方案与 :doc:`../../security/flash-encryption` 在多个关键方面有所不同: -整个工作流程由外部组件 `esp_encrypted_image `_ 管理,并通过解密回调 (:cpp:member:`esp_https_ota_config_t::decrypt_cb`) 机制插入到 OTA 更新框架中。 +* **密钥管理**:使用外部管理的加密密钥,而不是每个设备内部生成的唯一密钥 +* **独立于 flash 偏移**:无论固件烧录在哪个 flash 分区(``ota_0``、``ota_1`` 等),生成的密文内容一致 +* **传输保护**:在固件传输过程中提供加密保护,不涉及设备本地存储安全 -.. note:: - 该支持方案基于 RSA-3072,必须使用平台安全功能保护设备端的私钥。 +**重要安全提示**:预加密固件本身不提供设备级安全保护。固件被接收后在设备上解密,并按设备的 flash 加密配置存储。如需设备级安全措施,需另外启用 flash 加密功能。 + +该功能由 `esp_encrypted_img `_ 组件实现,该组件通过解密回调 (:cpp:member:`esp_https_ota_config_t::decrypt_cb`) 机制集成在 OTA 更新框架中。 + +有关镜像格式、密钥生成及实现细节的详细信息,请参阅 `esp_encrypted_img 组件文档 `_。 OTA 系统事件 ----------------- From 98fa9a3829743d32d2af0d6b7be304ea4a94f822 Mon Sep 17 00:00:00 2001 From: Ashish Sharma Date: Tue, 1 Jul 2025 16:51:06 +0800 Subject: [PATCH 147/213] feat(mbedtls): update to version 3.6.4 --- components/mbedtls/Kconfig | 9 +++++++++ components/mbedtls/mbedtls | 2 +- .../mbedtls/port/include/mbedtls/esp_config.h | 18 ++++++++++++++++++ docs/en/api-reference/protocols/mbedtls.rst | 2 +- docs/zh_CN/api-reference/protocols/mbedtls.rst | 2 +- 5 files changed, 30 insertions(+), 3 deletions(-) diff --git a/components/mbedtls/Kconfig b/components/mbedtls/Kconfig index fab5a91960c..dba613b43c5 100644 --- a/components/mbedtls/Kconfig +++ b/components/mbedtls/Kconfig @@ -245,6 +245,15 @@ menu "mbedTLS" See mbedTLS documentation for required API and more details. + config MBEDTLS_SSL_KEYING_MATERIAL_EXPORT + bool "Enable keying material export" + default n + depends on MBEDTLS_TLS_ENABLED + help + Enable shared symmetric keys export for TLS sessions using mbedtls_ssl_export_keying_material() + after SSL handshake. The process for deriving the keys is specified in RFC 5705 for TLS 1.2 + and in RFC 8446, Section 7.5, for TLS 1.3. + config MBEDTLS_PKCS7_C bool "Enable PKCS number 7" default y diff --git a/components/mbedtls/mbedtls b/components/mbedtls/mbedtls index 601990b1d81..b5d87eaa674 160000 --- a/components/mbedtls/mbedtls +++ b/components/mbedtls/mbedtls @@ -1 +1 @@ -Subproject commit 601990b1d81510a135da9bb0476d6ed3cb8c011b +Subproject commit b5d87eaa6748b7a6fa70593178c08b4480e9b71e diff --git a/components/mbedtls/port/include/mbedtls/esp_config.h b/components/mbedtls/port/include/mbedtls/esp_config.h index c5707dd6f3d..54f49bdc146 100644 --- a/components/mbedtls/port/include/mbedtls/esp_config.h +++ b/components/mbedtls/port/include/mbedtls/esp_config.h @@ -1143,6 +1143,24 @@ #undef MBEDTLS_SSL_KEEP_PEER_CERTIFICATE #endif +/** + * \def MBEDTLS_SSL_KEYING_MATERIAL_EXPORT + * + * When this option is enabled, the client and server can extract additional + * shared symmetric keys after an SSL handshake using the function + * mbedtls_ssl_export_keying_material(). + * + * The process for deriving the keys is specified in RFC 5705 for TLS 1.2 and + * in RFC 8446, Section 7.5, for TLS 1.3. + * + * Comment this macro to disable mbedtls_ssl_export_keying_material(). + */ +#ifdef CONFIG_MBEDTLS_SSL_KEYING_MATERIAL_EXPORT +#define MBEDTLS_SSL_KEYING_MATERIAL_EXPORT +#else +#undef MBEDTLS_SSL_KEYING_MATERIAL_EXPORT +#endif + /** * \def MBEDTLS_SSL_CBC_RECORD_SPLITTING * diff --git a/docs/en/api-reference/protocols/mbedtls.rst b/docs/en/api-reference/protocols/mbedtls.rst index eded7b3053e..7179397414d 100644 --- a/docs/en/api-reference/protocols/mbedtls.rst +++ b/docs/en/api-reference/protocols/mbedtls.rst @@ -118,5 +118,5 @@ Reducing Binary Size Under ``Component Config -> mbedTLS``, there are multiple Mbed TLS features which are enabled by default but can be disabled if not needed to save code size. More information can be about this can be found in :ref:`Minimizing Binary Size ` docs. -.. _`API Reference`: https://mbed-tls.readthedocs.io/projects/api/en/v3.6.3/ +.. _`API Reference`: https://mbed-tls.readthedocs.io/projects/api/en/v3.6.4/ .. _`Knowledge Base`: https://mbed-tls.readthedocs.io/en/latest/kb/ diff --git a/docs/zh_CN/api-reference/protocols/mbedtls.rst b/docs/zh_CN/api-reference/protocols/mbedtls.rst index 88a7a87fb5d..42a1622143c 100644 --- a/docs/zh_CN/api-reference/protocols/mbedtls.rst +++ b/docs/zh_CN/api-reference/protocols/mbedtls.rst @@ -118,5 +118,5 @@ ESP-IDF 中的示例使用 :doc:`/api-reference/protocols/esp_tls`,为访问 在 ``Component Config -> mbedTLS`` 中,有多个 Mbed TLS 功能默认为启用状态。如果不需要这些功能,可将其禁用以减小固件大小。要了解更多信息,请参考 :ref:`Minimizing Binary Size ` 文档。 -.. _`API Reference`: https://mbed-tls.readthedocs.io/projects/api/en/v3.6.3/ +.. _`API Reference`: https://mbed-tls.readthedocs.io/projects/api/en/v3.6.4/ .. _`Knowledge Base`: https://mbed-tls.readthedocs.io/en/latest/kb/ From 50b6bdb61b8989be763e482f192b42f39e95f8e3 Mon Sep 17 00:00:00 2001 From: Rahul Tank Date: Thu, 3 Jul 2025 13:47:31 +0530 Subject: [PATCH 148/213] fix(nimble): Fix compilation issues when gatt caching is enabled in server only mode --- components/bt/host/nimble/nimble | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/host/nimble/nimble b/components/bt/host/nimble/nimble index f18c4789aff..ae8eacdcd36 160000 --- a/components/bt/host/nimble/nimble +++ b/components/bt/host/nimble/nimble @@ -1 +1 @@ -Subproject commit f18c4789afff6ed1d4ecb74028ea666f8e85510a +Subproject commit ae8eacdcd366f39dc290fe6790d770f15dc7ed21 From a0578c231db10e1bd82e2c0e8bdbe0823aa8fa73 Mon Sep 17 00:00:00 2001 From: gaoxu Date: Mon, 7 Jul 2025 14:25:50 +0800 Subject: [PATCH 149/213] feat(cam): add esp32s3 dvp cam support --- .../dvp/src/esp_cam_ctlr_dvp_cam.c | 41 +- .../dvp/src/esp_cam_ctlr_dvp_gdma.c | 38 +- .../esp_driver_cam/test_apps/dvp/README.md | 4 +- .../test_apps/dvp/main/test_dvp_driver.c | 10 +- .../test_apps/dvp/pytest_dvp.py | 21 +- .../test_apps/dvp/sdkconfig.defaults | 1 - .../test_apps/dvp/sdkconfig.defaults.esp32s3 | 4 + components/hal/esp32s3/include/hal/cam_ll.h | 615 ++++++++++++++++++ components/soc/esp32s3/cam_periph.c | 40 ++ .../esp32s3/include/soc/Kconfig.soc_caps.in | 16 + .../soc/esp32s3/include/soc/clk_tree_defs.h | 21 +- components/soc/esp32s3/include/soc/soc_caps.h | 6 + examples/bluetooth/nimble/ble_ancs/README.md | 4 +- 13 files changed, 783 insertions(+), 38 deletions(-) create mode 100644 components/esp_driver_cam/test_apps/dvp/sdkconfig.defaults.esp32s3 create mode 100644 components/hal/esp32s3/include/hal/cam_ll.h create mode 100644 components/soc/esp32s3/cam_periph.c diff --git a/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c b/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c index b1ab042c74f..5836ccb7d6e 100644 --- a/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c +++ b/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -26,12 +26,24 @@ #include "../../dvp_share_ctrl.h" #ifdef CONFIG_CAM_CTLR_DVP_CAM_ISR_CACHE_SAFE -#define CAM_DVP_MEM_ALLOC_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT) +#define DVP_CAM_CTLR_ALLOC_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT) #else -#define CAM_DVP_MEM_ALLOC_CAPS (MALLOC_CAP_DEFAULT) +#define DVP_CAM_CTLR_ALLOC_CAPS (MALLOC_CAP_DEFAULT) #endif -#define ALIGN_UP_BY(num, align) (((num) + ((align) - 1)) & ~((align) - 1)) +#if CONFIG_SPIRAM +#define DVP_CAM_BK_BUFFER_ALLOC_CAPS (MALLOC_CAP_SPIRAM | MALLOC_CAP_DMA) +#else +#define DVP_CAM_BK_BUFFER_ALLOC_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA) +#endif + +#if SOC_PERIPH_CLK_CTRL_SHARED +#define DVP_CAM_CLK_ATOMIC() PERIPH_RCC_ATOMIC() +#else +#define DVP_CAM_CLK_ATOMIC() +#endif + +#define ALIGN_UP_BY(num, align) ((align) == 0 ? (num) : (((num) + ((align) - 1)) & ~((align) - 1))) #define DVP_CAM_CONFIG_INPUT_PIN(pin, sig, inv) \ { \ @@ -211,7 +223,6 @@ static uint32_t IRAM_ATTR esp_cam_ctlr_dvp_get_jpeg_size(const uint8_t *buffer, */ static uint32_t IRAM_ATTR esp_cam_ctlr_dvp_get_recved_size(esp_cam_ctlr_dvp_cam_t *ctlr, uint8_t *rx_buffer, uint32_t dma_recv_size) { - esp_err_t ret; uint32_t recv_buffer_size; if (ctlr->pic_format_jpeg) { @@ -220,8 +231,10 @@ static uint32_t IRAM_ATTR esp_cam_ctlr_dvp_get_recved_size(esp_cam_ctlr_dvp_cam_ recv_buffer_size = ctlr->fb_size_in_bytes; } - ret = esp_cache_msync(rx_buffer, recv_buffer_size, ESP_CACHE_MSYNC_FLAG_DIR_M2C); - assert(ret == ESP_OK); + if (esp_ptr_external_ram(rx_buffer)) { + esp_err_t ret = esp_cache_msync(rx_buffer, recv_buffer_size, ESP_CACHE_MSYNC_FLAG_DIR_M2C); + assert(ret == ESP_OK); + } if (ctlr->pic_format_jpeg) { recv_buffer_size = esp_cam_ctlr_dvp_get_jpeg_size(rx_buffer, dma_recv_size); @@ -337,8 +350,8 @@ esp_err_t esp_cam_ctlr_dvp_init(int ctlr_id, cam_clock_source_t clk_src, const e } } - esp_clk_tree_enable_src((soc_module_clk_t)clk_src, true); - PERIPH_RCC_ATOMIC() { + ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)clk_src, true)); + DVP_CAM_CLK_ATOMIC() { cam_ll_enable_clk(ctlr_id, true); cam_ll_select_clk_src(ctlr_id, clk_src); }; @@ -369,7 +382,7 @@ esp_err_t esp_cam_ctlr_dvp_output_clock(int ctlr_id, cam_clock_source_t clk_src, ESP_LOGD(TAG, "DVP clock source frequency %" PRIu32 "Hz", src_clk_hz); if ((src_clk_hz % xclk_freq) == 0) { - PERIPH_RCC_ATOMIC() { + DVP_CAM_CLK_ATOMIC() { cam_ll_set_group_clock_coeff(ctlr_id, src_clk_hz / xclk_freq, 0, 0); }; @@ -392,7 +405,7 @@ esp_err_t esp_cam_ctlr_dvp_deinit(int ctlr_id) { ESP_RETURN_ON_FALSE(ctlr_id < CAP_DVP_PERIPH_NUM, ESP_ERR_INVALID_ARG, TAG, "invalid argument: ctlr_id >= %d", CAP_DVP_PERIPH_NUM); - PERIPH_RCC_ATOMIC() { + DVP_CAM_CLK_ATOMIC() { cam_ll_enable_clk(ctlr_id, false); }; @@ -695,11 +708,11 @@ esp_err_t esp_cam_new_dvp_ctlr(const esp_cam_ctlr_dvp_config_t *config, esp_cam_ ESP_RETURN_ON_FALSE(config->external_xtal || config->pin_dont_init || config->pin->xclk_io != GPIO_NUM_NC, ESP_ERR_INVALID_ARG, TAG, "invalid argument: xclk_io is not set"); ESP_RETURN_ON_FALSE(config->external_xtal || config->xclk_freq, ESP_ERR_INVALID_ARG, TAG, "invalid argument: xclk_freq is not set"); - ESP_RETURN_ON_ERROR(esp_cache_get_alignment(MALLOC_CAP_SPIRAM | MALLOC_CAP_DMA, &alignment_size), TAG, "failed to get cache alignment"); + ESP_RETURN_ON_ERROR(esp_cache_get_alignment(DVP_CAM_BK_BUFFER_ALLOC_CAPS, &alignment_size), TAG, "failed to get cache alignment"); ESP_RETURN_ON_ERROR(esp_cam_ctlr_dvp_cam_get_frame_size(config, &fb_size_in_bytes), TAG, "invalid argument: input frame pixel format is not supported"); ESP_RETURN_ON_ERROR(dvp_shared_ctrl_claim_io_signals(), TAG, "failed to claim io signals"); - esp_cam_ctlr_dvp_cam_t *ctlr = heap_caps_calloc(1, sizeof(esp_cam_ctlr_dvp_cam_t), CAM_DVP_MEM_ALLOC_CAPS); + esp_cam_ctlr_dvp_cam_t *ctlr = heap_caps_calloc(1, sizeof(esp_cam_ctlr_dvp_cam_t), DVP_CAM_CTLR_ALLOC_CAPS); ESP_GOTO_ON_FALSE(ctlr, ESP_ERR_NO_MEM, fail0, TAG, "no mem for CAM DVP controller context"); ESP_GOTO_ON_ERROR(s_dvp_claim_ctlr(config->ctlr_id, ctlr), fail1, TAG, "no available DVP controller"); @@ -707,7 +720,7 @@ esp_err_t esp_cam_new_dvp_ctlr(const esp_cam_ctlr_dvp_config_t *config, esp_cam_ ESP_LOGD(TAG, "alignment: 0x%x\n", alignment_size); fb_size_in_bytes = ALIGN_UP_BY(fb_size_in_bytes, alignment_size); if (!config->bk_buffer_dis) { - ctlr->backup_buffer = heap_caps_aligned_alloc(alignment_size, fb_size_in_bytes, MALLOC_CAP_SPIRAM); + ctlr->backup_buffer = heap_caps_aligned_alloc(alignment_size, fb_size_in_bytes, DVP_CAM_BK_BUFFER_ALLOC_CAPS); ESP_GOTO_ON_FALSE(ctlr->backup_buffer, ESP_ERR_NO_MEM, fail2, TAG, "no mem for DVP backup buffer"); } diff --git a/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_gdma.c b/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_gdma.c index bb1ef35c6c4..f05eb255450 100644 --- a/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_gdma.c +++ b/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_gdma.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -10,9 +10,24 @@ #include "esp_cache.h" #include "esp_private/esp_cache_private.h" #include "esp_cam_ctlr_dvp_dma.h" +#include "esp_memory_utils.h" #define ALIGN_UP_BY(num, align) (((num) + ((align) - 1)) & ~((align) - 1)) +#if defined(SOC_GDMA_TRIG_PERIPH_CAM0_BUS) && (SOC_GDMA_TRIG_PERIPH_CAM0_BUS == SOC_GDMA_BUS_AHB) +#define DVP_GDMA_NEW_CHANNEL gdma_new_ahb_channel +#define DVP_GDMA_DESC_ALLOC_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA) +#elif defined(SOC_GDMA_TRIG_PERIPH_CAM0_BUS) && (SOC_GDMA_TRIG_PERIPH_CAM0_BUS == SOC_GDMA_BUS_AXI) +#define DVP_GDMA_NEW_CHANNEL gdma_new_axi_channel +#if CONFIG_SPIRAM +#define DVP_GDMA_DESC_ALLOC_CAPS (MALLOC_CAP_SPIRAM | MALLOC_CAP_DMA) +#else +#define DVP_GDMA_DESC_ALLOC_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA) +#endif +#else +#error "Unsupported GDMA bus type for DVP" +#endif + static const char *TAG = "dvp_gdma"; /** @@ -70,9 +85,9 @@ esp_err_t esp_cam_ctlr_dvp_dma_init(esp_cam_ctlr_dvp_dma_t *dma, uint32_t burst_ #endif }; - ESP_RETURN_ON_ERROR(esp_cache_get_alignment(MALLOC_CAP_SPIRAM | MALLOC_CAP_DMA, &alignment_size), TAG, "failed to get cache alignment"); + ESP_RETURN_ON_ERROR(esp_cache_get_alignment(DVP_GDMA_DESC_ALLOC_CAPS, &alignment_size), TAG, "failed to get cache alignment"); - ESP_RETURN_ON_ERROR(gdma_new_axi_channel(&rx_alloc_config, &dma->dma_chan), TAG, "new channel failed"); + ESP_RETURN_ON_ERROR(DVP_GDMA_NEW_CHANNEL(&rx_alloc_config, &dma->dma_chan), TAG, "new channel failed"); ESP_GOTO_ON_ERROR(gdma_connect(dma->dma_chan, GDMA_MAKE_TRIGGER(GDMA_TRIG_PERIPH_CAM, 0)), fail0, TAG, "connect failed"); @@ -88,17 +103,20 @@ esp_err_t esp_cam_ctlr_dvp_dma_init(esp_cam_ctlr_dvp_dma_t *dma, uint32_t burst_ .access_ext_mem = true, }; ESP_GOTO_ON_ERROR(gdma_config_transfer(dma->dma_chan, &transfer_config), fail1, TAG, "set trans ability failed"); + size_t int_mem_align = 0; + size_t ext_mem_align = 0; + gdma_get_alignment_constraints(dma->dma_chan, &int_mem_align, &ext_mem_align); dma->desc_count = size / ESP_CAM_CTLR_DVP_DMA_DESC_BUFFER_MAX_SIZE; if (size % ESP_CAM_CTLR_DVP_DMA_DESC_BUFFER_MAX_SIZE) { dma->desc_count++; } dma->size = size; - - ESP_LOGD(TAG, "alignment: 0x%x\n", alignment_size); + alignment_size = (alignment_size == 0) ? 1 : alignment_size; dma->desc_size = ALIGN_UP_BY(dma->desc_count * sizeof(esp_cam_ctlr_dvp_dma_desc_t), alignment_size); - dma->desc = heap_caps_aligned_alloc(alignment_size, dma->desc_size, MALLOC_CAP_SPIRAM | MALLOC_CAP_DMA); + ESP_LOGD(TAG, "alignment_size: %d, dma->desc_count: %d, dma->desc_size: %d", alignment_size, dma->desc_count, dma->desc_size); + dma->desc = heap_caps_aligned_alloc(alignment_size, dma->desc_size, DVP_GDMA_DESC_ALLOC_CAPS); ESP_GOTO_ON_FALSE(dma->desc, ESP_ERR_NO_MEM, fail1, TAG, "no mem for DVP DMA descriptor"); return ESP_OK; @@ -142,15 +160,15 @@ esp_err_t esp_cam_ctlr_dvp_dma_deinit(esp_cam_ctlr_dvp_dma_t *dma) */ esp_err_t IRAM_ATTR esp_cam_ctlr_dvp_dma_start(esp_cam_ctlr_dvp_dma_t *dma, uint8_t *buffer, size_t size) { - esp_err_t ret; - ESP_RETURN_ON_FALSE_ISR(dma, ESP_ERR_INVALID_ARG, TAG, "invalid argument: null pointer"); ESP_RETURN_ON_FALSE_ISR(dma->size >= size, ESP_ERR_INVALID_ARG, TAG, "input buffer size is out of range"); esp_cam_ctlr_dvp_config_dma_desc(dma->desc, buffer, size); - ret = esp_cache_msync(dma->desc, dma->desc_size, ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_INVALIDATE); - assert(ret == ESP_OK); + if (esp_ptr_external_ram(dma->desc)) { + esp_err_t ret = esp_cache_msync(dma->desc, dma->desc_size, ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_INVALIDATE); + assert(ret == ESP_OK); + } return gdma_start(dma->dma_chan, (intptr_t)dma->desc); } diff --git a/components/esp_driver_cam/test_apps/dvp/README.md b/components/esp_driver_cam/test_apps/dvp/README.md index 909282018f2..25fbbd517f0 100644 --- a/components/esp_driver_cam/test_apps/dvp/README.md +++ b/components/esp_driver_cam/test_apps/dvp/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32-P4 | -| ----------------- | -------- | +| Supported Targets | ESP32-P4 | ESP32-S3 | +| ----------------- | -------- | -------- | diff --git a/components/esp_driver_cam/test_apps/dvp/main/test_dvp_driver.c b/components/esp_driver_cam/test_apps/dvp/main/test_dvp_driver.c index ec99cc5202a..f138f1ee9b0 100644 --- a/components/esp_driver_cam/test_apps/dvp/main/test_dvp_driver.c +++ b/components/esp_driver_cam/test_apps/dvp/main/test_dvp_driver.c @@ -17,7 +17,7 @@ TEST_CASE("TEST DVP driver allocation", "[DVP]") .h_res = 800, .v_res = 640, .input_data_color_type = CAM_CTLR_COLOR_RGB565, - .dma_burst_size = 128, + .dma_burst_size = 64, .byte_swap_en = false, .pin_dont_init = true, .external_xtal = true, @@ -42,7 +42,7 @@ TEST_CASE("TEST DVP driver allocation with JPEG input", "[DVP]") .clk_src = CAM_CLK_SRC_DEFAULT, .h_res = 800, .v_res = 640, - .dma_burst_size = 128, + .dma_burst_size = 64, .byte_swap_en = false, .pin_dont_init = true, .pic_format_jpeg = true, @@ -69,7 +69,7 @@ TEST_CASE("TEST DVP driver no backup buffer usage", "[DVP]") .h_res = 800, .v_res = 640, .input_data_color_type = CAM_CTLR_COLOR_RGB565, - .dma_burst_size = 128, + .dma_burst_size = 64, .byte_swap_en = false, .bk_buffer_dis = true, .pin_dont_init = true, @@ -96,7 +96,7 @@ TEST_CASE("TEST DVP driver intern/extern init", "[DVP]") .h_res = 800, .v_res = 640, .input_data_color_type = CAM_CTLR_COLOR_RGB565, - .dma_burst_size = 128, + .dma_burst_size = 64, .byte_swap_en = false, .external_xtal = true, }; @@ -128,7 +128,7 @@ TEST_CASE("TEST DVP driver intern/extern generate xclk", "[DVP]") .h_res = 800, .v_res = 640, .input_data_color_type = CAM_CTLR_COLOR_RGB565, - .dma_burst_size = 128, + .dma_burst_size = 64, .byte_swap_en = false, .external_xtal = true, }; diff --git a/components/esp_driver_cam/test_apps/dvp/pytest_dvp.py b/components/esp_driver_cam/test_apps/dvp/pytest_dvp.py index 139f1c0694b..7e15807406a 100644 --- a/components/esp_driver_cam/test_apps/dvp/pytest_dvp.py +++ b/components/esp_driver_cam/test_apps/dvp/pytest_dvp.py @@ -1,10 +1,27 @@ -# SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 import pytest from pytest_embedded import Dut +from pytest_embedded_idf.utils import idf_parametrize -@pytest.mark.esp32p4 @pytest.mark.generic +@pytest.mark.parametrize( + 'config', + ['cache_safe'], + indirect=True, +) +@idf_parametrize('target', ['esp32p4'], indirect=['target']) def test_dvp(dut: Dut) -> None: dut.run_all_single_board_cases() + + +@pytest.mark.octal_psram +@pytest.mark.parametrize( + 'config', + ['cache_safe'], + indirect=True, +) +@idf_parametrize('target', ['esp32s3'], indirect=['target']) +def test_dvp_octal(dut: Dut) -> None: + dut.run_all_single_board_cases() diff --git a/components/esp_driver_cam/test_apps/dvp/sdkconfig.defaults b/components/esp_driver_cam/test_apps/dvp/sdkconfig.defaults index eb6374a3709..87397fa9453 100644 --- a/components/esp_driver_cam/test_apps/dvp/sdkconfig.defaults +++ b/components/esp_driver_cam/test_apps/dvp/sdkconfig.defaults @@ -2,4 +2,3 @@ # Espressif IoT Development Framework (ESP-IDF) 5.4.0 Project Minimal Configuration # CONFIG_ESP_TASK_WDT_EN=n -CONFIG_FREERTOS_HZ=1000 diff --git a/components/esp_driver_cam/test_apps/dvp/sdkconfig.defaults.esp32s3 b/components/esp_driver_cam/test_apps/dvp/sdkconfig.defaults.esp32s3 new file mode 100644 index 00000000000..15ecad20b0a --- /dev/null +++ b/components/esp_driver_cam/test_apps/dvp/sdkconfig.defaults.esp32s3 @@ -0,0 +1,4 @@ +CONFIG_IDF_TARGET="esp32s3" + +CONFIG_SPIRAM=y +CONFIG_SPIRAM_MODE_OCT=y diff --git a/components/hal/esp32s3/include/hal/cam_ll.h b/components/hal/esp32s3/include/hal/cam_ll.h new file mode 100644 index 00000000000..2556b004bc5 --- /dev/null +++ b/components/hal/esp32s3/include/hal/cam_ll.h @@ -0,0 +1,615 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "hal/misc.h" +#include "hal/assert.h" +#include "soc/lcd_cam_struct.h" +#include "soc/system_struct.h" +#include "hal/cam_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define CAM_LL_GET_HW(id) (((id) == 0) ? (&LCD_CAM) : NULL) + +#define CAM_LL_CLK_FRAC_DIV_N_MAX 256 // CAM_CLK = CAM_CLK_S / (N + b/a), the N register is 8 bit-width +#define CAM_LL_CLK_FRAC_DIV_AB_MAX 64 // CAM_CLK = CAM_CLK_S / (N + b/a), the a/b register is 6 bit-width + +/** + * @brief Enable the bus clock for CAM module + * + * @param group_id Group ID + * @param enable true to enable, false to disable + */ +static inline void cam_ll_enable_bus_clock(int group_id, bool en) +{ + (void)group_id; + SYSTEM.perip_clk_en1.lcd_cam_clk_en = en; +} +/// use a macro to wrap the function, force the caller to use it in a critical section +/// the critical section needs to declare the __DECLARE_RCC_RC_ATOMIC_ENV variable in advance +#define cam_ll_enable_bus_clock(...) do { \ + (void)__DECLARE_RCC_RC_ATOMIC_ENV; \ + cam_ll_enable_bus_clock(__VA_ARGS__); \ + } while(0) + +/** + * @brief Reset the CAM module + * + * @param group_id Group ID + */ +static inline void cam_ll_reset_register(int group_id) +{ + (void)group_id; + SYSTEM.perip_rst_en1.lcd_cam_rst = 1; + SYSTEM.perip_rst_en1.lcd_cam_rst = 0; +} + +/// use a macro to wrap the function, force the caller to use it in a critical section +/// the critical section needs to declare the __DECLARE_RCC_RC_ATOMIC_ENV variable in advance +#define cam_ll_reset_register(...) do { \ + (void)__DECLARE_RCC_RC_ATOMIC_ENV; \ + cam_ll_reset_register(__VA_ARGS__); \ + } while(0) + +/** + * @brief Enable clock gating + * + * @param group_id Group ID + * @param en True to enable, False to disable + */ +static inline void cam_ll_enable_clk(int group_id, bool en) +{ + (void)group_id; + (void)en; + //For compatibility +} + +/** + * @brief Select clock source for CAM peripheral + * + * @param group_id Group ID + * @param src Clock source + */ +static inline void cam_ll_select_clk_src(int group_id, cam_clock_source_t src) +{ + switch (src) { + case CAM_CLK_SRC_XTAL: + LCD_CAM.cam_ctrl.cam_clk_sel = 1; + break; + case CAM_CLK_SRC_PLL240M: + LCD_CAM.cam_ctrl.cam_clk_sel = 2; + break; + case CAM_CLK_SRC_PLL160M: + LCD_CAM.cam_ctrl.cam_clk_sel = 3; + break; + default: + // disable LCD clock source + LCD_CAM.cam_ctrl.cam_clk_sel = 0; + HAL_ASSERT(false); + break; + } +} + +/** + * @brief Get the CAM source clock type + * + * @param dev CAM register base address + * @param src The pointer to accept the CAM source clock type + */ +static inline void cam_ll_get_clk_src(lcd_cam_dev_t *dev, cam_clock_source_t *src) +{ + switch (LCD_CAM.cam_ctrl.cam_clk_sel) { + case 1: + *src = CAM_CLK_SRC_XTAL; + break; + case 2: + *src = CAM_CLK_SRC_PLL240M; + break; + case 3: + *src = CAM_CLK_SRC_PLL160M; + break; + default: + HAL_ASSERT(false); + break; + } +} + +/** + * @brief Set clock coefficient of CAM peripheral + * + * @param group_id Group ID + * @param div_num Integer part of the divider + * @param div_a denominator of the divider + * @param div_b numerator of the divider + */ +__attribute__((always_inline)) +static inline void cam_ll_set_group_clock_coeff(int group_id, int div_num, int div_a, int div_b) +{ + HAL_ASSERT(div_num >= 2 && div_num < CAM_LL_CLK_FRAC_DIV_N_MAX); + + LCD_CAM.cam_ctrl.cam_clkm_div_num = div_num; + LCD_CAM.cam_ctrl.cam_clkm_div_a = div_a; + LCD_CAM.cam_ctrl.cam_clkm_div_b = div_b; +} + +/** + * @brief Enable stop signal for CAM peripheral + * + * @param dev CAM register base address + * @param en True to stop when GDMA Rx FIFO is full, False to not stop + */ +static inline void cam_ll_enable_stop_signal(lcd_cam_dev_t *dev, bool en) +{ + dev->cam_ctrl.cam_stop_en = en; +} + +/** + * @brief Set vsync filter threshold value + * + * @param dev CAM register base address + * @param value Filter threshold value for CAM_VSYNC_SIGNAL, range [0, 7] + */ +static inline void cam_ll_set_vsync_filter_thres(lcd_cam_dev_t *dev, uint32_t value) +{ + dev->cam_ctrl.cam_vsync_filter_thres = value; +} + +/** + * @brief Enable to generate LCD_CAM_CAM_HS_INT + * + * @param dev CAM register base address + * @param en True to enable to generate LCD_CAM_CAM_HS_INT, False to disable + */ +static inline void cam_ll_enable_hs_line_int(lcd_cam_dev_t *dev, bool en) +{ + dev->cam_ctrl.cam_line_int_en = en; +} + +/** + * @brief Enable CAM_VSYNC to generate in_suc_eof + * + * @param dev CAM register base address + * @param en True to enable CAM_VSYNC to generate in_suc_eof, False to use LCD_CAM_CAM_REC_DATA_BYTELEN to control in_suc_eof + */ +static inline void cam_ll_enable_vsync_generate_eof(lcd_cam_dev_t *dev, bool en) +{ + dev->cam_ctrl.cam_vs_eof_en = en; +} + +/** + * @brief Enable to swap every two 8-bit input data + * + * @param dev CAM register base address + * @param en True to enable invert, False to disable invert + */ +static inline void cam_ll_enable_8bits_data_invert(lcd_cam_dev_t *dev, bool en) +{ + dev->cam_rgb_yuv.cam_conv_8bits_data_inv = en; +} + +/** + * @brief Enable YUV-RGB converter + * + * @param dev CAM register base address + * @param en True to enable converter, False to disable converter + */ +static inline void cam_ll_enable_rgb_yuv_convert(lcd_cam_dev_t *dev, bool en) +{ + dev->cam_rgb_yuv.cam_conv_bypass = en; +} + +/** + * @brief Set convert data line width + * + * @param dev CAM register base address + * @param width data line width (8 or 16) + */ +static inline void cam_ll_set_convert_data_width(lcd_cam_dev_t *dev, uint32_t width) +{ + HAL_ASSERT(width == 8 || width == 16); + dev->cam_rgb_yuv.cam_conv_mode_8bits_on = (width == 8) ? 1 : 0; +} + +/** + * @brief Set the color range of input data + * + * @param dev CAM register base address + * @param range Color range + */ +static inline void cam_ll_set_input_color_range(lcd_cam_dev_t *dev, color_range_t range) +{ + if (range == COLOR_RANGE_LIMIT) { + dev->cam_rgb_yuv.cam_conv_data_in_mode = 0; + } else if (range == COLOR_RANGE_FULL) { + dev->cam_rgb_yuv.cam_conv_data_in_mode = 1; + } +} + +/** + * @brief Set the color range of output data + * + * @param dev CAM register base address + * @param range Color range + */ +static inline void cam_ll_set_output_color_range(lcd_cam_dev_t *dev, color_range_t range) +{ + if (range == COLOR_RANGE_LIMIT) { + dev->cam_rgb_yuv.cam_conv_data_out_mode = 0; + } else if (range == COLOR_RANGE_FULL) { + dev->cam_rgb_yuv.cam_conv_data_out_mode = 1; + } +} + +/** + * @brief Set YUV conversion standard + * + * @param dev CAM register base address + * @param std YUV conversion standard + */ +static inline void cam_ll_set_yuv_convert_std(lcd_cam_dev_t *dev, color_conv_std_rgb_yuv_t std) +{ + if (std == COLOR_CONV_STD_RGB_YUV_BT601) { + dev->cam_rgb_yuv.cam_conv_protocol_mode = 0; + } else if (std == COLOR_CONV_STD_RGB_YUV_BT709) { + dev->cam_rgb_yuv.cam_conv_protocol_mode = 1; + } +} + +/** + * @brief Set the converter mode: RGB565 to YUV + * + * @param dev CAM register base address + * @param yuv_sample YUV sample mode + */ +static inline void cam_ll_set_convert_mode_rgb_to_yuv(lcd_cam_dev_t *dev, color_pixel_yuv_format_t yuv_sample) +{ + dev->cam_rgb_yuv.cam_conv_trans_mode = 1; + dev->cam_rgb_yuv.cam_conv_yuv2yuv_mode = 3; + switch (yuv_sample) { + case COLOR_PIXEL_YUV422: + dev->cam_rgb_yuv.cam_conv_yuv_mode = 0; + break; + case COLOR_PIXEL_YUV420: + dev->cam_rgb_yuv.cam_conv_yuv_mode = 1; + break; + case COLOR_PIXEL_YUV411: + dev->cam_rgb_yuv.cam_conv_yuv_mode = 2; + break; + default: + abort(); + } +} + +/** + * @brief Set the converter mode: YUV to RGB565 + * + * @param dev CAM register base address + * @param yuv_sample YUV sample mode + */ +static inline void cam_ll_set_convert_mode_yuv_to_rgb(lcd_cam_dev_t *dev, color_pixel_yuv_format_t yuv_sample) +{ + dev->cam_rgb_yuv.cam_conv_trans_mode = 0; + dev->cam_rgb_yuv.cam_conv_yuv2yuv_mode = 3; + switch (yuv_sample) { + case COLOR_PIXEL_YUV422: + dev->cam_rgb_yuv.cam_conv_yuv_mode = 0; + break; + case COLOR_PIXEL_YUV420: + dev->cam_rgb_yuv.cam_conv_yuv_mode = 1; + break; + case COLOR_PIXEL_YUV411: + dev->cam_rgb_yuv.cam_conv_yuv_mode = 2; + break; + default: + abort(); + } +} + +/** + * @brief Set the converter mode: YUV to YUV + * + * @param dev CAM register base address + * @param src_sample Source YUV sample mode + * @param dst_sample Destination YUV sample mode + */ +static inline void cam_ll_set_convert_mode_yuv_to_yuv(lcd_cam_dev_t *dev, color_pixel_yuv_format_t src_sample, color_pixel_yuv_format_t dst_sample) +{ + HAL_ASSERT(src_sample != dst_sample); + dev->cam_rgb_yuv.cam_conv_trans_mode = 1; + switch (src_sample) { + case COLOR_PIXEL_YUV422: + dev->cam_rgb_yuv.cam_conv_yuv_mode = 0; + break; + case COLOR_PIXEL_YUV420: + dev->cam_rgb_yuv.cam_conv_yuv_mode = 1; + break; + case COLOR_PIXEL_YUV411: + dev->cam_rgb_yuv.cam_conv_yuv_mode = 2; + break; + default: + abort(); + } + switch (dst_sample) { + case COLOR_PIXEL_YUV422: + dev->cam_rgb_yuv.cam_conv_yuv2yuv_mode = 0; + break; + case COLOR_PIXEL_YUV420: + dev->cam_rgb_yuv.cam_conv_yuv2yuv_mode = 1; + break; + case COLOR_PIXEL_YUV411: + dev->cam_rgb_yuv.cam_conv_yuv2yuv_mode = 2; + break; + default: + abort(); + } +} + +/** + * @brief Set camera received data byte length + * + * @param dev CAM register base address + * @param length received data byte length, range [0, 0xFFFF] + */ +static inline void cam_ll_set_recv_data_bytelen(lcd_cam_dev_t *dev, uint32_t length) +{ + HAL_FORCE_MODIFY_U32_REG_FIELD(dev->cam_ctrl1, cam_rec_data_bytelen, length); +} + +/** + * @brief Set line number to trigger interrupt + * + * @param dev CAM register base address + * @param number line number to trigger hs interrupt, range [0, 0x3F] + */ +static inline void cam_ll_set_line_int_num(lcd_cam_dev_t *dev, uint32_t number) +{ + dev->cam_ctrl1.cam_line_int_num = number; +} + +/** + * @brief Whether to invert the input signal CAM_PCLK + * + * @param dev CAM register base address + * @param en True to invert, False to not invert + */ +static inline void cam_ll_enable_invert_pclk(lcd_cam_dev_t *dev, bool en) +{ + dev->cam_ctrl1.cam_clk_inv = en; +} + +/** + * @brief Enable CAM_VSYNC filter function + * + * @param dev CAM register base address + * @param en True to enable, False to bypass + */ +static inline void cam_ll_enable_vsync_filter(lcd_cam_dev_t *dev, bool en) +{ + dev->cam_ctrl1.cam_vsync_filter_en = en; +} + +/** + * @brief Set CAM input data width + * + * @param dev CAM register base address + * @param stride 16: The bit number of input data is 9~16. 8: The bit number of input data is 0~8. + */ +static inline void cam_ll_set_input_data_width(lcd_cam_dev_t *dev, uint32_t stride) +{ + switch (stride) { + case 8: + dev->cam_ctrl1.cam_2byte_en = 0; + break; + case 16: + dev->cam_ctrl1.cam_2byte_en = 1; + break; + default: + HAL_ASSERT(false); + break; + } +} + +/** + * @brief Whether to invert CAM_DE + * + * @param dev CAM register base address + * @param en True to invert, False to not invert + */ +static inline void cam_ll_enable_invert_de(lcd_cam_dev_t *dev, bool en) +{ + dev->cam_ctrl1.cam_de_inv = en; +} + +/** + * @brief Whether to invert CAM_HSYNC + * + * @param dev CAM register base address + * @param en True to invert, False to not invert + */ +static inline void cam_ll_enable_invert_hsync(lcd_cam_dev_t *dev, bool en) +{ + dev->cam_ctrl1.cam_hsync_inv = en; +} + +/** + * @brief Whether to invert CAM_VSYNC + * + * @param dev CAM register base address + * @param en True to invert, False to not invert + */ +static inline void cam_ll_enable_invert_vsync(lcd_cam_dev_t *dev, bool en) +{ + dev->cam_ctrl1.cam_vsync_inv = en; +} + +/** + * @brief Enable the mode to control the input control signals + * + * @param dev CAM register base address + * @param mode 1: Input control signals are CAM_DE, CAM_HSYNC and CAM_VSYNC; + * 0: Input control signals are CAM_DE and CAM_VSYNC. CAM_HSYNC and CAM_DE are all 1 the the same time. + */ +static inline void cam_ll_set_vh_de_mode(lcd_cam_dev_t *dev, bool enable) +{ + dev->cam_ctrl1.cam_vh_de_mode_en = enable; +} + +/** + * @brief Get the mode of input control signals + * + * @param dev CAM register base address + * @param en The pointer to accept the vh_de mode status. 1: Input control signals are CAM_DE, CAM_HSYNC and CAM_VSYNC; + * 0: Input control signals are CAM_DE and CAM_VSYNC. CAM_HSYNC and CAM_DE are all 1 the the same time. + */ +static inline void cam_ll_get_vh_de_mode(lcd_cam_dev_t *dev, bool *en) +{ + *en = dev->cam_ctrl1.cam_vh_de_mode_en; +} + +/** + * @brief Set the wire width of CAM output + * + * @param dev CAM register base address + * @param width CAM output wire width + */ +static inline void cam_ll_set_data_wire_width(lcd_cam_dev_t *dev, uint32_t width) +{ + // data line width is same as data stride that set in `cam_ll_set_input_data_width` +} + +/** + * @brief Start the CAM transaction + * + * @param dev CAM register base address + */ +__attribute__((always_inline)) +static inline void cam_ll_start(lcd_cam_dev_t *dev) +{ + dev->cam_ctrl.cam_update = 1; + dev->cam_ctrl1.cam_start = 1; +} + +/** + * @brief Stop the CAM transaction + * + * @param dev CAM register base address + */ +__attribute__((always_inline)) +static inline void cam_ll_stop(lcd_cam_dev_t *dev) +{ + dev->cam_ctrl1.cam_start = 0; + dev->cam_ctrl.cam_update = 1; // self clear +} + +/** + * @brief Whether to reverse the data bit order + * + * @note It acts before the YUV-RGB converter + * + * @param dev CAM register base address + * @param en True to reverse, False to not reverse + */ +__attribute__((always_inline)) +static inline void cam_ll_reverse_dma_data_bit_order(lcd_cam_dev_t *dev, bool en) +{ + dev->cam_ctrl.cam_bit_order = en; +} + +/** + * @brief Whether to swap adjacent two bytes + * + * @note This acts before the YUV-RGB converter, mainly to change the data endian. + * {B1,B0},{B3,B2} => {B0,B1}{B2,B3} + * + * @param dev CAM register base address + * @param en True to swap the byte order, False to not swap + */ +__attribute__((always_inline)) +static inline void cam_ll_swap_dma_data_byte_order(lcd_cam_dev_t *dev, bool en) +{ + dev->cam_ctrl.cam_byte_order = en; +} + +/** + * @brief Reset camera module + * + * @param dev CAM register base address + */ +__attribute__((always_inline)) +static inline void cam_ll_reset(lcd_cam_dev_t *dev) +{ + dev->cam_ctrl1.cam_reset = 1; // self clear +} + +/** + * @brief Reset Async RX FIFO + * + * @param dev CAM register base address + */ +__attribute__((always_inline)) +static inline void cam_ll_fifo_reset(lcd_cam_dev_t *dev) +{ + dev->cam_ctrl1.cam_afifo_reset = 1; // self clear +} + +/** + * @brief Enable/disable interrupt by mask + * + * @param dev CAM register base address + * @param mask Interrupt mask + * @param en True to enable interrupt, False to disable interrupt + */ +static inline void cam_ll_enable_interrupt(lcd_cam_dev_t *dev, uint32_t mask, bool en) +{ + if (en) { + dev->lc_dma_int_ena.val |= mask & 0x0c; + } else { + dev->lc_dma_int_ena.val &= ~(mask & 0x0c); + } +} + +/** + * @brief Get interrupt status value + * + * @param dev CAM register base address + * @return Interrupt status value + */ +__attribute__((always_inline)) +static inline uint32_t cam_ll_get_interrupt_status(lcd_cam_dev_t *dev) +{ + return dev->lc_dma_int_st.val & 0x0c; +} + +/** + * @brief Clear interrupt status by mask + * + * @param dev CAM register base address + * @param mask Interrupt status mask + */ +__attribute__((always_inline)) +static inline void cam_ll_clear_interrupt_status(lcd_cam_dev_t *dev, uint32_t mask) +{ + dev->lc_dma_int_clr.val = mask & 0x0c; +} + +/** + * @brief Get address of interrupt status register address + * + * @param dev CAM register base address + * @return Interrupt status register address + */ +static inline volatile void *cam_ll_get_interrupt_status_reg(lcd_cam_dev_t *dev) +{ + return &dev->lc_dma_int_st; +} + +#ifdef __cplusplus +} +#endif diff --git a/components/soc/esp32s3/cam_periph.c b/components/soc/esp32s3/cam_periph.c new file mode 100644 index 00000000000..36799a40754 --- /dev/null +++ b/components/soc/esp32s3/cam_periph.c @@ -0,0 +1,40 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "soc/gpio_sig_map.h" +#include "soc/cam_periph.h" + +const cam_signal_conn_t cam_periph_signals = { + .buses = { + [0] = { + .module = PERIPH_LCD_CAM_MODULE, + .irq_id = ETS_LCD_CAM_INTR_SOURCE, + .data_sigs = { + CAM_DATA_IN0_IDX, + CAM_DATA_IN1_IDX, + CAM_DATA_IN2_IDX, + CAM_DATA_IN3_IDX, + CAM_DATA_IN4_IDX, + CAM_DATA_IN5_IDX, + CAM_DATA_IN6_IDX, + CAM_DATA_IN7_IDX, + CAM_DATA_IN8_IDX, + CAM_DATA_IN9_IDX, + CAM_DATA_IN10_IDX, + CAM_DATA_IN11_IDX, + CAM_DATA_IN12_IDX, + CAM_DATA_IN13_IDX, + CAM_DATA_IN14_IDX, + CAM_DATA_IN15_IDX + }, + .hsync_sig = CAM_H_SYNC_IDX, + .vsync_sig = CAM_V_SYNC_IDX, + .pclk_sig = CAM_PCLK_IDX, + .de_sig = CAM_H_ENABLE_IDX, + .clk_sig = CAM_CLK_IDX + } + } +}; diff --git a/components/soc/esp32s3/include/soc/Kconfig.soc_caps.in b/components/soc/esp32s3/include/soc/Kconfig.soc_caps.in index 4031e836a15..88f3c3217c5 100644 --- a/components/soc/esp32s3/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32s3/include/soc/Kconfig.soc_caps.in @@ -63,6 +63,10 @@ config SOC_LCDCAM_SUPPORTED bool default y +config SOC_LCDCAM_CAM_SUPPORTED + bool + default y + config SOC_LCDCAM_I80_LCD_SUPPORTED bool default y @@ -1486,3 +1490,15 @@ config SOC_ULP_HAS_ADC config SOC_PHY_COMBO_MODULE bool default y + +config SOC_LCDCAM_CAM_SUPPORT_RGB_YUV_CONV + bool + default y + +config SOC_LCDCAM_CAM_PERIPH_NUM + int + default 1 + +config SOC_LCDCAM_CAM_DATA_WIDTH_MAX + int + default 16 diff --git a/components/soc/esp32s3/include/soc/clk_tree_defs.h b/components/soc/esp32s3/include/soc/clk_tree_defs.h index dc74e9ad564..bce2cc7191c 100644 --- a/components/soc/esp32s3/include/soc/clk_tree_defs.h +++ b/components/soc/esp32s3/include/soc/clk_tree_defs.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -21,7 +21,7 @@ extern "C" { * * 2) External 40MHz Crystal Clock: XTAL * - * 3) Internal 136kHz RC Oscillator: RC_SLOW (usually referrred as RTC in TRM or reg. description) + * 3) Internal 136kHz RC Oscillator: RC_SLOW (usually referred as RTC in TRM or reg. description) * * This RC oscillator generates a ~136kHz clock signal output as the RC_SLOW_CLK. The exact frequency of this clock * can be computed in runtime through calibration. @@ -187,6 +187,23 @@ typedef enum { LCD_CLK_SRC_DEFAULT = SOC_MOD_CLK_PLL_F160M, /*!< Select PLL_F160M as the default choice */ } soc_periph_lcd_clk_src_t; +//////////////////////////////////////////////////LCD/////////////////////////////////////////////////////////////////// + +/** + * @brief Array initializer for all supported clock sources of CAM + */ +#define SOC_CAM_CLKS {SOC_MOD_CLK_PLL_F160M, SOC_MOD_CLK_PLL_D2, SOC_MOD_CLK_XTAL} + +/** + * @brief Type of CAM clock source + */ +typedef enum { + CAM_CLK_SRC_PLL160M = SOC_MOD_CLK_PLL_F160M, /*!< Select PLL_F160M as the source clock */ + CAM_CLK_SRC_PLL240M = SOC_MOD_CLK_PLL_D2, /*!< Select PLL_D2 as the source clock */ + CAM_CLK_SRC_XTAL = SOC_MOD_CLK_XTAL, /*!< Select XTAL as the source clock */ + CAM_CLK_SRC_DEFAULT = SOC_MOD_CLK_PLL_D2, /*!< Select PLL_D2 as the default choice */ +} soc_periph_cam_clk_src_t; + //////////////////////////////////////////////////RMT/////////////////////////////////////////////////////////////////// /** diff --git a/components/soc/esp32s3/include/soc/soc_caps.h b/components/soc/esp32s3/include/soc/soc_caps.h index d97e7538c98..1490160f220 100644 --- a/components/soc/esp32s3/include/soc/soc_caps.h +++ b/components/soc/esp32s3/include/soc/soc_caps.h @@ -32,6 +32,7 @@ #define SOC_AHB_GDMA_SUPPORTED 1 #define SOC_GPTIMER_SUPPORTED 1 #define SOC_LCDCAM_SUPPORTED 1 +#define SOC_LCDCAM_CAM_SUPPORTED 1 // support the camera driver based on the LCD_CAM peripheral #define SOC_LCDCAM_I80_LCD_SUPPORTED 1 #define SOC_LCDCAM_RGB_LCD_SUPPORTED 1 #define SOC_MCPWM_SUPPORTED 1 @@ -584,3 +585,8 @@ /*------------------------------------- PHY CAPS -------------------------------------*/ #define SOC_PHY_COMBO_MODULE (1) /*!< Support Wi-Fi and BLE*/ + +/*--------------------------- CAM ---------------------------------*/ +#define SOC_LCDCAM_CAM_SUPPORT_RGB_YUV_CONV (1) +#define SOC_LCDCAM_CAM_PERIPH_NUM (1U) +#define SOC_LCDCAM_CAM_DATA_WIDTH_MAX (16U) diff --git a/examples/bluetooth/nimble/ble_ancs/README.md b/examples/bluetooth/nimble/ble_ancs/README.md index d1d1b551bb4..2202b7f0a43 100644 --- a/examples/bluetooth/nimble/ble_ancs/README.md +++ b/examples/bluetooth/nimble/ble_ancs/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | --------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | # ESP-IDF NimBLE ANCS Example From caea2feae76de1717d6c94585531d9add9f2129e Mon Sep 17 00:00:00 2001 From: gongyantao Date: Mon, 7 Jul 2025 14:51:20 +0800 Subject: [PATCH 150/213] fix(bt): fixed the incorrect unit of clk in cpb rx event --- components/bt/controller/lib_esp32 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32 b/components/bt/controller/lib_esp32 index b0ebfcf639d..37e0472ea26 160000 --- a/components/bt/controller/lib_esp32 +++ b/components/bt/controller/lib_esp32 @@ -1 +1 @@ -Subproject commit b0ebfcf639d62e1d1926a9936e048405ebb48e7f +Subproject commit 37e0472ea26fa0870e5b704c451b5290069a28c3 From 041a0fa9ee86c8499b40a84defa9da524682e9f1 Mon Sep 17 00:00:00 2001 From: gaoxu Date: Tue, 10 Jun 2025 11:42:10 +0800 Subject: [PATCH 151/213] feat(cam): add dvp example for ESP32S3-EYE --- .../dvp/src/esp_cam_ctlr_dvp_gdma.c | 1 + examples/peripherals/.build-test-rules.yml | 11 + .../sensor_init/idf_component.yml | 2 +- .../camera/dvp_spi_lcd/CMakeLists.txt | 8 + .../peripherals/camera/dvp_spi_lcd/README.md | 139 +++++++++++ .../camera/dvp_spi_lcd/main/CMakeLists.txt | 4 + .../camera/dvp_spi_lcd/main/Kconfig.projbuild | 33 +++ .../dvp_spi_lcd/main/dvp_spi_lcd_main.c | 226 ++++++++++++++++++ .../camera/dvp_spi_lcd/main/example_config.h | 71 ++++++ .../camera/dvp_spi_lcd/main/idf_component.yml | 3 + .../camera/dvp_spi_lcd/pytest_dvp_spi_lcd.py | 11 + .../camera/dvp_spi_lcd/sdkconfig.defaults | 1 + .../dvp_spi_lcd/sdkconfig.defaults.esp32p4 | 2 + .../dvp_spi_lcd/sdkconfig.defaults.esp32s3 | 2 + 14 files changed, 513 insertions(+), 1 deletion(-) create mode 100644 examples/peripherals/camera/dvp_spi_lcd/CMakeLists.txt create mode 100644 examples/peripherals/camera/dvp_spi_lcd/README.md create mode 100644 examples/peripherals/camera/dvp_spi_lcd/main/CMakeLists.txt create mode 100644 examples/peripherals/camera/dvp_spi_lcd/main/Kconfig.projbuild create mode 100644 examples/peripherals/camera/dvp_spi_lcd/main/dvp_spi_lcd_main.c create mode 100644 examples/peripherals/camera/dvp_spi_lcd/main/example_config.h create mode 100644 examples/peripherals/camera/dvp_spi_lcd/main/idf_component.yml create mode 100644 examples/peripherals/camera/dvp_spi_lcd/pytest_dvp_spi_lcd.py create mode 100644 examples/peripherals/camera/dvp_spi_lcd/sdkconfig.defaults create mode 100644 examples/peripherals/camera/dvp_spi_lcd/sdkconfig.defaults.esp32p4 create mode 100644 examples/peripherals/camera/dvp_spi_lcd/sdkconfig.defaults.esp32s3 diff --git a/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_gdma.c b/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_gdma.c index f05eb255450..bfb386c5a20 100644 --- a/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_gdma.c +++ b/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_gdma.c @@ -117,6 +117,7 @@ esp_err_t esp_cam_ctlr_dvp_dma_init(esp_cam_ctlr_dvp_dma_t *dma, uint32_t burst_ ESP_LOGD(TAG, "alignment_size: %d, dma->desc_count: %d, dma->desc_size: %d", alignment_size, dma->desc_count, dma->desc_size); dma->desc = heap_caps_aligned_alloc(alignment_size, dma->desc_size, DVP_GDMA_DESC_ALLOC_CAPS); + ESP_GOTO_ON_FALSE(dma->desc, ESP_ERR_NO_MEM, fail1, TAG, "no mem for DVP DMA descriptor"); return ESP_OK; diff --git a/examples/peripherals/.build-test-rules.yml b/examples/peripherals/.build-test-rules.yml index d5b71903ae2..fb9144b95f1 100644 --- a/examples/peripherals/.build-test-rules.yml +++ b/examples/peripherals/.build-test-rules.yml @@ -46,6 +46,17 @@ examples/peripherals/camera/dvp_isp_dsi: - esp_lcd - esp_driver_cam +examples/peripherals/camera/dvp_spi_lcd: + disable: + - if: SOC_LCDCAM_CAM_SUPPORTED != 1 + disable_test: + - if: IDF_TARGET == "esp32s3" + temporary: true + reason: lack of runners + depends_components: + - esp_lcd + - esp_driver_cam + examples/peripherals/camera/mipi_isp_dsi: disable: - if: SOC_MIPI_CSI_SUPPORTED != 1 or SOC_MIPI_DSI_SUPPORTED != 1 diff --git a/examples/peripherals/camera/common_components/sensor_init/idf_component.yml b/examples/peripherals/camera/common_components/sensor_init/idf_component.yml index 1881aa5e995..a5d6718e182 100644 --- a/examples/peripherals/camera/common_components/sensor_init/idf_component.yml +++ b/examples/peripherals/camera/common_components/sensor_init/idf_component.yml @@ -1,4 +1,4 @@ dependencies: - espressif/esp_cam_sensor: "^0.6.1" + espressif/esp_cam_sensor: "^1.1.0" idf: version: ">=5.3.0" diff --git a/examples/peripherals/camera/dvp_spi_lcd/CMakeLists.txt b/examples/peripherals/camera/dvp_spi_lcd/CMakeLists.txt new file mode 100644 index 00000000000..87b02367486 --- /dev/null +++ b/examples/peripherals/camera/dvp_spi_lcd/CMakeLists.txt @@ -0,0 +1,8 @@ +# The following lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +idf_build_set_property(MINIMAL_BUILD ON) +project(dvp_spi_lcd) diff --git a/examples/peripherals/camera/dvp_spi_lcd/README.md b/examples/peripherals/camera/dvp_spi_lcd/README.md new file mode 100644 index 00000000000..6a69880dc21 --- /dev/null +++ b/examples/peripherals/camera/dvp_spi_lcd/README.md @@ -0,0 +1,139 @@ +| Supported Targets | ESP32-P4 | ESP32-S3 | +| ----------------- | -------- | -------- | + + +# DVP Camera display via LCD example + +## Overview + +This example demonstrates how to use the esp_driver_cam component to capture DVP camera sensor signals and display it via LCD interface. This example will auto-detect camera sensors via [ESP camera sensor driver](https://components.espressif.com/components/espressif/esp_cam_sensor) and capture camera sensor signals via DVP interface and display it via LCD interface. + +## Usage + +The subsections below give only absolutely necessary information. For full steps to configure ESP-IDF and use it to build and run projects, see [ESP-IDF Getting Started](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html#get-started). + + +### Hardware Required + +- ESP32S3 devkit with OV2640 camera sensor and ST7789 LCD screen +- or an ESP32S3-EYE dev-kit + +You can also connect camera sensors and LCD screens from other vendors to the ESP chip, you can find corresponding camera or LCD drivers from [ESP Component Registry](https://components.espressif.com), or design your own customized drivers. + + + GND GND + ┌────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────┐ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ ┌───────────────┴─────────────┴──────────────────┐ │ + │ │ │ ┌──────────┴───────────┐ + │ │ │ LCD MOSI │ │ + │ │ ├───────────────────────────┤ │ + ┌───────────┴─────────┐ │ │ │ │ + │ │ │ │ LCD CLK │ │ + │ │ │ ├───────────────────────────┤ │ + │ │ XCLK │ ESP_CHIP │ │ │ + │ DVP Camera ├──────────────────────┤ │ LCD CS │ LCD Screen │ + │ │ │ ├───────────────────────────┤ │ + │ │ D0~7 │ │ │ │ + │ ├──────────────────────┤ │ LCD DC │ │ + │ │ │ ├───────────────────────────┤ │ + │ │ PCLK │ │ │ │ + │ ├──────────────────────┤ │ LCD BACKLIGHT │ │ + │ │ │ ├───────────────────────────┤ │ + │ │ VSYNC │ │ │ │ + │ ├──────────────────────┤ │ │ │ + │ │ │ │ │ │ + │ │ DE (HREF) │ │ │ │ + │ ├──────────────────────┤ │ └──────────────────────┘ + │ │ │ │ + └───────┬──┬──────────┘ │ │ + │ │ I2C SCL │ │ + │ └─────────────────────────────────┤ │ + │ I2C SDA │ │ + └────────────────────────────────────┤ │ + └────────────────────────────────────────────────┘ + + +### Set Chip Target + +First of all, your target must be supported by both: + +- **By your ESP-IDF version**: For the full list of supported targets, run: + ``` + idf.py --list-targets + ``` +- **By this example**: For the full list of supported targets, refer to the supported targets table at the top of this README. + +After you make sure that your target is supported, go to your example project directory and [set the chip target](https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/tools/idf-py.html#select-the-target-chip-set-target): + +``` +idf.py set-target +``` + +For example, to set esp32-S3 as the chip target, run: + +``` +idf.py set-target esp32s3 +``` + + +### Configure the Project + +For information about Kconfig options, see [Project Configuration](https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/kconfig.html) > _Name of relevant section(s)_. + +To conveniently check or modify Kconfig options for this example in a project configuration menu, run: + +``` +idf.py menuconfig +``` + +``` +Set CONFIG_CAMERA_OV2640 to y +``` + +Available options for the camera sensor output horizontal/vertical resolution can be seen in ``menuconfig`` > ``Example Configuration``. + + +### Build and Flash + +Execute the following command to build the project, flash it to your development board, and run the monitor tool to view the serial output: + +``` +idf.py build flash monitor +``` + +This command can be reduced to `idf.py flash monitor`. + +If the above command fails, check the log on the serial monitor which usually provides information on the possible cause of the issue. + +To exit the serial monitor, use `Ctrl` + `]`. + + +## Example Output + +If you see the following console output, your example should be running correctly: + +``` +I (1481) main_task: Calling app_main() +I (278) dvp_spi_lcd: Init SPI bus +I (278) dvp_spi_lcd: New panel IO SPI +I (278) dvp_spi_lcd: New ST7789 panel +I (278) dvp_spi_lcd: Reset and init panel +I (408) dvp_spi_lcd: Turn on display +I (408) dvp_spi_lcd: Screen lit up now! + +``` + + +## Reference + +- Link to the ESP-IDF feature's API reference, for example [ESP-IDF: Camera Controller Driver](https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/camera_driver.html) +- [ESP-IDF Getting Started](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html#get-started) +- [Project Configuration](https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/kconfig.html) (Kconfig Options) diff --git a/examples/peripherals/camera/dvp_spi_lcd/main/CMakeLists.txt b/examples/peripherals/camera/dvp_spi_lcd/main/CMakeLists.txt new file mode 100644 index 00000000000..e863a9baee1 --- /dev/null +++ b/examples/peripherals/camera/dvp_spi_lcd/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "dvp_spi_lcd_main.c" + INCLUDE_DIRS "." + REQUIRES esp_mm esp_driver_cam esp_driver_i2c esp_lcd sensor_init + ) diff --git a/examples/peripherals/camera/dvp_spi_lcd/main/Kconfig.projbuild b/examples/peripherals/camera/dvp_spi_lcd/main/Kconfig.projbuild new file mode 100644 index 00000000000..d44ca3210ba --- /dev/null +++ b/examples/peripherals/camera/dvp_spi_lcd/main/Kconfig.projbuild @@ -0,0 +1,33 @@ +menu "Example Configuration" + + choice EXAMPLE_CAM_HRES + bool "Set camera horizontal resolution" + default EXAMPLE_CAM_HRES_240 + + config EXAMPLE_CAM_HRES_640 + bool "640" + config EXAMPLE_CAM_HRES_240 + bool "240" + endchoice + + config EXAMPLE_CAM_HRES + int + default 640 if EXAMPLE_CAM_HRES_640 + default 240 if EXAMPLE_CAM_HRES_240 + + choice EXAMPLE_CAM_VRES + bool "Set camera vertical resolution" + default EXAMPLE_CAM_VRES_480 if EXAMPLE_CAM_HRES_640 + default EXAMPLE_CAM_VRES_240 if EXAMPLE_CAM_HRES_240 + + config EXAMPLE_CAM_VRES_480 + bool "480" + config EXAMPLE_CAM_VRES_240 + bool "240" + endchoice + + config EXAMPLE_CAM_VRES + int + default 480 if EXAMPLE_CAM_VRES_480 + default 240 if EXAMPLE_CAM_VRES_240 +endmenu diff --git a/examples/peripherals/camera/dvp_spi_lcd/main/dvp_spi_lcd_main.c b/examples/peripherals/camera/dvp_spi_lcd/main/dvp_spi_lcd_main.c new file mode 100644 index 00000000000..ef57a1a2e7c --- /dev/null +++ b/examples/peripherals/camera/dvp_spi_lcd/main/dvp_spi_lcd_main.c @@ -0,0 +1,226 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include +#include "sdkconfig.h" +#include "esp_attr.h" +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "esp_lcd_panel_ops.h" +#include "esp_cache.h" +#include "driver/i2c_master.h" +#include "esp_cam_ctlr.h" +#include "esp_cam_ctlr_dvp.h" +#include "example_config.h" +#include "driver/ledc.h" +#include "esp_lcd_panel_io.h" +#include "esp_lcd_panel_vendor.h" +#include "esp_lcd_panel_ops.h" +#include "example_sensor_init.h" + +static const char *TAG = "dvp_spi_lcd"; + +#define BUFFER_SIZE (CONFIG_EXAMPLE_CAM_HRES * CONFIG_EXAMPLE_CAM_VRES * EXAMPLE_RGB565_BITS_PER_PIXEL / 8) + +typedef struct { + esp_lcd_panel_handle_t panel_hdl; + esp_cam_ctlr_trans_t cam_trans; +} example_cam_context_t; + +static bool s_camera_get_new_vb(esp_cam_ctlr_handle_t handle, esp_cam_ctlr_trans_t *trans, void *user_data); +static bool s_camera_get_finished_trans(esp_cam_ctlr_handle_t handle, esp_cam_ctlr_trans_t *trans, void *user_data); + +static void lcd_display_init(esp_lcd_panel_handle_t *lcd_panel_hdl, esp_lcd_panel_io_handle_t lcd_io_hdl) +{ + esp_lcd_panel_handle_t panel_handle = NULL; + //----------LEDC initialization------------// + const ledc_timer_config_t lcd_timer = { + .speed_mode = LEDC_LOW_SPEED_MODE, + .duty_resolution = LEDC_TIMER_10_BIT, + .timer_num = EXAMPLE_LEDC_LCD_BACKLIGHT, + .freq_hz = 5000, + .clk_cfg = LEDC_AUTO_CLK + }; + ESP_ERROR_CHECK(ledc_timer_config(&lcd_timer)); + const ledc_channel_config_t lcd_channel = { + .gpio_num = EXAMPLE_LCD_BACKLIGHT, + .speed_mode = LEDC_LOW_SPEED_MODE, + .channel = LEDC_CHANNEL_0, + .timer_sel = EXAMPLE_LEDC_LCD_BACKLIGHT, + .intr_type = LEDC_INTR_DISABLE, + .duty = 0, + .hpoint = 0, + .flags.output_invert = true, + }; + ESP_ERROR_CHECK(ledc_channel_config(&lcd_channel)); + + //----------SPI initialization------------// + ESP_LOGI(TAG, "Init SPI bus"); + const spi_bus_config_t bus_cfg = { + .sclk_io_num = EXAMPLE_LCD_SPI_CLK, + .mosi_io_num = EXAMPLE_LCD_SPI_MOSI, + .miso_io_num = GPIO_NUM_NC, + .quadwp_io_num = GPIO_NUM_NC, + .quadhd_io_num = GPIO_NUM_NC, + .max_transfer_sz = BUFFER_SIZE, + }; + ESP_ERROR_CHECK(spi_bus_initialize(EXAMPLE_LCD_SPI_NUM, &bus_cfg, SPI_DMA_CH_AUTO)); + + //----------Panel IO initialization------------// + ESP_LOGI(TAG, "New panel IO SPI"); + const esp_lcd_panel_io_spi_config_t io_cfg = { + .dc_gpio_num = EXAMPLE_LCD_DC, + .cs_gpio_num = EXAMPLE_LCD_SPI_CS, + .pclk_hz = EXAMPLE_LCD_PIXEL_CLOCK_HZ, + .lcd_cmd_bits = EXAMPLE_LCD_CMD_BITS, + .lcd_param_bits = EXAMPLE_LCD_PARAM_BITS, + .spi_mode = 2, + .trans_queue_depth = 10, + }; + ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi( + (esp_lcd_spi_bus_handle_t)EXAMPLE_LCD_SPI_NUM, + &io_cfg, + &lcd_io_hdl + )); + + //----------ST7789 Panel initialization------------// + ESP_LOGI(TAG, "New ST7789 panel"); + const esp_lcd_panel_dev_config_t panel_dev_cfg = { + .reset_gpio_num = EXAMPLE_LCD_RST, + .color_space = ESP_LCD_COLOR_SPACE_RGB, + .bits_per_pixel = EXAMPLE_RGB565_BITS_PER_PIXEL, + }; + ESP_ERROR_CHECK(esp_lcd_new_panel_st7789(lcd_io_hdl, &panel_dev_cfg, &panel_handle)); + + ESP_LOGI(TAG, "Reset and init panel"); + esp_lcd_panel_reset(panel_handle); + esp_lcd_panel_init(panel_handle); + esp_lcd_panel_invert_color(panel_handle, true); + + ESP_LOGI(TAG, "Turn on display"); + esp_lcd_panel_disp_on_off(panel_handle, true); + + const int brightness = 100; + uint32_t duty = (1023 * brightness) / 100; + ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, duty)); + ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0)); + + *lcd_panel_hdl = panel_handle; +} + +void app_main(void) +{ + esp_err_t ret = ESP_FAIL; + + esp_lcd_panel_handle_t lcd_panel_hdl = NULL; + esp_lcd_panel_io_handle_t lcd_io_hdl = NULL; + + size_t cam_buffer_size = CONFIG_EXAMPLE_CAM_HRES * CONFIG_EXAMPLE_CAM_VRES * EXAMPLE_RGB565_BITS_PER_PIXEL / 8; + void *cam_buffer = heap_caps_malloc(cam_buffer_size, EXAMPLE_DVP_CAM_BUF_ALLOC_CAPS); + if (!cam_buffer) { + ESP_LOGE(TAG, "no mem for cam_buffer"); + return; + } + + lcd_display_init(&lcd_panel_hdl, lcd_io_hdl); + + //----------CAM Controller Init------------// + esp_cam_ctlr_handle_t cam_handle = NULL; + esp_cam_ctlr_dvp_pin_config_t pin_cfg = { + .data_width = EXAMPLE_DVP_CAM_DATA_WIDTH, + .data_io = { + EXAMPLE_DVP_CAM_D0_IO, + EXAMPLE_DVP_CAM_D1_IO, + EXAMPLE_DVP_CAM_D2_IO, + EXAMPLE_DVP_CAM_D3_IO, + EXAMPLE_DVP_CAM_D4_IO, + EXAMPLE_DVP_CAM_D5_IO, + EXAMPLE_DVP_CAM_D6_IO, + EXAMPLE_DVP_CAM_D7_IO, + }, + .vsync_io = EXAMPLE_DVP_CAM_VSYNC_IO, + .de_io = EXAMPLE_DVP_CAM_DE_IO, + .pclk_io = EXAMPLE_DVP_CAM_PCLK_IO, + .xclk_io = EXAMPLE_DVP_CAM_XCLK_IO, + }; + + esp_cam_ctlr_dvp_config_t dvp_config = { + .ctlr_id = 0, + .clk_src = CAM_CLK_SRC_DEFAULT, + .h_res = CONFIG_EXAMPLE_CAM_HRES, + .v_res = CONFIG_EXAMPLE_CAM_VRES, + .input_data_color_type = CAM_CTLR_COLOR_RGB565, + .dma_burst_size = 64, + .pin = &pin_cfg, + .bk_buffer_dis = 1, + .xclk_freq = EXAMPLE_DVP_CAM_XCLK_FREQ_HZ, + }; + + ret = esp_cam_new_dvp_ctlr(&dvp_config, &cam_handle); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "dvp init fail[%d]", ret); + return; + } + + //--------Camera Sensor and SCCB Init-----------// + example_sensor_config_t cam_sensor_config = { + .i2c_port_num = I2C_NUM_0, + .i2c_sda_io_num = EXAMPLE_DVP_CAM_SCCB_SDA_IO, + .i2c_scl_io_num = EXAMPLE_DVP_CAM_SCCB_SCL_IO, + .port = ESP_CAM_SENSOR_DVP, + .format_name = EXAMPLE_CAM_FORMAT, + }; + example_sensor_handle_t sensor_handle = { + .sccb_handle = NULL, + .i2c_bus_handle = NULL, + }; + example_sensor_init(&cam_sensor_config, &sensor_handle); + + //--------Register Camera Callbacks----------// + example_cam_context_t cam_ctx = { + .panel_hdl = lcd_panel_hdl, + .cam_trans = { + .buffer = cam_buffer, + .buflen = cam_buffer_size, + } + }; + + esp_cam_ctlr_evt_cbs_t cbs = { + .on_get_new_trans = s_camera_get_new_vb, + .on_trans_finished = s_camera_get_finished_trans, + }; + if (esp_cam_ctlr_register_event_callbacks(cam_handle, &cbs, &cam_ctx) != ESP_OK) { + ESP_LOGE(TAG, "ops register fail"); + return; + } + + //--------Enable and start Camera Controller----------// + ESP_ERROR_CHECK(esp_cam_ctlr_enable(cam_handle)); + + if (esp_cam_ctlr_start(cam_handle) != ESP_OK) { + ESP_LOGE(TAG, "Driver start fail"); + return; + } + + while (1) { + vTaskDelay(1000 / portTICK_PERIOD_MS); + } +} + +static bool s_camera_get_new_vb(esp_cam_ctlr_handle_t handle, esp_cam_ctlr_trans_t *trans, void *user_data) +{ + example_cam_context_t *ctx = (example_cam_context_t *)user_data; + *trans = ctx->cam_trans; + return false; +} + +static bool s_camera_get_finished_trans(esp_cam_ctlr_handle_t handle, esp_cam_ctlr_trans_t *trans, void *user_data) +{ + example_cam_context_t *ctx = (example_cam_context_t *)user_data; + esp_lcd_panel_draw_bitmap(ctx->panel_hdl, 0, 0, CONFIG_EXAMPLE_CAM_HRES, CONFIG_EXAMPLE_CAM_VRES, trans->buffer); + return false; +} diff --git a/examples/peripherals/camera/dvp_spi_lcd/main/example_config.h b/examples/peripherals/camera/dvp_spi_lcd/main/example_config.h new file mode 100644 index 00000000000..2925ac9542f --- /dev/null +++ b/examples/peripherals/camera/dvp_spi_lcd/main/example_config.h @@ -0,0 +1,71 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include "sdkconfig.h" + +#ifdef __cplusplus +extern "C" { +#endif + +//----------CAM Config------------// +#define EXAMPLE_RGB565_BITS_PER_PIXEL 16 + +#define EXAMPLE_DVP_CAM_SCCB_SCL_IO (5) +#define EXAMPLE_DVP_CAM_SCCB_SDA_IO (4) + +#define EXAMPLE_DVP_CAM_XCLK_FREQ_HZ (20000000) + +#define EXAMPLE_DVP_CAM_DATA_WIDTH (8) + +#define EXAMPLE_DVP_CAM_D0_IO (11) +#define EXAMPLE_DVP_CAM_D1_IO (9) +#define EXAMPLE_DVP_CAM_D2_IO (8) +#define EXAMPLE_DVP_CAM_D3_IO (10) +#define EXAMPLE_DVP_CAM_D4_IO (12) +#define EXAMPLE_DVP_CAM_D5_IO (18) +#define EXAMPLE_DVP_CAM_D6_IO (17) +#define EXAMPLE_DVP_CAM_D7_IO (16) + +#define EXAMPLE_DVP_CAM_XCLK_IO (15) +#define EXAMPLE_DVP_CAM_PCLK_IO (13) +#define EXAMPLE_DVP_CAM_DE_IO (7) +#define EXAMPLE_DVP_CAM_VSYNC_IO (6) +#define EXAMPLE_DVP_CAM_HSYNC_IO (-1) + +#if CONFIG_SPIRAM +#define EXAMPLE_DVP_CAM_BUF_ALLOC_CAPS (MALLOC_CAP_SPIRAM | MALLOC_CAP_DMA) +#else +#define EXAMPLE_DVP_CAM_BUF_ALLOC_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA) +#endif + +#define EXAMPLE_CAM_FORMAT "DVP_8bit_20Minput_RGB565_240x240_25fps" // ov2640 + +#ifndef EXAMPLE_CAM_FORMAT +#error "Unsupported camera format! Please adjust EXAMPLE_CAM_HRES and EXAMPLE_CAM_VRES in menuconfig" +#endif + +//----------LCD Config------------// +#define EXAMPLE_LEDC_DVP_XCLK (LEDC_TIMER_0) +#define EXAMPLE_LEDC_LCD_BACKLIGHT (LEDC_TIMER_1) +#define EXAMPLE_LCD_SPI_NUM (SPI3_HOST) +#define EXAMPLE_LCD_CMD_BITS (8) +#define EXAMPLE_LCD_PARAM_BITS (8) + +/* LCD Display */ +#define EXAMPLE_LCD_SPI_MOSI (GPIO_NUM_47) +#define EXAMPLE_LCD_SPI_CLK (GPIO_NUM_21) +#define EXAMPLE_LCD_SPI_CS (GPIO_NUM_44) +#define EXAMPLE_LCD_DC (GPIO_NUM_43) +#define EXAMPLE_LCD_RST (GPIO_NUM_NC) +#define EXAMPLE_LCD_BACKLIGHT (GPIO_NUM_48) + +#define EXAMPLE_LCD_PIXEL_CLOCK_HZ (80 * 1000 * 1000) + +#ifdef __cplusplus +} +#endif diff --git a/examples/peripherals/camera/dvp_spi_lcd/main/idf_component.yml b/examples/peripherals/camera/dvp_spi_lcd/main/idf_component.yml new file mode 100644 index 00000000000..4cd68977191 --- /dev/null +++ b/examples/peripherals/camera/dvp_spi_lcd/main/idf_component.yml @@ -0,0 +1,3 @@ +dependencies: + sensor_init: + path: ${IDF_PATH}/examples/peripherals/camera/common_components/sensor_init diff --git a/examples/peripherals/camera/dvp_spi_lcd/pytest_dvp_spi_lcd.py b/examples/peripherals/camera/dvp_spi_lcd/pytest_dvp_spi_lcd.py new file mode 100644 index 00000000000..7dfd614f40b --- /dev/null +++ b/examples/peripherals/camera/dvp_spi_lcd/pytest_dvp_spi_lcd.py @@ -0,0 +1,11 @@ +# SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 +import pytest +from pytest_embedded import Dut +from pytest_embedded_idf.utils import idf_parametrize + + +@pytest.mark.generic +@idf_parametrize('target', ['esp32p4'], indirect=['target']) +def test_dvp_spi_lcd_p4(dut: Dut) -> None: + dut.expect_exact('Calling app_main()') diff --git a/examples/peripherals/camera/dvp_spi_lcd/sdkconfig.defaults b/examples/peripherals/camera/dvp_spi_lcd/sdkconfig.defaults new file mode 100644 index 00000000000..dc0f8f7a839 --- /dev/null +++ b/examples/peripherals/camera/dvp_spi_lcd/sdkconfig.defaults @@ -0,0 +1 @@ +CONFIG_CAMERA_OV2640=y diff --git a/examples/peripherals/camera/dvp_spi_lcd/sdkconfig.defaults.esp32p4 b/examples/peripherals/camera/dvp_spi_lcd/sdkconfig.defaults.esp32p4 new file mode 100644 index 00000000000..c15bfde7e87 --- /dev/null +++ b/examples/peripherals/camera/dvp_spi_lcd/sdkconfig.defaults.esp32p4 @@ -0,0 +1,2 @@ +CONFIG_SPIRAM_SPEED_200M=y +CONFIG_SPIRAM=y diff --git a/examples/peripherals/camera/dvp_spi_lcd/sdkconfig.defaults.esp32s3 b/examples/peripherals/camera/dvp_spi_lcd/sdkconfig.defaults.esp32s3 new file mode 100644 index 00000000000..38bbb5933ed --- /dev/null +++ b/examples/peripherals/camera/dvp_spi_lcd/sdkconfig.defaults.esp32s3 @@ -0,0 +1,2 @@ +CONFIG_SPIRAM=y +CONFIG_SPIRAM_MODE_OCT=y From e8ff923342958035229a71100d3dcc00acf771b9 Mon Sep 17 00:00:00 2001 From: gaoxu Date: Fri, 13 Jun 2025 18:20:28 +0800 Subject: [PATCH 152/213] fix(cam): fix camera kconfig about dw_gdma --- components/esp_driver_cam/Kconfig | 3 ++- .../esp_driver_cam/test_apps/dvp/sdkconfig.ci.cache_safe | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/components/esp_driver_cam/Kconfig b/components/esp_driver_cam/Kconfig index e162894c33b..378c1d33daf 100644 --- a/components/esp_driver_cam/Kconfig +++ b/components/esp_driver_cam/Kconfig @@ -1,6 +1,6 @@ menu "ESP-Driver:Camera Controller Configurations" - depends on SOC_MIPI_CSI_SUPPORTED || SOC_LCDCAM_CAM_SUPPORTED + depends on SOC_MIPI_CSI_SUPPORTED || SOC_ISP_DVP_SUPPORTED || SOC_LCDCAM_CAM_SUPPORTED config CAM_CTLR_MIPI_CSI_ISR_CACHE_SAFE bool "CSI ISR Cache-Safe" @@ -16,6 +16,7 @@ menu "ESP-Driver:Camera Controller Configurations" config CAM_CTLR_ISP_DVP_ISR_CACHE_SAFE # IDF-10093 bool "ISP_DVP ISR Cache-Safe" + depends on SOC_ISP_DVP_SUPPORTED default n select DW_GDMA_ISR_IRAM_SAFE select DW_GDMA_CTRL_FUNC_IN_IRAM diff --git a/components/esp_driver_cam/test_apps/dvp/sdkconfig.ci.cache_safe b/components/esp_driver_cam/test_apps/dvp/sdkconfig.ci.cache_safe index 6a7ded982f3..97180e808b1 100644 --- a/components/esp_driver_cam/test_apps/dvp/sdkconfig.ci.cache_safe +++ b/components/esp_driver_cam/test_apps/dvp/sdkconfig.ci.cache_safe @@ -1 +1,7 @@ -CONFIG_CAM_CTLR_MIPI_CSI_ISR_CACHE_SAFE=y +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +# silent the error check, as the error string are stored in rodata, causing RTL check failure +CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT=y +CONFIG_HAL_ASSERTION_SILENT=y + +CONFIG_CAM_CTLR_DVP_CAM_ISR_CACHE_SAFE=y From 9a2997e25cd73aa2126f51cd1b826b340cce433b Mon Sep 17 00:00:00 2001 From: gaoxu Date: Mon, 7 Jul 2025 14:28:31 +0800 Subject: [PATCH 153/213] feat(lcd_cam): add lc_dma_int value atomic protect for lcd and cam --- components/esp_lcd/i80/esp_lcd_panel_io_i80.c | 10 +++++++--- components/esp_lcd/rgb/esp_lcd_panel_rgb.c | 10 +++++++--- components/hal/esp32p4/include/hal/cam_ll.h | 8 +++++++- components/hal/esp32p4/include/hal/lcd_ll.h | 8 +++++++- components/hal/esp32s3/include/hal/cam_ll.h | 6 ++++++ components/hal/esp32s3/include/hal/lcd_ll.h | 8 +++++++- 6 files changed, 41 insertions(+), 9 deletions(-) diff --git a/components/esp_lcd/i80/esp_lcd_panel_io_i80.c b/components/esp_lcd/i80/esp_lcd_panel_io_i80.c index 0f96148c3cd..ee392c602c3 100644 --- a/components/esp_lcd/i80/esp_lcd_panel_io_i80.c +++ b/components/esp_lcd/i80/esp_lcd_panel_io_i80.c @@ -197,7 +197,9 @@ esp_err_t esp_lcd_new_i80_bus(const esp_lcd_i80_bus_config_t *bus_config, esp_lc (uint32_t)lcd_ll_get_interrupt_status_reg(bus->hal.dev), LCD_LL_EVENT_TRANS_DONE, i80_lcd_default_isr_handler, bus, &bus->intr); ESP_GOTO_ON_ERROR(ret, err, TAG, "install interrupt failed"); - lcd_ll_enable_interrupt(bus->hal.dev, LCD_LL_EVENT_TRANS_DONE, false); // disable all interrupts + PERIPH_RCC_ATOMIC() { + lcd_ll_enable_interrupt(bus->hal.dev, LCD_LL_EVENT_TRANS_DONE, false); // disable all interrupts + } lcd_ll_clear_interrupt_status(bus->hal.dev, UINT32_MAX); // clear pending interrupt // install DMA service bus->max_transfer_bytes = bus_config->max_transfer_bytes; @@ -213,8 +215,10 @@ esp_err_t esp_lcd_new_i80_bus(const esp_lcd_i80_bus_config_t *bus_config, esp_lc lcd_ll_set_swizzle_mode(bus->hal.dev, LCD_LL_SWIZZLE_AB2BA); // number of data cycles is controlled by DMA buffer size lcd_ll_enable_output_always_on(bus->hal.dev, true); - // enable trans done interrupt - lcd_ll_enable_interrupt(bus->hal.dev, LCD_LL_EVENT_TRANS_DONE, true); + PERIPH_RCC_ATOMIC() { + // enable trans done interrupt + lcd_ll_enable_interrupt(bus->hal.dev, LCD_LL_EVENT_TRANS_DONE, true); + } // trigger a quick "trans done" event, and wait for the interrupt line goes active // this could ensure we go into ISR handler next time we call `esp_intr_enable` lcd_periph_trigger_quick_trans_done_event(bus); diff --git a/components/esp_lcd/rgb/esp_lcd_panel_rgb.c b/components/esp_lcd/rgb/esp_lcd_panel_rgb.c index 72df1e8266d..cf639f89fb8 100644 --- a/components/esp_lcd/rgb/esp_lcd_panel_rgb.c +++ b/components/esp_lcd/rgb/esp_lcd_panel_rgb.c @@ -332,7 +332,9 @@ esp_err_t esp_lcd_new_rgb_panel(const esp_lcd_rgb_panel_config_t *rgb_panel_conf (uint32_t)lcd_ll_get_interrupt_status_reg(rgb_panel->hal.dev), LCD_LL_EVENT_VSYNC_END, rgb_lcd_default_isr_handler, rgb_panel, &rgb_panel->intr); ESP_GOTO_ON_ERROR(ret, err, TAG, "install interrupt failed"); - lcd_ll_enable_interrupt(rgb_panel->hal.dev, LCD_LL_EVENT_VSYNC_END, false); // disable all interrupts + PERIPH_RCC_ATOMIC() { + lcd_ll_enable_interrupt(rgb_panel->hal.dev, LCD_LL_EVENT_VSYNC_END, false); // disable all interrupts + } lcd_ll_clear_interrupt_status(rgb_panel->hal.dev, UINT32_MAX); // clear pending interrupt // install DMA service @@ -569,8 +571,10 @@ static esp_err_t rgb_panel_init(esp_lcd_panel_t *panel) // in stream mode, after finish one frame, the LCD controller will ask for data automatically from the DMA // DMA should prepare the next frame data within porch region lcd_ll_enable_auto_next_frame(rgb_panel->hal.dev, rgb_panel->flags.stream_mode); - // trigger interrupt on the end of frame - lcd_ll_enable_interrupt(rgb_panel->hal.dev, LCD_LL_EVENT_VSYNC_END, true); + PERIPH_RCC_ATOMIC() { + // trigger interrupt on the end of frame + lcd_ll_enable_interrupt(rgb_panel->hal.dev, LCD_LL_EVENT_VSYNC_END, true); + } // enable intr esp_intr_enable(rgb_panel->intr); // start transmission diff --git a/components/hal/esp32p4/include/hal/cam_ll.h b/components/hal/esp32p4/include/hal/cam_ll.h index a48dba2dc83..6c7467023e4 100644 --- a/components/hal/esp32p4/include/hal/cam_ll.h +++ b/components/hal/esp32p4/include/hal/cam_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -593,6 +593,12 @@ static inline void cam_ll_enable_interrupt(lcd_cam_dev_t *dev, uint32_t mask, bo dev->lc_dma_int_ena.val &= ~(mask & 0x0c); } } +/// use a macro to wrap the function, force the caller to use it in a critical section +/// the critical section needs to declare the __DECLARE_RCC_ATOMIC_ENV variable in advance +#define cam_ll_enable_interrupt(...) do { \ + (void)__DECLARE_RCC_ATOMIC_ENV; \ + cam_ll_enable_interrupt(__VA_ARGS__); \ + } while(0) /** * @brief Get interrupt status value diff --git a/components/hal/esp32p4/include/hal/lcd_ll.h b/components/hal/esp32p4/include/hal/lcd_ll.h index 7c67bbadefc..416e93b5202 100644 --- a/components/hal/esp32p4/include/hal/lcd_ll.h +++ b/components/hal/esp32p4/include/hal/lcd_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -726,6 +726,12 @@ static inline void lcd_ll_enable_interrupt(lcd_cam_dev_t *dev, uint32_t mask, bo dev->lc_dma_int_ena.val &= ~(mask & 0x03); } } +/// use a macro to wrap the function, force the caller to use it in a critical section +/// the critical section needs to declare the __DECLARE_RCC_ATOMIC_ENV variable in advance +#define lcd_ll_enable_interrupt(...) do { \ + (void)__DECLARE_RCC_ATOMIC_ENV; \ + lcd_ll_enable_interrupt(__VA_ARGS__); \ + } while(0) /** * @brief Get interrupt status value diff --git a/components/hal/esp32s3/include/hal/cam_ll.h b/components/hal/esp32s3/include/hal/cam_ll.h index 2556b004bc5..28b151fa92d 100644 --- a/components/hal/esp32s3/include/hal/cam_ll.h +++ b/components/hal/esp32s3/include/hal/cam_ll.h @@ -574,6 +574,12 @@ static inline void cam_ll_enable_interrupt(lcd_cam_dev_t *dev, uint32_t mask, bo dev->lc_dma_int_ena.val &= ~(mask & 0x0c); } } +/// use a macro to wrap the function, force the caller to use it in a critical section +/// the critical section needs to declare the __DECLARE_RCC_ATOMIC_ENV variable in advance +#define cam_ll_enable_interrupt(...) do { \ + (void)__DECLARE_RCC_ATOMIC_ENV; \ + cam_ll_enable_interrupt(__VA_ARGS__); \ + } while(0) /** * @brief Get interrupt status value diff --git a/components/hal/esp32s3/include/hal/lcd_ll.h b/components/hal/esp32s3/include/hal/lcd_ll.h index 8ef0a32626d..644cbb7825b 100644 --- a/components/hal/esp32s3/include/hal/lcd_ll.h +++ b/components/hal/esp32s3/include/hal/lcd_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -709,6 +709,12 @@ static inline void lcd_ll_enable_interrupt(lcd_cam_dev_t *dev, uint32_t mask, bo dev->lc_dma_int_ena.val &= ~(mask & 0x03); } } +/// use a macro to wrap the function, force the caller to use it in a critical section +/// the critical section needs to declare the __DECLARE_RCC_ATOMIC_ENV variable in advance +#define lcd_ll_enable_interrupt(...) do { \ + (void)__DECLARE_RCC_ATOMIC_ENV; \ + lcd_ll_enable_interrupt(__VA_ARGS__); \ + } while(0) /** * @brief Get interrupt status value From c3518d33a21233b211bd2264f329b40c9b032c74 Mon Sep 17 00:00:00 2001 From: gaoxu Date: Mon, 7 Jul 2025 14:29:01 +0800 Subject: [PATCH 154/213] feat(cam): add camera buffer alloc function --- .../esp_driver_cam/csi/src/esp_cam_ctlr_csi.c | 24 ++++++++++- .../private_include/esp_cam_ctlr_dvp_dma.h | 2 + .../dvp/src/esp_cam_ctlr_dvp_cam.c | 42 +++++++++++++++++++ .../dvp/src/esp_cam_ctlr_dvp_gdma.c | 5 +-- components/esp_driver_cam/esp_cam_ctlr.c | 10 ++++- .../esp_driver_cam/include/esp_cam_ctlr.h | 20 ++++++++- .../interface/esp_cam_ctlr_interface.h | 15 ++++++- .../isp_dvp/src/esp_cam_ctlr_isp_dvp.c | 24 ++++++++++- .../peripherals/camera_driver.rst | 2 + .../peripherals/camera_driver.rst | 2 + .../camera/dvp_dsi/main/dvp_dsi_main.c | 23 +++++----- .../dvp_isp_dsi/main/dvp_isp_dsi_main.c | 23 +++++----- .../dvp_spi_lcd/main/dvp_spi_lcd_main.c | 13 +++--- 13 files changed, 168 insertions(+), 37 deletions(-) diff --git a/components/esp_driver_cam/csi/src/esp_cam_ctlr_csi.c b/components/esp_driver_cam/csi/src/esp_cam_ctlr_csi.c index 3f6c2b56d44..6491fe44069 100644 --- a/components/esp_driver_cam/csi/src/esp_cam_ctlr_csi.c +++ b/components/esp_driver_cam/csi/src/esp_cam_ctlr_csi.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -51,6 +51,7 @@ static esp_err_t s_ctlr_csi_start(esp_cam_ctlr_handle_t handle); static esp_err_t s_ctlr_csi_stop(esp_cam_ctlr_handle_t handle); static esp_err_t s_csi_ctlr_disable(esp_cam_ctlr_handle_t ctlr); static esp_err_t s_ctlr_csi_receive(esp_cam_ctlr_handle_t handle, esp_cam_ctlr_trans_t *trans, uint32_t timeout_ms); +static void *s_csi_ctlr_alloc_buffer(esp_cam_ctlr_t *handle, size_t size, uint32_t buf_caps); static esp_err_t s_csi_claim_controller(csi_controller_t *controller) { @@ -221,6 +222,7 @@ esp_err_t esp_cam_new_csi_ctlr(const esp_cam_ctlr_csi_config_t *config, esp_cam_ ctlr->base.register_event_callbacks = s_register_event_callbacks; ctlr->base.get_internal_buffer = s_csi_ctlr_get_internal_buffer; ctlr->base.get_buffer_len = s_csi_ctlr_get_buffer_length; + ctlr->base.alloc_buffer = s_csi_ctlr_alloc_buffer; *ret_handle = &(ctlr->base); @@ -518,3 +520,23 @@ esp_err_t s_ctlr_csi_receive(esp_cam_ctlr_handle_t handle, esp_cam_ctlr_trans_t return ESP_OK; } + +static void *s_csi_ctlr_alloc_buffer(esp_cam_ctlr_t *handle, size_t size, uint32_t buf_caps) +{ + csi_controller_t *ctlr = __containerof(handle, csi_controller_t, base); + + if (!ctlr) { + ESP_LOGE(TAG, "invalid argument: handle is null"); + return NULL; + } + + void *buffer = heap_caps_calloc(1, size, buf_caps); + if (!buffer) { + ESP_LOGE(TAG, "failed to allocate buffer"); + return NULL; + } + + ESP_LOGD(TAG, "Allocated camera buffer: %p, size: %zu", buffer, size); + + return buffer; +} diff --git a/components/esp_driver_cam/dvp/private_include/esp_cam_ctlr_dvp_dma.h b/components/esp_driver_cam/dvp/private_include/esp_cam_ctlr_dvp_dma.h index 0846d6ccd66..1a61d261042 100644 --- a/components/esp_driver_cam/dvp/private_include/esp_cam_ctlr_dvp_dma.h +++ b/components/esp_driver_cam/dvp/private_include/esp_cam_ctlr_dvp_dma.h @@ -29,6 +29,8 @@ typedef struct esp_cam_ctlr_dvp_dma { esp_cam_ctlr_dvp_dma_desc_t *desc; /*!< DVP DMA description buffer */ size_t desc_count; /*!< DVP DMA description count */ size_t desc_size; /*!< DVP DMA description buffer size in byte */ + size_t int_mem_align; /*!< DVP DMA internal memory alignment */ + size_t ext_mem_align; /*!< DVP DMA external memory alignment */ } esp_cam_ctlr_dvp_dma_t; /** diff --git a/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c b/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c index 5836ccb7d6e..9eb7fa10743 100644 --- a/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c +++ b/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c @@ -683,6 +683,47 @@ static esp_err_t esp_cam_ctlr_get_dvp_cam_frame_buffer_len(esp_cam_ctlr_handle_t return ret; } +/** + * @brief Allocate aligned camera buffer for ESP CAM DVP controller + * + * @note This function must be called after esp_cam_new_dvp_ctlr + * + * @param handle ESP CAM controller handle + * @param size Buffer size in bytes + * @param buf_caps Buffer allocation capabilities (e.g., MALLOC_CAP_SPIRAM | MALLOC_CAP_DMA) + * + * @return + * - Buffer pointer on success + * - NULL on failure + */ +static void *esp_cam_ctlr_dvp_cam_alloc_buffer(esp_cam_ctlr_t *handle, size_t size, uint32_t buf_caps) +{ + esp_cam_ctlr_dvp_cam_t *ctlr = (esp_cam_ctlr_dvp_cam_t *)handle; + + if (!ctlr) { + ESP_LOGE(TAG, "invalid argument: handle is null"); + return NULL; + } + + size_t alignment = 1; + + if (buf_caps & MALLOC_CAP_SPIRAM) { + alignment = ctlr->dma.ext_mem_align; + } else { + alignment = ctlr->dma.int_mem_align; + } + + void *buffer = heap_caps_aligned_calloc(alignment, 1, size, buf_caps); + if (!buffer) { + ESP_LOGE(TAG, "failed to allocate buffer"); + return NULL; + } + + ESP_LOGD(TAG, "Allocated aligned camera buffer: %p, size: %zu, alignment: %zu", buffer, size, alignment); + + return buffer; +} + /** * @brief New ESP CAM DVP controller * @@ -772,6 +813,7 @@ esp_err_t esp_cam_new_dvp_ctlr(const esp_cam_ctlr_dvp_config_t *config, esp_cam_ ctlr->base.register_event_callbacks = esp_cam_ctlr_dvp_cam_register_event_callbacks; ctlr->base.get_internal_buffer = esp_cam_ctlr_dvp_cam_get_internal_buffer; ctlr->base.get_buffer_len = esp_cam_ctlr_get_dvp_cam_frame_buffer_len; + ctlr->base.alloc_buffer = esp_cam_ctlr_dvp_cam_alloc_buffer; *ret_handle = &ctlr->base; diff --git a/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_gdma.c b/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_gdma.c index bfb386c5a20..e9d82400b2d 100644 --- a/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_gdma.c +++ b/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_gdma.c @@ -103,9 +103,8 @@ esp_err_t esp_cam_ctlr_dvp_dma_init(esp_cam_ctlr_dvp_dma_t *dma, uint32_t burst_ .access_ext_mem = true, }; ESP_GOTO_ON_ERROR(gdma_config_transfer(dma->dma_chan, &transfer_config), fail1, TAG, "set trans ability failed"); - size_t int_mem_align = 0; - size_t ext_mem_align = 0; - gdma_get_alignment_constraints(dma->dma_chan, &int_mem_align, &ext_mem_align); + + gdma_get_alignment_constraints(dma->dma_chan, &dma->int_mem_align, &dma->ext_mem_align); dma->desc_count = size / ESP_CAM_CTLR_DVP_DMA_DESC_BUFFER_MAX_SIZE; if (size % ESP_CAM_CTLR_DVP_DMA_DESC_BUFFER_MAX_SIZE) { diff --git a/components/esp_driver_cam/esp_cam_ctlr.c b/components/esp_driver_cam/esp_cam_ctlr.c index a2a4e2e9d0d..43361addc9b 100644 --- a/components/esp_driver_cam/esp_cam_ctlr.c +++ b/components/esp_driver_cam/esp_cam_ctlr.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -91,3 +91,11 @@ esp_err_t esp_cam_ctlr_del(esp_cam_ctlr_handle_t handle) return handle->del(handle); } + +void *esp_cam_ctlr_alloc_buffer(esp_cam_ctlr_handle_t handle, size_t size, uint32_t buf_caps) +{ + ESP_RETURN_ON_FALSE(handle, NULL, TAG, "invalid argument: null pointer"); + ESP_RETURN_ON_FALSE(handle->alloc_buffer, NULL, TAG, "alloc_buffer function not supported"); + + return handle->alloc_buffer(handle, size, buf_caps); +} diff --git a/components/esp_driver_cam/include/esp_cam_ctlr.h b/components/esp_driver_cam/include/esp_cam_ctlr.h index 6365ad6b738..ed01642ad6f 100644 --- a/components/esp_driver_cam/include/esp_cam_ctlr.h +++ b/components/esp_driver_cam/include/esp_cam_ctlr.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -9,6 +9,7 @@ #include #include #include "esp_err.h" +#include "esp_heap_caps.h" #include "esp_cam_ctlr_types.h" #ifdef __cplusplus @@ -132,6 +133,23 @@ esp_err_t esp_cam_ctlr_get_frame_buffer(esp_cam_ctlr_handle_t handle, uint32_t f */ esp_err_t esp_cam_ctlr_get_frame_buffer_len(esp_cam_ctlr_handle_t handle, size_t *ret_fb_len); +/** + * @brief Allocate camera buffer for ESP CAM controller + * + * @note This function must be called after esp_cam_new_*_ctlr + * + * @param[in] handle ESP CAM controller handle + * @param[in] size Buffer size in bytes + * @param[in] buf_caps Buffer allocation capabilities: + * - MALLOC_CAP_SPIRAM || MALLOC_CAP_DMA: Memory in external SPI RAM + * - MALLOC_CAP_INTERNAL || MALLOC_CAP_DMA: Memory in internal SRAM + * + * @return + * - Buffer pointer on success + * - NULL on failure + */ +void *esp_cam_ctlr_alloc_buffer(esp_cam_ctlr_handle_t handle, size_t size, uint32_t buf_caps); + #ifdef __cplusplus } #endif diff --git a/components/esp_driver_cam/interface/esp_cam_ctlr_interface.h b/components/esp_driver_cam/interface/esp_cam_ctlr_interface.h index 031b9f66da5..893e48413d9 100644 --- a/components/esp_driver_cam/interface/esp_cam_ctlr_interface.h +++ b/components/esp_driver_cam/interface/esp_cam_ctlr_interface.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -133,6 +133,19 @@ struct esp_cam_ctlr_t { */ esp_err_t (*get_buffer_len)(esp_cam_ctlr_t *, size_t *); + /** + * @brief Allocate aligned camera buffer for ESP CAM controller + * + * @param[in] esp_cam_ctlr_t * ESP CAM controller handle + * @param[in] size_t Buffer size in bytes + * @param[in] uint32_t Buffer allocation capabilities + * + * @return + * - Buffer pointer on success + * - NULL on failure + */ + void *(*alloc_buffer)(esp_cam_ctlr_t *, size_t, uint32_t); + void *user_data; ///< User data }; diff --git a/components/esp_driver_cam/isp_dvp/src/esp_cam_ctlr_isp_dvp.c b/components/esp_driver_cam/isp_dvp/src/esp_cam_ctlr_isp_dvp.c index 61fea881e26..ec20be674f7 100644 --- a/components/esp_driver_cam/isp_dvp/src/esp_cam_ctlr_isp_dvp.c +++ b/components/esp_driver_cam/isp_dvp/src/esp_cam_ctlr_isp_dvp.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -79,6 +79,7 @@ static esp_err_t s_isp_dvp_start(esp_cam_ctlr_handle_t handle); static esp_err_t s_isp_dvp_stop(esp_cam_ctlr_handle_t handle); static esp_err_t s_isp_dvp_receive(esp_cam_ctlr_handle_t handle, esp_cam_ctlr_trans_t *trans, uint32_t timeout_ms); static bool s_dvp_dma_trans_done_callback(dw_gdma_channel_handle_t chan, const dw_gdma_trans_done_event_data_t *event_data, void *user_data); +static void *s_isp_dvp_alloc_buffer(esp_cam_ctlr_t *handle, size_t size, uint32_t buf_caps); esp_err_t esp_cam_new_isp_dvp_ctlr(isp_proc_handle_t isp_proc, const esp_cam_ctlr_isp_dvp_cfg_t *ctlr_config, esp_cam_ctlr_handle_t *ret_handle) { @@ -189,6 +190,7 @@ esp_err_t esp_cam_new_isp_dvp_ctlr(isp_proc_handle_t isp_proc, const esp_cam_ctl cam_ctlr->register_event_callbacks = s_isp_dvp_register_event_callbacks; cam_ctlr->get_internal_buffer = s_isp_dvp_get_frame_buffer; cam_ctlr->get_buffer_len = s_isp_dvp_get_frame_buffer_length; + cam_ctlr->alloc_buffer = s_isp_dvp_alloc_buffer; *ret_handle = cam_ctlr; return ESP_OK; @@ -567,3 +569,23 @@ static esp_err_t s_isp_declaim_dvp_controller(isp_dvp_controller_t *dvp_ctlr) return ESP_OK; } + +static void *s_isp_dvp_alloc_buffer(esp_cam_ctlr_t *handle, size_t size, uint32_t buf_caps) +{ + isp_dvp_controller_t *dvp_ctlr = __containerof(handle, isp_dvp_controller_t, base); + + if (!dvp_ctlr) { + ESP_LOGE(TAG, "invalid argument: handle is null"); + return NULL; + } + + void *buffer = heap_caps_calloc(1, size, buf_caps); + if (!buffer) { + ESP_LOGE(TAG, "failed to allocate buffer"); + return NULL; + } + + ESP_LOGD(TAG, "Allocated camera buffer: %p, size: %zu", buffer, size); + + return buffer; +} diff --git a/docs/en/api-reference/peripherals/camera_driver.rst b/docs/en/api-reference/peripherals/camera_driver.rst index e4b106c8f5f..dee4dddc76d 100644 --- a/docs/en/api-reference/peripherals/camera_driver.rst +++ b/docs/en/api-reference/peripherals/camera_driver.rst @@ -112,6 +112,8 @@ Camera controller driver can be implemented in one of following ways: If :cpp:type:`esp_cam_ctlr_lcd_cam_cfg_t` is specified, users can call :cpp:func:`esp_cam_new_lcd_cam_ctlr` to allocate and initialize a DVP camera controller handle. This function will return an DVP camera controller handle if it runs correctly. You can take following code as reference. + After calling :cpp:func:`esp_cam_new_dvp_ctlr`, you should allocate a camera buffer that meets the alignment constraints, or call :cpp:func:`esp_cam_ctlr_alloc_buffer` to automatically allocate. + .. code:: c esp_cam_ctlr_handle_t cam_handle = NULL; diff --git a/docs/zh_CN/api-reference/peripherals/camera_driver.rst b/docs/zh_CN/api-reference/peripherals/camera_driver.rst index 9995f4c5105..e49af5b44e8 100644 --- a/docs/zh_CN/api-reference/peripherals/camera_driver.rst +++ b/docs/zh_CN/api-reference/peripherals/camera_driver.rst @@ -112,6 +112,8 @@ 如果指定了 :cpp:type:`esp_cam_ctlr_dvp_config_t` 中的配置,就可以调用 :cpp:func:`esp_cam_new_dvp_ctlr` 来分配和初始化 DVP 摄像头控制器句柄。如果函数运行正确,将返回一个 DVP 摄像头控制器句柄。请参考以下代码。 + 在调用 :cpp:func:`esp_cam_new_dvp_ctlr` 之后,需要分配符合对齐约束的摄像头缓冲区,或调用 :cpp:func:`esp_cam_ctlr_alloc_buffer` 来自动分配。 + .. code:: c esp_cam_ctlr_handle_t cam_handle = NULL; diff --git a/examples/peripherals/camera/dvp_dsi/main/dvp_dsi_main.c b/examples/peripherals/camera/dvp_dsi/main/dvp_dsi_main.c index 5e5f6d4053e..a3392ca9656 100644 --- a/examples/peripherals/camera/dvp_dsi/main/dvp_dsi_main.c +++ b/examples/peripherals/camera/dvp_dsi/main/dvp_dsi_main.c @@ -66,17 +66,6 @@ void app_main(void) ESP_LOGD(TAG, "frame_buffer_size: %zu", frame_buffer_size); ESP_LOGD(TAG, "frame_buffer: %p", frame_buffer); - size_t cam_buffer_size = CONFIG_EXAMPLE_CAM_HRES * CONFIG_EXAMPLE_CAM_VRES * EXAMPLE_RGB565_BITS_PER_PIXEL / 8; - void *cam_buffer = heap_caps_calloc(1, cam_buffer_size, MALLOC_CAP_DMA | MALLOC_CAP_SPIRAM); - if (!cam_buffer) { - ESP_LOGE(TAG, "no mem for cam_buffer"); - return; - } - esp_cam_ctlr_trans_t cam_trans = { - .buffer = cam_buffer, - .buflen = cam_buffer_size, - }; - //----------CAM Controller Init------------// esp_cam_ctlr_handle_t cam_handle = NULL; esp_cam_ctlr_dvp_pin_config_t pin_cfg = { @@ -115,6 +104,18 @@ void app_main(void) return; } + //--------Allocate Camera Buffer----------// + size_t cam_buffer_size = CONFIG_EXAMPLE_CAM_HRES * CONFIG_EXAMPLE_CAM_VRES * EXAMPLE_RGB565_BITS_PER_PIXEL / 8; + void *cam_buffer = esp_cam_ctlr_alloc_buffer(cam_handle, cam_buffer_size, MALLOC_CAP_DMA | MALLOC_CAP_SPIRAM); + if (!cam_buffer) { + ESP_LOGE(TAG, "no mem for cam_buffer"); + return; + } + esp_cam_ctlr_trans_t cam_trans = { + .buffer = cam_buffer, + .buflen = cam_buffer_size, + }; + //--------Camera Sensor and SCCB Init-----------// example_sensor_config_t cam_sensor_config = { .i2c_port_num = I2C_NUM_0, diff --git a/examples/peripherals/camera/dvp_isp_dsi/main/dvp_isp_dsi_main.c b/examples/peripherals/camera/dvp_isp_dsi/main/dvp_isp_dsi_main.c index 6b56a122336..9b6c049dfba 100644 --- a/examples/peripherals/camera/dvp_isp_dsi/main/dvp_isp_dsi_main.c +++ b/examples/peripherals/camera/dvp_isp_dsi/main/dvp_isp_dsi_main.c @@ -98,17 +98,6 @@ void app_main(void) ESP_LOGD(TAG, "frame_buffer_size: %zu", frame_buffer_size); ESP_LOGD(TAG, "frame_buffer: %p", frame_buffer); - size_t cam_buffer_size = CONFIG_EXAMPLE_CAM_HRES * CONFIG_EXAMPLE_CAM_VRES * EXAMPLE_RGB565_BITS_PER_PIXEL / 8; - void *cam_buffer = heap_caps_calloc(1, cam_buffer_size, MALLOC_CAP_DMA | MALLOC_CAP_SPIRAM); - if (!cam_buffer) { - ESP_LOGE(TAG, "no mem for cam_buffer"); - return; - } - esp_cam_ctlr_trans_t cam_trans = { - .buffer = cam_buffer, - .buflen = cam_buffer_size, - }; - //--------Camera Sensor and SCCB Init-----------// s_ledc_generate_dvp_xclk(); @@ -167,6 +156,18 @@ void app_main(void) return; } + //--------Allocate Camera Buffer----------// + size_t cam_buffer_size = CONFIG_EXAMPLE_CAM_HRES * CONFIG_EXAMPLE_CAM_VRES * EXAMPLE_RGB565_BITS_PER_PIXEL / 8; + void *cam_buffer = esp_cam_ctlr_alloc_buffer(cam_handle, cam_buffer_size, MALLOC_CAP_DMA | MALLOC_CAP_SPIRAM); + if (!cam_buffer) { + ESP_LOGE(TAG, "no mem for cam_buffer"); + return; + } + esp_cam_ctlr_trans_t cam_trans = { + .buffer = cam_buffer, + .buflen = cam_buffer_size, + }; + esp_cam_ctlr_evt_cbs_t cbs = { .on_get_new_trans = s_camera_get_new_vb, .on_trans_finished = s_camera_get_finished_trans, diff --git a/examples/peripherals/camera/dvp_spi_lcd/main/dvp_spi_lcd_main.c b/examples/peripherals/camera/dvp_spi_lcd/main/dvp_spi_lcd_main.c index ef57a1a2e7c..bd9b1855fac 100644 --- a/examples/peripherals/camera/dvp_spi_lcd/main/dvp_spi_lcd_main.c +++ b/examples/peripherals/camera/dvp_spi_lcd/main/dvp_spi_lcd_main.c @@ -119,13 +119,6 @@ void app_main(void) esp_lcd_panel_handle_t lcd_panel_hdl = NULL; esp_lcd_panel_io_handle_t lcd_io_hdl = NULL; - size_t cam_buffer_size = CONFIG_EXAMPLE_CAM_HRES * CONFIG_EXAMPLE_CAM_VRES * EXAMPLE_RGB565_BITS_PER_PIXEL / 8; - void *cam_buffer = heap_caps_malloc(cam_buffer_size, EXAMPLE_DVP_CAM_BUF_ALLOC_CAPS); - if (!cam_buffer) { - ESP_LOGE(TAG, "no mem for cam_buffer"); - return; - } - lcd_display_init(&lcd_panel_hdl, lcd_io_hdl); //----------CAM Controller Init------------// @@ -166,6 +159,12 @@ void app_main(void) return; } + //--------Allocate Camera Buffer----------// + size_t cam_buffer_size = CONFIG_EXAMPLE_CAM_HRES * CONFIG_EXAMPLE_CAM_VRES * EXAMPLE_RGB565_BITS_PER_PIXEL / 8; + void *cam_buffer = NULL; + + cam_buffer = esp_cam_ctlr_alloc_buffer(cam_handle, cam_buffer_size, EXAMPLE_DVP_CAM_BUF_ALLOC_CAPS); + //--------Camera Sensor and SCCB Init-----------// example_sensor_config_t cam_sensor_config = { .i2c_port_num = I2C_NUM_0, From 23d4c90c6dcdf13247906759bba06f33b2d9df1d Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Tue, 8 Jul 2025 13:15:00 +0800 Subject: [PATCH 155/213] change(ble): updated ble log spi out ts sync module * use freertos ts instead of esp ts for better performance * enable ts sync sleep support by default * use esp ts as fallback of lc time getter (cherry picked from commit 56e42be85954bf737cd11fbc7bbbb2300750b64b) Co-authored-by: Zhou Xiao --- components/bt/common/Kconfig.in | 2 +- .../bt/common/ble_log/ble_log_spi_out.c | 21 +++++++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/components/bt/common/Kconfig.in b/components/bt/common/Kconfig.in index ff1947a3266..e2052553d61 100644 --- a/components/bt/common/Kconfig.in +++ b/components/bt/common/Kconfig.in @@ -105,7 +105,7 @@ config BT_BLE_LOG_SPI_OUT_SYNC_IO_NUM config BT_BLE_LOG_SPI_OUT_TS_SYNC_SLEEP_SUPPORT bool "Enable ble log & logic analyzer log time sync sleep support" depends on BT_BLE_LOG_SPI_OUT_LL_ENABLED - default n + default y help Enable ble log & logic analyzer log time sync sleep support diff --git a/components/bt/common/ble_log/ble_log_spi_out.c b/components/bt/common/ble_log/ble_log_spi_out.c index 3ee7f5119f9..2fa4b966b14 100644 --- a/components/bt/common/ble_log/ble_log_spi_out.c +++ b/components/bt/common/ble_log/ble_log_spi_out.c @@ -40,7 +40,8 @@ #define SPI_OUT_MALLOC(size) heap_caps_malloc(size, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT) #if SPI_OUT_TS_SYNC_ENABLED -#define SPI_OUT_TS_SYNC_TIMEOUT (1000 * 1000) +#define SPI_OUT_TS_SYNC_TIMEOUT_MS (1000) +#define SPI_OUT_TS_SYNC_TIMEOUT_US (SPI_OUT_TS_SYNC_TIMEOUT_MS * 1000) #endif // SPI_OUT_TS_SYNC_ENABLED // Queue size defines @@ -90,7 +91,7 @@ typedef struct { typedef struct { uint8_t io_level; uint32_t lc_ts; - uint32_t esp_ts; + uint32_t os_ts; } __attribute__((packed)) ts_sync_data_t; // Private enums @@ -127,6 +128,7 @@ static bool spi_out_inited = false; static bool spi_out_enabled = false; static spi_device_handle_t spi_handle = NULL; static uint32_t last_tx_done_ts = 0; +static uint32_t last_tx_done_os_ts = 0; static bool ul_log_inited = false; static SemaphoreHandle_t ul_log_mutex = NULL; @@ -217,7 +219,7 @@ extern uint32_t r_ble_lll_timer_current_tick_get(void); extern uint32_t r_os_cputime_get32(void); #define SPI_OUT_GET_LC_TIME r_os_cputime_get32() #else -#define SPI_OUT_GET_LC_TIME 0 +#define SPI_OUT_GET_LC_TIME esp_timer_get_time() #endif #if !SPI_OUT_TS_SYNC_SLEEP_SUPPORT @@ -272,6 +274,7 @@ static void spi_out_deinit_trans(spi_out_trans_cb_t **trans_cb) IRAM_ATTR static void spi_out_tx_done_cb(spi_transaction_t *ret_trans) { last_tx_done_ts = esp_timer_get_time(); + last_tx_done_os_ts = pdTICKS_TO_MS(xTaskGetTickCountFromISR()); spi_out_trans_cb_t *trans_cb = (spi_out_trans_cb_t *)ret_trans->user; trans_cb->length = 0; trans_cb->flag = TRANS_CB_FLAG_AVAILABLE; @@ -577,8 +580,8 @@ static void spi_out_ul_log_write(uint8_t source, const uint8_t *addr, uint16_t l bool need_append; if (spi_out_log_cb_check_trans(ul_log_cb, total_len, &need_append)) { if (with_ts) { - uint32_t esp_ts = esp_timer_get_time(); - need_append |= spi_out_log_cb_write(ul_log_cb, (const uint8_t *)&esp_ts, + uint32_t os_ts = pdTICKS_TO_MS(xTaskGetTickCount()); + need_append |= spi_out_log_cb_write(ul_log_cb, (const uint8_t *)&os_ts, sizeof(uint32_t), addr, len, source, true); } else { need_append |= spi_out_log_cb_write(ul_log_cb, addr, len, NULL, 0, source, true); @@ -757,7 +760,7 @@ static void spi_out_ts_sync_enable(bool enable) // Start timestamp sync timer if (ts_sync_timer) { if (!esp_timer_is_active(ts_sync_timer)) { - esp_timer_start_periodic(ts_sync_timer, SPI_OUT_TS_SYNC_TIMEOUT); + esp_timer_start_periodic(ts_sync_timer, SPI_OUT_TS_SYNC_TIMEOUT_US); } } #endif // !SPI_OUT_TS_SYNC_SLEEP_SUPPORT @@ -793,8 +796,8 @@ static void spi_out_ts_sync_toggle(void) // Set sync IO level gpio_set_level(SPI_OUT_SYNC_IO_NUM, (uint32_t)ts_sync_data.io_level); - // Get ESP timestamp - ts_sync_data.esp_ts = esp_timer_get_time(); + // Get OS timestamp + ts_sync_data.os_ts = pdTICKS_TO_MS(xTaskGetTickCountFromISR()); portEXIT_CRITICAL(&spinlock); // Exit critical } @@ -1058,7 +1061,7 @@ IRAM_ATTR void ble_log_spi_out_ll_write(uint32_t len, const uint8_t *addr, uint3 #if SPI_OUT_TS_SYNC_SLEEP_SUPPORT if (ts_sync_inited && ts_sync_enabled) { - if (last_tx_done_ts >= (SPI_OUT_TS_SYNC_TIMEOUT + ts_sync_data.esp_ts)) { + if (last_tx_done_os_ts >= (SPI_OUT_TS_SYNC_TIMEOUT_MS + ts_sync_data.os_ts)) { if (spi_out_log_cb_check_trans(ll_task_log_cb, sizeof(ts_sync_data_t), &need_append)) { spi_out_ts_sync_toggle(); spi_out_log_cb_write(ll_task_log_cb, (const uint8_t *)&ts_sync_data, From db90e638841cd546a35ec0ca66a1672018353694 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Tue, 8 Jul 2025 13:15:03 +0800 Subject: [PATCH 156/213] change(ble): implemented log module template (cherry picked from commit 8b2c176eff241a16381cfe7a95c551dd9212304a) Co-authored-by: Zhou Xiao --- .../bt/common/ble_log/ble_log_spi_out.c | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/components/bt/common/ble_log/ble_log_spi_out.c b/components/bt/common/ble_log/ble_log_spi_out.c index 2fa4b966b14..12fe2a3be53 100644 --- a/components/bt/common/ble_log/ble_log_spi_out.c +++ b/components/bt/common/ble_log/ble_log_spi_out.c @@ -232,6 +232,90 @@ static int spi_out_le_audio_log_init(void); static void spi_out_le_audio_log_deinit(void); #endif // SPI_OUT_LE_AUDIO_ENABLED +// Private templates +#define IF_1(...) __VA_ARGS__ +#define IF_0(...) + +#define LOG_MODULE_INIT_FLAG(ID) (ID##_log_inited) +#define LOG_MODULE_CB(ID) (ID##_log_cb) +#define LOG_MODULE_MUTEX(ID) (ID##_log_mutex) +#define LOG_MODULE_STR_BUF(ID) (ID##_log_str_buf) +#define LOG_MODULE_INIT(ID) (spi_out_##ID##_log_init) +#define LOG_MODULE_DEINIT(ID) (spi_out_##ID##_log_deinit) +#define LOG_MODULE_FLUSH(ID) (spi_out_##ID##_log_flush) + +#define DECLARE_LOG_MODULE(ID, TYPE, BUF_SIZE, USE_MUTEX, USE_STR) \ + static bool LOG_MODULE_INIT_FLAG(ID) = false; \ + static spi_out_log_cb_t *LOG_MODULE_CB(ID) = NULL; \ + IF_##USE_MUTEX(static SemaphoreHandle_t LOG_MODULE_MUTEX(ID) = NULL;) \ + IF_##USE_STR(static uint8_t *LOG_MODULE_STR_BUF(ID) = NULL;) \ + \ + static int LOG_MODULE_INIT(ID)(void); \ + static void LOG_MODULE_DEINIT(ID)(void); \ + static void LOG_MODULE_FLUSH(ID)(void); \ + \ + static int LOG_MODULE_INIT(ID)(void) { \ + if (LOG_MODULE_INIT_FLAG(ID)) { \ + return 0; \ + } \ + IF_##USE_MUTEX( \ + LOG_MODULE_MUTEX(ID) = xSemaphoreCreateMutex(); \ + if (!LOG_MODULE_MUTEX(ID)) { \ + goto failed; \ + } \ + ) \ + IF_##USE_STR( \ + LOG_MODULE_STR_BUF(ID) = (uint8_t *)SPI_OUT_MALLOC(SPI_OUT_LOG_STR_BUF_SIZE); \ + if (!LOG_MODULE_STR_BUF(ID)) { \ + goto failed; \ + } \ + ) \ + if (spi_out_log_cb_init(&LOG_MODULE_CB(ID), BUF_SIZE, TYPE) != 0) { \ + goto failed; \ + } \ + LOG_MODULE_INIT_FLAG(ID) = true; \ + return 0; \ + failed: \ + LOG_MODULE_DEINIT(ID)(); \ + return -1; \ + } \ + static void LOG_MODULE_DEINIT(ID)(void) { \ + LOG_MODULE_INIT_FLAG(ID) = false; \ + IF_##USE_MUTEX( \ + if (!LOG_MODULE_MUTEX(ID)) { \ + return; \ + } \ + xSemaphoreTake(LOG_MODULE_MUTEX(ID), portMAX_DELAY); \ + ) \ + IF_##USE_STR( \ + if (LOG_MODULE_STR_BUF(ID)) { \ + free(LOG_MODULE_STR_BUF(ID)); \ + LOG_MODULE_STR_BUF(ID) = NULL; \ + } \ + ) \ + spi_out_log_cb_deinit(&LOG_MODULE_CB(ID)); \ + \ + IF_##USE_MUTEX( \ + xSemaphoreGive(LOG_MODULE_MUTEX(ID)); \ + vSemaphoreDelete(LOG_MODULE_MUTEX(ID)); \ + LOG_MODULE_MUTEX(ID) = NULL; \ + ) \ + } \ + static void LOG_MODULE_FLUSH(ID)(void) { \ + if (!LOG_MODULE_INIT_FLAG(ID)) { \ + return; \ + } \ + IF_##USE_MUTEX( \ + xSemaphoreTake(LOG_MODULE_MUTEX(ID), portMAX_DELAY); \ + ) \ + spi_out_log_cb_write_loss(LOG_MODULE_CB(ID)); \ + spi_out_log_cb_flush_trans(LOG_MODULE_CB(ID)); \ + spi_out_log_cb_append_trans(LOG_MODULE_CB(ID)); \ + IF_##USE_MUTEX( \ + xSemaphoreGive(LOG_MODULE_MUTEX(ID)); \ + ) \ + } \ + // Private functions static int spi_out_init_trans(spi_out_trans_cb_t **trans_cb, uint16_t buf_size) { From 1da626b0a7b40dbc19b9fb968d97ceb74ea3ec85 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Tue, 8 Jul 2025 13:15:05 +0800 Subject: [PATCH 157/213] change(ble): replaced le audio log codes with template (cherry picked from commit feaee0a6fee8e65c420cf4852a2edd00aa740286) Co-authored-by: Zhou Xiao --- .../bt/common/ble_log/ble_log_spi_out.c | 88 ++++++++----------- 1 file changed, 36 insertions(+), 52 deletions(-) diff --git a/components/bt/common/ble_log/ble_log_spi_out.c b/components/bt/common/ble_log/ble_log_spi_out.c index 12fe2a3be53..2a0a002cc89 100644 --- a/components/bt/common/ble_log/ble_log_spi_out.c +++ b/components/bt/common/ble_log/ble_log_spi_out.c @@ -54,8 +54,15 @@ #define SPI_OUT_LL_QUEUE_SIZE (0) #endif // SPI_OUT_LL_ENABLED +#if SPI_OUT_LE_AUDIO_ENABLED +#define SPI_OUT_LE_AUDIO_QUEUE_SIZE (SPI_OUT_PING_PONG_BUF_CNT) +#else +#define SPI_OUT_LE_AUDIO_QUEUE_SIZE (0) +#endif // SPI_OUT_LE_AUDIO_ENABLED + #define SPI_OUT_SPI_MASTER_QUEUE_SIZE (SPI_OUT_UL_QUEUE_SIZE +\ - SPI_OUT_LL_QUEUE_SIZE) + SPI_OUT_LL_QUEUE_SIZE +\ + SPI_OUT_LE_AUDIO_QUEUE_SIZE) // Private typedefs typedef struct { @@ -157,11 +164,6 @@ static esp_timer_handle_t ts_sync_timer = NULL; static esp_timer_handle_t flush_timer = NULL; #endif // SPI_OUT_FLUSH_TIMER_ENABLED -#if SPI_OUT_LE_AUDIO_ENABLED -static bool le_audio_log_inited = false; -static spi_out_log_cb_t *le_audio_log_cb = NULL; -#endif // SPI_OUT_LE_AUDIO_ENABLED - // Extern function declarations extern void esp_panic_handler_feed_wdts(void); @@ -227,11 +229,6 @@ static void esp_timer_cb_ts_sync(void); #endif // !SPI_OUT_TS_SYNC_SLEEP_SUPPORT #endif // SPI_OUT_TS_SYNC_ENABLED -#if SPI_OUT_LE_AUDIO_ENABLED -static int spi_out_le_audio_log_init(void); -static void spi_out_le_audio_log_deinit(void); -#endif // SPI_OUT_LE_AUDIO_ENABLED - // Private templates #define IF_1(...) __VA_ARGS__ #define IF_0(...) @@ -316,6 +313,10 @@ static void spi_out_le_audio_log_deinit(void); ) \ } \ +#if SPI_OUT_LE_AUDIO_ENABLED +DECLARE_LOG_MODULE(le_audio, LOG_CB_TYPE_LE_AUDIO, SPI_OUT_LE_AUDIO_BUF_SIZE, 0, 0) +#endif // SPI_OUT_LE_AUDIO_ENABLED + // Private functions static int spi_out_init_trans(spi_out_trans_cb_t **trans_cb, uint16_t buf_size) { @@ -583,6 +584,10 @@ static void spi_out_log_flush(void) SPI_OUT_LL_PUT_EV; } #endif // SPI_OUT_LL_ENABLED + +#if SPI_OUT_LE_AUDIO_ENABLED + LOG_MODULE_FLUSH(le_audio)(); +#endif // SPI_OUT_LE_AUDIO_ENABLED } #if SPI_OUT_FLUSH_TIMER_ENABLED @@ -899,40 +904,6 @@ static void esp_timer_cb_ts_sync(void) #endif // !SPI_OUT_TS_SYNC_SLEEP_SUPPORT #endif // SPI_OUT_TS_SYNC_ENABLED -#if SPI_OUT_LE_AUDIO_ENABLED -static int spi_out_le_audio_log_init(void) -{ - if (le_audio_log_inited) { - return 0; - } - - // Initialize log control blocks for controller task & ISR logs - if (spi_out_log_cb_init(&le_audio_log_cb, SPI_OUT_LE_AUDIO_BUF_SIZE, LOG_CB_TYPE_LE_AUDIO) != 0) { - ESP_LOGE(BLE_LOG_TAG, "Failed to initialize log control blocks for LE audio!"); - return -1; - } - - // Initialization done - ESP_LOGI(BLE_LOG_TAG, "Succeeded to initialize log control blocks for LE Audio!"); - le_audio_log_inited = true; - return 0; -} - -static void spi_out_le_audio_log_deinit(void) -{ - if (!le_audio_log_inited) { - return; - } - - spi_out_log_cb_deinit(&le_audio_log_cb); - - // Deinitialization done - ESP_LOGI(BLE_LOG_TAG, "Succeeded to deinitialize LE audio log!"); - le_audio_log_inited = false; - return; -} -#endif // SPI_OUT_LE_AUDIO_ENABLED - // Public functions int ble_log_spi_out_init(void) { @@ -988,7 +959,7 @@ int ble_log_spi_out_init(void) #endif // SPI_OUT_TS_SYNC_ENABLED #if SPI_OUT_LE_AUDIO_ENABLED - if (spi_out_le_audio_log_init() != 0) { + if (LOG_MODULE_INIT(le_audio)() != 0) { goto le_audio_init_failed; } #endif // SPI_OUT_LE_AUDIO_ENABLED @@ -1018,7 +989,7 @@ int ble_log_spi_out_init(void) timer_init_failed: #endif // SPI_OUT_FLUSH_TIMER_ENABLED #if SPI_OUT_LE_AUDIO_ENABLED - spi_out_le_audio_log_deinit(); + LOG_MODULE_DEINIT(le_audio)(); le_audio_init_failed: #endif // SPI_OUT_LE_AUDIO_ENABLED #if SPI_OUT_TS_SYNC_ENABLED @@ -1065,6 +1036,10 @@ void ble_log_spi_out_deinit(void) spi_out_ts_sync_deinit(); #endif // SPI_OUT_TS_SYNC_ENABLED +#if SPI_OUT_LE_AUDIO_ENABLED + LOG_MODULE_DEINIT(le_audio)(); +#endif // SPI_OUT_LE_AUDIO_ENABLED + #if SPI_OUT_LL_ENABLED spi_out_ll_log_deinit(); #endif // SPI_OUT_LL_ENABLED @@ -1289,6 +1264,15 @@ void ble_log_spi_out_dump_all(void) spi_out_log_cb_dump(ul_log_cb); esp_rom_printf("\n:UL_LOG_DUMP_END]\n\n"); } + +#if SPI_OUT_LE_AUDIO_ENABLED + if (LOG_MODULE_INIT_FLAG(le_audio)) { + esp_rom_printf("[LE_AUDIO_LOG_DUMP_START:\n"); + spi_out_log_cb_dump(LOG_MODULE_CB(le_audio)); + esp_rom_printf("\n:LE_AUDIO_LOG_DUMP_END]\n\n"); + } +#endif // SPI_OUT_LE_AUDIO_ENABLED + portEXIT_CRITICAL_SAFE(&spinlock); } @@ -1315,19 +1299,19 @@ void ble_log_spi_out_flush(void) #if CONFIG_BT_BLE_LOG_SPI_OUT_LE_AUDIO_ENABLED IRAM_ATTR void ble_log_spi_out_le_audio_write(const uint8_t *addr, uint16_t len) { - if (!le_audio_log_inited) { + if (!LOG_MODULE_INIT_FLAG(le_audio)) { return; } bool need_append; - if (spi_out_log_cb_check_trans(le_audio_log_cb, len, &need_append)) { - need_append |= spi_out_log_cb_write(le_audio_log_cb, addr, len, NULL, 0, + if (spi_out_log_cb_check_trans(LOG_MODULE_CB(le_audio), len, &need_append)) { + need_append |= spi_out_log_cb_write(LOG_MODULE_CB(le_audio), addr, len, NULL, 0, BLE_LOG_SPI_OUT_SOURCE_LE_AUDIO, false); } if (need_append) { - spi_out_log_cb_append_trans(le_audio_log_cb); + spi_out_log_cb_append_trans(LOG_MODULE_CB(le_audio)); } - spi_out_log_cb_write_loss(le_audio_log_cb); + spi_out_log_cb_write_loss(LOG_MODULE_CB(le_audio)); return; } #endif // CONFIG_BT_BLE_LOG_SPI_OUT_LE_AUDIO_ENABLED From d086865c1fdc55e901c241bdd44bb0d5c447ee16 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Tue, 8 Jul 2025 13:15:07 +0800 Subject: [PATCH 158/213] change(ble): replaced ul log codes with template (cherry picked from commit d353bf280257b8e1f9e34b6d676f5a8af2eb2245) Co-authored-by: Zhou Xiao --- .../bt/common/ble_log/ble_log_spi_out.c | 185 +++++++----------- 1 file changed, 74 insertions(+), 111 deletions(-) diff --git a/components/bt/common/ble_log/ble_log_spi_out.c b/components/bt/common/ble_log/ble_log_spi_out.c index 2a0a002cc89..b7da6ec4342 100644 --- a/components/bt/common/ble_log/ble_log_spi_out.c +++ b/components/bt/common/ble_log/ble_log_spi_out.c @@ -36,7 +36,7 @@ #define SPI_OUT_FRAME_OVERHEAD (8) #define SPI_OUT_PACKET_LOSS_FRAME_SIZE (6) #define SPI_OUT_TRANS_ITVL_MIN_US (30) -#define SPI_OUT_UL_LOG_STR_BUF_SIZE (100) +#define SPI_OUT_LOG_STR_BUF_SIZE (100) #define SPI_OUT_MALLOC(size) heap_caps_malloc(size, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT) #if SPI_OUT_TS_SYNC_ENABLED @@ -137,11 +137,6 @@ static spi_device_handle_t spi_handle = NULL; static uint32_t last_tx_done_ts = 0; static uint32_t last_tx_done_os_ts = 0; -static bool ul_log_inited = false; -static SemaphoreHandle_t ul_log_mutex = NULL; -static spi_out_log_cb_t *ul_log_cb = NULL; -static uint8_t *ul_log_str_buf = NULL; - #if SPI_OUT_LL_ENABLED static bool ll_log_inited = false; static spi_out_log_cb_t *ll_task_log_cb = NULL; @@ -185,10 +180,10 @@ static void spi_out_log_cb_write_loss(spi_out_log_cb_t *log_cb); static void spi_out_log_cb_dump(spi_out_log_cb_t *log_cb); static void spi_out_log_flush(void); -static int spi_out_ul_log_init(void); -static void spi_out_ul_log_deinit(void); -static void spi_out_ul_log_write(uint8_t source, const uint8_t *addr, uint16_t len, bool with_ts); -static bool spi_out_ul_log_printf(uint8_t source, const char *format, va_list args, int offset); +static inline spi_out_log_cb_t *spi_out_get_log_cb(uint8_t source); +static inline uint8_t *spi_out_get_str_buf(uint8_t source); +static void spi_out_log_write(uint8_t source, const uint8_t *addr, uint16_t len, bool with_ts); +static bool spi_out_log_printf(uint8_t source, const char *format, va_list args, int offset); #if SPI_OUT_LL_ENABLED static int spi_out_ll_log_init(void); @@ -313,6 +308,8 @@ static void esp_timer_cb_ts_sync(void); ) \ } \ +DECLARE_LOG_MODULE(ul, LOG_CB_TYPE_UL, SPI_OUT_UL_TASK_BUF_SIZE, 1, 1) + #if SPI_OUT_LE_AUDIO_ENABLED DECLARE_LOG_MODULE(le_audio, LOG_CB_TYPE_LE_AUDIO, SPI_OUT_LE_AUDIO_BUF_SIZE, 0, 0) #endif // SPI_OUT_LE_AUDIO_ENABLED @@ -572,11 +569,7 @@ static void spi_out_log_cb_dump(spi_out_log_cb_t *log_cb) static void spi_out_log_flush(void) { - // Flush ul log - xSemaphoreTake(ul_log_mutex, portMAX_DELAY); - spi_out_log_cb_flush_trans(ul_log_cb); - spi_out_log_cb_append_trans(ul_log_cb); - xSemaphoreGive(ul_log_mutex); + LOG_MODULE_FLUSH(ul)(); #if SPI_OUT_LL_ENABLED if (esp_bt_controller_get_status() >= ESP_BT_CONTROLLER_STATUS_INITED) { @@ -599,105 +592,63 @@ static void esp_timer_cb_log_flush(void) } #endif // SPI_OUT_FLUSH_TIMER_ENABLED -static int spi_out_ul_log_init(void) +static inline spi_out_log_cb_t *spi_out_get_log_cb(uint8_t source) { - if (ul_log_inited) { - return 0; + spi_out_log_cb_t *log_cb; + switch (source) { + default: + log_cb = LOG_MODULE_CB(ul); } - - // Initialize mutex - ul_log_mutex = xSemaphoreCreateMutex(); - if (!ul_log_mutex) { - ESP_LOGE(BLE_LOG_TAG, "Failed to create mutex for upper layer task log!"); - goto mutex_init_failed; - } - - // Initialize string buffer - ul_log_str_buf = (uint8_t *)SPI_OUT_MALLOC(SPI_OUT_UL_LOG_STR_BUF_SIZE); - if (!ul_log_str_buf) { - ESP_LOGE(BLE_LOG_TAG, "Failed to initialize string buffer for upper layer task log!"); - goto str_buf_init_failed; - } - - // Initialize log control block - if (spi_out_log_cb_init(&ul_log_cb, SPI_OUT_UL_TASK_BUF_SIZE, LOG_CB_TYPE_UL) != 0) { - ESP_LOGE(BLE_LOG_TAG, "Failed to initialize log control blocks for upper layer task log!"); - goto log_cb_init_failed; - } - - // Initialization done - ESP_LOGI(BLE_LOG_TAG, "Succeeded to initialize upper layer task log!"); - ul_log_inited = true; - return 0; - -log_cb_init_failed: - if (ul_log_str_buf) { - free(ul_log_str_buf); - ul_log_str_buf = NULL; - } -str_buf_init_failed: - vSemaphoreDelete(ul_log_mutex); -mutex_init_failed: - return -1; + return log_cb; } -static void spi_out_ul_log_deinit(void) +static inline uint8_t *spi_out_get_str_buf(uint8_t source) { - if (!ul_log_inited) { - return; + uint8_t *str_buf; + switch (source) { + default: + str_buf = LOG_MODULE_STR_BUF(ul); } - ul_log_inited = false; - - xSemaphoreTake(ul_log_mutex, portMAX_DELAY); - if (ul_log_str_buf) { - free(ul_log_str_buf); - ul_log_str_buf = NULL; - } - spi_out_log_cb_deinit(&ul_log_cb); - xSemaphoreGive(ul_log_mutex); - - vSemaphoreDelete(ul_log_mutex); - ul_log_mutex = NULL; - - ESP_LOGI(BLE_LOG_TAG, "Succeeded to deinitialize upper layer log!"); - return; + return str_buf; } -static void spi_out_ul_log_write(uint8_t source, const uint8_t *addr, uint16_t len, bool with_ts) +static void spi_out_log_write(uint8_t source, const uint8_t *addr, uint16_t len, bool with_ts) { uint16_t total_len = with_ts? (len + sizeof(uint32_t)): len; bool need_append; - if (spi_out_log_cb_check_trans(ul_log_cb, total_len, &need_append)) { + spi_out_log_cb_t *log_cb = spi_out_get_log_cb(source); + if (spi_out_log_cb_check_trans(log_cb, total_len, &need_append)) { if (with_ts) { uint32_t os_ts = pdTICKS_TO_MS(xTaskGetTickCount()); - need_append |= spi_out_log_cb_write(ul_log_cb, (const uint8_t *)&os_ts, + need_append |= spi_out_log_cb_write(log_cb, (const uint8_t *)&os_ts, sizeof(uint32_t), addr, len, source, true); } else { - need_append |= spi_out_log_cb_write(ul_log_cb, addr, len, NULL, 0, source, true); + need_append |= spi_out_log_cb_write(log_cb, addr, len, NULL, 0, source, true); } } if (need_append) { - spi_out_log_cb_append_trans(ul_log_cb); + spi_out_log_cb_append_trans(log_cb); } - spi_out_log_cb_write_loss(ul_log_cb); + spi_out_log_cb_write_loss(log_cb); } -static bool spi_out_ul_log_printf(uint8_t source, const char *format, va_list args, int offset) +static bool spi_out_log_printf(uint8_t source, const char *format, va_list args, int offset) { - int len = vsnprintf((char *)(ul_log_str_buf + offset), - SPI_OUT_UL_LOG_STR_BUF_SIZE - offset, format, args); + uint8_t *str_buf = spi_out_get_str_buf(source); + int len = vsnprintf((char *)(str_buf + offset), + SPI_OUT_LOG_STR_BUF_SIZE - offset, format, args); if (len < 0) { return false; } len += offset; // Truncate string if overflowed - if (len >= SPI_OUT_UL_LOG_STR_BUF_SIZE) { - len = SPI_OUT_UL_LOG_STR_BUF_SIZE - 1; - ul_log_str_buf[len] = '\0'; + if (len >= SPI_OUT_LOG_STR_BUF_SIZE) { + len = SPI_OUT_LOG_STR_BUF_SIZE - 1; + str_buf[len] = '\0'; } - spi_out_ul_log_write(source, ul_log_str_buf, len, true); + spi_out_log_write(source, str_buf, len, true); return true; } @@ -754,6 +705,10 @@ static void spi_out_ll_log_deinit(void) // Context: LL task static void spi_out_ll_log_flush(void) { + if (!ll_log_inited) { + return; + } + // Flush task log and hci log buffer spi_out_log_cb_flush_trans(ll_task_log_cb); spi_out_log_cb_flush_trans(ll_hci_log_cb); @@ -942,7 +897,7 @@ int ble_log_spi_out_init(void) goto spi_device_add_failed; } - if (spi_out_ul_log_init() != 0) { + if (LOG_MODULE_INIT(ul)() != 0) { goto ul_log_init_failed; } @@ -1000,7 +955,7 @@ ts_sync_init_failed: spi_out_ll_log_deinit(); ll_log_init_failed: #endif // SPI_OUT_LL_ENABLED - spi_out_ul_log_deinit(); + LOG_MODULE_DEINIT(ul)(); ul_log_init_failed: spi_bus_remove_device(spi_handle); spi_handle = NULL; @@ -1017,6 +972,10 @@ void ble_log_spi_out_deinit(void) return; } + // Reset init flag + spi_out_inited = false; + spi_out_enabled = false; + #if SPI_OUT_FLUSH_TIMER_ENABLED esp_timer_stop(flush_timer); esp_timer_delete(flush_timer); @@ -1044,11 +1003,7 @@ void ble_log_spi_out_deinit(void) spi_out_ll_log_deinit(); #endif // SPI_OUT_LL_ENABLED - spi_out_ul_log_deinit(); - - // Reset init flag - spi_out_inited = false; - spi_out_enabled = false; + LOG_MODULE_DEINIT(ul)(); } #if SPI_OUT_TS_SYNC_ENABLED @@ -1156,19 +1111,19 @@ IRAM_ATTR void ble_log_spi_out_ll_log_ev_proc(void) int ble_log_spi_out_write(uint8_t source, const uint8_t *addr, uint16_t len) { - if (!ul_log_inited) { + if (!LOG_MODULE_INIT_FLAG(ul)) { return -1; } - xSemaphoreTake(ul_log_mutex, portMAX_DELAY); - spi_out_ul_log_write(source, addr, len, false); - xSemaphoreGive(ul_log_mutex); + xSemaphoreTake(LOG_MODULE_MUTEX(ul), portMAX_DELAY); + spi_out_log_write(source, addr, len, false); + xSemaphoreGive(LOG_MODULE_MUTEX(ul)); return 0; } int ble_log_spi_out_printf(uint8_t source, const char *format, ...) { - if (!ul_log_inited) { + if (!LOG_MODULE_INIT_FLAG(ul)) { return -1; } @@ -1183,9 +1138,9 @@ int ble_log_spi_out_printf(uint8_t source, const char *format, ...) va_list args_copy; va_copy(args_copy, args); - xSemaphoreTake(ul_log_mutex, portMAX_DELAY); - bool ret = spi_out_ul_log_printf(source, format, args_copy, 0); - xSemaphoreGive(ul_log_mutex); + xSemaphoreTake(LOG_MODULE_MUTEX(ul), portMAX_DELAY); + bool ret = spi_out_log_printf(source, format, args_copy, 0); + xSemaphoreGive(LOG_MODULE_MUTEX(ul)); va_end(args_copy); va_end(args); @@ -1194,7 +1149,7 @@ int ble_log_spi_out_printf(uint8_t source, const char *format, ...) int ble_log_spi_out_printf_enh(uint8_t source, uint8_t level, const char *tag, const char *format, ...) { - if (!ul_log_inited) { + if (!LOG_MODULE_INIT_FLAG(ul)) { return -1; } @@ -1210,15 +1165,15 @@ int ble_log_spi_out_printf_enh(uint8_t source, uint8_t level, const char *tag, c // Create log prefix in the format: "[level][tag] " bool ret = false; - xSemaphoreTake(ul_log_mutex, portMAX_DELAY); - int prefix_len = snprintf((char *)ul_log_str_buf, SPI_OUT_UL_LOG_STR_BUF_SIZE, + xSemaphoreTake(LOG_MODULE_MUTEX(ul), portMAX_DELAY); + int prefix_len = snprintf((char *)LOG_MODULE_STR_BUF(ul), SPI_OUT_LOG_STR_BUF_SIZE, "[%d][%s]", level, tag? tag: "NULL"); - if ((prefix_len < 0) || (prefix_len >= SPI_OUT_UL_LOG_STR_BUF_SIZE)) { + if ((prefix_len < 0) || (prefix_len >= SPI_OUT_LOG_STR_BUF_SIZE)) { goto exit; } - ret = spi_out_ul_log_printf(source, format, args_copy, prefix_len); + ret = spi_out_log_printf(source, format, args_copy, prefix_len); exit: - xSemaphoreGive(ul_log_mutex); + xSemaphoreGive(LOG_MODULE_MUTEX(ul)); va_end(args_copy); va_end(args); return ret? 0: -1; @@ -1226,18 +1181,22 @@ exit: int ble_log_spi_out_write_with_ts(uint8_t source, const uint8_t *addr, uint16_t len) { - if (!ul_log_inited) { + if (!LOG_MODULE_INIT_FLAG(ul)) { return -1; } - xSemaphoreTake(ul_log_mutex, portMAX_DELAY); - spi_out_ul_log_write(source, addr, len, true); - xSemaphoreGive(ul_log_mutex); + xSemaphoreTake(LOG_MODULE_MUTEX(ul), portMAX_DELAY); + spi_out_log_write(source, addr, len, true); + xSemaphoreGive(LOG_MODULE_MUTEX(ul)); return 0; } void ble_log_spi_out_dump_all(void) { + if (!spi_out_inited) { + return; + } + portMUX_TYPE spinlock = portMUX_INITIALIZER_UNLOCKED; portENTER_CRITICAL_SAFE(&spinlock); @@ -1258,10 +1217,10 @@ void ble_log_spi_out_dump_all(void) } #endif // SPI_OUT_LL_ENABLED - if (ul_log_inited) { + if (LOG_MODULE_INIT_FLAG(ul)) { // Dump upper layer log buffer esp_rom_printf("[UL_LOG_DUMP_START:\n"); - spi_out_log_cb_dump(ul_log_cb); + spi_out_log_cb_dump(LOG_MODULE_CB(ul)); esp_rom_printf("\n:UL_LOG_DUMP_END]\n\n"); } @@ -1278,6 +1237,10 @@ void ble_log_spi_out_dump_all(void) void ble_log_spi_out_enable(bool enable) { + if (!spi_out_inited) { + return; + } + spi_out_enabled = enable; if (!enable) { From b073f02a0576251af0f19f081b38738434025612 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Tue, 8 Jul 2025 13:15:10 +0800 Subject: [PATCH 159/213] feat(ble): support host & hci log module (cherry picked from commit dd4cbe5e001aa9c89d45ce6bd72822f80f220e89) Co-authored-by: Zhou Xiao --- components/bt/common/Kconfig.in | 16 ++ .../bt/common/ble_log/ble_log_spi_out.c | 252 ++++++++++-------- .../ble_log/include/ble_log/ble_log_spi_out.h | 23 +- .../bt/host/bluedroid/api/esp_bluedroid_hci.c | 2 +- .../common/include/common/bt_trace.h | 18 +- components/bt/host/bluedroid/hci/hci_hal_h4.c | 2 +- .../host/nimble/esp-hci/src/esp_nimble_hci.c | 4 +- 7 files changed, 188 insertions(+), 129 deletions(-) diff --git a/components/bt/common/Kconfig.in b/components/bt/common/Kconfig.in index e2052553d61..fa2824e3dc2 100644 --- a/components/bt/common/Kconfig.in +++ b/components/bt/common/Kconfig.in @@ -27,6 +27,14 @@ config BT_BLE_LOG_SPI_OUT_HCI_ENABLED help Enable logging of HCI packets to the SPI bus when BLE SPI log output is enabled. +config BT_BLE_LOG_SPI_OUT_HCI_BUF_SIZE + int "SPI transaction buffer size for HCI logs" + depends on BT_BLE_LOG_SPI_OUT_HCI_ENABLED + default 1024 + help + SPI transaction buffer size for HCI logs. + There will be 2 SPI DMA buffers with the same size. + config BT_BLE_LOG_SPI_OUT_HOST_ENABLED bool "Enable Host log output to SPI" depends on BT_BLE_LOG_SPI_OUT_ENABLED @@ -35,6 +43,14 @@ config BT_BLE_LOG_SPI_OUT_HOST_ENABLED This configuration applies to the logs of both Bluedroid Host and NimBLE Host. When BLE SPI log output is enabled, this option allows host logs to be transmitted via SPI. +config BT_BLE_LOG_SPI_OUT_HOST_BUF_SIZE + int "SPI transaction buffer size for host logs" + depends on BT_BLE_LOG_SPI_OUT_HOST_ENABLED + default 1024 + help + SPI transaction buffer size for host logs. + There will be 2 SPI DMA buffers with the same size. + config BT_BLE_LOG_SPI_OUT_LL_ENABLED bool "Enable Controller log output to SPI" depends on BT_BLE_LOG_SPI_OUT_ENABLED diff --git a/components/bt/common/ble_log/ble_log_spi_out.c b/components/bt/common/ble_log/ble_log_spi_out.c index b7da6ec4342..5731f851f06 100644 --- a/components/bt/common/ble_log/ble_log_spi_out.c +++ b/components/bt/common/ble_log/ble_log_spi_out.c @@ -26,6 +26,10 @@ #define SPI_OUT_FLUSH_TIMEOUT_US (CONFIG_BT_BLE_LOG_SPI_OUT_FLUSH_TIMEOUT * 1000) #define SPI_OUT_LE_AUDIO_ENABLED CONFIG_BT_BLE_LOG_SPI_OUT_LE_AUDIO_ENABLED #define SPI_OUT_LE_AUDIO_BUF_SIZE CONFIG_BT_BLE_LOG_SPI_OUT_LE_AUDIO_BUF_SIZE +#define SPI_OUT_HOST_ENABLED CONFIG_BT_BLE_LOG_SPI_OUT_HOST_ENABLED +#define SPI_OUT_HOST_BUF_SIZE CONFIG_BT_BLE_LOG_SPI_OUT_HOST_BUF_SIZE +#define SPI_OUT_HCI_ENABLED CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED +#define SPI_OUT_HCI_BUF_SIZE CONFIG_BT_BLE_LOG_SPI_OUT_HCI_BUF_SIZE // Private defines #define BLE_LOG_TAG "BLE_LOG" @@ -60,9 +64,23 @@ #define SPI_OUT_LE_AUDIO_QUEUE_SIZE (0) #endif // SPI_OUT_LE_AUDIO_ENABLED +#if SPI_OUT_HOST_ENABLED +#define SPI_OUT_HOST_QUEUE_SIZE (SPI_OUT_PING_PONG_BUF_CNT) +#else +#define SPI_OUT_HOST_QUEUE_SIZE (0) +#endif // SPI_OUT_HOST_ENABLED + +#if SPI_OUT_HCI_ENABLED +#define SPI_OUT_HCI_QUEUE_SIZE (SPI_OUT_PING_PONG_BUF_CNT) +#else +#define SPI_OUT_HCI_QUEUE_SIZE (0) +#endif // SPI_OUT_HCI_ENABLED + #define SPI_OUT_SPI_MASTER_QUEUE_SIZE (SPI_OUT_UL_QUEUE_SIZE +\ SPI_OUT_LL_QUEUE_SIZE +\ - SPI_OUT_LE_AUDIO_QUEUE_SIZE) + SPI_OUT_LE_AUDIO_QUEUE_SIZE +\ + SPI_OUT_HOST_QUEUE_SIZE +\ + SPI_OUT_HCI_QUEUE_SIZE) // Private typedefs typedef struct { @@ -114,6 +132,8 @@ enum { LOG_CB_TYPE_LL_ISR, LOG_CB_TYPE_LL_HCI, LOG_CB_TYPE_LE_AUDIO, + LOG_CB_TYPE_HOST, + LOG_CB_TYPE_HCI, }; enum { @@ -123,6 +143,7 @@ enum { LL_LOG_FLAG_ISR, LL_LOG_FLAG_HCI, LL_LOG_FLAG_RAW, + LL_LOG_FLAG_HCI_UPSTREAM, }; enum { @@ -180,10 +201,9 @@ static void spi_out_log_cb_write_loss(spi_out_log_cb_t *log_cb); static void spi_out_log_cb_dump(spi_out_log_cb_t *log_cb); static void spi_out_log_flush(void); -static inline spi_out_log_cb_t *spi_out_get_log_cb(uint8_t source); -static inline uint8_t *spi_out_get_str_buf(uint8_t source); -static void spi_out_log_write(uint8_t source, const uint8_t *addr, uint16_t len, bool with_ts); -static bool spi_out_log_printf(uint8_t source, const char *format, va_list args, int offset); +static void spi_out_write_hex(spi_out_log_cb_t *log_cb, uint8_t source, + const uint8_t *addr, uint16_t len, bool with_ts); +static int spi_out_write_str(uint8_t *str_buf, const char *format, va_list args, int offset); #if SPI_OUT_LL_ENABLED static int spi_out_ll_log_init(void); @@ -314,6 +334,14 @@ DECLARE_LOG_MODULE(ul, LOG_CB_TYPE_UL, SPI_OUT_UL_TASK_BUF_SIZE, 1, 1) DECLARE_LOG_MODULE(le_audio, LOG_CB_TYPE_LE_AUDIO, SPI_OUT_LE_AUDIO_BUF_SIZE, 0, 0) #endif // SPI_OUT_LE_AUDIO_ENABLED +#if SPI_OUT_HOST_ENABLED +DECLARE_LOG_MODULE(host, LOG_CB_TYPE_HOST, SPI_OUT_HOST_BUF_SIZE, 0, 1) +#endif // SPI_OUT_HOST_ENABLED + +#if SPI_OUT_HCI_ENABLED +DECLARE_LOG_MODULE(hci, LOG_CB_TYPE_HCI, SPI_OUT_HCI_BUF_SIZE, 0, 0) +#endif // SPI_OUT_HCI_ENABLED + // Private functions static int spi_out_init_trans(spi_out_trans_cb_t **trans_cb, uint16_t buf_size) { @@ -581,6 +609,14 @@ static void spi_out_log_flush(void) #if SPI_OUT_LE_AUDIO_ENABLED LOG_MODULE_FLUSH(le_audio)(); #endif // SPI_OUT_LE_AUDIO_ENABLED + +#if SPI_OUT_HOST_ENABLED + LOG_MODULE_FLUSH(host)(); +#endif // SPI_OUT_HOST_ENABLED + +#if SPI_OUT_HCI_ENABLED + LOG_MODULE_FLUSH(hci)(); +#endif // SPI_OUT_HCI_ENABLED } #if SPI_OUT_FLUSH_TIMER_ENABLED @@ -592,31 +628,11 @@ static void esp_timer_cb_log_flush(void) } #endif // SPI_OUT_FLUSH_TIMER_ENABLED -static inline spi_out_log_cb_t *spi_out_get_log_cb(uint8_t source) -{ - spi_out_log_cb_t *log_cb; - switch (source) { - default: - log_cb = LOG_MODULE_CB(ul); - } - return log_cb; -} - -static inline uint8_t *spi_out_get_str_buf(uint8_t source) -{ - uint8_t *str_buf; - switch (source) { - default: - str_buf = LOG_MODULE_STR_BUF(ul); - } - return str_buf; -} - -static void spi_out_log_write(uint8_t source, const uint8_t *addr, uint16_t len, bool with_ts) +static void spi_out_write_hex(spi_out_log_cb_t *log_cb, uint8_t source, + const uint8_t *addr, uint16_t len, bool with_ts) { uint16_t total_len = with_ts? (len + sizeof(uint32_t)): len; bool need_append; - spi_out_log_cb_t *log_cb = spi_out_get_log_cb(source); if (spi_out_log_cb_check_trans(log_cb, total_len, &need_append)) { if (with_ts) { uint32_t os_ts = pdTICKS_TO_MS(xTaskGetTickCount()); @@ -632,24 +648,19 @@ static void spi_out_log_write(uint8_t source, const uint8_t *addr, uint16_t len, spi_out_log_cb_write_loss(log_cb); } -static bool spi_out_log_printf(uint8_t source, const char *format, va_list args, int offset) +static int spi_out_write_str(uint8_t *str_buf, const char *format, va_list args, int offset) { - uint8_t *str_buf = spi_out_get_str_buf(source); - int len = vsnprintf((char *)(str_buf + offset), - SPI_OUT_LOG_STR_BUF_SIZE - offset, format, args); + int len = vsnprintf((char *)(str_buf + offset), SPI_OUT_LOG_STR_BUF_SIZE - offset, format, args); if (len < 0) { - return false; + return 0; } len += offset; - // Truncate string if overflowed if (len >= SPI_OUT_LOG_STR_BUF_SIZE) { len = SPI_OUT_LOG_STR_BUF_SIZE - 1; str_buf[len] = '\0'; } - - spi_out_log_write(source, str_buf, len, true); - return true; + return len; } #if SPI_OUT_LL_ENABLED @@ -919,6 +930,18 @@ int ble_log_spi_out_init(void) } #endif // SPI_OUT_LE_AUDIO_ENABLED +#if SPI_OUT_HOST_ENABLED + if (LOG_MODULE_INIT(host)() != 0) { + goto host_init_failed; + } +#endif // SPI_OUT_HOST_ENABLED + +#if SPI_OUT_HCI_ENABLED + if (LOG_MODULE_INIT(hci)() != 0) { + goto hci_init_failed; + } +#endif // SPI_OUT_HCI_ENABLED + #if SPI_OUT_FLUSH_TIMER_ENABLED esp_timer_create_args_t timer_args = { .callback = (esp_timer_cb_t)esp_timer_cb_log_flush, @@ -943,6 +966,14 @@ int ble_log_spi_out_init(void) #if SPI_OUT_FLUSH_TIMER_ENABLED timer_init_failed: #endif // SPI_OUT_FLUSH_TIMER_ENABLED +#if SPI_OUT_HCI_ENABLED + LOG_MODULE_DEINIT(hci)(); +hci_init_failed: +#endif // SPI_OUT_HCI_ENABLED +#if SPI_OUT_HOST_ENABLED + LOG_MODULE_DEINIT(host)(); +host_init_failed: +#endif // SPI_OUT_HOST_ENABLED #if SPI_OUT_LE_AUDIO_ENABLED LOG_MODULE_DEINIT(le_audio)(); le_audio_init_failed: @@ -995,6 +1026,14 @@ void ble_log_spi_out_deinit(void) spi_out_ts_sync_deinit(); #endif // SPI_OUT_TS_SYNC_ENABLED +#if SPI_OUT_HCI_ENABLED + LOG_MODULE_DEINIT(hci)(); +#endif // SPI_OUT_HCI_ENABLED + +#if SPI_OUT_HOST_ENABLED + LOG_MODULE_DEINIT(host)(); +#endif // SPI_OUT_HOST_ENABLED + #if SPI_OUT_LE_AUDIO_ENABLED LOG_MODULE_DEINIT(le_audio)(); #endif // SPI_OUT_LE_AUDIO_ENABLED @@ -1056,6 +1095,9 @@ IRAM_ATTR void ble_log_spi_out_ll_write(uint32_t len, const uint8_t *addr, uint3 } else if (flag & BIT(LL_LOG_FLAG_HCI)) { log_cb = ll_hci_log_cb; source = BLE_LOG_SPI_OUT_SOURCE_LL_HCI; + } else if (flag & BIT(LL_LOG_FLAG_HCI_UPSTREAM)) { + log_cb = ll_hci_log_cb; + source = BLE_LOG_SPI_OUT_SOURCE_HCI_UPSTREAM; } else { log_cb = ll_task_log_cb; source = BLE_LOG_SPI_OUT_SOURCE_ESP; @@ -1116,77 +1158,7 @@ int ble_log_spi_out_write(uint8_t source, const uint8_t *addr, uint16_t len) } xSemaphoreTake(LOG_MODULE_MUTEX(ul), portMAX_DELAY); - spi_out_log_write(source, addr, len, false); - xSemaphoreGive(LOG_MODULE_MUTEX(ul)); - return 0; -} - -int ble_log_spi_out_printf(uint8_t source, const char *format, ...) -{ - if (!LOG_MODULE_INIT_FLAG(ul)) { - return -1; - } - - if (!format) { - return -1; - } - - // Get arguments - va_list args; - va_start(args, format); - - va_list args_copy; - va_copy(args_copy, args); - - xSemaphoreTake(LOG_MODULE_MUTEX(ul), portMAX_DELAY); - bool ret = spi_out_log_printf(source, format, args_copy, 0); - xSemaphoreGive(LOG_MODULE_MUTEX(ul)); - - va_end(args_copy); - va_end(args); - return ret? 0: -1; -} - -int ble_log_spi_out_printf_enh(uint8_t source, uint8_t level, const char *tag, const char *format, ...) -{ - if (!LOG_MODULE_INIT_FLAG(ul)) { - return -1; - } - - if (!tag || !format) { - return -1; - } - - va_list args; - va_start(args, format); - - va_list args_copy; - va_copy(args_copy, args); - - // Create log prefix in the format: "[level][tag] " - bool ret = false; - xSemaphoreTake(LOG_MODULE_MUTEX(ul), portMAX_DELAY); - int prefix_len = snprintf((char *)LOG_MODULE_STR_BUF(ul), SPI_OUT_LOG_STR_BUF_SIZE, - "[%d][%s]", level, tag? tag: "NULL"); - if ((prefix_len < 0) || (prefix_len >= SPI_OUT_LOG_STR_BUF_SIZE)) { - goto exit; - } - ret = spi_out_log_printf(source, format, args_copy, prefix_len); -exit: - xSemaphoreGive(LOG_MODULE_MUTEX(ul)); - va_end(args_copy); - va_end(args); - return ret? 0: -1; -} - -int ble_log_spi_out_write_with_ts(uint8_t source, const uint8_t *addr, uint16_t len) -{ - if (!LOG_MODULE_INIT_FLAG(ul)) { - return -1; - } - - xSemaphoreTake(LOG_MODULE_MUTEX(ul), portMAX_DELAY); - spi_out_log_write(source, addr, len, true); + spi_out_write_hex(LOG_MODULE_CB(ul), source, addr, len, false); xSemaphoreGive(LOG_MODULE_MUTEX(ul)); return 0; } @@ -1232,6 +1204,23 @@ void ble_log_spi_out_dump_all(void) } #endif // SPI_OUT_LE_AUDIO_ENABLED + +#if SPI_OUT_HOST_ENABLED + if (LOG_MODULE_INIT_FLAG(host)) { + esp_rom_printf("[HOST_LOG_DUMP_START:\n"); + spi_out_log_cb_dump(LOG_MODULE_CB(host)); + esp_rom_printf("\n:HOST_LOG_DUMP_END]\n\n"); + } +#endif // SPI_OUT_HOST_ENABLED + +#if SPI_OUT_HCI_ENABLED + if (LOG_MODULE_INIT_FLAG(hci)) { + esp_rom_printf("[HCI_LOG_DUMP_START:\n"); + spi_out_log_cb_dump(LOG_MODULE_CB(hci)); + esp_rom_printf("\n:HCI_LOG_DUMP_END]\n\n"); + } +#endif // SPI_OUT_HCI_ENABLED + portEXIT_CRITICAL_SAFE(&spinlock); } @@ -1278,4 +1267,53 @@ IRAM_ATTR void ble_log_spi_out_le_audio_write(const uint8_t *addr, uint16_t len) return; } #endif // CONFIG_BT_BLE_LOG_SPI_OUT_LE_AUDIO_ENABLED + +#if SPI_OUT_HOST_ENABLED +int ble_log_spi_out_host_write(uint8_t source, const char *prefix, const char *format, ...) +{ + if (!LOG_MODULE_INIT_FLAG(host) || !prefix || !format) { + return -1; + } + + // Copy prefix to string buffer + int prefix_len = strlen(prefix); + if (prefix_len >= SPI_OUT_LOG_STR_BUF_SIZE) { + return -1; + } + memcpy(LOG_MODULE_STR_BUF(host), prefix, prefix_len); + + // Write string buffer + va_list args; + va_start(args, format); + int total_len = spi_out_write_str(LOG_MODULE_STR_BUF(host), format, args, prefix_len); + va_end(args); + if (total_len == 0) { + return -1; + } + + // Write log control block buffer + spi_out_write_hex(LOG_MODULE_CB(host), source, + LOG_MODULE_STR_BUF(host), (uint16_t)total_len, true); + return 0; +} +#endif // SPI_OUT_HOST_ENABLED + +#if SPI_OUT_HCI_ENABLED +int ble_log_spi_out_hci_write(uint8_t source, const uint8_t *addr, uint16_t len) +{ + if (!LOG_MODULE_INIT_FLAG(hci)) { + return -1; + } + + if (source == BLE_LOG_SPI_OUT_SOURCE_HCI_UPSTREAM) { +#if SPI_OUT_LL_ENABLED + ble_log_spi_out_ll_write(len, addr, 0, NULL, BIT(LL_LOG_FLAG_HCI_UPSTREAM)); +#endif // SPI_OUT_LL_ENABLED + } + if (source == BLE_LOG_SPI_OUT_SOURCE_HCI_DOWNSTREAM) { + spi_out_write_hex(LOG_MODULE_CB(hci), source, addr, len, true); + } + return 0; +} +#endif // SPI_OUT_HCI_ENABLED #endif // CONFIG_BT_BLE_LOG_SPI_OUT_ENABLED diff --git a/components/bt/common/ble_log/include/ble_log/ble_log_spi_out.h b/components/bt/common/ble_log/include/ble_log/ble_log_spi_out.h index 3a4f8d9020a..30462fc72a6 100644 --- a/components/bt/common/ble_log/include/ble_log/ble_log_spi_out.h +++ b/components/bt/common/ble_log/include/ble_log/ble_log_spi_out.h @@ -33,15 +33,15 @@ enum { BLE_LOG_SPI_OUT_SOURCE_LOSS, }; -enum { - BLE_LOG_SPI_OUT_LEVEL_NONE = 0, - BLE_LOG_SPI_OUT_LEVEL_ERROR, - BLE_LOG_SPI_OUT_LEVEL_WARN, - BLE_LOG_SPI_OUT_LEVEL_INFO, - BLE_LOG_SPI_OUT_LEVEL_DEBUG, - BLE_LOG_SPI_OUT_LEVEL_VERBOSE, - BLE_LOG_SPI_OUT_LEVEL_MAX, -}; +#define BLE_LOG_SPI_OUT_LEVEL_NONE 0 +#define BLE_LOG_SPI_OUT_LEVEL_ERROR 1 +#define BLE_LOG_SPI_OUT_LEVEL_WARN 2 +#define BLE_LOG_SPI_OUT_LEVEL_INFO 3 +#define BLE_LOG_SPI_OUT_LEVEL_DEBUG 4 +#define BLE_LOG_SPI_OUT_LEVEL_VERBOSE 5 +#define BLE_LOG_SPI_OUT_STR(x) #x +#define BLE_LOG_SPI_OUT_XSTR(x) BLE_LOG_SPI_OUT_STR(x) +#define BLE_LOG_SPI_OUT_BUILD_PREFIX(LEVEL, TAG) "[" BLE_LOG_SPI_OUT_XSTR(LEVEL) "][" TAG "]" // Public functions int ble_log_spi_out_init(void); @@ -53,12 +53,11 @@ void ble_log_spi_out_ll_write(uint32_t len, const uint8_t *addr, uint32_t len_ap void ble_log_spi_out_ll_log_ev_proc(void); void ble_log_spi_out_ts_sync_start(void); void ble_log_spi_out_ts_sync_stop(void); -int ble_log_spi_out_printf(uint8_t source, const char *format, ...); -int ble_log_spi_out_printf_enh(uint8_t source, uint8_t level, const char *tag, const char *format, ...); -int ble_log_spi_out_write_with_ts(uint8_t source, const uint8_t *addr, uint16_t len); void ble_log_spi_out_dump_all(void); void ble_log_spi_out_enable(bool enable); void ble_log_spi_out_flush(void); void ble_log_spi_out_le_audio_write(const uint8_t *addr, uint16_t len); +int ble_log_spi_out_host_write(uint8_t source, const char *prefix, const char *format, ...); +int ble_log_spi_out_hci_write(uint8_t source, const uint8_t *addr, uint16_t len); #endif // __BT_SPI_OUT_H__ diff --git a/components/bt/host/bluedroid/api/esp_bluedroid_hci.c b/components/bt/host/bluedroid/api/esp_bluedroid_hci.c index 0e6baf11185..312639b6dd0 100644 --- a/components/bt/host/bluedroid/api/esp_bluedroid_hci.c +++ b/components/bt/host/bluedroid/api/esp_bluedroid_hci.c @@ -68,7 +68,7 @@ void hci_host_send_packet(uint8_t *data, uint16_t len) bt_hci_log_record_hci_data(data[0], &data[1], len - 1); #endif #if (BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER) - ble_log_spi_out_write_with_ts(BLE_LOG_SPI_OUT_SOURCE_HCI_DOWNSTREAM, data, len); + ble_log_spi_out_hci_write(BLE_LOG_SPI_OUT_SOURCE_HCI_DOWNSTREAM, data, len); #endif // (BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER) #if (BT_CONTROLLER_INCLUDED == TRUE) esp_vhci_host_send_packet(data, len); diff --git a/components/bt/host/bluedroid/common/include/common/bt_trace.h b/components/bt/host/bluedroid/common/include/common/bt_trace.h index 502d6543738..2ffaa8ea868 100644 --- a/components/bt/host/bluedroid/common/include/common/bt_trace.h +++ b/components/bt/host/bluedroid/common/include/common/bt_trace.h @@ -231,12 +231,14 @@ static inline void trc_dump_buffer(const char *prefix, uint8_t *data, uint16_t l } #define BTM_TRACE_API(fmt, args...) { \ - ble_log_spi_out_printf_enh(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, BLE_LOG_SPI_OUT_LEVEL_INFO, "BT_BTM", fmt, ## args); \ + ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \ + BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_INFO, "BT_BTM"), fmt, ## args); \ if (btm_cb.trace_level >= BT_TRACE_LEVEL_API && BT_LOG_LEVEL_CHECK(BTM, API)) BT_PRINT_I("BT_BTM", fmt, ## args); \ } #define BTM_TRACE_EVENT(fmt, args...) { \ - ble_log_spi_out_printf_enh(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, BLE_LOG_SPI_OUT_LEVEL_DEBUG, "BT_BTM", fmt, ## args); \ + ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \ + BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_DEBUG, "BT_BTM"), fmt, ## args); \ if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT && BT_LOG_LEVEL_CHECK(BTM, EVENT)) BT_PRINT_D("BT_BTM", fmt, ## args); \ } @@ -267,7 +269,8 @@ static inline void trc_dump_buffer(const char *prefix, uint8_t *data, uint16_t l } #define L2CAP_TRACE_API(fmt, args...) { \ - ble_log_spi_out_printf_enh(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, BLE_LOG_SPI_OUT_LEVEL_INFO, "BT_L2CAP", fmt, ## args); \ + ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \ + BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_INFO, "BT_L2CAP"), fmt, ## args); \ if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API && BT_LOG_LEVEL_CHECK(L2CAP, API)) BT_PRINT_I("BT_L2CAP", fmt, ## args); \ } @@ -318,7 +321,8 @@ static inline void trc_dump_buffer(const char *prefix, uint8_t *data, uint16_t l } #define GAP_TRACE_API(fmt, args...) { \ - ble_log_spi_out_printf_enh(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, BLE_LOG_SPI_OUT_LEVEL_INFO, "BT_GAP", fmt, ## args); \ + ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \ + BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_INFO, "BT_GAP"), fmt, ## args); \ if (gap_cb.trace_level >= BT_TRACE_LEVEL_API && BT_LOG_LEVEL_CHECK(GAP, API)) BT_PRINT_I("BT_GAP", fmt, ## args); \ } @@ -441,7 +445,8 @@ static inline void trc_dump_buffer(const char *prefix, uint8_t *data, uint16_t l } #define GATT_TRACE_API(fmt, args...) { \ - ble_log_spi_out_printf_enh(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, BLE_LOG_SPI_OUT_LEVEL_INFO, "BT_GATT", fmt, ## args); \ + ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \ + BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_INFO, "BT_GATT"), fmt, ## args); \ if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API && BT_LOG_LEVEL_CHECK(GATT, API)) BT_PRINT_I("BT_GATT", fmt, ## args); \ } @@ -476,7 +481,8 @@ static inline void trc_dump_buffer(const char *prefix, uint8_t *data, uint16_t l } #define SMP_TRACE_API(fmt, args...) { \ - ble_log_spi_out_printf_enh(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, BLE_LOG_SPI_OUT_LEVEL_INFO, "BT_SMP", fmt, ## args); \ + ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \ + BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_INFO, "BT_SMP"), fmt, ## args); \ if (smp_cb.trace_level >= BT_TRACE_LEVEL_API && BT_LOG_LEVEL_CHECK(SMP, API)) BT_PRINT_I("BT_SMP", fmt, ## args); \ } diff --git a/components/bt/host/bluedroid/hci/hci_hal_h4.c b/components/bt/host/bluedroid/hci/hci_hal_h4.c index 1dcdf67d322..2b61ee2e602 100644 --- a/components/bt/host/bluedroid/hci/hci_hal_h4.c +++ b/components/bt/host/bluedroid/hci/hci_hal_h4.c @@ -601,7 +601,7 @@ void bt_record_hci_data(uint8_t *data, uint16_t len) static int host_recv_pkt_cb(uint8_t *data, uint16_t len) { #if (BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER) - ble_log_spi_out_write_with_ts(BLE_LOG_SPI_OUT_SOURCE_HCI_UPSTREAM, data, len); + ble_log_spi_out_hci_write(BLE_LOG_SPI_OUT_SOURCE_HCI_UPSTREAM, data, len); #endif // (BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER) //Target has packet to host, malloc new buffer for packet BT_HDR *pkt = NULL; diff --git a/components/bt/host/nimble/esp-hci/src/esp_nimble_hci.c b/components/bt/host/nimble/esp-hci/src/esp_nimble_hci.c index b5565539479..6a5dacd1a73 100644 --- a/components/bt/host/nimble/esp-hci/src/esp_nimble_hci.c +++ b/components/bt/host/nimble/esp-hci/src/esp_nimble_hci.c @@ -73,7 +73,7 @@ void esp_vhci_host_send_packet_wrapper(uint8_t *data, uint16_t len) bt_hci_log_record_hci_data(data[0], &data[1], len - 1); #endif #if (CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER) - ble_log_spi_out_write_with_ts(BLE_LOG_SPI_OUT_SOURCE_HCI_DOWNSTREAM, data, len); + ble_log_spi_out_hci_write(BLE_LOG_SPI_OUT_SOURCE_HCI_DOWNSTREAM, data, len); #endif // (CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER) esp_vhci_host_send_packet(data, len); } @@ -232,7 +232,7 @@ static int dummy_host_rcv_pkt(uint8_t *data, uint16_t len) static int host_rcv_pkt(uint8_t *data, uint16_t len) { #if (CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER) - ble_log_spi_out_write_with_ts(BLE_LOG_SPI_OUT_SOURCE_HCI_UPSTREAM, data, len); + ble_log_spi_out_hci_write(BLE_LOG_SPI_OUT_SOURCE_HCI_UPSTREAM, data, len); #endif // (CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER) bt_record_hci_data(data, len); From 2351e02b21824ce40b2ef5218c4c6319c7848228 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Tue, 8 Jul 2025 13:15:12 +0800 Subject: [PATCH 160/213] feat(ble): support ble mesh log module (cherry picked from commit 066e1d3f1b155e14942c7bfab36147c7b5b60d93) Co-authored-by: Zhou Xiao --- components/bt/common/Kconfig.in | 15 ++++ .../bt/common/ble_log/ble_log_spi_out.c | 72 ++++++++++++++++++- .../ble_log/include/ble_log/ble_log_spi_out.h | 2 + 3 files changed, 88 insertions(+), 1 deletion(-) diff --git a/components/bt/common/Kconfig.in b/components/bt/common/Kconfig.in index fa2824e3dc2..f6402de87e3 100644 --- a/components/bt/common/Kconfig.in +++ b/components/bt/common/Kconfig.in @@ -154,3 +154,18 @@ config BT_BLE_LOG_SPI_OUT_LE_AUDIO_BUF_SIZE help SPI transaction buffer size for LE Audio logs. There will be 2 SPI DMA buffers with the same size. + +config BT_BLE_LOG_SPI_OUT_MESH_ENABLED + bool "Enable BLE mesh log output to SPI" + depends on BT_BLE_LOG_SPI_OUT_ENABLED + default n + help + Enable BLE mesh log output to SPI + +config BT_BLE_LOG_SPI_OUT_MESH_BUF_SIZE + int "SPI transaction buffer size for BLE mesh logs" + depends on BT_BLE_LOG_SPI_OUT_MESH_ENABLED + default 1024 + help + SPI transaction buffer size for BLE mesh logs. + There will be 2 SPI DMA buffers with the same size. diff --git a/components/bt/common/ble_log/ble_log_spi_out.c b/components/bt/common/ble_log/ble_log_spi_out.c index 5731f851f06..2b5a5f95eab 100644 --- a/components/bt/common/ble_log/ble_log_spi_out.c +++ b/components/bt/common/ble_log/ble_log_spi_out.c @@ -30,6 +30,8 @@ #define SPI_OUT_HOST_BUF_SIZE CONFIG_BT_BLE_LOG_SPI_OUT_HOST_BUF_SIZE #define SPI_OUT_HCI_ENABLED CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED #define SPI_OUT_HCI_BUF_SIZE CONFIG_BT_BLE_LOG_SPI_OUT_HCI_BUF_SIZE +#define SPI_OUT_MESH_ENABLED CONFIG_BT_BLE_LOG_SPI_OUT_MESH_ENABLED +#define SPI_OUT_MESH_BUF_SIZE CONFIG_BT_BLE_LOG_SPI_OUT_MESH_BUF_SIZE // Private defines #define BLE_LOG_TAG "BLE_LOG" @@ -76,11 +78,18 @@ #define SPI_OUT_HCI_QUEUE_SIZE (0) #endif // SPI_OUT_HCI_ENABLED +#if SPI_OUT_MESH_ENABLED +#define SPI_OUT_MESH_QUEUE_SIZE (SPI_OUT_PING_PONG_BUF_CNT) +#else +#define SPI_OUT_MESH_QUEUE_SIZE (0) +#endif // SPI_OUT_MESH_ENABLED + #define SPI_OUT_SPI_MASTER_QUEUE_SIZE (SPI_OUT_UL_QUEUE_SIZE +\ SPI_OUT_LL_QUEUE_SIZE +\ SPI_OUT_LE_AUDIO_QUEUE_SIZE +\ SPI_OUT_HOST_QUEUE_SIZE +\ - SPI_OUT_HCI_QUEUE_SIZE) + SPI_OUT_HCI_QUEUE_SIZE +\ + SPI_OUT_MESH_QUEUE_SIZE) // Private typedefs typedef struct { @@ -134,6 +143,7 @@ enum { LOG_CB_TYPE_LE_AUDIO, LOG_CB_TYPE_HOST, LOG_CB_TYPE_HCI, + LOG_CB_TYPE_MESH, }; enum { @@ -342,6 +352,10 @@ DECLARE_LOG_MODULE(host, LOG_CB_TYPE_HOST, SPI_OUT_HOST_BUF_SIZE, 0, 1) DECLARE_LOG_MODULE(hci, LOG_CB_TYPE_HCI, SPI_OUT_HCI_BUF_SIZE, 0, 0) #endif // SPI_OUT_HCI_ENABLED +#if SPI_OUT_MESH_ENABLED +DECLARE_LOG_MODULE(mesh, LOG_CB_TYPE_MESH, SPI_OUT_MESH_BUF_SIZE, 0, 1) +#endif // SPI_OUT_MESH_ENABLED + // Private functions static int spi_out_init_trans(spi_out_trans_cb_t **trans_cb, uint16_t buf_size) { @@ -617,6 +631,10 @@ static void spi_out_log_flush(void) #if SPI_OUT_HCI_ENABLED LOG_MODULE_FLUSH(hci)(); #endif // SPI_OUT_HCI_ENABLED + +#if SPI_OUT_MESH_ENABLED + LOG_MODULE_FLUSH(mesh)(); +#endif // SPI_OUT_MESH_ENABLED } #if SPI_OUT_FLUSH_TIMER_ENABLED @@ -942,6 +960,12 @@ int ble_log_spi_out_init(void) } #endif // SPI_OUT_HCI_ENABLED +#if SPI_OUT_MESH_ENABLED + if (LOG_MODULE_INIT(mesh)() != 0) { + goto mesh_init_failed; + } +#endif // SPI_OUT_MESH_ENABLED + #if SPI_OUT_FLUSH_TIMER_ENABLED esp_timer_create_args_t timer_args = { .callback = (esp_timer_cb_t)esp_timer_cb_log_flush, @@ -966,6 +990,10 @@ int ble_log_spi_out_init(void) #if SPI_OUT_FLUSH_TIMER_ENABLED timer_init_failed: #endif // SPI_OUT_FLUSH_TIMER_ENABLED +#if SPI_OUT_MESH_ENABLED + LOG_MODULE_DEINIT(mesh)(); +mesh_init_failed: +#endif // SPI_OUT_MESH_ENABLED #if SPI_OUT_HCI_ENABLED LOG_MODULE_DEINIT(hci)(); hci_init_failed: @@ -1026,6 +1054,10 @@ void ble_log_spi_out_deinit(void) spi_out_ts_sync_deinit(); #endif // SPI_OUT_TS_SYNC_ENABLED +#if SPI_OUT_MESH_ENABLED + LOG_MODULE_DEINIT(mesh)(); +#endif // SPI_OUT_MESH_ENABLED + #if SPI_OUT_HCI_ENABLED LOG_MODULE_DEINIT(hci)(); #endif // SPI_OUT_HCI_ENABLED @@ -1221,6 +1253,14 @@ void ble_log_spi_out_dump_all(void) } #endif // SPI_OUT_HCI_ENABLED +#if SPI_OUT_MESH_ENABLED + if (LOG_MODULE_INIT_FLAG(mesh)) { + esp_rom_printf("[MESH_LOG_DUMP_START:\n"); + spi_out_log_cb_dump(LOG_MODULE_CB(mesh)); + esp_rom_printf("\n:MESH_LOG_DUMP_END]\n\n"); + } +#endif // SPI_OUT_MESH_ENABLED + portEXIT_CRITICAL_SAFE(&spinlock); } @@ -1316,4 +1356,34 @@ int ble_log_spi_out_hci_write(uint8_t source, const uint8_t *addr, uint16_t len) return 0; } #endif // SPI_OUT_HCI_ENABLED + +#if SPI_OUT_MESH_ENABLED +int ble_log_spi_out_mesh_write(const char *prefix, const char *format, ...) +{ + if (!LOG_MODULE_INIT_FLAG(mesh) || !prefix || !format) { + return -1; + } + + // Copy prefix to string buffer + int prefix_len = strlen(prefix); + if (prefix_len >= SPI_OUT_LOG_STR_BUF_SIZE) { + return -1; + } + memcpy(LOG_MODULE_STR_BUF(mesh), prefix, prefix_len); + + // Write string buffer + va_list args; + va_start(args, format); + int total_len = spi_out_write_str(LOG_MODULE_STR_BUF(mesh), format, args, prefix_len); + va_end(args); + if (total_len == 0) { + return -1; + } + + // Write log control block buffer + spi_out_write_hex(LOG_MODULE_CB(mesh), BLE_LOG_SPI_OUT_SOURCE_MESH, + LOG_MODULE_STR_BUF(mesh), (uint16_t)total_len, true); + return 0; +} +#endif // SPI_OUT_MESH_ENABLED #endif // CONFIG_BT_BLE_LOG_SPI_OUT_ENABLED diff --git a/components/bt/common/ble_log/include/ble_log/ble_log_spi_out.h b/components/bt/common/ble_log/include/ble_log/ble_log_spi_out.h index 30462fc72a6..b62986a0bd6 100644 --- a/components/bt/common/ble_log/include/ble_log/ble_log_spi_out.h +++ b/components/bt/common/ble_log/include/ble_log/ble_log_spi_out.h @@ -27,6 +27,7 @@ enum { BLE_LOG_SPI_OUT_SOURCE_ESP_LEGACY_ISR, BLE_LOG_SPI_OUT_SOURCE_LL_HCI, BLE_LOG_SPI_OUT_SOURCE_LE_AUDIO, + BLE_LOG_SPI_OUT_SOURCE_MESH, BLE_LOG_SPI_OUT_SOURCE_USER = 0x10, BLE_LOG_SPI_OUT_SOURCE_SSC = 0xFD, BLE_LOG_SPI_OUT_SOURCE_SYNC, @@ -59,5 +60,6 @@ void ble_log_spi_out_flush(void); void ble_log_spi_out_le_audio_write(const uint8_t *addr, uint16_t len); int ble_log_spi_out_host_write(uint8_t source, const char *prefix, const char *format, ...); int ble_log_spi_out_hci_write(uint8_t source, const uint8_t *addr, uint16_t len); +int ble_log_spi_out_mesh_write(const char *prefix, const char *format, ...); #endif // __BT_SPI_OUT_H__ From 275047b4767f1ad9c741334fbbaadbf57a90e33d Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Tue, 8 Jul 2025 13:15:15 +0800 Subject: [PATCH 161/213] change(ble): enable bluedroid logs over debug level through spi output (cherry picked from commit c0d2792b9d72fd6fd0db626c726208d9b5f833f8) Co-authored-by: Zhou Xiao --- .../common/include/common/bt_trace.h | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/components/bt/host/bluedroid/common/include/common/bt_trace.h b/components/bt/host/bluedroid/common/include/common/bt_trace.h index 2ffaa8ea868..58435d8f6ae 100644 --- a/components/bt/host/bluedroid/common/include/common/bt_trace.h +++ b/components/bt/host/bluedroid/common/include/common/bt_trace.h @@ -223,10 +223,14 @@ static inline void trc_dump_buffer(const char *prefix, uint8_t *data, uint16_t l #if (BT_BLE_LOG_SPI_OUT_HOST_ENABLED && !CLASSIC_BT_INCLUDED) #define BTM_TRACE_ERROR(fmt, args...) { \ + ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \ + BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_ERROR, "BT_BTM"), fmt, ## args); \ if (btm_cb.trace_level >= BT_TRACE_LEVEL_ERROR && BT_LOG_LEVEL_CHECK(BTM, ERROR)) BT_PRINT_E("BT_BTM", fmt, ## args); \ } #define BTM_TRACE_WARNING(fmt, args...) { \ + ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \ + BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_WARN, "BT_BTM"), fmt, ## args); \ if (btm_cb.trace_level >= BT_TRACE_LEVEL_WARNING && BT_LOG_LEVEL_CHECK(BTM, WARNING)) BT_PRINT_W("BT_BTM", fmt, ## args); \ } @@ -261,10 +265,14 @@ static inline void trc_dump_buffer(const char *prefix, uint8_t *data, uint16_t l #if (BT_BLE_LOG_SPI_OUT_HOST_ENABLED && !CLASSIC_BT_INCLUDED) #define L2CAP_TRACE_ERROR(fmt, args...) { \ + ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \ + BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_ERROR, "BT_L2CAP"), fmt, ## args); \ if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_ERROR && BT_LOG_LEVEL_CHECK(L2CAP, ERROR)) BT_PRINT_E("BT_L2CAP", fmt, ## args); \ } #define L2CAP_TRACE_WARNING(fmt, args...) { \ + ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \ + BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_WARN, "BT_L2CAP"), fmt, ## args); \ if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_WARNING && BT_LOG_LEVEL_CHECK(L2CAP, WARNING)) BT_PRINT_W("BT_L2CAP", fmt, ## args); \ } @@ -275,6 +283,8 @@ static inline void trc_dump_buffer(const char *prefix, uint8_t *data, uint16_t l } #define L2CAP_TRACE_EVENT(fmt, args...) { \ + ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \ + BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_DEBUG, "BT_L2CAP"), fmt, ## args); \ if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_EVENT && BT_LOG_LEVEL_CHECK(L2CAP, EVENT)) BT_PRINT_D("BT_L2CAP", fmt, ## args); \ } @@ -313,10 +323,14 @@ static inline void trc_dump_buffer(const char *prefix, uint8_t *data, uint16_t l #if (BT_BLE_LOG_SPI_OUT_HOST_ENABLED && !CLASSIC_BT_INCLUDED) #define GAP_TRACE_ERROR(fmt, args...) { \ + ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \ + BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_ERROR, "BT_GAP"), fmt, ## args); \ if (gap_cb.trace_level >= BT_TRACE_LEVEL_ERROR && BT_LOG_LEVEL_CHECK(GAP, ERROR)) BT_PRINT_E("BT_GAP", fmt, ## args); \ } #define GAP_TRACE_WARNING(fmt, args...) { \ + ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \ + BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_WARN, "BT_GAP"), fmt, ## args); \ if (gap_cb.trace_level >= BT_TRACE_LEVEL_WARNING && BT_LOG_LEVEL_CHECK(GAP, WARNING)) BT_PRINT_W("BT_GAP", fmt, ## args); \ } @@ -327,6 +341,8 @@ static inline void trc_dump_buffer(const char *prefix, uint8_t *data, uint16_t l } #define GAP_TRACE_EVENT(fmt, args...) { \ + ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \ + BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_DEBUG, "BT_GAP"), fmt, ## args); \ if (gap_cb.trace_level >= BT_TRACE_LEVEL_EVENT && BT_LOG_LEVEL_CHECK(GAP, EVENT)) BT_PRINT_D("BT_GAP", fmt, ## args); \ } @@ -437,10 +453,14 @@ static inline void trc_dump_buffer(const char *prefix, uint8_t *data, uint16_t l #if (BT_BLE_LOG_SPI_OUT_HOST_ENABLED && !CLASSIC_BT_INCLUDED) #define GATT_TRACE_ERROR(fmt, args...) { \ + ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \ + BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_ERROR, "BT_GATT"), fmt, ## args); \ if (gatt_cb.trace_level >= BT_TRACE_LEVEL_ERROR && BT_LOG_LEVEL_CHECK(GATT, ERROR)) BT_PRINT_E("BT_GATT", fmt, ## args); \ } #define GATT_TRACE_WARNING(fmt, args...) { \ + ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \ + BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_WARN, "BT_GATT"), fmt, ## args); \ if (gatt_cb.trace_level >= BT_TRACE_LEVEL_WARNING && BT_LOG_LEVEL_CHECK(GATT, WARNING)) BT_PRINT_W("BT_GATT", fmt, ## args); \ } @@ -451,6 +471,8 @@ static inline void trc_dump_buffer(const char *prefix, uint8_t *data, uint16_t l } #define GATT_TRACE_EVENT(fmt, args...) { \ + ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \ + BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_DEBUG, "BT_GATT"), fmt, ## args); \ if (gatt_cb.trace_level >= BT_TRACE_LEVEL_EVENT && BT_LOG_LEVEL_CHECK(GATT, EVENT)) BT_PRINT_D("BT_GATT", fmt, ## args); \ } @@ -473,10 +495,14 @@ static inline void trc_dump_buffer(const char *prefix, uint8_t *data, uint16_t l #if (BT_BLE_LOG_SPI_OUT_HOST_ENABLED && !CLASSIC_BT_INCLUDED) #define SMP_TRACE_ERROR(fmt, args...) { \ + ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \ + BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_ERROR, "BT_SMP"), fmt, ## args); \ if (smp_cb.trace_level >= BT_TRACE_LEVEL_ERROR && BT_LOG_LEVEL_CHECK(SMP, ERROR)) BT_PRINT_E("BT_SMP", fmt, ## args); \ } #define SMP_TRACE_WARNING(fmt, args...) { \ + ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \ + BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_WARN, "BT_SMP"), fmt, ## args); \ if (smp_cb.trace_level >= BT_TRACE_LEVEL_WARNING && BT_LOG_LEVEL_CHECK(SMP, WARNING)) BT_PRINT_W("BT_SMP", fmt, ## args); \ } @@ -487,6 +513,8 @@ static inline void trc_dump_buffer(const char *prefix, uint8_t *data, uint16_t l } #define SMP_TRACE_EVENT(fmt, args...) { \ + ble_log_spi_out_host_write(BLE_LOG_SPI_OUT_SOURCE_BLUEDROID, \ + BLE_LOG_SPI_OUT_BUILD_PREFIX(BLE_LOG_SPI_OUT_LEVEL_DEBUG, "BT_SMP"), fmt, ## args); \ if (smp_cb.trace_level >= BT_TRACE_LEVEL_EVENT && BT_LOG_LEVEL_CHECK(SMP, EVENT)) BT_PRINT_D("BT_SMP", fmt, ## args); \ } From b58dbc325f0cec48f80b8e70a93ae03e2468ab02 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Tue, 8 Jul 2025 13:15:17 +0800 Subject: [PATCH 162/213] change(ble): enable hci log spi out for ESP chips (cherry picked from commit c60dd1a10ed89cacf6e5bf703bf63b94f20f9cb9) Co-authored-by: Zhou Xiao --- components/bt/host/bluedroid/api/esp_bluedroid_hci.c | 4 ++-- components/bt/host/bluedroid/hci/hci_hal_h4.c | 4 ++-- components/bt/host/nimble/esp-hci/src/esp_nimble_hci.c | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/components/bt/host/bluedroid/api/esp_bluedroid_hci.c b/components/bt/host/bluedroid/api/esp_bluedroid_hci.c index 312639b6dd0..ac64d17d049 100644 --- a/components/bt/host/bluedroid/api/esp_bluedroid_hci.c +++ b/components/bt/host/bluedroid/api/esp_bluedroid_hci.c @@ -67,9 +67,9 @@ void hci_host_send_packet(uint8_t *data, uint16_t len) #if (BT_HCI_LOG_INCLUDED == TRUE) bt_hci_log_record_hci_data(data[0], &data[1], len - 1); #endif -#if (BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER) +#if CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED ble_log_spi_out_hci_write(BLE_LOG_SPI_OUT_SOURCE_HCI_DOWNSTREAM, data, len); -#endif // (BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER) +#endif // CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED #if (BT_CONTROLLER_INCLUDED == TRUE) esp_vhci_host_send_packet(data, len); #else /* BT_CONTROLLER_INCLUDED == TRUE */ diff --git a/components/bt/host/bluedroid/hci/hci_hal_h4.c b/components/bt/host/bluedroid/hci/hci_hal_h4.c index 2b61ee2e602..ef874844eda 100644 --- a/components/bt/host/bluedroid/hci/hci_hal_h4.c +++ b/components/bt/host/bluedroid/hci/hci_hal_h4.c @@ -600,9 +600,9 @@ void bt_record_hci_data(uint8_t *data, uint16_t len) static int host_recv_pkt_cb(uint8_t *data, uint16_t len) { -#if (BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER) +#if CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED ble_log_spi_out_hci_write(BLE_LOG_SPI_OUT_SOURCE_HCI_UPSTREAM, data, len); -#endif // (BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER) +#endif // CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED //Target has packet to host, malloc new buffer for packet BT_HDR *pkt = NULL; #if (BLE_42_SCAN_EN == TRUE) diff --git a/components/bt/host/nimble/esp-hci/src/esp_nimble_hci.c b/components/bt/host/nimble/esp-hci/src/esp_nimble_hci.c index 6a5dacd1a73..4a001777b03 100644 --- a/components/bt/host/nimble/esp-hci/src/esp_nimble_hci.c +++ b/components/bt/host/nimble/esp-hci/src/esp_nimble_hci.c @@ -72,9 +72,9 @@ void esp_vhci_host_send_packet_wrapper(uint8_t *data, uint16_t len) #if (BT_HCI_LOG_INCLUDED == TRUE) bt_hci_log_record_hci_data(data[0], &data[1], len - 1); #endif -#if (CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER) +#if CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED ble_log_spi_out_hci_write(BLE_LOG_SPI_OUT_SOURCE_HCI_DOWNSTREAM, data, len); -#endif // (CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER) +#endif // CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED esp_vhci_host_send_packet(data, len); } @@ -231,9 +231,9 @@ static int dummy_host_rcv_pkt(uint8_t *data, uint16_t len) */ static int host_rcv_pkt(uint8_t *data, uint16_t len) { -#if (CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER) +#if CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED ble_log_spi_out_hci_write(BLE_LOG_SPI_OUT_SOURCE_HCI_UPSTREAM, data, len); -#endif // (CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER) +#endif // CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED bt_record_hci_data(data, len); From 6dc7c032d179e89bccb2a4e72231a8e68ddc15ca Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Tue, 8 Jul 2025 13:15:19 +0800 Subject: [PATCH 163/213] change(ble): removed esp log to save code size (cherry picked from commit 0088541f543158ff1fc7b6173f004a90efd4042f) Co-authored-by: Zhou Xiao --- components/bt/common/ble_log/ble_log_spi_out.c | 15 --------------- .../ble_log/include/ble_log/ble_log_spi_out.h | 1 - 2 files changed, 16 deletions(-) diff --git a/components/bt/common/ble_log/ble_log_spi_out.c b/components/bt/common/ble_log/ble_log_spi_out.c index 2b5a5f95eab..7bc5d269518 100644 --- a/components/bt/common/ble_log/ble_log_spi_out.c +++ b/components/bt/common/ble_log/ble_log_spi_out.c @@ -441,7 +441,6 @@ static int spi_out_log_cb_init(spi_out_log_cb_t **log_cb, uint16_t buf_size, uin // Initialize log control block *log_cb = (spi_out_log_cb_t *)SPI_OUT_MALLOC(sizeof(spi_out_log_cb_t)); if (!(*log_cb)) { - ESP_LOGE(BLE_LOG_TAG, "Failed to initialize log control block!"); return -1; } memset(*log_cb, 0, sizeof(spi_out_log_cb_t)); @@ -452,7 +451,6 @@ static int spi_out_log_cb_init(spi_out_log_cb_t **log_cb, uint16_t buf_size, uin ret |= spi_out_init_trans(&((*log_cb)->trans_cb[i]), buf_size); } if (ret != 0) { - ESP_LOGE(BLE_LOG_TAG, "Failed to initialize SPI transactions!"); spi_out_log_cb_deinit(log_cb); return -1; } @@ -690,20 +688,16 @@ static int spi_out_ll_log_init(void) // Initialize log control blocks for controller task & ISR logs if (spi_out_log_cb_init(&ll_task_log_cb, SPI_OUT_LL_TASK_BUF_SIZE, LOG_CB_TYPE_LL_TASK) != 0) { - ESP_LOGE(BLE_LOG_TAG, "Failed to initialize log control blocks for controller task!"); goto task_log_cb_init_failed; } if (spi_out_log_cb_init(&ll_isr_log_cb, SPI_OUT_LL_ISR_BUF_SIZE, LOG_CB_TYPE_LL_ISR) != 0) { - ESP_LOGE(BLE_LOG_TAG, "Failed to initialize log control blocks for controller ISR!"); goto isr_log_cb_init_failed; } if (spi_out_log_cb_init(&ll_hci_log_cb, SPI_OUT_LL_HCI_BUF_SIZE, LOG_CB_TYPE_LL_HCI) != 0) { - ESP_LOGE(BLE_LOG_TAG, "Failed to initialize log control blocks for controller ISR!"); goto hci_log_cb_init_failed; } // Initialization done - ESP_LOGI(BLE_LOG_TAG, "Succeeded to initialize log control blocks for controller task & ISR!"); ll_log_inited = true; return 0; @@ -726,7 +720,6 @@ static void spi_out_ll_log_deinit(void) spi_out_log_cb_deinit(&ll_task_log_cb); // Deinitialization done - ESP_LOGI(BLE_LOG_TAG, "Succeeded to deinitialize controller log!"); ll_log_inited = false; return; } @@ -769,7 +762,6 @@ static int spi_out_ts_sync_init(void) .dispatch_method = ESP_TIMER_TASK }; if (esp_timer_create(&timer_args, &ts_sync_timer) != ESP_OK) { - ESP_LOGE(BLE_LOG_TAG, "Failed to initialize timestamp synchronizer timer!"); goto timer_init_failed; } #endif // !SPI_OUT_TS_SYNC_SLEEP_SUPPORT @@ -783,12 +775,10 @@ static int spi_out_ts_sync_init(void) .pull_up_en = 0 }; if (gpio_config(&io_conf) != ESP_OK) { - ESP_LOGE(BLE_LOG_TAG, "Failed to initialize timestamp synchronizer IO!"); goto gpio_init_failed; } // Initialization done - ESP_LOGI(BLE_LOG_TAG, "Succeeded to initialize timestamp synchronizer!"); ts_sync_inited = true; return 0; @@ -819,7 +809,6 @@ static void spi_out_ts_sync_deinit(void) gpio_reset_pin(SPI_OUT_SYNC_IO_NUM); // Deinitialization done - ESP_LOGI(BLE_LOG_TAG, "Succeeded to deinitialize timestamp synchronizer!"); ts_sync_inited = false; return; } @@ -918,11 +907,9 @@ int ble_log_spi_out_init(void) .flags = SPI_DEVICE_NO_RETURN_RESULT }; if (spi_bus_initialize(SPI_OUT_BUS, &bus_config, SPI_DMA_CH_AUTO) != ESP_OK) { - ESP_LOGE(BLE_LOG_TAG, "Failed to initialize SPI bus!"); goto spi_bus_init_failed; } if (spi_bus_add_device(SPI_OUT_BUS, &dev_config, &spi_handle) != ESP_OK) { - ESP_LOGE(BLE_LOG_TAG, "Failed to add device to SPI bus!"); goto spi_device_add_failed; } @@ -972,13 +959,11 @@ int ble_log_spi_out_init(void) .dispatch_method = ESP_TIMER_TASK }; if (esp_timer_create(&timer_args, &flush_timer) != ESP_OK) { - ESP_LOGE(BLE_LOG_TAG, "Failed to initialize flush timer!"); goto timer_init_failed; } #endif // SPI_OUT_FLUSH_TIMER_ENABLED // Initialization done - ESP_LOGI(BLE_LOG_TAG, "Succeeded to initialize BLE log SPI output interface!"); spi_out_inited = true; spi_out_enabled = true; diff --git a/components/bt/common/ble_log/include/ble_log/ble_log_spi_out.h b/components/bt/common/ble_log/include/ble_log/ble_log_spi_out.h index b62986a0bd6..e0d9213dcea 100644 --- a/components/bt/common/ble_log/include/ble_log/ble_log_spi_out.h +++ b/components/bt/common/ble_log/include/ble_log/ble_log_spi_out.h @@ -11,7 +11,6 @@ #include "driver/spi_master.h" #include "driver/gpio.h" #include "esp_timer.h" -#include "esp_log.h" #include "freertos/semphr.h" #include "esp_heap_caps.h" From 2dacf4bb865a2c28b6eaab8c319ea22ef4b5f935 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Tue, 8 Jul 2025 13:15:21 +0800 Subject: [PATCH 164/213] fix(ble): fixed controller log api call for ESP32-C3/ESP32-S3 (cherry picked from commit 6ac541aa4ac53a6be0ba4e1cc57024f2b88a04a7) Co-authored-by: Zhou Xiao --- components/bt/controller/esp32c3/Kconfig.in | 1 + components/bt/controller/esp32c3/bt.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/components/bt/controller/esp32c3/Kconfig.in b/components/bt/controller/esp32c3/Kconfig.in index 8ec833c8cc5..da1793dd8e0 100644 --- a/components/bt/controller/esp32c3/Kconfig.in +++ b/components/bt/controller/esp32c3/Kconfig.in @@ -597,6 +597,7 @@ menu "Controller debug log Options (Experimental)" depends on BT_CTRL_LE_LOG_EN depends on !BT_CTRL_LE_LOG_DUMP_ONLY select BT_BLE_LOG_SPI_OUT_ENABLED + select BT_BLE_LOG_SPI_OUT_LL_ENABLED default n help Output ble controller logs to SPI bus diff --git a/components/bt/controller/esp32c3/bt.c b/components/bt/controller/esp32c3/bt.c index dc7cd3e950d..aad745f30fd 100644 --- a/components/bt/controller/esp32c3/bt.c +++ b/components/bt/controller/esp32c3/bt.c @@ -552,7 +552,7 @@ static void esp_bt_controller_log_interface(uint32_t len, const uint8_t *addr, b #if CONFIG_BT_CTRL_LE_LOG_SPI_OUT_EN static IRAM_ATTR void esp_bt_controller_spi_log_interface(uint32_t len, const uint8_t *addr, bool end) { - ble_log_spi_out_write(BLE_LOG_SPI_OUT_SOURCE_ESP_LEGACY, addr, len); + ble_log_spi_out_ll_write(len, addr, 0, NULL, 0); } #endif // CONFIG_BT_CTRL_LE_LOG_SPI_OUT_EN From deebad0bbedfc91b721273d1859074aeeb038573 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Tue, 8 Jul 2025 13:15:24 +0800 Subject: [PATCH 165/213] fix(ble): update error code in controller init for ESP32-S3/ESP32-C3 (cherry picked from commit b8b7e153a70e03e42d82f4a7c80bd84706378563) Co-authored-by: Zhou Xiao --- components/bt/controller/esp32c3/bt.c | 1 + 1 file changed, 1 insertion(+) diff --git a/components/bt/controller/esp32c3/bt.c b/components/bt/controller/esp32c3/bt.c index aad745f30fd..a0e31c15def 100644 --- a/components/bt/controller/esp32c3/bt.c +++ b/components/bt/controller/esp32c3/bt.c @@ -1810,6 +1810,7 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) #if CONFIG_BT_BLE_LOG_SPI_OUT_ENABLED if (ble_log_spi_out_init() != 0) { ESP_LOGE(BT_LOG_TAG, "BLE Log SPI output init failed"); + err = ESP_ERR_NO_MEM; goto error; } #endif // CONFIG_BT_BLE_LOG_SPI_OUT_ENABLED From ba406e871e6658588b37f80df1f2fff756081252 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Tue, 8 Jul 2025 13:15:26 +0800 Subject: [PATCH 166/213] change(ble): support task buffer number configuration (cherry picked from commit 4946a1fe8dd140218e20715763f94cd98980222d) Co-authored-by: Zhou Xiao --- components/bt/common/Kconfig.in | 28 ++ .../bt/common/ble_log/ble_log_spi_out.c | 269 ++++++++++++------ 2 files changed, 214 insertions(+), 83 deletions(-) diff --git a/components/bt/common/Kconfig.in b/components/bt/common/Kconfig.in index f6402de87e3..5202f53e9e1 100644 --- a/components/bt/common/Kconfig.in +++ b/components/bt/common/Kconfig.in @@ -35,6 +35,13 @@ config BT_BLE_LOG_SPI_OUT_HCI_BUF_SIZE SPI transaction buffer size for HCI logs. There will be 2 SPI DMA buffers with the same size. +config BT_BLE_LOG_SPI_OUT_HCI_TASK_CNT + int "HCI task count" + depends on BT_BLE_LOG_SPI_OUT_HCI_ENABLED + default 1 + help + HCI task count + config BT_BLE_LOG_SPI_OUT_HOST_ENABLED bool "Enable Host log output to SPI" depends on BT_BLE_LOG_SPI_OUT_ENABLED @@ -51,6 +58,13 @@ config BT_BLE_LOG_SPI_OUT_HOST_BUF_SIZE SPI transaction buffer size for host logs. There will be 2 SPI DMA buffers with the same size. +config BT_BLE_LOG_SPI_OUT_HOST_TASK_CNT + int "Host task count" + depends on BT_BLE_LOG_SPI_OUT_HOST_ENABLED + default 2 + help + Host task count. + config BT_BLE_LOG_SPI_OUT_LL_ENABLED bool "Enable Controller log output to SPI" depends on BT_BLE_LOG_SPI_OUT_ENABLED @@ -155,6 +169,13 @@ config BT_BLE_LOG_SPI_OUT_LE_AUDIO_BUF_SIZE SPI transaction buffer size for LE Audio logs. There will be 2 SPI DMA buffers with the same size. +config BT_BLE_LOG_SPI_OUT_LE_AUDIO_TASK_CNT + int "LE audio task count" + depends on BT_BLE_LOG_SPI_OUT_LE_AUDIO_ENABLED + default 1 + help + LE audio task count + config BT_BLE_LOG_SPI_OUT_MESH_ENABLED bool "Enable BLE mesh log output to SPI" depends on BT_BLE_LOG_SPI_OUT_ENABLED @@ -169,3 +190,10 @@ config BT_BLE_LOG_SPI_OUT_MESH_BUF_SIZE help SPI transaction buffer size for BLE mesh logs. There will be 2 SPI DMA buffers with the same size. + +config BT_BLE_LOG_SPI_OUT_MESH_TASK_CNT + int "Mesh task count" + depends on BT_BLE_LOG_SPI_OUT_MESH_ENABLED + default 3 + help + Mesh task count diff --git a/components/bt/common/ble_log/ble_log_spi_out.c b/components/bt/common/ble_log/ble_log_spi_out.c index 7bc5d269518..fd7b33ac960 100644 --- a/components/bt/common/ble_log/ble_log_spi_out.c +++ b/components/bt/common/ble_log/ble_log_spi_out.c @@ -26,12 +26,16 @@ #define SPI_OUT_FLUSH_TIMEOUT_US (CONFIG_BT_BLE_LOG_SPI_OUT_FLUSH_TIMEOUT * 1000) #define SPI_OUT_LE_AUDIO_ENABLED CONFIG_BT_BLE_LOG_SPI_OUT_LE_AUDIO_ENABLED #define SPI_OUT_LE_AUDIO_BUF_SIZE CONFIG_BT_BLE_LOG_SPI_OUT_LE_AUDIO_BUF_SIZE +#define SPI_OUT_LE_AUDIO_TASK_CNT CONFIG_BT_BLE_LOG_SPI_OUT_LE_AUDIO_TASK_CNT #define SPI_OUT_HOST_ENABLED CONFIG_BT_BLE_LOG_SPI_OUT_HOST_ENABLED #define SPI_OUT_HOST_BUF_SIZE CONFIG_BT_BLE_LOG_SPI_OUT_HOST_BUF_SIZE +#define SPI_OUT_HOST_TASK_CNT CONFIG_BT_BLE_LOG_SPI_OUT_HOST_TASK_CNT #define SPI_OUT_HCI_ENABLED CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED #define SPI_OUT_HCI_BUF_SIZE CONFIG_BT_BLE_LOG_SPI_OUT_HCI_BUF_SIZE +#define SPI_OUT_HCI_TASK_CNT CONFIG_BT_BLE_LOG_SPI_OUT_HCI_TASK_CNT #define SPI_OUT_MESH_ENABLED CONFIG_BT_BLE_LOG_SPI_OUT_MESH_ENABLED #define SPI_OUT_MESH_BUF_SIZE CONFIG_BT_BLE_LOG_SPI_OUT_MESH_BUF_SIZE +#define SPI_OUT_MESH_TASK_CNT CONFIG_BT_BLE_LOG_SPI_OUT_MESH_TASK_CNT // Private defines #define BLE_LOG_TAG "BLE_LOG" @@ -110,6 +114,12 @@ typedef struct { uint8_t type; } spi_out_log_cb_t; +typedef struct { + TaskHandle_t task_handle; + spi_out_log_cb_t *log_cb; + uint8_t *str_buf; +} task_map_t; + typedef struct { uint16_t length; uint8_t source; @@ -137,9 +147,7 @@ enum { enum { LOG_CB_TYPE_UL = 0, - LOG_CB_TYPE_LL_TASK, - LOG_CB_TYPE_LL_ISR, - LOG_CB_TYPE_LL_HCI, + LOG_CB_TYPE_LL, LOG_CB_TYPE_LE_AUDIO, LOG_CB_TYPE_HOST, LOG_CB_TYPE_HCI, @@ -199,7 +207,7 @@ static void spi_out_deinit_trans(spi_out_trans_cb_t **trans_cb); static void spi_out_tx_done_cb(spi_transaction_t *ret_trans); static inline void spi_out_append_trans(spi_out_trans_cb_t *trans_cb); -static int spi_out_log_cb_init(spi_out_log_cb_t **log_cb, uint16_t buf_size, uint8_t type); +static int spi_out_log_cb_init(spi_out_log_cb_t **log_cb, uint16_t buf_size, uint8_t type, uint8_t idx); static void spi_out_log_cb_deinit(spi_out_log_cb_t **log_cb); static inline bool spi_out_log_cb_check_trans(spi_out_log_cb_t *log_cb, uint16_t len, bool *need_append); static inline void spi_out_log_cb_append_trans(spi_out_log_cb_t *log_cb); @@ -209,6 +217,8 @@ static bool spi_out_log_cb_write(spi_out_log_cb_t *log_cb, const uint8_t *addr, bool with_checksum); static void spi_out_log_cb_write_loss(spi_out_log_cb_t *log_cb); static void spi_out_log_cb_dump(spi_out_log_cb_t *log_cb); +static bool spi_out_get_task_mapping(task_map_t *map, size_t num, + spi_out_log_cb_t **log_cb, uint8_t **str_buf); static void spi_out_log_flush(void); static void spi_out_write_hex(spi_out_log_cb_t *log_cb, uint8_t source, @@ -259,18 +269,34 @@ static void esp_timer_cb_ts_sync(void); #define IF_0(...) #define LOG_MODULE_INIT_FLAG(ID) (ID##_log_inited) -#define LOG_MODULE_CB(ID) (ID##_log_cb) +#define LOG_MODULE_CB_ARR(ID) (ID##_log_cb) +#define LOG_MODULE_CB_CNT(ID) (ID##_log_cb_cnt) +#define LOG_MODULE_CB(ID, IDX) (ID##_log_cb[IDX]) +#define LOG_MODULE_TASK_MAP(ID) (ID##_task_map) #define LOG_MODULE_MUTEX(ID) (ID##_log_mutex) -#define LOG_MODULE_STR_BUF(ID) (ID##_log_str_buf) +#define LOG_MODULE_STR_BUF_ARR(ID) (ID##_log_str_buf) +#define LOG_MODULE_STR_BUF(ID, IDX) (ID##_log_str_buf[IDX]) #define LOG_MODULE_INIT(ID) (spi_out_##ID##_log_init) #define LOG_MODULE_DEINIT(ID) (spi_out_##ID##_log_deinit) #define LOG_MODULE_FLUSH(ID) (spi_out_##ID##_log_flush) +#define LOG_MODULE_DUMP(ID) \ + do { \ + if (LOG_MODULE_INIT_FLAG(ID)) { \ + esp_rom_printf("[DUMP_START:\n"); \ + for (int i = 0; i < LOG_MODULE_CB_CNT(ID); i++) { \ + spi_out_log_cb_dump(LOG_MODULE_CB(ID, i)); \ + } \ + esp_rom_printf("\n:DUMP_END]\n"); \ + } \ + } while (0) -#define DECLARE_LOG_MODULE(ID, TYPE, BUF_SIZE, USE_MUTEX, USE_STR) \ +#define DECLARE_LOG_MODULE(ID, TYPE, BUF_SIZE, NUM_CB, USE_MUTEX, USE_STR) \ static bool LOG_MODULE_INIT_FLAG(ID) = false; \ - static spi_out_log_cb_t *LOG_MODULE_CB(ID) = NULL; \ + static spi_out_log_cb_t *LOG_MODULE_CB_ARR(ID)[NUM_CB] = { NULL }; \ + static const size_t LOG_MODULE_CB_CNT(ID) = (NUM_CB); \ + static task_map_t LOG_MODULE_TASK_MAP(ID)[NUM_CB] = {0}; \ IF_##USE_MUTEX(static SemaphoreHandle_t LOG_MODULE_MUTEX(ID) = NULL;) \ - IF_##USE_STR(static uint8_t *LOG_MODULE_STR_BUF(ID) = NULL;) \ + IF_##USE_STR(static uint8_t *LOG_MODULE_STR_BUF_ARR(ID)[NUM_CB] = {0};) \ \ static int LOG_MODULE_INIT(ID)(void); \ static void LOG_MODULE_DEINIT(ID)(void); \ @@ -287,13 +313,22 @@ static void esp_timer_cb_ts_sync(void); } \ ) \ IF_##USE_STR( \ - LOG_MODULE_STR_BUF(ID) = (uint8_t *)SPI_OUT_MALLOC(SPI_OUT_LOG_STR_BUF_SIZE); \ - if (!LOG_MODULE_STR_BUF(ID)) { \ - goto failed; \ + for (size_t i = 0; i < LOG_MODULE_CB_CNT(ID); i++) { \ + LOG_MODULE_STR_BUF(ID, i) = (uint8_t *)SPI_OUT_MALLOC( \ + SPI_OUT_LOG_STR_BUF_SIZE \ + ); \ + if (!LOG_MODULE_STR_BUF(ID, i)) { \ + goto failed; \ + } \ + LOG_MODULE_TASK_MAP(ID)[i].str_buf = LOG_MODULE_STR_BUF(ID, i); \ } \ ) \ - if (spi_out_log_cb_init(&LOG_MODULE_CB(ID), BUF_SIZE, TYPE) != 0) { \ - goto failed; \ + for (size_t i = 0; i < LOG_MODULE_CB_CNT(ID); i++) { \ + if (spi_out_log_cb_init(&LOG_MODULE_CB(ID, i), BUF_SIZE, TYPE, i) != 0) \ + { \ + goto failed; \ + } \ + LOG_MODULE_TASK_MAP(ID)[i].log_cb = LOG_MODULE_CB(ID, i); \ } \ LOG_MODULE_INIT_FLAG(ID) = true; \ return 0; \ @@ -310,13 +345,20 @@ static void esp_timer_cb_ts_sync(void); xSemaphoreTake(LOG_MODULE_MUTEX(ID), portMAX_DELAY); \ ) \ IF_##USE_STR( \ - if (LOG_MODULE_STR_BUF(ID)) { \ - free(LOG_MODULE_STR_BUF(ID)); \ - LOG_MODULE_STR_BUF(ID) = NULL; \ + for (size_t i = 0; i < LOG_MODULE_CB_CNT(ID); i++) { \ + if (LOG_MODULE_STR_BUF(ID, i)) { \ + free(LOG_MODULE_STR_BUF(ID, i)); \ + LOG_MODULE_STR_BUF(ID, i) = NULL; \ + } \ } \ ) \ - spi_out_log_cb_deinit(&LOG_MODULE_CB(ID)); \ - \ + for (size_t i = 0; i < LOG_MODULE_CB_CNT(ID); i++) { \ + spi_out_log_cb_deinit(&LOG_MODULE_CB(ID, i)); \ + LOG_MODULE_CB(ID, i) = NULL; \ + } \ + for (size_t i = 0; i < LOG_MODULE_CB_CNT(ID); i++) { \ + memset(&LOG_MODULE_TASK_MAP(ID)[i], 0, sizeof(task_map_t)); \ + } \ IF_##USE_MUTEX( \ xSemaphoreGive(LOG_MODULE_MUTEX(ID)); \ vSemaphoreDelete(LOG_MODULE_MUTEX(ID)); \ @@ -330,30 +372,36 @@ static void esp_timer_cb_ts_sync(void); IF_##USE_MUTEX( \ xSemaphoreTake(LOG_MODULE_MUTEX(ID), portMAX_DELAY); \ ) \ - spi_out_log_cb_write_loss(LOG_MODULE_CB(ID)); \ - spi_out_log_cb_flush_trans(LOG_MODULE_CB(ID)); \ - spi_out_log_cb_append_trans(LOG_MODULE_CB(ID)); \ + for (size_t i = 0; i < LOG_MODULE_CB_CNT(ID); ++i) { \ + spi_out_log_cb_write_loss(LOG_MODULE_CB(ID, i)); \ + spi_out_log_cb_flush_trans(LOG_MODULE_CB(ID, i)); \ + spi_out_log_cb_append_trans(LOG_MODULE_CB(ID, i)); \ + } \ IF_##USE_MUTEX( \ xSemaphoreGive(LOG_MODULE_MUTEX(ID)); \ ) \ - } \ + } -DECLARE_LOG_MODULE(ul, LOG_CB_TYPE_UL, SPI_OUT_UL_TASK_BUF_SIZE, 1, 1) +DECLARE_LOG_MODULE(ul, LOG_CB_TYPE_UL, SPI_OUT_UL_TASK_BUF_SIZE, 1, 1, 1) #if SPI_OUT_LE_AUDIO_ENABLED -DECLARE_LOG_MODULE(le_audio, LOG_CB_TYPE_LE_AUDIO, SPI_OUT_LE_AUDIO_BUF_SIZE, 0, 0) +DECLARE_LOG_MODULE(le_audio, LOG_CB_TYPE_LE_AUDIO, SPI_OUT_LE_AUDIO_BUF_SIZE, + SPI_OUT_LE_AUDIO_TASK_CNT, 0, 0) #endif // SPI_OUT_LE_AUDIO_ENABLED #if SPI_OUT_HOST_ENABLED -DECLARE_LOG_MODULE(host, LOG_CB_TYPE_HOST, SPI_OUT_HOST_BUF_SIZE, 0, 1) +DECLARE_LOG_MODULE(host, LOG_CB_TYPE_HOST, SPI_OUT_HOST_BUF_SIZE, + SPI_OUT_HOST_TASK_CNT, 0, 1) #endif // SPI_OUT_HOST_ENABLED #if SPI_OUT_HCI_ENABLED -DECLARE_LOG_MODULE(hci, LOG_CB_TYPE_HCI, SPI_OUT_HCI_BUF_SIZE, 0, 0) +DECLARE_LOG_MODULE(hci, LOG_CB_TYPE_HCI, SPI_OUT_HCI_BUF_SIZE, + SPI_OUT_HCI_TASK_CNT, 0, 0) #endif // SPI_OUT_HCI_ENABLED #if SPI_OUT_MESH_ENABLED -DECLARE_LOG_MODULE(mesh, LOG_CB_TYPE_MESH, SPI_OUT_MESH_BUF_SIZE, 0, 1) +DECLARE_LOG_MODULE(mesh, LOG_CB_TYPE_MESH, SPI_OUT_MESH_BUF_SIZE, + SPI_OUT_MESH_TASK_CNT, 0, 1) #endif // SPI_OUT_MESH_ENABLED // Private functions @@ -436,7 +484,7 @@ recycle: return; } -static int spi_out_log_cb_init(spi_out_log_cb_t **log_cb, uint16_t buf_size, uint8_t type) +static int spi_out_log_cb_init(spi_out_log_cb_t **log_cb, uint16_t buf_size, uint8_t type, uint8_t idx) { // Initialize log control block *log_cb = (spi_out_log_cb_t *)SPI_OUT_MALLOC(sizeof(spi_out_log_cb_t)); @@ -455,7 +503,7 @@ static int spi_out_log_cb_init(spi_out_log_cb_t **log_cb, uint16_t buf_size, uin return -1; } - (*log_cb)->type = type; + (*log_cb)->type = (type << 4) | (idx); return 0; } @@ -607,6 +655,67 @@ static void spi_out_log_cb_dump(spi_out_log_cb_t *log_cb) } } +static void spi_out_update_task_mapping(int idx, void *ptr) +{ + // It is a must to clear task handle after task deletion + task_map_t *entry = (task_map_t *)ptr; + entry->task_handle = NULL; +} + +static bool spi_out_get_task_mapping(task_map_t *map, size_t num, + spi_out_log_cb_t **log_cb, uint8_t **str_buf) +{ + if (!map || !log_cb) { + return false; + } + + // Shall not be called in ISR + TaskHandle_t handle = xTaskGetCurrentTaskHandle(); + if (!handle) { + return false; + } + + // Check if the given task handle is already in map + for (size_t i = 0; i < num; i++) { + task_map_t *entry = &map[i]; + if (entry->task_handle == handle) { + *log_cb = entry->log_cb; + if (str_buf) { + *str_buf = entry->str_buf; + } + return true; + } + } + + // Task handle not in map, try to allocate free slot + bool ret = false; + portMUX_TYPE spinlock = portMUX_INITIALIZER_UNLOCKED; + portENTER_CRITICAL_SAFE(&spinlock); + for (size_t i = 0; i < num; i++) { + task_map_t *entry = &map[i]; + if (entry->task_handle == NULL) { + vTaskSetThreadLocalStoragePointerAndDelCallback( + NULL, 0, (void *)entry, spi_out_update_task_mapping + ); + entry->task_handle = handle; + *log_cb = entry->log_cb; + if (str_buf) { + *str_buf = entry->str_buf; + } + ret = true; + break; + } + } + portEXIT_CRITICAL_SAFE(&spinlock); + + if (!ret) { + // Shall not be here in normal case + const char *task_name = pcTaskGetName(NULL); + esp_rom_printf("@EW: Failed to assign slot in task map for task %s\n", task_name); + } + return ret; +} + static void spi_out_log_flush(void) { LOG_MODULE_FLUSH(ul)(); @@ -687,13 +796,13 @@ static int spi_out_ll_log_init(void) } // Initialize log control blocks for controller task & ISR logs - if (spi_out_log_cb_init(&ll_task_log_cb, SPI_OUT_LL_TASK_BUF_SIZE, LOG_CB_TYPE_LL_TASK) != 0) { + if (spi_out_log_cb_init(&ll_task_log_cb, SPI_OUT_LL_TASK_BUF_SIZE, LOG_CB_TYPE_LL, 0) != 0) { goto task_log_cb_init_failed; } - if (spi_out_log_cb_init(&ll_isr_log_cb, SPI_OUT_LL_ISR_BUF_SIZE, LOG_CB_TYPE_LL_ISR) != 0) { + if (spi_out_log_cb_init(&ll_isr_log_cb, SPI_OUT_LL_ISR_BUF_SIZE, LOG_CB_TYPE_LL, 1) != 0) { goto isr_log_cb_init_failed; } - if (spi_out_log_cb_init(&ll_hci_log_cb, SPI_OUT_LL_HCI_BUF_SIZE, LOG_CB_TYPE_LL_HCI) != 0) { + if (spi_out_log_cb_init(&ll_hci_log_cb, SPI_OUT_LL_HCI_BUF_SIZE, LOG_CB_TYPE_LL, 2) != 0) { goto hci_log_cb_init_failed; } @@ -1175,7 +1284,7 @@ int ble_log_spi_out_write(uint8_t source, const uint8_t *addr, uint16_t len) } xSemaphoreTake(LOG_MODULE_MUTEX(ul), portMAX_DELAY); - spi_out_write_hex(LOG_MODULE_CB(ul), source, addr, len, false); + spi_out_write_hex(LOG_MODULE_CB(ul, 0), source, addr, len, false); xSemaphoreGive(LOG_MODULE_MUTEX(ul)); return 0; } @@ -1191,59 +1300,30 @@ void ble_log_spi_out_dump_all(void) #if SPI_OUT_LL_ENABLED if (ll_log_inited) { - // Dump lower layer log buffer - esp_rom_printf("[LL_ISR_LOG_DUMP_START:\n"); + esp_rom_printf("[DUMP_START:\n"); spi_out_log_cb_dump(ll_isr_log_cb); - esp_rom_printf("\n:LL_ISR_LOG_DUMP_END]\n\n"); - - esp_rom_printf("[LL_TASK_LOG_DUMP_START:\n"); spi_out_log_cb_dump(ll_task_log_cb); - esp_rom_printf("\n:LL_TASK_LOG_DUMP_END]\n\n"); - - esp_rom_printf("[LL_HCI_LOG_DUMP_START:\n"); spi_out_log_cb_dump(ll_hci_log_cb); - esp_rom_printf("\n:LL_HCI_LOG_DUMP_END]\n\n"); + esp_rom_printf("\n:DUMP_END]\n\n"); } #endif // SPI_OUT_LL_ENABLED - if (LOG_MODULE_INIT_FLAG(ul)) { - // Dump upper layer log buffer - esp_rom_printf("[UL_LOG_DUMP_START:\n"); - spi_out_log_cb_dump(LOG_MODULE_CB(ul)); - esp_rom_printf("\n:UL_LOG_DUMP_END]\n\n"); - } + LOG_MODULE_DUMP(ul); #if SPI_OUT_LE_AUDIO_ENABLED - if (LOG_MODULE_INIT_FLAG(le_audio)) { - esp_rom_printf("[LE_AUDIO_LOG_DUMP_START:\n"); - spi_out_log_cb_dump(LOG_MODULE_CB(le_audio)); - esp_rom_printf("\n:LE_AUDIO_LOG_DUMP_END]\n\n"); - } + LOG_MODULE_DUMP(le_audio); #endif // SPI_OUT_LE_AUDIO_ENABLED - #if SPI_OUT_HOST_ENABLED - if (LOG_MODULE_INIT_FLAG(host)) { - esp_rom_printf("[HOST_LOG_DUMP_START:\n"); - spi_out_log_cb_dump(LOG_MODULE_CB(host)); - esp_rom_printf("\n:HOST_LOG_DUMP_END]\n\n"); - } + LOG_MODULE_DUMP(host); #endif // SPI_OUT_HOST_ENABLED #if SPI_OUT_HCI_ENABLED - if (LOG_MODULE_INIT_FLAG(hci)) { - esp_rom_printf("[HCI_LOG_DUMP_START:\n"); - spi_out_log_cb_dump(LOG_MODULE_CB(hci)); - esp_rom_printf("\n:HCI_LOG_DUMP_END]\n\n"); - } + LOG_MODULE_DUMP(hci); #endif // SPI_OUT_HCI_ENABLED #if SPI_OUT_MESH_ENABLED - if (LOG_MODULE_INIT_FLAG(mesh)) { - esp_rom_printf("[MESH_LOG_DUMP_START:\n"); - spi_out_log_cb_dump(LOG_MODULE_CB(mesh)); - esp_rom_printf("\n:MESH_LOG_DUMP_END]\n\n"); - } + LOG_MODULE_DUMP(mesh); #endif // SPI_OUT_MESH_ENABLED portEXIT_CRITICAL_SAFE(&spinlock); @@ -1280,15 +1360,21 @@ IRAM_ATTR void ble_log_spi_out_le_audio_write(const uint8_t *addr, uint16_t len) return; } + spi_out_log_cb_t *log_cb; + if (!spi_out_get_task_mapping(LOG_MODULE_TASK_MAP(le_audio), + LOG_MODULE_CB_CNT(le_audio), &log_cb, NULL)) { + return; + } + bool need_append; - if (spi_out_log_cb_check_trans(LOG_MODULE_CB(le_audio), len, &need_append)) { - need_append |= spi_out_log_cb_write(LOG_MODULE_CB(le_audio), addr, len, NULL, 0, + if (spi_out_log_cb_check_trans(log_cb, len, &need_append)) { + need_append |= spi_out_log_cb_write(log_cb, addr, len, NULL, 0, BLE_LOG_SPI_OUT_SOURCE_LE_AUDIO, false); } if (need_append) { - spi_out_log_cb_append_trans(LOG_MODULE_CB(le_audio)); + spi_out_log_cb_append_trans(log_cb); } - spi_out_log_cb_write_loss(LOG_MODULE_CB(le_audio)); + spi_out_log_cb_write_loss(log_cb); return; } #endif // CONFIG_BT_BLE_LOG_SPI_OUT_LE_AUDIO_ENABLED @@ -1300,25 +1386,31 @@ int ble_log_spi_out_host_write(uint8_t source, const char *prefix, const char *f return -1; } + spi_out_log_cb_t *log_cb; + uint8_t *str_buf; + if (!spi_out_get_task_mapping(LOG_MODULE_TASK_MAP(host), + LOG_MODULE_CB_CNT(host), &log_cb, &str_buf)) { + return -1; + } + // Copy prefix to string buffer int prefix_len = strlen(prefix); if (prefix_len >= SPI_OUT_LOG_STR_BUF_SIZE) { return -1; } - memcpy(LOG_MODULE_STR_BUF(host), prefix, prefix_len); + memcpy(str_buf, prefix, prefix_len); // Write string buffer va_list args; va_start(args, format); - int total_len = spi_out_write_str(LOG_MODULE_STR_BUF(host), format, args, prefix_len); + int total_len = spi_out_write_str(str_buf, format, args, prefix_len); va_end(args); if (total_len == 0) { return -1; } // Write log control block buffer - spi_out_write_hex(LOG_MODULE_CB(host), source, - LOG_MODULE_STR_BUF(host), (uint16_t)total_len, true); + spi_out_write_hex(log_cb, source, str_buf, (uint16_t)total_len, true); return 0; } #endif // SPI_OUT_HOST_ENABLED @@ -1336,7 +1428,12 @@ int ble_log_spi_out_hci_write(uint8_t source, const uint8_t *addr, uint16_t len) #endif // SPI_OUT_LL_ENABLED } if (source == BLE_LOG_SPI_OUT_SOURCE_HCI_DOWNSTREAM) { - spi_out_write_hex(LOG_MODULE_CB(hci), source, addr, len, true); + spi_out_log_cb_t *log_cb; + if (!spi_out_get_task_mapping(LOG_MODULE_TASK_MAP(hci), + LOG_MODULE_CB_CNT(hci), &log_cb, NULL)) { + return -1; + } + spi_out_write_hex(log_cb, source, addr, len, true); } return 0; } @@ -1349,25 +1446,31 @@ int ble_log_spi_out_mesh_write(const char *prefix, const char *format, ...) return -1; } + spi_out_log_cb_t *log_cb; + uint8_t *str_buf; + if (!spi_out_get_task_mapping(LOG_MODULE_TASK_MAP(mesh), + LOG_MODULE_CB_CNT(mesh), &log_cb, &str_buf)) { + return -1; + } + // Copy prefix to string buffer int prefix_len = strlen(prefix); if (prefix_len >= SPI_OUT_LOG_STR_BUF_SIZE) { return -1; } - memcpy(LOG_MODULE_STR_BUF(mesh), prefix, prefix_len); + memcpy(str_buf, prefix, prefix_len); // Write string buffer va_list args; va_start(args, format); - int total_len = spi_out_write_str(LOG_MODULE_STR_BUF(mesh), format, args, prefix_len); + int total_len = spi_out_write_str(str_buf, format, args, prefix_len); va_end(args); if (total_len == 0) { return -1; } // Write log control block buffer - spi_out_write_hex(LOG_MODULE_CB(mesh), BLE_LOG_SPI_OUT_SOURCE_MESH, - LOG_MODULE_STR_BUF(mesh), (uint16_t)total_len, true); + spi_out_write_hex(log_cb, BLE_LOG_SPI_OUT_SOURCE_MESH, str_buf, (uint16_t)total_len, true); return 0; } #endif // SPI_OUT_MESH_ENABLED From 7f5c88e27a58f0674132790f3596898b271be710 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Tue, 8 Jul 2025 13:15:29 +0800 Subject: [PATCH 167/213] fix(ble): nimble host & hci log write race condition workaround (cherry picked from commit 6e384644c86acf450edaf0016826f910c99c7682) Co-authored-by: Zhou Xiao --- .../bt/common/ble_log/ble_log_spi_out.c | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/components/bt/common/ble_log/ble_log_spi_out.c b/components/bt/common/ble_log/ble_log_spi_out.c index fd7b33ac960..4fbb663ad33 100644 --- a/components/bt/common/ble_log/ble_log_spi_out.c +++ b/components/bt/common/ble_log/ble_log_spi_out.c @@ -707,12 +707,6 @@ static bool spi_out_get_task_mapping(task_map_t *map, size_t num, } } portEXIT_CRITICAL_SAFE(&spinlock); - - if (!ret) { - // Shall not be here in normal case - const char *task_name = pcTaskGetName(NULL); - esp_rom_printf("@EW: Failed to assign slot in task map for task %s\n", task_name); - } return ret; } @@ -1388,9 +1382,14 @@ int ble_log_spi_out_host_write(uint8_t source, const char *prefix, const char *f spi_out_log_cb_t *log_cb; uint8_t *str_buf; + bool fallback = false; if (!spi_out_get_task_mapping(LOG_MODULE_TASK_MAP(host), LOG_MODULE_CB_CNT(host), &log_cb, &str_buf)) { - return -1; + // NimBLE workaround + fallback = true; + xSemaphoreTake(LOG_MODULE_MUTEX(ul), portMAX_DELAY); + log_cb = LOG_MODULE_CB(ul, 0); + str_buf = LOG_MODULE_STR_BUF(ul, 0); } // Copy prefix to string buffer @@ -1411,6 +1410,10 @@ int ble_log_spi_out_host_write(uint8_t source, const char *prefix, const char *f // Write log control block buffer spi_out_write_hex(log_cb, source, str_buf, (uint16_t)total_len, true); + + if (fallback) { + xSemaphoreGive(LOG_MODULE_MUTEX(ul)); + } return 0; } #endif // SPI_OUT_HOST_ENABLED @@ -1429,11 +1432,18 @@ int ble_log_spi_out_hci_write(uint8_t source, const uint8_t *addr, uint16_t len) } if (source == BLE_LOG_SPI_OUT_SOURCE_HCI_DOWNSTREAM) { spi_out_log_cb_t *log_cb; + bool fallback = false; if (!spi_out_get_task_mapping(LOG_MODULE_TASK_MAP(hci), LOG_MODULE_CB_CNT(hci), &log_cb, NULL)) { - return -1; + // NimBLE workaround + fallback = true; + xSemaphoreTake(LOG_MODULE_MUTEX(ul), portMAX_DELAY); + log_cb = LOG_MODULE_CB(ul, 0); } spi_out_write_hex(log_cb, source, addr, len, true); + if (fallback) { + xSemaphoreGive(LOG_MODULE_MUTEX(ul)); + } } return 0; } From 243facef85878662156a3a5ad3c2f575ae8d24c6 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Tue, 8 Jul 2025 13:15:31 +0800 Subject: [PATCH 168/213] change(ble): upgraded spi log frame header (cherry picked from commit 5f3ac91d6305eb4daecc340fe669a13fe3d1daad) Co-authored-by: Zhou Xiao --- .../bt/common/ble_log/ble_log_spi_out.c | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/components/bt/common/ble_log/ble_log_spi_out.c b/components/bt/common/ble_log/ble_log_spi_out.c index 4fbb663ad33..e1c6a278cb0 100644 --- a/components/bt/common/ble_log/ble_log_spi_out.c +++ b/components/bt/common/ble_log/ble_log_spi_out.c @@ -41,10 +41,6 @@ #define BLE_LOG_TAG "BLE_LOG" #define SPI_OUT_BUS SPI2_HOST #define SPI_OUT_MAX_TRANSFER_SIZE (10240) -#define SPI_OUT_FRAME_HEAD_LEN (4) -#define SPI_OUT_FRAME_TAIL_LEN (4) -#define SPI_OUT_FRAME_OVERHEAD (8) -#define SPI_OUT_PACKET_LOSS_FRAME_SIZE (6) #define SPI_OUT_TRANS_ITVL_MIN_US (30) #define SPI_OUT_LOG_STR_BUF_SIZE (100) #define SPI_OUT_MALLOC(size) heap_caps_malloc(size, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT) @@ -108,10 +104,10 @@ typedef struct { typedef struct { spi_out_trans_cb_t *trans_cb[2]; uint8_t trans_cb_idx; - uint8_t frame_sn; + uint8_t type; uint16_t lost_frame_cnt; uint32_t lost_bytes_cnt; - uint8_t type; + uint32_t frame_sn; } spi_out_log_cb_t; typedef struct { @@ -123,7 +119,8 @@ typedef struct { typedef struct { uint16_t length; uint8_t source; - uint8_t frame_sn; + uint8_t type; + uint16_t frame_sn; } __attribute__((packed)) frame_head_t; typedef struct { @@ -404,6 +401,12 @@ DECLARE_LOG_MODULE(mesh, LOG_CB_TYPE_MESH, SPI_OUT_MESH_BUF_SIZE, SPI_OUT_MESH_TASK_CNT, 0, 1) #endif // SPI_OUT_MESH_ENABLED +// Private macros +#define SPI_OUT_FRAME_HEAD_LEN (sizeof(frame_head_t)) +#define SPI_OUT_FRAME_TAIL_LEN (sizeof(uint32_t)) +#define SPI_OUT_FRAME_OVERHEAD (SPI_OUT_FRAME_HEAD_LEN + SPI_OUT_FRAME_TAIL_LEN) +#define SPI_OUT_GET_FRAME_SN(VAR) __atomic_fetch_add(VAR, 1, __ATOMIC_RELAXED) + // Private functions static int spi_out_init_trans(spi_out_trans_cb_t **trans_cb, uint16_t buf_size) { @@ -546,7 +549,6 @@ IRAM_ATTR static inline bool spi_out_log_cb_check_trans(spi_out_log_cb_t *log_cb failed: log_cb->lost_bytes_cnt += frame_len; log_cb->lost_frame_cnt++; - log_cb->frame_sn++; return false; } @@ -587,27 +589,23 @@ IRAM_ATTR static bool spi_out_log_cb_write(spi_out_log_cb_t *log_cb, const uint8 frame_head_t head = { .length = total_length, .source = source, - .frame_sn = log_cb->frame_sn, + .type = log_cb->type, + .frame_sn = SPI_OUT_GET_FRAME_SN(&(log_cb->frame_sn)) & 0xFFFF, }; - uint32_t checksum = 0; - if (with_checksum) { - for (int i = 0; i < len; i++) { - checksum += addr[i]; - } - for (int i = 0; i < len_append; i++) { - checksum += addr_append[i]; - } - } memcpy(buf, (const uint8_t *)&head, SPI_OUT_FRAME_HEAD_LEN); memcpy(buf + SPI_OUT_FRAME_HEAD_LEN, addr, len); if (len_append && addr_append) { memcpy(buf + SPI_OUT_FRAME_HEAD_LEN + len, addr_append, len_append); } + + uint32_t checksum = 0; + for (int i = 0; i < SPI_OUT_FRAME_HEAD_LEN + total_length; i++) { + checksum += buf[i]; + } memcpy(buf + SPI_OUT_FRAME_HEAD_LEN + total_length, &checksum, SPI_OUT_FRAME_TAIL_LEN); trans_cb->length += total_length + SPI_OUT_FRAME_OVERHEAD; - log_cb->frame_sn++; if ((trans_cb->buf_size - trans_cb->length) <= SPI_OUT_FRAME_OVERHEAD) { trans_cb->flag = TRANS_CB_FLAG_NEED_QUEUE; return true; From 4f942026095d7afad409f666fe3bcada2897430b Mon Sep 17 00:00:00 2001 From: Chen Jian Hua Date: Tue, 8 Jul 2025 13:33:34 +0800 Subject: [PATCH 169/213] fix(bt): Update bt lib for ESP32-C3 and ESP32-S3(2edb0b0) - Fixed TX issue when the event is aborted - Fixed BLE assert llc_llcp.c 487 - Fixed BLE assert sch_prog.c 304 - Fixed anonymous extended adv reporting - Support vendor HCI related params reset (cherry picked from commit ad71a2cd33488363d8556a723a37ddd3180d5629) Co-authored-by: chenjianhua --- components/bt/controller/lib_esp32c3_family | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c3_family b/components/bt/controller/lib_esp32c3_family index 3ff529142f6..0c68809d62e 160000 --- a/components/bt/controller/lib_esp32c3_family +++ b/components/bt/controller/lib_esp32c3_family @@ -1 +1 @@ -Subproject commit 3ff529142f6e2707d57b10eb87ac8d86e9098b88 +Subproject commit 0c68809d62e432427de97b5294f6619307f62f40 From 256a5af190933abdb88590b632d4ee4599a90adb Mon Sep 17 00:00:00 2001 From: Astha Verma Date: Tue, 8 Jul 2025 14:15:53 +0530 Subject: [PATCH 170/213] fix(nimble): Add ble_ancs example to build-test-rules.yml --- examples/bluetooth/.build-test-rules.yml | 9 +++++++++ examples/bluetooth/nimble/ble_ancs/README.md | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/examples/bluetooth/.build-test-rules.yml b/examples/bluetooth/.build-test-rules.yml index 8ff28bdbca8..c39ceb356a8 100644 --- a/examples/bluetooth/.build-test-rules.yml +++ b/examples/bluetooth/.build-test-rules.yml @@ -180,6 +180,15 @@ examples/bluetooth/hci/controller_vhci_ble_adv: # config BT_NIMBLE_ENABLED does not depends on any soc cap +examples/bluetooth/nimble/ble_ancs: + <<: *bt_default_depends + enable: + - if: SOC_BLE_SUPPORTED == 1 + temporary: true + reason: the other targets are not tested yet + depends_filepatterns: + - examples/bluetooth/nimble/common/**/* + examples/bluetooth/nimble/ble_enc_adv_data: <<: *bt_default_depends enable: diff --git a/examples/bluetooth/nimble/ble_ancs/README.md b/examples/bluetooth/nimble/ble_ancs/README.md index 2202b7f0a43..7180d04accd 100644 --- a/examples/bluetooth/nimble/ble_ancs/README.md +++ b/examples/bluetooth/nimble/ble_ancs/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | # ESP-IDF NimBLE ANCS Example From 46b601467656c1a214e1d4abf23fa1ecbf889d13 Mon Sep 17 00:00:00 2001 From: Dong Heng Date: Thu, 3 Jul 2025 19:42:44 +0800 Subject: [PATCH 171/213] feat(esp_driver_cam): DVP driver supports only initializing the clock and XCLK pin to generate a clock for the external device --- .../dvp/include/esp_private/esp_cam_dvp.h | 20 ++++++- .../dvp/src/esp_cam_ctlr_dvp_cam.c | 59 ++++++++++++++++--- .../test_apps/dvp/main/test_dvp_driver.c | 12 ++++ 3 files changed, 81 insertions(+), 10 deletions(-) diff --git a/components/esp_driver_cam/dvp/include/esp_private/esp_cam_dvp.h b/components/esp_driver_cam/dvp/include/esp_private/esp_cam_dvp.h index 032c8161793..79a6ff5eccb 100644 --- a/components/esp_driver_cam/dvp/include/esp_private/esp_cam_dvp.h +++ b/components/esp_driver_cam/dvp/include/esp_private/esp_cam_dvp.h @@ -26,7 +26,7 @@ extern "C" { esp_err_t esp_cam_ctlr_dvp_init(int ctlr_id, cam_clock_source_t clk_src, const esp_cam_ctlr_dvp_pin_config_t *pin); /** - * @brief ESP CAM DVP output hardware clock + * @brief ESP CAM DVP output hardware clock, the function "esp_cam_ctlr_dvp_init" should be called first * * @param ctlr_id CAM DVP controller ID * @param clk_src CAM DVP clock source @@ -38,6 +38,24 @@ esp_err_t esp_cam_ctlr_dvp_init(int ctlr_id, cam_clock_source_t clk_src, const e */ esp_err_t esp_cam_ctlr_dvp_output_clock(int ctlr_id, cam_clock_source_t clk_src, uint32_t xclk_freq); +/** + * @brief Initialize ESP CAM DVP clock pin (other DVP GPIO pins excluded the clock pins will not be initialized) + * and hardware clock, then output clock signal with given frequency + * + * @note The function is implemented based on "esp_cam_ctlr_dvp_init" and "esp_cam_ctlr_dvp_output_clock", + * so calling "esp_cam_ctlr_dvp_init" and "esp_cam_ctlr_dvp_output_clock" is not required + * + * @param ctlr_id DVP controller ID + * @param pin DVP clock pin + * @param clk_src DVP clock source + * @param xclk_freq DVP clock frequency + * + * @return + * - ESP_OK on success + * - Others if failed + */ +esp_err_t esp_cam_ctlr_dvp_start_clock(int ctlr_id, gpio_num_t pin, cam_clock_source_t clk_src, uint32_t xclk_freq); + /** * @brief ESP CAM DVP de-initialzie. * diff --git a/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c b/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c index 9eb7fa10743..7d256504545 100644 --- a/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c +++ b/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c @@ -45,14 +45,16 @@ #define ALIGN_UP_BY(num, align) ((align) == 0 ? (num) : (((num) + ((align) - 1)) & ~((align) - 1))) -#define DVP_CAM_CONFIG_INPUT_PIN(pin, sig, inv) \ -{ \ - ret = esp_cam_ctlr_dvp_config_input_gpio(pin, sig, inv); \ - if (ret != ESP_OK) { \ - ESP_LOGE(TAG, "failed to configure pin=%d sig=%d", \ - pin, sig); \ - return ret; \ - } \ +#define DVP_CAM_CONFIG_INPUT_PIN(pin, sig, inv) \ +{ \ + if (pin != GPIO_NUM_NC) { \ + ret = esp_cam_ctlr_dvp_config_input_gpio(pin, sig, inv); \ + if (ret != ESP_OK) { \ + ESP_LOGE(TAG, "failed to configure pin=%d sig=%d", \ + pin, sig); \ + return ret; \ + } \ + } \ } typedef struct dvp_platform { @@ -360,7 +362,7 @@ esp_err_t esp_cam_ctlr_dvp_init(int ctlr_id, cam_clock_source_t clk_src, const e } /** - * @brief ESP CAM DVP output hardware clock + * @brief ESP CAM DVP output hardware clock, the function "esp_cam_ctlr_dvp_init" should be called first * * @param ctlr_id CAM DVP controller ID * @param clk_src CAM DVP clock source @@ -382,16 +384,55 @@ esp_err_t esp_cam_ctlr_dvp_output_clock(int ctlr_id, cam_clock_source_t clk_src, ESP_LOGD(TAG, "DVP clock source frequency %" PRIu32 "Hz", src_clk_hz); if ((src_clk_hz % xclk_freq) == 0) { + // The camera sensors require precision without frequency and duty cycle jitter, + // so the fractional divisor can't be used. DVP_CAM_CLK_ATOMIC() { cam_ll_set_group_clock_coeff(ctlr_id, src_clk_hz / xclk_freq, 0, 0); }; ret = ESP_OK; + } else { + ESP_LOGE(TAG, "calculated frequency divider is not integer so clock isn't changed"); } return ret; } +/** + * @brief Initialize ESP CAM DVP clock pin (other DVP GPIO pins excluded the clock pins will not be initialized) + * and hardware clock, then output clock signal with given frequency + * + * @note The function is implemented based on "esp_cam_ctlr_dvp_init" and "esp_cam_ctlr_dvp_output_clock", + * so calling "esp_cam_ctlr_dvp_init" and "esp_cam_ctlr_dvp_output_clock" is not required + * + * @param ctlr_id DVP controller ID + * @param pin DVP clock pin + * @param clk_src DVP clock source + * @param xclk_freq DVP clock frequency + * + * @return + * - ESP_OK on success + * - Others if failed + */ +esp_err_t esp_cam_ctlr_dvp_start_clock(int ctlr_id, gpio_num_t pin, cam_clock_source_t clk_src, uint32_t xclk_freq) +{ + esp_cam_ctlr_dvp_pin_config_t pin_config = {0}; + + pin_config.data_width = CAM_CTLR_DATA_WIDTH_8; + pin_config.vsync_io = GPIO_NUM_NC; + pin_config.de_io = GPIO_NUM_NC; + pin_config.pclk_io = GPIO_NUM_NC; + for (int i = 0; i < CAM_DVP_DATA_SIG_NUM; i++) { + pin_config.data_io[i] = GPIO_NUM_NC; + } + pin_config.xclk_io = pin; + + ESP_RETURN_ON_ERROR(esp_cam_ctlr_dvp_init(ctlr_id, clk_src, &pin_config), TAG, "failed to initialize DVP controller"); + ESP_RETURN_ON_ERROR(esp_cam_ctlr_dvp_output_clock(ctlr_id, clk_src, xclk_freq), TAG, "failed to output clock"); + + return ESP_OK; +} + /** * @brief ESP CAM DVP de-initialzie. * diff --git a/components/esp_driver_cam/test_apps/dvp/main/test_dvp_driver.c b/components/esp_driver_cam/test_apps/dvp/main/test_dvp_driver.c index f138f1ee9b0..b7e7e5ac2fe 100644 --- a/components/esp_driver_cam/test_apps/dvp/main/test_dvp_driver.c +++ b/components/esp_driver_cam/test_apps/dvp/main/test_dvp_driver.c @@ -7,6 +7,7 @@ #include "sdkconfig.h" #include "unity.h" #include "esp_cam_ctlr_dvp.h" +#include "esp_private/esp_cam_dvp.h" #include "esp_cam_ctlr.h" TEST_CASE("TEST DVP driver allocation", "[DVP]") @@ -171,3 +172,14 @@ TEST_CASE("TEST DVP driver intern/extern generate xclk", "[DVP]") TEST_ESP_OK(esp_cam_new_dvp_ctlr(&dvp_config, &handle)); TEST_ESP_OK(esp_cam_ctlr_del(handle)); } + +TEST_CASE("TEST DVP driver only output xclk signal", "[DVP]") +{ + TEST_ESP_OK(esp_cam_ctlr_dvp_start_clock(0, 20, CAM_CLK_SRC_DEFAULT, 20000000)); + TEST_ESP_OK(esp_cam_ctlr_dvp_deinit(0)); + +#if CONFIG_IDF_TARGET_ESP32S3 + TEST_ESP_OK(esp_cam_ctlr_dvp_start_clock(0, 20, CAM_CLK_SRC_PLL240M, 24000000)); + TEST_ESP_OK(esp_cam_ctlr_dvp_deinit(0)); +#endif +} From 497fc7ed185197f61b7abbde7c89e0a8154e8d82 Mon Sep 17 00:00:00 2001 From: "nilesh.kale" Date: Tue, 13 May 2025 17:01:07 +0530 Subject: [PATCH 172/213] feat: enabled ECDSA-P192 support for ESP32H2 --- .../src/esp32h2/secure_boot_secure_features.c | 9 ++- .../bootloader_support/src/secure_boot.c | 21 ++++++ components/efuse/include/esp_efuse.h | 45 +++++++++++- components/efuse/src/esp_efuse_fields.c | 70 +++++++++++++++++++ components/esp_security/Kconfig | 8 +++ components/esp_security/src/init.c | 9 +++ components/hal/esp32h2/efuse_hal.c | 13 +++- components/hal/esp32h2/include/hal/ecdsa_ll.h | 10 +++ .../hal/esp32h2/include/hal/efuse_hal.h | 9 ++- components/hal/esp32h2/include/hal/efuse_ll.h | 7 +- .../test_apps/crypto/main/Kconfig.projbuild | 2 +- .../test_apps/crypto/main/ecdsa/test_ecdsa.c | 30 ++++++-- components/mbedtls/port/ecdsa/ecdsa_alt.c | 4 +- .../test_apps/main/test_mbedtls_ecdsa.c | 7 ++ .../esp32h2/include/soc/Kconfig.soc_caps.in | 4 ++ components/soc/esp32h2/include/soc/soc_caps.h | 2 + docs/en/api-reference/peripherals/ecdsa.rst | 12 ++++ 17 files changed, 248 insertions(+), 14 deletions(-) diff --git a/components/bootloader_support/src/esp32h2/secure_boot_secure_features.c b/components/bootloader_support/src/esp32h2/secure_boot_secure_features.c index 9ea0f69e4b9..da7f84df5c5 100644 --- a/components/bootloader_support/src/esp32h2/secure_boot_secure_features.c +++ b/components/bootloader_support/src/esp32h2/secure_boot_secure_features.c @@ -1,10 +1,11 @@ /* - * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ #include +#include "hal/ecdsa_ll.h" #include "esp_flash_encrypt.h" #include "esp_secure_boot.h" #include "esp_efuse.h" @@ -36,6 +37,12 @@ esp_err_t esp_secure_boot_enable_secure_features(void) ESP_LOGW(TAG, "UART ROM Download mode kept enabled - SECURITY COMPROMISED"); #endif +#ifdef SOC_ECDSA_P192_CURVE_DEFAULT_DISABLED + if (ecdsa_ll_is_configurable_curve_supported()) { + esp_efuse_write_field_bit(ESP_EFUSE_WR_DIS_ECDSA_CURVE_MODE); + } +#endif + #ifndef CONFIG_SECURE_BOOT_ALLOW_JTAG ESP_LOGI(TAG, "Disable hardware & software JTAG..."); esp_efuse_write_field_bit(ESP_EFUSE_DIS_PAD_JTAG); diff --git a/components/bootloader_support/src/secure_boot.c b/components/bootloader_support/src/secure_boot.c index 9df2e6278c3..6bf584e32bb 100644 --- a/components/bootloader_support/src/secure_boot.c +++ b/components/bootloader_support/src/secure_boot.c @@ -12,6 +12,10 @@ #include "esp_secure_boot.h" #include "hal/efuse_hal.h" +#ifdef SOC_ECDSA_SUPPORTED +#include "hal/ecdsa_ll.h" +#endif + #ifndef BOOTLOADER_BUILD static __attribute__((unused)) const char *TAG = "secure_boot"; @@ -340,6 +344,23 @@ bool esp_secure_boot_cfg_verify_release_mode(void) #endif } +#ifdef SOC_ECDSA_P192_CURVE_DEFAULT_DISABLED + if (ecdsa_ll_is_configurable_curve_supported()) { + secure = esp_efuse_read_field_bit(ESP_EFUSE_WR_DIS_ECDSA_CURVE_MODE); + if (!secure) { + uint8_t current_curve; + esp_err_t err = esp_efuse_read_field_blob(ESP_EFUSE_ECDSA_CURVE_MODE, ¤t_curve, ESP_EFUSE_ECDSA_CURVE_MODE[0]->bit_count); + if (err == ESP_OK) { + if (current_curve != ESP_EFUSE_ECDSA_CURVE_MODE_ALLOW_ONLY_P256_BIT_LOCKED) { + // If not P256 mode + result &= secure; + ESP_LOGW(TAG, "Not write disabled ECDSA curve mode (set WR_DIS_ECDSA_CURVE_MODE->1)"); + } + } + } + } +#endif + #ifdef CONFIG_SECURE_BOOT_ENABLE_AGGRESSIVE_KEY_REVOKE secure = esp_efuse_read_field_bit(ESP_EFUSE_SECURE_BOOT_AGGRESSIVE_REVOKE); result &= secure; diff --git a/components/efuse/include/esp_efuse.h b/components/efuse/include/esp_efuse.h index be3aca8e189..d18348fe473 100644 --- a/components/efuse/include/esp_efuse.h +++ b/components/efuse/include/esp_efuse.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2017-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2017-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -159,7 +159,7 @@ esp_err_t esp_efuse_write_field_cnt(const esp_efuse_desc_t* field[], size_t cnt) * * @return * - ESP_OK: The operation was successfully completed, or the bit was already set to value 1. - * - ESP_ERR_INVALID_ARG: Error in the passed arugments, including if the efuse field is not 1 bit wide. + * - ESP_ERR_INVALID_ARG: Error in the passed arguments, including if the efuse field is not 1 bit wide. */ esp_err_t esp_efuse_write_field_bit(const esp_efuse_desc_t* field[]); @@ -468,7 +468,7 @@ esp_err_t esp_efuse_batch_write_begin(void); * * @return * - ESP_OK: Successful. - * - ESP_ERR_INVALID_STATE: Tha batch mode was not set. + * - ESP_ERR_INVALID_STATE: The batch mode was not set. */ esp_err_t esp_efuse_batch_write_cancel(void); @@ -806,6 +806,45 @@ esp_err_t esp_efuse_check_errors(void); */ esp_err_t esp_efuse_destroy_block(esp_efuse_block_t block); +#if SOC_ECDSA_SUPPORTED +/** + * @brief Checks if 192-bit ECDSA curve operations are supported. + * + * This function checks if the current eFuse configuration supports 192-bit ECDSA curve operations. +*/ +bool esp_efuse_is_ecdsa_p192_curve_supported(void); + +/** + * @brief Checks if 256-bit ECDSA curve operations are supported. + * + * This function checks if the current eFuse configuration supports 256-bit ECDSA curve operations. +*/ +bool esp_efuse_is_ecdsa_p256_curve_supported(void); +#endif /* SOC_ECDSA_SUPPORTED*/ + +#if SOC_ECDSA_P192_CURVE_DEFAULT_DISABLED +typedef enum { + ESP_EFUSE_ECDSA_CURVE_MODE_ALLOW_ONLY_P256_BIT = 0, + ESP_EFUSE_ECDSA_CURVE_MODE_ALLOW_ONLY_P192_BIT = 1, + ESP_EFUSE_ECDSA_CURVE_MODE_ALLOW_BOTH_P192_P256_BIT = 2, + ESP_EFUSE_ECDSA_CURVE_MODE_ALLOW_ONLY_P256_BIT_LOCKED = 3, +} esp_efuse_ecdsa_curve_mode_t; + +/** + * @brief Enables 192-bit ECDSA curve operations by setting the appropriate eFuse value. + * + * This function enables support for 192-bit ECDSA curve operations by configuring the + * ECDSA curve mode eFuse. It checks the current curve mode and attempts to set it to + * allow both P192 and P256 operations if not already set. + * + * @return + * - ESP_OK: Successfully enabled 192-bit ECDSA operations or already enabled + * - ESP_FAIL: Failed to enable operations due to write protection + * - Other error codes: Failed to read/write eFuse + */ +esp_err_t esp_efuse_enable_ecdsa_p192_curve_mode(void); +#endif + #ifdef __cplusplus } #endif diff --git a/components/efuse/src/esp_efuse_fields.c b/components/efuse/src/esp_efuse_fields.c index 7672c0716f3..8758bcf0739 100644 --- a/components/efuse/src/esp_efuse_fields.c +++ b/components/efuse/src/esp_efuse_fields.c @@ -16,6 +16,13 @@ #include "esp_log.h" #include "soc/efuse_periph.h" #include "sys/param.h" +#include "soc/soc_caps.h" +#include "hal/efuse_ll.h" +#include "hal/efuse_hal.h" + +#ifdef SOC_ECDSA_SUPPORTED +#include "hal/ecdsa_ll.h" +#endif /* SOC_ECDSA_SUPPORTED */ static __attribute__((unused)) const char *TAG = "efuse"; @@ -81,3 +88,66 @@ esp_err_t esp_efuse_update_secure_version(uint32_t secure_version) } return ESP_OK; } + +#if SOC_ECDSA_SUPPORTED +bool esp_efuse_is_ecdsa_p192_curve_supported(void) +{ +#if SOC_ECDSA_P192_CURVE_DEFAULT_DISABLED + if (ecdsa_ll_is_configurable_curve_supported()) { + uint32_t current_curve = efuse_hal_get_ecdsa_curve_mode(); + return (current_curve == ESP_EFUSE_ECDSA_CURVE_MODE_ALLOW_BOTH_P192_P256_BIT || current_curve == ESP_EFUSE_ECDSA_CURVE_MODE_ALLOW_ONLY_P192_BIT); + } else { + return true; + } +#else + return true; +#endif /* SOC_ECDSA_P192_CURVE_DEFAULT_DISABLED */ +} + +bool esp_efuse_is_ecdsa_p256_curve_supported(void) +{ +#if SOC_ECDSA_P192_CURVE_DEFAULT_DISABLED + if (ecdsa_ll_is_configurable_curve_supported()) { + uint32_t current_curve = efuse_hal_get_ecdsa_curve_mode(); + return (current_curve != ESP_EFUSE_ECDSA_CURVE_MODE_ALLOW_ONLY_P192_BIT); + } else { + return true; + } +#else + return true; +#endif /* SOC_ECDSA_P192_CURVE_DEFAULT_DISABLED */ +} +#endif /* SOC_ECDSA_SUPPORTED */ + +#if SOC_ECDSA_P192_CURVE_DEFAULT_DISABLED +esp_err_t esp_efuse_enable_ecdsa_p192_curve_mode(void) +{ + + if (ecdsa_ll_is_configurable_curve_supported()) { + esp_err_t err; + uint8_t current_curve, next_curve; + + current_curve = efuse_hal_get_ecdsa_curve_mode(); + // Check if already in desired state + if (current_curve == ESP_EFUSE_ECDSA_CURVE_MODE_ALLOW_BOTH_P192_P256_BIT || current_curve == ESP_EFUSE_ECDSA_CURVE_MODE_ALLOW_ONLY_P192_BIT) { + ESP_EARLY_LOGD(TAG, "ECDSA P-192 curve mode is already enabled"); + return ESP_OK; + } + + // Check if write is disabled or already locked to P256 + if (esp_efuse_read_field_bit(ESP_EFUSE_WR_DIS_ECDSA_CURVE_MODE) || current_curve == ESP_EFUSE_ECDSA_CURVE_MODE_ALLOW_ONLY_P256_BIT_LOCKED) { + ESP_EARLY_LOGE(TAG, "ECDSA curve mode is locked, cannot enable P-192 curve"); + return ESP_FAIL; + } + + // Attempt to write new curve mode + next_curve = ESP_EFUSE_ECDSA_CURVE_MODE_ALLOW_BOTH_P192_P256_BIT; + err = esp_efuse_write_field_blob(ESP_EFUSE_ECDSA_CURVE_MODE, &next_curve, ESP_EFUSE_ECDSA_CURVE_MODE[0]->bit_count); + if (err != ESP_OK) { + ESP_EARLY_LOGE(TAG, "Failed to enable ECDSA P-192 curve %d", err); + return err; + } + } + return ESP_OK; +} +#endif /* SOC_ECDSA_P192_CURVE_DEFAULT_DISABLED */ diff --git a/components/esp_security/Kconfig b/components/esp_security/Kconfig index 7a8c9ff6316..908d02961be 100644 --- a/components/esp_security/Kconfig +++ b/components/esp_security/Kconfig @@ -50,4 +50,12 @@ menu "ESP Security Specific" the cases when trusted boot is not enabled and the attacker tries carrying out non-constant time point multiplication operations by changing the default ESP-IDF configurations. Performing constant time operations protect the ECC multiplication operations from timing attacks. + + config ESP_ECDSA_ENABLE_P192_CURVE + bool "Enable ECDSA 192-curve operations" + depends on SOC_ECDSA_P192_CURVE_DEFAULT_DISABLED + default N + help + By default, only the 256-bit curve operations are allowed. If this configuration is enabled, + it will set the eFuse to allow ECDSA operations using both the 192-bit and 256-bit curves. endmenu diff --git a/components/esp_security/src/init.c b/components/esp_security/src/init.c index ab75144cdac..11d01f89d91 100644 --- a/components/esp_security/src/init.c +++ b/components/esp_security/src/init.c @@ -58,6 +58,15 @@ ESP_SYSTEM_INIT_FN(esp_security_init, SECONDARY, BIT(0), 103) } } #endif + +#if CONFIG_ESP_ECDSA_ENABLE_P192_CURVE + esp_err_t err; + err = esp_efuse_enable_ecdsa_p192_curve_mode(); + if (err != ESP_OK) { + return err; + } +#endif + return ESP_OK; } diff --git a/components/hal/esp32h2/efuse_hal.c b/components/hal/esp32h2/efuse_hal.c index 94a1051713a..f6d1c0f40a8 100644 --- a/components/hal/esp32h2/efuse_hal.c +++ b/components/hal/esp32h2/efuse_hal.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -7,6 +7,7 @@ #include #include "sdkconfig.h" #include "soc/soc_caps.h" +#include "soc/chip_revision.h" #include "hal/assert.h" #include "hal/efuse_hal.h" #include "hal/efuse_ll.h" @@ -79,6 +80,16 @@ void efuse_hal_rs_calculate(const void *data, void *rs_values) ets_efuse_rs_calculate(data, rs_values); } +uint32_t efuse_hal_get_ecdsa_curve_mode(void) +{ + if (ESP_CHIP_REV_ABOVE(efuse_hal_chip_revision(), 102)) { + return efuse_ll_get_ecdsa_curve_mode(); + } else { + // Curve mode is not configurable for previous versions + return 0; + } +} + /******************* eFuse control functions *************************/ bool efuse_hal_is_coding_error_in_block(unsigned block) diff --git a/components/hal/esp32h2/include/hal/ecdsa_ll.h b/components/hal/esp32h2/include/hal/ecdsa_ll.h index bea4ef26efb..ff83a3709dc 100644 --- a/components/hal/esp32h2/include/hal/ecdsa_ll.h +++ b/components/hal/esp32h2/include/hal/ecdsa_ll.h @@ -378,6 +378,16 @@ static inline int ecdsa_ll_get_operation_result(void) return REG_GET_BIT(ECDSA_RESULT_REG, ECDSA_OPERATION_RESULT); } +/** + * @brief Check if the ECDSA curves configuration is supported + * The ECDSA curves configuration is only avliable in chip version + * above 1.2 in ESP32-H2 + */ +static inline bool ecdsa_ll_is_configurable_curve_supported(void) +{ + return ESP_CHIP_REV_ABOVE(efuse_hal_chip_revision(), 102); +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32h2/include/hal/efuse_hal.h b/components/hal/esp32h2/include/hal/efuse_hal.h index b6c83d6da6d..37c4f72cd95 100644 --- a/components/hal/esp32h2/include/hal/efuse_hal.h +++ b/components/hal/esp32h2/include/hal/efuse_hal.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -54,6 +54,13 @@ void efuse_hal_program(uint32_t block); */ void efuse_hal_rs_calculate(const void *data, void *rs_values); +/** + * @brief Get ECDSA curve mode + * + * @return ECDSA curve mode + */ +uint32_t efuse_hal_get_ecdsa_curve_mode(void); + /** * @brief Checks coding error in a block * diff --git a/components/hal/esp32h2/include/hal/efuse_ll.h b/components/hal/esp32h2/include/hal/efuse_ll.h index 16226aa4631..09055e2df5e 100644 --- a/components/hal/esp32h2/include/hal/efuse_ll.h +++ b/components/hal/esp32h2/include/hal/efuse_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -20,6 +20,11 @@ extern "C" { /******************* eFuse fields *************************/ +__attribute__((always_inline)) static inline uint32_t efuse_ll_get_ecdsa_curve_mode(void) +{ + return EFUSE.rd_repeat_data0.ecdsa_curve_mode; +} + __attribute__((always_inline)) static inline uint32_t efuse_ll_get_flash_crypt_cnt(void) { return EFUSE.rd_repeat_data1.spi_boot_crypt_cnt; diff --git a/components/hal/test_apps/crypto/main/Kconfig.projbuild b/components/hal/test_apps/crypto/main/Kconfig.projbuild index ee68e84f19b..f51dbf67ca2 100644 --- a/components/hal/test_apps/crypto/main/Kconfig.projbuild +++ b/components/hal/test_apps/crypto/main/Kconfig.projbuild @@ -22,7 +22,7 @@ menu "Test App Configuration" Enabling this option includes HMAC Peripheral related test cases in the build for supported targets. config CRYPTO_TEST_APP_ENABLE_ECDSA_TESTS - depends on !CRYPTO_TEST_APP_ENABLE_HMAC_TESTS + depends on SOC_ECDSA_SUPPORTED && !CRYPTO_TEST_APP_ENABLE_HMAC_TESTS bool "Enable ECDSA Peripheral test cases" default n help diff --git a/components/hal/test_apps/crypto/main/ecdsa/test_ecdsa.c b/components/hal/test_apps/crypto/main/ecdsa/test_ecdsa.c index 6d29b0fccfc..5fa292c42f7 100644 --- a/components/hal/test_apps/crypto/main/ecdsa/test_ecdsa.c +++ b/components/hal/test_apps/crypto/main/ecdsa/test_ecdsa.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: CC0-1.0 */ @@ -12,6 +12,8 @@ #include "esp_efuse_chip.h" #include "esp_private/esp_crypto_lock_internal.h" #include "esp_random.h" +#include "esp_log.h" +#include "esp_efuse.h" #include "hal/ecc_ll.h" #include "hal/ecdsa_hal.h" #include "hal/ecdsa_ll.h" @@ -27,6 +29,8 @@ #include "ecdsa_params.h" #include "hal_crypto_common.h" +__attribute__((unused)) static const char * TAG = "crypto_test"; + static void ecdsa_enable_and_reset(void) { ECDSA_RCC_ATOMIC() { @@ -282,17 +286,29 @@ TEST_TEAR_DOWN(ecdsa) TEST(ecdsa, ecdsa_SECP192R1_signature_verification) { - TEST_ASSERT_EQUAL(0, test_ecdsa_verify(0, sha, ecdsa192_r, ecdsa192_s, ecdsa192_pub_x, ecdsa192_pub_y)); + if (!esp_efuse_is_ecdsa_p192_curve_supported()) { + ESP_LOGI(TAG, "Skipping test because ECDSA 192-curve operations are disabled."); + } else { + TEST_ASSERT_EQUAL(0, test_ecdsa_verify(0, sha, ecdsa192_r, ecdsa192_s, ecdsa192_pub_x, ecdsa192_pub_y)); + } } TEST(ecdsa, ecdsa_SECP192R1_sign_and_verify) { - test_ecdsa_sign_and_verify(0, sha, ecdsa192_pub_x, ecdsa192_pub_y, false, ECDSA_K_TYPE_TRNG); + if (!esp_efuse_is_ecdsa_p192_curve_supported()) { + ESP_LOGI(TAG, "Skipping test because ECDSA 192-curve operations are disabled."); + } else { + test_ecdsa_sign_and_verify(0, sha, ecdsa192_pub_x, ecdsa192_pub_y, false, ECDSA_K_TYPE_TRNG); + } } TEST(ecdsa, ecdsa_SECP192R1_corrupt_signature) { - test_ecdsa_corrupt_data(0, sha, ecdsa192_r, ecdsa192_s, ecdsa192_pub_x, ecdsa192_pub_y); + if (!esp_efuse_is_ecdsa_p192_curve_supported()) { + ESP_LOGI(TAG, "Skipping test because ECDSA 192-curve operations are disabled."); + } else { + test_ecdsa_corrupt_data(0, sha, ecdsa192_r, ecdsa192_s, ecdsa192_pub_x, ecdsa192_pub_y); + } } TEST(ecdsa, ecdsa_SECP256R1_signature_verification) @@ -325,7 +341,11 @@ TEST(ecdsa, ecdsa_SECP256R1_det_sign_and_verify) #ifdef SOC_ECDSA_SUPPORT_EXPORT_PUBKEY TEST(ecdsa, ecdsa_SECP192R1_export_pubkey) { - test_ecdsa_export_pubkey(0, ecdsa192_pub_x, ecdsa192_pub_y, 0); + if (!esp_efuse_is_ecdsa_p192_curve_supported()) { + ESP_LOGI(TAG, "Skipping test because ECDSA 192-curve operations are disabled."); + } else { + test_ecdsa_export_pubkey(0, ecdsa192_pub_x, ecdsa192_pub_y, 0); + } } TEST(ecdsa, ecdsa_SECP256R1_export_pubkey) diff --git a/components/mbedtls/port/ecdsa/ecdsa_alt.c b/components/mbedtls/port/ecdsa/ecdsa_alt.c index 7dd3e6d01e9..198ef085d66 100644 --- a/components/mbedtls/port/ecdsa/ecdsa_alt.c +++ b/components/mbedtls/port/ecdsa/ecdsa_alt.c @@ -712,7 +712,9 @@ int __wrap_mbedtls_ecdsa_verify_restartable(mbedtls_ecp_group *grp, const mbedtls_mpi *s, mbedtls_ecdsa_restart_ctx *rs_ctx) { - if ((grp->id == MBEDTLS_ECP_DP_SECP192R1 || grp->id == MBEDTLS_ECP_DP_SECP256R1) && blen == ECDSA_SHA_LEN) { + if (((grp->id == MBEDTLS_ECP_DP_SECP192R1 && esp_efuse_is_ecdsa_p192_curve_supported()) + || (grp->id == MBEDTLS_ECP_DP_SECP256R1 && esp_efuse_is_ecdsa_p256_curve_supported())) + && blen == ECDSA_SHA_LEN) { return esp_ecdsa_verify(grp, buf, blen, Q, r, s); } else { return __real_mbedtls_ecdsa_verify_restartable(grp, buf, blen, Q, r, s, rs_ctx); diff --git a/components/mbedtls/test_apps/main/test_mbedtls_ecdsa.c b/components/mbedtls/test_apps/main/test_mbedtls_ecdsa.c index 768516d35ca..12eec80b235 100644 --- a/components/mbedtls/test_apps/main/test_mbedtls_ecdsa.c +++ b/components/mbedtls/test_apps/main/test_mbedtls_ecdsa.c @@ -26,6 +26,11 @@ #if SOC_KEY_MANAGER_SUPPORTED #include "esp_key_mgr.h" #endif + +#if SOC_ECDSA_SUPPORTED +#include "hal/ecdsa_ll.h" +#endif + #define TEST_ASSERT_MBEDTLS_OK(X) TEST_ASSERT_EQUAL_HEX32(0, -(X)) #if CONFIG_NEWLIB_NANO_FORMAT @@ -36,6 +41,8 @@ #define NEWLIB_NANO_COMPAT_CAST(int64_t_var) int64_t_var #endif +__attribute__((unused)) static const char * TAG = "mbedtls_test"; + /* * All the following values are in big endian format, as required by the mbedTLS APIs */ diff --git a/components/soc/esp32h2/include/soc/Kconfig.soc_caps.in b/components/soc/esp32h2/include/soc/Kconfig.soc_caps.in index 76acf2f0bda..73dc682277e 100644 --- a/components/soc/esp32h2/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32h2/include/soc/Kconfig.soc_caps.in @@ -1303,6 +1303,10 @@ config SOC_ECDSA_USES_MPI bool default y +config SOC_ECDSA_P192_CURVE_DEFAULT_DISABLED + bool + default y + config SOC_UART_NUM int default 2 diff --git a/components/soc/esp32h2/include/soc/soc_caps.h b/components/soc/esp32h2/include/soc/soc_caps.h index 4da526658fc..f8ebaa02e23 100644 --- a/components/soc/esp32h2/include/soc/soc_caps.h +++ b/components/soc/esp32h2/include/soc/soc_caps.h @@ -523,6 +523,8 @@ /*------------------------- ECDSA CAPS -------------------------*/ #define SOC_ECDSA_USES_MPI (1) +#define SOC_ECDSA_P192_CURVE_DEFAULT_DISABLED (1) + /*-------------------------- UART CAPS ---------------------------------------*/ // ESP32-H2 has 2 UARTs #define SOC_UART_NUM (2) diff --git a/docs/en/api-reference/peripherals/ecdsa.rst b/docs/en/api-reference/peripherals/ecdsa.rst index 06f8a8a5051..74444ade75e 100644 --- a/docs/en/api-reference/peripherals/ecdsa.rst +++ b/docs/en/api-reference/peripherals/ecdsa.rst @@ -61,6 +61,18 @@ Following code snippet uses :cpp:func:`esp_efuse_write_key` to set physical key // writing key failed, maybe written already } + +.. only:: SOC_ECDSA_P192_CURVE_DEFAULT_DISABLED + + ECDSA Curve Configuration + ------------------------- + + The ECDSA peripheral of the {IDF_TARGET_NAME} supports both ECDSA-P192 and ECDSA-P256 operations. However, starting with {IDF_TARGET_NAME} revision 1.2, only ECDSA-P256 operations are enabled by default. You can enable ECDSA-P192 operations using the following configuration options: + + - :ref:`CONFIG_ESP_ECDSA_ENABLE_P192_CURVE` enables support for ECDSA-P192 curve operations, allowing the device to perform ECDSA operations with both 192-bit and 256-bit curves. However, if ECDSA-P192 operations have already been permanently disabled during eFuse write protection, enabling this option can not re-enable ECDSA-P192 curve operations. + + - :cpp:func:`esp_efuse_enable_ecdsa_p192_curve_mode()` enables ECDSA-P192 curve operations programmatically by writing the appropriate value to the eFuse, allowing both P-192 and P-256 curve operations. Note that this API will fail if the eFuse is already write-protected. + .. only:: SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE Deterministic Signature Generation From cebbedbac2b9c2562f62d960172a4010e859ed24 Mon Sep 17 00:00:00 2001 From: "nilesh.kale" Date: Tue, 13 May 2025 17:36:57 +0530 Subject: [PATCH 173/213] feat: enable support for deterministic mode for esp32h2 --- components/hal/ecdsa_hal.c | 15 +++-- components/hal/esp32c5/include/hal/ecdsa_ll.h | 13 +--- components/hal/esp32h2/include/hal/ecdsa_ll.h | 30 ++++++++++ components/hal/esp32p4/include/hal/ecdsa_ll.h | 10 +++- .../test_apps/crypto/main/ecdsa/test_ecdsa.c | 28 ++++++--- components/mbedtls/port/ecdsa/ecdsa_alt.c | 59 +++++++++++++------ .../test_apps/main/test_mbedtls_ecdsa.c | 12 +++- .../esp32h2/include/soc/Kconfig.soc_caps.in | 8 +++ components/soc/esp32h2/include/soc/soc_caps.h | 2 + 9 files changed, 128 insertions(+), 49 deletions(-) diff --git a/components/hal/ecdsa_hal.c b/components/hal/ecdsa_hal.c index 5c10802e2c9..8f5d463a26c 100644 --- a/components/hal/ecdsa_hal.c +++ b/components/hal/ecdsa_hal.c @@ -47,10 +47,13 @@ static void configure_ecdsa_periph(ecdsa_hal_config_t *conf) } #if SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE - ecdsa_ll_set_k_type(conf->sign_type); - - if (conf->sign_type == ECDSA_K_TYPE_DETERMINISITIC) { - ecdsa_ll_set_deterministic_loop(conf->loop_number); + if (ecdsa_ll_is_deterministic_mode_supported()) { + ecdsa_ll_set_k_type(conf->sign_type); +#if !SOC_ECDSA_SUPPORT_HW_DETERMINISTIC_LOOP + if (conf->sign_type == ECDSA_K_TYPE_DETERMINISITIC) { + ecdsa_ll_set_deterministic_loop(conf->loop_number); + } +#endif /* !SOC_ECDSA_SUPPORT_HW_DETERMINISTIC_LOOP */ } #endif } @@ -224,11 +227,11 @@ void ecdsa_hal_export_pubkey(ecdsa_hal_config_t *conf, uint8_t *pub_x, uint8_t * } #endif /* SOC_ECDSA_SUPPORT_EXPORT_PUBKEY */ -#ifdef SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE +#if SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE && !SOC_ECDSA_SUPPORT_HW_DETERMINISTIC_LOOP bool ecdsa_hal_det_signature_k_check(void) { return (ecdsa_ll_check_k_value() == 0); } -#endif /* SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE */ +#endif /* SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE && !SOC_ECDSA_SUPPORT_HW_DETERMINISTIC_LOOP */ diff --git a/components/hal/esp32c5/include/hal/ecdsa_ll.h b/components/hal/esp32c5/include/hal/ecdsa_ll.h index 58bb389aeb6..225a86d40a3 100644 --- a/components/hal/esp32c5/include/hal/ecdsa_ll.h +++ b/components/hal/esp32c5/include/hal/ecdsa_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -415,17 +415,6 @@ static inline int ecdsa_ll_get_operation_result(void) return REG_GET_BIT(ECDSA_RESULT_REG, ECDSA_OPERATION_RESULT); } -/** - * @brief Check if the k value is greater than the curve order. - * - * @return 0, k value is not greater than the curve order. In this case, the k value is the set k value. - * @return 1, k value is greater than than the curve order. In this case, the k value is the set (k mod n). - */ -static inline int ecdsa_ll_check_k_value(void) -{ - return REG_GET_BIT(ECDSA_RESULT_REG, ECDSA_K_VALUE_WARNING); -} - #ifdef __cplusplus } #endif diff --git a/components/hal/esp32h2/include/hal/ecdsa_ll.h b/components/hal/esp32h2/include/hal/ecdsa_ll.h index ff83a3709dc..65299c12190 100644 --- a/components/hal/esp32h2/include/hal/ecdsa_ll.h +++ b/components/hal/esp32h2/include/hal/ecdsa_ll.h @@ -211,6 +211,26 @@ static inline void ecdsa_ll_set_z_mode(ecdsa_ll_sha_mode_t mode) } } +/** + * @brief Set the signature generation type of ECDSA operation + * + * @param type Type of the ECDSA signature + */ +static inline void ecdsa_ll_set_k_type(ecdsa_sign_type_t type) +{ + switch (type) { + case ECDSA_K_TYPE_TRNG: + REG_CLR_BIT(ECDSA_CONF_REG, ECDSA_DETERMINISTIC_K); + break; + case ECDSA_K_TYPE_DETERMINISITIC: + REG_SET_BIT(ECDSA_CONF_REG, ECDSA_DETERMINISTIC_K); + break; + default: + HAL_ASSERT(false && "Unsupported K type"); + break; + } +} + /** * @brief Set the stage of ECDSA operation * @@ -388,6 +408,16 @@ static inline bool ecdsa_ll_is_configurable_curve_supported(void) return ESP_CHIP_REV_ABOVE(efuse_hal_chip_revision(), 102); } +/** + * @brief Check if the ECDSA deterministic mode is supported + * The ECDSA deterministic mode is only available in chip version + * above 1.2 in ESP32-H2 + */ +static inline bool ecdsa_ll_is_deterministic_mode_supported(void) +{ + return ESP_CHIP_REV_ABOVE(efuse_hal_chip_revision(), 102); +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32p4/include/hal/ecdsa_ll.h b/components/hal/esp32p4/include/hal/ecdsa_ll.h index f3429cf1b28..1e8a713f75c 100644 --- a/components/hal/esp32p4/include/hal/ecdsa_ll.h +++ b/components/hal/esp32p4/include/hal/ecdsa_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -432,6 +432,14 @@ static inline int ecdsa_ll_check_k_value(void) return REG_GET_BIT(ECDSA_RESULT_REG, ECDSA_K_VALUE_WARNING); } +/** + * @brief Check if the ECDSA deterministic mode is supported + */ +static inline bool ecdsa_ll_is_deterministic_mode_supported(void) +{ + return true; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/test_apps/crypto/main/ecdsa/test_ecdsa.c b/components/hal/test_apps/crypto/main/ecdsa/test_ecdsa.c index 5fa292c42f7..c7ddbeecd72 100644 --- a/components/hal/test_apps/crypto/main/ecdsa/test_ecdsa.c +++ b/components/hal/test_apps/crypto/main/ecdsa/test_ecdsa.c @@ -151,9 +151,9 @@ void test_ecdsa_sign(bool is_p256, uint8_t* sha, uint8_t* r_le, uint8_t* s_le, b uint8_t zeroes[32] = {0}; uint16_t len; -#ifdef SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE +#if !SOC_ECDSA_SUPPORT_HW_DETERMINISTIC_LOOP uint16_t det_loop_number = 1; -#endif /* SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE */ +#endif /* !SOC_ECDSA_SUPPORT_HW_DETERMINISTIC_LOOP */ ecdsa_hal_config_t conf = { .mode = ECDSA_MODE_SIGN_GEN, @@ -184,11 +184,11 @@ void test_ecdsa_sign(bool is_p256, uint8_t* sha, uint8_t* r_le, uint8_t* s_le, b bool process_again = false; do { -#ifdef SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE - if (k_type == ECDSA_K_TYPE_DETERMINISITIC) { +#if !SOC_ECDSA_SUPPORT_HW_DETERMINISTIC_LOOP + if (ecdsa_ll_is_deterministic_mode_supported() && k_type == ECDSA_K_TYPE_DETERMINISITIC) { conf.loop_number = det_loop_number++; } -#endif /* SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE */ +#endif /* !SOC_ECDSA_SUPPORT_HW_DETERMINISTIC_LOOP */ ecdsa_hal_gen_signature(&conf, sha_le, r_le, s_le, len); @@ -196,8 +196,8 @@ void test_ecdsa_sign(bool is_p256, uint8_t* sha, uint8_t* r_le, uint8_t* s_le, b || !memcmp(r_le, zeroes, len) || !memcmp(s_le, zeroes, len); -#ifdef SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE - if (k_type == ECDSA_K_TYPE_DETERMINISITIC) { +#if SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE && !SOC_ECDSA_SUPPORT_HW_DETERMINISTIC_LOOP + if (ecdsa_ll_is_deterministic_mode_supported() && k_type == ECDSA_K_TYPE_DETERMINISITIC) { process_again |= !ecdsa_hal_det_signature_k_check(); } #endif /* SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE */ @@ -329,12 +329,22 @@ TEST(ecdsa, ecdsa_SECP256R1_corrupt_signature) #ifdef SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE TEST(ecdsa, ecdsa_SECP192R1_det_sign_and_verify) { - test_ecdsa_sign_and_verify(0, sha, ecdsa192_pub_x, ecdsa192_pub_y, false, ECDSA_K_TYPE_DETERMINISITIC); + if (!ecdsa_ll_is_deterministic_mode_supported()) { + ESP_LOGI(TAG, "Skipping test because ECDSA deterministic mode is not supported."); + } else if (!esp_efuse_is_ecdsa_p192_curve_supported()) { + ESP_LOGI(TAG, "Skipping test because ECDSA 192-curve operations are disabled."); + } else { + test_ecdsa_sign_and_verify(0, sha, ecdsa192_pub_x, ecdsa192_pub_y, false, ECDSA_K_TYPE_DETERMINISITIC); + } } TEST(ecdsa, ecdsa_SECP256R1_det_sign_and_verify) { - test_ecdsa_sign_and_verify(1, sha, ecdsa256_pub_x, ecdsa256_pub_y, false, ECDSA_K_TYPE_DETERMINISITIC); + if (!ecdsa_ll_is_deterministic_mode_supported()) { + ESP_LOGI(TAG, "Skipping test because ECDSA deterministic mode is not supported."); + } else { + test_ecdsa_sign_and_verify(1, sha, ecdsa256_pub_x, ecdsa256_pub_y, false, ECDSA_K_TYPE_DETERMINISITIC); + } } #endif /* SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE */ diff --git a/components/mbedtls/port/ecdsa/ecdsa_alt.c b/components/mbedtls/port/ecdsa/ecdsa_alt.c index 198ef085d66..96a14e7930d 100644 --- a/components/mbedtls/port/ecdsa/ecdsa_alt.c +++ b/components/mbedtls/port/ecdsa/ecdsa_alt.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -337,9 +337,9 @@ static int esp_ecdsa_sign(mbedtls_ecp_group *grp, mbedtls_mpi* r, mbedtls_mpi* s bool process_again = false; -#ifdef SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE - uint16_t deterministic_loop_number = 1; -#endif /* SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE */ +#if !SOC_ECDSA_SUPPORT_HW_DETERMINISTIC_LOOP + uint16_t deterministic_loop_number __attribute__((unused)) = 1; +#endif /* !SOC_ECDSA_SUPPORT_HW_DETERMINISTIC_LOOP */ do { ecdsa_hal_config_t conf = { @@ -347,10 +347,12 @@ static int esp_ecdsa_sign(mbedtls_ecp_group *grp, mbedtls_mpi* r, mbedtls_mpi* s .curve = curve, .sha_mode = ECDSA_Z_USER_PROVIDED, .sign_type = k_type, -#ifdef SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE - .loop_number = deterministic_loop_number++, -#endif /* SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE */ }; +#if !SOC_ECDSA_SUPPORT_HW_DETERMINISTIC_LOOP + if (ecdsa_ll_is_deterministic_mode_supported()) { + conf.loop_number = deterministic_loop_number++; + } +#endif /* !SOC_ECDSA_SUPPORT_HW_DETERMINISTIC_LOOP */ if (use_km_key) { conf.use_km_key = 1; @@ -375,8 +377,8 @@ static int esp_ecdsa_sign(mbedtls_ecp_group *grp, mbedtls_mpi* r, mbedtls_mpi* s || !memcmp(r_le, zeroes, len) || !memcmp(s_le, zeroes, len); -#ifdef SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE - if (k_type == ECDSA_K_TYPE_DETERMINISITIC) { +#if SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE && !SOC_ECDSA_SUPPORT_HW_DETERMINISTIC_LOOP + if (ecdsa_ll_is_deterministic_mode_supported() && k_type == ECDSA_K_TYPE_DETERMINISITIC) { process_again |= !ecdsa_hal_det_signature_k_check(); } #endif /* SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE */ @@ -472,12 +474,18 @@ int __wrap_mbedtls_ecdsa_sign_det_ext(mbedtls_ecp_group *grp, mbedtls_mpi *r, /* * Check `d` whether it contains the hardware key */ +#if CONFIG_MBEDTLS_HARDWARE_ECDSA_SIGN if (d->MBEDTLS_PRIVATE(s) == ECDSA_KEY_MAGIC) { - // Use hardware ECDSA peripheral - return esp_ecdsa_sign(grp, r, s, d, buf, blen, ECDSA_K_TYPE_DETERMINISITIC); - } else { - return __real_mbedtls_ecdsa_sign_det_ext(grp, r, s, d, buf, blen, md_alg, f_rng_blind, p_rng_blind); + if (ecdsa_ll_is_deterministic_mode_supported()) { + // Use hardware ECDSA peripheral + return esp_ecdsa_sign(grp, r, s, d, buf, blen, ECDSA_K_TYPE_DETERMINISITIC); + } else { + return MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; + } } +#endif + // Fallback to software implementation + return __real_mbedtls_ecdsa_sign_det_ext(grp, r, s, d, buf, blen, md_alg, f_rng_blind, p_rng_blind); } extern int __real_mbedtls_ecdsa_sign_det_restartable(mbedtls_ecp_group *grp, @@ -507,12 +515,18 @@ int __wrap_mbedtls_ecdsa_sign_det_restartable(mbedtls_ecp_group *grp, /* * Check `d` whether it contains the hardware key */ +#if CONFIG_MBEDTLS_HARDWARE_ECDSA_SIGN if (d->MBEDTLS_PRIVATE(s) == ECDSA_KEY_MAGIC) { - // Use hardware ECDSA peripheral - return esp_ecdsa_sign(grp, r, s, d, buf, blen, ECDSA_K_TYPE_DETERMINISITIC); - } else { - return __real_mbedtls_ecdsa_sign_det_restartable(grp, r, s, d, buf, blen, md_alg, f_rng_blind, p_rng_blind, NULL); + if (ecdsa_ll_is_deterministic_mode_supported()) { + // Use hardware ECDSA peripheral + return esp_ecdsa_sign(grp, r, s, d, buf, blen, ECDSA_K_TYPE_DETERMINISITIC); + } else { + return MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; + } } +#endif + // Fallback to software implementation + return __real_mbedtls_ecdsa_sign_det_ext(grp, r, s, d, buf, blen, md_alg, f_rng_blind, p_rng_blind); } #endif /* SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE */ @@ -582,15 +596,22 @@ int __wrap_mbedtls_ecdsa_write_signature_restartable(mbedtls_ecdsa_context *ctx, mbedtls_mpi_init(&r); mbedtls_mpi_init(&s); + ecdsa_sign_type_t k_type = ECDSA_K_TYPE_TRNG; +#if defined(SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE) && defined(CONFIG_MBEDTLS_ECDSA_DETERMINISTIC) + if (ecdsa_ll_is_deterministic_mode_supported()) { + k_type = ECDSA_K_TYPE_DETERMINISITIC; + } +#endif + /* * Check `d` whether it contains the hardware key */ if (ctx->MBEDTLS_PRIVATE(d).MBEDTLS_PRIVATE(s) == ECDSA_KEY_MAGIC) { // Use hardware ECDSA peripheral #if defined(SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE) && defined(CONFIG_MBEDTLS_ECDSA_DETERMINISTIC) - MBEDTLS_MPI_CHK(esp_ecdsa_sign(&ctx->MBEDTLS_PRIVATE(grp), &r, &s, &ctx->MBEDTLS_PRIVATE(d), hash, hlen, ECDSA_K_TYPE_DETERMINISITIC)); + MBEDTLS_MPI_CHK(esp_ecdsa_sign(&ctx->MBEDTLS_PRIVATE(grp), &r, &s, &ctx->MBEDTLS_PRIVATE(d), hash, hlen, k_type)); #else - MBEDTLS_MPI_CHK(esp_ecdsa_sign(&ctx->MBEDTLS_PRIVATE(grp), &r, &s, &ctx->MBEDTLS_PRIVATE(d), hash, hlen, ECDSA_K_TYPE_TRNG)); + MBEDTLS_MPI_CHK(esp_ecdsa_sign(&ctx->MBEDTLS_PRIVATE(grp), &r, &s, &ctx->MBEDTLS_PRIVATE(d), hash, hlen, k_type)); #endif /* SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE */ } diff --git a/components/mbedtls/test_apps/main/test_mbedtls_ecdsa.c b/components/mbedtls/test_apps/main/test_mbedtls_ecdsa.c index 12eec80b235..2a4366b7208 100644 --- a/components/mbedtls/test_apps/main/test_mbedtls_ecdsa.c +++ b/components/mbedtls/test_apps/main/test_mbedtls_ecdsa.c @@ -274,12 +274,20 @@ TEST_CASE("mbedtls ECDSA signature generation on SECP256R1", "[mbedtls][efuse_ke TEST_CASE("mbedtls ECDSA deterministic signature generation on SECP192R1", "[mbedtls][efuse_key]") { - test_ecdsa_sign(MBEDTLS_ECP_DP_SECP192R1, sha, ecdsa192_sign_pub_x, ecdsa192_sign_pub_y, true, SECP192R1_EFUSE_BLOCK); + if (!ecdsa_ll_is_deterministic_mode_supported()) { + ESP_LOGI(TAG, "Skipping test because ECDSA deterministic mode is not supported."); + } else { + test_ecdsa_sign(MBEDTLS_ECP_DP_SECP192R1, sha, ecdsa192_sign_pub_x, ecdsa192_sign_pub_y, true, SECP192R1_EFUSE_BLOCK); + } } TEST_CASE("mbedtls ECDSA deterministic signature generation on SECP256R1", "[mbedtls][efuse_key]") { - test_ecdsa_sign(MBEDTLS_ECP_DP_SECP256R1, sha, ecdsa256_sign_pub_x, ecdsa256_sign_pub_y, true, SECP256R1_EFUSE_BLOCK); + if (!ecdsa_ll_is_deterministic_mode_supported()) { + ESP_LOGI(TAG, "Skipping test because ECDSA deterministic mode is not supported."); + } else { + test_ecdsa_sign(MBEDTLS_ECP_DP_SECP256R1, sha, ecdsa256_sign_pub_x, ecdsa256_sign_pub_y, true, SECP256R1_EFUSE_BLOCK); + } } #endif /* SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE */ diff --git a/components/soc/esp32h2/include/soc/Kconfig.soc_caps.in b/components/soc/esp32h2/include/soc/Kconfig.soc_caps.in index 73dc682277e..5e8cb0e51f7 100644 --- a/components/soc/esp32h2/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32h2/include/soc/Kconfig.soc_caps.in @@ -1303,6 +1303,14 @@ config SOC_ECDSA_USES_MPI bool default y +config SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE + bool + default y + +config SOC_ECDSA_SUPPORT_HW_DETERMINISTIC_LOOP + bool + default y + config SOC_ECDSA_P192_CURVE_DEFAULT_DISABLED bool default y diff --git a/components/soc/esp32h2/include/soc/soc_caps.h b/components/soc/esp32h2/include/soc/soc_caps.h index f8ebaa02e23..8148712fc29 100644 --- a/components/soc/esp32h2/include/soc/soc_caps.h +++ b/components/soc/esp32h2/include/soc/soc_caps.h @@ -523,6 +523,8 @@ /*------------------------- ECDSA CAPS -------------------------*/ #define SOC_ECDSA_USES_MPI (1) +#define SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE (1) +#define SOC_ECDSA_SUPPORT_HW_DETERMINISTIC_LOOP (1) #define SOC_ECDSA_P192_CURVE_DEFAULT_DISABLED (1) /*-------------------------- UART CAPS ---------------------------------------*/ From 80528d184d679170cbb18453baf7e792337e4e8b Mon Sep 17 00:00:00 2001 From: Zhang Shuxian Date: Tue, 20 May 2025 19:17:05 +0800 Subject: [PATCH 174/213] docs: Update CN translation for ecdsa.rst --- docs/zh_CN/api-reference/peripherals/ecdsa.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/zh_CN/api-reference/peripherals/ecdsa.rst b/docs/zh_CN/api-reference/peripherals/ecdsa.rst index c9e444bd24d..8267c9dfa2a 100644 --- a/docs/zh_CN/api-reference/peripherals/ecdsa.rst +++ b/docs/zh_CN/api-reference/peripherals/ecdsa.rst @@ -61,6 +61,18 @@ ECDSA 密钥可以通过 ``idf.py`` 脚本在外部编程。以下是关于编 // writing key failed, maybe written already } + +.. only:: SOC_ECDSA_P192_CURVE_DEFAULT_DISABLED + + ECDSA 曲线配置 + ----------------- + + {IDF_TARGET_NAME} 的 ECDSA 外设支持 ECDSA-P192 和 ECDSA-P256 两种曲线操作。但从 {IDF_TARGET_NAME} 版本 1.2 开始,默认仅启用 ECDSA-P256 操作。可以通过以下配置项启用 ECDSA-P192 操作: + + - :ref:`CONFIG_ESP_ECDSA_ENABLE_P192_CURVE` 启用对 ECDSA-P192 曲线操作的支持,使设备可以同时执行 192 位和 256 位的 ECDSA 曲线操作。但请注意,如果 eFuse 写保护期间已永久禁用 ECDSA-P192 操作,则启用该配置项也无法重新启用该功能。 + + - :cpp:func:`esp_efuse_enable_ecdsa_p192_curve_mode()` 可用于以编程方式启用 ECDSA-P192 曲线操作。它会向 eFuse 写入相应值,从而使设备支持 P-192 和 P-256 曲线操作。但请注意,若对应的 eFuse 区域已被写保护,则此 API 将调用失败。 + .. only:: SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE 生成确定性签名 From b326bba06575e059ba4a19c5cc9c4507dd4222a9 Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Mon, 7 Jul 2025 07:38:08 +0000 Subject: [PATCH 175/213] feat(tools): update openocd version to v0.12.0-esp32-20250707 --- tools/tools.json | 50 ++++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/tools/tools.json b/tools/tools.json index 90896b470c2..f11159ee63d 100644 --- a/tools/tools.json +++ b/tools/tools.json @@ -605,46 +605,46 @@ "versions": [ { "linux-amd64": { - "sha256": "eb1fa9b21c65b45a2200af6dcc2914e32335d37b6dbbd181778dcc0dc025e70a", - "size": 2445546, - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-linux-amd64-0.12.0-esp32-20250422.tar.gz" + "sha256": "766293bd7a08900d3536f87a0a7ade960f07266f16e4147f95ca5ce4e15d4c5d", + "size": 2489724, + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250707/openocd-esp32-linux-amd64-0.12.0-esp32-20250707.tar.gz" }, "linux-arm64": { - "sha256": "f70334a9b12a75b4d943e09fa5db30973037c39dbb54d6fa9f1a7118228b3d1c", - "size": 2330926, - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-linux-arm64-0.12.0-esp32-20250422.tar.gz" + "sha256": "34b6883c372444b49950893b2fc0101aefd10d404a88ef72c97e80199f8544d3", + "size": 2371243, + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250707/openocd-esp32-linux-arm64-0.12.0-esp32-20250707.tar.gz" }, "linux-armel": { - "sha256": "4ac34d6fd1af86aeda87c8318732f8d691c300c285c7fd2f5037c432c63fbbb3", - "size": 2470732, - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-linux-armel-0.12.0-esp32-20250422.tar.gz" + "sha256": "fd48492cf3ee16577c661fdccc14c349d34a9ab93aac5039ddf72332d4f4b70b", + "size": 2517680, + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250707/openocd-esp32-linux-armel-0.12.0-esp32-20250707.tar.gz" }, "linux-armhf": { - "sha256": "75372bdbcef2df64013dd36c88836e1029c52955941b69ca463397ccbd287c21", - "size": 2310816, - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-linux-armhf-0.12.0-esp32-20250422.tar.gz" + "sha256": "a468cc108578a1f4553ac0502c814d47791ef79f5997a31e941908fa5119de9c", + "size": 2353427, + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250707/openocd-esp32-linux-armhf-0.12.0-esp32-20250707.tar.gz" }, "macos": { - "sha256": "9186a7a06304c6d9201cbce4ee3c7099b393bf8d329cda17a68874f92308f6ce", - "size": 2548730, - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-macos-0.12.0-esp32-20250422.tar.gz" + "sha256": "6267be53892a76d535938a1b044b685adc7d292f090447e8a3e3d0f0996474d1", + "size": 2585348, + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250707/openocd-esp32-macos-0.12.0-esp32-20250707.tar.gz" }, "macos-arm64": { - "sha256": "2cc39318d52f393233ff1f777871aebe5b97b3fbad29556a238489263401b774", - "size": 2593819, - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-macos-arm64-0.12.0-esp32-20250422.tar.gz" + "sha256": "150e938ac48a6ee031ddbc8b31043bc7f2073ab2ee4896b658918d35899673c3", + "size": 2628741, + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250707/openocd-esp32-macos-arm64-0.12.0-esp32-20250707.tar.gz" }, - "name": "v0.12.0-esp32-20250422", + "name": "v0.12.0-esp32-20250707", "status": "recommended", "win32": { - "sha256": "ecb4f8533fa9098d10000f5f7e8b8eaa8591015b824b481078ddb2b37e7aa6f2", - "size": 2988859, - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-win32-0.12.0-esp32-20250422.zip" + "sha256": "666274b04af7f36b430b6d063006051c37b8635b5175735ad5af07a1fbc6f486", + "size": 3034680, + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250707/openocd-esp32-win32-0.12.0-esp32-20250707.zip" }, "win64": { - "sha256": "e9eae8e1a8d0e030cd81dcb08394a9137cb7338a6211dfabcdbdfb37b58c5a23", - "size": 2988858, - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-win64-0.12.0-esp32-20250422.zip" + "sha256": "5186ba3f7ee29fb6ab68a4ed7bb417211bad76ecdcdf9280a9187ebfd549a3c1", + "size": 3034680, + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250707/openocd-esp32-win64-0.12.0-esp32-20250707.zip" } } ] From cc1ac5316d04fbc94e4699f0d6eb43cf19fd71dd Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Fri, 4 Jul 2025 14:47:58 +0200 Subject: [PATCH 176/213] change(docs): replace deprecated openocd cfg files --- docs/en/api-guides/jtag-debugging/esp32.inc | 2 +- docs/en/api-guides/jtag-debugging/esp32c2.inc | 2 +- docs/en/api-guides/jtag-debugging/esp32c3.inc | 2 +- docs/en/api-guides/jtag-debugging/esp32c5.inc | 2 +- docs/en/api-guides/jtag-debugging/esp32c6.inc | 2 +- docs/en/api-guides/jtag-debugging/esp32c61.inc | 2 +- docs/en/api-guides/jtag-debugging/esp32h2.inc | 2 +- docs/en/api-guides/jtag-debugging/esp32p4.inc | 2 +- docs/en/api-guides/jtag-debugging/esp32s2.inc | 2 +- docs/en/api-guides/jtag-debugging/esp32s3.inc | 2 +- docs/zh_CN/api-guides/jtag-debugging/esp32.inc | 2 +- docs/zh_CN/api-guides/jtag-debugging/esp32c2.inc | 2 +- docs/zh_CN/api-guides/jtag-debugging/esp32c3.inc | 2 +- docs/zh_CN/api-guides/jtag-debugging/esp32c5.inc | 2 +- docs/zh_CN/api-guides/jtag-debugging/esp32c6.inc | 2 +- docs/zh_CN/api-guides/jtag-debugging/esp32c61.inc | 2 +- docs/zh_CN/api-guides/jtag-debugging/esp32h2.inc | 2 +- docs/zh_CN/api-guides/jtag-debugging/esp32p4.inc | 2 +- docs/zh_CN/api-guides/jtag-debugging/esp32s2.inc | 2 +- docs/zh_CN/api-guides/jtag-debugging/esp32s3.inc | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/en/api-guides/jtag-debugging/esp32.inc b/docs/en/api-guides/jtag-debugging/esp32.inc index c83adba3b48..529584fa909 100644 --- a/docs/en/api-guides/jtag-debugging/esp32.inc +++ b/docs/en/api-guides/jtag-debugging/esp32.inc @@ -97,7 +97,7 @@ - ESP32 target configuration file. Can be used together with one of the ``interface/`` configuration files. * - ``target/esp32-solo-1.cfg`` - Target configuration file for ESP32-SOLO-1 module. Different from ``esp32.cfg`` in that it only configures one CPU. - * - ``interface/ftdi/esp32_devkitj_v1.cfg`` + * - ``interface/ftdi/esp_ftdi.cfg`` - JTAG adapter configuration file for ESP-WROVER-KIT and ESP-Prog boards. --- diff --git a/docs/en/api-guides/jtag-debugging/esp32c2.inc b/docs/en/api-guides/jtag-debugging/esp32c2.inc index 7d642aabe9e..9495de33d6b 100644 --- a/docs/en/api-guides/jtag-debugging/esp32c2.inc +++ b/docs/en/api-guides/jtag-debugging/esp32c2.inc @@ -94,7 +94,7 @@ - Board configuration file for ESP32-C2 debug through an ESP-Prog compatible FTDI, includes target and adapter configuration. * - ``target/esp32c2.cfg`` - ESP32-C2 target configuration file. Can be used together with one of the ``interface/`` configuration files. - * - ``interface/ftdi/esp32_devkitj_v1.cfg`` + * - ``interface/ftdi/esp_ftdi.cfg`` - JTAG adapter configuration file for ESP-Prog boards. --- diff --git a/docs/en/api-guides/jtag-debugging/esp32c3.inc b/docs/en/api-guides/jtag-debugging/esp32c3.inc index fc92a1dcf0d..d89566817a5 100644 --- a/docs/en/api-guides/jtag-debugging/esp32c3.inc +++ b/docs/en/api-guides/jtag-debugging/esp32c3.inc @@ -97,7 +97,7 @@ - ESP32-C3 target configuration file. Can be used together with one of the ``interface/`` configuration files. * - ``interface/esp_usb_jtag.cfg`` - JTAG adapter configuration file for ESP32-C3. - * - ``interface/ftdi/esp32_devkitj_v1.cfg`` + * - ``interface/ftdi/esp_ftdi.cfg`` - JTAG adapter configuration file for ESP-Prog boards. --- diff --git a/docs/en/api-guides/jtag-debugging/esp32c5.inc b/docs/en/api-guides/jtag-debugging/esp32c5.inc index d4f87e35b61..bc492498f3b 100644 --- a/docs/en/api-guides/jtag-debugging/esp32c5.inc +++ b/docs/en/api-guides/jtag-debugging/esp32c5.inc @@ -103,7 +103,7 @@ - ESP32-C5 target configuration file. Can be used together with one of the ``interface/`` configuration files. * - ``interface/esp_usb_jtag.cfg`` - JTAG adapter configuration file for ESP32-C5. - * - ``interface/ftdi/esp32_devkitj_v1.cfg`` + * - ``interface/ftdi/esp_ftdi.cfg`` - JTAG adapter configuration file for ESP-Prog boards. --- diff --git a/docs/en/api-guides/jtag-debugging/esp32c6.inc b/docs/en/api-guides/jtag-debugging/esp32c6.inc index 3f7ae0920ad..a4447969f8e 100644 --- a/docs/en/api-guides/jtag-debugging/esp32c6.inc +++ b/docs/en/api-guides/jtag-debugging/esp32c6.inc @@ -102,7 +102,7 @@ - ESP32-C6 target configuration file. Can be used together with one of the ``interface/`` configuration files. * - ``interface/esp_usb_jtag.cfg`` - JTAG adapter configuration file for ESP32-C6. - * - ``interface/ftdi/esp32_devkitj_v1.cfg`` + * - ``interface/ftdi/esp_ftdi.cfg`` - JTAG adapter configuration file for ESP-Prog boards. --- diff --git a/docs/en/api-guides/jtag-debugging/esp32c61.inc b/docs/en/api-guides/jtag-debugging/esp32c61.inc index 1b14ac2b50a..2229137d4f5 100644 --- a/docs/en/api-guides/jtag-debugging/esp32c61.inc +++ b/docs/en/api-guides/jtag-debugging/esp32c61.inc @@ -103,7 +103,7 @@ - ESP32-C61 target configuration file. Can be used together with one of the ``interface/`` configuration files. * - ``interface/esp_usb_jtag.cfg`` - JTAG adapter configuration file for ESP32-C61. - * - ``interface/ftdi/esp32_devkitj_v1.cfg`` + * - ``interface/ftdi/esp_ftdi.cfg`` - JTAG adapter configuration file for ESP-Prog boards. --- diff --git a/docs/en/api-guides/jtag-debugging/esp32h2.inc b/docs/en/api-guides/jtag-debugging/esp32h2.inc index 77e1ecddef4..ccf972497e9 100644 --- a/docs/en/api-guides/jtag-debugging/esp32h2.inc +++ b/docs/en/api-guides/jtag-debugging/esp32h2.inc @@ -100,7 +100,7 @@ - ESP32-H2 target configuration file. Can be used together with one of the ``interface/`` configuration files. * - ``interface/esp_usb_jtag.cfg`` - JTAG adapter configuration file for ESP32-H2. - * - ``interface/ftdi/esp32_devkitj_v1.cfg`` + * - ``interface/ftdi/esp_ftdi.cfg`` - JTAG adapter configuration file for ESP-Prog boards. --- diff --git a/docs/en/api-guides/jtag-debugging/esp32p4.inc b/docs/en/api-guides/jtag-debugging/esp32p4.inc index ea9b7d8140d..8dbfe31932a 100644 --- a/docs/en/api-guides/jtag-debugging/esp32p4.inc +++ b/docs/en/api-guides/jtag-debugging/esp32p4.inc @@ -107,7 +107,7 @@ - ESP32-P4 target configuration file. Can be used together with one of the ``interface/`` configuration files. * - ``interface/esp_usb_jtag.cfg`` - JTAG adapter configuration file for ESP32-P4. - * - ``interface/ftdi/esp32p4_ftdi.cfg`` + * - ``interface/ftdi/esp_ftdi.cfg`` - JTAG adapter configuration file for ESP-Prog boards. --- diff --git a/docs/en/api-guides/jtag-debugging/esp32s2.inc b/docs/en/api-guides/jtag-debugging/esp32s2.inc index 3e01100c926..f125e14db5e 100644 --- a/docs/en/api-guides/jtag-debugging/esp32s2.inc +++ b/docs/en/api-guides/jtag-debugging/esp32s2.inc @@ -92,7 +92,7 @@ - ESP32-S2 target configuration file. Can be used together with one of the ``interface/`` configuration files. * - ``interface/ftdi/esp32s2_kaluga_v1.cfg`` - JTAG adapter configuration file for ESP32-S2-Kaluga-1 board. - * - ``interface/ftdi/esp32_devkitj_v1.cfg`` + * - ``interface/ftdi/esp_ftdi.cfg`` - JTAG adapter configuration file for ESP-Prog boards. --- diff --git a/docs/en/api-guides/jtag-debugging/esp32s3.inc b/docs/en/api-guides/jtag-debugging/esp32s3.inc index ce17ae7363c..49e3cdc6653 100644 --- a/docs/en/api-guides/jtag-debugging/esp32s3.inc +++ b/docs/en/api-guides/jtag-debugging/esp32s3.inc @@ -101,7 +101,7 @@ - ESP32-S3 target configuration file. Can be used together with one of the ``interface/`` configuration files. * - ``interface/ftdi/esp_usb_jtag.cfg`` - JTAG adapter configuration file for ESP32-S3 builtin USB JTAG. - * - ``interface/ftdi/esp32_devkitj_v1.cfg`` + * - ``interface/ftdi/esp_ftdi.cfg`` - JTAG adapter configuration file for ESP-Prog debug adapter board. --- diff --git a/docs/zh_CN/api-guides/jtag-debugging/esp32.inc b/docs/zh_CN/api-guides/jtag-debugging/esp32.inc index 44ed9376650..572499a6b62 100644 --- a/docs/zh_CN/api-guides/jtag-debugging/esp32.inc +++ b/docs/zh_CN/api-guides/jtag-debugging/esp32.inc @@ -97,7 +97,7 @@ - ESP32 的目标配置文件,可以和某个 ``interface/`` 下的配置文件一同使用 * - ``target/esp32-solo-1.cfg`` - ESP32-SOLO-1 模组的目标配置文件,和 ``esp32.cfg`` 的差别在于它仅配置一个 CPU - * - ``interface/ftdi/esp32_devkitj_v1.cfg`` + * - ``interface/ftdi/esp_ftdi.cfg`` - 适用于 ESP-WROVER-KIT 和 ESP-Prog 的 JTAG 适配器配置文件 --- diff --git a/docs/zh_CN/api-guides/jtag-debugging/esp32c2.inc b/docs/zh_CN/api-guides/jtag-debugging/esp32c2.inc index 7d642aabe9e..9495de33d6b 100644 --- a/docs/zh_CN/api-guides/jtag-debugging/esp32c2.inc +++ b/docs/zh_CN/api-guides/jtag-debugging/esp32c2.inc @@ -94,7 +94,7 @@ - Board configuration file for ESP32-C2 debug through an ESP-Prog compatible FTDI, includes target and adapter configuration. * - ``target/esp32c2.cfg`` - ESP32-C2 target configuration file. Can be used together with one of the ``interface/`` configuration files. - * - ``interface/ftdi/esp32_devkitj_v1.cfg`` + * - ``interface/ftdi/esp_ftdi.cfg`` - JTAG adapter configuration file for ESP-Prog boards. --- diff --git a/docs/zh_CN/api-guides/jtag-debugging/esp32c3.inc b/docs/zh_CN/api-guides/jtag-debugging/esp32c3.inc index bdc0945c1b3..73927ed97c3 100644 --- a/docs/zh_CN/api-guides/jtag-debugging/esp32c3.inc +++ b/docs/zh_CN/api-guides/jtag-debugging/esp32c3.inc @@ -97,7 +97,7 @@ - ESP32-C3 目标配置文件。可以和某个 ``interface/`` 下的配置文件一同使用。 * - ``interface/esp_usb_jtag.cfg`` - 适用于 ESP32-C3 的 JTAG 适配器配置文件。 - * - ``interface/ftdi/esp32_devkitj_v1.cfg`` + * - ``interface/ftdi/esp_ftdi.cfg`` - 适用于 ESP-Prog 的 JTAG 适配器配置文件。 --- diff --git a/docs/zh_CN/api-guides/jtag-debugging/esp32c5.inc b/docs/zh_CN/api-guides/jtag-debugging/esp32c5.inc index d4f87e35b61..bc492498f3b 100644 --- a/docs/zh_CN/api-guides/jtag-debugging/esp32c5.inc +++ b/docs/zh_CN/api-guides/jtag-debugging/esp32c5.inc @@ -103,7 +103,7 @@ - ESP32-C5 target configuration file. Can be used together with one of the ``interface/`` configuration files. * - ``interface/esp_usb_jtag.cfg`` - JTAG adapter configuration file for ESP32-C5. - * - ``interface/ftdi/esp32_devkitj_v1.cfg`` + * - ``interface/ftdi/esp_ftdi.cfg`` - JTAG adapter configuration file for ESP-Prog boards. --- diff --git a/docs/zh_CN/api-guides/jtag-debugging/esp32c6.inc b/docs/zh_CN/api-guides/jtag-debugging/esp32c6.inc index 3f7ae0920ad..a4447969f8e 100644 --- a/docs/zh_CN/api-guides/jtag-debugging/esp32c6.inc +++ b/docs/zh_CN/api-guides/jtag-debugging/esp32c6.inc @@ -102,7 +102,7 @@ - ESP32-C6 target configuration file. Can be used together with one of the ``interface/`` configuration files. * - ``interface/esp_usb_jtag.cfg`` - JTAG adapter configuration file for ESP32-C6. - * - ``interface/ftdi/esp32_devkitj_v1.cfg`` + * - ``interface/ftdi/esp_ftdi.cfg`` - JTAG adapter configuration file for ESP-Prog boards. --- diff --git a/docs/zh_CN/api-guides/jtag-debugging/esp32c61.inc b/docs/zh_CN/api-guides/jtag-debugging/esp32c61.inc index e56c4885985..c5fd821a77f 100644 --- a/docs/zh_CN/api-guides/jtag-debugging/esp32c61.inc +++ b/docs/zh_CN/api-guides/jtag-debugging/esp32c61.inc @@ -103,7 +103,7 @@ - ESP32-C61 target configuration file. Can be used together with one of the ``interface/`` configuration files. * - ``interface/esp_usb_jtag.cfg`` - JTAG adapter configuration file for ESP32-C61. - * - ``interface/ftdi/esp32_devkitj_v1.cfg`` + * - ``interface/ftdi/esp_ftdi.cfg`` - JTAG adapter configuration file for ESP-Prog boards. --- diff --git a/docs/zh_CN/api-guides/jtag-debugging/esp32h2.inc b/docs/zh_CN/api-guides/jtag-debugging/esp32h2.inc index 77e1ecddef4..ccf972497e9 100644 --- a/docs/zh_CN/api-guides/jtag-debugging/esp32h2.inc +++ b/docs/zh_CN/api-guides/jtag-debugging/esp32h2.inc @@ -100,7 +100,7 @@ - ESP32-H2 target configuration file. Can be used together with one of the ``interface/`` configuration files. * - ``interface/esp_usb_jtag.cfg`` - JTAG adapter configuration file for ESP32-H2. - * - ``interface/ftdi/esp32_devkitj_v1.cfg`` + * - ``interface/ftdi/esp_ftdi.cfg`` - JTAG adapter configuration file for ESP-Prog boards. --- diff --git a/docs/zh_CN/api-guides/jtag-debugging/esp32p4.inc b/docs/zh_CN/api-guides/jtag-debugging/esp32p4.inc index ea9b7d8140d..8dbfe31932a 100644 --- a/docs/zh_CN/api-guides/jtag-debugging/esp32p4.inc +++ b/docs/zh_CN/api-guides/jtag-debugging/esp32p4.inc @@ -107,7 +107,7 @@ - ESP32-P4 target configuration file. Can be used together with one of the ``interface/`` configuration files. * - ``interface/esp_usb_jtag.cfg`` - JTAG adapter configuration file for ESP32-P4. - * - ``interface/ftdi/esp32p4_ftdi.cfg`` + * - ``interface/ftdi/esp_ftdi.cfg`` - JTAG adapter configuration file for ESP-Prog boards. --- diff --git a/docs/zh_CN/api-guides/jtag-debugging/esp32s2.inc b/docs/zh_CN/api-guides/jtag-debugging/esp32s2.inc index bc134d694f8..90f90a335fe 100644 --- a/docs/zh_CN/api-guides/jtag-debugging/esp32s2.inc +++ b/docs/zh_CN/api-guides/jtag-debugging/esp32s2.inc @@ -92,7 +92,7 @@ - ESP32-S2 目标配置文件,可以和某个 ``interface/`` 下的配置文件一同使用 * - ``interface/ftdi/esp32s2_kaluga_v1.cfg`` - 适用于 ESP32-S2-Kaluga-1 开发板的 JTAG 适配器配置文件 - * - ``interface/ftdi/esp32_devkitj_v1.cfg`` + * - ``interface/ftdi/esp_ftdi.cfg`` - 适用于 ESP-Prog 板的 JTAG 适配器配置文件 --- diff --git a/docs/zh_CN/api-guides/jtag-debugging/esp32s3.inc b/docs/zh_CN/api-guides/jtag-debugging/esp32s3.inc index 9a4f4034270..79d3f2dac88 100644 --- a/docs/zh_CN/api-guides/jtag-debugging/esp32s3.inc +++ b/docs/zh_CN/api-guides/jtag-debugging/esp32s3.inc @@ -101,7 +101,7 @@ - ESP32-S3 目标配置文件,可以和某个 ``interface/`` 下的配置文件一同使用 * - ``interface/ftdi/esp_usb_jtag.cfg`` - 适用于 ESP32-S3 的 JTAG 适配器配置文件。 - * - ``interface/ftdi/esp32_devkitj_v1.cfg`` + * - ``interface/ftdi/esp_ftdi.cfg`` - 适用于 ESP-Prog 的 JTAG 适配器配置文件。 --- From a0c490bfb118f2782d38d56ae4451809ca339fd3 Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Sun, 1 Sep 2024 22:16:11 +0300 Subject: [PATCH 177/213] feat(sysview): update to version 3.56 --- components/app_trace/sys_view/SEGGER/SEGGER.h | 4 +- .../app_trace/sys_view/SEGGER/SEGGER_RTT.h | 19 +- .../sys_view/SEGGER/SEGGER_SYSVIEW.c | 440 ++++++++++++++++-- .../sys_view/SEGGER/SEGGER_SYSVIEW.h | 76 ++- .../SEGGER/SEGGER_SYSVIEW_ConfDefaults.h | 16 +- .../sys_view/SEGGER/SEGGER_SYSVIEW_Int.h | 4 +- components/app_trace/sys_view/SEGGER/sbom.yml | 2 +- docs/en/COPYRIGHT.rst | 2 +- docs/zh_CN/COPYRIGHT.rst | 2 +- tools/esp_app_trace/espytrace/sysview.py | 7 +- .../test/sysview/expected_output.json | 3 +- .../test/sysview/expected_output_mcore.json | 3 +- 12 files changed, 500 insertions(+), 78 deletions(-) diff --git a/components/app_trace/sys_view/SEGGER/SEGGER.h b/components/app_trace/sys_view/SEGGER/SEGGER.h index be33c34ca0e..f07e9466195 100644 --- a/components/app_trace/sys_view/SEGGER/SEGGER.h +++ b/components/app_trace/sys_view/SEGGER/SEGGER.h @@ -10,7 +10,7 @@ * The Embedded Experts * ********************************************************************** * * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* (c) 1995 - 2024 SEGGER Microcontroller GmbH * * * * www.segger.com Support: support@segger.com * * * @@ -49,7 +49,7 @@ * * ********************************************************************** * * -* SystemView version: 3.42 * +* SystemView version: 3.56 * * * ********************************************************************** ---------------------------------------------------------------------- diff --git a/components/app_trace/sys_view/SEGGER/SEGGER_RTT.h b/components/app_trace/sys_view/SEGGER/SEGGER_RTT.h index 0fdb2f7177f..6e1c758f0d5 100644 --- a/components/app_trace/sys_view/SEGGER/SEGGER_RTT.h +++ b/components/app_trace/sys_view/SEGGER/SEGGER_RTT.h @@ -8,7 +8,7 @@ * The Embedded Experts * ********************************************************************** * * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* (c) 1995 - 2024 SEGGER Microcontroller GmbH * * * * www.segger.com Support: support@segger.com * * * @@ -47,7 +47,7 @@ * * ********************************************************************** * * -* SystemView version: 3.42 * +* SystemView version: 3.56 * * * ********************************************************************** ---------------------------END-OF-HEADER------------------------------ @@ -100,6 +100,10 @@ Revision: $Rev: 25842 $ #define _CORE_HAS_RTT_ASM_SUPPORT 1 #define _CORE_NEEDS_DMB 1 #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #elif (defined(__ARM_ARCH_8_1M_MAIN__)) // Cortex-M85 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); #else #define _CORE_HAS_RTT_ASM_SUPPORT 0 #endif @@ -130,6 +134,10 @@ Revision: $Rev: 25842 $ #define _CORE_HAS_RTT_ASM_SUPPORT 1 #define _CORE_NEEDS_DMB 1 #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #elif (defined __ARM_ARCH_8_1M_MAIN__) // Cortex-M85 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); #elif ((defined __ARM_ARCH_7A__) || (defined __ARM_ARCH_7R__)) // Cortex-A/R 32-bit ARMv7-A/R #define _CORE_NEEDS_DMB 1 #define RTT__DMB() __asm volatile ("dmb\n" : : :); @@ -156,6 +164,10 @@ Revision: $Rev: 25842 $ #define _CORE_HAS_RTT_ASM_SUPPORT 1 #define _CORE_NEEDS_DMB 1 #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #elif (defined __ARM_ARCH_8_1M_MAIN__) // Cortex-M85 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); #elif ((defined __ARM_ARCH_7A__) || (defined __ARM_ARCH_7R__)) // Cortex-A/R 32-bit ARMv7-A/R #define _CORE_NEEDS_DMB 1 #define RTT__DMB() __asm volatile ("dmb\n" : : :); @@ -271,6 +283,7 @@ Revision: $Rev: 25842 $ #ifndef SEGGER_RTT_ASM // defined when SEGGER_RTT.h is included from assembly file #include #include +#include /********************************************************************* * @@ -412,7 +425,7 @@ unsigned SEGGER_RTT_ReadUpBufferNoLock (unsigned BufferIndex, void* pDa unsigned SEGGER_RTT_WriteDownBuffer (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); unsigned SEGGER_RTT_WriteDownBufferNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); -#define SEGGER_RTT_HASDATA_UP(n) (((SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[n] + SEGGER_RTT_UNCACHED_OFF))->WrOff - ((SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[n] + SEGGER_RTT_UNCACHED_OFF))->RdOff) // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly +#define SEGGER_RTT_HASDATA_UP(n) (((SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[n] + SEGGER_RTT_UNCACHED_OFF))->WrOff - ((SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[n] + SEGGER_RTT_UNCACHED_OFF))->RdOff) // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly /********************************************************************* * diff --git a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.c b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.c index 10599986c87..4de60ada2e5 100644 --- a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.c +++ b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.c @@ -3,14 +3,14 @@ * * SPDX-License-Identifier: BSD-1-Clause * - * SPDX-FileContributor: 2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileContributor: 2023-2024 Espressif Systems (Shanghai) CO LTD */ /********************************************************************* * SEGGER Microcontroller GmbH * * The Embedded Experts * ********************************************************************** * * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* (c) 1995 - 2024 SEGGER Microcontroller GmbH * * * * www.segger.com Support: support@segger.com * * * @@ -49,14 +49,14 @@ * * ********************************************************************** * * -* SystemView version: 3.42 * +* SystemView version: 3.56 * * * ********************************************************************** -------------------------- END-OF-HEADER ----------------------------- File : SEGGER_SYSVIEW.c Purpose : System visualization API implementation. -Revision: $Rev: 28341 $ +Revision: $Rev: 29105 $ Additional information: Packet format: @@ -66,10 +66,10 @@ Additional information: Packets with IDs 24..31 are standard packets with extendible structure and contain a length field. - + Packet ID 31 is used for SystemView extended events. - + Packets with IDs >= 32 always contain a length field. @@ -150,6 +150,7 @@ Additional information: #include #include #include +#include #include "SEGGER_SYSVIEW_Int.h" #include "SEGGER_RTT.h" @@ -188,7 +189,7 @@ Additional information: // Timestamps may be less than full 32-bits, in which case we need to zero // the unused bits to properly handle overflows. // Note that this is a quite common scenario, as a 32-bit time such as -// SysTick might be scaled down to reduce bandwith +// SysTick might be scaled down to reduce bandwidth // or a 16-bit hardware time might be used. #if SEGGER_SYSVIEW_TIMESTAMP_BITS < 32 // Eliminate unused bits in case hardware timestamps are less than 32 bits #define MAKE_DELTA_32BIT(Delta) Delta <<= 32 - SEGGER_SYSVIEW_TIMESTAMP_BITS; \ @@ -388,8 +389,6 @@ static U8 _NumModules; pDest = pSysviewPointer; \ }; - - #if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 1) static U8 _aPacket[SEGGER_SYSVIEW_MAX_PACKET_SIZE]; @@ -432,6 +431,9 @@ static U8 _aPacket[SEGGER_SYSVIEW_MAX_PACKET_SIZE]; static U8* _EncodeData(U8* pPayload, const char* pSrc, unsigned int NumBytes) { unsigned int n; const U8* p; + + // Espressif doesn't support larger packages yet. Encode data length must be less than 255. + assert(NumBytes < 255); // n = 0; p = (const U8*)pSrc; @@ -442,8 +444,8 @@ static U8* _EncodeData(U8* pPayload, const char* pSrc, unsigned int NumBytes) { *pPayload++ = (U8)NumBytes; } else { *pPayload++ = 255; - *pPayload++ = (NumBytes & 255); *pPayload++ = ((NumBytes >> 8) & 255); + *pPayload++ = (NumBytes & 255); } while (n < NumBytes) { *pPayload++ = *p++; @@ -452,6 +454,38 @@ static U8* _EncodeData(U8* pPayload, const char* pSrc, unsigned int NumBytes) { return pPayload; } +/********************************************************************* +* +* _EncodeFloat() +* +* Function description +* Encode a float value in variable-length format. +* +* Parameters +* pPayload - Pointer to where value will be encoded. +* Value - Value to be encoded. +* +* Return value +* Pointer to the byte following the value, i.e. the first free +* byte in the payload and the next position to store payload +* content. +*/ +static U8* _EncodeFloat(U8* pPayload, float Value) { + float Val = Value; + U8* pSysviewPointer; + U32* SysViewData; + pSysviewPointer = pPayload; + SysViewData = (U32*)&Val; + while((*SysViewData) > 0x7F) { + *pSysviewPointer++ = (U8)((*SysViewData) | 0x80); + (*SysViewData) >>= 7; + }; + *pSysviewPointer++ = (U8)(*SysViewData); + pPayload = pSysviewPointer; + + return pPayload; +} + /********************************************************************* * * _EncodeStr() @@ -475,38 +509,42 @@ static U8* _EncodeData(U8* pPayload, const char* pSrc, unsigned int NumBytes) { * No more than 1 + Limit bytes will be encoded to the payload. */ static U8 *_EncodeStr(U8 *pPayload, const char *pText, unsigned int Limit) { - unsigned int n; - unsigned int Len; - // - // Compute string len - // - Len = 0; - if (pText != NULL) { - while(*(pText + Len) != 0) { - Len++; - } - if (Len > Limit) { - Len = Limit; - } - } - // - // Write Len - // - if (Len < 255) { - *pPayload++ = (U8)Len; + U8* pLen; + const char* sStart; + + if (pText == NULL) { + *pPayload++ = (U8)0; } else { - *pPayload++ = 255; - *pPayload++ = (Len & 255); - *pPayload++ = ((Len >> 8) & 255); + sStart = pText; // Remember start of string. + // + // Save space to store count byte(s). + // + pLen = pPayload++; +#if (SEGGER_SYSVIEW_MAX_STRING_LEN >= 255) // Length always encodes in 3 bytes + pPayload += 2; +#endif + // + // Limit string to maximum length and copy into payload buffer. + // + if (Limit > SEGGER_SYSVIEW_MAX_STRING_LEN) { + Limit = SEGGER_SYSVIEW_MAX_STRING_LEN; + } + while ((Limit-- > 0) && (*pText != '\0')) { + *pPayload++ = *pText++; + } + // + // Save string length to buffer. + // +#if (SEGGER_SYSVIEW_MAX_STRING_LEN >= 255) // Length always encodes in 3 bytes + Limit = (unsigned int)(pText - sStart); + *pLen++ = (U8)255; + *pLen++ = (U8)((Limit >> 8) & 255); + *pLen++ = (U8)(Limit & 255); +#else // Length always encodes in 1 byte + *pLen = (U8)(pText - sStart); +#endif } // - // copy string - // - n = 0; - while (n < Len) { - *pPayload++ = *pText++; - n++; - } return pPayload; } @@ -693,7 +731,6 @@ static void _SendSyncInfo(void) { for (n = 0; n < _NumModules; n++) { SEGGER_SYSVIEW_SendModule(n); } - SEGGER_SYSVIEW_SendModuleDescription(); } } #endif // (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) @@ -1218,6 +1255,7 @@ static void _VPrintTarget(const char* sFormat, U32 Options, va_list* pParamList) unsigned int FormatFlags; unsigned int FieldWidth; U8* pPayloadStart; + const char* s; #if SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0 RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_MAX_STRING_LEN + 1 + 2 * SEGGER_SYSVIEW_QUANTA_U32); SEGGER_SYSVIEW_LOCK(); @@ -1322,6 +1360,20 @@ static void _VPrintTarget(const char* sFormat, U32 Options, va_list* pParamList) v = va_arg(*pParamList, int); _PrintUnsigned(&BufferDesc, (unsigned int)v, 16u, NumDigits, FieldWidth, FormatFlags); break; + case 's': + s = va_arg(*pParamList, const char*); + if (s == NULL) { + s = "(null)"; + } + do { + c = *s; + s++; + if (c == '\0') { + break; + } + _StoreChar(&BufferDesc, c); + } while (BufferDesc.Cnt < SEGGER_SYSVIEW_MAX_STRING_LEN); + break; case 'p': v = va_arg(*pParamList, int); _PrintUnsigned(&BufferDesc, (unsigned int)v, 16u, 8u, 8u, 0u); @@ -1954,11 +2006,61 @@ void SEGGER_SYSVIEW_SendTaskInfo(const SEGGER_SYSVIEW_TASKINFO *pInfo) { ENCODE_U32(pPayload, SHRINK_ID(pInfo->TaskID)); ENCODE_U32(pPayload, pInfo->StackBase); ENCODE_U32(pPayload, pInfo->StackSize); - ENCODE_U32(pPayload, 0); // Stack End, future use + ENCODE_U32(pPayload, pInfo->StackUsage); _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_STACK_INFO); RECORD_END(); } +/********************************************************************* +* +* SEGGER_SYSVIEW_SendStackInfo() +* +* Function description +* Send a Stack Info Packet, containing TaskId for identification, +* stack base, stack size and stack usage. +* +* +* Parameters +* pInfo - Pointer to stack information to send. +*/ +void SEGGER_SYSVIEW_SendStackInfo(const SEGGER_SYSVIEW_STACKINFO *pInfo) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, SHRINK_ID(pInfo->TaskID)); + ENCODE_U32(pPayload, pInfo->StackBase); + ENCODE_U32(pPayload, pInfo->StackSize); + ENCODE_U32(pPayload, pInfo->StackUsage); + + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_SampleData() +* +* Function description +* Send a Data Sample Packet, containing the data Id and the value. +* +* +* Parameters +* pInfo - Pointer to data sample struct to send. +*/ +void SEGGER_SYSVIEW_SampleData(const SEGGER_SYSVIEW_DATA_SAMPLE *pInfo) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, pInfo->ID); + pPayload = _EncodeFloat(pPayload, *(pInfo->pFloat_Value)); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_DATA_SAMPLE); + + RECORD_END(); +} + /********************************************************************* * * SEGGER_SYSVIEW_SendTaskList() @@ -2448,6 +2550,63 @@ void SEGGER_SYSVIEW_NameResource(U32 ResourceId, const char* sName) { RECORD_END(); } +/********************************************************************* +* +* SEGGER_SYSVIEW_RegisterData() +* +* Function description +* Register data to sample the values via SystemView. +* +* Register functions are usually set in the system description +* callback, to ensure it is only sent when the SystemView Application +* is connected. +* +* Parameters +* pInfo - Struct containing all possible properties that can be sent via this registration event. +*/ +void SEGGER_SYSVIEW_RegisterData(SEGGER_SYSVIEW_DATA_REGISTER* pInfo) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 8 * SEGGER_SYSVIEW_QUANTA_U32 + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, SYSVIEW_EVTID_EX_REGISTER_DATA); + ENCODE_U32(pPayload, pInfo->ID); + pPayload = _EncodeStr(pPayload, pInfo->sName, SEGGER_SYSVIEW_MAX_STRING_LEN); + + if (pInfo->sName != 0) { + ENCODE_U32(pPayload, pInfo->DataType); + ENCODE_U32(pPayload, pInfo->Offset); + ENCODE_U32(pPayload, pInfo->RangeMin); + ENCODE_U32(pPayload, pInfo->RangeMax); + pPayload = _EncodeFloat(pPayload, pInfo->ScalingFactor); + pPayload = _EncodeStr(pPayload, pInfo->sUnit, SEGGER_SYSVIEW_MAX_STRING_LEN); + } else if (pInfo->ScalingFactor != 0) { + ENCODE_U32(pPayload, pInfo->DataType); + ENCODE_U32(pPayload, pInfo->Offset); + ENCODE_U32(pPayload, pInfo->RangeMin); + ENCODE_U32(pPayload, pInfo->RangeMax); + pPayload = _EncodeFloat(pPayload, pInfo->ScalingFactor); + } else if (pInfo->RangeMax != 0) { + ENCODE_U32(pPayload, pInfo->DataType); + ENCODE_U32(pPayload, pInfo->Offset); + ENCODE_U32(pPayload, pInfo->RangeMin); + ENCODE_U32(pPayload, pInfo->RangeMax); + } else if (pInfo->RangeMin != 0) { + ENCODE_U32(pPayload, pInfo->DataType); + ENCODE_U32(pPayload, pInfo->Offset); + ENCODE_U32(pPayload, pInfo->RangeMin); + } else if (pInfo->Offset != 0) { + ENCODE_U32(pPayload, pInfo->DataType); + ENCODE_U32(pPayload, pInfo->Offset); + } else if (pInfo->DataType != 0) { + ENCODE_U32(pPayload, pInfo->DataType); + } + + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_EX); + RECORD_END(); +} + /********************************************************************* * * SEGGER_SYSVIEW_HeapDefine() @@ -2820,9 +2979,6 @@ void SEGGER_SYSVIEW_RegisterModule(SEGGER_SYSVIEW_MODULE* pModule) { _NumModules++; } SEGGER_SYSVIEW_SendModule(0); - if (pModule->pfSendModuleDesc) { - pModule->pfSendModuleDesc(); - } SEGGER_SYSVIEW_UNLOCK(); } @@ -2906,6 +3062,9 @@ void SEGGER_SYSVIEW_SendModule(U8 ModuleId) { _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_MODULEDESC); RECORD_END(); } + if (pModule && pModule->pfSendModuleDesc) { + pModule->pfSendModuleDesc(); + } } } @@ -2986,6 +3145,39 @@ void SEGGER_SYSVIEW_PrintfHostEx(const char* s, U32 Options, ...) { #endif } +/********************************************************************* +* +* SEGGER_SYSVIEW_VPrintfHostEx() +* +* Function description +* Print a string which is formatted on the host by the SystemView Application +* with Additional information. +* +* Parameters +* s - String to be formatted. +* Options - Options for the string. i.e. Log level. +* pParamList - Pointer to the list of arguments for the format string +* +* Additional information +* All format arguments are treated as 32-bit scalar values. +*/ +void SEGGER_SYSVIEW_VPrintfHostEx(const char* s, U32 Options, va_list *pParamList) { +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + int r; + va_list ParamListCopy; + va_copy(ParamListCopy, *pParamList); + + r = _VPrintHost(s, Options, pParamList); + + if (r == -1) { + _VPrintTarget(s, Options, &ParamListCopy); + } + va_end(ParamListCopy); +#else + _VPrintHost(s, Options, pParamList); +#endif +} + /********************************************************************* * * SEGGER_SYSVIEW_PrintfHost() @@ -3020,6 +3212,37 @@ void SEGGER_SYSVIEW_PrintfHost(const char* s, ...) { #endif } +/********************************************************************* +* +* SEGGER_SYSVIEW_VPrintfHost() +* +* Function description +* Print a string which is formatted on the host by the SystemView Application. +* +* Parameters +* s - String to be formatted. +* pParamList - Pointer to the list of arguments for the format string +* +* Additional information +* All format arguments are treated as 32-bit scalar values. +*/ +void SEGGER_SYSVIEW_VPrintfHost(const char* s, va_list *pParamList) { +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + int r; + va_list ParamListCopy; + va_copy(ParamListCopy, *pParamList); + + r = _VPrintHost(s, SEGGER_SYSVIEW_LOG, pParamList); + + if (r == -1) { + _VPrintTarget(s, SEGGER_SYSVIEW_LOG, &ParamListCopy); + } + va_end(ParamListCopy); +#else + _VPrintHost(s, SEGGER_SYSVIEW_LOG, pParamList); +#endif +} + /********************************************************************* * * SEGGER_SYSVIEW_WarnfHost() @@ -3055,6 +3278,38 @@ void SEGGER_SYSVIEW_WarnfHost(const char* s, ...) { #endif } +/********************************************************************* +* +* SEGGER_SYSVIEW_VWarnfHost() +* +* Function description +* Print a warning string which is formatted on the host by +* the SystemView Application. +* +* Parameters +* s - String to be formatted. +* pParamList - Pointer to the list of arguments for the format string +* +* Additional information +* All format arguments are treated as 32-bit scalar values. +*/ +void SEGGER_SYSVIEW_VWarnfHost(const char* s, va_list *pParamList) { +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + int r; + va_list ParamListCopy; + va_copy(ParamListCopy, *pParamList); + + r = _VPrintHost(s, SEGGER_SYSVIEW_WARNING, pParamList); + + if (r == -1) { + _VPrintTarget(s, SEGGER_SYSVIEW_WARNING, &ParamListCopy); + } + va_end(ParamListCopy); +#else + _VPrintHost(s, SEGGER_SYSVIEW_WARNING, pParamList); +#endif +} + /********************************************************************* * * SEGGER_SYSVIEW_ErrorfHost() @@ -3090,6 +3345,38 @@ void SEGGER_SYSVIEW_ErrorfHost(const char* s, ...) { #endif } +/********************************************************************* +* +* SEGGER_SYSVIEW_VErrorfHost() +* +* Function description +* Print a warning string which is formatted on the host by +* the SystemView Application. +* +* Parameters +* s - String to be formatted. +* pParamList - Pointer to the list of arguments for the format string +* +* Additional information +* All format arguments are treated as 32-bit scalar values. +*/ +void SEGGER_SYSVIEW_VErrorfHost(const char* s, va_list *pParamList) { +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + int r; + va_list ParamListCopy; + va_copy(ParamListCopy, *pParamList); + + r = _VPrintHost(s, SEGGER_SYSVIEW_ERROR, pParamList); + + if (r == -1) { + _VPrintTarget(s, SEGGER_SYSVIEW_ERROR, &ParamListCopy); + } + va_end(ParamListCopy); +#else + _VPrintHost(s, SEGGER_SYSVIEW_ERROR, pParamList); +#endif +} + /********************************************************************* * * SEGGER_SYSVIEW_PrintfTargetEx() @@ -3110,6 +3397,23 @@ void SEGGER_SYSVIEW_PrintfTargetEx(const char* s, U32 Options, ...) { va_end(ParamList); } +/********************************************************************* +* +* SEGGER_SYSVIEW_VPrintfTargetEx() +* +* Function description +* Print a string which is formatted on the target before sent to +* the host with Additional information. +* +* Parameters +* s - String to be formatted. +* Options - Options for the string. i.e. Log level. +* pParamList - Pointer to the list of arguments for the format string +*/ +void SEGGER_SYSVIEW_VPrintfTargetEx(const char* s, U32 Options, va_list *pParamList) { + _VPrintTarget(s, Options, pParamList); +} + /********************************************************************* * * SEGGER_SYSVIEW_PrintfTarget() @@ -3129,6 +3433,22 @@ void SEGGER_SYSVIEW_PrintfTarget(const char* s, ...) { va_end(ParamList); } +/********************************************************************* +* +* SEGGER_SYSVIEW_VPrintfTarget() +* +* Function description +* Print a string which is formatted on the target before sent to +* the host. +* +* Parameters +* s - String to be formatted. +* pParamList - Pointer to the list of arguments for the format string +*/ +void SEGGER_SYSVIEW_VPrintfTarget(const char* s, va_list* pParamList) { + _VPrintTarget(s, SEGGER_SYSVIEW_LOG, pParamList); +} + /********************************************************************* * * SEGGER_SYSVIEW_WarnfTarget() @@ -3148,6 +3468,22 @@ void SEGGER_SYSVIEW_WarnfTarget(const char* s, ...) { va_end(ParamList); } +/********************************************************************* +* +* SEGGER_SYSVIEW_VWarnfTarget() +* +* Function description +* Print a warning string which is formatted on the target before +* sent to the host. +* +* Parameters +* s - String to be formatted. +* pParamList - Pointer to the list of arguments for the format string +*/ +void SEGGER_SYSVIEW_VWarnfTarget(const char* s, va_list* pParamList) { + _VPrintTarget(s, SEGGER_SYSVIEW_WARNING, pParamList); +} + /********************************************************************* * * SEGGER_SYSVIEW_ErrorfTarget() @@ -3166,6 +3502,22 @@ void SEGGER_SYSVIEW_ErrorfTarget(const char* s, ...) { _VPrintTarget(s, SEGGER_SYSVIEW_ERROR, &ParamList); va_end(ParamList); } + +/********************************************************************* +* +* SEGGER_SYSVIEW_VErrorfTarget() +* +* Function description +* Print an error string which is formatted on the target before +* sent to the host. +* +* Parameters +* s - String to be formatted. +* pParamList - Pointer to the list of arguments for the format string +*/ +void SEGGER_SYSVIEW_VErrorfTarget(const char* s, va_list* pParamList) { + _VPrintTarget(s, SEGGER_SYSVIEW_ERROR, pParamList); +} #endif // SEGGER_SYSVIEW_EXCLUDE_PRINTF /********************************************************************* diff --git a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.h b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.h index b9cbac605ba..1ada68c6fc8 100644 --- a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.h +++ b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.h @@ -3,14 +3,14 @@ * * SPDX-License-Identifier: BSD-1-Clause * - * SPDX-FileContributor: 2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileContributor: 2023-2024 Espressif Systems (Shanghai) CO LTD */ /********************************************************************* * SEGGER Microcontroller GmbH * * The Embedded Experts * ********************************************************************** * * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* (c) 1995 - 2024 SEGGER Microcontroller GmbH * * * * www.segger.com Support: support@segger.com * * * @@ -49,13 +49,13 @@ * * ********************************************************************** * * -* SystemView version: 3.42 * +* SystemView version: 3.56 * * * ********************************************************************** -------------------------- END-OF-HEADER ----------------------------- File : SEGGER_SYSVIEW.h Purpose : System visualization API. -Revision: $Rev: 28237 $ +Revision: $Rev: 28768 $ */ #ifndef SEGGER_SYSVIEW_H @@ -123,7 +123,7 @@ extern "C" { #define SYSVIEW_EVTID_TIMER_EXIT 20 #define SYSVIEW_EVTID_STACK_INFO 21 #define SYSVIEW_EVTID_MODULEDESC 22 - +#define SYSVIEW_EVTID_DATA_SAMPLE 23 #define SYSVIEW_EVTID_INIT 24 #define SYSVIEW_EVTID_NAME_RESOURCE 25 #define SYSVIEW_EVTID_PRINT_FORMATTED 26 @@ -135,12 +135,13 @@ extern "C" { // // SystemView extended events. Sent with ID 31. // -#define SYSVIEW_EVTID_EX_MARK 0 -#define SYSVIEW_EVTID_EX_NAME_MARKER 1 -#define SYSVIEW_EVTID_EX_HEAP_DEFINE 2 -#define SYSVIEW_EVTID_EX_HEAP_ALLOC 3 -#define SYSVIEW_EVTID_EX_HEAP_ALLOC_EX 4 -#define SYSVIEW_EVTID_EX_HEAP_FREE 5 +#define SYSVIEW_EVTID_EX_MARK 0 +#define SYSVIEW_EVTID_EX_NAME_MARKER 1 +#define SYSVIEW_EVTID_EX_HEAP_DEFINE 2 +#define SYSVIEW_EVTID_EX_HEAP_ALLOC 3 +#define SYSVIEW_EVTID_EX_HEAP_ALLOC_EX 4 +#define SYSVIEW_EVTID_EX_HEAP_FREE 5 +#define SYSVIEW_EVTID_EX_REGISTER_DATA 6 // // Event masks to disable/enable events // @@ -167,7 +168,7 @@ extern "C" { #define SYSVIEW_EVTMASK_TIMER_EXIT (1 << SYSVIEW_EVTID_TIMER_EXIT) #define SYSVIEW_EVTMASK_STACK_INFO (1 << SYSVIEW_EVTID_STACK_INFO) #define SYSVIEW_EVTMASK_MODULEDESC (1 << SYSVIEW_EVTID_MODULEDESC) - +#define SYSVIEW_EVTMASK_DATA_SAMPLE (1 << SYSVIEW_EVTID_DATA_SAMPLE) #define SYSVIEW_EVTMASK_INIT (1 << SYSVIEW_EVTID_INIT) #define SYSVIEW_EVTMASK_NAME_RESOURCE (1 << SYSVIEW_EVTID_NAME_RESOURCE) #define SYSVIEW_EVTMASK_PRINT_FORMATTED (1 << SYSVIEW_EVTID_PRINT_FORMATTED) @@ -202,8 +203,42 @@ typedef struct { U32 Prio; U32 StackBase; U32 StackSize; + U32 StackUsage; } SEGGER_SYSVIEW_TASKINFO; +typedef struct { + U32 TaskID; + U32 StackBase; + U32 StackSize; + U32 StackUsage; +} SEGGER_SYSVIEW_STACKINFO; + +typedef struct { + U32 ID; + union { + U32* pU32_Value; + I32* pI32_Value; + float* pFloat_Value; + }; +} SEGGER_SYSVIEW_DATA_SAMPLE; + +typedef enum { + SEGGER_SYSVIEW_TYPE_U32 = 0, + SEGGER_SYSVIEW_TYPE_I32 = 1, + SEGGER_SYSVIEW_TYPE_FLOAT = 2 +} SEGGER_SYSVIEW_DATA_TYPE; + +typedef struct { + U32 ID; + SEGGER_SYSVIEW_DATA_TYPE DataType; + I32 Offset; + I32 RangeMin; + I32 RangeMax; + float ScalingFactor; + const char* sName; + const char* sUnit; +} SEGGER_SYSVIEW_DATA_REGISTER; + typedef struct SEGGER_SYSVIEW_MODULE_STRUCT SEGGER_SYSVIEW_MODULE; struct SEGGER_SYSVIEW_MODULE_STRUCT { @@ -247,8 +282,8 @@ EXTERN unsigned int SEGGER_SYSVIEW_InterruptId; */ typedef struct { - U64 (*pfGetTime) (void); - void (*pfSendTaskList) (void); + U64 (*pfGetTime) (void); + void (*pfSendTaskList) (void); } SEGGER_SYSVIEW_OS_API; /********************************************************************* @@ -262,9 +297,13 @@ void SEGGER_SYSVIEW_Stop (void); void SEGGER_SYSVIEW_GetSysDesc (void); void SEGGER_SYSVIEW_SendTaskList (void); void SEGGER_SYSVIEW_SendTaskInfo (const SEGGER_SYSVIEW_TASKINFO* pInfo); +void SEGGER_SYSVIEW_SendStackInfo (const SEGGER_SYSVIEW_STACKINFO* pInfo); void SEGGER_SYSVIEW_SendSysDesc (const char* sSysDesc); int SEGGER_SYSVIEW_IsStarted (void); int SEGGER_SYSVIEW_GetChannelID (void); + +void SEGGER_SYSVIEW_SampleData (const SEGGER_SYSVIEW_DATA_SAMPLE *pInfo); + // Checks whether tracing has been started U8 SEGGER_SYSVIEW_Started(void); @@ -311,6 +350,7 @@ void SEGGER_SYSVIEW_HeapAllocEx (void* pHeap, void* pUserData, void SEGGER_SYSVIEW_HeapFree (void* pHeap, void* pUserData); void SEGGER_SYSVIEW_NameResource (U32 ResourceId, const char* sName); +void SEGGER_SYSVIEW_RegisterData ( SEGGER_SYSVIEW_DATA_REGISTER* pInfo); int SEGGER_SYSVIEW_SendPacket (U8* pPacket, U8* pPayloadEnd, unsigned int EventId); @@ -341,13 +381,21 @@ void SEGGER_SYSVIEW_SendNumModules (void); */ #ifndef SEGGER_SYSVIEW_EXCLUDE_PRINTF // Define in project to avoid warnings about variable parameter list void SEGGER_SYSVIEW_PrintfHostEx (const char* s, U32 Options, ...); +void SEGGER_SYSVIEW_VPrintfHostEx (const char* s, U32 Options, va_list* pParamList); void SEGGER_SYSVIEW_PrintfTargetEx (const char* s, U32 Options, ...); +void SEGGER_SYSVIEW_VPrintfTargetEx (const char* s, U32 Options, va_list* pParamList); void SEGGER_SYSVIEW_PrintfHost (const char* s, ...); +void SEGGER_SYSVIEW_VPrintfHost (const char* s, va_list* pParamList); void SEGGER_SYSVIEW_PrintfTarget (const char* s, ...); +void SEGGER_SYSVIEW_VPrintfTarget (const char* s, va_list* pParamList); void SEGGER_SYSVIEW_WarnfHost (const char* s, ...); +void SEGGER_SYSVIEW_VWarnfHost (const char* s, va_list* pParamList); void SEGGER_SYSVIEW_WarnfTarget (const char* s, ...); +void SEGGER_SYSVIEW_VWarnfTarget (const char* s, va_list* pParamList); void SEGGER_SYSVIEW_ErrorfHost (const char* s, ...); +void SEGGER_SYSVIEW_VErrorfHost (const char* s, va_list* pParamList); void SEGGER_SYSVIEW_ErrorfTarget (const char* s, ...); +void SEGGER_SYSVIEW_VErrorfTarget (const char* s, va_list* pParamList); #endif void SEGGER_SYSVIEW_Print (const char* s); diff --git a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW_ConfDefaults.h b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW_ConfDefaults.h index c617e0db81e..08efb45ba6a 100644 --- a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW_ConfDefaults.h +++ b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW_ConfDefaults.h @@ -3,14 +3,14 @@ * * SPDX-License-Identifier: BSD-1-Clause * - * SPDX-FileContributor: 2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileContributor: 2023-2024 Espressif Systems (Shanghai) CO LTD */ /********************************************************************* * SEGGER Microcontroller GmbH * * The Embedded Experts * ********************************************************************** * * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* (c) 1995 - 2024 SEGGER Microcontroller GmbH * * * * www.segger.com Support: support@segger.com * * * @@ -49,7 +49,7 @@ * * ********************************************************************** * * -* SystemView version: 3.42 * +* SystemView version: 3.56 * * * ********************************************************************** -------------------------- END-OF-HEADER ----------------------------- @@ -72,6 +72,8 @@ Revision: $Rev: 26230 $ #include "SEGGER_SYSVIEW_Conf.h" #include "SEGGER_RTT_Conf.h" +#include "esp_assert.h" + #ifdef __cplusplus extern "C" { #endif @@ -370,12 +372,14 @@ extern "C" { #define SEGGER_SYSVIEW_MAX_STRING_LEN 128 #endif +ESP_STATIC_ASSERT(SEGGER_SYSVIEW_MAX_STRING_LEN < 255, "SEGGER Sysview string length must be less than 255."); + /********************************************************************* * * Define: SEGGER_SYSVIEW_SUPPORT_LONG_ID * * Description -* It set, support enconding Evend Ids longer than 14 bit. +* It set, support encoding Evend Ids longer than 14 bit. * Default * 1 */ @@ -388,7 +392,7 @@ extern "C" { * Define: SEGGER_SYSVIEW_SUPPORT_LONG_DATA * * Description -* It set, support enconding event data longer than 14 bit. +* It set, support encoding event data longer than 14 bit. * Default * 0 */ @@ -517,7 +521,7 @@ extern "C" { * Define: SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT * * Description -* Configure how frequently syncronization is sent in post-mortem +* Configure how frequently synchronization is sent in post-mortem * mode. * Default * 8: (1 << 8) = Every 256 Events. diff --git a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW_Int.h b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW_Int.h index ded0b96b567..270fd9fc31c 100644 --- a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW_Int.h +++ b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW_Int.h @@ -8,7 +8,7 @@ * The Embedded Experts * ********************************************************************** * * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* (c) 1995 - 2024 SEGGER Microcontroller GmbH * * * * www.segger.com Support: support@segger.com * * * @@ -47,7 +47,7 @@ * * ********************************************************************** * * -* SystemView version: 3.42 * +* SystemView version: 3.56 * * * ********************************************************************** -------------------------- END-OF-HEADER ----------------------------- diff --git a/components/app_trace/sys_view/SEGGER/sbom.yml b/components/app_trace/sys_view/SEGGER/sbom.yml index 1f8b4be4d81..7ec0b47fec6 100644 --- a/components/app_trace/sys_view/SEGGER/sbom.yml +++ b/components/app_trace/sys_view/SEGGER/sbom.yml @@ -1,5 +1,5 @@ name: 'SystemView' -version: '3.42' +version: '3.56' cpe: cpe:2.3:a:segger:systemview:{}:*:*:*:*:*:*:* supplier: 'Organization: Espressif Systems (Shanghai) CO LTD' originator: 'Organization: SEGGER Microcontroller GmbH' diff --git a/docs/en/COPYRIGHT.rst b/docs/en/COPYRIGHT.rst index e708d26ac82..484eb59f2a2 100644 --- a/docs/en/COPYRIGHT.rst +++ b/docs/en/COPYRIGHT.rst @@ -67,7 +67,7 @@ These third party libraries can be included into the application (firmware) prod * :component:`HTTP Parser ` is based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev. Additional changes are licensed under the same terms as NGINX and Joyent, Inc. and other Node contributors. For details please check :component_file:`LICENSE file `. -* `SEGGER SystemView`_ target-side library, Copyright (C) 1995-2021 SEGGER Microcontroller GmbH, is licensed under BSD 1-clause license. +* `SEGGER SystemView`_ target-side library, Copyright (C) 1995-2024 SEGGER Microcontroller GmbH, is licensed under BSD 1-clause license. * `protobuf-c`_ is Protocol Buffers implementation in C, Copyright (C) 2008-2022 Dave Benson and the protobuf-c authors. For details please check :component_file:`LICENSE file `. diff --git a/docs/zh_CN/COPYRIGHT.rst b/docs/zh_CN/COPYRIGHT.rst index 527b3ce000c..de29353097b 100644 --- a/docs/zh_CN/COPYRIGHT.rst +++ b/docs/zh_CN/COPYRIGHT.rst @@ -67,7 +67,7 @@ * :component:`HTTP 解析器 ` 基于 NGINX 中的 src/http/ngx_http_parse.c 文件,版权归 Igor Sysoev 所有。任何对源代码的额外修改经过与 NGINX、Joyent 公司及其他 Node 贡献者相同条款的许可。详情请参阅 :component_file:`LICENSE 文件 `。 -* `SEGGER SystemView`_ 目标端库,版权归 1995-2021 赛格集团所有,并根据一条款 BSD 许可证进行许可。 +* `SEGGER SystemView`_ 目标端库,版权归 1995-2024 赛格集团所有,并根据一条款 BSD 许可证进行许可。 * `protobuf-c`_ 是 C 语言的 Protocol Buffers 实现,版权归 2008-2022 Dave Benson 及 protobuf-c 作者所有。详情请参阅 :component_file:`LICENSE 文件 `。 diff --git a/tools/esp_app_trace/espytrace/sysview.py b/tools/esp_app_trace/espytrace/sysview.py index f19265a7c00..e7f7cd6053b 100644 --- a/tools/esp_app_trace/espytrace/sysview.py +++ b/tools/esp_app_trace/espytrace/sysview.py @@ -30,6 +30,7 @@ SYSVIEW_EVTID_TIMER_ENTER = 19 SYSVIEW_EVTID_TIMER_EXIT = 20 SYSVIEW_EVTID_STACK_INFO = 21 SYSVIEW_EVTID_MODULEDESC = 22 +SYSVIEW_EVTID_DATA_SAMPLE = 23 SYSVIEW_EVTID_INIT = 24 SYSVIEW_EVENT_ID_PREDEF_LEN_MAX = SYSVIEW_EVTID_INIT SYSVIEW_EVTID_NAME_RESOURCE = 25 @@ -66,7 +67,8 @@ _sysview_events_map = { 'SYS_TIMER_ENTER': SYSVIEW_EVTID_TIMER_ENTER, 'SYS_TIMER_EXIT': SYSVIEW_EVTID_TIMER_EXIT, 'SYS_STACK_INFO': SYSVIEW_EVTID_STACK_INFO, - 'SYS_MODULEDESC': SYSVIEW_EVTID_INIT, + 'SYS_MODULEDESC': SYSVIEW_EVTID_MODULEDESC, + 'SYS_DATA_SAMPLE': SYSVIEW_EVTID_DATA_SAMPLE, 'SYS_INIT': SYSVIEW_EVTID_INIT, 'SYS_NAME_RESOURCE': SYSVIEW_EVTID_NAME_RESOURCE, 'SYS_PRINT_FORMATTED': SYSVIEW_EVTID_PRINT_FORMATTED, @@ -263,7 +265,7 @@ def _decode_str(reader): sz, = struct.unpack(' Date: Wed, 4 Jun 2025 23:12:20 +0200 Subject: [PATCH 178/213] feat(sysview): Add SEGGER multicore trace file support --- tools/esp_app_trace/sysviewtrace_proc.py | 188 ++++++++++++++++++++--- 1 file changed, 164 insertions(+), 24 deletions(-) diff --git a/tools/esp_app_trace/sysviewtrace_proc.py b/tools/esp_app_trace/sysviewtrace_proc.py index d442dfc233a..61ce273d706 100755 --- a/tools/esp_app_trace/sysviewtrace_proc.py +++ b/tools/esp_app_trace/sysviewtrace_proc.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -# SPDX-FileCopyrightText: 2019-2022 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2019-2025 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 # # This is python script to process various types trace data streams in SystemView format. @@ -14,34 +14,139 @@ import logging import os.path import signal import sys +import tempfile import traceback import espytrace.apptrace as apptrace import espytrace.sysview as sysview -def main(): +def is_segger_multicore_format(file_path): + """Check if the file has offsets in header""" + try: + with open(file_path, 'rb') as f: + header = f.read(200) + header_str = header.decode('utf-8', errors='ignore') - verbosity_levels = [ - logging.CRITICAL, - logging.ERROR, - logging.WARNING, - logging.INFO, - logging.DEBUG - ] + if ( + '; Version SEGGER SystemViewer' in header_str + and '; Author Espressif Inc' in header_str + and '; Offset Core0' in header_str + and '; Offset Core1' in header_str + ): + logging.info('Detected SEGGER multicore format in file:', file_path) + return True + except Exception as e: + logging.error('Error checking file format:', e) + return False + + +def split_segger_multicore_file(file_path): + """Split SEGGER multicore file into separate core files.""" + try: + with open(file_path, 'rb') as f: + # Read first few lines to get offsets for each core + header = f.read(200) + header_str = header.decode('utf-8', errors='ignore') + + core0_offset = None + core1_offset = None + for line in header_str.split('\n'): + if '; Offset Core0' in line: + core0_offset = int(line.strip().split()[-1]) + elif '; Offset Core1' in line: + core1_offset = int(line.strip().split()[-1]) + + if core0_offset is None or core1_offset is None: + logging.error('Failed to parse core offsets') + return None, None + + # Read the entire file + f.seek(0) + data = f.read() + + # Find first 10 sync bytes start offset + sync_start = data.find(b'\x00' * 10) + if sync_start == -1: + logging.error('Sync bytes not found') + return None, None + + core0_offset = sync_start + core1_offset += sync_start + + # Parse original header and get version from there, if not found, use default version + version = 'V3.60' + for line in header_str.split('\n'): + if '; Version SEGGER SystemViewer' in line: + version = line.strip().split()[-1] + break + + # Rebuild header without offset lines + core_header = f';\n; Version SEGGER SystemViewer {version}\n; Author Espressif Inc\n;\n' + core_header = core_header.encode('utf-8') + core_base = core_header + b'\x00' * 10 + + core0_data = core_base + data[core0_offset:core1_offset] + core1_data = core_base + data[core1_offset:] + + core0_file = tempfile.NamedTemporaryFile(delete=False, suffix='.svdat') + core1_file = tempfile.NamedTemporaryFile(delete=False, suffix='.svdat') + + core0_file.write(core0_data) + core1_file.write(core1_data) + + core0_file.close() + core1_file.close() + + return core0_file.name, core1_file.name + + except Exception as e: + logging.error('Failed to process files:', e) + return None, None + + +def main(): + verbosity_levels = [logging.CRITICAL, logging.ERROR, logging.WARNING, logging.INFO, logging.DEBUG] parser = argparse.ArgumentParser(description='ESP32 SEGGER SystemView Trace Parsing Tool') - parser.add_argument('trace_sources', help='Trace data sources. Format: [file://]/path/to/file.', nargs='+', type=str) + parser.add_argument( + 'trace_sources', help='Trace data sources. Format: [file://]/path/to/file.', nargs='+', type=str + ) parser.add_argument('--elf-file', '-b', help='Path to program ELF file.', type=str, default='') parser.add_argument('--tmo', '-w', help='Data wait timeout in sec. -1: infinite, 0: no wait', type=int, default=0) parser.add_argument('--dump-events', '-d', help='Dump all events.', action='store_true') - parser.add_argument('--print-events', '-p', help='Print events of selected types. By default only reports are printed', action='store_true') - parser.add_argument('--include-events', '-i', help='Events types to be included into report.', type=str, choices=['heap', 'log', 'all'], default='all') + parser.add_argument( + '--print-events', + '-p', + help='Print events of selected types. By default only reports are printed', + action='store_true', + ) + parser.add_argument( + '--include-events', + '-i', + help='Events types to be included into report.', + type=str, + choices=['heap', 'log', 'all'], + default='all', + ) parser.add_argument('--toolchain', '-t', help='Toolchain prefix.', type=str, default='xtensa-esp32-elf-') - parser.add_argument('--events-map', '-e', help='Events map file.', type=str, default=os.path.join(os.path.dirname(__file__), 'SYSVIEW_FreeRTOS.txt')) + parser.add_argument( + '--events-map', + '-e', + help='Events map file.', + type=str, + default=os.path.join(os.path.dirname(__file__), 'SYSVIEW_FreeRTOS.txt'), + ) parser.add_argument('--to-json', '-j', help='Print JSON.', action='store_true', default=False) - parser.add_argument('--verbose', '-v', help='Verbosity level. Default 1', choices=range(0, len(verbosity_levels)), type=int, default=1) + parser.add_argument( + '--verbose', + '-v', + help='Verbosity level. Default 1', + choices=range(0, len(verbosity_levels)), + type=int, + default=1, + ) args = parser.parse_args() def sig_int_handler(signum, frame): @@ -60,17 +165,33 @@ def main(): logging.basicConfig(level=verbosity_levels[args.verbose], format='[%(levelname)s] %(message)s') + segger_files = [] + # Only check for SEGGER format if there's exactly one trace source + if len(args.trace_sources) == 1: + trace_source = args.trace_sources[0] + if is_segger_multicore_format(trace_source): + core0_file, core1_file = split_segger_multicore_file(trace_source) + if core0_file and core1_file: + segger_files.extend([core0_file, core1_file]) + args.trace_sources = segger_files + else: + sys.exit(2) + # parse trace files parsers = [] for i, trace_source in enumerate(args.trace_sources): try: parser = sysview.SysViewMultiTraceDataParser(print_events=False, core_id=i) if include_events['heap']: - parser.add_stream_parser(sysview.SysViewTraceDataParser.STREAMID_HEAP, - sysview.SysViewHeapTraceDataParser(print_events=False, core_id=i)) + parser.add_stream_parser( + sysview.SysViewTraceDataParser.STREAMID_HEAP, + sysview.SysViewHeapTraceDataParser(print_events=False, core_id=i), + ) if include_events['log']: - parser.add_stream_parser(sysview.SysViewTraceDataParser.STREAMID_LOG, - sysview.SysViewLogTraceDataParser(print_events=False, core_id=i)) + parser.add_stream_parser( + sysview.SysViewTraceDataParser.STREAMID_LOG, + sysview.SysViewLogTraceDataParser(print_events=False, core_id=i), + ) parsers.append(parser) except Exception as e: logging.error('Failed to create data parser (%s)!', e) @@ -97,13 +218,21 @@ def main(): # merge and process traces try: - proc = sysview.SysViewMultiStreamTraceDataProcessor(traces=parsers, print_events=args.dump_events, keep_all_events=True if args.to_json else False) + proc = sysview.SysViewMultiStreamTraceDataProcessor( + traces=parsers, print_events=args.dump_events, keep_all_events=True if args.to_json else False + ) if include_events['heap']: - proc.add_stream_processor(sysview.SysViewTraceDataParser.STREAMID_HEAP, - sysview.SysViewHeapTraceDataProcessor(args.toolchain, args.elf_file, root_proc=proc, print_heap_events=args.print_events)) + proc.add_stream_processor( + sysview.SysViewTraceDataParser.STREAMID_HEAP, + sysview.SysViewHeapTraceDataProcessor( + args.toolchain, args.elf_file, root_proc=proc, print_heap_events=args.print_events + ), + ) if include_events['log']: - proc.add_stream_processor(sysview.SysViewTraceDataParser.STREAMID_LOG, - sysview.SysViewLogTraceDataProcessor(root_proc=proc, print_log_events=args.print_events)) + proc.add_stream_processor( + sysview.SysViewTraceDataParser.STREAMID_LOG, + sysview.SysViewLogTraceDataProcessor(root_proc=proc, print_log_events=args.print_events), + ) except Exception as e: logging.error('Failed to create data processor (%s)!', e) traceback.print_exc() @@ -119,11 +248,22 @@ def main(): sys.exit(2) finally: if args.to_json: - print(json.dumps(proc, cls=sysview.SysViewTraceDataJsonEncoder, indent=4, separators=(',', ': '), sort_keys=True)) + print( + json.dumps( + proc, cls=sysview.SysViewTraceDataJsonEncoder, indent=4, separators=(',', ': '), sort_keys=True + ) + ) else: proc.print_report() proc.cleanup() + if segger_files: + for file in segger_files: + try: + os.remove(file) + except Exception as e: + logging.warning('Failed to remove temporary file %s: %s', file, e) + if __name__ == '__main__': main() From a3a154a7eab872437db7198b57fcd9214c74b506 Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Wed, 11 Jun 2025 22:18:53 +0200 Subject: [PATCH 179/213] change(sysview): set default core name as core0 --- .../Config/esp/SEGGER_SYSVIEW_Config_FreeRTOS.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/components/app_trace/sys_view/Sample/FreeRTOSV10.4/Config/esp/SEGGER_SYSVIEW_Config_FreeRTOS.c b/components/app_trace/sys_view/Sample/FreeRTOSV10.4/Config/esp/SEGGER_SYSVIEW_Config_FreeRTOS.c index c01cbed67ea..0e7aba7bdf3 100644 --- a/components/app_trace/sys_view/Sample/FreeRTOSV10.4/Config/esp/SEGGER_SYSVIEW_Config_FreeRTOS.c +++ b/components/app_trace/sys_view/Sample/FreeRTOSV10.4/Config/esp/SEGGER_SYSVIEW_Config_FreeRTOS.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-1-Clause * - * SPDX-FileContributor: 2017-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileContributor: 2017-2025 Espressif Systems (Shanghai) CO LTD */ /********************************************************************* * SEGGER Microcontroller GmbH * @@ -84,11 +84,7 @@ extern const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI; // The target device name #define SYSVIEW_DEVICE_NAME CONFIG_IDF_TARGET // The target core name -#if CONFIG_IDF_TARGET_ARCH_XTENSA -#define SYSVIEW_CORE_NAME "xtensa" -#elif CONFIG_IDF_TARGET_ARCH_RISCV -#define SYSVIEW_CORE_NAME "riscv" -#endif +#define SYSVIEW_CORE_NAME "core0" // In dual core, this will be renamed by OpenOCD as core1 // Determine which timer to use as timestamp source #if CONFIG_APPTRACE_SV_TS_SOURCE_CCOUNT From 40f38c4912094c594f60b1f2f640710a6a50881f Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Thu, 5 Jun 2025 21:13:56 +0200 Subject: [PATCH 180/213] feat(sysview): update multicore files for testing --- tools/esp_app_trace/sysviewtrace_proc.py | 39 +- tools/esp_app_trace/test/sysview/README.md | 5 +- .../test/sysview/expected_output | 6019 ++++---- .../test/sysview/expected_output.json | 11202 +++++++------- .../test/sysview/expected_output_mcore | 5879 ++++---- .../test/sysview/expected_output_mcore.json | 12084 +++++++++------- .../test/sysview/heap_log0.svdat | Bin 12298 -> 12335 bytes .../test/sysview/heap_log1.svdat | Bin 9669 -> 9731 bytes .../test/sysview/heap_log_mcore.svdat | Bin 19619 -> 22043 bytes .../test/sysview/sysview_tracing_heap_log.elf | Bin 3124788 -> 2781796 bytes tools/esp_app_trace/test/sysview/test.sh | 48 +- 11 files changed, 18765 insertions(+), 16511 deletions(-) diff --git a/tools/esp_app_trace/sysviewtrace_proc.py b/tools/esp_app_trace/sysviewtrace_proc.py index 61ce273d706..474438b5d32 100755 --- a/tools/esp_app_trace/sysviewtrace_proc.py +++ b/tools/esp_app_trace/sysviewtrace_proc.py @@ -16,6 +16,7 @@ import signal import sys import tempfile import traceback +from urllib.parse import urlparse import espytrace.apptrace as apptrace import espytrace.sysview as sysview @@ -24,27 +25,27 @@ import espytrace.sysview as sysview def is_segger_multicore_format(file_path): """Check if the file has offsets in header""" try: - with open(file_path, 'rb') as f: - header = f.read(200) - header_str = header.decode('utf-8', errors='ignore') - - if ( - '; Version SEGGER SystemViewer' in header_str - and '; Author Espressif Inc' in header_str - and '; Offset Core0' in header_str - and '; Offset Core1' in header_str - ): - logging.info('Detected SEGGER multicore format in file:', file_path) - return True + url = urlparse(file_path) + if len(url.scheme) == 0 or url.scheme == 'file': + with open(url.path, 'rb') as f: + header = f.read(200) + header_str = header.decode('utf-8', errors='ignore') + if ( + '; Version SEGGER SystemViewer' in header_str + and '; Author Espressif Inc' in header_str + and '; Offset Core0' in header_str + and '; Offset Core1' in header_str + ): + return True except Exception as e: - logging.error('Error checking file format:', e) + logging.error('Error checking SEGGER multicore file format:', e) return False def split_segger_multicore_file(file_path): """Split SEGGER multicore file into separate core files.""" try: - with open(file_path, 'rb') as f: + with open(urlparse(file_path).path, 'rb') as f: # Read first few lines to get offsets for each core header = f.read(200) header_str = header.decode('utf-8', errors='ignore') @@ -165,15 +166,15 @@ def main(): logging.basicConfig(level=verbosity_levels[args.verbose], format='[%(levelname)s] %(message)s') - segger_files = [] + temp_files = [] # Only check for SEGGER format if there's exactly one trace source if len(args.trace_sources) == 1: trace_source = args.trace_sources[0] if is_segger_multicore_format(trace_source): core0_file, core1_file = split_segger_multicore_file(trace_source) if core0_file and core1_file: - segger_files.extend([core0_file, core1_file]) - args.trace_sources = segger_files + temp_files.extend([core0_file, core1_file]) + args.trace_sources = temp_files else: sys.exit(2) @@ -257,8 +258,8 @@ def main(): proc.print_report() proc.cleanup() - if segger_files: - for file in segger_files: + if len(temp_files) > 0: + for file in temp_files: try: os.remove(file) except Exception as e: diff --git a/tools/esp_app_trace/test/sysview/README.md b/tools/esp_app_trace/test/sysview/README.md index 4f09f1677c2..b370b03613a 100644 --- a/tools/esp_app_trace/test/sysview/README.md +++ b/tools/esp_app_trace/test/sysview/README.md @@ -24,7 +24,7 @@ ``` cd $IDF_PATH/examples/system/sysview_tracing_heap_log - xtensa-esp32-elf-gdb -x gdbinit build/sysview_tracing_heap_log.elf + xtensa-esp32-elf-gdb -x $IDF_PATH/tools/esp_app_trace/test/sysview/gdbinit build/sysview_tracing_heap_log.elf ``` When program stops at `heap_trace_stop` quit GDB and OpenOCD @@ -45,7 +45,7 @@ ``` cd $IDF_PATH/examples/system/sysview_tracing_heap_log - xtensa-esp32-elf-gdb -x gdbinit-mcore build/sysview_tracing_heap_log.elf + xtensa-esp32-elf-gdb -x $IDF_PATH/tools/esp_app_trace/test/sysview/gdbinit-mcore build/sysview_tracing_heap_log.elf ``` When program stops at `heap_trace_stop` quit GDB and OpenOCD @@ -59,6 +59,7 @@ You can use the commands from the `test.sh` to generate expected result files ``` + cd $IDF_PATH/tools/esp_app_trace/test/sysview/ $IDF_PATH/tools/esp_app_trace/sysviewtrace_proc.py -d -p -b sysview_tracing_heap_log.elf heap_log0.svdat heap_log1.svdat &> expected_output $IDF_PATH/tools/esp_app_trace/sysviewtrace_proc.py -j -b sysview_tracing_heap_log.elf heap_log0.svdat heap_log1.svdat &> expected_output.json $IDF_PATH/tools/esp_app_trace/sysviewtrace_proc.py -d -p -b sysview_tracing_heap_log.elf heap_log_mcore.svdat &> expected_output_mcore diff --git a/tools/esp_app_trace/test/sysview/expected_output b/tools/esp_app_trace/test/sysview/expected_output index a342a494cd9..7d5de4e83b9 100644 --- a/tools/esp_app_trace/test/sysview/expected_output +++ b/tools/esp_app_trace/test/sysview/expected_output @@ -1,3721 +1,3738 @@ EVENT[0]: 0.000000000 - core[0].svTraceStart(10), plen 0: [] EVENT[1]: 0.000000000 - core[1].svTraceStart(10), plen 0: [] -EVENT[2]: 0.000006650 - core[0].svInit(24), plen 14: [sys_freq: 40000000, cpu_freq: 160000000, ram_base: 1061158912, id_shift: 0] -EVENT[3]: 0.000006650 - core[1].svInit(24), plen 14: [sys_freq: 40000000, cpu_freq: 160000000, ram_base: 1061158912, id_shift: 0] -EVENT[4]: 0.000018550 - core[0].svSysDesc(14), plen 0: [desc: N=FreeRTOS Application,D=esp32,C=xtensa,O=FreeRTOS] -EVENT[5]: 0.000018550 - core[1].svSysDesc(14), plen 0: [desc: N=FreeRTOS Application,D=esp32,C=xtensa,O=FreeRTOS] -EVENT[6]: 0.000027675 - core[0].svSysDesc(14), plen 0: [desc: I#5=SysTick] -EVENT[7]: 0.000027675 - core[1].svSysDesc(14), plen 0: [desc: I#5=SysTick] -EVENT[8]: 0.000049775 - core[0].svSysDesc(14), plen 0: [desc: I#6=WIFI_MAC] -EVENT[9]: 0.000049775 - core[1].svSysDesc(14), plen 0: [desc: I#6=WIFI_MAC] -EVENT[10]: 0.000063875 - core[0].svSysDesc(14), plen 0: [desc: I#7=WIFI_NMI] -EVENT[11]: 0.000063875 - core[1].svSysDesc(14), plen 0: [desc: I#7=WIFI_NMI] -EVENT[12]: 0.000073825 - core[0].svSysDesc(14), plen 0: [desc: I#8=WIFI_BB] -EVENT[13]: 0.000073825 - core[1].svSysDesc(14), plen 0: [desc: I#8=WIFI_BB] -EVENT[14]: 0.000087500 - core[0].svSysDesc(14), plen 0: [desc: I#9=BT_MAC] -EVENT[15]: 0.000087500 - core[1].svSysDesc(14), plen 0: [desc: I#9=BT_MAC] -EVENT[16]: 0.000101575 - core[0].svSysDesc(14), plen 0: [desc: I#10=BT_BB] -EVENT[17]: 0.000101575 - core[1].svSysDesc(14), plen 0: [desc: I#10=BT_BB] -EVENT[18]: 0.000112375 - core[0].svSysDesc(14), plen 0: [desc: I#11=BT_BB_NMI] -EVENT[19]: 0.000112375 - core[1].svSysDesc(14), plen 0: [desc: I#11=BT_BB_NMI] -EVENT[20]: 0.000122300 - core[0].svSysDesc(14), plen 0: [desc: I#12=RWBT] -EVENT[21]: 0.000122300 - core[1].svSysDesc(14), plen 0: [desc: I#12=RWBT] -EVENT[22]: 0.000132300 - core[0].svSysDesc(14), plen 0: [desc: I#13=RWBLE] -EVENT[23]: 0.000132300 - core[1].svSysDesc(14), plen 0: [desc: I#13=RWBLE] -EVENT[24]: 0.000146800 - core[0].svSysDesc(14), plen 0: [desc: I#14=RWBT_NMI] -EVENT[25]: 0.000146800 - core[1].svSysDesc(14), plen 0: [desc: I#14=RWBT_NMI] -EVENT[26]: 0.000157600 - core[0].svSysDesc(14), plen 0: [desc: I#15=RWBLE_NMI] -EVENT[27]: 0.000157600 - core[1].svSysDesc(14), plen 0: [desc: I#15=RWBLE_NMI] -EVENT[28]: 0.000171900 - core[0].svSysDesc(14), plen 0: [desc: I#16=SLC0] -EVENT[29]: 0.000171900 - core[1].svSysDesc(14), plen 0: [desc: I#16=SLC0] -EVENT[30]: 0.000189550 - core[0].svSysDesc(14), plen 0: [desc: I#17=SLC1] -EVENT[31]: 0.000189550 - core[1].svSysDesc(14), plen 0: [desc: I#17=SLC1] -EVENT[32]: 0.000199525 - core[0].svSysDesc(14), plen 0: [desc: I#18=UHCI0] -EVENT[33]: 0.000199525 - core[1].svSysDesc(14), plen 0: [desc: I#18=UHCI0] -EVENT[34]: 0.000209500 - core[0].svSysDesc(14), plen 0: [desc: I#19=UHCI1] -EVENT[35]: 0.000209500 - core[1].svSysDesc(14), plen 0: [desc: I#19=UHCI1] -EVENT[36]: 0.000224750 - core[0].svSysDesc(14), plen 0: [desc: I#20=TG0_T0_LEVEL] -EVENT[37]: 0.000224750 - core[1].svSysDesc(14), plen 0: [desc: I#20=TG0_T0_LEVEL] -EVENT[38]: 0.000236150 - core[0].svSysDesc(14), plen 0: [desc: I#21=TG0_T1_LEVEL] -EVENT[39]: 0.000236150 - core[1].svSysDesc(14), plen 0: [desc: I#21=TG0_T1_LEVEL] -EVENT[40]: 0.000251850 - core[0].svSysDesc(14), plen 0: [desc: I#22=TG0_WDT_LEVEL] -EVENT[41]: 0.000251850 - core[1].svSysDesc(14), plen 0: [desc: I#22=TG0_WDT_LEVEL] -EVENT[42]: 0.000263625 - core[0].svSysDesc(14), plen 0: [desc: I#23=TG0_LACT_LEVEL] -EVENT[43]: 0.000263625 - core[1].svSysDesc(14), plen 0: [desc: I#23=TG0_LACT_LEVEL] -EVENT[44]: 0.000279050 - core[0].svSysDesc(14), plen 0: [desc: I#24=TG1_T0_LEVEL] -EVENT[45]: 0.000279050 - core[1].svSysDesc(14), plen 0: [desc: I#24=TG1_T0_LEVEL] -EVENT[46]: 0.000294450 - core[0].svSysDesc(14), plen 0: [desc: I#25=TG1_T1_LEVEL] -EVENT[47]: 0.000294450 - core[1].svSysDesc(14), plen 0: [desc: I#25=TG1_T1_LEVEL] -EVENT[48]: 0.000310000 - core[0].svSysDesc(14), plen 0: [desc: I#26=TG1_WDT_LEVEL] -EVENT[49]: 0.000310000 - core[1].svSysDesc(14), plen 0: [desc: I#26=TG1_WDT_LEVEL] -EVENT[50]: 0.000321975 - core[0].svSysDesc(14), plen 0: [desc: I#27=TG1_LACT_LEVEL] -EVENT[51]: 0.000321975 - core[1].svSysDesc(14), plen 0: [desc: I#27=TG1_LACT_LEVEL] -EVENT[52]: 0.000331875 - core[0].svSysDesc(14), plen 0: [desc: I#28=GPIO] -EVENT[53]: 0.000331875 - core[1].svSysDesc(14), plen 0: [desc: I#28=GPIO] -EVENT[54]: 0.000350775 - core[0].svSysDesc(14), plen 0: [desc: I#29=GPIO_NMI] -EVENT[55]: 0.000350775 - core[1].svSysDesc(14), plen 0: [desc: I#29=GPIO_NMI] -EVENT[56]: 0.000361675 - core[0].svSysDesc(14), plen 0: [desc: I#30=FROM_CPU0] -EVENT[57]: 0.000361675 - core[1].svSysDesc(14), plen 0: [desc: I#30=FROM_CPU0] -EVENT[58]: 0.000376375 - core[0].svSysDesc(14), plen 0: [desc: I#31=FROM_CPU1] -EVENT[59]: 0.000376375 - core[1].svSysDesc(14), plen 0: [desc: I#31=FROM_CPU1] -EVENT[60]: 0.000387200 - core[0].svSysDesc(14), plen 0: [desc: I#32=FROM_CPU2] -EVENT[61]: 0.000387200 - core[1].svSysDesc(14), plen 0: [desc: I#32=FROM_CPU2] -EVENT[62]: 0.000401900 - core[0].svSysDesc(14), plen 0: [desc: I#33=FROM_CPU3] -EVENT[63]: 0.000401900 - core[1].svSysDesc(14), plen 0: [desc: I#33=FROM_CPU3] -EVENT[64]: 0.000415650 - core[0].svSysDesc(14), plen 0: [desc: I#34=SPI0] -EVENT[65]: 0.000415650 - core[1].svSysDesc(14), plen 0: [desc: I#34=SPI0] -EVENT[66]: 0.000425400 - core[0].svSysDesc(14), plen 0: [desc: I#35=SPI1] -EVENT[67]: 0.000425400 - core[1].svSysDesc(14), plen 0: [desc: I#35=SPI1] -EVENT[68]: 0.000435175 - core[0].svSysDesc(14), plen 0: [desc: I#36=SPI2] -EVENT[69]: 0.000435175 - core[1].svSysDesc(14), plen 0: [desc: I#36=SPI2] +EVENT[2]: 0.000006675 - core[0].svInit(24), plen 14: [sys_freq: 40000000, cpu_freq: 160000000, ram_base: 1061158912, id_shift: 0] +EVENT[3]: 0.000006675 - core[1].svInit(24), plen 14: [sys_freq: 40000000, cpu_freq: 160000000, ram_base: 1061158912, id_shift: 0] +EVENT[4]: 0.000018600 - core[0].svSysDesc(14), plen 0: [desc: N=FreeRTOS Application,D=esp32,C=xtensa,O=FreeRTOS] +EVENT[5]: 0.000018600 - core[1].svSysDesc(14), plen 0: [desc: N=FreeRTOS Application,D=esp32,C=xtensa,O=FreeRTOS] +EVENT[6]: 0.000027750 - core[0].svSysDesc(14), plen 0: [desc: I#5=SysTick] +EVENT[7]: 0.000027750 - core[1].svSysDesc(14), plen 0: [desc: I#5=SysTick] +EVENT[8]: 0.000045925 - core[0].svSysDesc(14), plen 0: [desc: I#6=WIFI_MAC] +EVENT[9]: 0.000045925 - core[1].svSysDesc(14), plen 0: [desc: I#6=WIFI_MAC] +EVENT[10]: 0.000060025 - core[0].svSysDesc(14), plen 0: [desc: I#7=WIFI_NMI] +EVENT[11]: 0.000060025 - core[1].svSysDesc(14), plen 0: [desc: I#7=WIFI_NMI] +EVENT[12]: 0.000070125 - core[0].svSysDesc(14), plen 0: [desc: I#8=WIFI_BB] +EVENT[13]: 0.000070125 - core[1].svSysDesc(14), plen 0: [desc: I#8=WIFI_BB] +EVENT[14]: 0.000079875 - core[0].svSysDesc(14), plen 0: [desc: I#9=BT_MAC] +EVENT[15]: 0.000079875 - core[1].svSysDesc(14), plen 0: [desc: I#9=BT_MAC] +EVENT[16]: 0.000093950 - core[0].svSysDesc(14), plen 0: [desc: I#10=BT_BB] +EVENT[17]: 0.000093950 - core[1].svSysDesc(14), plen 0: [desc: I#10=BT_BB] +EVENT[18]: 0.000108725 - core[0].svSysDesc(14), plen 0: [desc: I#11=BT_BB_NMI] +EVENT[19]: 0.000108725 - core[1].svSysDesc(14), plen 0: [desc: I#11=BT_BB_NMI] +EVENT[20]: 0.000118675 - core[0].svSysDesc(14), plen 0: [desc: I#12=RWBT] +EVENT[21]: 0.000118675 - core[1].svSysDesc(14), plen 0: [desc: I#12=RWBT] +EVENT[22]: 0.000128675 - core[0].svSysDesc(14), plen 0: [desc: I#13=RWBLE] +EVENT[23]: 0.000128675 - core[1].svSysDesc(14), plen 0: [desc: I#13=RWBLE] +EVENT[24]: 0.000143225 - core[0].svSysDesc(14), plen 0: [desc: I#14=RWBT_NMI] +EVENT[25]: 0.000143225 - core[1].svSysDesc(14), plen 0: [desc: I#14=RWBT_NMI] +EVENT[26]: 0.000154025 - core[0].svSysDesc(14), plen 0: [desc: I#15=RWBLE_NMI] +EVENT[27]: 0.000154025 - core[1].svSysDesc(14), plen 0: [desc: I#15=RWBLE_NMI] +EVENT[28]: 0.000168350 - core[0].svSysDesc(14), plen 0: [desc: I#16=SLC0] +EVENT[29]: 0.000168350 - core[1].svSysDesc(14), plen 0: [desc: I#16=SLC0] +EVENT[30]: 0.000182075 - core[0].svSysDesc(14), plen 0: [desc: I#17=SLC1] +EVENT[31]: 0.000182075 - core[1].svSysDesc(14), plen 0: [desc: I#17=SLC1] +EVENT[32]: 0.000196025 - core[0].svSysDesc(14), plen 0: [desc: I#18=UHCI0] +EVENT[33]: 0.000196025 - core[1].svSysDesc(14), plen 0: [desc: I#18=UHCI0] +EVENT[34]: 0.000206000 - core[0].svSysDesc(14), plen 0: [desc: I#19=UHCI1] +EVENT[35]: 0.000206000 - core[1].svSysDesc(14), plen 0: [desc: I#19=UHCI1] +EVENT[36]: 0.000221275 - core[0].svSysDesc(14), plen 0: [desc: I#20=TG0_T0_LEVEL] +EVENT[37]: 0.000221275 - core[1].svSysDesc(14), plen 0: [desc: I#20=TG0_T0_LEVEL] +EVENT[38]: 0.000232700 - core[0].svSysDesc(14), plen 0: [desc: I#21=TG0_T1_LEVEL] +EVENT[39]: 0.000232700 - core[1].svSysDesc(14), plen 0: [desc: I#21=TG0_T1_LEVEL] +EVENT[40]: 0.000248425 - core[0].svSysDesc(14), plen 0: [desc: I#22=TG0_WDT_LEVEL] +EVENT[41]: 0.000248425 - core[1].svSysDesc(14), plen 0: [desc: I#22=TG0_WDT_LEVEL] +EVENT[42]: 0.000260225 - core[0].svSysDesc(14), plen 0: [desc: I#23=TG0_LACT_LEVEL] +EVENT[43]: 0.000260225 - core[1].svSysDesc(14), plen 0: [desc: I#23=TG0_LACT_LEVEL] +EVENT[44]: 0.000275650 - core[0].svSysDesc(14), plen 0: [desc: I#24=TG1_T0_LEVEL] +EVENT[45]: 0.000275650 - core[1].svSysDesc(14), plen 0: [desc: I#24=TG1_T0_LEVEL] +EVENT[46]: 0.000287250 - core[0].svSysDesc(14), plen 0: [desc: I#25=TG1_T1_LEVEL] +EVENT[47]: 0.000287250 - core[1].svSysDesc(14), plen 0: [desc: I#25=TG1_T1_LEVEL] +EVENT[48]: 0.000306775 - core[0].svSysDesc(14), plen 0: [desc: I#26=TG1_WDT_LEVEL] +EVENT[49]: 0.000306775 - core[1].svSysDesc(14), plen 0: [desc: I#26=TG1_WDT_LEVEL] +EVENT[50]: 0.000318775 - core[0].svSysDesc(14), plen 0: [desc: I#27=TG1_LACT_LEVEL] +EVENT[51]: 0.000318775 - core[1].svSysDesc(14), plen 0: [desc: I#27=TG1_LACT_LEVEL] +EVENT[52]: 0.000328700 - core[0].svSysDesc(14), plen 0: [desc: I#28=GPIO] +EVENT[53]: 0.000328700 - core[1].svSysDesc(14), plen 0: [desc: I#28=GPIO] +EVENT[54]: 0.000347625 - core[0].svSysDesc(14), plen 0: [desc: I#29=GPIO_NMI] +EVENT[55]: 0.000347625 - core[1].svSysDesc(14), plen 0: [desc: I#29=GPIO_NMI] +EVENT[56]: 0.000358550 - core[0].svSysDesc(14), plen 0: [desc: I#30=FROM_CPU0] +EVENT[57]: 0.000358550 - core[1].svSysDesc(14), plen 0: [desc: I#30=FROM_CPU0] +EVENT[58]: 0.000369300 - core[0].svSysDesc(14), plen 0: [desc: I#31=FROM_CPU1] +EVENT[59]: 0.000369300 - core[1].svSysDesc(14), plen 0: [desc: I#31=FROM_CPU1] +EVENT[60]: 0.000384075 - core[0].svSysDesc(14), plen 0: [desc: I#32=FROM_CPU2] +EVENT[61]: 0.000384075 - core[1].svSysDesc(14), plen 0: [desc: I#32=FROM_CPU2] +EVENT[62]: 0.000394825 - core[0].svSysDesc(14), plen 0: [desc: I#33=FROM_CPU3] +EVENT[63]: 0.000394825 - core[1].svSysDesc(14), plen 0: [desc: I#33=FROM_CPU3] +EVENT[64]: 0.000408600 - core[0].svSysDesc(14), plen 0: [desc: I#34=SPI0] +EVENT[65]: 0.000408600 - core[1].svSysDesc(14), plen 0: [desc: I#34=SPI0] +EVENT[66]: 0.000422675 - core[0].svSysDesc(14), plen 0: [desc: I#35=SPI1] +EVENT[67]: 0.000422675 - core[1].svSysDesc(14), plen 0: [desc: I#35=SPI1] +EVENT[68]: 0.000433900 - core[0].svSysDesc(14), plen 0: [desc: I#36=SPI2] +EVENT[69]: 0.000433900 - core[1].svSysDesc(14), plen 0: [desc: I#36=SPI2] EVENT[70]: 0.000444900 - core[0].svSysDesc(14), plen 0: [desc: I#37=SPI3] EVENT[71]: 0.000444900 - core[1].svSysDesc(14), plen 0: [desc: I#37=SPI3] -EVENT[72]: 0.000458850 - core[0].svSysDesc(14), plen 0: [desc: I#38=I2S0] -EVENT[73]: 0.000458850 - core[1].svSysDesc(14), plen 0: [desc: I#38=I2S0] -EVENT[74]: 0.000468600 - core[0].svSysDesc(14), plen 0: [desc: I#39=I2S1] -EVENT[75]: 0.000468600 - core[1].svSysDesc(14), plen 0: [desc: I#39=I2S1] -EVENT[76]: 0.000478575 - core[0].svSysDesc(14), plen 0: [desc: I#40=UART0] -EVENT[77]: 0.000478575 - core[1].svSysDesc(14), plen 0: [desc: I#40=UART0] -EVENT[78]: 0.000492500 - core[0].svSysDesc(14), plen 0: [desc: I#41=UART1] -EVENT[79]: 0.000492500 - core[1].svSysDesc(14), plen 0: [desc: I#41=UART1] -EVENT[80]: 0.000506375 - core[0].svSysDesc(14), plen 0: [desc: I#42=UART2] -EVENT[81]: 0.000506375 - core[1].svSysDesc(14), plen 0: [desc: I#42=UART2] -EVENT[82]: 0.000517150 - core[0].svSysDesc(14), plen 0: [desc: I#43=SDIO_HOST] -EVENT[83]: 0.000517150 - core[1].svSysDesc(14), plen 0: [desc: I#43=SDIO_HOST] -EVENT[84]: 0.000527475 - core[0].svSysDesc(14), plen 0: [desc: I#44=ETH_MAC] -EVENT[85]: 0.000527475 - core[1].svSysDesc(14), plen 0: [desc: I#44=ETH_MAC] -EVENT[86]: 0.000541625 - core[0].svSysDesc(14), plen 0: [desc: I#45=PWM0] -EVENT[87]: 0.000541625 - core[1].svSysDesc(14), plen 0: [desc: I#45=PWM0] -EVENT[88]: 0.000555300 - core[0].svSysDesc(14), plen 0: [desc: I#46=PWM1] -EVENT[89]: 0.000555300 - core[1].svSysDesc(14), plen 0: [desc: I#46=PWM1] -EVENT[90]: 0.000565975 - core[0].svSysDesc(14), plen 0: [desc: I#47=RESERVED] -EVENT[91]: 0.000565975 - core[1].svSysDesc(14), plen 0: [desc: I#47=RESERVED] -EVENT[92]: 0.000576550 - core[0].svSysDesc(14), plen 0: [desc: I#48=RESERVED] -EVENT[93]: 0.000576550 - core[1].svSysDesc(14), plen 0: [desc: I#48=RESERVED] -EVENT[94]: 0.000590325 - core[0].svSysDesc(14), plen 0: [desc: I#49=LEDC] -EVENT[95]: 0.000590325 - core[1].svSysDesc(14), plen 0: [desc: I#49=LEDC] -EVENT[96]: 0.000604225 - core[0].svSysDesc(14), plen 0: [desc: I#50=EFUSE] -EVENT[97]: 0.000604225 - core[1].svSysDesc(14), plen 0: [desc: I#50=EFUSE] -EVENT[98]: 0.000618075 - core[0].svSysDesc(14), plen 0: [desc: I#51=TWAI] -EVENT[99]: 0.000618075 - core[1].svSysDesc(14), plen 0: [desc: I#51=TWAI] -EVENT[100]: 0.000628650 - core[0].svSysDesc(14), plen 0: [desc: I#52=RTC_CORE] -EVENT[101]: 0.000628650 - core[1].svSysDesc(14), plen 0: [desc: I#52=RTC_CORE] -EVENT[102]: 0.000638250 - core[0].svSysDesc(14), plen 0: [desc: I#53=RMT] -EVENT[103]: 0.000638250 - core[1].svSysDesc(14), plen 0: [desc: I#53=RMT] -EVENT[104]: 0.000648075 - core[0].svSysDesc(14), plen 0: [desc: I#54=PCNT] -EVENT[105]: 0.000648075 - core[1].svSysDesc(14), plen 0: [desc: I#54=PCNT] -EVENT[106]: 0.000662700 - core[0].svSysDesc(14), plen 0: [desc: I#55=I2C_EXT0] -EVENT[107]: 0.000662700 - core[1].svSysDesc(14), plen 0: [desc: I#55=I2C_EXT0] -EVENT[108]: 0.000674475 - core[0].svSysDesc(14), plen 0: [desc: I#56=I2C_EXT1] -EVENT[109]: 0.000674475 - core[1].svSysDesc(14), plen 0: [desc: I#56=I2C_EXT1] -EVENT[110]: 0.000689475 - core[0].svSysDesc(14), plen 0: [desc: I#57=RSA] -EVENT[111]: 0.000689475 - core[1].svSysDesc(14), plen 0: [desc: I#57=RSA] -EVENT[112]: 0.000705425 - core[0].svSysDesc(14), plen 0: [desc: I#58=SPI1_DMA] -EVENT[113]: 0.000705425 - core[1].svSysDesc(14), plen 0: [desc: I#58=SPI1_DMA] -EVENT[114]: 0.000717350 - core[0].svSysDesc(14), plen 0: [desc: I#59=SPI2_DMA] -EVENT[115]: 0.000717350 - core[1].svSysDesc(14), plen 0: [desc: I#59=SPI2_DMA] -EVENT[116]: 0.000729475 - core[0].svSysDesc(14), plen 0: [desc: I#60=SPI3_DMA] -EVENT[117]: 0.000729475 - core[1].svSysDesc(14), plen 0: [desc: I#60=SPI3_DMA] -EVENT[118]: 0.000740300 - core[0].svSysDesc(14), plen 0: [desc: I#61=WDT] -EVENT[119]: 0.000740300 - core[1].svSysDesc(14), plen 0: [desc: I#61=WDT] -EVENT[120]: 0.000760650 - core[0].svSysDesc(14), plen 0: [desc: I#62=TIMER1] -EVENT[121]: 0.000760650 - core[1].svSysDesc(14), plen 0: [desc: I#62=TIMER1] -EVENT[122]: 0.000772200 - core[0].svSysDesc(14), plen 0: [desc: I#63=TIMER2] -EVENT[123]: 0.000772200 - core[1].svSysDesc(14), plen 0: [desc: I#63=TIMER2] -EVENT[124]: 0.000785150 - core[0].svSysDesc(14), plen 0: [desc: I#64=TG0_T0_EDGE] -EVENT[125]: 0.000785150 - core[1].svSysDesc(14), plen 0: [desc: I#64=TG0_T0_EDGE] -EVENT[126]: 0.000805850 - core[0].svSysDesc(14), plen 0: [desc: I#65=TG0_T1_EDGE] -EVENT[127]: 0.000805850 - core[1].svSysDesc(14), plen 0: [desc: I#65=TG0_T1_EDGE] -EVENT[128]: 0.000818750 - core[0].svSysDesc(14), plen 0: [desc: I#66=TG0_WDT_EDGE] -EVENT[129]: 0.000818750 - core[1].svSysDesc(14), plen 0: [desc: I#66=TG0_WDT_EDGE] -EVENT[130]: 0.000836050 - core[0].svSysDesc(14), plen 0: [desc: I#67=TG0_LACT_EDGE] -EVENT[131]: 0.000836050 - core[1].svSysDesc(14), plen 0: [desc: I#67=TG0_LACT_EDGE] -EVENT[132]: 0.000848850 - core[0].svSysDesc(14), plen 0: [desc: I#68=TG1_T0_EDGE] -EVENT[133]: 0.000848850 - core[1].svSysDesc(14), plen 0: [desc: I#68=TG1_T0_EDGE] -EVENT[134]: 0.000861475 - core[0].svSysDesc(14), plen 0: [desc: I#69=TG1_T1_EDGE] -EVENT[135]: 0.000861475 - core[1].svSysDesc(14), plen 0: [desc: I#69=TG1_T1_EDGE] -EVENT[136]: 0.000878425 - core[0].svSysDesc(14), plen 0: [desc: I#70=TG1_WDT_EDGE] -EVENT[137]: 0.000878425 - core[1].svSysDesc(14), plen 0: [desc: I#70=TG1_WDT_EDGE] -EVENT[138]: 0.000891925 - core[0].svSysDesc(14), plen 0: [desc: I#71=TG1_LACT_EDGE] -EVENT[139]: 0.000891925 - core[1].svSysDesc(14), plen 0: [desc: I#71=TG1_LACT_EDGE] -EVENT[140]: 0.000907825 - core[0].svSysDesc(14), plen 0: [desc: I#72=MMU_IA] -EVENT[141]: 0.000907825 - core[1].svSysDesc(14), plen 0: [desc: I#72=MMU_IA] -EVENT[142]: 0.000923300 - core[0].svSysDesc(14), plen 0: [desc: I#73=MPU_IA] -EVENT[143]: 0.000923300 - core[1].svSysDesc(14), plen 0: [desc: I#73=MPU_IA] -EVENT[144]: 0.000935450 - core[0].svSysDesc(14), plen 0: [desc: I#74=CACHE_IA] -EVENT[145]: 0.000935450 - core[1].svSysDesc(14), plen 0: [desc: I#74=CACHE_IA] -EVENT[146]: 0.000944000 - core[0].svSysTimeUs(13), plen 0: [time: 10000] -EVENT[147]: 0.000944000 - core[1].svSysTimeUs(13), plen 0: [time: 10000] -EVENT[148]: 0.001056000 - core[0].svTaskInfo(9), plen 0: [tid: 12253204, prio: 24, name: ipc0] -EVENT[149]: 0.001056000 - core[1].svTaskInfo(9), plen 0: [tid: 12253204, prio: 24, name: ipc0] -EVENT[150]: 0.001061525 - core[0].svStackInfo(21), plen 0: [tid: 12253204, base: 1073410064, sz: 1344, unused: 0] -EVENT[151]: 0.001061525 - core[1].svStackInfo(21), plen 0: [tid: 12253204, base: 1073410064, sz: 1344, unused: 0] -EVENT[152]: 0.001170650 - core[0].svTaskInfo(9), plen 0: [tid: 12253560, prio: 24, name: ipc1] -EVENT[153]: 0.001170650 - core[1].svTaskInfo(9), plen 0: [tid: 12253560, prio: 24, name: ipc1] -EVENT[154]: 0.001175900 - core[0].svStackInfo(21), plen 0: [tid: 12253560, base: 1073431024, sz: 1344, unused: 0] -EVENT[155]: 0.001175900 - core[1].svStackInfo(21), plen 0: [tid: 12253560, base: 1073431024, sz: 1344, unused: 0] -EVENT[156]: 0.001327475 - core[0].svTaskInfo(9), plen 0: [tid: 12254080, prio: 1, name: main] -EVENT[157]: 0.001327475 - core[1].svTaskInfo(9), plen 0: [tid: 12254080, prio: 1, name: main] -EVENT[158]: 0.001332900 - core[0].svStackInfo(21), plen 0: [tid: 12254080, base: 1073433076, sz: 1916, unused: 0] -EVENT[159]: 0.001332900 - core[1].svStackInfo(21), plen 0: [tid: 12254080, base: 1073433076, sz: 1916, unused: 0] -EVENT[160]: 0.001340650 - core[0].svNumModules(27), plen 1: [mod_cnt: 0] -EVENT[161]: 0.001340650 - core[1].svNumModules(27), plen 1: [mod_cnt: 0] -EVENT[162]: 0.001348325 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[163]: 0.001359700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[164]: 0.001370975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[165]: 0.001381825 - core[0].svTaskStartReady(6), plen 0: [tid: 12254080] -EVENT[166]: 0.001381825 - core[1].svTaskStartReady(6), plen 0: [tid: 12254080] -EVENT[167]: 0.001396900 - core[0].svIsrExit(3), plen 0: [] -EVENT[168]: 0.001407700 - core[1].svIdle(17), plen 0: [] -EVENT[169]: 0.001419225 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[170]: 0.001430725 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[171]: 0.001447075 - core[0].svTaskStartExec(4), plen 0: [tid: 12254080] -EVENT[172]: 0.001473950 - core[0].svModuleDesc(22), plen 0: [mod_id: 0, evt_off: 512, desc: M=ESP32 SystemView Heap Tracing Module] -EVENT[173]: 0.001473950 - core[1].svModuleDesc(22), plen 0: [mod_id: 0, evt_off: 512, desc: M=ESP32 SystemView Heap Tracing Module] -EVENT[174]: 0.001529550 - core[0].esp_sysview_heap_trace_alloc(512), plen 40: [addr: 1073443032, size: 8, callers: [1074274287, 1074274340, 1074325096, 1074621423, 1074686267, 1074302356, 0, 0, 0, 0]] -[0.001529550] HEAP: Allocated 8 bytes @ 0x3ffb70d8 from task "main" on core 0 by: +EVENT[72]: 0.000455975 - core[0].svSysDesc(14), plen 0: [desc: I#38=I2S0] +EVENT[73]: 0.000455975 - core[1].svSysDesc(14), plen 0: [desc: I#38=I2S0] +EVENT[74]: 0.000471025 - core[0].svSysDesc(14), plen 0: [desc: I#39=I2S1] +EVENT[75]: 0.000471025 - core[1].svSysDesc(14), plen 0: [desc: I#39=I2S1] +EVENT[76]: 0.000482575 - core[0].svSysDesc(14), plen 0: [desc: I#40=UART0] +EVENT[77]: 0.000482575 - core[1].svSysDesc(14), plen 0: [desc: I#40=UART0] +EVENT[78]: 0.000493675 - core[0].svSysDesc(14), plen 0: [desc: I#41=UART1] +EVENT[79]: 0.000493675 - core[1].svSysDesc(14), plen 0: [desc: I#41=UART1] +EVENT[80]: 0.000509025 - core[0].svSysDesc(14), plen 0: [desc: I#42=UART2] +EVENT[81]: 0.000509025 - core[1].svSysDesc(14), plen 0: [desc: I#42=UART2] +EVENT[82]: 0.000525125 - core[0].svSysDesc(14), plen 0: [desc: I#43=SDIO_HOST] +EVENT[83]: 0.000525125 - core[1].svSysDesc(14), plen 0: [desc: I#43=SDIO_HOST] +EVENT[84]: 0.000536650 - core[0].svSysDesc(14), plen 0: [desc: I#44=ETH_MAC] +EVENT[85]: 0.000536650 - core[1].svSysDesc(14), plen 0: [desc: I#44=ETH_MAC] +EVENT[86]: 0.000552750 - core[0].svSysDesc(14), plen 0: [desc: I#45=PWM0] +EVENT[87]: 0.000552750 - core[1].svSysDesc(14), plen 0: [desc: I#45=PWM0] +EVENT[88]: 0.000567600 - core[0].svSysDesc(14), plen 0: [desc: I#46=PWM1] +EVENT[89]: 0.000567600 - core[1].svSysDesc(14), plen 0: [desc: I#46=PWM1] +EVENT[90]: 0.000579950 - core[0].svSysDesc(14), plen 0: [desc: I#47=RESERVED] +EVENT[91]: 0.000579950 - core[1].svSysDesc(14), plen 0: [desc: I#47=RESERVED] +EVENT[92]: 0.000592100 - core[0].svSysDesc(14), plen 0: [desc: I#48=RESERVED] +EVENT[93]: 0.000592100 - core[1].svSysDesc(14), plen 0: [desc: I#48=RESERVED] +EVENT[94]: 0.000603425 - core[0].svSysDesc(14), plen 0: [desc: I#49=LEDC] +EVENT[95]: 0.000603425 - core[1].svSysDesc(14), plen 0: [desc: I#49=LEDC] +EVENT[96]: 0.000622525 - core[0].svSysDesc(14), plen 0: [desc: I#50=EFUSE] +EVENT[97]: 0.000622525 - core[1].svSysDesc(14), plen 0: [desc: I#50=EFUSE] +EVENT[98]: 0.000633950 - core[0].svSysDesc(14), plen 0: [desc: I#51=TWAI] +EVENT[99]: 0.000633950 - core[1].svSysDesc(14), plen 0: [desc: I#51=TWAI] +EVENT[100]: 0.000650200 - core[0].svSysDesc(14), plen 0: [desc: I#52=RTC_CORE] +EVENT[101]: 0.000650200 - core[1].svSysDesc(14), plen 0: [desc: I#52=RTC_CORE] +EVENT[102]: 0.000661100 - core[0].svSysDesc(14), plen 0: [desc: I#53=RMT] +EVENT[103]: 0.000661100 - core[1].svSysDesc(14), plen 0: [desc: I#53=RMT] +EVENT[104]: 0.000672100 - core[0].svSysDesc(14), plen 0: [desc: I#54=PCNT] +EVENT[105]: 0.000672100 - core[1].svSysDesc(14), plen 0: [desc: I#54=PCNT] +EVENT[106]: 0.000688050 - core[0].svSysDesc(14), plen 0: [desc: I#55=I2C_EXT0] +EVENT[107]: 0.000688050 - core[1].svSysDesc(14), plen 0: [desc: I#55=I2C_EXT0] +EVENT[108]: 0.000700025 - core[0].svSysDesc(14), plen 0: [desc: I#56=I2C_EXT1] +EVENT[109]: 0.000700025 - core[1].svSysDesc(14), plen 0: [desc: I#56=I2C_EXT1] +EVENT[110]: 0.000710825 - core[0].svSysDesc(14), plen 0: [desc: I#57=RSA] +EVENT[111]: 0.000710825 - core[1].svSysDesc(14), plen 0: [desc: I#57=RSA] +EVENT[112]: 0.000726900 - core[0].svSysDesc(14), plen 0: [desc: I#58=SPI1_DMA] +EVENT[113]: 0.000726900 - core[1].svSysDesc(14), plen 0: [desc: I#58=SPI1_DMA] +EVENT[114]: 0.000743075 - core[0].svSysDesc(14), plen 0: [desc: I#59=SPI2_DMA] +EVENT[115]: 0.000743075 - core[1].svSysDesc(14), plen 0: [desc: I#59=SPI2_DMA] +EVENT[116]: 0.000755050 - core[0].svSysDesc(14), plen 0: [desc: I#60=SPI3_DMA] +EVENT[117]: 0.000755050 - core[1].svSysDesc(14), plen 0: [desc: I#60=SPI3_DMA] +EVENT[118]: 0.000765950 - core[0].svSysDesc(14), plen 0: [desc: I#61=WDT] +EVENT[119]: 0.000765950 - core[1].svSysDesc(14), plen 0: [desc: I#61=WDT] +EVENT[120]: 0.000786350 - core[0].svSysDesc(14), plen 0: [desc: I#62=TIMER1] +EVENT[121]: 0.000786350 - core[1].svSysDesc(14), plen 0: [desc: I#62=TIMER1] +EVENT[122]: 0.000797875 - core[0].svSysDesc(14), plen 0: [desc: I#63=TIMER2] +EVENT[123]: 0.000797875 - core[1].svSysDesc(14), plen 0: [desc: I#63=TIMER2] +EVENT[124]: 0.000810900 - core[0].svSysDesc(14), plen 0: [desc: I#64=TG0_T0_EDGE] +EVENT[125]: 0.000810900 - core[1].svSysDesc(14), plen 0: [desc: I#64=TG0_T0_EDGE] +EVENT[126]: 0.000827775 - core[0].svSysDesc(14), plen 0: [desc: I#65=TG0_T1_EDGE] +EVENT[127]: 0.000827775 - core[1].svSysDesc(14), plen 0: [desc: I#65=TG0_T1_EDGE] +EVENT[128]: 0.000844550 - core[0].svSysDesc(14), plen 0: [desc: I#66=TG0_WDT_EDGE] +EVENT[129]: 0.000844550 - core[1].svSysDesc(14), plen 0: [desc: I#66=TG0_WDT_EDGE] +EVENT[130]: 0.000861800 - core[0].svSysDesc(14), plen 0: [desc: I#67=TG0_LACT_EDGE] +EVENT[131]: 0.000861800 - core[1].svSysDesc(14), plen 0: [desc: I#67=TG0_LACT_EDGE] +EVENT[132]: 0.000874625 - core[0].svSysDesc(14), plen 0: [desc: I#68=TG1_T0_EDGE] +EVENT[133]: 0.000874625 - core[1].svSysDesc(14), plen 0: [desc: I#68=TG1_T0_EDGE] +EVENT[134]: 0.000887300 - core[0].svSysDesc(14), plen 0: [desc: I#69=TG1_T1_EDGE] +EVENT[135]: 0.000887300 - core[1].svSysDesc(14), plen 0: [desc: I#69=TG1_T1_EDGE] +EVENT[136]: 0.000904250 - core[0].svSysDesc(14), plen 0: [desc: I#70=TG1_WDT_EDGE] +EVENT[137]: 0.000904250 - core[1].svSysDesc(14), plen 0: [desc: I#70=TG1_WDT_EDGE] +EVENT[138]: 0.000917900 - core[0].svSysDesc(14), plen 0: [desc: I#71=TG1_LACT_EDGE] +EVENT[139]: 0.000917900 - core[1].svSysDesc(14), plen 0: [desc: I#71=TG1_LACT_EDGE] +EVENT[140]: 0.000933200 - core[0].svSysDesc(14), plen 0: [desc: I#72=MMU_IA] +EVENT[141]: 0.000933200 - core[1].svSysDesc(14), plen 0: [desc: I#72=MMU_IA] +EVENT[142]: 0.000944575 - core[0].svSysDesc(14), plen 0: [desc: I#73=MPU_IA] +EVENT[143]: 0.000944575 - core[1].svSysDesc(14), plen 0: [desc: I#73=MPU_IA] +EVENT[144]: 0.000961050 - core[0].svSysDesc(14), plen 0: [desc: I#74=CACHE_IA] +EVENT[145]: 0.000961050 - core[1].svSysDesc(14), plen 0: [desc: I#74=CACHE_IA] +EVENT[146]: 0.000971475 - core[0].svSysTimeCycles(12), plen 0: [cycles: 2890156] +EVENT[147]: 0.000971475 - core[1].svSysTimeCycles(12), plen 0: [cycles: 2890156] +EVENT[148]: 0.001084025 - core[0].svTaskInfo(9), plen 0: [tid: 12252316, prio: 24, name: ipc0] +EVENT[149]: 0.001084025 - core[1].svTaskInfo(9), plen 0: [tid: 12252316, prio: 24, name: ipc0] +EVENT[150]: 0.001089250 - core[0].svStackInfo(21), plen 0: [tid: 12252316, base: 1073409176, sz: 1352, unused: 0] +EVENT[151]: 0.001089250 - core[1].svStackInfo(21), plen 0: [tid: 12252316, base: 1073409176, sz: 1352, unused: 0] +EVENT[152]: 0.001194900 - core[0].svTaskInfo(9), plen 0: [tid: 12254724, prio: 24, name: ipc1] +EVENT[153]: 0.001194900 - core[1].svTaskInfo(9), plen 0: [tid: 12254724, prio: 24, name: ipc1] +EVENT[154]: 0.001200350 - core[0].svStackInfo(21), plen 0: [tid: 12254724, base: 1073411584, sz: 1344, unused: 0] +EVENT[155]: 0.001200350 - core[1].svStackInfo(21), plen 0: [tid: 12254724, base: 1073411584, sz: 1344, unused: 0] +EVENT[156]: 0.001388300 - core[0].svTaskInfo(9), plen 0: [tid: 12274964, prio: 1, name: main] +EVENT[157]: 0.001388300 - core[1].svTaskInfo(9), plen 0: [tid: 12274964, prio: 1, name: main] +EVENT[158]: 0.001393525 - core[0].svStackInfo(21), plen 0: [tid: 12274964, base: 1073429776, sz: 2400, unused: 0] +EVENT[159]: 0.001393525 - core[1].svStackInfo(21), plen 0: [tid: 12274964, base: 1073429776, sz: 2400, unused: 0] +EVENT[160]: 0.001400850 - core[0].svNumModules(27), plen 1: [mod_cnt: 0] +EVENT[161]: 0.001400850 - core[1].svNumModules(27), plen 1: [mod_cnt: 0] +EVENT[162]: 0.001407600 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[163]: 0.001419325 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[164]: 0.001430350 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[165]: 0.001441425 - core[0].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[166]: 0.001441425 - core[1].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[167]: 0.001452425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[168]: 0.001463550 - core[0].svIsrExit(3), plen 0: [] +EVENT[169]: 0.001474825 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[170]: 0.001485875 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[171]: 0.001496375 - core[1].svIdle(17), plen 0: [] +EVENT[172]: 0.001507250 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[173]: 0.001523850 - core[0].svTaskStartExec(4), plen 0: [tid: 12274964] +EVENT[174]: 0.001550575 - core[0].svModuleDesc(22), plen 0: [mod_id: 0, evt_off: 512, desc: M=ESP32 SystemView Heap Tracing Module] +EVENT[175]: 0.001550575 - core[1].svModuleDesc(22), plen 0: [mod_id: 0, evt_off: 512, desc: M=ESP32 SystemView Heap Tracing Module] +EVENT[176]: 0.001564275 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[177]: 0.001579775 - core[0].svIsrExit(3), plen 0: [] +EVENT[178]: 0.001637325 - core[0].esp_sysview_heap_trace_alloc(512), plen 40: [addr: 1073440928, size: 8, callers: [1074274047, 1074274100, 1074321944, 1074609327, 1074673816, 1074299100, 0, 0, 0, 0]] +[0.001637325] HEAP: Allocated 8 bytes @ 0x3ffb68a0 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:87 -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[175]: 0.001669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[176]: 0.001682850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[177]: 0.001699500 - core[1].svIdle(17), plen 0: [] -EVENT[178]: 0.001812950 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[179]: 0.001828450 - core[0].svIsrExit(3), plen 0: [] -EVENT[180]: 0.001864250 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073443048, size: 2500, callers: [1074274287, 1074304020, 1074311940, 1074621496, 1074686267, 1074302356, 0, 0, 0, 0]] -[0.001864250] HEAP: Allocated 2500 bytes @ 0x3ffb70e8 from task "main" on core 0 by: +EVENT[179]: 0.001939050 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073440944, size: 2500, callers: [1074274047, 1074300704, 1074308624, 1074609400, 1074673816, 1074299100, 0, 0, 0, 0]] +[0.001939050] HEAP: Allocated 2500 bytes @ 0x3ffb68b0 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[181]: 0.001904100 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073445612, size: 340, callers: [1074274287, 1074304020, 1074311951, 1074621496, 1074686267, 1074302356, 0, 0, 0, 0]] -[0.001904100] HEAP: Allocated 340 bytes @ 0x3ffb7aec from task "main" on core 0 by: +EVENT[180]: 0.001979950 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073443508, size: 340, callers: [1074274047, 1074300704, 1074308635, 1074609400, 1074673816, 1074299100, 0, 0, 0, 0]] +[0.001979950] HEAP: Allocated 340 bytes @ 0x3ffb72b4 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[182]: 0.001926775 - core[0].svTaskCreate(8), plen 0: [tid: 12286700] -EVENT[183]: 0.001939400 - core[0].svTaskInfo(9), plen 0: [tid: 12286700, prio: 5, name: alloc0] -EVENT[184]: 0.001939400 - core[1].svTaskInfo(9), plen 0: [tid: 12286700, prio: 5, name: alloc0] -EVENT[185]: 0.001948500 - core[0].svStackInfo(21), plen 0: [tid: 12286700, base: 1073443048, sz: 4294965096, unused: 0] -EVENT[186]: 0.001948500 - core[1].svStackInfo(21), plen 0: [tid: 12286700, base: 1073443048, sz: 4294965096, unused: 0] -EVENT[187]: 0.001959200 - core[0].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[188]: 0.001959200 - core[1].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[189]: 0.001974775 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[190]: 0.001986150 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[191]: 0.002002500 - core[0].svTaskStartExec(4), plen 0: [tid: 12286700] -EVENT[192]: 0.002037875 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073445968, size: 124, callers: [1074274287, 1074304020, 1074300537, 1074621092, 1074302356, 0, 0, 0, 0, 0]] -[0.002037875] HEAP: Allocated 124 bytes @ 0x3ffb7c50 from task "alloc0" on core 0 by: +EVENT[181]: 0.002010625 - core[0].svTaskCreate(8), plen 0: [tid: 12284596] +EVENT[182]: 0.002023275 - core[0].svTaskInfo(9), plen 0: [tid: 12284596, prio: 5, name: alloc0] +EVENT[183]: 0.002023275 - core[1].svTaskInfo(9), plen 0: [tid: 12284596, prio: 5, name: alloc0] +EVENT[184]: 0.002032525 - core[0].svStackInfo(21), plen 0: [tid: 12284596, base: 1073440944, sz: 4294965088, unused: 0] +EVENT[185]: 0.002032525 - core[1].svStackInfo(21), plen 0: [tid: 12284596, base: 1073440944, sz: 4294965088, unused: 0] +EVENT[186]: 0.002043250 - core[0].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[187]: 0.002043250 - core[1].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[188]: 0.002058825 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[189]: 0.002070175 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[190]: 0.002086525 - core[0].svTaskStartExec(4), plen 0: [tid: 12284596] +EVENT[191]: 0.002130925 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073443864, size: 124, callers: [1074274047, 1074300704, 1074297281, 1074608996, 1074299100, 0, 0, 0, 0, 0]] +[0.002130925] HEAP: Allocated 124 bytes @ 0x3ffb7418 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/queue.c:545 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:48 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[193]: 0.002052175 - core[0].xQueueGenericCreate(47), plen 3: [uxQueueLength: 10, uxItemSize: 4, ucQueueType: 0] -EVENT[194]: 0.002107400 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073446096, size: 2500, callers: [1074274287, 1074304020, 1074311940, 1074621152, 1074302356, 0, 0, 0, 0, 0]] -[0.002107400] HEAP: Allocated 2500 bytes @ 0x3ffb7cd0 from task "alloc0" on core 0 by: +EVENT[192]: 0.002145225 - core[0].xQueueGenericCreate(47), plen 3: [uxQueueLength: 10, uxItemSize: 4, ucQueueType: 0] +EVENT[193]: 0.002205450 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073443992, size: 2500, callers: [1074274047, 1074300704, 1074308624, 1074609056, 1074299100, 0, 0, 0, 0, 0]] +[0.002205450] HEAP: Allocated 2500 bytes @ 0x3ffb7498 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[195]: 0.002141800 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073448660, size: 340, callers: [1074274287, 1074304020, 1074311951, 1074621152, 1074302356, 0, 0, 0, 0, 0]] -[0.002141800] HEAP: Allocated 340 bytes @ 0x3ffb86d4 from task "alloc0" on core 0 by: +EVENT[194]: 0.002240900 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073446556, size: 340, callers: [1074274047, 1074300704, 1074308635, 1074609056, 1074299100, 0, 0, 0, 0, 0]] +[0.002240900] HEAP: Allocated 340 bytes @ 0x3ffb7e9c from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[196]: 0.002168500 - core[0].svTaskCreate(8), plen 0: [tid: 12289748] -EVENT[197]: 0.002181000 - core[0].svTaskInfo(9), plen 0: [tid: 12289748, prio: 5, name: free0] -EVENT[198]: 0.002181000 - core[1].svTaskInfo(9), plen 0: [tid: 12289748, prio: 5, name: free0] -EVENT[199]: 0.002190150 - core[0].svStackInfo(21), plen 0: [tid: 12289748, base: 1073446096, sz: 4294965088, unused: 0] -EVENT[200]: 0.002190150 - core[1].svStackInfo(21), plen 0: [tid: 12289748, base: 1073446096, sz: 4294965088, unused: 0] -EVENT[201]: 0.002200975 - core[0].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[202]: 0.002200975 - core[1].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[203]: 0.002216350 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[204]: 0.002229250 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[205]: 0.002245650 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073449016, size: 1, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.002245650] HEAP: Allocated 1 bytes @ 0x3ffb8838 from task "alloc0" on core 0 by: +EVENT[195]: 0.002267725 - core[0].svTaskCreate(8), plen 0: [tid: 12287644] +EVENT[196]: 0.002280250 - core[0].svTaskInfo(9), plen 0: [tid: 12287644, prio: 5, name: free0] +EVENT[197]: 0.002280250 - core[1].svTaskInfo(9), plen 0: [tid: 12287644, prio: 5, name: free0] +EVENT[198]: 0.002289425 - core[0].svStackInfo(21), plen 0: [tid: 12287644, base: 1073443992, sz: 4294965096, unused: 0] +EVENT[199]: 0.002289425 - core[1].svStackInfo(21), plen 0: [tid: 12287644, base: 1073443992, sz: 4294965096, unused: 0] +EVENT[200]: 0.002300275 - core[0].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[201]: 0.002300275 - core[1].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[202]: 0.002315625 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[203]: 0.002328675 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[204]: 0.002345850 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073446912, size: 1, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.002345850] HEAP: Allocated 1 bytes @ 0x3ffb8000 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[206]: 0.002256950 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[207]: 0.002286975 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[208]: 0.002297900 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073449032, size: 2, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.002297900] HEAP: Allocated 2 bytes @ 0x3ffb8848 from task "alloc0" on core 0 by: +EVENT[205]: 0.002358000 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[206]: 0.002387975 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[207]: 0.002399325 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073446928, size: 2, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.002399325] HEAP: Allocated 2 bytes @ 0x3ffb8010 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[209]: 0.002308975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[210]: 0.002321625 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[211]: 0.002332075 - core[1].svIdle(17), plen 0: [] -EVENT[212]: 0.002366250 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[213]: 0.002605525 - core[0].svPrint(26), plen 69: [msg: I (310) example: Task[0x3ffb7aec]: allocated 2 bytes @ 0x3ffb8848 +EVENT[208]: 0.002410900 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[209]: 0.002423150 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[210]: 0.002440625 - core[1].svIdle(17), plen 0: [] +EVENT[211]: 0.002456600 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[212]: 0.002470175 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[213]: 0.002481550 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[214]: 0.002492700 - core[1].svIdle(17), plen 0: [] +EVENT[215]: 0.002742275 - core[0].svPrint(26), plen 69: [msg: I (297) example: Task[0x3ffb72b4]: allocated 2 bytes @ 0x3ffb8010 , lvl: 0, unused: 0] -[0.002605525] LOG: I (310) example: Task[0x3ffb7aec]: allocated 2 bytes @ 0x3ffb8848 -EVENT[214]: 0.002627100 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12287056, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[215]: 0.002640225 - core[0].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[216]: 0.002640225 - core[1].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[217]: 0.002656425 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[218]: 0.002667300 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[219]: 0.002678075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[220]: 0.002692250 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[221]: 0.002703000 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[222]: 0.002713925 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[223]: 0.002725475 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[224]: 0.002735950 - core[0].svTaskStartExec(4), plen 0: [tid: 12254080] -EVENT[225]: 0.002753450 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[226]: 0.002770250 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12287056, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[227]: 0.002782075 - core[0].esp_sysview_heap_trace_alloc(512), plen 40: [addr: 1073449048, size: 8, callers: [1074274287, 1074274340, 1074325096, 1074621423, 1074686267, 1074302356, 0, 0, 0, 0]] -[0.002782075] HEAP: Allocated 8 bytes @ 0x3ffb8858 from task "main" on core 0 by: +[0.002742275] LOG: I (297) example: Task[0x3ffb72b4]: allocated 2 bytes @ 0x3ffb8010 +EVENT[216]: 0.002759000 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[217]: 0.002774375 - core[0].svIsrExit(3), plen 0: [] +EVENT[218]: 0.002788425 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12284952, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[219]: 0.002801625 - core[0].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[220]: 0.002801625 - core[1].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[221]: 0.002817875 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[222]: 0.002828825 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[223]: 0.002839525 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[224]: 0.002853300 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[225]: 0.002864225 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[226]: 0.002875075 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[227]: 0.002887100 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12284952, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[228]: 0.002897825 - core[0].svTaskStartExec(4), plen 0: [tid: 12274964] +EVENT[229]: 0.002937850 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[230]: 0.002949925 - core[0].esp_sysview_heap_trace_alloc(512), plen 40: [addr: 1073446944, size: 8, callers: [1074274047, 1074274100, 1074321944, 1074609327, 1074673816, 1074299100, 0, 0, 0, 0]] +[0.002949925] HEAP: Allocated 8 bytes @ 0x3ffb8020 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:87 -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[228]: 0.002813350 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[229]: 0.002824975 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[230]: 0.002835950 - core[0].svIsrExit(3), plen 0: [] -EVENT[231]: 0.002860725 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073449064, size: 2500, callers: [1074274287, 1074304020, 1074311940, 1074621496, 1074686267, 1074302356, 0, 0, 0, 0]] -[0.002860725] HEAP: Allocated 2500 bytes @ 0x3ffb8868 from task "main" on core 0 by: +EVENT[231]: 0.002992925 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[232]: 0.003004025 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073446960, size: 2500, callers: [1074274047, 1074300704, 1074308624, 1074609400, 1074673816, 1074299100, 0, 0, 0, 0]] +[0.003004025] HEAP: Allocated 2500 bytes @ 0x3ffb8030 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[232]: 0.002875775 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[233]: 0.002902375 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073451628, size: 340, callers: [1074274287, 1074304020, 1074311951, 1074621496, 1074686267, 1074302356, 0, 0, 0, 0]] -[0.002902375] HEAP: Allocated 340 bytes @ 0x3ffb926c from task "main" on core 0 by: +EVENT[233]: 0.003044650 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073449524, size: 340, callers: [1074274047, 1074300704, 1074308635, 1074609400, 1074673816, 1074299100, 0, 0, 0, 0]] +[0.003044650] HEAP: Allocated 340 bytes @ 0x3ffb8a34 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[234]: 0.002925000 - core[0].svTaskCreate(8), plen 0: [tid: 12292716] -EVENT[235]: 0.002937650 - core[0].svTaskInfo(9), plen 0: [tid: 12292716, prio: 5, name: alloc1] -EVENT[236]: 0.002937650 - core[1].svTaskInfo(9), plen 0: [tid: 12292716, prio: 5, name: alloc1] -EVENT[237]: 0.002946800 - core[0].svStackInfo(21), plen 0: [tid: 12292716, base: 1073449064, sz: 4294965096, unused: 0] -EVENT[238]: 0.002946800 - core[1].svStackInfo(21), plen 0: [tid: 12292716, base: 1073449064, sz: 4294965096, unused: 0] -EVENT[239]: 0.002957675 - core[0].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[240]: 0.002957675 - core[1].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[241]: 0.002973300 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[242]: 0.002984800 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[243]: 0.003001650 - core[0].svTaskStartExec(4), plen 0: [tid: 12292716] -EVENT[244]: 0.003037100 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073451984, size: 124, callers: [1074274287, 1074304020, 1074300537, 1074621092, 1074302356, 0, 0, 0, 0, 0]] -[0.003037100] HEAP: Allocated 124 bytes @ 0x3ffb93d0 from task "alloc1" on core 0 by: +EVENT[234]: 0.003067500 - core[0].svTaskCreate(8), plen 0: [tid: 12290612] +EVENT[235]: 0.003080150 - core[0].svTaskInfo(9), plen 0: [tid: 12290612, prio: 5, name: alloc1] +EVENT[236]: 0.003080150 - core[1].svTaskInfo(9), plen 0: [tid: 12290612, prio: 5, name: alloc1] +EVENT[237]: 0.003089275 - core[0].svStackInfo(21), plen 0: [tid: 12290612, base: 1073446960, sz: 4294965088, unused: 0] +EVENT[238]: 0.003089275 - core[1].svStackInfo(21), plen 0: [tid: 12290612, base: 1073446960, sz: 4294965088, unused: 0] +EVENT[239]: 0.003100000 - core[0].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[240]: 0.003100000 - core[1].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[241]: 0.003115575 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[242]: 0.003126925 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[243]: 0.003143300 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[244]: 0.003179725 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073449880, size: 124, callers: [1074274047, 1074300704, 1074297281, 1074608996, 1074299100, 0, 0, 0, 0, 0]] +[0.003179725] HEAP: Allocated 124 bytes @ 0x3ffb8b98 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/queue.c:545 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:48 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[245]: 0.003051375 - core[0].xQueueGenericCreate(47), plen 3: [uxQueueLength: 10, uxItemSize: 4, ucQueueType: 0] -EVENT[246]: 0.003090750 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073452112, size: 2500, callers: [1074274287, 1074304020, 1074311940, 1074621152, 1074302356, 0, 0, 0, 0, 0]] -[0.003090750] HEAP: Allocated 2500 bytes @ 0x3ffb9450 from task "alloc1" on core 0 by: +EVENT[245]: 0.003194025 - core[0].xQueueGenericCreate(47), plen 3: [uxQueueLength: 10, uxItemSize: 4, ucQueueType: 0] +EVENT[246]: 0.003234475 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073450008, size: 2500, callers: [1074274047, 1074300704, 1074308624, 1074609056, 1074299100, 0, 0, 0, 0, 0]] +[0.003234475] HEAP: Allocated 2500 bytes @ 0x3ffb8c18 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[247]: 0.003125150 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073454676, size: 340, callers: [1074274287, 1074304020, 1074311951, 1074621152, 1074302356, 0, 0, 0, 0, 0]] -[0.003125150] HEAP: Allocated 340 bytes @ 0x3ffb9e54 from task "alloc1" on core 0 by: +EVENT[247]: 0.003269925 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073452572, size: 340, callers: [1074274047, 1074300704, 1074308635, 1074609056, 1074299100, 0, 0, 0, 0, 0]] +[0.003269925] HEAP: Allocated 340 bytes @ 0x3ffb961c from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[248]: 0.003151900 - core[0].svTaskCreate(8), plen 0: [tid: 12295764] -EVENT[249]: 0.003164400 - core[0].svTaskInfo(9), plen 0: [tid: 12295764, prio: 5, name: free1] -EVENT[250]: 0.003164400 - core[1].svTaskInfo(9), plen 0: [tid: 12295764, prio: 5, name: free1] -EVENT[251]: 0.003173550 - core[0].svStackInfo(21), plen 0: [tid: 12295764, base: 1073452112, sz: 4294965088, unused: 0] -EVENT[252]: 0.003173550 - core[1].svStackInfo(21), plen 0: [tid: 12295764, base: 1073452112, sz: 4294965088, unused: 0] -EVENT[253]: 0.003184375 - core[0].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[254]: 0.003184375 - core[1].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[255]: 0.003220600 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073455032, size: 2, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.003220600] HEAP: Allocated 2 bytes @ 0x3ffb9fb8 from task "alloc1" on core 0 by: +EVENT[248]: 0.003296650 - core[0].svTaskCreate(8), plen 0: [tid: 12293660] +EVENT[249]: 0.003309150 - core[0].svTaskInfo(9), plen 0: [tid: 12293660, prio: 5, name: free1] +EVENT[250]: 0.003309150 - core[1].svTaskInfo(9), plen 0: [tid: 12293660, prio: 5, name: free1] +EVENT[251]: 0.003318350 - core[0].svStackInfo(21), plen 0: [tid: 12293660, base: 1073450008, sz: 4294965096, unused: 0] +EVENT[252]: 0.003318350 - core[1].svStackInfo(21), plen 0: [tid: 12293660, base: 1073450008, sz: 4294965096, unused: 0] +EVENT[253]: 0.003329175 - core[0].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[254]: 0.003329175 - core[1].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[255]: 0.003366350 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073452928, size: 2, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.003366350] HEAP: Allocated 2 bytes @ 0x3ffb9780 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[256]: 0.003255050 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073455048, size: 4, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.003255050] HEAP: Allocated 4 bytes @ 0x3ffb9fc8 from task "alloc1" on core 0 by: +EVENT[256]: 0.003401775 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073452944, size: 4, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.003401775] HEAP: Allocated 4 bytes @ 0x3ffb9790 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[257]: 0.003271950 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[258]: 0.003294125 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[259]: 0.003336850 - core[1].svPrint(26), plen 63: [msg: I (310) example: Task[0x3ffb86d4]: free memory @ 0x3ffb8848 +EVENT[257]: 0.003418700 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[258]: 0.003438675 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[259]: 0.003462300 - core[1].svPrint(26), plen 63: [msg: I (298) example: Task[0x3ffb7e9c]: free memory @ 0x3ffb8010 , lvl: 0, unused: 0] -[0.003336850] LOG: I (310) example: Task[0x3ffb86d4]: free memory @ 0x3ffb8848 -EVENT[260]: 0.003357000 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[261]: 0.003368450 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[262]: 0.003385425 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[263]: 0.003404250 - core[0].svPrint(26), plen 69: [msg: I (311) example: Task[0x3ffb926c]: allocated 4 bytes @ 0x3ffb9fc8 +[0.003462300] LOG: I (298) example: Task[0x3ffb7e9c]: free memory @ 0x3ffb8010 +EVENT[260]: 0.003481375 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[261]: 0.003494825 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[262]: 0.003506650 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[263]: 0.003526375 - core[0].svPrint(26), plen 69: [msg: I (298) example: Task[0x3ffb8a34]: allocated 4 bytes @ 0x3ffb9790 , lvl: 0, unused: 0] -[0.003404250] LOG: I (311) example: Task[0x3ffb926c]: allocated 4 bytes @ 0x3ffb9fc8 -EVENT[264]: 0.003418350 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12293072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[265]: 0.003431500 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073449032, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.003431500] HEAP: Freed bytes @ 0x3ffb8848 from task "free0" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.003526375] LOG: I (298) example: Task[0x3ffb8a34]: allocated 4 bytes @ 0x3ffb9790 +EVENT[264]: 0.003537925 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[265]: 0.003550050 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12290968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[266]: 0.003567875 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[267]: 0.003578850 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[268]: 0.003595750 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[269]: 0.003606975 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073446928, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.003606975] HEAP: Freed bytes @ 0x3ffb8010 from task "free0" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[266]: 0.003443325 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[267]: 0.003462000 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[268]: 0.003475950 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[269]: 0.003490025 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[270]: 0.003501925 - core[0].svTaskStartExec(4), plen 0: [tid: 12254080] -EVENT[271]: 0.003512800 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[272]: 0.003532050 - core[1].svTaskStartExec(4), plen 0: [tid: 12295764] -EVENT[273]: 0.003544375 - core[0].esp_sysview_heap_trace_alloc(512), plen 40: [addr: 1073449032, size: 8, callers: [1074274287, 1074274340, 1074325096, 1074621423, 1074686267, 1074302356, 0, 0, 0, 0]] -[0.003544375] HEAP: Allocated 8 bytes @ 0x3ffb8848 from task "main" on core 0 by: +EVENT[270]: 0.003617975 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[271]: 0.003633200 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[272]: 0.003652900 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[273]: 0.003667050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[274]: 0.003680950 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[275]: 0.003692800 - core[0].svTaskStartExec(4), plen 0: [tid: 12274964] +EVENT[276]: 0.003703850 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[277]: 0.003723175 - core[1].svTaskStartExec(4), plen 0: [tid: 12293660] +EVENT[278]: 0.003736750 - core[0].esp_sysview_heap_trace_alloc(512), plen 40: [addr: 1073446928, size: 8, callers: [1074274047, 1074274100, 1074321944, 1074609327, 1074673816, 1074299100, 0, 0, 0, 0]] +[0.003736750] HEAP: Allocated 8 bytes @ 0x3ffb8010 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:87 -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[274]: 0.003561425 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12293072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[275]: 0.003580100 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[276]: 0.003597875 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073455064, size: 2500, callers: [1074274287, 1074304020, 1074311940, 1074621496, 1074686267, 1074302356, 0, 0, 0, 0]] -[0.003597875] HEAP: Allocated 2500 bytes @ 0x3ffb9fd8 from task "main" on core 0 by: +EVENT[279]: 0.003753800 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12290968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[280]: 0.003772075 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[281]: 0.003791150 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[282]: 0.003802900 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073452960, size: 2500, callers: [1074274047, 1074300704, 1074308624, 1074609400, 1074673816, 1074299100, 0, 0, 0, 0]] +[0.003802900] HEAP: Allocated 2500 bytes @ 0x3ffb97a0 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[277]: 0.003610600 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[278]: 0.003637125 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073457628, size: 340, callers: [1074274287, 1074304020, 1074311951, 1074621496, 1074686267, 1074302356, 0, 0, 0, 0]] -[0.003637125] HEAP: Allocated 340 bytes @ 0x3ffba9dc from task "main" on core 0 by: +EVENT[283]: 0.003844025 - core[1].svPrint(26), plen 63: [msg: I (299) example: Task[0x3ffb961c]: free memory @ 0x3ffb9790 +, lvl: 0, unused: 0] +[0.003844025] LOG: I (299) example: Task[0x3ffb961c]: free memory @ 0x3ffb9790 +EVENT[284]: 0.003855950 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073455524, size: 340, callers: [1074274047, 1074300704, 1074308635, 1074609400, 1074673816, 1074299100, 0, 0, 0, 0]] +[0.003855950] HEAP: Allocated 340 bytes @ 0x3ffba1a4 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[279]: 0.003660625 - core[1].svPrint(26), plen 63: [msg: I (311) example: Task[0x3ffb9e54]: free memory @ 0x3ffb9fc8 -, lvl: 0, unused: 0] -[0.003660625] LOG: I (311) example: Task[0x3ffb9e54]: free memory @ 0x3ffb9fc8 -EVENT[280]: 0.003672000 - core[0].svTaskCreate(8), plen 0: [tid: 12298716] -EVENT[281]: 0.003688200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[282]: 0.003700975 - core[0].svTaskInfo(9), plen 0: [tid: 12298716, prio: 5, name: alloc2] -EVENT[283]: 0.003700975 - core[1].svTaskInfo(9), plen 0: [tid: 12298716, prio: 5, name: alloc2] -EVENT[284]: 0.003711950 - core[0].svStackInfo(21), plen 0: [tid: 12298716, base: 1073455064, sz: 4294965096, unused: 0] -EVENT[285]: 0.003711950 - core[1].svStackInfo(21), plen 0: [tid: 12298716, base: 1073455064, sz: 4294965096, unused: 0] -EVENT[286]: 0.003724850 - core[0].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[287]: 0.003724850 - core[1].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[288]: 0.003742300 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[289]: 0.003753150 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[290]: 0.003765400 - core[1].svTaskStartExec(4), plen 0: [tid: 12295764] -EVENT[291]: 0.003776400 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[292]: 0.003791750 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073455048, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.003791750] HEAP: Freed bytes @ 0x3ffb9fc8 from task "free1" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +EVENT[285]: 0.003869550 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073452944, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.003869550] HEAP: Freed bytes @ 0x3ffb9790 from task "free1" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[293]: 0.003803375 - core[0].svTaskStartExec(4), plen 0: [tid: 12298716] -EVENT[294]: 0.003819875 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[295]: 0.003831475 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[296]: 0.003843175 - core[0].svIsrExit(3), plen 0: [] -EVENT[297]: 0.003853725 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[298]: 0.003875450 - core[1].svIdle(17), plen 0: [] -EVENT[299]: 0.003887725 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073457984, size: 124, callers: [1074274287, 1074304020, 1074300537, 1074621092, 1074302356, 0, 0, 0, 0, 0]] -[0.003887725] HEAP: Allocated 124 bytes @ 0x3ffbab40 from task "alloc2" on core 0 by: +EVENT[286]: 0.003885400 - core[0].svTaskCreate(8), plen 0: [tid: 12296612] +EVENT[287]: 0.003900350 - core[0].svTaskInfo(9), plen 0: [tid: 12296612, prio: 5, name: alloc2] +EVENT[288]: 0.003900350 - core[1].svTaskInfo(9), plen 0: [tid: 12296612, prio: 5, name: alloc2] +EVENT[289]: 0.003911525 - core[0].svStackInfo(21), plen 0: [tid: 12296612, base: 1073452960, sz: 4294965088, unused: 0] +EVENT[290]: 0.003911525 - core[1].svStackInfo(21), plen 0: [tid: 12296612, base: 1073452960, sz: 4294965088, unused: 0] +EVENT[291]: 0.003924550 - core[0].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[292]: 0.003924550 - core[1].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[293]: 0.003943225 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[294]: 0.003957125 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[295]: 0.003970975 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[296]: 0.003981850 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[297]: 0.003992875 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[298]: 0.004014925 - core[1].svIdle(17), plen 0: [] +EVENT[299]: 0.004030875 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073455880, size: 124, callers: [1074274047, 1074300704, 1074297281, 1074608996, 1074299100, 0, 0, 0, 0, 0]] +[0.004030875] HEAP: Allocated 124 bytes @ 0x3ffba308 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/queue.c:545 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:48 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[300]: 0.003902275 - core[0].xQueueGenericCreate(47), plen 3: [uxQueueLength: 10, uxItemSize: 4, ucQueueType: 0] -EVENT[301]: 0.003941625 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073458112, size: 2500, callers: [1074274287, 1074304020, 1074311940, 1074621152, 1074302356, 0, 0, 0, 0, 0]] -[0.003941625] HEAP: Allocated 2500 bytes @ 0x3ffbabc0 from task "alloc2" on core 0 by: +EVENT[300]: 0.004045200 - core[0].xQueueGenericCreate(47), plen 3: [uxQueueLength: 10, uxItemSize: 4, ucQueueType: 0] +EVENT[301]: 0.004085625 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073456008, size: 2500, callers: [1074274047, 1074300704, 1074308624, 1074609056, 1074299100, 0, 0, 0, 0, 0]] +[0.004085625] HEAP: Allocated 2500 bytes @ 0x3ffba388 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[302]: 0.003976025 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073460676, size: 340, callers: [1074274287, 1074304020, 1074311951, 1074621152, 1074302356, 0, 0, 0, 0, 0]] -[0.003976025] HEAP: Allocated 340 bytes @ 0x3ffbb5c4 from task "alloc2" on core 0 by: +EVENT[302]: 0.004121100 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073458572, size: 340, callers: [1074274047, 1074300704, 1074308635, 1074609056, 1074299100, 0, 0, 0, 0, 0]] +[0.004121100] HEAP: Allocated 340 bytes @ 0x3ffbad8c from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[303]: 0.004002000 - core[0].svTaskCreate(8), plen 0: [tid: 12301764] -EVENT[304]: 0.004014625 - core[0].svTaskInfo(9), plen 0: [tid: 12301764, prio: 5, name: free2] -EVENT[305]: 0.004014625 - core[1].svTaskInfo(9), plen 0: [tid: 12301764, prio: 5, name: free2] -EVENT[306]: 0.004023800 - core[0].svStackInfo(21), plen 0: [tid: 12301764, base: 1073458112, sz: 4294965088, unused: 0] -EVENT[307]: 0.004023800 - core[1].svStackInfo(21), plen 0: [tid: 12301764, base: 1073458112, sz: 4294965088, unused: 0] -EVENT[308]: 0.004034600 - core[0].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[309]: 0.004034600 - core[1].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[310]: 0.004050850 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[311]: 0.004063700 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[312]: 0.004075375 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073455048, size: 3, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.004075375] HEAP: Allocated 3 bytes @ 0x3ffb9fc8 from task "alloc2" on core 0 by: +EVENT[303]: 0.004143675 - core[0].svTaskCreate(8), plen 0: [tid: 12299660] +EVENT[304]: 0.004156250 - core[0].svTaskInfo(9), plen 0: [tid: 12299660, prio: 5, name: free2] +EVENT[305]: 0.004156250 - core[1].svTaskInfo(9), plen 0: [tid: 12299660, prio: 5, name: free2] +EVENT[306]: 0.004169425 - core[0].svStackInfo(21), plen 0: [tid: 12299660, base: 1073456008, sz: 4294965096, unused: 0] +EVENT[307]: 0.004169425 - core[1].svStackInfo(21), plen 0: [tid: 12299660, base: 1073456008, sz: 4294965096, unused: 0] +EVENT[308]: 0.004180150 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[309]: 0.004180150 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[310]: 0.004196250 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[311]: 0.004209125 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[312]: 0.004221350 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073452944, size: 3, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.004221350] HEAP: Allocated 3 bytes @ 0x3ffb9790 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[313]: 0.004086825 - core[1].svTaskStartExec(4), plen 0: [tid: 12301764] -EVENT[314]: 0.004113200 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[315]: 0.004124950 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461032, size: 6, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.004124950] HEAP: Allocated 6 bytes @ 0x3ffbb728 from task "alloc2" on core 0 by: +EVENT[313]: 0.004233575 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[314]: 0.004259950 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[315]: 0.004271525 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073458928, size: 6, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.004271525] HEAP: Allocated 6 bytes @ 0x3ffbaef0 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[316]: 0.004136375 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[317]: 0.004148350 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[318]: 0.004158625 - core[1].svIdle(17), plen 0: [] -EVENT[319]: 0.004177025 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[320]: 0.004229325 - core[0].svPrint(26), plen 69: [msg: I (312) example: Task[0x3ffba9dc]: allocated 6 bytes @ 0x3ffbb728 +EVENT[316]: 0.004282925 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[317]: 0.004294950 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[318]: 0.004306150 - core[1].svIdle(17), plen 0: [] +EVENT[319]: 0.004324575 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[320]: 0.004377100 - core[0].svPrint(26), plen 69: [msg: I (299) example: Task[0x3ffba1a4]: allocated 6 bytes @ 0x3ffbaef0 , lvl: 0, unused: 0] -[0.004229325] LOG: I (312) example: Task[0x3ffba9dc]: allocated 6 bytes @ 0x3ffbb728 -EVENT[321]: 0.004246325 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12299072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[322]: 0.004259475 - core[0].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[323]: 0.004259475 - core[1].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[324]: 0.004275750 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[325]: 0.004286600 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[326]: 0.004297375 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[327]: 0.004311250 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[328]: 0.004322050 - core[1].svTaskStartExec(4), plen 0: [tid: 12301764] -EVENT[329]: 0.004332900 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[330]: 0.004344800 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12299072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[331]: 0.004355375 - core[0].svTaskStartExec(4), plen 0: [tid: 12254080] -EVENT[332]: 0.004367550 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[333]: 0.004394600 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[334]: 0.004405450 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[335]: 0.004417125 - core[0].svTaskStartReady(6), plen 0: [tid: 12254080] -EVENT[336]: 0.004417125 - core[1].svTaskStartReady(6), plen 0: [tid: 12254080] -EVENT[337]: 0.004428475 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[338]: 0.004446600 - core[0].svTaskStartExec(4), plen 0: [tid: 12254080] -EVENT[339]: 0.004461050 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[340]: 0.004485000 - core[1].svPrint(26), plen 63: [msg: I (312) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb728 +[0.004377100] LOG: I (299) example: Task[0x3ffba1a4]: allocated 6 bytes @ 0x3ffbaef0 +EVENT[321]: 0.004390575 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12296968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[322]: 0.004403775 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[323]: 0.004403775 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[324]: 0.004424325 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[325]: 0.004435175 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[326]: 0.004445975 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[327]: 0.004460225 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[328]: 0.004471900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[329]: 0.004482925 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[330]: 0.004494925 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[331]: 0.004505375 - core[0].svTaskStartExec(4), plen 0: [tid: 12274964] +EVENT[332]: 0.004522150 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[333]: 0.004534325 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[334]: 0.004546275 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12296968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[335]: 0.004557600 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[336]: 0.004568700 - core[0].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[337]: 0.004568700 - core[1].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[338]: 0.004582350 - core[1].vTaskPriorityInherit(39), plen 5: [pxMutexHolder: 1073433876] +EVENT[339]: 0.004597425 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[340]: 0.004608000 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[341]: 0.004618825 - core[0].svTaskStartExec(4), plen 0: [tid: 12274964] +EVENT[342]: 0.004629700 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[343]: 0.004641000 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[344]: 0.004656550 - core[1].svIdle(17), plen 0: [] +EVENT[345]: 0.004671050 - core[0].xTaskPriorityDisinherit(42), plen 5: [pxMutexHolder: 1073433876] +EVENT[346]: 0.004681725 - core[0].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[347]: 0.004681725 - core[1].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[348]: 0.004695500 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[349]: 0.004695500 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[350]: 0.004711225 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[351]: 0.004722700 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[352]: 0.004739300 - core[0].svPrint(26), plen 34: [msg: I (299) example: Wait notify 0 , lvl: 0, unused: 0] -[0.004485000] LOG: I (312) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb728 -EVENT[341]: 0.004501225 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[342]: 0.004514850 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461032, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.004514850] HEAP: Freed bytes @ 0x3ffbb728 from task "free2" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.004739300] LOG: I (299) example: Wait notify 0 +EVENT[353]: 0.004750500 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[354]: 0.004767725 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[355]: 0.004778650 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[356]: 0.004790975 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[357]: 0.004801725 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[358]: 0.004819425 - core[0].svIdle(17), plen 0: [] +EVENT[359]: 0.004840550 - core[1].svPrint(26), plen 63: [msg: I (299) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaef0 +, lvl: 0, unused: 0] +[0.004840550] LOG: I (299) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaef0 +EVENT[360]: 0.004866125 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073458928, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.004866125] HEAP: Freed bytes @ 0x3ffbaef0 from task "free2" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[343]: 0.004542000 - core[0].svPrint(26), plen 34: [msg: I (312) example: Wait notify 0 -, lvl: 0, unused: 0] -[0.004542000] LOG: I (312) example: Wait notify 0 -EVENT[344]: 0.004553025 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[345]: 0.004566700 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[346]: 0.004580775 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[347]: 0.004591450 - core[1].svIdle(17), plen 0: [] -EVENT[348]: 0.004602475 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[349]: 0.004618600 - core[0].svIdle(17), plen 0: [] -EVENT[350]: 0.004669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[351]: 0.004682875 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[352]: 0.004698150 - core[1].svIdle(17), plen 0: [] -EVENT[353]: 0.004813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[354]: 0.004828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[355]: 0.004843775 - core[0].svIdle(17), plen 0: [] -EVENT[356]: 0.005669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[357]: 0.005682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[358]: 0.005698100 - core[1].svIdle(17), plen 0: [] -EVENT[359]: 0.005813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[360]: 0.005828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[361]: 0.005843775 - core[0].svIdle(17), plen 0: [] -EVENT[362]: 0.006669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[363]: 0.006682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[364]: 0.006698075 - core[1].svIdle(17), plen 0: [] -EVENT[365]: 0.006813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[366]: 0.006828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[367]: 0.006843825 - core[0].svIdle(17), plen 0: [] -EVENT[368]: 0.007669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[369]: 0.007682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[370]: 0.007698075 - core[1].svIdle(17), plen 0: [] -EVENT[371]: 0.007813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[372]: 0.007828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[373]: 0.007843775 - core[0].svIdle(17), plen 0: [] -EVENT[374]: 0.008669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[375]: 0.008687175 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[376]: 0.008702325 - core[1].svIdle(17), plen 0: [] -EVENT[377]: 0.008813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[378]: 0.008828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[379]: 0.008843775 - core[0].svIdle(17), plen 0: [] -EVENT[380]: 0.009669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[381]: 0.009682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[382]: 0.009698075 - core[1].svIdle(17), plen 0: [] -EVENT[383]: 0.009813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[384]: 0.009828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[385]: 0.009843825 - core[0].svIdle(17), plen 0: [] -EVENT[386]: 0.010669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[387]: 0.010682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[388]: 0.010698075 - core[1].svIdle(17), plen 0: [] -EVENT[389]: 0.010813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[390]: 0.010828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[391]: 0.010843775 - core[0].svIdle(17), plen 0: [] -EVENT[392]: 0.011669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[393]: 0.011682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[394]: 0.011698325 - core[1].svIdle(17), plen 0: [] -EVENT[395]: 0.011813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[396]: 0.011828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[397]: 0.011843775 - core[0].svIdle(17), plen 0: [] -EVENT[398]: 0.012669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[399]: 0.012682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[400]: 0.012698100 - core[1].svIdle(17), plen 0: [] -EVENT[401]: 0.012813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[402]: 0.012828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[403]: 0.012843775 - core[0].svIdle(17), plen 0: [] -EVENT[404]: 0.013669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[405]: 0.013682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[406]: 0.013698075 - core[1].svIdle(17), plen 0: [] -EVENT[407]: 0.013813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[408]: 0.013828850 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[409]: 0.013844050 - core[0].svIdle(17), plen 0: [] -EVENT[410]: 0.014669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[411]: 0.014682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[412]: 0.014698075 - core[1].svIdle(17), plen 0: [] -EVENT[413]: 0.014813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[414]: 0.014828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[415]: 0.014843775 - core[0].svIdle(17), plen 0: [] -EVENT[416]: 0.015669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[417]: 0.015682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[418]: 0.015698325 - core[1].svIdle(17), plen 0: [] -EVENT[419]: 0.015813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[420]: 0.015828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[421]: 0.015843775 - core[0].svIdle(17), plen 0: [] -EVENT[422]: 0.016669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[423]: 0.016682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[424]: 0.016698100 - core[1].svIdle(17), plen 0: [] -EVENT[425]: 0.016813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[426]: 0.016828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[427]: 0.016843775 - core[0].svIdle(17), plen 0: [] -EVENT[428]: 0.017669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[429]: 0.017682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[430]: 0.017698075 - core[1].svIdle(17), plen 0: [] -EVENT[431]: 0.017813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[432]: 0.017828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[433]: 0.017843825 - core[0].svIdle(17), plen 0: [] -EVENT[434]: 0.018669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[435]: 0.018682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[436]: 0.018698075 - core[1].svIdle(17), plen 0: [] -EVENT[437]: 0.018813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[438]: 0.018828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[439]: 0.018843775 - core[0].svIdle(17), plen 0: [] -EVENT[440]: 0.019669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[441]: 0.019682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[442]: 0.019698325 - core[1].svIdle(17), plen 0: [] -EVENT[443]: 0.019813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[444]: 0.019828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[445]: 0.019843775 - core[0].svIdle(17), plen 0: [] -EVENT[446]: 0.020669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[447]: 0.020687200 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[448]: 0.020702325 - core[1].svIdle(17), plen 0: [] -EVENT[449]: 0.020813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[450]: 0.020828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[451]: 0.020843775 - core[0].svIdle(17), plen 0: [] -EVENT[452]: 0.021669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[453]: 0.021682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[454]: 0.021698075 - core[1].svIdle(17), plen 0: [] -EVENT[455]: 0.021813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[456]: 0.021828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[457]: 0.021843825 - core[0].svIdle(17), plen 0: [] -EVENT[458]: 0.022669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[459]: 0.022682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[460]: 0.022698075 - core[1].svIdle(17), plen 0: [] -EVENT[461]: 0.022813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[462]: 0.022828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[463]: 0.022843775 - core[0].svIdle(17), plen 0: [] -EVENT[464]: 0.023669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[465]: 0.023682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[466]: 0.023698325 - core[1].svIdle(17), plen 0: [] -EVENT[467]: 0.023813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[468]: 0.023828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[469]: 0.023843775 - core[0].svIdle(17), plen 0: [] -EVENT[470]: 0.024669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[471]: 0.024682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[472]: 0.024698100 - core[1].svIdle(17), plen 0: [] -EVENT[473]: 0.024813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[474]: 0.024828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[475]: 0.024843775 - core[0].svIdle(17), plen 0: [] -EVENT[476]: 0.025669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[477]: 0.025682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[478]: 0.025698075 - core[1].svIdle(17), plen 0: [] -EVENT[479]: 0.025813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[480]: 0.025828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[481]: 0.025843825 - core[0].svIdle(17), plen 0: [] -EVENT[482]: 0.026669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[483]: 0.026682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[484]: 0.026698075 - core[1].svIdle(17), plen 0: [] -EVENT[485]: 0.026813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[486]: 0.026828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[487]: 0.026843775 - core[0].svIdle(17), plen 0: [] -EVENT[488]: 0.027669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[489]: 0.027682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[490]: 0.027698325 - core[1].svIdle(17), plen 0: [] -EVENT[491]: 0.027813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[492]: 0.027828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[493]: 0.027843775 - core[0].svIdle(17), plen 0: [] -EVENT[494]: 0.028669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[495]: 0.028682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[496]: 0.028698100 - core[1].svIdle(17), plen 0: [] -EVENT[497]: 0.028813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[498]: 0.028828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[499]: 0.028843775 - core[0].svIdle(17), plen 0: [] -EVENT[500]: 0.029669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[501]: 0.029682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[502]: 0.029698075 - core[1].svIdle(17), plen 0: [] -EVENT[503]: 0.029813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[504]: 0.029828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[505]: 0.029843825 - core[0].svIdle(17), plen 0: [] -EVENT[506]: 0.030669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[507]: 0.030682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[508]: 0.030698075 - core[1].svIdle(17), plen 0: [] -EVENT[509]: 0.030813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[510]: 0.030828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[511]: 0.030843775 - core[0].svIdle(17), plen 0: [] -EVENT[512]: 0.031669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[513]: 0.031682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[514]: 0.031698325 - core[1].svIdle(17), plen 0: [] -EVENT[515]: 0.031813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[516]: 0.031828325 - core[0].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[517]: 0.031828325 - core[1].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[518]: 0.031840900 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[519]: 0.031860400 - core[0].svTaskStartExec(4), plen 0: [tid: 12286700] -EVENT[520]: 0.031895800 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461032, size: 2, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.031895800] HEAP: Allocated 2 bytes @ 0x3ffbb728 from task "alloc0" on core 0 by: +EVENT[361]: 0.004893775 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[362]: 0.004905175 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[363]: 0.004921750 - core[1].svIdle(17), plen 0: [] +EVENT[364]: 0.005425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[365]: 0.005439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[366]: 0.005454975 - core[1].svIdle(17), plen 0: [] +EVENT[367]: 0.005546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[368]: 0.005562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[369]: 0.005577425 - core[0].svIdle(17), plen 0: [] +EVENT[370]: 0.006425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[371]: 0.006439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[372]: 0.006454550 - core[1].svIdle(17), plen 0: [] +EVENT[373]: 0.006546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[374]: 0.006562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[375]: 0.006577125 - core[0].svIdle(17), plen 0: [] +EVENT[376]: 0.007425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[377]: 0.007439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[378]: 0.007454675 - core[1].svIdle(17), plen 0: [] +EVENT[379]: 0.007546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[380]: 0.007562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[381]: 0.007577150 - core[0].svIdle(17), plen 0: [] +EVENT[382]: 0.008425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[383]: 0.008439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[384]: 0.008454600 - core[1].svIdle(17), plen 0: [] +EVENT[385]: 0.008546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[386]: 0.008562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[387]: 0.008577125 - core[0].svIdle(17), plen 0: [] +EVENT[388]: 0.009425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[389]: 0.009439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[390]: 0.009454550 - core[1].svIdle(17), plen 0: [] +EVENT[391]: 0.009546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[392]: 0.009562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[393]: 0.009577425 - core[0].svIdle(17), plen 0: [] +EVENT[394]: 0.010425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[395]: 0.010439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[396]: 0.010454550 - core[1].svIdle(17), plen 0: [] +EVENT[397]: 0.010546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[398]: 0.010562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[399]: 0.010577125 - core[0].svIdle(17), plen 0: [] +EVENT[400]: 0.011425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[401]: 0.011439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[402]: 0.011454675 - core[1].svIdle(17), plen 0: [] +EVENT[403]: 0.011546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[404]: 0.011562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[405]: 0.011577150 - core[0].svIdle(17), plen 0: [] +EVENT[406]: 0.012425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[407]: 0.012439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[408]: 0.012454675 - core[1].svIdle(17), plen 0: [] +EVENT[409]: 0.012546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[410]: 0.012562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[411]: 0.012577150 - core[0].svIdle(17), plen 0: [] +EVENT[412]: 0.013425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[413]: 0.013439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[414]: 0.013454600 - core[1].svIdle(17), plen 0: [] +EVENT[415]: 0.013546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[416]: 0.013562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[417]: 0.013577125 - core[0].svIdle(17), plen 0: [] +EVENT[418]: 0.014425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[419]: 0.014439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[420]: 0.014454550 - core[1].svIdle(17), plen 0: [] +EVENT[421]: 0.014546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[422]: 0.014562325 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[423]: 0.014577550 - core[0].svIdle(17), plen 0: [] +EVENT[424]: 0.015425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[425]: 0.015439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[426]: 0.015454550 - core[1].svIdle(17), plen 0: [] +EVENT[427]: 0.015546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[428]: 0.015562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[429]: 0.015577125 - core[0].svIdle(17), plen 0: [] +EVENT[430]: 0.016425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[431]: 0.016439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[432]: 0.016454675 - core[1].svIdle(17), plen 0: [] +EVENT[433]: 0.016546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[434]: 0.016562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[435]: 0.016577150 - core[0].svIdle(17), plen 0: [] +EVENT[436]: 0.017425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[437]: 0.017439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[438]: 0.017454600 - core[1].svIdle(17), plen 0: [] +EVENT[439]: 0.017546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[440]: 0.017562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[441]: 0.017577125 - core[0].svIdle(17), plen 0: [] +EVENT[442]: 0.018425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[443]: 0.018439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[444]: 0.018454550 - core[1].svIdle(17), plen 0: [] +EVENT[445]: 0.018546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[446]: 0.018562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[447]: 0.018577425 - core[0].svIdle(17), plen 0: [] +EVENT[448]: 0.019425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[449]: 0.019439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[450]: 0.019454550 - core[1].svIdle(17), plen 0: [] +EVENT[451]: 0.019546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[452]: 0.019562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[453]: 0.019577125 - core[0].svIdle(17), plen 0: [] +EVENT[454]: 0.020425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[455]: 0.020439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[456]: 0.020454675 - core[1].svIdle(17), plen 0: [] +EVENT[457]: 0.020546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[458]: 0.020562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[459]: 0.020577150 - core[0].svIdle(17), plen 0: [] +EVENT[460]: 0.021425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[461]: 0.021439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[462]: 0.021454600 - core[1].svIdle(17), plen 0: [] +EVENT[463]: 0.021546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[464]: 0.021562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[465]: 0.021577125 - core[0].svIdle(17), plen 0: [] +EVENT[466]: 0.022425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[467]: 0.022439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[468]: 0.022454550 - core[1].svIdle(17), plen 0: [] +EVENT[469]: 0.022546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[470]: 0.022562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[471]: 0.022577425 - core[0].svIdle(17), plen 0: [] +EVENT[472]: 0.023425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[473]: 0.023439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[474]: 0.023454550 - core[1].svIdle(17), plen 0: [] +EVENT[475]: 0.023546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[476]: 0.023562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[477]: 0.023577125 - core[0].svIdle(17), plen 0: [] +EVENT[478]: 0.024425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[479]: 0.024443675 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[480]: 0.024458825 - core[1].svIdle(17), plen 0: [] +EVENT[481]: 0.024546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[482]: 0.024562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[483]: 0.024577125 - core[0].svIdle(17), plen 0: [] +EVENT[484]: 0.025425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[485]: 0.025439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[486]: 0.025454550 - core[1].svIdle(17), plen 0: [] +EVENT[487]: 0.025546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[488]: 0.025562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[489]: 0.025577425 - core[0].svIdle(17), plen 0: [] +EVENT[490]: 0.026425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[491]: 0.026439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[492]: 0.026454550 - core[1].svIdle(17), plen 0: [] +EVENT[493]: 0.026546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[494]: 0.026562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[495]: 0.026577125 - core[0].svIdle(17), plen 0: [] +EVENT[496]: 0.027425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[497]: 0.027439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[498]: 0.027454675 - core[1].svIdle(17), plen 0: [] +EVENT[499]: 0.027546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[500]: 0.027562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[501]: 0.027577150 - core[0].svIdle(17), plen 0: [] +EVENT[502]: 0.028425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[503]: 0.028439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[504]: 0.028454600 - core[1].svIdle(17), plen 0: [] +EVENT[505]: 0.028546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[506]: 0.028562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[507]: 0.028577125 - core[0].svIdle(17), plen 0: [] +EVENT[508]: 0.029425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[509]: 0.029439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[510]: 0.029454550 - core[1].svIdle(17), plen 0: [] +EVENT[511]: 0.029546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[512]: 0.029562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[513]: 0.029577425 - core[0].svIdle(17), plen 0: [] +EVENT[514]: 0.030425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[515]: 0.030439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[516]: 0.030454550 - core[1].svIdle(17), plen 0: [] +EVENT[517]: 0.030546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[518]: 0.030562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[519]: 0.030577125 - core[0].svIdle(17), plen 0: [] +EVENT[520]: 0.031425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[521]: 0.031439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[522]: 0.031454675 - core[1].svIdle(17), plen 0: [] +EVENT[523]: 0.031546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[524]: 0.031562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[525]: 0.031577150 - core[0].svIdle(17), plen 0: [] +EVENT[526]: 0.032425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[527]: 0.032439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[528]: 0.032454600 - core[1].svIdle(17), plen 0: [] +EVENT[529]: 0.032546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[530]: 0.032561650 - core[0].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[531]: 0.032561650 - core[1].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[532]: 0.032574300 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[533]: 0.032589975 - core[0].svTaskStartExec(4), plen 0: [tid: 12284596] +EVENT[534]: 0.032626425 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073458928, size: 2, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.032626425] HEAP: Allocated 2 bytes @ 0x3ffbaef0 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[521]: 0.031930350 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461048, size: 4, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.031930350] HEAP: Allocated 4 bytes @ 0x3ffbb738 from task "alloc0" on core 0 by: +EVENT[535]: 0.032661850 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073458944, size: 4, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.032661850] HEAP: Allocated 4 bytes @ 0x3ffbaf00 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[522]: 0.031947275 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[523]: 0.031963225 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[524]: 0.032027500 - core[0].svPrint(26), plen 69: [msg: I (340) example: Task[0x3ffb7aec]: allocated 4 bytes @ 0x3ffbb738 +EVENT[536]: 0.032682300 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[537]: 0.032698225 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[538]: 0.032750775 - core[0].svPrint(26), plen 69: [msg: I (328) example: Task[0x3ffb72b4]: allocated 4 bytes @ 0x3ffbaf00 , lvl: 0, unused: 0] -[0.032027500] LOG: I (340) example: Task[0x3ffb7aec]: allocated 4 bytes @ 0x3ffbb738 -EVENT[525]: 0.032041200 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12287056, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[526]: 0.032054450 - core[0].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[527]: 0.032054450 - core[1].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[528]: 0.032070625 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[529]: 0.032081475 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[530]: 0.032092275 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[531]: 0.032106075 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[532]: 0.032116925 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[533]: 0.032127825 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[534]: 0.032139925 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12287056, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[535]: 0.032150500 - core[0].svIdle(17), plen 0: [] -EVENT[536]: 0.032166625 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[537]: 0.032182825 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[538]: 0.032246375 - core[1].svPrint(26), plen 63: [msg: I (340) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb738 +[0.032750775] LOG: I (328) example: Task[0x3ffb72b4]: allocated 4 bytes @ 0x3ffbaf00 +EVENT[539]: 0.032764225 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12284952, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[540]: 0.032777450 - core[0].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[541]: 0.032777450 - core[1].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[542]: 0.032793700 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[543]: 0.032804650 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[544]: 0.032815400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[545]: 0.032829150 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[546]: 0.032839875 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[547]: 0.032850675 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[548]: 0.032862750 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12284952, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[549]: 0.032873950 - core[0].svIdle(17), plen 0: [] +EVENT[550]: 0.032891200 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[551]: 0.032907525 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[552]: 0.032955300 - core[1].svPrint(26), plen 63: [msg: I (328) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf00 , lvl: 0, unused: 0] -[0.032246375] LOG: I (340) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb738 -EVENT[539]: 0.032267375 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461048, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.032267375] HEAP: Freed bytes @ 0x3ffbb738 from task "free0" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.032955300] LOG: I (328) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf00 +EVENT[553]: 0.032980775 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073458944, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.032980775] HEAP: Freed bytes @ 0x3ffbaf00 from task "free0" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[540]: 0.032294250 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[541]: 0.032305725 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[542]: 0.032322425 - core[1].svIdle(17), plen 0: [] -EVENT[543]: 0.032669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[544]: 0.032682850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[545]: 0.032698425 - core[1].svIdle(17), plen 0: [] -EVENT[546]: 0.032813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[547]: 0.032828225 - core[0].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[548]: 0.032828225 - core[1].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[549]: 0.032840850 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[550]: 0.032856525 - core[0].svTaskStartExec(4), plen 0: [tid: 12292716] -EVENT[551]: 0.032891700 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461048, size: 4, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.032891700] HEAP: Allocated 4 bytes @ 0x3ffbb738 from task "alloc1" on core 0 by: +EVENT[554]: 0.033008200 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[555]: 0.033019600 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[556]: 0.033036175 - core[1].svIdle(17), plen 0: [] +EVENT[557]: 0.033425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[558]: 0.033439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[559]: 0.033455150 - core[1].svIdle(17), plen 0: [] +EVENT[560]: 0.033546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[561]: 0.033561650 - core[0].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[562]: 0.033561650 - core[1].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[563]: 0.033573550 - core[0].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[564]: 0.033573550 - core[1].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[565]: 0.033586100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[566]: 0.033601775 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[567]: 0.033638000 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073458944, size: 4, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.033638000] HEAP: Allocated 4 bytes @ 0x3ffbaf00 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[552]: 0.032926225 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461064, size: 8, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.032926225] HEAP: Allocated 8 bytes @ 0x3ffbb748 from task "alloc1" on core 0 by: +EVENT[568]: 0.033673475 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073458960, size: 8, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.033673475] HEAP: Allocated 8 bytes @ 0x3ffbaf10 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[553]: 0.032943250 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[554]: 0.032963425 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[555]: 0.033027675 - core[0].svPrint(26), plen 69: [msg: I (341) example: Task[0x3ffb926c]: allocated 8 bytes @ 0x3ffbb748 +EVENT[569]: 0.033690400 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[570]: 0.033706325 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[571]: 0.033758875 - core[0].svPrint(26), plen 69: [msg: I (329) example: Task[0x3ffb8a34]: allocated 8 bytes @ 0x3ffbaf10 , lvl: 0, unused: 0] -[0.033027675] LOG: I (341) example: Task[0x3ffb926c]: allocated 8 bytes @ 0x3ffbb748 -EVENT[556]: 0.033041400 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12293072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[557]: 0.033054625 - core[0].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[558]: 0.033054625 - core[1].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[559]: 0.033070875 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[560]: 0.033081725 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[561]: 0.033092475 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[562]: 0.033106200 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[563]: 0.033116975 - core[1].svTaskStartExec(4), plen 0: [tid: 12295764] -EVENT[564]: 0.033127725 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[565]: 0.033139725 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12293072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[566]: 0.033151025 - core[0].svIdle(17), plen 0: [] -EVENT[567]: 0.033162675 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[568]: 0.033179000 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[569]: 0.033242525 - core[1].svPrint(26), plen 63: [msg: I (341) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb748 -, lvl: 0, unused: 0] -[0.033242525] LOG: I (341) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb748 -EVENT[570]: 0.033267050 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461064, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.033267050] HEAP: Freed bytes @ 0x3ffbb748 from task "free1" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 -/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 -/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 - -EVENT[571]: 0.033294050 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[572]: 0.033305475 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[573]: 0.033322050 - core[1].svIdle(17), plen 0: [] -EVENT[574]: 0.033669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[575]: 0.033682950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[576]: 0.033698525 - core[1].svIdle(17), plen 0: [] -EVENT[577]: 0.033813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[578]: 0.033828325 - core[0].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[579]: 0.033828325 - core[1].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[580]: 0.033840975 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[581]: 0.033856650 - core[0].svTaskStartExec(4), plen 0: [tid: 12298716] -EVENT[582]: 0.033892175 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461064, size: 6, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.033892175] HEAP: Allocated 6 bytes @ 0x3ffbb748 from task "alloc2" on core 0 by: +[0.033758875] LOG: I (329) example: Task[0x3ffb8a34]: allocated 8 bytes @ 0x3ffbaf10 +EVENT[572]: 0.033776525 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12290968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[573]: 0.033789675 - core[0].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[574]: 0.033789675 - core[1].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[575]: 0.033806000 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[576]: 0.033816850 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[577]: 0.033827650 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[578]: 0.033841700 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[579]: 0.033853500 - core[1].svTaskStartExec(4), plen 0: [tid: 12293660] +EVENT[580]: 0.033864750 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[581]: 0.033876675 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12290968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[582]: 0.033888475 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[583]: 0.033901250 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[584]: 0.033919975 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[585]: 0.033931975 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073458976, size: 6, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.033931975] HEAP: Allocated 6 bytes @ 0x3ffbaf20 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[583]: 0.033926575 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461080, size: 12, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.033926575] HEAP: Allocated 12 bytes @ 0x3ffbb758 from task "alloc2" on core 0 by: +EVENT[586]: 0.033973050 - core[1].svPrint(26), plen 63: [msg: I (329) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf10 +, lvl: 0, unused: 0] +[0.033973050] LOG: I (329) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf10 +EVENT[587]: 0.033988900 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073458992, size: 12, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.033988900] HEAP: Allocated 12 bytes @ 0x3ffbaf30 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[584]: 0.033943475 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[585]: 0.033959450 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[586]: 0.034029800 - core[0].svPrint(26), plen 70: [msg: I (342) example: Task[0x3ffba9dc]: allocated 12 bytes @ 0x3ffbb758 -, lvl: 0, unused: 0] -[0.034029800] LOG: I (342) example: Task[0x3ffba9dc]: allocated 12 bytes @ 0x3ffbb758 -EVENT[587]: 0.034047625 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12299072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[588]: 0.034060850 - core[0].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[589]: 0.034060850 - core[1].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[590]: 0.034077150 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[591]: 0.034088000 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[592]: 0.034098775 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[593]: 0.034112500 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[594]: 0.034123375 - core[1].svTaskStartExec(4), plen 0: [tid: 12301764] -EVENT[595]: 0.034134200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[596]: 0.034146200 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12299072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[597]: 0.034156450 - core[0].svIdle(17), plen 0: [] -EVENT[598]: 0.034167850 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[599]: 0.034184225 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[600]: 0.034247900 - core[1].svPrint(26), plen 63: [msg: I (342) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb758 -, lvl: 0, unused: 0] -[0.034247900] LOG: I (342) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb758 -EVENT[601]: 0.034269100 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461080, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.034269100] HEAP: Freed bytes @ 0x3ffbb758 from task "free2" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +EVENT[588]: 0.034003200 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073458960, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.034003200] HEAP: Freed bytes @ 0x3ffbaf10 from task "free1" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[602]: 0.034300025 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[603]: 0.034311500 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[604]: 0.034328200 - core[1].svIdle(17), plen 0: [] -EVENT[605]: 0.034669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[606]: 0.034682850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[607]: 0.034698425 - core[1].svIdle(17), plen 0: [] -EVENT[608]: 0.034813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[609]: 0.034828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[610]: 0.034843825 - core[0].svIdle(17), plen 0: [] -EVENT[611]: 0.035669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[612]: 0.035682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[613]: 0.035698075 - core[1].svIdle(17), plen 0: [] -EVENT[614]: 0.035813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[615]: 0.035828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[616]: 0.035843775 - core[0].svIdle(17), plen 0: [] -EVENT[617]: 0.036669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[618]: 0.036682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[619]: 0.036698325 - core[1].svIdle(17), plen 0: [] -EVENT[620]: 0.036813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[621]: 0.036828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[622]: 0.036843775 - core[0].svIdle(17), plen 0: [] -EVENT[623]: 0.037669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[624]: 0.037682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[625]: 0.037698100 - core[1].svIdle(17), plen 0: [] -EVENT[626]: 0.037813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[627]: 0.037828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[628]: 0.037843775 - core[0].svIdle(17), plen 0: [] -EVENT[629]: 0.038669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[630]: 0.038682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[631]: 0.038698075 - core[1].svIdle(17), plen 0: [] -EVENT[632]: 0.038813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[633]: 0.038828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[634]: 0.038843825 - core[0].svIdle(17), plen 0: [] -EVENT[635]: 0.039669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[636]: 0.039682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[637]: 0.039698075 - core[1].svIdle(17), plen 0: [] -EVENT[638]: 0.039813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[639]: 0.039828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[640]: 0.039843775 - core[0].svIdle(17), plen 0: [] -EVENT[641]: 0.040669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[642]: 0.040682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[643]: 0.040698325 - core[1].svIdle(17), plen 0: [] -EVENT[644]: 0.040813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[645]: 0.040828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[646]: 0.040843775 - core[0].svIdle(17), plen 0: [] -EVENT[647]: 0.041669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[648]: 0.041682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[649]: 0.041698100 - core[1].svIdle(17), plen 0: [] -EVENT[650]: 0.041813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[651]: 0.041828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[652]: 0.041843775 - core[0].svIdle(17), plen 0: [] -EVENT[653]: 0.042669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[654]: 0.042682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[655]: 0.042698075 - core[1].svIdle(17), plen 0: [] -EVENT[656]: 0.042813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[657]: 0.042828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[658]: 0.042843825 - core[0].svIdle(17), plen 0: [] -EVENT[659]: 0.043669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[660]: 0.043682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[661]: 0.043698075 - core[1].svIdle(17), plen 0: [] -EVENT[662]: 0.043813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[663]: 0.043828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[664]: 0.043843775 - core[0].svIdle(17), plen 0: [] -EVENT[665]: 0.044669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[666]: 0.044687175 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[667]: 0.044702300 - core[1].svIdle(17), plen 0: [] -EVENT[668]: 0.044813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[669]: 0.044828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[670]: 0.044843775 - core[0].svIdle(17), plen 0: [] -EVENT[671]: 0.045669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[672]: 0.045682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[673]: 0.045698075 - core[1].svIdle(17), plen 0: [] -EVENT[674]: 0.045813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[675]: 0.045828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[676]: 0.045843825 - core[0].svIdle(17), plen 0: [] -EVENT[677]: 0.046669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[678]: 0.046682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[679]: 0.046698075 - core[1].svIdle(17), plen 0: [] -EVENT[680]: 0.046813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[681]: 0.046828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[682]: 0.046843775 - core[0].svIdle(17), plen 0: [] -EVENT[683]: 0.047669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[684]: 0.047682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[685]: 0.047698325 - core[1].svIdle(17), plen 0: [] -EVENT[686]: 0.047813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[687]: 0.047828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[688]: 0.047843775 - core[0].svIdle(17), plen 0: [] -EVENT[689]: 0.048669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[690]: 0.048682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[691]: 0.048698100 - core[1].svIdle(17), plen 0: [] -EVENT[692]: 0.048813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[693]: 0.048828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[694]: 0.048843775 - core[0].svIdle(17), plen 0: [] -EVENT[695]: 0.049669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[696]: 0.049682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[697]: 0.049698075 - core[1].svIdle(17), plen 0: [] -EVENT[698]: 0.049813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[699]: 0.049828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[700]: 0.049843825 - core[0].svIdle(17), plen 0: [] -EVENT[701]: 0.050669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[702]: 0.050682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[703]: 0.050698075 - core[1].svIdle(17), plen 0: [] -EVENT[704]: 0.050813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[705]: 0.050828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[706]: 0.050843775 - core[0].svIdle(17), plen 0: [] -EVENT[707]: 0.051669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[708]: 0.051682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[709]: 0.051698325 - core[1].svIdle(17), plen 0: [] -EVENT[710]: 0.051813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[711]: 0.051828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[712]: 0.051843775 - core[0].svIdle(17), plen 0: [] -EVENT[713]: 0.052669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[714]: 0.052682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[715]: 0.052698100 - core[1].svIdle(17), plen 0: [] -EVENT[716]: 0.052813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[717]: 0.052828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[718]: 0.052843775 - core[0].svIdle(17), plen 0: [] -EVENT[719]: 0.053669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[720]: 0.053682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[721]: 0.053698075 - core[1].svIdle(17), plen 0: [] -EVENT[722]: 0.053813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[723]: 0.053828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[724]: 0.053843825 - core[0].svIdle(17), plen 0: [] -EVENT[725]: 0.054669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[726]: 0.054682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[727]: 0.054698075 - core[1].svIdle(17), plen 0: [] -EVENT[728]: 0.054813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[729]: 0.054828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[730]: 0.054843775 - core[0].svIdle(17), plen 0: [] -EVENT[731]: 0.055669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[732]: 0.055682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[733]: 0.055698325 - core[1].svIdle(17), plen 0: [] -EVENT[734]: 0.055813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[735]: 0.055828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[736]: 0.055843775 - core[0].svIdle(17), plen 0: [] -EVENT[737]: 0.056669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[738]: 0.056687200 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[739]: 0.056702350 - core[1].svIdle(17), plen 0: [] -EVENT[740]: 0.056813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[741]: 0.056828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[742]: 0.056843775 - core[0].svIdle(17), plen 0: [] -EVENT[743]: 0.057669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[744]: 0.057682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[745]: 0.057698075 - core[1].svIdle(17), plen 0: [] -EVENT[746]: 0.057813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[747]: 0.057828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[748]: 0.057843825 - core[0].svIdle(17), plen 0: [] -EVENT[749]: 0.058669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[750]: 0.058682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[751]: 0.058698075 - core[1].svIdle(17), plen 0: [] -EVENT[752]: 0.058813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[753]: 0.058828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[754]: 0.058843775 - core[0].svIdle(17), plen 0: [] -EVENT[755]: 0.059669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[756]: 0.059682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[757]: 0.059698325 - core[1].svIdle(17), plen 0: [] -EVENT[758]: 0.059813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[759]: 0.059828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[760]: 0.059843775 - core[0].svIdle(17), plen 0: [] -EVENT[761]: 0.060669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[762]: 0.060682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[763]: 0.060698100 - core[1].svIdle(17), plen 0: [] -EVENT[764]: 0.060813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[765]: 0.060828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[766]: 0.060843775 - core[0].svIdle(17), plen 0: [] -EVENT[767]: 0.061669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[768]: 0.061682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[769]: 0.061698075 - core[1].svIdle(17), plen 0: [] -EVENT[770]: 0.061813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[771]: 0.061828225 - core[0].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[772]: 0.061828225 - core[1].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[773]: 0.061840850 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[774]: 0.061856525 - core[0].svTaskStartExec(4), plen 0: [tid: 12286700] -EVENT[775]: 0.061891850 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461080, size: 3, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.061891850] HEAP: Allocated 3 bytes @ 0x3ffbb758 from task "alloc0" on core 0 by: +EVENT[589]: 0.034015625 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[590]: 0.034035675 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[591]: 0.034046600 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[592]: 0.034058125 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[593]: 0.034076100 - core[1].svIdle(17), plen 0: [] +EVENT[594]: 0.034094100 - core[0].svPrint(26), plen 70: [msg: I (329) example: Task[0x3ffba1a4]: allocated 12 bytes @ 0x3ffbaf30 +, lvl: 0, unused: 0] +[0.034094100] LOG: I (329) example: Task[0x3ffba1a4]: allocated 12 bytes @ 0x3ffbaf30 +EVENT[595]: 0.034107525 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12296968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[596]: 0.034124925 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[597]: 0.034124925 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[598]: 0.034141275 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[599]: 0.034152125 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[600]: 0.034162950 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[601]: 0.034176750 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[602]: 0.034187500 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[603]: 0.034198300 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[604]: 0.034210250 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12296968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[605]: 0.034221475 - core[0].svIdle(17), plen 0: [] +EVENT[606]: 0.034233300 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[607]: 0.034249550 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[608]: 0.034297325 - core[1].svPrint(26), plen 63: [msg: I (329) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf30 +, lvl: 0, unused: 0] +[0.034297325] LOG: I (329) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf30 +EVENT[609]: 0.034318700 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073458992, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.034318700] HEAP: Freed bytes @ 0x3ffbaf30 from task "free2" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 +/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 +/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 + +EVENT[610]: 0.034346125 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[611]: 0.034357525 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[612]: 0.034374100 - core[1].svIdle(17), plen 0: [] +EVENT[613]: 0.034425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[614]: 0.034439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[615]: 0.034455150 - core[1].svIdle(17), plen 0: [] +EVENT[616]: 0.034546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[617]: 0.034562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[618]: 0.034577125 - core[0].svIdle(17), plen 0: [] +EVENT[619]: 0.035425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[620]: 0.035439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[621]: 0.035454550 - core[1].svIdle(17), plen 0: [] +EVENT[622]: 0.035546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[623]: 0.035562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[624]: 0.035577425 - core[0].svIdle(17), plen 0: [] +EVENT[625]: 0.036425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[626]: 0.036439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[627]: 0.036454550 - core[1].svIdle(17), plen 0: [] +EVENT[628]: 0.036546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[629]: 0.036566350 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[630]: 0.036581550 - core[0].svIdle(17), plen 0: [] +EVENT[631]: 0.037425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[632]: 0.037439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[633]: 0.037454550 - core[1].svIdle(17), plen 0: [] +EVENT[634]: 0.037546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[635]: 0.037562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[636]: 0.037577125 - core[0].svIdle(17), plen 0: [] +EVENT[637]: 0.038425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[638]: 0.038439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[639]: 0.038454675 - core[1].svIdle(17), plen 0: [] +EVENT[640]: 0.038546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[641]: 0.038562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[642]: 0.038577150 - core[0].svIdle(17), plen 0: [] +EVENT[643]: 0.039425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[644]: 0.039439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[645]: 0.039454600 - core[1].svIdle(17), plen 0: [] +EVENT[646]: 0.039546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[647]: 0.039562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[648]: 0.039577125 - core[0].svIdle(17), plen 0: [] +EVENT[649]: 0.040425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[650]: 0.040439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[651]: 0.040454550 - core[1].svIdle(17), plen 0: [] +EVENT[652]: 0.040546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[653]: 0.040562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[654]: 0.040577425 - core[0].svIdle(17), plen 0: [] +EVENT[655]: 0.041425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[656]: 0.041439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[657]: 0.041454550 - core[1].svIdle(17), plen 0: [] +EVENT[658]: 0.041546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[659]: 0.041562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[660]: 0.041577125 - core[0].svIdle(17), plen 0: [] +EVENT[661]: 0.042425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[662]: 0.042439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[663]: 0.042454675 - core[1].svIdle(17), plen 0: [] +EVENT[664]: 0.042546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[665]: 0.042562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[666]: 0.042577150 - core[0].svIdle(17), plen 0: [] +EVENT[667]: 0.043425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[668]: 0.043439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[669]: 0.043454600 - core[1].svIdle(17), plen 0: [] +EVENT[670]: 0.043546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[671]: 0.043562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[672]: 0.043577125 - core[0].svIdle(17), plen 0: [] +EVENT[673]: 0.044425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[674]: 0.044439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[675]: 0.044454550 - core[1].svIdle(17), plen 0: [] +EVENT[676]: 0.044546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[677]: 0.044562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[678]: 0.044577425 - core[0].svIdle(17), plen 0: [] +EVENT[679]: 0.045425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[680]: 0.045439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[681]: 0.045454550 - core[1].svIdle(17), plen 0: [] +EVENT[682]: 0.045546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[683]: 0.045562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[684]: 0.045577125 - core[0].svIdle(17), plen 0: [] +EVENT[685]: 0.046425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[686]: 0.046439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[687]: 0.046454675 - core[1].svIdle(17), plen 0: [] +EVENT[688]: 0.046546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[689]: 0.046562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[690]: 0.046577150 - core[0].svIdle(17), plen 0: [] +EVENT[691]: 0.047425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[692]: 0.047439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[693]: 0.047454600 - core[1].svIdle(17), plen 0: [] +EVENT[694]: 0.047546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[695]: 0.047562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[696]: 0.047577125 - core[0].svIdle(17), plen 0: [] +EVENT[697]: 0.048425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[698]: 0.048439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[699]: 0.048454550 - core[1].svIdle(17), plen 0: [] +EVENT[700]: 0.048546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[701]: 0.048566325 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[702]: 0.048581550 - core[0].svIdle(17), plen 0: [] +EVENT[703]: 0.049425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[704]: 0.049439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[705]: 0.049454550 - core[1].svIdle(17), plen 0: [] +EVENT[706]: 0.049546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[707]: 0.049562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[708]: 0.049577125 - core[0].svIdle(17), plen 0: [] +EVENT[709]: 0.050425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[710]: 0.050439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[711]: 0.050454675 - core[1].svIdle(17), plen 0: [] +EVENT[712]: 0.050546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[713]: 0.050562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[714]: 0.050577150 - core[0].svIdle(17), plen 0: [] +EVENT[715]: 0.051425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[716]: 0.051439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[717]: 0.051454600 - core[1].svIdle(17), plen 0: [] +EVENT[718]: 0.051546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[719]: 0.051562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[720]: 0.051577125 - core[0].svIdle(17), plen 0: [] +EVENT[721]: 0.052425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[722]: 0.052439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[723]: 0.052454550 - core[1].svIdle(17), plen 0: [] +EVENT[724]: 0.052546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[725]: 0.052562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[726]: 0.052577425 - core[0].svIdle(17), plen 0: [] +EVENT[727]: 0.053425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[728]: 0.053439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[729]: 0.053454550 - core[1].svIdle(17), plen 0: [] +EVENT[730]: 0.053546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[731]: 0.053562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[732]: 0.053577125 - core[0].svIdle(17), plen 0: [] +EVENT[733]: 0.054425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[734]: 0.054439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[735]: 0.054454675 - core[1].svIdle(17), plen 0: [] +EVENT[736]: 0.054546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[737]: 0.054562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[738]: 0.054577150 - core[0].svIdle(17), plen 0: [] +EVENT[739]: 0.055425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[740]: 0.055439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[741]: 0.055454600 - core[1].svIdle(17), plen 0: [] +EVENT[742]: 0.055546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[743]: 0.055562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[744]: 0.055577125 - core[0].svIdle(17), plen 0: [] +EVENT[745]: 0.056425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[746]: 0.056439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[747]: 0.056454550 - core[1].svIdle(17), plen 0: [] +EVENT[748]: 0.056546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[749]: 0.056562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[750]: 0.056577425 - core[0].svIdle(17), plen 0: [] +EVENT[751]: 0.057425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[752]: 0.057439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[753]: 0.057454550 - core[1].svIdle(17), plen 0: [] +EVENT[754]: 0.057546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[755]: 0.057562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[756]: 0.057577125 - core[0].svIdle(17), plen 0: [] +EVENT[757]: 0.058425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[758]: 0.058439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[759]: 0.058454675 - core[1].svIdle(17), plen 0: [] +EVENT[760]: 0.058546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[761]: 0.058562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[762]: 0.058577150 - core[0].svIdle(17), plen 0: [] +EVENT[763]: 0.059425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[764]: 0.059439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[765]: 0.059454600 - core[1].svIdle(17), plen 0: [] +EVENT[766]: 0.059546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[767]: 0.059562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[768]: 0.059577125 - core[0].svIdle(17), plen 0: [] +EVENT[769]: 0.060425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[770]: 0.060439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[771]: 0.060454550 - core[1].svIdle(17), plen 0: [] +EVENT[772]: 0.060546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[773]: 0.060566325 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[774]: 0.060581550 - core[0].svIdle(17), plen 0: [] +EVENT[775]: 0.061425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[776]: 0.061439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[777]: 0.061454550 - core[1].svIdle(17), plen 0: [] +EVENT[778]: 0.061546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[779]: 0.061562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[780]: 0.061577125 - core[0].svIdle(17), plen 0: [] +EVENT[781]: 0.062425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[782]: 0.062439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[783]: 0.062454675 - core[1].svIdle(17), plen 0: [] +EVENT[784]: 0.062546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[785]: 0.062561675 - core[0].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[786]: 0.062561675 - core[1].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[787]: 0.062574250 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[788]: 0.062589925 - core[0].svTaskStartExec(4), plen 0: [tid: 12284596] +EVENT[789]: 0.062624925 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073458960, size: 3, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.062624925] HEAP: Allocated 3 bytes @ 0x3ffbaf10 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[776]: 0.061926275 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461096, size: 6, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.061926275] HEAP: Allocated 6 bytes @ 0x3ffbb768 from task "alloc0" on core 0 by: +EVENT[790]: 0.062660425 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073458992, size: 6, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.062660425] HEAP: Allocated 6 bytes @ 0x3ffbaf30 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[777]: 0.061943300 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[778]: 0.061959425 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[779]: 0.062023675 - core[0].svPrint(26), plen 69: [msg: I (370) example: Task[0x3ffb7aec]: allocated 6 bytes @ 0x3ffbb768 +EVENT[791]: 0.062677350 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[792]: 0.062693275 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[793]: 0.062745825 - core[0].svPrint(26), plen 69: [msg: I (358) example: Task[0x3ffb72b4]: allocated 6 bytes @ 0x3ffbaf30 , lvl: 0, unused: 0] -[0.062023675] LOG: I (370) example: Task[0x3ffb7aec]: allocated 6 bytes @ 0x3ffbb768 -EVENT[780]: 0.062041475 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12287056, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[781]: 0.062054600 - core[0].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[782]: 0.062054600 - core[1].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[783]: 0.062070800 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[784]: 0.062081675 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[785]: 0.062092450 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[786]: 0.062106525 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[787]: 0.062117350 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[788]: 0.062128225 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[789]: 0.062140100 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12287056, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[790]: 0.062150525 - core[0].svIdle(17), plen 0: [] -EVENT[791]: 0.062162975 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[792]: 0.062179175 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[793]: 0.062242725 - core[1].svPrint(26), plen 63: [msg: I (370) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb768 +[0.062745825] LOG: I (358) example: Task[0x3ffb72b4]: allocated 6 bytes @ 0x3ffbaf30 +EVENT[794]: 0.062759275 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12284952, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[795]: 0.062772500 - core[0].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[796]: 0.062772500 - core[1].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[797]: 0.062792925 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[798]: 0.062803875 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[799]: 0.062814650 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[800]: 0.062828550 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[801]: 0.062839350 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[802]: 0.062850075 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[803]: 0.062862300 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12284952, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[804]: 0.062872475 - core[0].svIdle(17), plen 0: [] +EVENT[805]: 0.062884375 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[806]: 0.062900650 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[807]: 0.062948525 - core[1].svPrint(26), plen 63: [msg: I (358) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf30 , lvl: 0, unused: 0] -[0.062242725] LOG: I (370) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb768 -EVENT[794]: 0.062263725 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461096, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.062263725] HEAP: Freed bytes @ 0x3ffbb768 from task "free0" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.062948525] LOG: I (358) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf30 +EVENT[808]: 0.062969750 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073458992, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.062969750] HEAP: Freed bytes @ 0x3ffbaf30 from task "free0" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[795]: 0.062294025 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[796]: 0.062305500 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[797]: 0.062322200 - core[1].svIdle(17), plen 0: [] -EVENT[798]: 0.062669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[799]: 0.062682850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[800]: 0.062698425 - core[1].svIdle(17), plen 0: [] -EVENT[801]: 0.062813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[802]: 0.062828225 - core[0].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[803]: 0.062828225 - core[1].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[804]: 0.062840850 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[805]: 0.062856525 - core[0].svTaskStartExec(4), plen 0: [tid: 12292716] -EVENT[806]: 0.062891850 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461096, size: 6, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.062891850] HEAP: Allocated 6 bytes @ 0x3ffbb768 from task "alloc1" on core 0 by: +EVENT[809]: 0.062997025 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[810]: 0.063008475 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[811]: 0.063025175 - core[1].svIdle(17), plen 0: [] +EVENT[812]: 0.063425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[813]: 0.063439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[814]: 0.063455150 - core[1].svIdle(17), plen 0: [] +EVENT[815]: 0.063546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[816]: 0.063561700 - core[0].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[817]: 0.063561700 - core[1].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[818]: 0.063573550 - core[0].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[819]: 0.063573550 - core[1].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[820]: 0.063586050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[821]: 0.063601725 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[822]: 0.063638150 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073458992, size: 6, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.063638150] HEAP: Allocated 6 bytes @ 0x3ffbaf30 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[807]: 0.062926275 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461112, size: 12, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.062926275] HEAP: Allocated 12 bytes @ 0x3ffbb778 from task "alloc1" on core 0 by: +EVENT[823]: 0.063677800 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459008, size: 12, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.063677800] HEAP: Allocated 12 bytes @ 0x3ffbaf40 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[808]: 0.062943300 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[809]: 0.062959425 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[810]: 0.063025900 - core[0].svPrint(26), plen 70: [msg: I (371) example: Task[0x3ffb926c]: allocated 12 bytes @ 0x3ffbb778 +EVENT[824]: 0.063694725 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[825]: 0.063710750 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[826]: 0.063765475 - core[0].svPrint(26), plen 70: [msg: I (359) example: Task[0x3ffb8a34]: allocated 12 bytes @ 0x3ffbaf40 , lvl: 0, unused: 0] -[0.063025900] LOG: I (371) example: Task[0x3ffb926c]: allocated 12 bytes @ 0x3ffbb778 -EVENT[811]: 0.063039450 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12293072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[812]: 0.063056850 - core[0].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[813]: 0.063056850 - core[1].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[814]: 0.063073175 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[815]: 0.063084025 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[816]: 0.063094775 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[817]: 0.063108500 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[818]: 0.063119350 - core[1].svTaskStartExec(4), plen 0: [tid: 12295764] -EVENT[819]: 0.063130175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[820]: 0.063142025 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12293072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[821]: 0.063152300 - core[0].svIdle(17), plen 0: [] -EVENT[822]: 0.063163775 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[823]: 0.063180075 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[824]: 0.063243525 - core[1].svPrint(26), plen 63: [msg: I (371) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb778 -, lvl: 0, unused: 0] -[0.063243525] LOG: I (371) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb778 -EVENT[825]: 0.063264675 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461112, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.063264675] HEAP: Freed bytes @ 0x3ffbb778 from task "free1" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 -/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 -/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 - -EVENT[826]: 0.063291675 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[827]: 0.063303100 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[828]: 0.063319675 - core[1].svIdle(17), plen 0: [] -EVENT[829]: 0.063669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[830]: 0.063682950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[831]: 0.063698525 - core[1].svIdle(17), plen 0: [] -EVENT[832]: 0.063813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[833]: 0.063828325 - core[0].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[834]: 0.063828325 - core[1].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[835]: 0.063840975 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[836]: 0.063856650 - core[0].svTaskStartExec(4), plen 0: [tid: 12298716] -EVENT[837]: 0.063892175 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461112, size: 9, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.063892175] HEAP: Allocated 9 bytes @ 0x3ffbb778 from task "alloc2" on core 0 by: +[0.063765475] LOG: I (359) example: Task[0x3ffb8a34]: allocated 12 bytes @ 0x3ffbaf40 +EVENT[827]: 0.063778900 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12290968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[828]: 0.063792150 - core[0].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[829]: 0.063792150 - core[1].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[830]: 0.063808625 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[831]: 0.063819475 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[832]: 0.063830300 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[833]: 0.063844100 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[834]: 0.063855800 - core[1].svTaskStartExec(4), plen 0: [tid: 12293660] +EVENT[835]: 0.063867475 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[836]: 0.063880350 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12290968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[837]: 0.063892150 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[838]: 0.063904750 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[839]: 0.063926350 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[840]: 0.063937800 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459024, size: 9, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.063937800] HEAP: Allocated 9 bytes @ 0x3ffbaf50 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[838]: 0.063930700 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461128, size: 18, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.063930700] HEAP: Allocated 18 bytes @ 0x3ffbb788 from task "alloc2" on core 0 by: +EVENT[841]: 0.063979200 - core[1].svPrint(26), plen 63: [msg: I (359) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf40 +, lvl: 0, unused: 0] +[0.063979200] LOG: I (359) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf40 +EVENT[842]: 0.063991300 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459040, size: 18, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.063991300] HEAP: Allocated 18 bytes @ 0x3ffbaf60 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[839]: 0.063947725 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[840]: 0.063963700 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[841]: 0.064034050 - core[0].svPrint(26), plen 70: [msg: I (372) example: Task[0x3ffba9dc]: allocated 18 bytes @ 0x3ffbb788 -, lvl: 0, unused: 0] -[0.064034050] LOG: I (372) example: Task[0x3ffba9dc]: allocated 18 bytes @ 0x3ffbb788 -EVENT[842]: 0.064047650 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12299072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[843]: 0.064060875 - core[0].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[844]: 0.064060875 - core[1].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[845]: 0.064077175 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[846]: 0.064088025 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[847]: 0.064098800 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[848]: 0.064112775 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[849]: 0.064123600 - core[1].svTaskStartExec(4), plen 0: [tid: 12301764] -EVENT[850]: 0.064134475 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[851]: 0.064146325 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12299072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[852]: 0.064157625 - core[0].svIdle(17), plen 0: [] -EVENT[853]: 0.064169250 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[854]: 0.064189700 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[855]: 0.064253250 - core[1].svPrint(26), plen 63: [msg: I (372) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb788 -, lvl: 0, unused: 0] -[0.064253250] LOG: I (372) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb788 -EVENT[856]: 0.064274450 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461128, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.064274450] HEAP: Freed bytes @ 0x3ffbb788 from task "free2" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +EVENT[843]: 0.064005175 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459008, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.064005175] HEAP: Freed bytes @ 0x3ffbaf40 from task "free1" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[857]: 0.064301350 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[858]: 0.064312775 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[859]: 0.064329350 - core[1].svIdle(17), plen 0: [] -EVENT[860]: 0.064669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[861]: 0.064682950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[862]: 0.064698525 - core[1].svIdle(17), plen 0: [] -EVENT[863]: 0.064813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[864]: 0.064828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[865]: 0.064843775 - core[0].svIdle(17), plen 0: [] -EVENT[866]: 0.065669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[867]: 0.065682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[868]: 0.065698325 - core[1].svIdle(17), plen 0: [] -EVENT[869]: 0.065813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[870]: 0.065828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[871]: 0.065843775 - core[0].svIdle(17), plen 0: [] -EVENT[872]: 0.066669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[873]: 0.066682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[874]: 0.066698100 - core[1].svIdle(17), plen 0: [] -EVENT[875]: 0.066813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[876]: 0.066828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[877]: 0.066843775 - core[0].svIdle(17), plen 0: [] -EVENT[878]: 0.067669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[879]: 0.067682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[880]: 0.067698075 - core[1].svIdle(17), plen 0: [] -EVENT[881]: 0.067813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[882]: 0.067828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[883]: 0.067843825 - core[0].svIdle(17), plen 0: [] -EVENT[884]: 0.068669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[885]: 0.068682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[886]: 0.068698075 - core[1].svIdle(17), plen 0: [] -EVENT[887]: 0.068813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[888]: 0.068828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[889]: 0.068843775 - core[0].svIdle(17), plen 0: [] -EVENT[890]: 0.069669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[891]: 0.069682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[892]: 0.069698325 - core[1].svIdle(17), plen 0: [] -EVENT[893]: 0.069813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[894]: 0.069828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[895]: 0.069848100 - core[0].svIdle(17), plen 0: [] -EVENT[896]: 0.070669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[897]: 0.070682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[898]: 0.070698075 - core[1].svIdle(17), plen 0: [] -EVENT[899]: 0.070813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[900]: 0.070828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[901]: 0.070843775 - core[0].svIdle(17), plen 0: [] -EVENT[902]: 0.071669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[903]: 0.071682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[904]: 0.071698325 - core[1].svIdle(17), plen 0: [] -EVENT[905]: 0.071813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[906]: 0.071828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[907]: 0.071843775 - core[0].svIdle(17), plen 0: [] -EVENT[908]: 0.072669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[909]: 0.072682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[910]: 0.072698100 - core[1].svIdle(17), plen 0: [] -EVENT[911]: 0.072813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[912]: 0.072828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[913]: 0.072843775 - core[0].svIdle(17), plen 0: [] -EVENT[914]: 0.073669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[915]: 0.073682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[916]: 0.073698075 - core[1].svIdle(17), plen 0: [] -EVENT[917]: 0.073813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[918]: 0.073828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[919]: 0.073843825 - core[0].svIdle(17), plen 0: [] -EVENT[920]: 0.074669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[921]: 0.074682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[922]: 0.074698075 - core[1].svIdle(17), plen 0: [] -EVENT[923]: 0.074813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[924]: 0.074828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[925]: 0.074843775 - core[0].svIdle(17), plen 0: [] -EVENT[926]: 0.075669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[927]: 0.075682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[928]: 0.075698325 - core[1].svIdle(17), plen 0: [] -EVENT[929]: 0.075813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[930]: 0.075828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[931]: 0.075843775 - core[0].svIdle(17), plen 0: [] -EVENT[932]: 0.076669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[933]: 0.076682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[934]: 0.076698100 - core[1].svIdle(17), plen 0: [] -EVENT[935]: 0.076813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[936]: 0.076828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[937]: 0.076843775 - core[0].svIdle(17), plen 0: [] -EVENT[938]: 0.077669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[939]: 0.077682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[940]: 0.077698075 - core[1].svIdle(17), plen 0: [] -EVENT[941]: 0.077813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[942]: 0.077828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[943]: 0.077843825 - core[0].svIdle(17), plen 0: [] -EVENT[944]: 0.078669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[945]: 0.078682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[946]: 0.078698075 - core[1].svIdle(17), plen 0: [] -EVENT[947]: 0.078813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[948]: 0.078828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[949]: 0.078843775 - core[0].svIdle(17), plen 0: [] -EVENT[950]: 0.079669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[951]: 0.079682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[952]: 0.079698325 - core[1].svIdle(17), plen 0: [] -EVENT[953]: 0.079813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[954]: 0.079828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[955]: 0.079843775 - core[0].svIdle(17), plen 0: [] -EVENT[956]: 0.080669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[957]: 0.080682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[958]: 0.080698100 - core[1].svIdle(17), plen 0: [] -EVENT[959]: 0.080813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[960]: 0.080828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[961]: 0.080843775 - core[0].svIdle(17), plen 0: [] -EVENT[962]: 0.081669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[963]: 0.081682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[964]: 0.081698075 - core[1].svIdle(17), plen 0: [] -EVENT[965]: 0.081813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[966]: 0.081828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[967]: 0.081843825 - core[0].svIdle(17), plen 0: [] -EVENT[968]: 0.082669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[969]: 0.082682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[970]: 0.082698325 - core[1].svIdle(17), plen 0: [] -EVENT[971]: 0.082813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[972]: 0.082828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[973]: 0.082843775 - core[0].svIdle(17), plen 0: [] -EVENT[974]: 0.083669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[975]: 0.083682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[976]: 0.083698100 - core[1].svIdle(17), plen 0: [] -EVENT[977]: 0.083813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[978]: 0.083828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[979]: 0.083843775 - core[0].svIdle(17), plen 0: [] -EVENT[980]: 0.084669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[981]: 0.084682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[982]: 0.084698075 - core[1].svIdle(17), plen 0: [] -EVENT[983]: 0.084813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[984]: 0.084828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[985]: 0.084843825 - core[0].svIdle(17), plen 0: [] -EVENT[986]: 0.085669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[987]: 0.085682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[988]: 0.085698075 - core[1].svIdle(17), plen 0: [] -EVENT[989]: 0.085813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[990]: 0.085828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[991]: 0.085843775 - core[0].svIdle(17), plen 0: [] -EVENT[992]: 0.086669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[993]: 0.086682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[994]: 0.086698325 - core[1].svIdle(17), plen 0: [] -EVENT[995]: 0.086813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[996]: 0.086828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[997]: 0.086843775 - core[0].svIdle(17), plen 0: [] -EVENT[998]: 0.087669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[999]: 0.087682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1000]: 0.087698100 - core[1].svIdle(17), plen 0: [] -EVENT[1001]: 0.087813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1002]: 0.087828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1003]: 0.087843775 - core[0].svIdle(17), plen 0: [] -EVENT[1004]: 0.088669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1005]: 0.088682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1006]: 0.088698075 - core[1].svIdle(17), plen 0: [] -EVENT[1007]: 0.088813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1008]: 0.088828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1009]: 0.088843825 - core[0].svIdle(17), plen 0: [] -EVENT[1010]: 0.089669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1011]: 0.089682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1012]: 0.089698075 - core[1].svIdle(17), plen 0: [] -EVENT[1013]: 0.089813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1014]: 0.089828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1015]: 0.089843775 - core[0].svIdle(17), plen 0: [] -EVENT[1016]: 0.090669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1017]: 0.090682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1018]: 0.090698325 - core[1].svIdle(17), plen 0: [] -EVENT[1019]: 0.090813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1020]: 0.090828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1021]: 0.090843775 - core[0].svIdle(17), plen 0: [] -EVENT[1022]: 0.091669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1023]: 0.091682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1024]: 0.091698100 - core[1].svIdle(17), plen 0: [] -EVENT[1025]: 0.091813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1026]: 0.091828325 - core[0].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[1027]: 0.091828325 - core[1].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[1028]: 0.091840975 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1029]: 0.091856650 - core[0].svTaskStartExec(4), plen 0: [tid: 12286700] -EVENT[1030]: 0.091892175 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461128, size: 4, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.091892175] HEAP: Allocated 4 bytes @ 0x3ffbb788 from task "alloc0" on core 0 by: +EVENT[844]: 0.064017600 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[845]: 0.064036500 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[846]: 0.064047725 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[847]: 0.064058500 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[848]: 0.064076650 - core[1].svIdle(17), plen 0: [] +EVENT[849]: 0.064104450 - core[0].svPrint(26), plen 70: [msg: I (359) example: Task[0x3ffba1a4]: allocated 18 bytes @ 0x3ffbaf60 +, lvl: 0, unused: 0] +[0.064104450] LOG: I (359) example: Task[0x3ffba1a4]: allocated 18 bytes @ 0x3ffbaf60 +EVENT[850]: 0.064122050 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12296968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[851]: 0.064135300 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[852]: 0.064135300 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[853]: 0.064151650 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[854]: 0.064162500 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[855]: 0.064173325 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[856]: 0.064187250 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[857]: 0.064198150 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[858]: 0.064209025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[859]: 0.064220950 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12296968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[860]: 0.064232175 - core[0].svIdle(17), plen 0: [] +EVENT[861]: 0.064244000 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[862]: 0.064260225 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[863]: 0.064308100 - core[1].svPrint(26), plen 63: [msg: I (359) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf60 +, lvl: 0, unused: 0] +[0.064308100] LOG: I (359) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf60 +EVENT[864]: 0.064329500 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459040, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.064329500] HEAP: Freed bytes @ 0x3ffbaf60 from task "free2" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 +/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 +/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 + +EVENT[865]: 0.064360850 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[866]: 0.064372300 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[867]: 0.064389000 - core[1].svIdle(17), plen 0: [] +EVENT[868]: 0.064425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[869]: 0.064439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[870]: 0.064455150 - core[1].svIdle(17), plen 0: [] +EVENT[871]: 0.064546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[872]: 0.064562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[873]: 0.064577425 - core[0].svIdle(17), plen 0: [] +EVENT[874]: 0.065425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[875]: 0.065439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[876]: 0.065454550 - core[1].svIdle(17), plen 0: [] +EVENT[877]: 0.065546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[878]: 0.065562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[879]: 0.065577125 - core[0].svIdle(17), plen 0: [] +EVENT[880]: 0.066425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[881]: 0.066439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[882]: 0.066454675 - core[1].svIdle(17), plen 0: [] +EVENT[883]: 0.066546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[884]: 0.066562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[885]: 0.066577150 - core[0].svIdle(17), plen 0: [] +EVENT[886]: 0.067425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[887]: 0.067439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[888]: 0.067454600 - core[1].svIdle(17), plen 0: [] +EVENT[889]: 0.067546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[890]: 0.067562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[891]: 0.067577125 - core[0].svIdle(17), plen 0: [] +EVENT[892]: 0.068425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[893]: 0.068439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[894]: 0.068454550 - core[1].svIdle(17), plen 0: [] +EVENT[895]: 0.068546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[896]: 0.068562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[897]: 0.068577425 - core[0].svIdle(17), plen 0: [] +EVENT[898]: 0.069425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[899]: 0.069439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[900]: 0.069454550 - core[1].svIdle(17), plen 0: [] +EVENT[901]: 0.069546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[902]: 0.069562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[903]: 0.069577125 - core[0].svIdle(17), plen 0: [] +EVENT[904]: 0.070425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[905]: 0.070439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[906]: 0.070454675 - core[1].svIdle(17), plen 0: [] +EVENT[907]: 0.070546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[908]: 0.070562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[909]: 0.070577150 - core[0].svIdle(17), plen 0: [] +EVENT[910]: 0.071425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[911]: 0.071439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[912]: 0.071454600 - core[1].svIdle(17), plen 0: [] +EVENT[913]: 0.071546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[914]: 0.071562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[915]: 0.071577125 - core[0].svIdle(17), plen 0: [] +EVENT[916]: 0.072425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[917]: 0.072439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[918]: 0.072454550 - core[1].svIdle(17), plen 0: [] +EVENT[919]: 0.072546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[920]: 0.072562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[921]: 0.072577425 - core[0].svIdle(17), plen 0: [] +EVENT[922]: 0.073425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[923]: 0.073439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[924]: 0.073454550 - core[1].svIdle(17), plen 0: [] +EVENT[925]: 0.073546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[926]: 0.073562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[927]: 0.073577125 - core[0].svIdle(17), plen 0: [] +EVENT[928]: 0.074425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[929]: 0.074443775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[930]: 0.074458900 - core[1].svIdle(17), plen 0: [] +EVENT[931]: 0.074546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[932]: 0.074562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[933]: 0.074577125 - core[0].svIdle(17), plen 0: [] +EVENT[934]: 0.075425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[935]: 0.075439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[936]: 0.075454550 - core[1].svIdle(17), plen 0: [] +EVENT[937]: 0.075546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[938]: 0.075562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[939]: 0.075577425 - core[0].svIdle(17), plen 0: [] +EVENT[940]: 0.076425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[941]: 0.076439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[942]: 0.076454550 - core[1].svIdle(17), plen 0: [] +EVENT[943]: 0.076546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[944]: 0.076562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[945]: 0.076577125 - core[0].svIdle(17), plen 0: [] +EVENT[946]: 0.077425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[947]: 0.077439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[948]: 0.077454675 - core[1].svIdle(17), plen 0: [] +EVENT[949]: 0.077546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[950]: 0.077562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[951]: 0.077577150 - core[0].svIdle(17), plen 0: [] +EVENT[952]: 0.078425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[953]: 0.078439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[954]: 0.078454600 - core[1].svIdle(17), plen 0: [] +EVENT[955]: 0.078546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[956]: 0.078562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[957]: 0.078577125 - core[0].svIdle(17), plen 0: [] +EVENT[958]: 0.079425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[959]: 0.079439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[960]: 0.079454550 - core[1].svIdle(17), plen 0: [] +EVENT[961]: 0.079546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[962]: 0.079562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[963]: 0.079577425 - core[0].svIdle(17), plen 0: [] +EVENT[964]: 0.080425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[965]: 0.080439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[966]: 0.080454550 - core[1].svIdle(17), plen 0: [] +EVENT[967]: 0.080546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[968]: 0.080562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[969]: 0.080577125 - core[0].svIdle(17), plen 0: [] +EVENT[970]: 0.081425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[971]: 0.081439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[972]: 0.081454675 - core[1].svIdle(17), plen 0: [] +EVENT[973]: 0.081546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[974]: 0.081562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[975]: 0.081577150 - core[0].svIdle(17), plen 0: [] +EVENT[976]: 0.082425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[977]: 0.082439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[978]: 0.082454600 - core[1].svIdle(17), plen 0: [] +EVENT[979]: 0.082546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[980]: 0.082562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[981]: 0.082577125 - core[0].svIdle(17), plen 0: [] +EVENT[982]: 0.083425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[983]: 0.083439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[984]: 0.083454550 - core[1].svIdle(17), plen 0: [] +EVENT[985]: 0.083546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[986]: 0.083562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[987]: 0.083577425 - core[0].svIdle(17), plen 0: [] +EVENT[988]: 0.084425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[989]: 0.084439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[990]: 0.084454550 - core[1].svIdle(17), plen 0: [] +EVENT[991]: 0.084546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[992]: 0.084562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[993]: 0.084577125 - core[0].svIdle(17), plen 0: [] +EVENT[994]: 0.085425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[995]: 0.085439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[996]: 0.085454675 - core[1].svIdle(17), plen 0: [] +EVENT[997]: 0.085546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[998]: 0.085562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[999]: 0.085577150 - core[0].svIdle(17), plen 0: [] +EVENT[1000]: 0.086425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1001]: 0.086443675 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1002]: 0.086458825 - core[1].svIdle(17), plen 0: [] +EVENT[1003]: 0.086546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1004]: 0.086562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1005]: 0.086577125 - core[0].svIdle(17), plen 0: [] +EVENT[1006]: 0.087425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1007]: 0.087439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1008]: 0.087454550 - core[1].svIdle(17), plen 0: [] +EVENT[1009]: 0.087546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1010]: 0.087562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1011]: 0.087577425 - core[0].svIdle(17), plen 0: [] +EVENT[1012]: 0.088425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1013]: 0.088439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1014]: 0.088454550 - core[1].svIdle(17), plen 0: [] +EVENT[1015]: 0.088546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1016]: 0.088562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1017]: 0.088577125 - core[0].svIdle(17), plen 0: [] +EVENT[1018]: 0.089425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1019]: 0.089439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1020]: 0.089454675 - core[1].svIdle(17), plen 0: [] +EVENT[1021]: 0.089546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1022]: 0.089562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1023]: 0.089577150 - core[0].svIdle(17), plen 0: [] +EVENT[1024]: 0.090425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1025]: 0.090439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1026]: 0.090454600 - core[1].svIdle(17), plen 0: [] +EVENT[1027]: 0.090546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1028]: 0.090562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1029]: 0.090577125 - core[0].svIdle(17), plen 0: [] +EVENT[1030]: 0.091425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1031]: 0.091439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1032]: 0.091454550 - core[1].svIdle(17), plen 0: [] +EVENT[1033]: 0.091546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1034]: 0.091562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1035]: 0.091577425 - core[0].svIdle(17), plen 0: [] +EVENT[1036]: 0.092425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1037]: 0.092439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1038]: 0.092454550 - core[1].svIdle(17), plen 0: [] +EVENT[1039]: 0.092546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1040]: 0.092561650 - core[0].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[1041]: 0.092561650 - core[1].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[1042]: 0.092574300 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1043]: 0.092590225 - core[0].svTaskStartExec(4), plen 0: [tid: 12284596] +EVENT[1044]: 0.092625300 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459008, size: 4, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.092625300] HEAP: Allocated 4 bytes @ 0x3ffbaf40 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1031]: 0.091930000 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461144, size: 8, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.091930000] HEAP: Allocated 8 bytes @ 0x3ffbb798 from task "alloc0" on core 0 by: +EVENT[1045]: 0.092660875 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459040, size: 8, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.092660875] HEAP: Allocated 8 bytes @ 0x3ffbaf60 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1032]: 0.091946900 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1033]: 0.091962875 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1034]: 0.092027050 - core[0].svPrint(26), plen 69: [msg: I (400) example: Task[0x3ffb7aec]: allocated 8 bytes @ 0x3ffbb798 +EVENT[1046]: 0.092677850 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1047]: 0.092693825 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1048]: 0.092750600 - core[0].svPrint(26), plen 69: [msg: I (388) example: Task[0x3ffb72b4]: allocated 8 bytes @ 0x3ffbaf60 , lvl: 0, unused: 0] -[0.092027050] LOG: I (400) example: Task[0x3ffb7aec]: allocated 8 bytes @ 0x3ffbb798 -EVENT[1035]: 0.092040625 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12287056, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1036]: 0.092053750 - core[0].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[1037]: 0.092053750 - core[1].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[1038]: 0.092069950 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1039]: 0.092080825 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1040]: 0.092091600 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1041]: 0.092105500 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1042]: 0.092116300 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[1043]: 0.092127150 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1044]: 0.092139050 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12287056, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1045]: 0.092149275 - core[0].svIdle(17), plen 0: [] -EVENT[1046]: 0.092160725 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1047]: 0.092181000 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1048]: 0.092244550 - core[1].svPrint(26), plen 63: [msg: I (400) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb798 +[0.092750600] LOG: I (388) example: Task[0x3ffb72b4]: allocated 8 bytes @ 0x3ffbaf60 +EVENT[1049]: 0.092764050 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12284952, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1050]: 0.092777275 - core[0].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[1051]: 0.092777275 - core[1].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[1052]: 0.092793525 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1053]: 0.092804475 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1054]: 0.092815225 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1055]: 0.092828975 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1056]: 0.092839700 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[1057]: 0.092850500 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1058]: 0.092862500 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12284952, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1059]: 0.092872725 - core[0].svIdle(17), plen 0: [] +EVENT[1060]: 0.092884475 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1061]: 0.092900750 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1062]: 0.092948525 - core[1].svPrint(26), plen 63: [msg: I (388) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf60 , lvl: 0, unused: 0] -[0.092244550] LOG: I (400) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb798 -EVENT[1049]: 0.092265750 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461144, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.092265750] HEAP: Freed bytes @ 0x3ffbb798 from task "free0" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.092948525] LOG: I (388) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf60 +EVENT[1063]: 0.092969900 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459040, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.092969900] HEAP: Freed bytes @ 0x3ffbaf60 from task "free0" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1050]: 0.092292625 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1051]: 0.092304050 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1052]: 0.092320625 - core[1].svIdle(17), plen 0: [] -EVENT[1053]: 0.092669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1054]: 0.092682950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1055]: 0.092698525 - core[1].svIdle(17), plen 0: [] -EVENT[1056]: 0.092813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1057]: 0.092828325 - core[0].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[1058]: 0.092828325 - core[1].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[1059]: 0.092840975 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1060]: 0.092856775 - core[0].svTaskStartExec(4), plen 0: [tid: 12292716] -EVENT[1061]: 0.092892175 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461144, size: 8, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.092892175] HEAP: Allocated 8 bytes @ 0x3ffbb798 from task "alloc1" on core 0 by: +EVENT[1064]: 0.093001350 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1065]: 0.093012800 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1066]: 0.093029500 - core[1].svIdle(17), plen 0: [] +EVENT[1067]: 0.093425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1068]: 0.093439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1069]: 0.093455150 - core[1].svIdle(17), plen 0: [] +EVENT[1070]: 0.093546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1071]: 0.093561700 - core[0].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[1072]: 0.093561700 - core[1].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[1073]: 0.093573550 - core[0].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[1074]: 0.093573550 - core[1].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[1075]: 0.093586050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1076]: 0.093601725 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[1077]: 0.093638150 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459040, size: 8, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.093638150] HEAP: Allocated 8 bytes @ 0x3ffbaf60 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1062]: 0.092926700 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461160, size: 16, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.092926700] HEAP: Allocated 16 bytes @ 0x3ffbb7a8 from task "alloc1" on core 0 by: +EVENT[1078]: 0.093673575 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459056, size: 16, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.093673575] HEAP: Allocated 16 bytes @ 0x3ffbaf70 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1063]: 0.092943650 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1064]: 0.092963825 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1065]: 0.093030300 - core[0].svPrint(26), plen 70: [msg: I (401) example: Task[0x3ffb926c]: allocated 16 bytes @ 0x3ffbb7a8 +EVENT[1079]: 0.093690525 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1080]: 0.093706525 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1081]: 0.093761375 - core[0].svPrint(26), plen 70: [msg: I (389) example: Task[0x3ffb8a34]: allocated 16 bytes @ 0x3ffbaf70 , lvl: 0, unused: 0] -[0.093030300] LOG: I (401) example: Task[0x3ffb926c]: allocated 16 bytes @ 0x3ffbb7a8 -EVENT[1066]: 0.093043950 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12293072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1067]: 0.093057125 - core[0].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[1068]: 0.093057125 - core[1].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[1069]: 0.093073450 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1070]: 0.093084300 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1071]: 0.093095050 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1072]: 0.093108775 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1073]: 0.093119625 - core[1].svTaskStartExec(4), plen 0: [tid: 12295764] -EVENT[1074]: 0.093130450 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1075]: 0.093142300 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12293072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1076]: 0.093152575 - core[0].svIdle(17), plen 0: [] -EVENT[1077]: 0.093164050 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1078]: 0.093180350 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1079]: 0.093243800 - core[1].svPrint(26), plen 63: [msg: I (401) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb7a8 -, lvl: 0, unused: 0] -[0.093243800] LOG: I (401) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb7a8 -EVENT[1080]: 0.093268825 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461160, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.093268825] HEAP: Freed bytes @ 0x3ffbb7a8 from task "free1" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 -/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 -/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 - -EVENT[1081]: 0.093295825 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1082]: 0.093307375 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1083]: 0.093323950 - core[1].svIdle(17), plen 0: [] -EVENT[1084]: 0.093669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1085]: 0.093682950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1086]: 0.093698525 - core[1].svIdle(17), plen 0: [] -EVENT[1087]: 0.093813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1088]: 0.093828325 - core[0].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[1089]: 0.093828325 - core[1].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[1090]: 0.093840975 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1091]: 0.093856650 - core[0].svTaskStartExec(4), plen 0: [tid: 12298716] -EVENT[1092]: 0.093892000 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461160, size: 12, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.093892000] HEAP: Allocated 12 bytes @ 0x3ffbb7a8 from task "alloc2" on core 0 by: +[0.093761375] LOG: I (389) example: Task[0x3ffb8a34]: allocated 16 bytes @ 0x3ffbaf70 +EVENT[1082]: 0.093778675 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12290968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1083]: 0.093791925 - core[0].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[1084]: 0.093791925 - core[1].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[1085]: 0.093808275 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1086]: 0.093819125 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1087]: 0.093829950 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1088]: 0.093843750 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1089]: 0.093855475 - core[1].svTaskStartExec(4), plen 0: [tid: 12293660] +EVENT[1090]: 0.093866850 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1091]: 0.093878850 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12290968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1092]: 0.093890525 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[1093]: 0.093903125 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1094]: 0.093921750 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1095]: 0.093933750 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459076, size: 12, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.093933750] HEAP: Allocated 12 bytes @ 0x3ffbaf84 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1093]: 0.093926400 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461176, size: 24, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.093926400] HEAP: Allocated 24 bytes @ 0x3ffbb7b8 from task "alloc2" on core 0 by: +EVENT[1096]: 0.093974800 - core[1].svPrint(26), plen 63: [msg: I (389) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf70 +, lvl: 0, unused: 0] +[0.093974800] LOG: I (389) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf70 +EVENT[1097]: 0.093990750 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459092, size: 24, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.093990750] HEAP: Allocated 24 bytes @ 0x3ffbaf94 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1094]: 0.093943300 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1095]: 0.093959425 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1096]: 0.094029750 - core[0].svPrint(26), plen 70: [msg: I (402) example: Task[0x3ffba9dc]: allocated 24 bytes @ 0x3ffbb7b8 -, lvl: 0, unused: 0] -[0.094029750] LOG: I (402) example: Task[0x3ffba9dc]: allocated 24 bytes @ 0x3ffbb7b8 -EVENT[1097]: 0.094047575 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12299072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1098]: 0.094060800 - core[0].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[1099]: 0.094060800 - core[1].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[1100]: 0.094077125 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1101]: 0.094087975 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1102]: 0.094098725 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1103]: 0.094112450 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1104]: 0.094123350 - core[1].svTaskStartExec(4), plen 0: [tid: 12301764] -EVENT[1105]: 0.094134175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1106]: 0.094146025 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12299072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1107]: 0.094157325 - core[0].svIdle(17), plen 0: [] -EVENT[1108]: 0.094168950 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1109]: 0.094185350 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1110]: 0.094248900 - core[1].svPrint(26), plen 63: [msg: I (402) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb7b8 -, lvl: 0, unused: 0] -[0.094248900] LOG: I (402) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb7b8 -EVENT[1111]: 0.094270100 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461176, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.094270100] HEAP: Freed bytes @ 0x3ffbb7b8 from task "free2" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +EVENT[1098]: 0.094005125 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459056, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.094005125] HEAP: Freed bytes @ 0x3ffbaf70 from task "free1" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1112]: 0.094301100 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1113]: 0.094312575 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1114]: 0.094329275 - core[1].svIdle(17), plen 0: [] -EVENT[1115]: 0.094669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1116]: 0.094682850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1117]: 0.094698425 - core[1].svIdle(17), plen 0: [] -EVENT[1118]: 0.094813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1119]: 0.094828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1120]: 0.094843825 - core[0].svIdle(17), plen 0: [] -EVENT[1121]: 0.095669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1122]: 0.095682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1123]: 0.095698075 - core[1].svIdle(17), plen 0: [] -EVENT[1124]: 0.095813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1125]: 0.095828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1126]: 0.095843775 - core[0].svIdle(17), plen 0: [] -EVENT[1127]: 0.096669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1128]: 0.096682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1129]: 0.096698325 - core[1].svIdle(17), plen 0: [] -EVENT[1130]: 0.096813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1131]: 0.096828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1132]: 0.096843775 - core[0].svIdle(17), plen 0: [] -EVENT[1133]: 0.097669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1134]: 0.097682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1135]: 0.097698100 - core[1].svIdle(17), plen 0: [] -EVENT[1136]: 0.097813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1137]: 0.097828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1138]: 0.097843775 - core[0].svIdle(17), plen 0: [] -EVENT[1139]: 0.098669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1140]: 0.098682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1141]: 0.098698075 - core[1].svIdle(17), plen 0: [] -EVENT[1142]: 0.098813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1143]: 0.098828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1144]: 0.098843825 - core[0].svIdle(17), plen 0: [] -EVENT[1145]: 0.099669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1146]: 0.099682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1147]: 0.099698075 - core[1].svIdle(17), plen 0: [] -EVENT[1148]: 0.099813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1149]: 0.099828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1150]: 0.099843775 - core[0].svIdle(17), plen 0: [] -EVENT[1151]: 0.100669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1152]: 0.100682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1153]: 0.100698325 - core[1].svIdle(17), plen 0: [] -EVENT[1154]: 0.100813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1155]: 0.100828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1156]: 0.100843775 - core[0].svIdle(17), plen 0: [] -EVENT[1157]: 0.101669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1158]: 0.101682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1159]: 0.101698100 - core[1].svIdle(17), plen 0: [] -EVENT[1160]: 0.101813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1161]: 0.101828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1162]: 0.101843775 - core[0].svIdle(17), plen 0: [] -EVENT[1163]: 0.102669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1164]: 0.102682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1165]: 0.102698075 - core[1].svIdle(17), plen 0: [] -EVENT[1166]: 0.102813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1167]: 0.102828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1168]: 0.102843825 - core[0].svIdle(17), plen 0: [] -EVENT[1169]: 0.103669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1170]: 0.103682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1171]: 0.103698075 - core[1].svIdle(17), plen 0: [] -EVENT[1172]: 0.103813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1173]: 0.103828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1174]: 0.103843775 - core[0].svIdle(17), plen 0: [] -EVENT[1175]: 0.104669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1176]: 0.104686550 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1177]: 0.104701825 - core[1].svIdle(17), plen 0: [] -EVENT[1178]: 0.104813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1179]: 0.104828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1180]: 0.104843775 - core[0].svIdle(17), plen 0: [] -EVENT[1181]: 0.105669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1182]: 0.105682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1183]: 0.105698075 - core[1].svIdle(17), plen 0: [] -EVENT[1184]: 0.105813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1185]: 0.105828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1186]: 0.105843825 - core[0].svIdle(17), plen 0: [] -EVENT[1187]: 0.106669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1188]: 0.106682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1189]: 0.106698075 - core[1].svIdle(17), plen 0: [] -EVENT[1190]: 0.106813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1191]: 0.106828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1192]: 0.106843775 - core[0].svIdle(17), plen 0: [] -EVENT[1193]: 0.107669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1194]: 0.107682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1195]: 0.107698325 - core[1].svIdle(17), plen 0: [] -EVENT[1196]: 0.107813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1197]: 0.107828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1198]: 0.107843775 - core[0].svIdle(17), plen 0: [] -EVENT[1199]: 0.108669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1200]: 0.108682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1201]: 0.108698100 - core[1].svIdle(17), plen 0: [] -EVENT[1202]: 0.108813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1203]: 0.108828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1204]: 0.108843775 - core[0].svIdle(17), plen 0: [] -EVENT[1205]: 0.109669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1206]: 0.109682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1207]: 0.109698075 - core[1].svIdle(17), plen 0: [] -EVENT[1208]: 0.109813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1209]: 0.109828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1210]: 0.109843825 - core[0].svIdle(17), plen 0: [] -EVENT[1211]: 0.110669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1212]: 0.110682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1213]: 0.110698075 - core[1].svIdle(17), plen 0: [] -EVENT[1214]: 0.110813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1215]: 0.110828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1216]: 0.110843775 - core[0].svIdle(17), plen 0: [] -EVENT[1217]: 0.111669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1218]: 0.111682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1219]: 0.111698325 - core[1].svIdle(17), plen 0: [] -EVENT[1220]: 0.111813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1221]: 0.111828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1222]: 0.111843775 - core[0].svIdle(17), plen 0: [] -EVENT[1223]: 0.112669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1224]: 0.112682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1225]: 0.112698100 - core[1].svIdle(17), plen 0: [] -EVENT[1226]: 0.112813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1227]: 0.112828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1228]: 0.112843775 - core[0].svIdle(17), plen 0: [] -EVENT[1229]: 0.113669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1230]: 0.113682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1231]: 0.113698075 - core[1].svIdle(17), plen 0: [] -EVENT[1232]: 0.113813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1233]: 0.113828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1234]: 0.113843825 - core[0].svIdle(17), plen 0: [] -EVENT[1235]: 0.114669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1236]: 0.114682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1237]: 0.114698075 - core[1].svIdle(17), plen 0: [] -EVENT[1238]: 0.114813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1239]: 0.114828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1240]: 0.114843775 - core[0].svIdle(17), plen 0: [] -EVENT[1241]: 0.115669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1242]: 0.115682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1243]: 0.115698325 - core[1].svIdle(17), plen 0: [] -EVENT[1244]: 0.115813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1245]: 0.115828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1246]: 0.115843775 - core[0].svIdle(17), plen 0: [] -EVENT[1247]: 0.116669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1248]: 0.116687200 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1249]: 0.116702350 - core[1].svIdle(17), plen 0: [] -EVENT[1250]: 0.116813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1251]: 0.116828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1252]: 0.116843775 - core[0].svIdle(17), plen 0: [] -EVENT[1253]: 0.117669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1254]: 0.117682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1255]: 0.117698075 - core[1].svIdle(17), plen 0: [] -EVENT[1256]: 0.117813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1257]: 0.117828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1258]: 0.117843825 - core[0].svIdle(17), plen 0: [] -EVENT[1259]: 0.118669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1260]: 0.118682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1261]: 0.118698075 - core[1].svIdle(17), plen 0: [] -EVENT[1262]: 0.118813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1263]: 0.118828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1264]: 0.118843775 - core[0].svIdle(17), plen 0: [] -EVENT[1265]: 0.119669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1266]: 0.119682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1267]: 0.119698325 - core[1].svIdle(17), plen 0: [] -EVENT[1268]: 0.119813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1269]: 0.119828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1270]: 0.119843775 - core[0].svIdle(17), plen 0: [] -EVENT[1271]: 0.120669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1272]: 0.120682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1273]: 0.120698100 - core[1].svIdle(17), plen 0: [] -EVENT[1274]: 0.120813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1275]: 0.120828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1276]: 0.120843775 - core[0].svIdle(17), plen 0: [] -EVENT[1277]: 0.121669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1278]: 0.121682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1279]: 0.121698075 - core[1].svIdle(17), plen 0: [] -EVENT[1280]: 0.121813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1281]: 0.121828225 - core[0].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[1282]: 0.121828225 - core[1].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[1283]: 0.121840850 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1284]: 0.121856525 - core[0].svTaskStartExec(4), plen 0: [tid: 12286700] -EVENT[1285]: 0.121891850 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461176, size: 5, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.121891850] HEAP: Allocated 5 bytes @ 0x3ffbb7b8 from task "alloc0" on core 0 by: +EVENT[1099]: 0.094017575 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1100]: 0.094036725 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1101]: 0.094047975 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1102]: 0.094058825 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1103]: 0.094077100 - core[1].svIdle(17), plen 0: [] +EVENT[1104]: 0.094104950 - core[0].svPrint(26), plen 70: [msg: I (389) example: Task[0x3ffba1a4]: allocated 24 bytes @ 0x3ffbaf94 +, lvl: 0, unused: 0] +[0.094104950] LOG: I (389) example: Task[0x3ffba1a4]: allocated 24 bytes @ 0x3ffbaf94 +EVENT[1105]: 0.094118375 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12296968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1106]: 0.094135775 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[1107]: 0.094135775 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[1108]: 0.094152125 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1109]: 0.094162975 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1110]: 0.094173800 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1111]: 0.094187600 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1112]: 0.094198350 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[1113]: 0.094209150 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1114]: 0.094221100 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12296968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1115]: 0.094232325 - core[0].svIdle(17), plen 0: [] +EVENT[1116]: 0.094244150 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1117]: 0.094260400 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1118]: 0.094308175 - core[1].svPrint(26), plen 63: [msg: I (389) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf94 +, lvl: 0, unused: 0] +[0.094308175] LOG: I (389) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf94 +EVENT[1119]: 0.094329550 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459092, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.094329550] HEAP: Freed bytes @ 0x3ffbaf94 from task "free2" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 +/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 +/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 + +EVENT[1120]: 0.094356975 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1121]: 0.094368375 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1122]: 0.094384950 - core[1].svIdle(17), plen 0: [] +EVENT[1123]: 0.094425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1124]: 0.094439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1125]: 0.094455150 - core[1].svIdle(17), plen 0: [] +EVENT[1126]: 0.094546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1127]: 0.094562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1128]: 0.094577125 - core[0].svIdle(17), plen 0: [] +EVENT[1129]: 0.095425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1130]: 0.095439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1131]: 0.095454550 - core[1].svIdle(17), plen 0: [] +EVENT[1132]: 0.095546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1133]: 0.095562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1134]: 0.095577425 - core[0].svIdle(17), plen 0: [] +EVENT[1135]: 0.096425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1136]: 0.096439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1137]: 0.096454550 - core[1].svIdle(17), plen 0: [] +EVENT[1138]: 0.096546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1139]: 0.096566350 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1140]: 0.096581550 - core[0].svIdle(17), plen 0: [] +EVENT[1141]: 0.097425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1142]: 0.097439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1143]: 0.097454550 - core[1].svIdle(17), plen 0: [] +EVENT[1144]: 0.097546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1145]: 0.097562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1146]: 0.097577125 - core[0].svIdle(17), plen 0: [] +EVENT[1147]: 0.098425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1148]: 0.098439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1149]: 0.098454675 - core[1].svIdle(17), plen 0: [] +EVENT[1150]: 0.098546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1151]: 0.098562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1152]: 0.098577150 - core[0].svIdle(17), plen 0: [] +EVENT[1153]: 0.099425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1154]: 0.099439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1155]: 0.099454600 - core[1].svIdle(17), plen 0: [] +EVENT[1156]: 0.099546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1157]: 0.099562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1158]: 0.099577125 - core[0].svIdle(17), plen 0: [] +EVENT[1159]: 0.100425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1160]: 0.100439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1161]: 0.100454550 - core[1].svIdle(17), plen 0: [] +EVENT[1162]: 0.100546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1163]: 0.100562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1164]: 0.100577425 - core[0].svIdle(17), plen 0: [] +EVENT[1165]: 0.101425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1166]: 0.101439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1167]: 0.101454550 - core[1].svIdle(17), plen 0: [] +EVENT[1168]: 0.101546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1169]: 0.101562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1170]: 0.101577125 - core[0].svIdle(17), plen 0: [] +EVENT[1171]: 0.102425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1172]: 0.102439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1173]: 0.102454675 - core[1].svIdle(17), plen 0: [] +EVENT[1174]: 0.102546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1175]: 0.102562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1176]: 0.102577150 - core[0].svIdle(17), plen 0: [] +EVENT[1177]: 0.103425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1178]: 0.103439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1179]: 0.103454600 - core[1].svIdle(17), plen 0: [] +EVENT[1180]: 0.103546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1181]: 0.103562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1182]: 0.103577125 - core[0].svIdle(17), plen 0: [] +EVENT[1183]: 0.104425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1184]: 0.104439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1185]: 0.104454550 - core[1].svIdle(17), plen 0: [] +EVENT[1186]: 0.104546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1187]: 0.104562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1188]: 0.104577425 - core[0].svIdle(17), plen 0: [] +EVENT[1189]: 0.105425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1190]: 0.105439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1191]: 0.105454550 - core[1].svIdle(17), plen 0: [] +EVENT[1192]: 0.105546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1193]: 0.105562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1194]: 0.105577125 - core[0].svIdle(17), plen 0: [] +EVENT[1195]: 0.106425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1196]: 0.106439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1197]: 0.106454675 - core[1].svIdle(17), plen 0: [] +EVENT[1198]: 0.106546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1199]: 0.106562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1200]: 0.106577150 - core[0].svIdle(17), plen 0: [] +EVENT[1201]: 0.107425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1202]: 0.107439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1203]: 0.107454600 - core[1].svIdle(17), plen 0: [] +EVENT[1204]: 0.107546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1205]: 0.107562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1206]: 0.107577125 - core[0].svIdle(17), plen 0: [] +EVENT[1207]: 0.108425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1208]: 0.108439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1209]: 0.108454550 - core[1].svIdle(17), plen 0: [] +EVENT[1210]: 0.108546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1211]: 0.108566325 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1212]: 0.108581550 - core[0].svIdle(17), plen 0: [] +EVENT[1213]: 0.109425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1214]: 0.109439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1215]: 0.109454550 - core[1].svIdle(17), plen 0: [] +EVENT[1216]: 0.109546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1217]: 0.109562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1218]: 0.109577125 - core[0].svIdle(17), plen 0: [] +EVENT[1219]: 0.110425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1220]: 0.110439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1221]: 0.110454675 - core[1].svIdle(17), plen 0: [] +EVENT[1222]: 0.110546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1223]: 0.110562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1224]: 0.110577150 - core[0].svIdle(17), plen 0: [] +EVENT[1225]: 0.111425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1226]: 0.111439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1227]: 0.111454600 - core[1].svIdle(17), plen 0: [] +EVENT[1228]: 0.111546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1229]: 0.111562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1230]: 0.111577125 - core[0].svIdle(17), plen 0: [] +EVENT[1231]: 0.112425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1232]: 0.112439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1233]: 0.112454550 - core[1].svIdle(17), plen 0: [] +EVENT[1234]: 0.112546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1235]: 0.112562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1236]: 0.112577425 - core[0].svIdle(17), plen 0: [] +EVENT[1237]: 0.113425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1238]: 0.113439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1239]: 0.113454550 - core[1].svIdle(17), plen 0: [] +EVENT[1240]: 0.113546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1241]: 0.113562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1242]: 0.113577125 - core[0].svIdle(17), plen 0: [] +EVENT[1243]: 0.114425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1244]: 0.114439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1245]: 0.114454675 - core[1].svIdle(17), plen 0: [] +EVENT[1246]: 0.114546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1247]: 0.114562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1248]: 0.114577150 - core[0].svIdle(17), plen 0: [] +EVENT[1249]: 0.115425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1250]: 0.115439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1251]: 0.115454600 - core[1].svIdle(17), plen 0: [] +EVENT[1252]: 0.115546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1253]: 0.115562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1254]: 0.115577125 - core[0].svIdle(17), plen 0: [] +EVENT[1255]: 0.116425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1256]: 0.116439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1257]: 0.116454550 - core[1].svIdle(17), plen 0: [] +EVENT[1258]: 0.116546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1259]: 0.116562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1260]: 0.116577425 - core[0].svIdle(17), plen 0: [] +EVENT[1261]: 0.117425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1262]: 0.117439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1263]: 0.117454550 - core[1].svIdle(17), plen 0: [] +EVENT[1264]: 0.117546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1265]: 0.117562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1266]: 0.117577125 - core[0].svIdle(17), plen 0: [] +EVENT[1267]: 0.118425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1268]: 0.118439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1269]: 0.118454675 - core[1].svIdle(17), plen 0: [] +EVENT[1270]: 0.118546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1271]: 0.118562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1272]: 0.118577150 - core[0].svIdle(17), plen 0: [] +EVENT[1273]: 0.119425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1274]: 0.119439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1275]: 0.119454600 - core[1].svIdle(17), plen 0: [] +EVENT[1276]: 0.119546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1277]: 0.119562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1278]: 0.119577125 - core[0].svIdle(17), plen 0: [] +EVENT[1279]: 0.120425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1280]: 0.120439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1281]: 0.120454550 - core[1].svIdle(17), plen 0: [] +EVENT[1282]: 0.120546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1283]: 0.120566325 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1284]: 0.120581550 - core[0].svIdle(17), plen 0: [] +EVENT[1285]: 0.121425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1286]: 0.121439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1287]: 0.121454550 - core[1].svIdle(17), plen 0: [] +EVENT[1288]: 0.121546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1289]: 0.121562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1290]: 0.121577125 - core[0].svIdle(17), plen 0: [] +EVENT[1291]: 0.122425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1292]: 0.122439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1293]: 0.122454675 - core[1].svIdle(17), plen 0: [] +EVENT[1294]: 0.122546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1295]: 0.122561675 - core[0].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[1296]: 0.122561675 - core[1].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[1297]: 0.122574250 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1298]: 0.122589925 - core[0].svTaskStartExec(4), plen 0: [tid: 12284596] +EVENT[1299]: 0.122624925 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459056, size: 5, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.122624925] HEAP: Allocated 5 bytes @ 0x3ffbaf70 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1286]: 0.121926275 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461192, size: 10, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.121926275] HEAP: Allocated 10 bytes @ 0x3ffbb7c8 from task "alloc0" on core 0 by: +EVENT[1300]: 0.122660425 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459092, size: 10, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.122660425] HEAP: Allocated 10 bytes @ 0x3ffbaf94 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1287]: 0.121943300 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1288]: 0.121959425 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1289]: 0.122029850 - core[0].svPrint(26), plen 70: [msg: I (430) example: Task[0x3ffb7aec]: allocated 10 bytes @ 0x3ffbb7c8 +EVENT[1301]: 0.122677350 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1302]: 0.122693275 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1303]: 0.122748050 - core[0].svPrint(26), plen 70: [msg: I (418) example: Task[0x3ffb72b4]: allocated 10 bytes @ 0x3ffbaf94 , lvl: 0, unused: 0] -[0.122029850] LOG: I (430) example: Task[0x3ffb7aec]: allocated 10 bytes @ 0x3ffbb7c8 -EVENT[1290]: 0.122047575 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12287056, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1291]: 0.122060800 - core[0].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[1292]: 0.122060800 - core[1].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[1293]: 0.122077050 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1294]: 0.122087900 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1295]: 0.122098675 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1296]: 0.122112500 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1297]: 0.122123400 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[1298]: 0.122134225 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1299]: 0.122146175 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12287056, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1300]: 0.122156425 - core[0].svIdle(17), plen 0: [] -EVENT[1301]: 0.122167850 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1302]: 0.122184200 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1303]: 0.122247750 - core[1].svPrint(26), plen 63: [msg: I (430) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb7c8 +[0.122748050] LOG: I (418) example: Task[0x3ffb72b4]: allocated 10 bytes @ 0x3ffbaf94 +EVENT[1304]: 0.122761550 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12284952, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1305]: 0.122778975 - core[0].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[1306]: 0.122778975 - core[1].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[1307]: 0.122795250 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1308]: 0.122806100 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1309]: 0.122816975 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1310]: 0.122830800 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1311]: 0.122841650 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[1312]: 0.122852500 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1313]: 0.122864500 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12284952, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1314]: 0.122874800 - core[0].svIdle(17), plen 0: [] +EVENT[1315]: 0.122886425 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1316]: 0.122902750 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1317]: 0.122950525 - core[1].svPrint(26), plen 63: [msg: I (418) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf94 , lvl: 0, unused: 0] -[0.122247750] LOG: I (430) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb7c8 -EVENT[1304]: 0.122268950 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461192, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.122268950] HEAP: Freed bytes @ 0x3ffbb7c8 from task "free0" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.122950525] LOG: I (418) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf94 +EVENT[1318]: 0.122971900 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459092, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.122971900] HEAP: Freed bytes @ 0x3ffbaf94 from task "free0" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1305]: 0.122299975 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1306]: 0.122311450 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1307]: 0.122328150 - core[1].svIdle(17), plen 0: [] -EVENT[1308]: 0.122669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1309]: 0.122682850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1310]: 0.122698425 - core[1].svIdle(17), plen 0: [] -EVENT[1311]: 0.122813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1312]: 0.122828225 - core[0].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[1313]: 0.122828225 - core[1].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[1314]: 0.122840850 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1315]: 0.122856525 - core[0].svTaskStartExec(4), plen 0: [tid: 12292716] -EVENT[1316]: 0.122891850 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461192, size: 10, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.122891850] HEAP: Allocated 10 bytes @ 0x3ffbb7c8 from task "alloc1" on core 0 by: +EVENT[1319]: 0.122999325 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1320]: 0.123010850 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1321]: 0.123027425 - core[1].svIdle(17), plen 0: [] +EVENT[1322]: 0.123425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1323]: 0.123439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1324]: 0.123455150 - core[1].svIdle(17), plen 0: [] +EVENT[1325]: 0.123546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1326]: 0.123561650 - core[0].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[1327]: 0.123561650 - core[1].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[1328]: 0.123573550 - core[0].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[1329]: 0.123573550 - core[1].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[1330]: 0.123586100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1331]: 0.123601775 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[1332]: 0.123638150 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459092, size: 10, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.123638150] HEAP: Allocated 10 bytes @ 0x3ffbaf94 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1317]: 0.122926275 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461208, size: 20, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.122926275] HEAP: Allocated 20 bytes @ 0x3ffbb7d8 from task "alloc1" on core 0 by: +EVENT[1333]: 0.123677150 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459108, size: 20, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.123677150] HEAP: Allocated 20 bytes @ 0x3ffbafa4 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1318]: 0.122943300 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1319]: 0.122959425 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1320]: 0.123029850 - core[0].svPrint(26), plen 70: [msg: I (431) example: Task[0x3ffb926c]: allocated 20 bytes @ 0x3ffbb7d8 +EVENT[1334]: 0.123694075 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1335]: 0.123710100 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1336]: 0.123764825 - core[0].svPrint(26), plen 70: [msg: I (419) example: Task[0x3ffb8a34]: allocated 20 bytes @ 0x3ffbafa4 , lvl: 0, unused: 0] -[0.123029850] LOG: I (431) example: Task[0x3ffb926c]: allocated 20 bytes @ 0x3ffbb7d8 -EVENT[1321]: 0.123043400 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12293072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1322]: 0.123060825 - core[0].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[1323]: 0.123060825 - core[1].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[1324]: 0.123077125 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1325]: 0.123087975 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1326]: 0.123098725 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1327]: 0.123112450 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1328]: 0.123123300 - core[1].svTaskStartExec(4), plen 0: [tid: 12295764] -EVENT[1329]: 0.123134125 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1330]: 0.123146000 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12293072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1331]: 0.123156250 - core[0].svIdle(17), plen 0: [] -EVENT[1332]: 0.123167725 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1333]: 0.123184025 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1334]: 0.123247475 - core[1].svPrint(26), plen 63: [msg: I (431) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb7d8 -, lvl: 0, unused: 0] -[0.123247475] LOG: I (431) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb7d8 -EVENT[1335]: 0.123268650 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461208, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.123268650] HEAP: Freed bytes @ 0x3ffbb7d8 from task "free1" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 -/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 -/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 - -EVENT[1336]: 0.123295650 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1337]: 0.123307075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1338]: 0.123323650 - core[1].svIdle(17), plen 0: [] -EVENT[1339]: 0.123669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1340]: 0.123682950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1341]: 0.123698525 - core[1].svIdle(17), plen 0: [] -EVENT[1342]: 0.123813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1343]: 0.123828325 - core[0].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[1344]: 0.123828325 - core[1].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[1345]: 0.123840975 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1346]: 0.123856650 - core[0].svTaskStartExec(4), plen 0: [tid: 12298716] -EVENT[1347]: 0.123892175 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461208, size: 15, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.123892175] HEAP: Allocated 15 bytes @ 0x3ffbb7d8 from task "alloc2" on core 0 by: +[0.123764825] LOG: I (419) example: Task[0x3ffb8a34]: allocated 20 bytes @ 0x3ffbafa4 +EVENT[1337]: 0.123778250 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12290968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1338]: 0.123791500 - core[0].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[1339]: 0.123791500 - core[1].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[1340]: 0.123807850 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1341]: 0.123818700 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1342]: 0.123829525 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1343]: 0.123843325 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1344]: 0.123855250 - core[1].svTaskStartExec(4), plen 0: [tid: 12293660] +EVENT[1345]: 0.123866325 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1346]: 0.123878250 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12290968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1347]: 0.123889925 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[1348]: 0.123902550 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1349]: 0.123924950 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1350]: 0.123936400 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459132, size: 15, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.123936400] HEAP: Allocated 15 bytes @ 0x3ffbafbc from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1348]: 0.123930850 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461228, size: 30, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.123930850] HEAP: Allocated 30 bytes @ 0x3ffbb7ec from task "alloc2" on core 0 by: +EVENT[1351]: 0.123977725 - core[1].svPrint(26), plen 63: [msg: I (419) example: Task[0x3ffb961c]: free memory @ 0x3ffbafa4 +, lvl: 0, unused: 0] +[0.123977725] LOG: I (419) example: Task[0x3ffb961c]: free memory @ 0x3ffbafa4 +EVENT[1352]: 0.123989300 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459152, size: 30, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.123989300] HEAP: Allocated 30 bytes @ 0x3ffbafd0 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1349]: 0.123947750 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1350]: 0.123963725 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1351]: 0.124034075 - core[0].svPrint(26), plen 70: [msg: I (432) example: Task[0x3ffba9dc]: allocated 30 bytes @ 0x3ffbb7ec -, lvl: 0, unused: 0] -[0.124034075] LOG: I (432) example: Task[0x3ffba9dc]: allocated 30 bytes @ 0x3ffbb7ec -EVENT[1352]: 0.124047800 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12299072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1353]: 0.124061025 - core[0].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[1354]: 0.124061025 - core[1].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[1355]: 0.124077325 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1356]: 0.124088175 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1357]: 0.124098950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1358]: 0.124112675 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1359]: 0.124125000 - core[1].svTaskStartExec(4), plen 0: [tid: 12301764] -EVENT[1360]: 0.124135825 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1361]: 0.124147700 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12299072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1362]: 0.124158975 - core[0].svIdle(17), plen 0: [] -EVENT[1363]: 0.124170625 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1364]: 0.124190325 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1365]: 0.124253875 - core[1].svPrint(26), plen 63: [msg: I (432) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb7ec -, lvl: 0, unused: 0] -[0.124253875] LOG: I (432) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb7ec -EVENT[1366]: 0.124275075 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461228, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.124275075] HEAP: Freed bytes @ 0x3ffbb7ec from task "free2" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +EVENT[1353]: 0.124003525 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459108, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.124003525] HEAP: Freed bytes @ 0x3ffbafa4 from task "free1" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1367]: 0.124301975 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1368]: 0.124313400 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1369]: 0.124329975 - core[1].svIdle(17), plen 0: [] -EVENT[1370]: 0.124669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1371]: 0.124682950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1372]: 0.124698525 - core[1].svIdle(17), plen 0: [] -EVENT[1373]: 0.124813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1374]: 0.124828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1375]: 0.124843775 - core[0].svIdle(17), plen 0: [] -EVENT[1376]: 0.125669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1377]: 0.125682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1378]: 0.125698325 - core[1].svIdle(17), plen 0: [] -EVENT[1379]: 0.125813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1380]: 0.125828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1381]: 0.125843775 - core[0].svIdle(17), plen 0: [] -EVENT[1382]: 0.126669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1383]: 0.126682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1384]: 0.126698100 - core[1].svIdle(17), plen 0: [] -EVENT[1385]: 0.126813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1386]: 0.126828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1387]: 0.126843775 - core[0].svIdle(17), plen 0: [] -EVENT[1388]: 0.127669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1389]: 0.127682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1390]: 0.127698075 - core[1].svIdle(17), plen 0: [] -EVENT[1391]: 0.127813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1392]: 0.127828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1393]: 0.127843825 - core[0].svIdle(17), plen 0: [] -EVENT[1394]: 0.128669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1395]: 0.128682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1396]: 0.128698075 - core[1].svIdle(17), plen 0: [] -EVENT[1397]: 0.128813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1398]: 0.128828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1399]: 0.128843775 - core[0].svIdle(17), plen 0: [] -EVENT[1400]: 0.129669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1401]: 0.129682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1402]: 0.129698325 - core[1].svIdle(17), plen 0: [] -EVENT[1403]: 0.129813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1404]: 0.129828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1405]: 0.129848100 - core[0].svIdle(17), plen 0: [] -EVENT[1406]: 0.130669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1407]: 0.130682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1408]: 0.130698075 - core[1].svIdle(17), plen 0: [] -EVENT[1409]: 0.130813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1410]: 0.130828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1411]: 0.130843775 - core[0].svIdle(17), plen 0: [] -EVENT[1412]: 0.131669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1413]: 0.131682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1414]: 0.131698325 - core[1].svIdle(17), plen 0: [] -EVENT[1415]: 0.131813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1416]: 0.131828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1417]: 0.131843775 - core[0].svIdle(17), plen 0: [] -EVENT[1418]: 0.132669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1419]: 0.132682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1420]: 0.132698100 - core[1].svIdle(17), plen 0: [] -EVENT[1421]: 0.132813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1422]: 0.132828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1423]: 0.132843775 - core[0].svIdle(17), plen 0: [] -EVENT[1424]: 0.133669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1425]: 0.133682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1426]: 0.133698075 - core[1].svIdle(17), plen 0: [] -EVENT[1427]: 0.133813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1428]: 0.133828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1429]: 0.133843825 - core[0].svIdle(17), plen 0: [] -EVENT[1430]: 0.134669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1431]: 0.134682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1432]: 0.134698075 - core[1].svIdle(17), plen 0: [] -EVENT[1433]: 0.134813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1434]: 0.134828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1435]: 0.134843775 - core[0].svIdle(17), plen 0: [] -EVENT[1436]: 0.135669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1437]: 0.135682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1438]: 0.135698325 - core[1].svIdle(17), plen 0: [] -EVENT[1439]: 0.135813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1440]: 0.135828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1441]: 0.135843775 - core[0].svIdle(17), plen 0: [] -EVENT[1442]: 0.136669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1443]: 0.136682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1444]: 0.136698100 - core[1].svIdle(17), plen 0: [] -EVENT[1445]: 0.136813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1446]: 0.136828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1447]: 0.136843775 - core[0].svIdle(17), plen 0: [] -EVENT[1448]: 0.137669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1449]: 0.137682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1450]: 0.137698075 - core[1].svIdle(17), plen 0: [] -EVENT[1451]: 0.137813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1452]: 0.137828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1453]: 0.137843825 - core[0].svIdle(17), plen 0: [] -EVENT[1454]: 0.138669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1455]: 0.138682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1456]: 0.138698075 - core[1].svIdle(17), plen 0: [] -EVENT[1457]: 0.138813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1458]: 0.138828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1459]: 0.138843775 - core[0].svIdle(17), plen 0: [] -EVENT[1460]: 0.139669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1461]: 0.139682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1462]: 0.139698325 - core[1].svIdle(17), plen 0: [] -EVENT[1463]: 0.139813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1464]: 0.139828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1465]: 0.139843775 - core[0].svIdle(17), plen 0: [] -EVENT[1466]: 0.140669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1467]: 0.140682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1468]: 0.140698100 - core[1].svIdle(17), plen 0: [] -EVENT[1469]: 0.140813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1470]: 0.140828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1471]: 0.140843775 - core[0].svIdle(17), plen 0: [] -EVENT[1472]: 0.141669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1473]: 0.141682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1474]: 0.141698075 - core[1].svIdle(17), plen 0: [] -EVENT[1475]: 0.141813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1476]: 0.141828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1477]: 0.141843825 - core[0].svIdle(17), plen 0: [] -EVENT[1478]: 0.142669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1479]: 0.142682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1480]: 0.142698325 - core[1].svIdle(17), plen 0: [] -EVENT[1481]: 0.142813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1482]: 0.142828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1483]: 0.142843775 - core[0].svIdle(17), plen 0: [] -EVENT[1484]: 0.143669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1485]: 0.143682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1486]: 0.143698100 - core[1].svIdle(17), plen 0: [] -EVENT[1487]: 0.143813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1488]: 0.143828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1489]: 0.143843775 - core[0].svIdle(17), plen 0: [] -EVENT[1490]: 0.144669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1491]: 0.144682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1492]: 0.144698075 - core[1].svIdle(17), plen 0: [] -EVENT[1493]: 0.144813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1494]: 0.144828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1495]: 0.144843825 - core[0].svIdle(17), plen 0: [] -EVENT[1496]: 0.145669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1497]: 0.145682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1498]: 0.145698075 - core[1].svIdle(17), plen 0: [] -EVENT[1499]: 0.145813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1500]: 0.145828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1501]: 0.145843775 - core[0].svIdle(17), plen 0: [] -EVENT[1502]: 0.146669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1503]: 0.146682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1504]: 0.146698325 - core[1].svIdle(17), plen 0: [] -EVENT[1505]: 0.146813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1506]: 0.146828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1507]: 0.146843775 - core[0].svIdle(17), plen 0: [] -EVENT[1508]: 0.147669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1509]: 0.147682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1510]: 0.147698100 - core[1].svIdle(17), plen 0: [] -EVENT[1511]: 0.147813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1512]: 0.147828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1513]: 0.147843775 - core[0].svIdle(17), plen 0: [] -EVENT[1514]: 0.148669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1515]: 0.148682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1516]: 0.148698075 - core[1].svIdle(17), plen 0: [] -EVENT[1517]: 0.148813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1518]: 0.148828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1519]: 0.148843825 - core[0].svIdle(17), plen 0: [] -EVENT[1520]: 0.149669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1521]: 0.149682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1522]: 0.149698075 - core[1].svIdle(17), plen 0: [] -EVENT[1523]: 0.149813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1524]: 0.149828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1525]: 0.149843775 - core[0].svIdle(17), plen 0: [] -EVENT[1526]: 0.150669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1527]: 0.150682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1528]: 0.150698325 - core[1].svIdle(17), plen 0: [] -EVENT[1529]: 0.150813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1530]: 0.150828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1531]: 0.150843775 - core[0].svIdle(17), plen 0: [] -EVENT[1532]: 0.151669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1533]: 0.151682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1534]: 0.151698100 - core[1].svIdle(17), plen 0: [] -EVENT[1535]: 0.151813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1536]: 0.151828325 - core[0].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[1537]: 0.151828325 - core[1].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[1538]: 0.151840975 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1539]: 0.151856650 - core[0].svTaskStartExec(4), plen 0: [tid: 12286700] -EVENT[1540]: 0.151892175 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461228, size: 6, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.151892175] HEAP: Allocated 6 bytes @ 0x3ffbb7ec from task "alloc0" on core 0 by: +EVENT[1354]: 0.124016100 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1355]: 0.124035950 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1356]: 0.124046875 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1357]: 0.124058400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1358]: 0.124076350 - core[1].svIdle(17), plen 0: [] +EVENT[1359]: 0.124094100 - core[0].svPrint(26), plen 70: [msg: I (419) example: Task[0x3ffba1a4]: allocated 30 bytes @ 0x3ffbafd0 +, lvl: 0, unused: 0] +[0.124094100] LOG: I (419) example: Task[0x3ffba1a4]: allocated 30 bytes @ 0x3ffbafd0 +EVENT[1360]: 0.124111700 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12296968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1361]: 0.124124950 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[1362]: 0.124124950 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[1363]: 0.124141300 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1364]: 0.124152150 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1365]: 0.124162975 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1366]: 0.124176800 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1367]: 0.124187725 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[1368]: 0.124198600 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1369]: 0.124210550 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12296968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1370]: 0.124221775 - core[0].svIdle(17), plen 0: [] +EVENT[1371]: 0.124233575 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1372]: 0.124249925 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1373]: 0.124297800 - core[1].svPrint(26), plen 63: [msg: I (419) example: Task[0x3ffbad8c]: free memory @ 0x3ffbafd0 +, lvl: 0, unused: 0] +[0.124297800] LOG: I (419) example: Task[0x3ffbad8c]: free memory @ 0x3ffbafd0 +EVENT[1374]: 0.124319225 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459152, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.124319225] HEAP: Freed bytes @ 0x3ffbafd0 from task "free2" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 +/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 +/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 + +EVENT[1375]: 0.124349975 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1376]: 0.124361425 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1377]: 0.124378125 - core[1].svIdle(17), plen 0: [] +EVENT[1378]: 0.124425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1379]: 0.124439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1380]: 0.124455150 - core[1].svIdle(17), plen 0: [] +EVENT[1381]: 0.124546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1382]: 0.124562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1383]: 0.124577425 - core[0].svIdle(17), plen 0: [] +EVENT[1384]: 0.125425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1385]: 0.125439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1386]: 0.125454550 - core[1].svIdle(17), plen 0: [] +EVENT[1387]: 0.125546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1388]: 0.125562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1389]: 0.125577125 - core[0].svIdle(17), plen 0: [] +EVENT[1390]: 0.126425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1391]: 0.126439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1392]: 0.126454675 - core[1].svIdle(17), plen 0: [] +EVENT[1393]: 0.126546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1394]: 0.126562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1395]: 0.126577150 - core[0].svIdle(17), plen 0: [] +EVENT[1396]: 0.127425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1397]: 0.127439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1398]: 0.127454600 - core[1].svIdle(17), plen 0: [] +EVENT[1399]: 0.127546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1400]: 0.127562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1401]: 0.127577125 - core[0].svIdle(17), plen 0: [] +EVENT[1402]: 0.128425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1403]: 0.128439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1404]: 0.128454550 - core[1].svIdle(17), plen 0: [] +EVENT[1405]: 0.128546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1406]: 0.128562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1407]: 0.128577425 - core[0].svIdle(17), plen 0: [] +EVENT[1408]: 0.129425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1409]: 0.129439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1410]: 0.129454550 - core[1].svIdle(17), plen 0: [] +EVENT[1411]: 0.129546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1412]: 0.129562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1413]: 0.129577125 - core[0].svIdle(17), plen 0: [] +EVENT[1414]: 0.130425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1415]: 0.130439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1416]: 0.130454675 - core[1].svIdle(17), plen 0: [] +EVENT[1417]: 0.130546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1418]: 0.130562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1419]: 0.130577150 - core[0].svIdle(17), plen 0: [] +EVENT[1420]: 0.131425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1421]: 0.131439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1422]: 0.131454600 - core[1].svIdle(17), plen 0: [] +EVENT[1423]: 0.131546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1424]: 0.131562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1425]: 0.131577125 - core[0].svIdle(17), plen 0: [] +EVENT[1426]: 0.132425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1427]: 0.132439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1428]: 0.132454550 - core[1].svIdle(17), plen 0: [] +EVENT[1429]: 0.132546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1430]: 0.132562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1431]: 0.132577425 - core[0].svIdle(17), plen 0: [] +EVENT[1432]: 0.133425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1433]: 0.133439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1434]: 0.133454550 - core[1].svIdle(17), plen 0: [] +EVENT[1435]: 0.133546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1436]: 0.133562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1437]: 0.133577125 - core[0].svIdle(17), plen 0: [] +EVENT[1438]: 0.134425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1439]: 0.134443650 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1440]: 0.134458800 - core[1].svIdle(17), plen 0: [] +EVENT[1441]: 0.134546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1442]: 0.134562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1443]: 0.134577125 - core[0].svIdle(17), plen 0: [] +EVENT[1444]: 0.135425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1445]: 0.135439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1446]: 0.135454550 - core[1].svIdle(17), plen 0: [] +EVENT[1447]: 0.135546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1448]: 0.135562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1449]: 0.135577425 - core[0].svIdle(17), plen 0: [] +EVENT[1450]: 0.136425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1451]: 0.136439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1452]: 0.136454550 - core[1].svIdle(17), plen 0: [] +EVENT[1453]: 0.136546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1454]: 0.136562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1455]: 0.136577125 - core[0].svIdle(17), plen 0: [] +EVENT[1456]: 0.137425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1457]: 0.137439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1458]: 0.137454675 - core[1].svIdle(17), plen 0: [] +EVENT[1459]: 0.137546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1460]: 0.137562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1461]: 0.137577150 - core[0].svIdle(17), plen 0: [] +EVENT[1462]: 0.138425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1463]: 0.138439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1464]: 0.138454600 - core[1].svIdle(17), plen 0: [] +EVENT[1465]: 0.138546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1466]: 0.138562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1467]: 0.138577125 - core[0].svIdle(17), plen 0: [] +EVENT[1468]: 0.139425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1469]: 0.139439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1470]: 0.139454550 - core[1].svIdle(17), plen 0: [] +EVENT[1471]: 0.139546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1472]: 0.139562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1473]: 0.139577425 - core[0].svIdle(17), plen 0: [] +EVENT[1474]: 0.140425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1475]: 0.140439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1476]: 0.140454550 - core[1].svIdle(17), plen 0: [] +EVENT[1477]: 0.140546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1478]: 0.140562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1479]: 0.140577125 - core[0].svIdle(17), plen 0: [] +EVENT[1480]: 0.141425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1481]: 0.141439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1482]: 0.141454675 - core[1].svIdle(17), plen 0: [] +EVENT[1483]: 0.141546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1484]: 0.141562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1485]: 0.141577150 - core[0].svIdle(17), plen 0: [] +EVENT[1486]: 0.142425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1487]: 0.142439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1488]: 0.142454600 - core[1].svIdle(17), plen 0: [] +EVENT[1489]: 0.142546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1490]: 0.142562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1491]: 0.142577125 - core[0].svIdle(17), plen 0: [] +EVENT[1492]: 0.143425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1493]: 0.143439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1494]: 0.143454550 - core[1].svIdle(17), plen 0: [] +EVENT[1495]: 0.143546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1496]: 0.143562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1497]: 0.143577425 - core[0].svIdle(17), plen 0: [] +EVENT[1498]: 0.144425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1499]: 0.144439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1500]: 0.144454550 - core[1].svIdle(17), plen 0: [] +EVENT[1501]: 0.144546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1502]: 0.144562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1503]: 0.144577125 - core[0].svIdle(17), plen 0: [] +EVENT[1504]: 0.145425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1505]: 0.145439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1506]: 0.145454675 - core[1].svIdle(17), plen 0: [] +EVENT[1507]: 0.145546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1508]: 0.145562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1509]: 0.145577150 - core[0].svIdle(17), plen 0: [] +EVENT[1510]: 0.146425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1511]: 0.146443000 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1512]: 0.146458125 - core[1].svIdle(17), plen 0: [] +EVENT[1513]: 0.146546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1514]: 0.146562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1515]: 0.146577125 - core[0].svIdle(17), plen 0: [] +EVENT[1516]: 0.147425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1517]: 0.147439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1518]: 0.147454550 - core[1].svIdle(17), plen 0: [] +EVENT[1519]: 0.147546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1520]: 0.147562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1521]: 0.147577425 - core[0].svIdle(17), plen 0: [] +EVENT[1522]: 0.148425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1523]: 0.148439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1524]: 0.148454550 - core[1].svIdle(17), plen 0: [] +EVENT[1525]: 0.148546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1526]: 0.148562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1527]: 0.148577125 - core[0].svIdle(17), plen 0: [] +EVENT[1528]: 0.149425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1529]: 0.149439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1530]: 0.149454675 - core[1].svIdle(17), plen 0: [] +EVENT[1531]: 0.149546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1532]: 0.149562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1533]: 0.149577150 - core[0].svIdle(17), plen 0: [] +EVENT[1534]: 0.150425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1535]: 0.150439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1536]: 0.150454600 - core[1].svIdle(17), plen 0: [] +EVENT[1537]: 0.150546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1538]: 0.150562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1539]: 0.150577125 - core[0].svIdle(17), plen 0: [] +EVENT[1540]: 0.151425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1541]: 0.151439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1542]: 0.151454550 - core[1].svIdle(17), plen 0: [] +EVENT[1543]: 0.151546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1544]: 0.151562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1545]: 0.151577425 - core[0].svIdle(17), plen 0: [] +EVENT[1546]: 0.152425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1547]: 0.152439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1548]: 0.152454550 - core[1].svIdle(17), plen 0: [] +EVENT[1549]: 0.152546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1550]: 0.152561650 - core[0].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[1551]: 0.152561650 - core[1].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[1552]: 0.152574300 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1553]: 0.152590225 - core[0].svTaskStartExec(4), plen 0: [tid: 12284596] +EVENT[1554]: 0.152625450 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459108, size: 6, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.152625450] HEAP: Allocated 6 bytes @ 0x3ffbafa4 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1541]: 0.151930650 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461244, size: 12, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.151930650] HEAP: Allocated 12 bytes @ 0x3ffbb7fc from task "alloc0" on core 0 by: +EVENT[1555]: 0.152661150 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459152, size: 12, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.152661150] HEAP: Allocated 12 bytes @ 0x3ffbafd0 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1542]: 0.151947550 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1543]: 0.151963550 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1544]: 0.152033875 - core[0].svPrint(26), plen 70: [msg: I (460) example: Task[0x3ffb7aec]: allocated 12 bytes @ 0x3ffbb7fc +EVENT[1556]: 0.152678125 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1557]: 0.152694100 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1558]: 0.152753100 - core[0].svPrint(26), plen 70: [msg: I (448) example: Task[0x3ffb72b4]: allocated 12 bytes @ 0x3ffbafd0 , lvl: 0, unused: 0] -[0.152033875] LOG: I (460) example: Task[0x3ffb7aec]: allocated 12 bytes @ 0x3ffbb7fc -EVENT[1545]: 0.152047475 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12287056, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1546]: 0.152060700 - core[0].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[1547]: 0.152060700 - core[1].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[1548]: 0.152076950 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1549]: 0.152087800 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1550]: 0.152098575 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1551]: 0.152112375 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1552]: 0.152123175 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[1553]: 0.152134025 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1554]: 0.152145900 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12287056, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1555]: 0.152156200 - core[0].svIdle(17), plen 0: [] -EVENT[1556]: 0.152167725 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1557]: 0.152188150 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1558]: 0.152251700 - core[1].svPrint(26), plen 63: [msg: I (460) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb7fc +[0.152753100] LOG: I (448) example: Task[0x3ffb72b4]: allocated 12 bytes @ 0x3ffbafd0 +EVENT[1559]: 0.152766600 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12284952, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1560]: 0.152779750 - core[0].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[1561]: 0.152779750 - core[1].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[1562]: 0.152795975 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1563]: 0.152806925 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1564]: 0.152817675 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1565]: 0.152831750 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1566]: 0.152842550 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[1567]: 0.152853275 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1568]: 0.152865400 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12284952, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1569]: 0.152875575 - core[0].svIdle(17), plen 0: [] +EVENT[1570]: 0.152887350 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1571]: 0.152903675 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1572]: 0.152951550 - core[1].svPrint(26), plen 63: [msg: I (448) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbafd0 , lvl: 0, unused: 0] -[0.152251700] LOG: I (460) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb7fc -EVENT[1559]: 0.152272900 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461244, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.152272900] HEAP: Freed bytes @ 0x3ffbb7fc from task "free0" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.152951550] LOG: I (448) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbafd0 +EVENT[1573]: 0.152972775 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459152, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.152972775] HEAP: Freed bytes @ 0x3ffbafd0 from task "free0" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1560]: 0.152299800 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1561]: 0.152311225 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1562]: 0.152327800 - core[1].svIdle(17), plen 0: [] -EVENT[1563]: 0.152669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1564]: 0.152682950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1565]: 0.152698525 - core[1].svIdle(17), plen 0: [] -EVENT[1566]: 0.152813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1567]: 0.152828325 - core[0].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[1568]: 0.152828325 - core[1].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[1569]: 0.152840975 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1570]: 0.152856775 - core[0].svTaskStartExec(4), plen 0: [tid: 12292716] -EVENT[1571]: 0.152892175 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461244, size: 12, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.152892175] HEAP: Allocated 12 bytes @ 0x3ffbb7fc from task "alloc1" on core 0 by: +EVENT[1574]: 0.153004250 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1575]: 0.153015700 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1576]: 0.153032400 - core[1].svIdle(17), plen 0: [] +EVENT[1577]: 0.153425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1578]: 0.153439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1579]: 0.153455150 - core[1].svIdle(17), plen 0: [] +EVENT[1580]: 0.153546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1581]: 0.153561700 - core[0].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[1582]: 0.153561700 - core[1].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[1583]: 0.153573550 - core[0].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[1584]: 0.153573550 - core[1].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[1585]: 0.153586050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1586]: 0.153601725 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[1587]: 0.153638150 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459152, size: 12, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.153638150] HEAP: Allocated 12 bytes @ 0x3ffbafd0 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1572]: 0.152926700 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461260, size: 24, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.152926700] HEAP: Allocated 24 bytes @ 0x3ffbb80c from task "alloc1" on core 0 by: +EVENT[1588]: 0.153673575 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459168, size: 24, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.153673575] HEAP: Allocated 24 bytes @ 0x3ffbafe0 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1573]: 0.152943650 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1574]: 0.152963825 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1575]: 0.153034250 - core[0].svPrint(26), plen 70: [msg: I (461) example: Task[0x3ffb926c]: allocated 24 bytes @ 0x3ffbb80c +EVENT[1589]: 0.153690525 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1590]: 0.153706525 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1591]: 0.153761375 - core[0].svPrint(26), plen 70: [msg: I (449) example: Task[0x3ffb8a34]: allocated 24 bytes @ 0x3ffbafe0 , lvl: 0, unused: 0] -[0.153034250] LOG: I (461) example: Task[0x3ffb926c]: allocated 24 bytes @ 0x3ffbb80c -EVENT[1576]: 0.153047900 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12293072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1577]: 0.153061075 - core[0].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[1578]: 0.153061075 - core[1].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[1579]: 0.153077400 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1580]: 0.153088250 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1581]: 0.153098975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1582]: 0.153112750 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1583]: 0.153123700 - core[1].svTaskStartExec(4), plen 0: [tid: 12295764] -EVENT[1584]: 0.153134500 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1585]: 0.153146375 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12293072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1586]: 0.153156625 - core[0].svIdle(17), plen 0: [] -EVENT[1587]: 0.153168100 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1588]: 0.153184400 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1589]: 0.153247850 - core[1].svPrint(26), plen 63: [msg: I (461) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb80c -, lvl: 0, unused: 0] -[0.153247850] LOG: I (461) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb80c -EVENT[1590]: 0.153272900 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461260, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.153272900] HEAP: Freed bytes @ 0x3ffbb80c from task "free1" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 -/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 -/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 - -EVENT[1591]: 0.153299900 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1592]: 0.153311325 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1593]: 0.153327900 - core[1].svIdle(17), plen 0: [] -EVENT[1594]: 0.153669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1595]: 0.153682950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1596]: 0.153698525 - core[1].svIdle(17), plen 0: [] -EVENT[1597]: 0.153813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1598]: 0.153828325 - core[0].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[1599]: 0.153828325 - core[1].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[1600]: 0.153840975 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1601]: 0.153856650 - core[0].svTaskStartExec(4), plen 0: [tid: 12298716] -EVENT[1602]: 0.153892175 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461260, size: 18, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.153892175] HEAP: Allocated 18 bytes @ 0x3ffbb80c from task "alloc2" on core 0 by: +[0.153761375] LOG: I (449) example: Task[0x3ffb8a34]: allocated 24 bytes @ 0x3ffbafe0 +EVENT[1592]: 0.153778675 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12290968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1593]: 0.153791925 - core[0].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[1594]: 0.153791925 - core[1].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[1595]: 0.153808275 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1596]: 0.153819125 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1597]: 0.153829950 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1598]: 0.153843750 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1599]: 0.153855475 - core[1].svTaskStartExec(4), plen 0: [tid: 12293660] +EVENT[1600]: 0.153866850 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1601]: 0.153878850 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12290968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1602]: 0.153890525 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[1603]: 0.153903125 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1604]: 0.153921750 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1605]: 0.153933750 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459196, size: 18, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.153933750] HEAP: Allocated 18 bytes @ 0x3ffbaffc from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1603]: 0.153926725 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461284, size: 36, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.153926725] HEAP: Allocated 36 bytes @ 0x3ffbb824 from task "alloc2" on core 0 by: +EVENT[1606]: 0.153974925 - core[1].svPrint(26), plen 63: [msg: I (449) example: Task[0x3ffb961c]: free memory @ 0x3ffbafe0 +, lvl: 0, unused: 0] +[0.153974925] LOG: I (449) example: Task[0x3ffb961c]: free memory @ 0x3ffbafe0 +EVENT[1607]: 0.153991100 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459220, size: 36, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.153991100] HEAP: Allocated 36 bytes @ 0x3ffbb014 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1604]: 0.153943625 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1605]: 0.153959625 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1606]: 0.154029950 - core[0].svPrint(26), plen 70: [msg: I (462) example: Task[0x3ffba9dc]: allocated 36 bytes @ 0x3ffbb824 -, lvl: 0, unused: 0] -[0.154029950] LOG: I (462) example: Task[0x3ffba9dc]: allocated 36 bytes @ 0x3ffbb824 -EVENT[1607]: 0.154047775 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12299072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1608]: 0.154061125 - core[0].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[1609]: 0.154061125 - core[1].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[1610]: 0.154077450 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1611]: 0.154088300 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1612]: 0.154099050 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1613]: 0.154112775 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1614]: 0.154123675 - core[1].svTaskStartExec(4), plen 0: [tid: 12301764] -EVENT[1615]: 0.154134500 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1616]: 0.154146350 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12299072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1617]: 0.154157650 - core[0].svIdle(17), plen 0: [] -EVENT[1618]: 0.154169275 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1619]: 0.154185675 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1620]: 0.154249225 - core[1].svPrint(26), plen 63: [msg: I (462) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb824 -, lvl: 0, unused: 0] -[0.154249225] LOG: I (462) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb824 -EVENT[1621]: 0.154270425 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461284, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.154270425] HEAP: Freed bytes @ 0x3ffbb824 from task "free2" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +EVENT[1608]: 0.154005475 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459168, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.154005475] HEAP: Freed bytes @ 0x3ffbafe0 from task "free1" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1622]: 0.154301425 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1623]: 0.154312900 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1624]: 0.154329600 - core[1].svIdle(17), plen 0: [] -EVENT[1625]: 0.154669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1626]: 0.154682850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1627]: 0.154698425 - core[1].svIdle(17), plen 0: [] -EVENT[1628]: 0.154813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1629]: 0.154828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1630]: 0.154843825 - core[0].svIdle(17), plen 0: [] -EVENT[1631]: 0.155669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1632]: 0.155682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1633]: 0.155698075 - core[1].svIdle(17), plen 0: [] -EVENT[1634]: 0.155813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1635]: 0.155828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1636]: 0.155843775 - core[0].svIdle(17), plen 0: [] -EVENT[1637]: 0.156669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1638]: 0.156682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1639]: 0.156698325 - core[1].svIdle(17), plen 0: [] -EVENT[1640]: 0.156813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1641]: 0.156828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1642]: 0.156843775 - core[0].svIdle(17), plen 0: [] -EVENT[1643]: 0.157669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1644]: 0.157682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1645]: 0.157698100 - core[1].svIdle(17), plen 0: [] -EVENT[1646]: 0.157813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1647]: 0.157828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1648]: 0.157843775 - core[0].svIdle(17), plen 0: [] -EVENT[1649]: 0.158669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1650]: 0.158682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1651]: 0.158698075 - core[1].svIdle(17), plen 0: [] -EVENT[1652]: 0.158813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1653]: 0.158828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1654]: 0.158843825 - core[0].svIdle(17), plen 0: [] -EVENT[1655]: 0.159669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1656]: 0.159682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1657]: 0.159698075 - core[1].svIdle(17), plen 0: [] -EVENT[1658]: 0.159813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1659]: 0.159828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1660]: 0.159843775 - core[0].svIdle(17), plen 0: [] -EVENT[1661]: 0.160669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1662]: 0.160682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1663]: 0.160698325 - core[1].svIdle(17), plen 0: [] -EVENT[1664]: 0.160813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1665]: 0.160828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1666]: 0.160843775 - core[0].svIdle(17), plen 0: [] -EVENT[1667]: 0.161669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1668]: 0.161682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1669]: 0.161698100 - core[1].svIdle(17), plen 0: [] -EVENT[1670]: 0.161813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1671]: 0.161828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1672]: 0.161843775 - core[0].svIdle(17), plen 0: [] -EVENT[1673]: 0.162669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1674]: 0.162682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1675]: 0.162698075 - core[1].svIdle(17), plen 0: [] -EVENT[1676]: 0.162813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1677]: 0.162828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1678]: 0.162843825 - core[0].svIdle(17), plen 0: [] -EVENT[1679]: 0.163669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1680]: 0.163682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1681]: 0.163698075 - core[1].svIdle(17), plen 0: [] -EVENT[1682]: 0.163813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1683]: 0.163828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1684]: 0.163843775 - core[0].svIdle(17), plen 0: [] -EVENT[1685]: 0.164669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1686]: 0.164686550 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1687]: 0.164701825 - core[1].svIdle(17), plen 0: [] -EVENT[1688]: 0.164813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1689]: 0.164828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1690]: 0.164843775 - core[0].svIdle(17), plen 0: [] -EVENT[1691]: 0.165669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1692]: 0.165682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1693]: 0.165698075 - core[1].svIdle(17), plen 0: [] -EVENT[1694]: 0.165813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1695]: 0.165828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1696]: 0.165843825 - core[0].svIdle(17), plen 0: [] -EVENT[1697]: 0.166669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1698]: 0.166682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1699]: 0.166698075 - core[1].svIdle(17), plen 0: [] -EVENT[1700]: 0.166813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1701]: 0.166828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1702]: 0.166843775 - core[0].svIdle(17), plen 0: [] -EVENT[1703]: 0.167669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1704]: 0.167682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1705]: 0.167698325 - core[1].svIdle(17), plen 0: [] -EVENT[1706]: 0.167813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1707]: 0.167828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1708]: 0.167843775 - core[0].svIdle(17), plen 0: [] -EVENT[1709]: 0.168669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1710]: 0.168682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1711]: 0.168698100 - core[1].svIdle(17), plen 0: [] -EVENT[1712]: 0.168813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1713]: 0.168828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1714]: 0.168843775 - core[0].svIdle(17), plen 0: [] -EVENT[1715]: 0.169669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1716]: 0.169682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1717]: 0.169698075 - core[1].svIdle(17), plen 0: [] -EVENT[1718]: 0.169813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1719]: 0.169828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1720]: 0.169843825 - core[0].svIdle(17), plen 0: [] -EVENT[1721]: 0.170669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1722]: 0.170682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1723]: 0.170698075 - core[1].svIdle(17), plen 0: [] -EVENT[1724]: 0.170813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1725]: 0.170828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1726]: 0.170843775 - core[0].svIdle(17), plen 0: [] -EVENT[1727]: 0.171669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1728]: 0.171682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1729]: 0.171698325 - core[1].svIdle(17), plen 0: [] -EVENT[1730]: 0.171813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1731]: 0.171828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1732]: 0.171843775 - core[0].svIdle(17), plen 0: [] -EVENT[1733]: 0.172669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1734]: 0.172682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1735]: 0.172698100 - core[1].svIdle(17), plen 0: [] -EVENT[1736]: 0.172813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1737]: 0.172828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1738]: 0.172843775 - core[0].svIdle(17), plen 0: [] -EVENT[1739]: 0.173669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1740]: 0.173682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1741]: 0.173698075 - core[1].svIdle(17), plen 0: [] -EVENT[1742]: 0.173813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1743]: 0.173828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1744]: 0.173843825 - core[0].svIdle(17), plen 0: [] -EVENT[1745]: 0.174669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1746]: 0.174682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1747]: 0.174698075 - core[1].svIdle(17), plen 0: [] -EVENT[1748]: 0.174813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1749]: 0.174828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1750]: 0.174843775 - core[0].svIdle(17), plen 0: [] -EVENT[1751]: 0.175669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1752]: 0.175682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1753]: 0.175698325 - core[1].svIdle(17), plen 0: [] -EVENT[1754]: 0.175813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1755]: 0.175828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1756]: 0.175843775 - core[0].svIdle(17), plen 0: [] -EVENT[1757]: 0.176669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1758]: 0.176687200 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1759]: 0.176702350 - core[1].svIdle(17), plen 0: [] -EVENT[1760]: 0.176813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1761]: 0.176828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1762]: 0.176843775 - core[0].svIdle(17), plen 0: [] -EVENT[1763]: 0.177669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1764]: 0.177682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1765]: 0.177698075 - core[1].svIdle(17), plen 0: [] -EVENT[1766]: 0.177813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1767]: 0.177828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1768]: 0.177843825 - core[0].svIdle(17), plen 0: [] -EVENT[1769]: 0.178669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1770]: 0.178682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1771]: 0.178698075 - core[1].svIdle(17), plen 0: [] -EVENT[1772]: 0.178813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1773]: 0.178828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1774]: 0.178843775 - core[0].svIdle(17), plen 0: [] -EVENT[1775]: 0.179669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1776]: 0.179682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1777]: 0.179698325 - core[1].svIdle(17), plen 0: [] -EVENT[1778]: 0.179813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1779]: 0.179828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1780]: 0.179843775 - core[0].svIdle(17), plen 0: [] -EVENT[1781]: 0.180669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1782]: 0.180682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1783]: 0.180698100 - core[1].svIdle(17), plen 0: [] -EVENT[1784]: 0.180813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1785]: 0.180828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1786]: 0.180843775 - core[0].svIdle(17), plen 0: [] -EVENT[1787]: 0.181669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1788]: 0.181682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1789]: 0.181698075 - core[1].svIdle(17), plen 0: [] -EVENT[1790]: 0.181813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1791]: 0.181828225 - core[0].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[1792]: 0.181828225 - core[1].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[1793]: 0.181840850 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1794]: 0.181856525 - core[0].svTaskStartExec(4), plen 0: [tid: 12286700] -EVENT[1795]: 0.181891850 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461284, size: 7, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.181891850] HEAP: Allocated 7 bytes @ 0x3ffbb824 from task "alloc0" on core 0 by: +EVENT[1609]: 0.154017925 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1610]: 0.154037825 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1611]: 0.154048750 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1612]: 0.154060300 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1613]: 0.154078250 - core[1].svIdle(17), plen 0: [] +EVENT[1614]: 0.154096250 - core[0].svPrint(26), plen 70: [msg: I (449) example: Task[0x3ffba1a4]: allocated 36 bytes @ 0x3ffbb014 +, lvl: 0, unused: 0] +[0.154096250] LOG: I (449) example: Task[0x3ffba1a4]: allocated 36 bytes @ 0x3ffbb014 +EVENT[1615]: 0.154109700 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12296968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1616]: 0.154126450 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[1617]: 0.154126450 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[1618]: 0.154142800 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1619]: 0.154153675 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1620]: 0.154164475 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1621]: 0.154178300 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1622]: 0.154189225 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[1623]: 0.154200075 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1624]: 0.154212025 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12296968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1625]: 0.154223250 - core[0].svIdle(17), plen 0: [] +EVENT[1626]: 0.154235050 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1627]: 0.154251325 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1628]: 0.154299100 - core[1].svPrint(26), plen 63: [msg: I (449) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb014 +, lvl: 0, unused: 0] +[0.154299100] LOG: I (449) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb014 +EVENT[1629]: 0.154320475 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459220, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.154320475] HEAP: Freed bytes @ 0x3ffbb014 from task "free2" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 +/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 +/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 + +EVENT[1630]: 0.154347875 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1631]: 0.154359300 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1632]: 0.154375850 - core[1].svIdle(17), plen 0: [] +EVENT[1633]: 0.154425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1634]: 0.154439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1635]: 0.154455150 - core[1].svIdle(17), plen 0: [] +EVENT[1636]: 0.154546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1637]: 0.154562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1638]: 0.154577125 - core[0].svIdle(17), plen 0: [] +EVENT[1639]: 0.155425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1640]: 0.155439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1641]: 0.155454550 - core[1].svIdle(17), plen 0: [] +EVENT[1642]: 0.155546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1643]: 0.155562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1644]: 0.155577425 - core[0].svIdle(17), plen 0: [] +EVENT[1645]: 0.156425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1646]: 0.156439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1647]: 0.156454550 - core[1].svIdle(17), plen 0: [] +EVENT[1648]: 0.156546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1649]: 0.156565675 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1650]: 0.156580875 - core[0].svIdle(17), plen 0: [] +EVENT[1651]: 0.157425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1652]: 0.157439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1653]: 0.157454550 - core[1].svIdle(17), plen 0: [] +EVENT[1654]: 0.157546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1655]: 0.157562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1656]: 0.157577125 - core[0].svIdle(17), plen 0: [] +EVENT[1657]: 0.158425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1658]: 0.158439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1659]: 0.158454675 - core[1].svIdle(17), plen 0: [] +EVENT[1660]: 0.158546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1661]: 0.158562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1662]: 0.158577150 - core[0].svIdle(17), plen 0: [] +EVENT[1663]: 0.159425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1664]: 0.159439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1665]: 0.159454600 - core[1].svIdle(17), plen 0: [] +EVENT[1666]: 0.159546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1667]: 0.159562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1668]: 0.159577125 - core[0].svIdle(17), plen 0: [] +EVENT[1669]: 0.160425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1670]: 0.160439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1671]: 0.160454550 - core[1].svIdle(17), plen 0: [] +EVENT[1672]: 0.160546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1673]: 0.160562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1674]: 0.160577425 - core[0].svIdle(17), plen 0: [] +EVENT[1675]: 0.161425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1676]: 0.161439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1677]: 0.161454550 - core[1].svIdle(17), plen 0: [] +EVENT[1678]: 0.161546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1679]: 0.161562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1680]: 0.161577125 - core[0].svIdle(17), plen 0: [] +EVENT[1681]: 0.162425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1682]: 0.162439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1683]: 0.162454675 - core[1].svIdle(17), plen 0: [] +EVENT[1684]: 0.162546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1685]: 0.162562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1686]: 0.162577150 - core[0].svIdle(17), plen 0: [] +EVENT[1687]: 0.163425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1688]: 0.163439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1689]: 0.163454600 - core[1].svIdle(17), plen 0: [] +EVENT[1690]: 0.163546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1691]: 0.163562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1692]: 0.163577125 - core[0].svIdle(17), plen 0: [] +EVENT[1693]: 0.164425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1694]: 0.164439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1695]: 0.164454550 - core[1].svIdle(17), plen 0: [] +EVENT[1696]: 0.164546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1697]: 0.164562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1698]: 0.164577425 - core[0].svIdle(17), plen 0: [] +EVENT[1699]: 0.165425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1700]: 0.165439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1701]: 0.165454550 - core[1].svIdle(17), plen 0: [] +EVENT[1702]: 0.165546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1703]: 0.165562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1704]: 0.165577125 - core[0].svIdle(17), plen 0: [] +EVENT[1705]: 0.166425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1706]: 0.166439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1707]: 0.166454675 - core[1].svIdle(17), plen 0: [] +EVENT[1708]: 0.166546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1709]: 0.166562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1710]: 0.166577150 - core[0].svIdle(17), plen 0: [] +EVENT[1711]: 0.167425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1712]: 0.167439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1713]: 0.167454600 - core[1].svIdle(17), plen 0: [] +EVENT[1714]: 0.167546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1715]: 0.167562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1716]: 0.167577125 - core[0].svIdle(17), plen 0: [] +EVENT[1717]: 0.168425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1718]: 0.168439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1719]: 0.168454550 - core[1].svIdle(17), plen 0: [] +EVENT[1720]: 0.168546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1721]: 0.168566325 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1722]: 0.168581550 - core[0].svIdle(17), plen 0: [] +EVENT[1723]: 0.169425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1724]: 0.169439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1725]: 0.169454550 - core[1].svIdle(17), plen 0: [] +EVENT[1726]: 0.169546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1727]: 0.169562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1728]: 0.169577125 - core[0].svIdle(17), plen 0: [] +EVENT[1729]: 0.170425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1730]: 0.170439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1731]: 0.170454675 - core[1].svIdle(17), plen 0: [] +EVENT[1732]: 0.170546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1733]: 0.170562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1734]: 0.170577150 - core[0].svIdle(17), plen 0: [] +EVENT[1735]: 0.171425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1736]: 0.171439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1737]: 0.171454600 - core[1].svIdle(17), plen 0: [] +EVENT[1738]: 0.171546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1739]: 0.171562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1740]: 0.171577125 - core[0].svIdle(17), plen 0: [] +EVENT[1741]: 0.172425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1742]: 0.172439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1743]: 0.172454550 - core[1].svIdle(17), plen 0: [] +EVENT[1744]: 0.172546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1745]: 0.172562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1746]: 0.172577425 - core[0].svIdle(17), plen 0: [] +EVENT[1747]: 0.173425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1748]: 0.173439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1749]: 0.173454550 - core[1].svIdle(17), plen 0: [] +EVENT[1750]: 0.173546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1751]: 0.173562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1752]: 0.173577125 - core[0].svIdle(17), plen 0: [] +EVENT[1753]: 0.174425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1754]: 0.174439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1755]: 0.174454675 - core[1].svIdle(17), plen 0: [] +EVENT[1756]: 0.174546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1757]: 0.174562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1758]: 0.174577150 - core[0].svIdle(17), plen 0: [] +EVENT[1759]: 0.175425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1760]: 0.175439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1761]: 0.175454600 - core[1].svIdle(17), plen 0: [] +EVENT[1762]: 0.175546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1763]: 0.175562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1764]: 0.175577125 - core[0].svIdle(17), plen 0: [] +EVENT[1765]: 0.176425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1766]: 0.176439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1767]: 0.176454550 - core[1].svIdle(17), plen 0: [] +EVENT[1768]: 0.176546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1769]: 0.176562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1770]: 0.176577425 - core[0].svIdle(17), plen 0: [] +EVENT[1771]: 0.177425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1772]: 0.177439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1773]: 0.177454550 - core[1].svIdle(17), plen 0: [] +EVENT[1774]: 0.177546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1775]: 0.177562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1776]: 0.177577125 - core[0].svIdle(17), plen 0: [] +EVENT[1777]: 0.178425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1778]: 0.178439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1779]: 0.178454675 - core[1].svIdle(17), plen 0: [] +EVENT[1780]: 0.178546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1781]: 0.178562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1782]: 0.178577150 - core[0].svIdle(17), plen 0: [] +EVENT[1783]: 0.179425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1784]: 0.179439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1785]: 0.179454600 - core[1].svIdle(17), plen 0: [] +EVENT[1786]: 0.179546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1787]: 0.179562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1788]: 0.179577125 - core[0].svIdle(17), plen 0: [] +EVENT[1789]: 0.180425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1790]: 0.180439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1791]: 0.180454550 - core[1].svIdle(17), plen 0: [] +EVENT[1792]: 0.180546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1793]: 0.180566325 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1794]: 0.180581550 - core[0].svIdle(17), plen 0: [] +EVENT[1795]: 0.181425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1796]: 0.181439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1797]: 0.181454550 - core[1].svIdle(17), plen 0: [] +EVENT[1798]: 0.181546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1799]: 0.181562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1800]: 0.181577125 - core[0].svIdle(17), plen 0: [] +EVENT[1801]: 0.182425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1802]: 0.182439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1803]: 0.182454675 - core[1].svIdle(17), plen 0: [] +EVENT[1804]: 0.182546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1805]: 0.182561675 - core[0].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[1806]: 0.182561675 - core[1].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[1807]: 0.182574250 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1808]: 0.182589925 - core[0].svTaskStartExec(4), plen 0: [tid: 12284596] +EVENT[1809]: 0.182624925 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459168, size: 7, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.182624925] HEAP: Allocated 7 bytes @ 0x3ffbafe0 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1796]: 0.181926275 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461300, size: 14, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.181926275] HEAP: Allocated 14 bytes @ 0x3ffbb834 from task "alloc0" on core 0 by: +EVENT[1810]: 0.182660425 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459220, size: 14, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.182660425] HEAP: Allocated 14 bytes @ 0x3ffbb014 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1797]: 0.181943300 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1798]: 0.181959300 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1799]: 0.182029725 - core[0].svPrint(26), plen 70: [msg: I (490) example: Task[0x3ffb7aec]: allocated 14 bytes @ 0x3ffbb834 +EVENT[1811]: 0.182677350 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1812]: 0.182693275 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1813]: 0.182748050 - core[0].svPrint(26), plen 70: [msg: I (478) example: Task[0x3ffb72b4]: allocated 14 bytes @ 0x3ffbb014 , lvl: 0, unused: 0] -[0.182029725] LOG: I (490) example: Task[0x3ffb7aec]: allocated 14 bytes @ 0x3ffbb834 -EVENT[1800]: 0.182047475 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12287056, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1801]: 0.182060700 - core[0].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[1802]: 0.182060700 - core[1].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[1803]: 0.182076925 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1804]: 0.182087800 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1805]: 0.182098550 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1806]: 0.182112400 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1807]: 0.182123275 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[1808]: 0.182134150 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1809]: 0.182146025 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12287056, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1810]: 0.182156325 - core[0].svIdle(17), plen 0: [] -EVENT[1811]: 0.182167850 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1812]: 0.182184150 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1813]: 0.182247700 - core[1].svPrint(26), plen 63: [msg: I (490) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb834 +[0.182748050] LOG: I (478) example: Task[0x3ffb72b4]: allocated 14 bytes @ 0x3ffbb014 +EVENT[1814]: 0.182761550 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12284952, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1815]: 0.182779025 - core[0].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[1816]: 0.182779025 - core[1].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[1817]: 0.182795275 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1818]: 0.182806100 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1819]: 0.182816975 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1820]: 0.182830800 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1821]: 0.182841650 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[1822]: 0.182852500 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1823]: 0.182864500 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12284952, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1824]: 0.182874800 - core[0].svIdle(17), plen 0: [] +EVENT[1825]: 0.182886425 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1826]: 0.182902750 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1827]: 0.182950525 - core[1].svPrint(26), plen 63: [msg: I (478) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb014 , lvl: 0, unused: 0] -[0.182247700] LOG: I (490) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb834 -EVENT[1814]: 0.182268900 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461300, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.182268900] HEAP: Freed bytes @ 0x3ffbb834 from task "free0" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.182950525] LOG: I (478) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb014 +EVENT[1828]: 0.182971900 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459220, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.182971900] HEAP: Freed bytes @ 0x3ffbb014 from task "free0" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1815]: 0.182300050 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1816]: 0.182311525 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1817]: 0.182328225 - core[1].svIdle(17), plen 0: [] -EVENT[1818]: 0.182669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1819]: 0.182682850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1820]: 0.182698425 - core[1].svIdle(17), plen 0: [] -EVENT[1821]: 0.182813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1822]: 0.182828225 - core[0].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[1823]: 0.182828225 - core[1].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[1824]: 0.182840850 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1825]: 0.182856525 - core[0].svTaskStartExec(4), plen 0: [tid: 12292716] -EVENT[1826]: 0.182891700 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461300, size: 14, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.182891700] HEAP: Allocated 14 bytes @ 0x3ffbb834 from task "alloc1" on core 0 by: +EVENT[1829]: 0.182999325 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1830]: 0.183010850 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1831]: 0.183027425 - core[1].svIdle(17), plen 0: [] +EVENT[1832]: 0.183425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1833]: 0.183439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1834]: 0.183455150 - core[1].svIdle(17), plen 0: [] +EVENT[1835]: 0.183546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1836]: 0.183561650 - core[0].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[1837]: 0.183561650 - core[1].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[1838]: 0.183573550 - core[0].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[1839]: 0.183573550 - core[1].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[1840]: 0.183586100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1841]: 0.183601775 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[1842]: 0.183638150 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459220, size: 14, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.183638150] HEAP: Allocated 14 bytes @ 0x3ffbb014 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1827]: 0.182926225 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461320, size: 28, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.182926225] HEAP: Allocated 28 bytes @ 0x3ffbb848 from task "alloc1" on core 0 by: +EVENT[1843]: 0.183677725 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459240, size: 28, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.183677725] HEAP: Allocated 28 bytes @ 0x3ffbb028 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1828]: 0.182943250 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1829]: 0.182959250 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1830]: 0.183029675 - core[0].svPrint(26), plen 70: [msg: I (491) example: Task[0x3ffb926c]: allocated 28 bytes @ 0x3ffbb848 +EVENT[1844]: 0.183694650 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1845]: 0.183710675 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1846]: 0.183765400 - core[0].svPrint(26), plen 70: [msg: I (479) example: Task[0x3ffb8a34]: allocated 28 bytes @ 0x3ffbb028 , lvl: 0, unused: 0] -[0.183029675] LOG: I (491) example: Task[0x3ffb926c]: allocated 28 bytes @ 0x3ffbb848 -EVENT[1831]: 0.183043225 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12293072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1832]: 0.183060650 - core[0].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[1833]: 0.183060650 - core[1].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[1834]: 0.183076975 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1835]: 0.183087825 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1836]: 0.183098575 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1837]: 0.183112300 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1838]: 0.183123150 - core[1].svTaskStartExec(4), plen 0: [tid: 12295764] -EVENT[1839]: 0.183133975 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1840]: 0.183145825 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12293072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1841]: 0.183156100 - core[0].svIdle(17), plen 0: [] -EVENT[1842]: 0.183167575 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1843]: 0.183183875 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1844]: 0.183247325 - core[1].svPrint(26), plen 63: [msg: I (491) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb848 -, lvl: 0, unused: 0] -[0.183247325] LOG: I (491) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb848 -EVENT[1845]: 0.183268600 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461320, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.183268600] HEAP: Freed bytes @ 0x3ffbb848 from task "free1" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 -/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 -/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 - -EVENT[1846]: 0.183295600 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1847]: 0.183307025 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1848]: 0.183323600 - core[1].svIdle(17), plen 0: [] -EVENT[1849]: 0.183669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1850]: 0.183682950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1851]: 0.183698525 - core[1].svIdle(17), plen 0: [] -EVENT[1852]: 0.183813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1853]: 0.183828325 - core[0].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[1854]: 0.183828325 - core[1].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[1855]: 0.183840975 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1856]: 0.183856650 - core[0].svTaskStartExec(4), plen 0: [tid: 12298716] -EVENT[1857]: 0.183892175 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461320, size: 21, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.183892175] HEAP: Allocated 21 bytes @ 0x3ffbb848 from task "alloc2" on core 0 by: +[0.183765400] LOG: I (479) example: Task[0x3ffb8a34]: allocated 28 bytes @ 0x3ffbb028 +EVENT[1847]: 0.183778825 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12290968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1848]: 0.183792075 - core[0].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[1849]: 0.183792075 - core[1].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[1850]: 0.183808675 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1851]: 0.183819450 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1852]: 0.183830375 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1853]: 0.183844225 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1854]: 0.183856150 - core[1].svTaskStartExec(4), plen 0: [tid: 12293660] +EVENT[1855]: 0.183867325 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1856]: 0.183879250 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12290968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1857]: 0.183891000 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[1858]: 0.183903625 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1859]: 0.183926050 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1860]: 0.183937500 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459272, size: 21, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.183937500] HEAP: Allocated 21 bytes @ 0x3ffbb048 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1858]: 0.183930850 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461348, size: 42, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.183930850] HEAP: Allocated 42 bytes @ 0x3ffbb864 from task "alloc2" on core 0 by: +EVENT[1861]: 0.183978650 - core[1].svPrint(26), plen 63: [msg: I (479) example: Task[0x3ffb961c]: free memory @ 0x3ffbb028 +, lvl: 0, unused: 0] +[0.183978650] LOG: I (479) example: Task[0x3ffb961c]: free memory @ 0x3ffbb028 +EVENT[1862]: 0.183990225 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459300, size: 42, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.183990225] HEAP: Allocated 42 bytes @ 0x3ffbb064 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1859]: 0.183947750 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1860]: 0.183963725 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1861]: 0.184034075 - core[0].svPrint(26), plen 70: [msg: I (492) example: Task[0x3ffba9dc]: allocated 42 bytes @ 0x3ffbb864 -, lvl: 0, unused: 0] -[0.184034075] LOG: I (492) example: Task[0x3ffba9dc]: allocated 42 bytes @ 0x3ffbb864 -EVENT[1862]: 0.184047800 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12299072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1863]: 0.184061025 - core[0].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[1864]: 0.184061025 - core[1].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[1865]: 0.184077325 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1866]: 0.184088175 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1867]: 0.184098950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1868]: 0.184112675 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1869]: 0.184125000 - core[1].svTaskStartExec(4), plen 0: [tid: 12301764] -EVENT[1870]: 0.184135825 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1871]: 0.184147700 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12299072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1872]: 0.184158975 - core[0].svIdle(17), plen 0: [] -EVENT[1873]: 0.184170625 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1874]: 0.184190325 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1875]: 0.184253875 - core[1].svPrint(26), plen 63: [msg: I (492) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb864 -, lvl: 0, unused: 0] -[0.184253875] LOG: I (492) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb864 -EVENT[1876]: 0.184275075 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461348, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.184275075] HEAP: Freed bytes @ 0x3ffbb864 from task "free2" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +EVENT[1863]: 0.184004450 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459240, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.184004450] HEAP: Freed bytes @ 0x3ffbb028 from task "free1" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1877]: 0.184301975 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1878]: 0.184313400 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1879]: 0.184329975 - core[1].svIdle(17), plen 0: [] -EVENT[1880]: 0.184669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1881]: 0.184682950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1882]: 0.184698525 - core[1].svIdle(17), plen 0: [] -EVENT[1883]: 0.184813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1884]: 0.184828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1885]: 0.184843775 - core[0].svIdle(17), plen 0: [] -EVENT[1886]: 0.185669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1887]: 0.185682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1888]: 0.185698325 - core[1].svIdle(17), plen 0: [] -EVENT[1889]: 0.185813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1890]: 0.185828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1891]: 0.185843775 - core[0].svIdle(17), plen 0: [] -EVENT[1892]: 0.186669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1893]: 0.186682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1894]: 0.186698100 - core[1].svIdle(17), plen 0: [] -EVENT[1895]: 0.186813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1896]: 0.186828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1897]: 0.186843775 - core[0].svIdle(17), plen 0: [] -EVENT[1898]: 0.187669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1899]: 0.187682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1900]: 0.187698075 - core[1].svIdle(17), plen 0: [] -EVENT[1901]: 0.187813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1902]: 0.187828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1903]: 0.187843825 - core[0].svIdle(17), plen 0: [] -EVENT[1904]: 0.188669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1905]: 0.188682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1906]: 0.188698075 - core[1].svIdle(17), plen 0: [] -EVENT[1907]: 0.188813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1908]: 0.188828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1909]: 0.188843775 - core[0].svIdle(17), plen 0: [] -EVENT[1910]: 0.189669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1911]: 0.189682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1912]: 0.189698325 - core[1].svIdle(17), plen 0: [] -EVENT[1913]: 0.189813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1914]: 0.189828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1915]: 0.189848100 - core[0].svIdle(17), plen 0: [] -EVENT[1916]: 0.190669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1917]: 0.190682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1918]: 0.190698075 - core[1].svIdle(17), plen 0: [] -EVENT[1919]: 0.190813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1920]: 0.190828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1921]: 0.190843775 - core[0].svIdle(17), plen 0: [] -EVENT[1922]: 0.191669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1923]: 0.191682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1924]: 0.191698325 - core[1].svIdle(17), plen 0: [] -EVENT[1925]: 0.191813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1926]: 0.191828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1927]: 0.191843775 - core[0].svIdle(17), plen 0: [] -EVENT[1928]: 0.192669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1929]: 0.192682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1930]: 0.192698100 - core[1].svIdle(17), plen 0: [] -EVENT[1931]: 0.192813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1932]: 0.192828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1933]: 0.192843775 - core[0].svIdle(17), plen 0: [] -EVENT[1934]: 0.193669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1935]: 0.193682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1936]: 0.193698075 - core[1].svIdle(17), plen 0: [] -EVENT[1937]: 0.193813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1938]: 0.193828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1939]: 0.193843825 - core[0].svIdle(17), plen 0: [] -EVENT[1940]: 0.194669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1941]: 0.194682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1942]: 0.194698075 - core[1].svIdle(17), plen 0: [] -EVENT[1943]: 0.194813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1944]: 0.194828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1945]: 0.194843775 - core[0].svIdle(17), plen 0: [] -EVENT[1946]: 0.195669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1947]: 0.195682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1948]: 0.195698325 - core[1].svIdle(17), plen 0: [] -EVENT[1949]: 0.195813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1950]: 0.195828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1951]: 0.195843775 - core[0].svIdle(17), plen 0: [] -EVENT[1952]: 0.196669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1953]: 0.196682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1954]: 0.196698100 - core[1].svIdle(17), plen 0: [] -EVENT[1955]: 0.196813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1956]: 0.196828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1957]: 0.196843775 - core[0].svIdle(17), plen 0: [] -EVENT[1958]: 0.197669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1959]: 0.197682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1960]: 0.197698075 - core[1].svIdle(17), plen 0: [] -EVENT[1961]: 0.197813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1962]: 0.197828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1963]: 0.197843825 - core[0].svIdle(17), plen 0: [] -EVENT[1964]: 0.198669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1965]: 0.198682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1966]: 0.198698075 - core[1].svIdle(17), plen 0: [] -EVENT[1967]: 0.198813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1968]: 0.198828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1969]: 0.198843775 - core[0].svIdle(17), plen 0: [] -EVENT[1970]: 0.199669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1971]: 0.199682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1972]: 0.199698325 - core[1].svIdle(17), plen 0: [] -EVENT[1973]: 0.199813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1974]: 0.199828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1975]: 0.199843775 - core[0].svIdle(17), plen 0: [] -EVENT[1976]: 0.200669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1977]: 0.200682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1978]: 0.200698100 - core[1].svIdle(17), plen 0: [] -EVENT[1979]: 0.200813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1980]: 0.200828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1981]: 0.200843775 - core[0].svIdle(17), plen 0: [] -EVENT[1982]: 0.201669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1983]: 0.201682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1984]: 0.201698075 - core[1].svIdle(17), plen 0: [] -EVENT[1985]: 0.201813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1986]: 0.201828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1987]: 0.201843825 - core[0].svIdle(17), plen 0: [] -EVENT[1988]: 0.202669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1989]: 0.202682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1990]: 0.202698325 - core[1].svIdle(17), plen 0: [] -EVENT[1991]: 0.202813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1992]: 0.202828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1993]: 0.202843775 - core[0].svIdle(17), plen 0: [] -EVENT[1994]: 0.203669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1995]: 0.203682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1996]: 0.203698100 - core[1].svIdle(17), plen 0: [] -EVENT[1997]: 0.203813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1998]: 0.203828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1999]: 0.203843775 - core[0].svIdle(17), plen 0: [] -EVENT[2000]: 0.204669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2001]: 0.204682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2002]: 0.204698075 - core[1].svIdle(17), plen 0: [] -EVENT[2003]: 0.204813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2004]: 0.204828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2005]: 0.204843825 - core[0].svIdle(17), plen 0: [] -EVENT[2006]: 0.205669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2007]: 0.205682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2008]: 0.205698075 - core[1].svIdle(17), plen 0: [] -EVENT[2009]: 0.205813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2010]: 0.205828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2011]: 0.205843775 - core[0].svIdle(17), plen 0: [] -EVENT[2012]: 0.206669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2013]: 0.206682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2014]: 0.206698325 - core[1].svIdle(17), plen 0: [] -EVENT[2015]: 0.206813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2016]: 0.206828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2017]: 0.206843775 - core[0].svIdle(17), plen 0: [] -EVENT[2018]: 0.207669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2019]: 0.207682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2020]: 0.207698100 - core[1].svIdle(17), plen 0: [] -EVENT[2021]: 0.207813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2022]: 0.207828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2023]: 0.207843775 - core[0].svIdle(17), plen 0: [] -EVENT[2024]: 0.208669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2025]: 0.208682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2026]: 0.208698075 - core[1].svIdle(17), plen 0: [] -EVENT[2027]: 0.208813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2028]: 0.208828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2029]: 0.208843825 - core[0].svIdle(17), plen 0: [] -EVENT[2030]: 0.209669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2031]: 0.209682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2032]: 0.209698075 - core[1].svIdle(17), plen 0: [] -EVENT[2033]: 0.209813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2034]: 0.209828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2035]: 0.209843775 - core[0].svIdle(17), plen 0: [] -EVENT[2036]: 0.210669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2037]: 0.210682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2038]: 0.210698325 - core[1].svIdle(17), plen 0: [] -EVENT[2039]: 0.210813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2040]: 0.210828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2041]: 0.210843775 - core[0].svIdle(17), plen 0: [] -EVENT[2042]: 0.211669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2043]: 0.211682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2044]: 0.211698100 - core[1].svIdle(17), plen 0: [] -EVENT[2045]: 0.211813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2046]: 0.211828325 - core[0].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[2047]: 0.211828325 - core[1].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[2048]: 0.211840975 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2049]: 0.211856650 - core[0].svTaskStartExec(4), plen 0: [tid: 12286700] -EVENT[2050]: 0.211892175 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461348, size: 8, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.211892175] HEAP: Allocated 8 bytes @ 0x3ffbb864 from task "alloc0" on core 0 by: +EVENT[1864]: 0.184017025 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1865]: 0.184036875 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1866]: 0.184047800 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1867]: 0.184059325 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1868]: 0.184077275 - core[1].svIdle(17), plen 0: [] +EVENT[1869]: 0.184095050 - core[0].svPrint(26), plen 70: [msg: I (479) example: Task[0x3ffba1a4]: allocated 42 bytes @ 0x3ffbb064 +, lvl: 0, unused: 0] +[0.184095050] LOG: I (479) example: Task[0x3ffba1a4]: allocated 42 bytes @ 0x3ffbb064 +EVENT[1870]: 0.184112650 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12296968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1871]: 0.184126025 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[1872]: 0.184126025 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[1873]: 0.184142375 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1874]: 0.184153225 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1875]: 0.184164050 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1876]: 0.184177850 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1877]: 0.184188600 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[1878]: 0.184199375 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1879]: 0.184211475 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12296968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1880]: 0.184222675 - core[0].svIdle(17), plen 0: [] +EVENT[1881]: 0.184235025 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1882]: 0.184251250 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1883]: 0.184299250 - core[1].svPrint(26), plen 63: [msg: I (479) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb064 +, lvl: 0, unused: 0] +[0.184299250] LOG: I (479) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb064 +EVENT[1884]: 0.184320675 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459300, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.184320675] HEAP: Freed bytes @ 0x3ffbb064 from task "free2" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 +/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 +/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 + +EVENT[1885]: 0.184352100 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1886]: 0.184363550 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1887]: 0.184380250 - core[1].svIdle(17), plen 0: [] +EVENT[1888]: 0.184425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1889]: 0.184439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1890]: 0.184455150 - core[1].svIdle(17), plen 0: [] +EVENT[1891]: 0.184546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1892]: 0.184562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1893]: 0.184577425 - core[0].svIdle(17), plen 0: [] +EVENT[1894]: 0.185425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1895]: 0.185439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1896]: 0.185454550 - core[1].svIdle(17), plen 0: [] +EVENT[1897]: 0.185546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1898]: 0.185562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1899]: 0.185577125 - core[0].svIdle(17), plen 0: [] +EVENT[1900]: 0.186425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1901]: 0.186439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1902]: 0.186454675 - core[1].svIdle(17), plen 0: [] +EVENT[1903]: 0.186546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1904]: 0.186562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1905]: 0.186577150 - core[0].svIdle(17), plen 0: [] +EVENT[1906]: 0.187425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1907]: 0.187439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1908]: 0.187454600 - core[1].svIdle(17), plen 0: [] +EVENT[1909]: 0.187546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1910]: 0.187562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1911]: 0.187577125 - core[0].svIdle(17), plen 0: [] +EVENT[1912]: 0.188425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1913]: 0.188439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1914]: 0.188454550 - core[1].svIdle(17), plen 0: [] +EVENT[1915]: 0.188546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1916]: 0.188562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1917]: 0.188577425 - core[0].svIdle(17), plen 0: [] +EVENT[1918]: 0.189425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1919]: 0.189439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1920]: 0.189454550 - core[1].svIdle(17), plen 0: [] +EVENT[1921]: 0.189546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1922]: 0.189562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1923]: 0.189577125 - core[0].svIdle(17), plen 0: [] +EVENT[1924]: 0.190425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1925]: 0.190439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1926]: 0.190454675 - core[1].svIdle(17), plen 0: [] +EVENT[1927]: 0.190546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1928]: 0.190562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1929]: 0.190577150 - core[0].svIdle(17), plen 0: [] +EVENT[1930]: 0.191425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1931]: 0.191439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1932]: 0.191454600 - core[1].svIdle(17), plen 0: [] +EVENT[1933]: 0.191546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1934]: 0.191562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1935]: 0.191577125 - core[0].svIdle(17), plen 0: [] +EVENT[1936]: 0.192425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1937]: 0.192439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1938]: 0.192454550 - core[1].svIdle(17), plen 0: [] +EVENT[1939]: 0.192546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1940]: 0.192562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1941]: 0.192577425 - core[0].svIdle(17), plen 0: [] +EVENT[1942]: 0.193425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1943]: 0.193439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1944]: 0.193454550 - core[1].svIdle(17), plen 0: [] +EVENT[1945]: 0.193546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1946]: 0.193562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1947]: 0.193577125 - core[0].svIdle(17), plen 0: [] +EVENT[1948]: 0.194425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1949]: 0.194443650 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1950]: 0.194458800 - core[1].svIdle(17), plen 0: [] +EVENT[1951]: 0.194546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1952]: 0.194562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1953]: 0.194577125 - core[0].svIdle(17), plen 0: [] +EVENT[1954]: 0.195425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1955]: 0.195439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1956]: 0.195454550 - core[1].svIdle(17), plen 0: [] +EVENT[1957]: 0.195546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1958]: 0.195562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1959]: 0.195577425 - core[0].svIdle(17), plen 0: [] +EVENT[1960]: 0.196425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1961]: 0.196439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1962]: 0.196454550 - core[1].svIdle(17), plen 0: [] +EVENT[1963]: 0.196546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1964]: 0.196562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1965]: 0.196577125 - core[0].svIdle(17), plen 0: [] +EVENT[1966]: 0.197425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1967]: 0.197439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1968]: 0.197454675 - core[1].svIdle(17), plen 0: [] +EVENT[1969]: 0.197546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1970]: 0.197562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1971]: 0.197577150 - core[0].svIdle(17), plen 0: [] +EVENT[1972]: 0.198425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1973]: 0.198439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1974]: 0.198454600 - core[1].svIdle(17), plen 0: [] +EVENT[1975]: 0.198546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1976]: 0.198562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1977]: 0.198577125 - core[0].svIdle(17), plen 0: [] +EVENT[1978]: 0.199425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1979]: 0.199439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1980]: 0.199454550 - core[1].svIdle(17), plen 0: [] +EVENT[1981]: 0.199546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1982]: 0.199562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1983]: 0.199577425 - core[0].svIdle(17), plen 0: [] +EVENT[1984]: 0.200425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1985]: 0.200439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1986]: 0.200454550 - core[1].svIdle(17), plen 0: [] +EVENT[1987]: 0.200546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1988]: 0.200562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1989]: 0.200577125 - core[0].svIdle(17), plen 0: [] +EVENT[1990]: 0.201425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1991]: 0.201439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1992]: 0.201454675 - core[1].svIdle(17), plen 0: [] +EVENT[1993]: 0.201546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1994]: 0.201562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1995]: 0.201577150 - core[0].svIdle(17), plen 0: [] +EVENT[1996]: 0.202425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1997]: 0.202439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1998]: 0.202454600 - core[1].svIdle(17), plen 0: [] +EVENT[1999]: 0.202546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2000]: 0.202562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2001]: 0.202577125 - core[0].svIdle(17), plen 0: [] +EVENT[2002]: 0.203425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2003]: 0.203439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2004]: 0.203454550 - core[1].svIdle(17), plen 0: [] +EVENT[2005]: 0.203546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2006]: 0.203562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2007]: 0.203577425 - core[0].svIdle(17), plen 0: [] +EVENT[2008]: 0.204425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2009]: 0.204439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2010]: 0.204454550 - core[1].svIdle(17), plen 0: [] +EVENT[2011]: 0.204546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2012]: 0.204562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2013]: 0.204577125 - core[0].svIdle(17), plen 0: [] +EVENT[2014]: 0.205425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2015]: 0.205439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2016]: 0.205454675 - core[1].svIdle(17), plen 0: [] +EVENT[2017]: 0.205546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2018]: 0.205562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2019]: 0.205577150 - core[0].svIdle(17), plen 0: [] +EVENT[2020]: 0.206425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2021]: 0.206443675 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2022]: 0.206458925 - core[1].svIdle(17), plen 0: [] +EVENT[2023]: 0.206546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2024]: 0.206562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2025]: 0.206577125 - core[0].svIdle(17), plen 0: [] +EVENT[2026]: 0.207425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2027]: 0.207439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2028]: 0.207454550 - core[1].svIdle(17), plen 0: [] +EVENT[2029]: 0.207546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2030]: 0.207562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2031]: 0.207577425 - core[0].svIdle(17), plen 0: [] +EVENT[2032]: 0.208425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2033]: 0.208439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2034]: 0.208454550 - core[1].svIdle(17), plen 0: [] +EVENT[2035]: 0.208546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2036]: 0.208562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2037]: 0.208577125 - core[0].svIdle(17), plen 0: [] +EVENT[2038]: 0.209425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2039]: 0.209439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2040]: 0.209454675 - core[1].svIdle(17), plen 0: [] +EVENT[2041]: 0.209546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2042]: 0.209562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2043]: 0.209577150 - core[0].svIdle(17), plen 0: [] +EVENT[2044]: 0.210425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2045]: 0.210439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2046]: 0.210454600 - core[1].svIdle(17), plen 0: [] +EVENT[2047]: 0.210546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2048]: 0.210562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2049]: 0.210577125 - core[0].svIdle(17), plen 0: [] +EVENT[2050]: 0.211425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2051]: 0.211439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2052]: 0.211454550 - core[1].svIdle(17), plen 0: [] +EVENT[2053]: 0.211546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2054]: 0.211562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2055]: 0.211577425 - core[0].svIdle(17), plen 0: [] +EVENT[2056]: 0.212425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2057]: 0.212439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2058]: 0.212454550 - core[1].svIdle(17), plen 0: [] +EVENT[2059]: 0.212546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2060]: 0.212561650 - core[0].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[2061]: 0.212561650 - core[1].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[2062]: 0.212574300 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2063]: 0.212590225 - core[0].svTaskStartExec(4), plen 0: [tid: 12284596] +EVENT[2064]: 0.212626475 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459240, size: 8, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.212626475] HEAP: Allocated 8 bytes @ 0x3ffbb028 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2051]: 0.211930650 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461364, size: 16, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.211930650] HEAP: Allocated 16 bytes @ 0x3ffbb874 from task "alloc0" on core 0 by: +EVENT[2065]: 0.212662050 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459300, size: 16, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.212662050] HEAP: Allocated 16 bytes @ 0x3ffbb064 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2052]: 0.211947550 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2053]: 0.211963550 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2054]: 0.212033875 - core[0].svPrint(26), plen 70: [msg: I (520) example: Task[0x3ffb7aec]: allocated 16 bytes @ 0x3ffbb874 +EVENT[2066]: 0.212679025 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2067]: 0.212695000 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2068]: 0.212753400 - core[0].svPrint(26), plen 70: [msg: I (508) example: Task[0x3ffb72b4]: allocated 16 bytes @ 0x3ffbb064 , lvl: 0, unused: 0] -[0.212033875] LOG: I (520) example: Task[0x3ffb7aec]: allocated 16 bytes @ 0x3ffbb874 -EVENT[2055]: 0.212047475 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12287056, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2056]: 0.212060700 - core[0].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[2057]: 0.212060700 - core[1].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[2058]: 0.212076950 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[2059]: 0.212087800 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[2060]: 0.212098575 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2061]: 0.212112375 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[2062]: 0.212123175 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[2063]: 0.212134025 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2064]: 0.212145900 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12287056, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[2065]: 0.212156200 - core[0].svIdle(17), plen 0: [] -EVENT[2066]: 0.212167725 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2067]: 0.212188150 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2068]: 0.212251700 - core[1].svPrint(26), plen 63: [msg: I (520) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb874 +[0.212753400] LOG: I (508) example: Task[0x3ffb72b4]: allocated 16 bytes @ 0x3ffbb064 +EVENT[2069]: 0.212766900 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12284952, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2070]: 0.212780050 - core[0].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[2071]: 0.212780050 - core[1].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[2072]: 0.212796275 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2073]: 0.212807100 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[2074]: 0.212817975 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2075]: 0.212831875 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2076]: 0.212842675 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[2077]: 0.212853400 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2078]: 0.212865525 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12284952, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[2079]: 0.212875725 - core[0].svIdle(17), plen 0: [] +EVENT[2080]: 0.212887475 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2081]: 0.212903825 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2082]: 0.212951700 - core[1].svPrint(26), plen 63: [msg: I (508) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb064 , lvl: 0, unused: 0] -[0.212251700] LOG: I (520) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb874 -EVENT[2069]: 0.212272900 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461364, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.212272900] HEAP: Freed bytes @ 0x3ffbb874 from task "free0" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.212951700] LOG: I (508) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb064 +EVENT[2083]: 0.212972900 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459300, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.212972900] HEAP: Freed bytes @ 0x3ffbb064 from task "free0" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2070]: 0.212299800 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[2071]: 0.212311225 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2072]: 0.212327800 - core[1].svIdle(17), plen 0: [] -EVENT[2073]: 0.212669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2074]: 0.212682950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2075]: 0.212698525 - core[1].svIdle(17), plen 0: [] -EVENT[2076]: 0.212813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2077]: 0.212828325 - core[0].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[2078]: 0.212828325 - core[1].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[2079]: 0.212840975 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2080]: 0.212856775 - core[0].svTaskStartExec(4), plen 0: [tid: 12292716] -EVENT[2081]: 0.212892175 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461364, size: 16, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.212892175] HEAP: Allocated 16 bytes @ 0x3ffbb874 from task "alloc1" on core 0 by: +EVENT[2084]: 0.213004375 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2085]: 0.213015825 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2086]: 0.213032525 - core[1].svIdle(17), plen 0: [] +EVENT[2087]: 0.213425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2088]: 0.213439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2089]: 0.213455150 - core[1].svIdle(17), plen 0: [] +EVENT[2090]: 0.213546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2091]: 0.213561700 - core[0].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[2092]: 0.213561700 - core[1].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[2093]: 0.213573550 - core[0].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[2094]: 0.213573550 - core[1].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[2095]: 0.213586050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2096]: 0.213601725 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[2097]: 0.213638150 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459300, size: 16, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.213638150] HEAP: Allocated 16 bytes @ 0x3ffbb064 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2082]: 0.212926875 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461384, size: 32, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.212926875] HEAP: Allocated 32 bytes @ 0x3ffbb888 from task "alloc1" on core 0 by: +EVENT[2098]: 0.213673775 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459320, size: 32, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.213673775] HEAP: Allocated 32 bytes @ 0x3ffbb078 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2083]: 0.212943800 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2084]: 0.212963975 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2085]: 0.213034425 - core[0].svPrint(26), plen 70: [msg: I (521) example: Task[0x3ffb926c]: allocated 32 bytes @ 0x3ffbb888 +EVENT[2099]: 0.213690700 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2100]: 0.213706725 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2101]: 0.213761450 - core[0].svPrint(26), plen 70: [msg: I (509) example: Task[0x3ffb8a34]: allocated 32 bytes @ 0x3ffbb078 , lvl: 0, unused: 0] -[0.213034425] LOG: I (521) example: Task[0x3ffb926c]: allocated 32 bytes @ 0x3ffbb888 -EVENT[2086]: 0.213048050 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12293072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2087]: 0.213061250 - core[0].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[2088]: 0.213061250 - core[1].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[2089]: 0.213077550 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[2090]: 0.213088400 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[2091]: 0.213099150 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2092]: 0.213112875 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[2093]: 0.213123725 - core[1].svTaskStartExec(4), plen 0: [tid: 12295764] -EVENT[2094]: 0.213134550 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2095]: 0.213146575 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12293072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[2096]: 0.213156950 - core[0].svIdle(17), plen 0: [] -EVENT[2097]: 0.213168350 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2098]: 0.213184750 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2099]: 0.213248200 - core[1].svPrint(26), plen 63: [msg: I (521) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb888 -, lvl: 0, unused: 0] -[0.213248200] LOG: I (521) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb888 -EVENT[2100]: 0.213273225 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461384, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.213273225] HEAP: Freed bytes @ 0x3ffbb888 from task "free1" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 -/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 -/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 - -EVENT[2101]: 0.213300225 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[2102]: 0.213311650 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2103]: 0.213328225 - core[1].svIdle(17), plen 0: [] -EVENT[2104]: 0.213669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2105]: 0.213682950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2106]: 0.213698525 - core[1].svIdle(17), plen 0: [] -EVENT[2107]: 0.213813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2108]: 0.213828325 - core[0].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[2109]: 0.213828325 - core[1].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[2110]: 0.213840975 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2111]: 0.213856650 - core[0].svTaskStartExec(4), plen 0: [tid: 12298716] -EVENT[2112]: 0.213892175 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461384, size: 24, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.213892175] HEAP: Allocated 24 bytes @ 0x3ffbb888 from task "alloc2" on core 0 by: +[0.213761450] LOG: I (509) example: Task[0x3ffb8a34]: allocated 32 bytes @ 0x3ffbb078 +EVENT[2102]: 0.213778750 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12290968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2103]: 0.213792000 - core[0].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[2104]: 0.213792000 - core[1].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[2105]: 0.213808350 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2106]: 0.213819200 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[2107]: 0.213830025 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2108]: 0.213843800 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2109]: 0.213855750 - core[1].svTaskStartExec(4), plen 0: [tid: 12293660] +EVENT[2110]: 0.213866900 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2111]: 0.213878850 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12290968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[2112]: 0.213890500 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[2113]: 0.213902200 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2114]: 0.213920800 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2115]: 0.213933875 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459356, size: 24, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.213933875] HEAP: Allocated 24 bytes @ 0x3ffbb09c from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2113]: 0.213926725 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461412, size: 48, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.213926725] HEAP: Allocated 48 bytes @ 0x3ffbb8a4 from task "alloc2" on core 0 by: +EVENT[2116]: 0.213974650 - core[1].svPrint(26), plen 63: [msg: I (509) example: Task[0x3ffb961c]: free memory @ 0x3ffbb078 +, lvl: 0, unused: 0] +[0.213974650] LOG: I (509) example: Task[0x3ffb961c]: free memory @ 0x3ffbb078 +EVENT[2117]: 0.213990500 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459384, size: 48, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.213990500] HEAP: Allocated 48 bytes @ 0x3ffbb0b8 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2114]: 0.213943625 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2115]: 0.213959625 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2116]: 0.214029950 - core[0].svPrint(26), plen 70: [msg: I (522) example: Task[0x3ffba9dc]: allocated 48 bytes @ 0x3ffbb8a4 -, lvl: 0, unused: 0] -[0.214029950] LOG: I (522) example: Task[0x3ffba9dc]: allocated 48 bytes @ 0x3ffbb8a4 -EVENT[2117]: 0.214050450 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12299072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2118]: 0.214063675 - core[0].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[2119]: 0.214063675 - core[1].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[2120]: 0.214080000 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[2121]: 0.214090850 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[2122]: 0.214101600 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2123]: 0.214115500 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[2124]: 0.214126375 - core[1].svTaskStartExec(4), plen 0: [tid: 12301764] -EVENT[2125]: 0.214137200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2126]: 0.214149050 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12299072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[2127]: 0.214160350 - core[0].svIdle(17), plen 0: [] -EVENT[2128]: 0.214171975 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2129]: 0.214188375 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2130]: 0.214251925 - core[1].svPrint(26), plen 63: [msg: I (522) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb8a4 -, lvl: 0, unused: 0] -[0.214251925] LOG: I (522) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb8a4 -EVENT[2131]: 0.214273125 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461412, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.214273125] HEAP: Freed bytes @ 0x3ffbb8a4 from task "free2" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +EVENT[2118]: 0.214004800 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459320, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.214004800] HEAP: Freed bytes @ 0x3ffbb078 from task "free1" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2132]: 0.214303450 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[2133]: 0.214314925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2134]: 0.214331625 - core[1].svIdle(17), plen 0: [] -EVENT[2135]: 0.214669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2136]: 0.214682850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2137]: 0.214698425 - core[1].svIdle(17), plen 0: [] -EVENT[2138]: 0.214813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2139]: 0.214828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2140]: 0.214843825 - core[0].svIdle(17), plen 0: [] -EVENT[2141]: 0.215669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2142]: 0.215682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2143]: 0.215698075 - core[1].svIdle(17), plen 0: [] -EVENT[2144]: 0.215813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2145]: 0.215828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2146]: 0.215843775 - core[0].svIdle(17), plen 0: [] -EVENT[2147]: 0.216669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2148]: 0.216682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2149]: 0.216698325 - core[1].svIdle(17), plen 0: [] -EVENT[2150]: 0.216813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2151]: 0.216828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2152]: 0.216843775 - core[0].svIdle(17), plen 0: [] -EVENT[2153]: 0.217669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2154]: 0.217682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2155]: 0.217698100 - core[1].svIdle(17), plen 0: [] -EVENT[2156]: 0.217813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2157]: 0.217828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2158]: 0.217843775 - core[0].svIdle(17), plen 0: [] -EVENT[2159]: 0.218669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2160]: 0.218682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2161]: 0.218698075 - core[1].svIdle(17), plen 0: [] -EVENT[2162]: 0.218813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2163]: 0.218828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2164]: 0.218843825 - core[0].svIdle(17), plen 0: [] -EVENT[2165]: 0.219669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2166]: 0.219682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2167]: 0.219698075 - core[1].svIdle(17), plen 0: [] -EVENT[2168]: 0.219813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2169]: 0.219828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2170]: 0.219843775 - core[0].svIdle(17), plen 0: [] -EVENT[2171]: 0.220669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2172]: 0.220682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2173]: 0.220698325 - core[1].svIdle(17), plen 0: [] -EVENT[2174]: 0.220813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2175]: 0.220828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2176]: 0.220843775 - core[0].svIdle(17), plen 0: [] -EVENT[2177]: 0.221669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2178]: 0.221682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2179]: 0.221698100 - core[1].svIdle(17), plen 0: [] -EVENT[2180]: 0.221813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2181]: 0.221828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2182]: 0.221843775 - core[0].svIdle(17), plen 0: [] -EVENT[2183]: 0.222669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2184]: 0.222682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2185]: 0.222698075 - core[1].svIdle(17), plen 0: [] -EVENT[2186]: 0.222813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2187]: 0.222828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2188]: 0.222843825 - core[0].svIdle(17), plen 0: [] -EVENT[2189]: 0.223669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2190]: 0.223682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2191]: 0.223698075 - core[1].svIdle(17), plen 0: [] -EVENT[2192]: 0.223813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2193]: 0.223828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2194]: 0.223843775 - core[0].svIdle(17), plen 0: [] -EVENT[2195]: 0.224669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2196]: 0.224687175 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2197]: 0.224702325 - core[1].svIdle(17), plen 0: [] -EVENT[2198]: 0.224813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2199]: 0.224828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2200]: 0.224843775 - core[0].svIdle(17), plen 0: [] -EVENT[2201]: 0.225669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2202]: 0.225682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2203]: 0.225698075 - core[1].svIdle(17), plen 0: [] -EVENT[2204]: 0.225813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2205]: 0.225828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2206]: 0.225843825 - core[0].svIdle(17), plen 0: [] -EVENT[2207]: 0.226669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2208]: 0.226682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2209]: 0.226698075 - core[1].svIdle(17), plen 0: [] -EVENT[2210]: 0.226813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2211]: 0.226828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2212]: 0.226843775 - core[0].svIdle(17), plen 0: [] -EVENT[2213]: 0.227669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2214]: 0.227682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2215]: 0.227698325 - core[1].svIdle(17), plen 0: [] -EVENT[2216]: 0.227813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2217]: 0.227828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2218]: 0.227843775 - core[0].svIdle(17), plen 0: [] -EVENT[2219]: 0.228669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2220]: 0.228682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2221]: 0.228698100 - core[1].svIdle(17), plen 0: [] -EVENT[2222]: 0.228813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2223]: 0.228828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2224]: 0.228843775 - core[0].svIdle(17), plen 0: [] -EVENT[2225]: 0.229669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2226]: 0.229682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2227]: 0.229698075 - core[1].svIdle(17), plen 0: [] -EVENT[2228]: 0.229813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2229]: 0.229828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2230]: 0.229843825 - core[0].svIdle(17), plen 0: [] -EVENT[2231]: 0.230669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2232]: 0.230682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2233]: 0.230698075 - core[1].svIdle(17), plen 0: [] -EVENT[2234]: 0.230813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2235]: 0.230828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2236]: 0.230843775 - core[0].svIdle(17), plen 0: [] -EVENT[2237]: 0.231669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2238]: 0.231682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2239]: 0.231698325 - core[1].svIdle(17), plen 0: [] -EVENT[2240]: 0.231813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2241]: 0.231828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2242]: 0.231843775 - core[0].svIdle(17), plen 0: [] -EVENT[2243]: 0.232669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2244]: 0.232682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2245]: 0.232698100 - core[1].svIdle(17), plen 0: [] -EVENT[2246]: 0.232813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2247]: 0.232828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2248]: 0.232843775 - core[0].svIdle(17), plen 0: [] -EVENT[2249]: 0.233669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2250]: 0.233682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2251]: 0.233698075 - core[1].svIdle(17), plen 0: [] -EVENT[2252]: 0.233813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2253]: 0.233828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2254]: 0.233843825 - core[0].svIdle(17), plen 0: [] -EVENT[2255]: 0.234669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2256]: 0.234682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2257]: 0.234698075 - core[1].svIdle(17), plen 0: [] -EVENT[2258]: 0.234813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2259]: 0.234828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2260]: 0.234843775 - core[0].svIdle(17), plen 0: [] -EVENT[2261]: 0.235669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2262]: 0.235682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2263]: 0.235698325 - core[1].svIdle(17), plen 0: [] -EVENT[2264]: 0.235813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2265]: 0.235828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2266]: 0.235843775 - core[0].svIdle(17), plen 0: [] -EVENT[2267]: 0.236669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2268]: 0.236686525 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2269]: 0.236701650 - core[1].svIdle(17), plen 0: [] -EVENT[2270]: 0.236813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2271]: 0.236828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2272]: 0.236843775 - core[0].svIdle(17), plen 0: [] -EVENT[2273]: 0.237669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2274]: 0.237682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2275]: 0.237698075 - core[1].svIdle(17), plen 0: [] -EVENT[2276]: 0.237813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2277]: 0.237828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2278]: 0.237843825 - core[0].svIdle(17), plen 0: [] -EVENT[2279]: 0.238669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2280]: 0.238682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2281]: 0.238698075 - core[1].svIdle(17), plen 0: [] -EVENT[2282]: 0.238813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2283]: 0.238828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2284]: 0.238843775 - core[0].svIdle(17), plen 0: [] -EVENT[2285]: 0.239669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2286]: 0.239682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2287]: 0.239698325 - core[1].svIdle(17), plen 0: [] -EVENT[2288]: 0.239813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2289]: 0.239828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2290]: 0.239843775 - core[0].svIdle(17), plen 0: [] -EVENT[2291]: 0.240669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2292]: 0.240682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2293]: 0.240698100 - core[1].svIdle(17), plen 0: [] -EVENT[2294]: 0.240813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2295]: 0.240828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2296]: 0.240843775 - core[0].svIdle(17), plen 0: [] -EVENT[2297]: 0.241669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2298]: 0.241682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2299]: 0.241698075 - core[1].svIdle(17), plen 0: [] -EVENT[2300]: 0.241813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2301]: 0.241828225 - core[0].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[2302]: 0.241828225 - core[1].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[2303]: 0.241840850 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2304]: 0.241856525 - core[0].svTaskStartExec(4), plen 0: [tid: 12286700] -EVENT[2305]: 0.241891850 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461412, size: 9, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.241891850] HEAP: Allocated 9 bytes @ 0x3ffbb8a4 from task "alloc0" on core 0 by: +EVENT[2119]: 0.214017225 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2120]: 0.214037250 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2121]: 0.214048175 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2122]: 0.214059725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2123]: 0.214077675 - core[1].svIdle(17), plen 0: [] +EVENT[2124]: 0.214095675 - core[0].svPrint(26), plen 70: [msg: I (509) example: Task[0x3ffba1a4]: allocated 48 bytes @ 0x3ffbb0b8 +, lvl: 0, unused: 0] +[0.214095675] LOG: I (509) example: Task[0x3ffba1a4]: allocated 48 bytes @ 0x3ffbb0b8 +EVENT[2125]: 0.214109125 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12296968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2126]: 0.215654450 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2127]: 0.215666025 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[2128]: 0.215666025 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[2129]: 0.215683825 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2130]: 0.215694950 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2131]: 0.215705850 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2132]: 0.215717500 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2133]: 0.215728000 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2134]: 0.215738875 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2135]: 0.215749800 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2136]: 0.215761550 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2137]: 0.215772300 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2138]: 0.215783750 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[2139]: 0.215801425 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[2140]: 0.215815250 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[2141]: 0.215827525 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12296968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[2142]: 0.215838975 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2143]: 0.215851050 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2144]: 0.215862100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2145]: 0.215874300 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2146]: 0.215885925 - core[0].svIdle(17), plen 0: [] +EVENT[2147]: 0.215935950 - core[1].svPrint(26), plen 63: [msg: I (511) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb0b8 +, lvl: 0, unused: 0] +[0.215935950] LOG: I (511) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb0b8 +EVENT[2148]: 0.215957325 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459384, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.215957325] HEAP: Freed bytes @ 0x3ffbb0b8 from task "free2" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 +/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 +/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 + +EVENT[2149]: 0.215984750 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2150]: 0.215996150 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2151]: 0.216012725 - core[1].svIdle(17), plen 0: [] +EVENT[2152]: 0.216425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2153]: 0.216439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2154]: 0.216454975 - core[1].svIdle(17), plen 0: [] +EVENT[2155]: 0.216546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2156]: 0.216562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2157]: 0.216577425 - core[0].svIdle(17), plen 0: [] +EVENT[2158]: 0.217425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2159]: 0.217439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2160]: 0.217454675 - core[1].svIdle(17), plen 0: [] +EVENT[2161]: 0.217546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2162]: 0.217562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2163]: 0.217577150 - core[0].svIdle(17), plen 0: [] +EVENT[2164]: 0.218425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2165]: 0.218439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2166]: 0.218454600 - core[1].svIdle(17), plen 0: [] +EVENT[2167]: 0.218546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2168]: 0.218562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2169]: 0.218577125 - core[0].svIdle(17), plen 0: [] +EVENT[2170]: 0.219425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2171]: 0.219439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2172]: 0.219454550 - core[1].svIdle(17), plen 0: [] +EVENT[2173]: 0.219546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2174]: 0.219562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2175]: 0.219577425 - core[0].svIdle(17), plen 0: [] +EVENT[2176]: 0.220425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2177]: 0.220439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2178]: 0.220454550 - core[1].svIdle(17), plen 0: [] +EVENT[2179]: 0.220546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2180]: 0.220562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2181]: 0.220577125 - core[0].svIdle(17), plen 0: [] +EVENT[2182]: 0.221425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2183]: 0.221439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2184]: 0.221454675 - core[1].svIdle(17), plen 0: [] +EVENT[2185]: 0.221546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2186]: 0.221562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2187]: 0.221577150 - core[0].svIdle(17), plen 0: [] +EVENT[2188]: 0.222425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2189]: 0.222439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2190]: 0.222454600 - core[1].svIdle(17), plen 0: [] +EVENT[2191]: 0.222546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2192]: 0.222562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2193]: 0.222577125 - core[0].svIdle(17), plen 0: [] +EVENT[2194]: 0.223425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2195]: 0.223439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2196]: 0.223454550 - core[1].svIdle(17), plen 0: [] +EVENT[2197]: 0.223546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2198]: 0.223562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2199]: 0.223577425 - core[0].svIdle(17), plen 0: [] +EVENT[2200]: 0.224425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2201]: 0.224439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2202]: 0.224454550 - core[1].svIdle(17), plen 0: [] +EVENT[2203]: 0.224546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2204]: 0.224562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2205]: 0.224577125 - core[0].svIdle(17), plen 0: [] +EVENT[2206]: 0.225425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2207]: 0.225439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2208]: 0.225454675 - core[1].svIdle(17), plen 0: [] +EVENT[2209]: 0.225546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2210]: 0.225562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2211]: 0.225577150 - core[0].svIdle(17), plen 0: [] +EVENT[2212]: 0.226425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2213]: 0.226439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2214]: 0.226454600 - core[1].svIdle(17), plen 0: [] +EVENT[2215]: 0.226546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2216]: 0.226562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2217]: 0.226577125 - core[0].svIdle(17), plen 0: [] +EVENT[2218]: 0.227425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2219]: 0.227439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2220]: 0.227454550 - core[1].svIdle(17), plen 0: [] +EVENT[2221]: 0.227546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2222]: 0.227562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2223]: 0.227577425 - core[0].svIdle(17), plen 0: [] +EVENT[2224]: 0.228425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2225]: 0.228439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2226]: 0.228454550 - core[1].svIdle(17), plen 0: [] +EVENT[2227]: 0.228546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2228]: 0.228562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2229]: 0.228577125 - core[0].svIdle(17), plen 0: [] +EVENT[2230]: 0.229425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2231]: 0.229443675 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2232]: 0.229458825 - core[1].svIdle(17), plen 0: [] +EVENT[2233]: 0.229546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2234]: 0.229562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2235]: 0.229577125 - core[0].svIdle(17), plen 0: [] +EVENT[2236]: 0.230425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2237]: 0.230439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2238]: 0.230454550 - core[1].svIdle(17), plen 0: [] +EVENT[2239]: 0.230546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2240]: 0.230562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2241]: 0.230577425 - core[0].svIdle(17), plen 0: [] +EVENT[2242]: 0.231425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2243]: 0.231439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2244]: 0.231454550 - core[1].svIdle(17), plen 0: [] +EVENT[2245]: 0.231546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2246]: 0.231562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2247]: 0.231577125 - core[0].svIdle(17), plen 0: [] +EVENT[2248]: 0.232425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2249]: 0.232439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2250]: 0.232454675 - core[1].svIdle(17), plen 0: [] +EVENT[2251]: 0.232546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2252]: 0.232562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2253]: 0.232577150 - core[0].svIdle(17), plen 0: [] +EVENT[2254]: 0.233425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2255]: 0.233439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2256]: 0.233454600 - core[1].svIdle(17), plen 0: [] +EVENT[2257]: 0.233546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2258]: 0.233562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2259]: 0.233577125 - core[0].svIdle(17), plen 0: [] +EVENT[2260]: 0.234425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2261]: 0.234439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2262]: 0.234454550 - core[1].svIdle(17), plen 0: [] +EVENT[2263]: 0.234546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2264]: 0.234562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2265]: 0.234577425 - core[0].svIdle(17), plen 0: [] +EVENT[2266]: 0.235425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2267]: 0.235439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2268]: 0.235454550 - core[1].svIdle(17), plen 0: [] +EVENT[2269]: 0.235546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2270]: 0.235562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2271]: 0.235577125 - core[0].svIdle(17), plen 0: [] +EVENT[2272]: 0.236425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2273]: 0.236439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2274]: 0.236454675 - core[1].svIdle(17), plen 0: [] +EVENT[2275]: 0.236546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2276]: 0.236562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2277]: 0.236577150 - core[0].svIdle(17), plen 0: [] +EVENT[2278]: 0.237425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2279]: 0.237439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2280]: 0.237454600 - core[1].svIdle(17), plen 0: [] +EVENT[2281]: 0.237546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2282]: 0.237562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2283]: 0.237577125 - core[0].svIdle(17), plen 0: [] +EVENT[2284]: 0.238425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2285]: 0.238439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2286]: 0.238454550 - core[1].svIdle(17), plen 0: [] +EVENT[2287]: 0.238546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2288]: 0.238562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2289]: 0.238577425 - core[0].svIdle(17), plen 0: [] +EVENT[2290]: 0.239425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2291]: 0.239439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2292]: 0.239454550 - core[1].svIdle(17), plen 0: [] +EVENT[2293]: 0.239546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2294]: 0.239562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2295]: 0.239577125 - core[0].svIdle(17), plen 0: [] +EVENT[2296]: 0.240425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2297]: 0.240439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2298]: 0.240454675 - core[1].svIdle(17), plen 0: [] +EVENT[2299]: 0.240546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2300]: 0.240562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2301]: 0.240577150 - core[0].svIdle(17), plen 0: [] +EVENT[2302]: 0.241425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2303]: 0.241443000 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2304]: 0.241458125 - core[1].svIdle(17), plen 0: [] +EVENT[2305]: 0.241546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2306]: 0.241562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2307]: 0.241577125 - core[0].svIdle(17), plen 0: [] +EVENT[2308]: 0.242425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2309]: 0.242439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2310]: 0.242454550 - core[1].svIdle(17), plen 0: [] +EVENT[2311]: 0.242546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2312]: 0.242561700 - core[0].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[2313]: 0.242561700 - core[1].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[2314]: 0.242574300 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2315]: 0.242589975 - core[0].svTaskStartExec(4), plen 0: [tid: 12284596] +EVENT[2316]: 0.242625100 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459256, size: 9, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.242625100] HEAP: Allocated 9 bytes @ 0x3ffbb038 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2306]: 0.241926275 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461428, size: 18, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.241926275] HEAP: Allocated 18 bytes @ 0x3ffbb8b4 from task "alloc0" on core 0 by: +EVENT[2317]: 0.242659350 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459320, size: 18, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.242659350] HEAP: Allocated 18 bytes @ 0x3ffbb078 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2307]: 0.241943300 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2308]: 0.241959300 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2309]: 0.242029725 - core[0].svPrint(26), plen 70: [msg: I (550) example: Task[0x3ffb7aec]: allocated 18 bytes @ 0x3ffbb8b4 +EVENT[2318]: 0.242676400 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2319]: 0.242692425 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2320]: 0.242747250 - core[0].svPrint(26), plen 70: [msg: I (538) example: Task[0x3ffb72b4]: allocated 18 bytes @ 0x3ffbb078 , lvl: 0, unused: 0] -[0.242029725] LOG: I (550) example: Task[0x3ffb7aec]: allocated 18 bytes @ 0x3ffbb8b4 -EVENT[2310]: 0.242047550 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12287056, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2311]: 0.242060775 - core[0].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[2312]: 0.242060775 - core[1].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[2313]: 0.242077000 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[2314]: 0.242087875 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[2315]: 0.242098625 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2316]: 0.242112475 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[2317]: 0.242123350 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[2318]: 0.242134175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2319]: 0.242146150 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12287056, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[2320]: 0.242156400 - core[0].svIdle(17), plen 0: [] -EVENT[2321]: 0.242167800 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2322]: 0.242184175 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2323]: 0.242247725 - core[1].svPrint(26), plen 63: [msg: I (550) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb8b4 +[0.242747250] LOG: I (538) example: Task[0x3ffb72b4]: allocated 18 bytes @ 0x3ffbb078 +EVENT[2321]: 0.242760625 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12284952, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2322]: 0.242774025 - core[0].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[2323]: 0.242774025 - core[1].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[2324]: 0.242790200 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2325]: 0.242806100 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[2326]: 0.242816800 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2327]: 0.242830525 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2328]: 0.242841300 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[2329]: 0.242852050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2330]: 0.242864300 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12284952, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[2331]: 0.242875550 - core[0].svIdle(17), plen 0: [] +EVENT[2332]: 0.242892800 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2333]: 0.242909050 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2334]: 0.242956925 - core[1].svPrint(26), plen 63: [msg: I (538) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb078 , lvl: 0, unused: 0] -[0.242247725] LOG: I (550) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb8b4 -EVENT[2324]: 0.242268925 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461428, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.242268925] HEAP: Freed bytes @ 0x3ffbb8b4 from task "free0" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.242956925] LOG: I (538) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb078 +EVENT[2335]: 0.242978325 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459320, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.242978325] HEAP: Freed bytes @ 0x3ffbb078 from task "free0" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2325]: 0.242299925 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[2326]: 0.242311400 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2327]: 0.242328100 - core[1].svIdle(17), plen 0: [] -EVENT[2328]: 0.242669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2329]: 0.242682850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2330]: 0.242698425 - core[1].svIdle(17), plen 0: [] -EVENT[2331]: 0.242813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2332]: 0.242828225 - core[0].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[2333]: 0.242828225 - core[1].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[2334]: 0.242840850 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2335]: 0.242856525 - core[0].svTaskStartExec(4), plen 0: [tid: 12292716] -EVENT[2336]: 0.242891850 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461428, size: 18, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.242891850] HEAP: Allocated 18 bytes @ 0x3ffbb8b4 from task "alloc1" on core 0 by: +EVENT[2336]: 0.243004800 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2337]: 0.243016200 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2338]: 0.243032775 - core[1].svIdle(17), plen 0: [] +EVENT[2339]: 0.243425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2340]: 0.243439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2341]: 0.243455150 - core[1].svIdle(17), plen 0: [] +EVENT[2342]: 0.243546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2343]: 0.243561650 - core[0].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[2344]: 0.243561650 - core[1].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[2345]: 0.243574300 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2346]: 0.243590225 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[2347]: 0.243625450 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459320, size: 18, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.243625450] HEAP: Allocated 18 bytes @ 0x3ffbb078 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2337]: 0.242926425 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461452, size: 36, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.242926425] HEAP: Allocated 36 bytes @ 0x3ffbb8cc from task "alloc1" on core 0 by: +EVENT[2348]: 0.243661200 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459384, size: 36, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.243661200] HEAP: Allocated 36 bytes @ 0x3ffbb0b8 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2338]: 0.242943450 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2339]: 0.242959450 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2340]: 0.243029875 - core[0].svPrint(26), plen 70: [msg: I (551) example: Task[0x3ffb926c]: allocated 36 bytes @ 0x3ffbb8cc +EVENT[2349]: 0.243682350 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2350]: 0.243698300 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2351]: 0.243753075 - core[0].svPrint(26), plen 70: [msg: I (539) example: Task[0x3ffb8a34]: allocated 36 bytes @ 0x3ffbb0b8 , lvl: 0, unused: 0] -[0.243029875] LOG: I (551) example: Task[0x3ffb926c]: allocated 36 bytes @ 0x3ffbb8cc -EVENT[2341]: 0.243043425 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12293072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2342]: 0.243060250 - core[0].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[2343]: 0.243060250 - core[1].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[2344]: 0.243076550 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[2345]: 0.243087400 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[2346]: 0.243098150 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2347]: 0.243111875 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[2348]: 0.243122725 - core[1].svTaskStartExec(4), plen 0: [tid: 12295764] -EVENT[2349]: 0.243133550 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2350]: 0.243145575 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12293072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[2351]: 0.243155950 - core[0].svIdle(17), plen 0: [] -EVENT[2352]: 0.243167350 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2353]: 0.243183750 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2354]: 0.243247200 - core[1].svPrint(26), plen 63: [msg: I (551) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb8cc +[0.243753075] LOG: I (539) example: Task[0x3ffb8a34]: allocated 36 bytes @ 0x3ffbb0b8 +EVENT[2352]: 0.243766550 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12290968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2353]: 0.243779725 - core[0].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[2354]: 0.243779725 - core[1].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[2355]: 0.243796025 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2356]: 0.243806875 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[2357]: 0.243817700 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2358]: 0.243831575 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2359]: 0.243842375 - core[1].svTaskStartExec(4), plen 0: [tid: 12293660] +EVENT[2360]: 0.243853100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2361]: 0.243865225 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12290968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[2362]: 0.243876425 - core[0].svIdle(17), plen 0: [] +EVENT[2363]: 0.243888150 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2364]: 0.243904550 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2365]: 0.243952425 - core[1].svPrint(26), plen 63: [msg: I (539) example: Task[0x3ffb961c]: free memory @ 0x3ffbb0b8 , lvl: 0, unused: 0] -[0.243247200] LOG: I (551) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb8cc -EVENT[2355]: 0.243268350 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461452, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.243268350] HEAP: Freed bytes @ 0x3ffbb8cc from task "free1" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.243952425] LOG: I (539) example: Task[0x3ffb961c]: free memory @ 0x3ffbb0b8 +EVENT[2366]: 0.243977950 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459384, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.243977950] HEAP: Freed bytes @ 0x3ffbb0b8 from task "free1" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2356]: 0.243295350 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[2357]: 0.243306775 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2358]: 0.243323350 - core[1].svIdle(17), plen 0: [] -EVENT[2359]: 0.243669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2360]: 0.243682950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2361]: 0.243698525 - core[1].svIdle(17), plen 0: [] -EVENT[2362]: 0.243813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2363]: 0.243828325 - core[0].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[2364]: 0.243828325 - core[1].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[2365]: 0.243840975 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2366]: 0.243856650 - core[0].svTaskStartExec(4), plen 0: [tid: 12298716] -EVENT[2367]: 0.243892175 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461452, size: 27, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.243892175] HEAP: Allocated 27 bytes @ 0x3ffbb8cc from task "alloc2" on core 0 by: +EVENT[2367]: 0.244005350 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2368]: 0.244016775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2369]: 0.244033325 - core[1].svIdle(17), plen 0: [] +EVENT[2370]: 0.244425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2371]: 0.244439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2372]: 0.244455150 - core[1].svIdle(17), plen 0: [] +EVENT[2373]: 0.244546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2374]: 0.244562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2375]: 0.244577125 - core[0].svIdle(17), plen 0: [] +EVENT[2376]: 0.245425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2377]: 0.245439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2378]: 0.245454550 - core[1].svIdle(17), plen 0: [] +EVENT[2379]: 0.245546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2380]: 0.245561700 - core[0].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[2381]: 0.245561700 - core[1].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[2382]: 0.245574300 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2383]: 0.245589975 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[2384]: 0.245626175 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459384, size: 27, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.245626175] HEAP: Allocated 27 bytes @ 0x3ffbb0b8 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2368]: 0.243930850 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461484, size: 54, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.243930850] HEAP: Allocated 54 bytes @ 0x3ffbb8ec from task "alloc2" on core 0 by: +EVENT[2385]: 0.245661800 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459416, size: 54, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.245661800] HEAP: Allocated 54 bytes @ 0x3ffbb0d8 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2369]: 0.243947750 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2370]: 0.243963875 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2371]: 0.244034325 - core[0].svPrint(26), plen 70: [msg: I (552) example: Task[0x3ffba9dc]: allocated 54 bytes @ 0x3ffbb8ec +EVENT[2386]: 0.245678850 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2387]: 0.245699000 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2388]: 0.245753825 - core[0].svPrint(26), plen 70: [msg: I (541) example: Task[0x3ffba1a4]: allocated 54 bytes @ 0x3ffbb0d8 , lvl: 0, unused: 0] -[0.244034325] LOG: I (552) example: Task[0x3ffba9dc]: allocated 54 bytes @ 0x3ffbb8ec -EVENT[2372]: 0.244047925 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12299072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2373]: 0.244061150 - core[0].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[2374]: 0.244061150 - core[1].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[2375]: 0.244077475 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[2376]: 0.244088325 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[2377]: 0.244099075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2378]: 0.244112800 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[2379]: 0.244123700 - core[1].svTaskStartExec(4), plen 0: [tid: 12301764] -EVENT[2380]: 0.244134525 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2381]: 0.244146375 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12299072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[2382]: 0.244157675 - core[0].svIdle(17), plen 0: [] -EVENT[2383]: 0.244169300 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2384]: 0.244189750 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2385]: 0.244253300 - core[1].svPrint(26), plen 63: [msg: I (552) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb8ec +[0.245753825] LOG: I (541) example: Task[0x3ffba1a4]: allocated 54 bytes @ 0x3ffbb0d8 +EVENT[2389]: 0.245767425 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12296968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2390]: 0.245780625 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[2391]: 0.245780625 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[2392]: 0.245796975 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2393]: 0.245807850 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[2394]: 0.245818650 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2395]: 0.245832350 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2396]: 0.245843200 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[2397]: 0.245854025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2398]: 0.245865975 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12296968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[2399]: 0.245877175 - core[0].svIdle(17), plen 0: [] +EVENT[2400]: 0.245889575 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2401]: 0.245905825 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2402]: 0.245953600 - core[1].svPrint(26), plen 63: [msg: I (541) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb0d8 , lvl: 0, unused: 0] -[0.244253300] LOG: I (552) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb8ec -EVENT[2386]: 0.244274500 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461484, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.244274500] HEAP: Freed bytes @ 0x3ffbb8ec from task "free2" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.245953600] LOG: I (541) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb0d8 +EVENT[2403]: 0.245978850 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459416, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.245978850] HEAP: Freed bytes @ 0x3ffbb0d8 from task "free2" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2387]: 0.244301400 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[2388]: 0.244312825 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2389]: 0.244329400 - core[1].svIdle(17), plen 0: [] -EVENT[2390]: 0.244669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2391]: 0.244682950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2392]: 0.244698525 - core[1].svIdle(17), plen 0: [] -EVENT[2393]: 0.244813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2394]: 0.244828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2395]: 0.244843775 - core[0].svIdle(17), plen 0: [] -EVENT[2396]: 0.245669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2397]: 0.245682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2398]: 0.245698325 - core[1].svIdle(17), plen 0: [] -EVENT[2399]: 0.245813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2400]: 0.245828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2401]: 0.245843775 - core[0].svIdle(17), plen 0: [] -EVENT[2402]: 0.246669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2403]: 0.246682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2404]: 0.246698100 - core[1].svIdle(17), plen 0: [] -EVENT[2405]: 0.246813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2406]: 0.246828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2407]: 0.246843775 - core[0].svIdle(17), plen 0: [] -EVENT[2408]: 0.247669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2409]: 0.247682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2410]: 0.247698075 - core[1].svIdle(17), plen 0: [] -EVENT[2411]: 0.247813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2412]: 0.247828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2413]: 0.247843825 - core[0].svIdle(17), plen 0: [] -EVENT[2414]: 0.248669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2415]: 0.248682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2416]: 0.248698075 - core[1].svIdle(17), plen 0: [] -EVENT[2417]: 0.248813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2418]: 0.248828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2419]: 0.248843775 - core[0].svIdle(17), plen 0: [] -EVENT[2420]: 0.249669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2421]: 0.249682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2422]: 0.249698325 - core[1].svIdle(17), plen 0: [] -EVENT[2423]: 0.249813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2424]: 0.249828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2425]: 0.249848325 - core[0].svIdle(17), plen 0: [] -EVENT[2426]: 0.250669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2427]: 0.250682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2428]: 0.250698075 - core[1].svIdle(17), plen 0: [] -EVENT[2429]: 0.250813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2430]: 0.250828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2431]: 0.250843775 - core[0].svIdle(17), plen 0: [] -EVENT[2432]: 0.251669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2433]: 0.251682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2434]: 0.251698325 - core[1].svIdle(17), plen 0: [] -EVENT[2435]: 0.251813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2436]: 0.251828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2437]: 0.251843775 - core[0].svIdle(17), plen 0: [] -EVENT[2438]: 0.252669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2439]: 0.252682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2440]: 0.252698100 - core[1].svIdle(17), plen 0: [] -EVENT[2441]: 0.252813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2442]: 0.252828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2443]: 0.252843775 - core[0].svIdle(17), plen 0: [] -EVENT[2444]: 0.253669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2445]: 0.253682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2446]: 0.253698075 - core[1].svIdle(17), plen 0: [] -EVENT[2447]: 0.253813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2448]: 0.253828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2449]: 0.253843825 - core[0].svIdle(17), plen 0: [] -EVENT[2450]: 0.254669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2451]: 0.254682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2452]: 0.254698075 - core[1].svIdle(17), plen 0: [] -EVENT[2453]: 0.254813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2454]: 0.254828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2455]: 0.254843775 - core[0].svIdle(17), plen 0: [] -EVENT[2456]: 0.255669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2457]: 0.255682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2458]: 0.255698325 - core[1].svIdle(17), plen 0: [] -EVENT[2459]: 0.255813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2460]: 0.255828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2461]: 0.255843775 - core[0].svIdle(17), plen 0: [] -EVENT[2462]: 0.256669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2463]: 0.256682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2464]: 0.256698100 - core[1].svIdle(17), plen 0: [] -EVENT[2465]: 0.256813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2466]: 0.256828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2467]: 0.256843775 - core[0].svIdle(17), plen 0: [] -EVENT[2468]: 0.257669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2469]: 0.257682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2470]: 0.257698075 - core[1].svIdle(17), plen 0: [] -EVENT[2471]: 0.257813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2472]: 0.257828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2473]: 0.257843825 - core[0].svIdle(17), plen 0: [] -EVENT[2474]: 0.258669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2475]: 0.258682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2476]: 0.258698075 - core[1].svIdle(17), plen 0: [] -EVENT[2477]: 0.258813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2478]: 0.258828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2479]: 0.258843775 - core[0].svIdle(17), plen 0: [] -EVENT[2480]: 0.259669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2481]: 0.259682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2482]: 0.259698325 - core[1].svIdle(17), plen 0: [] -EVENT[2483]: 0.259813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2484]: 0.259828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2485]: 0.259843775 - core[0].svIdle(17), plen 0: [] -EVENT[2486]: 0.260669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2487]: 0.260682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2488]: 0.260698100 - core[1].svIdle(17), plen 0: [] -EVENT[2489]: 0.260813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2490]: 0.260828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2491]: 0.260843775 - core[0].svIdle(17), plen 0: [] -EVENT[2492]: 0.261669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2493]: 0.261682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2494]: 0.261698075 - core[1].svIdle(17), plen 0: [] -EVENT[2495]: 0.261813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2496]: 0.261828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2497]: 0.261843825 - core[0].svIdle(17), plen 0: [] -EVENT[2498]: 0.262669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2499]: 0.262682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2500]: 0.262698325 - core[1].svIdle(17), plen 0: [] -EVENT[2501]: 0.262813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2502]: 0.262828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2503]: 0.262843775 - core[0].svIdle(17), plen 0: [] -EVENT[2504]: 0.263669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2505]: 0.263682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2506]: 0.263698100 - core[1].svIdle(17), plen 0: [] -EVENT[2507]: 0.263813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2508]: 0.263828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2509]: 0.263843775 - core[0].svIdle(17), plen 0: [] -EVENT[2510]: 0.264669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2511]: 0.264682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2512]: 0.264698075 - core[1].svIdle(17), plen 0: [] -EVENT[2513]: 0.264813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2514]: 0.264828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2515]: 0.264843825 - core[0].svIdle(17), plen 0: [] -EVENT[2516]: 0.265669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2517]: 0.265682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2518]: 0.265698075 - core[1].svIdle(17), plen 0: [] -EVENT[2519]: 0.265813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2520]: 0.265828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2521]: 0.265843775 - core[0].svIdle(17), plen 0: [] -EVENT[2522]: 0.266669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2523]: 0.266682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2524]: 0.266698325 - core[1].svIdle(17), plen 0: [] -EVENT[2525]: 0.266813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2526]: 0.266828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2527]: 0.266843775 - core[0].svIdle(17), plen 0: [] -EVENT[2528]: 0.267669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2529]: 0.267682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2530]: 0.267698100 - core[1].svIdle(17), plen 0: [] -EVENT[2531]: 0.267813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2532]: 0.267828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2533]: 0.267843775 - core[0].svIdle(17), plen 0: [] -EVENT[2534]: 0.268669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2535]: 0.268682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2536]: 0.268698075 - core[1].svIdle(17), plen 0: [] -EVENT[2537]: 0.268813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2538]: 0.268828600 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2539]: 0.268843825 - core[0].svIdle(17), plen 0: [] -EVENT[2540]: 0.269669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2541]: 0.269682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2542]: 0.269698075 - core[1].svIdle(17), plen 0: [] -EVENT[2543]: 0.269813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2544]: 0.269828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2545]: 0.269843775 - core[0].svIdle(17), plen 0: [] -EVENT[2546]: 0.270669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2547]: 0.270682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2548]: 0.270698325 - core[1].svIdle(17), plen 0: [] -EVENT[2549]: 0.270813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2550]: 0.270828700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2551]: 0.270843775 - core[0].svIdle(17), plen 0: [] -EVENT[2552]: 0.271669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2553]: 0.271682975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2554]: 0.271698100 - core[1].svIdle(17), plen 0: [] -EVENT[2555]: 0.271813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2556]: 0.271828325 - core[0].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[2557]: 0.271828325 - core[1].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[2558]: 0.271840975 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2559]: 0.271856650 - core[0].svTaskStartExec(4), plen 0: [tid: 12286700] -EVENT[2560]: 0.271875150 - core[0].xTaskGenericNotify(44), plen 7: [xTaskToNotify: 12254080, ulValue: 0, eAction: 2, pulPreviousNotificationValue: 0] -EVENT[2561]: 0.271886225 - core[0].svTaskStartReady(6), plen 0: [tid: 12254080] -EVENT[2562]: 0.271886225 - core[1].svTaskStartReady(6), plen 0: [tid: 12254080] -EVENT[2563]: 0.271899375 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 100] -EVENT[2564]: 0.271915925 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[2565]: 0.271927300 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2566]: 0.271944250 - core[0].svTaskStartExec(4), plen 0: [tid: 12254080] -EVENT[2567]: 0.271962125 - core[0].ulTaskNotifyTake(37), plen 6: [xClearCountOnExit: 0, xTicksToWait: 4294967295] -EVENT[2568]: 0.271978075 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2569]: 0.271993975 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2570]: 0.272043200 - core[0].svPrint(26), plen 37: [msg: I (580) example: Got notify val 1 +EVENT[2404]: 0.246006250 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2405]: 0.246017675 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2406]: 0.246034225 - core[1].svIdle(17), plen 0: [] +EVENT[2407]: 0.246425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2408]: 0.246439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2409]: 0.246455150 - core[1].svIdle(17), plen 0: [] +EVENT[2410]: 0.246546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2411]: 0.246562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2412]: 0.246577125 - core[0].svIdle(17), plen 0: [] +EVENT[2413]: 0.247425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2414]: 0.247439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2415]: 0.247454550 - core[1].svIdle(17), plen 0: [] +EVENT[2416]: 0.247546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2417]: 0.247562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2418]: 0.247577425 - core[0].svIdle(17), plen 0: [] +EVENT[2419]: 0.248425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2420]: 0.248439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2421]: 0.248454550 - core[1].svIdle(17), plen 0: [] +EVENT[2422]: 0.248546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2423]: 0.248562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2424]: 0.248577125 - core[0].svIdle(17), plen 0: [] +EVENT[2425]: 0.249425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2426]: 0.249439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2427]: 0.249454675 - core[1].svIdle(17), plen 0: [] +EVENT[2428]: 0.249546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2429]: 0.249562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2430]: 0.249577150 - core[0].svIdle(17), plen 0: [] +EVENT[2431]: 0.250425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2432]: 0.250439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2433]: 0.250454600 - core[1].svIdle(17), plen 0: [] +EVENT[2434]: 0.250546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2435]: 0.250562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2436]: 0.250577125 - core[0].svIdle(17), plen 0: [] +EVENT[2437]: 0.251425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2438]: 0.251439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2439]: 0.251454550 - core[1].svIdle(17), plen 0: [] +EVENT[2440]: 0.251546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2441]: 0.251562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2442]: 0.251577425 - core[0].svIdle(17), plen 0: [] +EVENT[2443]: 0.252425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2444]: 0.252439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2445]: 0.252454550 - core[1].svIdle(17), plen 0: [] +EVENT[2446]: 0.252546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2447]: 0.252562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2448]: 0.252577125 - core[0].svIdle(17), plen 0: [] +EVENT[2449]: 0.253425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2450]: 0.253443075 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2451]: 0.253458200 - core[1].svIdle(17), plen 0: [] +EVENT[2452]: 0.253546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2453]: 0.253562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2454]: 0.253577125 - core[0].svIdle(17), plen 0: [] +EVENT[2455]: 0.254425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2456]: 0.254439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2457]: 0.254454550 - core[1].svIdle(17), plen 0: [] +EVENT[2458]: 0.254546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2459]: 0.254562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2460]: 0.254577425 - core[0].svIdle(17), plen 0: [] +EVENT[2461]: 0.255425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2462]: 0.255439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2463]: 0.255454550 - core[1].svIdle(17), plen 0: [] +EVENT[2464]: 0.255546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2465]: 0.255562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2466]: 0.255577125 - core[0].svIdle(17), plen 0: [] +EVENT[2467]: 0.256425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2468]: 0.256439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2469]: 0.256454675 - core[1].svIdle(17), plen 0: [] +EVENT[2470]: 0.256546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2471]: 0.256562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2472]: 0.256577150 - core[0].svIdle(17), plen 0: [] +EVENT[2473]: 0.257425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2474]: 0.257439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2475]: 0.257454600 - core[1].svIdle(17), plen 0: [] +EVENT[2476]: 0.257546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2477]: 0.257562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2478]: 0.257577125 - core[0].svIdle(17), plen 0: [] +EVENT[2479]: 0.258425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2480]: 0.258439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2481]: 0.258454550 - core[1].svIdle(17), plen 0: [] +EVENT[2482]: 0.258546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2483]: 0.258562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2484]: 0.258577425 - core[0].svIdle(17), plen 0: [] +EVENT[2485]: 0.259425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2486]: 0.259439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2487]: 0.259454550 - core[1].svIdle(17), plen 0: [] +EVENT[2488]: 0.259546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2489]: 0.259562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2490]: 0.259577125 - core[0].svIdle(17), plen 0: [] +EVENT[2491]: 0.260425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2492]: 0.260439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2493]: 0.260454675 - core[1].svIdle(17), plen 0: [] +EVENT[2494]: 0.260546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2495]: 0.260562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2496]: 0.260577150 - core[0].svIdle(17), plen 0: [] +EVENT[2497]: 0.261425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2498]: 0.261439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2499]: 0.261454600 - core[1].svIdle(17), plen 0: [] +EVENT[2500]: 0.261546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2501]: 0.261562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2502]: 0.261577125 - core[0].svIdle(17), plen 0: [] +EVENT[2503]: 0.262425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2504]: 0.262439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2505]: 0.262454550 - core[1].svIdle(17), plen 0: [] +EVENT[2506]: 0.262546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2507]: 0.262562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2508]: 0.262577425 - core[0].svIdle(17), plen 0: [] +EVENT[2509]: 0.263425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2510]: 0.263439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2511]: 0.263454550 - core[1].svIdle(17), plen 0: [] +EVENT[2512]: 0.263546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2513]: 0.263562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2514]: 0.263577125 - core[0].svIdle(17), plen 0: [] +EVENT[2515]: 0.264425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2516]: 0.264439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2517]: 0.264454675 - core[1].svIdle(17), plen 0: [] +EVENT[2518]: 0.264546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2519]: 0.264562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2520]: 0.264577150 - core[0].svIdle(17), plen 0: [] +EVENT[2521]: 0.265425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2522]: 0.265443675 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2523]: 0.265458825 - core[1].svIdle(17), plen 0: [] +EVENT[2524]: 0.265546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2525]: 0.265562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2526]: 0.265577125 - core[0].svIdle(17), plen 0: [] +EVENT[2527]: 0.266425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2528]: 0.266439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2529]: 0.266454550 - core[1].svIdle(17), plen 0: [] +EVENT[2530]: 0.266546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2531]: 0.266562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2532]: 0.266577425 - core[0].svIdle(17), plen 0: [] +EVENT[2533]: 0.267425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2534]: 0.267439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2535]: 0.267454550 - core[1].svIdle(17), plen 0: [] +EVENT[2536]: 0.267546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2537]: 0.267562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2538]: 0.267577125 - core[0].svIdle(17), plen 0: [] +EVENT[2539]: 0.268425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2540]: 0.268439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2541]: 0.268454675 - core[1].svIdle(17), plen 0: [] +EVENT[2542]: 0.268546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2543]: 0.268562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2544]: 0.268577150 - core[0].svIdle(17), plen 0: [] +EVENT[2545]: 0.269425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2546]: 0.269439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2547]: 0.269454600 - core[1].svIdle(17), plen 0: [] +EVENT[2548]: 0.269546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2549]: 0.269562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2550]: 0.269577125 - core[0].svIdle(17), plen 0: [] +EVENT[2551]: 0.270425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2552]: 0.270439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2553]: 0.270454550 - core[1].svIdle(17), plen 0: [] +EVENT[2554]: 0.270546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2555]: 0.270562100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2556]: 0.270577425 - core[0].svIdle(17), plen 0: [] +EVENT[2557]: 0.271425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2558]: 0.271439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2559]: 0.271454550 - core[1].svIdle(17), plen 0: [] +EVENT[2560]: 0.271546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2561]: 0.271562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2562]: 0.271577125 - core[0].svIdle(17), plen 0: [] +EVENT[2563]: 0.272425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2564]: 0.272439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2565]: 0.272454675 - core[1].svIdle(17), plen 0: [] +EVENT[2566]: 0.272546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2567]: 0.272561675 - core[0].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[2568]: 0.272561675 - core[1].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[2569]: 0.272574250 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2570]: 0.272589925 - core[0].svTaskStartExec(4), plen 0: [tid: 12284596] +EVENT[2571]: 0.272608100 - core[0].xTaskGenericNotify(44), plen 7: [xTaskToNotify: 12274964, ulValue: 0, eAction: 2, pulPreviousNotificationValue: 0] +EVENT[2572]: 0.272619125 - core[0].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[2573]: 0.272619125 - core[1].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[2574]: 0.272632225 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 100] +EVENT[2575]: 0.272648775 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2576]: 0.272660150 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2577]: 0.272677100 - core[0].svTaskStartExec(4), plen 0: [tid: 12274964] +EVENT[2578]: 0.272690850 - core[0].ulTaskNotifyTake(37), plen 6: [xClearCountOnExit: 0, xTicksToWait: 4294967295] +EVENT[2579]: 0.272706775 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2580]: 0.272722800 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2581]: 0.272764375 - core[0].svPrint(26), plen 37: [msg: I (568) example: Got notify val 1 , lvl: 0, unused: 0] -[0.272043200] LOG: I (580) example: Got notify val 1 -EVENT[2571]: 0.272059500 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2572]: 0.272075450 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2573]: 0.272119800 - core[0].svPrint(26), plen 34: [msg: I (580) example: Wait notify 1 +[0.272764375] LOG: I (568) example: Got notify val 1 +EVENT[2582]: 0.272784725 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2583]: 0.272800650 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2584]: 0.272837200 - core[0].svPrint(26), plen 34: [msg: I (568) example: Wait notify 1 , lvl: 0, unused: 0] -[0.272119800] LOG: I (580) example: Wait notify 1 -EVENT[2574]: 0.272138175 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[2575]: 0.272149575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2576]: 0.272165625 - core[0].svIdle(17), plen 0: [] -EVENT[2577]: 0.272669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2578]: 0.272682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2579]: 0.272698075 - core[1].svIdle(17), plen 0: [] -EVENT[2580]: 0.272813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2581]: 0.272828325 - core[0].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[2582]: 0.272828325 - core[1].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[2583]: 0.272840975 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2584]: 0.272856775 - core[0].svTaskStartExec(4), plen 0: [tid: 12292716] -EVENT[2585]: 0.272871200 - core[0].xTaskGenericNotify(44), plen 7: [xTaskToNotify: 12254080, ulValue: 0, eAction: 2, pulPreviousNotificationValue: 0] -EVENT[2586]: 0.272882200 - core[0].svTaskStartReady(6), plen 0: [tid: 12254080] -EVENT[2587]: 0.272882200 - core[1].svTaskStartReady(6), plen 0: [tid: 12254080] -EVENT[2588]: 0.272895325 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 100] -EVENT[2589]: 0.272911925 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[2590]: 0.272923300 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2591]: 0.272940250 - core[0].svTaskStartExec(4), plen 0: [tid: 12254080] -EVENT[2592]: 0.272953950 - core[0].ulTaskNotifyTake(37), plen 6: [xClearCountOnExit: 0, xTicksToWait: 4294967295] -EVENT[2593]: 0.272969875 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2594]: 0.272985925 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2595]: 0.273035525 - core[0].svPrint(26), plen 37: [msg: I (581) example: Got notify val 1 +[0.272837200] LOG: I (568) example: Wait notify 1 +EVENT[2585]: 0.272855425 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2586]: 0.272866775 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2587]: 0.272882700 - core[0].svIdle(17), plen 0: [] +EVENT[2588]: 0.273425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2589]: 0.273439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2590]: 0.273454675 - core[1].svIdle(17), plen 0: [] +EVENT[2591]: 0.273546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2592]: 0.273561675 - core[0].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[2593]: 0.273561675 - core[1].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[2594]: 0.273574250 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2595]: 0.273589925 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[2596]: 0.273604300 - core[0].xTaskGenericNotify(44), plen 7: [xTaskToNotify: 12274964, ulValue: 0, eAction: 2, pulPreviousNotificationValue: 0] +EVENT[2597]: 0.273615325 - core[0].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[2598]: 0.273615325 - core[1].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[2599]: 0.273628425 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 100] +EVENT[2600]: 0.273644975 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2601]: 0.273656350 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2602]: 0.273673300 - core[0].svTaskStartExec(4), plen 0: [tid: 12274964] +EVENT[2603]: 0.273687050 - core[0].ulTaskNotifyTake(37), plen 6: [xClearCountOnExit: 0, xTicksToWait: 4294967295] +EVENT[2604]: 0.273702975 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2605]: 0.273719000 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2606]: 0.273756475 - core[0].svPrint(26), plen 37: [msg: I (569) example: Got notify val 1 , lvl: 0, unused: 0] -[0.273035525] LOG: I (581) example: Got notify val 1 -EVENT[2596]: 0.273051825 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2597]: 0.273067775 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2598]: 0.273112250 - core[0].svPrint(26), plen 34: [msg: I (581) example: Wait notify 2 +[0.273756475] LOG: I (569) example: Got notify val 1 +EVENT[2607]: 0.273776650 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2608]: 0.273792575 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2609]: 0.273829125 - core[0].svPrint(26), plen 34: [msg: I (569) example: Wait notify 2 , lvl: 0, unused: 0] -[0.273112250] LOG: I (581) example: Wait notify 2 -EVENT[2599]: 0.273130625 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[2600]: 0.273142025 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2601]: 0.273158075 - core[0].svIdle(17), plen 0: [] -EVENT[2602]: 0.273669400 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2603]: 0.273682925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2604]: 0.273698075 - core[1].svIdle(17), plen 0: [] -EVENT[2605]: 0.273813200 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2606]: 0.273828325 - core[0].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[2607]: 0.273828325 - core[1].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[2608]: 0.273840975 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2609]: 0.273856775 - core[0].svTaskStartExec(4), plen 0: [tid: 12298716] -EVENT[2610]: 0.273871200 - core[0].xTaskGenericNotify(44), plen 7: [xTaskToNotify: 12254080, ulValue: 0, eAction: 2, pulPreviousNotificationValue: 0] -EVENT[2611]: 0.273882200 - core[0].svTaskStartReady(6), plen 0: [tid: 12254080] -EVENT[2612]: 0.273882200 - core[1].svTaskStartReady(6), plen 0: [tid: 12254080] -EVENT[2613]: 0.273895325 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 100] -EVENT[2614]: 0.273911925 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[2615]: 0.273923300 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2616]: 0.273940250 - core[0].svTaskStartExec(4), plen 0: [tid: 12254080] -EVENT[2617]: 0.273953950 - core[0].ulTaskNotifyTake(37), plen 6: [xClearCountOnExit: 0, xTicksToWait: 4294967295] -EVENT[2618]: 0.273969875 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2619]: 0.273985925 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2620]: 0.274031175 - core[0].svPrint(26), plen 37: [msg: I (582) example: Got notify val 1 +[0.273829125] LOG: I (569) example: Wait notify 2 +EVENT[2610]: 0.273847350 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2611]: 0.273858700 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2612]: 0.273874625 - core[0].svIdle(17), plen 0: [] +EVENT[2613]: 0.274425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2614]: 0.274439400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2615]: 0.274454675 - core[1].svIdle(17), plen 0: [] +EVENT[2616]: 0.274546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2617]: 0.274562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2618]: 0.274577150 - core[0].svIdle(17), plen 0: [] +EVENT[2619]: 0.275425900 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2620]: 0.275439450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2621]: 0.275454600 - core[1].svIdle(17), plen 0: [] +EVENT[2622]: 0.275546700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2623]: 0.275561650 - core[0].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[2624]: 0.275561650 - core[1].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[2625]: 0.275574300 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2626]: 0.275589975 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[2627]: 0.275604400 - core[0].xTaskGenericNotify(44), plen 7: [xTaskToNotify: 12274964, ulValue: 0, eAction: 2, pulPreviousNotificationValue: 0] +EVENT[2628]: 0.275615400 - core[0].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[2629]: 0.275615400 - core[1].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[2630]: 0.275628550 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 100] +EVENT[2631]: 0.275645125 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2632]: 0.275656475 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2633]: 0.275673425 - core[0].svTaskStartExec(4), plen 0: [tid: 12274964] +EVENT[2634]: 0.275687250 - core[0].ulTaskNotifyTake(37), plen 6: [xClearCountOnExit: 0, xTicksToWait: 4294967295] +EVENT[2635]: 0.275703250 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2636]: 0.275719275 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2637]: 0.275756850 - core[0].svPrint(26), plen 37: [msg: I (571) example: Got notify val 1 , lvl: 0, unused: 0] -[0.274031175] LOG: I (582) example: Got notify val 1 -EVENT[2621]: 0.329656225 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2622]: 0.329664950 - core[0].svTraceStop(11), plen 0: [] -EVENT[2623]: 0.329664950 - core[1].svTraceStop(11), plen 0: [] -Processed 2624 events +[0.275756850] LOG: I (571) example: Got notify val 1 +EVENT[2638]: 0.329911225 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2639]: 0.329919950 - core[0].svTraceStop(11), plen 0: [] +EVENT[2640]: 0.329919950 - core[1].svTraceStop(11), plen 0: [] +Processed 2641 events =============== LOG TRACE REPORT =============== Processed 60 log messages. =============== HEAP TRACE REPORT =============== Processed 99 heap events. -[0.001529550] HEAP: Allocated 8 bytes @ 0x3ffb70d8 from task "main" on core 0 by: +[0.001637325] HEAP: Allocated 8 bytes @ 0x3ffb68a0 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:87 -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.001864250] HEAP: Allocated 2500 bytes @ 0x3ffb70e8 from task "main" on core 0 by: +[0.001939050] HEAP: Allocated 2500 bytes @ 0x3ffb68b0 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.001904100] HEAP: Allocated 340 bytes @ 0x3ffb7aec from task "main" on core 0 by: +[0.001979950] HEAP: Allocated 340 bytes @ 0x3ffb72b4 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.002037875] HEAP: Allocated 124 bytes @ 0x3ffb7c50 from task "alloc0" on core 0 by: +[0.002130925] HEAP: Allocated 124 bytes @ 0x3ffb7418 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/queue.c:545 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:48 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.002107400] HEAP: Allocated 2500 bytes @ 0x3ffb7cd0 from task "alloc0" on core 0 by: +[0.002205450] HEAP: Allocated 2500 bytes @ 0x3ffb7498 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.002141800] HEAP: Allocated 340 bytes @ 0x3ffb86d4 from task "alloc0" on core 0 by: +[0.002240900] HEAP: Allocated 340 bytes @ 0x3ffb7e9c from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.002245650] HEAP: Allocated 1 bytes @ 0x3ffb8838 from task "alloc0" on core 0 by: +[0.002345850] HEAP: Allocated 1 bytes @ 0x3ffb8000 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.002782075] HEAP: Allocated 8 bytes @ 0x3ffb8858 from task "main" on core 0 by: +[0.002949925] HEAP: Allocated 8 bytes @ 0x3ffb8020 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:87 -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.002860725] HEAP: Allocated 2500 bytes @ 0x3ffb8868 from task "main" on core 0 by: +[0.003004025] HEAP: Allocated 2500 bytes @ 0x3ffb8030 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.002902375] HEAP: Allocated 340 bytes @ 0x3ffb926c from task "main" on core 0 by: +[0.003044650] HEAP: Allocated 340 bytes @ 0x3ffb8a34 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.003037100] HEAP: Allocated 124 bytes @ 0x3ffb93d0 from task "alloc1" on core 0 by: +[0.003179725] HEAP: Allocated 124 bytes @ 0x3ffb8b98 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/queue.c:545 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:48 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.003090750] HEAP: Allocated 2500 bytes @ 0x3ffb9450 from task "alloc1" on core 0 by: +[0.003234475] HEAP: Allocated 2500 bytes @ 0x3ffb8c18 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.003125150] HEAP: Allocated 340 bytes @ 0x3ffb9e54 from task "alloc1" on core 0 by: +[0.003269925] HEAP: Allocated 340 bytes @ 0x3ffb961c from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.003220600] HEAP: Allocated 2 bytes @ 0x3ffb9fb8 from task "alloc1" on core 0 by: +[0.003366350] HEAP: Allocated 2 bytes @ 0x3ffb9780 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.003544375] HEAP: Allocated 8 bytes @ 0x3ffb8848 from task "main" on core 0 by: +[0.003736750] HEAP: Allocated 8 bytes @ 0x3ffb8010 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:87 -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.003597875] HEAP: Allocated 2500 bytes @ 0x3ffb9fd8 from task "main" on core 0 by: +[0.003802900] HEAP: Allocated 2500 bytes @ 0x3ffb97a0 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.003637125] HEAP: Allocated 340 bytes @ 0x3ffba9dc from task "main" on core 0 by: +[0.003855950] HEAP: Allocated 340 bytes @ 0x3ffba1a4 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.003887725] HEAP: Allocated 124 bytes @ 0x3ffbab40 from task "alloc2" on core 0 by: +[0.004030875] HEAP: Allocated 124 bytes @ 0x3ffba308 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/queue.c:545 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:48 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.003941625] HEAP: Allocated 2500 bytes @ 0x3ffbabc0 from task "alloc2" on core 0 by: +[0.004085625] HEAP: Allocated 2500 bytes @ 0x3ffba388 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.003976025] HEAP: Allocated 340 bytes @ 0x3ffbb5c4 from task "alloc2" on core 0 by: +[0.004121100] HEAP: Allocated 340 bytes @ 0x3ffbad8c from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.004075375] HEAP: Allocated 3 bytes @ 0x3ffb9fc8 from task "alloc2" on core 0 by: +[0.004221350] HEAP: Allocated 3 bytes @ 0x3ffb9790 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.031895800] HEAP: Allocated 2 bytes @ 0x3ffbb728 from task "alloc0" on core 0 by: +[0.032626425] HEAP: Allocated 2 bytes @ 0x3ffbaef0 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.032891700] HEAP: Allocated 4 bytes @ 0x3ffbb738 from task "alloc1" on core 0 by: +[0.033638000] HEAP: Allocated 4 bytes @ 0x3ffbaf00 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.033892175] HEAP: Allocated 6 bytes @ 0x3ffbb748 from task "alloc2" on core 0 by: +[0.033931975] HEAP: Allocated 6 bytes @ 0x3ffbaf20 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.061891850] HEAP: Allocated 3 bytes @ 0x3ffbb758 from task "alloc0" on core 0 by: +[0.062624925] HEAP: Allocated 3 bytes @ 0x3ffbaf10 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.062891850] HEAP: Allocated 6 bytes @ 0x3ffbb768 from task "alloc1" on core 0 by: +[0.063638150] HEAP: Allocated 6 bytes @ 0x3ffbaf30 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.063892175] HEAP: Allocated 9 bytes @ 0x3ffbb778 from task "alloc2" on core 0 by: +[0.063937800] HEAP: Allocated 9 bytes @ 0x3ffbaf50 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.091892175] HEAP: Allocated 4 bytes @ 0x3ffbb788 from task "alloc0" on core 0 by: +[0.092625300] HEAP: Allocated 4 bytes @ 0x3ffbaf40 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.092892175] HEAP: Allocated 8 bytes @ 0x3ffbb798 from task "alloc1" on core 0 by: +[0.093638150] HEAP: Allocated 8 bytes @ 0x3ffbaf60 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.093892000] HEAP: Allocated 12 bytes @ 0x3ffbb7a8 from task "alloc2" on core 0 by: +[0.093933750] HEAP: Allocated 12 bytes @ 0x3ffbaf84 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.121891850] HEAP: Allocated 5 bytes @ 0x3ffbb7b8 from task "alloc0" on core 0 by: +[0.122624925] HEAP: Allocated 5 bytes @ 0x3ffbaf70 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.122891850] HEAP: Allocated 10 bytes @ 0x3ffbb7c8 from task "alloc1" on core 0 by: +[0.123638150] HEAP: Allocated 10 bytes @ 0x3ffbaf94 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.123892175] HEAP: Allocated 15 bytes @ 0x3ffbb7d8 from task "alloc2" on core 0 by: +[0.123936400] HEAP: Allocated 15 bytes @ 0x3ffbafbc from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.151892175] HEAP: Allocated 6 bytes @ 0x3ffbb7ec from task "alloc0" on core 0 by: +[0.152625450] HEAP: Allocated 6 bytes @ 0x3ffbafa4 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.152892175] HEAP: Allocated 12 bytes @ 0x3ffbb7fc from task "alloc1" on core 0 by: +[0.153638150] HEAP: Allocated 12 bytes @ 0x3ffbafd0 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.153892175] HEAP: Allocated 18 bytes @ 0x3ffbb80c from task "alloc2" on core 0 by: +[0.153933750] HEAP: Allocated 18 bytes @ 0x3ffbaffc from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.181891850] HEAP: Allocated 7 bytes @ 0x3ffbb824 from task "alloc0" on core 0 by: +[0.182624925] HEAP: Allocated 7 bytes @ 0x3ffbafe0 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.182891700] HEAP: Allocated 14 bytes @ 0x3ffbb834 from task "alloc1" on core 0 by: +[0.183638150] HEAP: Allocated 14 bytes @ 0x3ffbb014 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.183892175] HEAP: Allocated 21 bytes @ 0x3ffbb848 from task "alloc2" on core 0 by: +[0.183937500] HEAP: Allocated 21 bytes @ 0x3ffbb048 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.211892175] HEAP: Allocated 8 bytes @ 0x3ffbb864 from task "alloc0" on core 0 by: +[0.212626475] HEAP: Allocated 8 bytes @ 0x3ffbb028 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.212892175] HEAP: Allocated 16 bytes @ 0x3ffbb874 from task "alloc1" on core 0 by: +[0.213638150] HEAP: Allocated 16 bytes @ 0x3ffbb064 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.213892175] HEAP: Allocated 24 bytes @ 0x3ffbb888 from task "alloc2" on core 0 by: +[0.213933875] HEAP: Allocated 24 bytes @ 0x3ffbb09c from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.241891850] HEAP: Allocated 9 bytes @ 0x3ffbb8a4 from task "alloc0" on core 0 by: +[0.242625100] HEAP: Allocated 9 bytes @ 0x3ffbb038 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.242891850] HEAP: Allocated 18 bytes @ 0x3ffbb8b4 from task "alloc1" on core 0 by: +[0.243625450] HEAP: Allocated 18 bytes @ 0x3ffbb078 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.243892175] HEAP: Allocated 27 bytes @ 0x3ffbb8cc from task "alloc2" on core 0 by: +[0.245626175] HEAP: Allocated 27 bytes @ 0x3ffbb0b8 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 diff --git a/tools/esp_app_trace/test/sysview/expected_output.json b/tools/esp_app_trace/test/sysview/expected_output.json index 76c3a734acc..581d0337dfc 100644 --- a/tools/esp_app_trace/test/sysview/expected_output.json +++ b/tools/esp_app_trace/test/sysview/expected_output.json @@ -27,7 +27,7 @@ "ram_base": 1061158912, "sys_freq": 40000000 }, - "ts": 6.65e-06 + "ts": 6.675e-06 }, { "core_id": 1, @@ -40,7 +40,7 @@ "ram_base": 1061158912, "sys_freq": 40000000 }, - "ts": 6.65e-06 + "ts": 6.675e-06 }, { "core_id": 0, @@ -50,7 +50,7 @@ "params": { "desc": "N=FreeRTOS Application,D=esp32,C=xtensa,O=FreeRTOS" }, - "ts": 1.855e-05 + "ts": 1.86e-05 }, { "core_id": 1, @@ -60,7 +60,7 @@ "params": { "desc": "N=FreeRTOS Application,D=esp32,C=xtensa,O=FreeRTOS" }, - "ts": 1.855e-05 + "ts": 1.86e-05 }, { "core_id": 0, @@ -70,7 +70,7 @@ "params": { "desc": "I#5=SysTick" }, - "ts": 2.7675e-05 + "ts": 2.775e-05 }, { "core_id": 1, @@ -80,7 +80,7 @@ "params": { "desc": "I#5=SysTick" }, - "ts": 2.7675e-05 + "ts": 2.775e-05 }, { "core_id": 0, @@ -90,7 +90,7 @@ "params": { "desc": "I#6=WIFI_MAC" }, - "ts": 4.9775e-05 + "ts": 4.5925e-05 }, { "core_id": 1, @@ -100,7 +100,7 @@ "params": { "desc": "I#6=WIFI_MAC" }, - "ts": 4.9775e-05 + "ts": 4.5925e-05 }, { "core_id": 0, @@ -110,7 +110,7 @@ "params": { "desc": "I#7=WIFI_NMI" }, - "ts": 6.3875e-05 + "ts": 6.0025e-05 }, { "core_id": 1, @@ -120,7 +120,7 @@ "params": { "desc": "I#7=WIFI_NMI" }, - "ts": 6.3875e-05 + "ts": 6.0025e-05 }, { "core_id": 0, @@ -130,7 +130,7 @@ "params": { "desc": "I#8=WIFI_BB" }, - "ts": 7.3825e-05 + "ts": 7.0125e-05 }, { "core_id": 1, @@ -140,7 +140,7 @@ "params": { "desc": "I#8=WIFI_BB" }, - "ts": 7.3825e-05 + "ts": 7.0125e-05 }, { "core_id": 0, @@ -150,7 +150,7 @@ "params": { "desc": "I#9=BT_MAC" }, - "ts": 8.75e-05 + "ts": 7.9875e-05 }, { "core_id": 1, @@ -160,7 +160,7 @@ "params": { "desc": "I#9=BT_MAC" }, - "ts": 8.75e-05 + "ts": 7.9875e-05 }, { "core_id": 0, @@ -170,7 +170,7 @@ "params": { "desc": "I#10=BT_BB" }, - "ts": 0.000101575 + "ts": 9.395e-05 }, { "core_id": 1, @@ -180,7 +180,7 @@ "params": { "desc": "I#10=BT_BB" }, - "ts": 0.000101575 + "ts": 9.395e-05 }, { "core_id": 0, @@ -190,7 +190,7 @@ "params": { "desc": "I#11=BT_BB_NMI" }, - "ts": 0.000112375 + "ts": 0.000108725 }, { "core_id": 1, @@ -200,7 +200,7 @@ "params": { "desc": "I#11=BT_BB_NMI" }, - "ts": 0.000112375 + "ts": 0.000108725 }, { "core_id": 0, @@ -210,7 +210,7 @@ "params": { "desc": "I#12=RWBT" }, - "ts": 0.0001223 + "ts": 0.000118675 }, { "core_id": 1, @@ -220,7 +220,7 @@ "params": { "desc": "I#12=RWBT" }, - "ts": 0.0001223 + "ts": 0.000118675 }, { "core_id": 0, @@ -230,7 +230,7 @@ "params": { "desc": "I#13=RWBLE" }, - "ts": 0.0001323 + "ts": 0.000128675 }, { "core_id": 1, @@ -240,7 +240,7 @@ "params": { "desc": "I#13=RWBLE" }, - "ts": 0.0001323 + "ts": 0.000128675 }, { "core_id": 0, @@ -250,7 +250,7 @@ "params": { "desc": "I#14=RWBT_NMI" }, - "ts": 0.0001468 + "ts": 0.000143225 }, { "core_id": 1, @@ -260,7 +260,7 @@ "params": { "desc": "I#14=RWBT_NMI" }, - "ts": 0.0001468 + "ts": 0.000143225 }, { "core_id": 0, @@ -270,7 +270,7 @@ "params": { "desc": "I#15=RWBLE_NMI" }, - "ts": 0.0001576 + "ts": 0.000154025 }, { "core_id": 1, @@ -280,7 +280,7 @@ "params": { "desc": "I#15=RWBLE_NMI" }, - "ts": 0.0001576 + "ts": 0.000154025 }, { "core_id": 0, @@ -290,7 +290,7 @@ "params": { "desc": "I#16=SLC0" }, - "ts": 0.0001719 + "ts": 0.00016835 }, { "core_id": 1, @@ -300,7 +300,7 @@ "params": { "desc": "I#16=SLC0" }, - "ts": 0.0001719 + "ts": 0.00016835 }, { "core_id": 0, @@ -310,7 +310,7 @@ "params": { "desc": "I#17=SLC1" }, - "ts": 0.00018955 + "ts": 0.000182075 }, { "core_id": 1, @@ -320,7 +320,7 @@ "params": { "desc": "I#17=SLC1" }, - "ts": 0.00018955 + "ts": 0.000182075 }, { "core_id": 0, @@ -330,7 +330,7 @@ "params": { "desc": "I#18=UHCI0" }, - "ts": 0.000199525 + "ts": 0.000196025 }, { "core_id": 1, @@ -340,7 +340,7 @@ "params": { "desc": "I#18=UHCI0" }, - "ts": 0.000199525 + "ts": 0.000196025 }, { "core_id": 0, @@ -350,7 +350,7 @@ "params": { "desc": "I#19=UHCI1" }, - "ts": 0.0002095 + "ts": 0.000206 }, { "core_id": 1, @@ -360,7 +360,7 @@ "params": { "desc": "I#19=UHCI1" }, - "ts": 0.0002095 + "ts": 0.000206 }, { "core_id": 0, @@ -370,7 +370,7 @@ "params": { "desc": "I#20=TG0_T0_LEVEL" }, - "ts": 0.00022475 + "ts": 0.000221275 }, { "core_id": 1, @@ -380,7 +380,7 @@ "params": { "desc": "I#20=TG0_T0_LEVEL" }, - "ts": 0.00022475 + "ts": 0.000221275 }, { "core_id": 0, @@ -390,7 +390,7 @@ "params": { "desc": "I#21=TG0_T1_LEVEL" }, - "ts": 0.00023615 + "ts": 0.0002327 }, { "core_id": 1, @@ -400,7 +400,7 @@ "params": { "desc": "I#21=TG0_T1_LEVEL" }, - "ts": 0.00023615 + "ts": 0.0002327 }, { "core_id": 0, @@ -410,7 +410,7 @@ "params": { "desc": "I#22=TG0_WDT_LEVEL" }, - "ts": 0.00025185 + "ts": 0.000248425 }, { "core_id": 1, @@ -420,7 +420,7 @@ "params": { "desc": "I#22=TG0_WDT_LEVEL" }, - "ts": 0.00025185 + "ts": 0.000248425 }, { "core_id": 0, @@ -430,7 +430,7 @@ "params": { "desc": "I#23=TG0_LACT_LEVEL" }, - "ts": 0.000263625 + "ts": 0.000260225 }, { "core_id": 1, @@ -440,7 +440,7 @@ "params": { "desc": "I#23=TG0_LACT_LEVEL" }, - "ts": 0.000263625 + "ts": 0.000260225 }, { "core_id": 0, @@ -450,7 +450,7 @@ "params": { "desc": "I#24=TG1_T0_LEVEL" }, - "ts": 0.00027905 + "ts": 0.00027565 }, { "core_id": 1, @@ -460,7 +460,7 @@ "params": { "desc": "I#24=TG1_T0_LEVEL" }, - "ts": 0.00027905 + "ts": 0.00027565 }, { "core_id": 0, @@ -470,7 +470,7 @@ "params": { "desc": "I#25=TG1_T1_LEVEL" }, - "ts": 0.00029445 + "ts": 0.00028725 }, { "core_id": 1, @@ -480,7 +480,7 @@ "params": { "desc": "I#25=TG1_T1_LEVEL" }, - "ts": 0.00029445 + "ts": 0.00028725 }, { "core_id": 0, @@ -490,7 +490,7 @@ "params": { "desc": "I#26=TG1_WDT_LEVEL" }, - "ts": 0.00031 + "ts": 0.000306775 }, { "core_id": 1, @@ -500,7 +500,7 @@ "params": { "desc": "I#26=TG1_WDT_LEVEL" }, - "ts": 0.00031 + "ts": 0.000306775 }, { "core_id": 0, @@ -510,7 +510,7 @@ "params": { "desc": "I#27=TG1_LACT_LEVEL" }, - "ts": 0.000321975 + "ts": 0.000318775 }, { "core_id": 1, @@ -520,7 +520,7 @@ "params": { "desc": "I#27=TG1_LACT_LEVEL" }, - "ts": 0.000321975 + "ts": 0.000318775 }, { "core_id": 0, @@ -530,7 +530,7 @@ "params": { "desc": "I#28=GPIO" }, - "ts": 0.000331875 + "ts": 0.0003287 }, { "core_id": 1, @@ -540,7 +540,7 @@ "params": { "desc": "I#28=GPIO" }, - "ts": 0.000331875 + "ts": 0.0003287 }, { "core_id": 0, @@ -550,7 +550,7 @@ "params": { "desc": "I#29=GPIO_NMI" }, - "ts": 0.000350775 + "ts": 0.000347625 }, { "core_id": 1, @@ -560,7 +560,7 @@ "params": { "desc": "I#29=GPIO_NMI" }, - "ts": 0.000350775 + "ts": 0.000347625 }, { "core_id": 0, @@ -570,7 +570,7 @@ "params": { "desc": "I#30=FROM_CPU0" }, - "ts": 0.000361675 + "ts": 0.00035855 }, { "core_id": 1, @@ -580,7 +580,7 @@ "params": { "desc": "I#30=FROM_CPU0" }, - "ts": 0.000361675 + "ts": 0.00035855 }, { "core_id": 0, @@ -590,7 +590,7 @@ "params": { "desc": "I#31=FROM_CPU1" }, - "ts": 0.000376375 + "ts": 0.0003693 }, { "core_id": 1, @@ -600,7 +600,7 @@ "params": { "desc": "I#31=FROM_CPU1" }, - "ts": 0.000376375 + "ts": 0.0003693 }, { "core_id": 0, @@ -610,7 +610,7 @@ "params": { "desc": "I#32=FROM_CPU2" }, - "ts": 0.0003872 + "ts": 0.000384075 }, { "core_id": 1, @@ -620,7 +620,7 @@ "params": { "desc": "I#32=FROM_CPU2" }, - "ts": 0.0003872 + "ts": 0.000384075 }, { "core_id": 0, @@ -630,7 +630,7 @@ "params": { "desc": "I#33=FROM_CPU3" }, - "ts": 0.0004019 + "ts": 0.000394825 }, { "core_id": 1, @@ -640,7 +640,7 @@ "params": { "desc": "I#33=FROM_CPU3" }, - "ts": 0.0004019 + "ts": 0.000394825 }, { "core_id": 0, @@ -650,7 +650,7 @@ "params": { "desc": "I#34=SPI0" }, - "ts": 0.00041565 + "ts": 0.0004086 }, { "core_id": 1, @@ -660,7 +660,7 @@ "params": { "desc": "I#34=SPI0" }, - "ts": 0.00041565 + "ts": 0.0004086 }, { "core_id": 0, @@ -670,7 +670,7 @@ "params": { "desc": "I#35=SPI1" }, - "ts": 0.0004254 + "ts": 0.000422675 }, { "core_id": 1, @@ -680,7 +680,7 @@ "params": { "desc": "I#35=SPI1" }, - "ts": 0.0004254 + "ts": 0.000422675 }, { "core_id": 0, @@ -690,7 +690,7 @@ "params": { "desc": "I#36=SPI2" }, - "ts": 0.000435175 + "ts": 0.0004339 }, { "core_id": 1, @@ -700,7 +700,7 @@ "params": { "desc": "I#36=SPI2" }, - "ts": 0.000435175 + "ts": 0.0004339 }, { "core_id": 0, @@ -730,7 +730,7 @@ "params": { "desc": "I#38=I2S0" }, - "ts": 0.00045885 + "ts": 0.000455975 }, { "core_id": 1, @@ -740,7 +740,7 @@ "params": { "desc": "I#38=I2S0" }, - "ts": 0.00045885 + "ts": 0.000455975 }, { "core_id": 0, @@ -750,7 +750,7 @@ "params": { "desc": "I#39=I2S1" }, - "ts": 0.0004686 + "ts": 0.000471025 }, { "core_id": 1, @@ -760,7 +760,7 @@ "params": { "desc": "I#39=I2S1" }, - "ts": 0.0004686 + "ts": 0.000471025 }, { "core_id": 0, @@ -770,7 +770,7 @@ "params": { "desc": "I#40=UART0" }, - "ts": 0.000478575 + "ts": 0.000482575 }, { "core_id": 1, @@ -780,7 +780,7 @@ "params": { "desc": "I#40=UART0" }, - "ts": 0.000478575 + "ts": 0.000482575 }, { "core_id": 0, @@ -790,7 +790,7 @@ "params": { "desc": "I#41=UART1" }, - "ts": 0.0004925 + "ts": 0.000493675 }, { "core_id": 1, @@ -800,7 +800,7 @@ "params": { "desc": "I#41=UART1" }, - "ts": 0.0004925 + "ts": 0.000493675 }, { "core_id": 0, @@ -810,7 +810,7 @@ "params": { "desc": "I#42=UART2" }, - "ts": 0.000506375 + "ts": 0.000509025 }, { "core_id": 1, @@ -820,7 +820,7 @@ "params": { "desc": "I#42=UART2" }, - "ts": 0.000506375 + "ts": 0.000509025 }, { "core_id": 0, @@ -830,7 +830,7 @@ "params": { "desc": "I#43=SDIO_HOST" }, - "ts": 0.00051715 + "ts": 0.000525125 }, { "core_id": 1, @@ -840,7 +840,7 @@ "params": { "desc": "I#43=SDIO_HOST" }, - "ts": 0.00051715 + "ts": 0.000525125 }, { "core_id": 0, @@ -850,7 +850,7 @@ "params": { "desc": "I#44=ETH_MAC" }, - "ts": 0.000527475 + "ts": 0.00053665 }, { "core_id": 1, @@ -860,7 +860,7 @@ "params": { "desc": "I#44=ETH_MAC" }, - "ts": 0.000527475 + "ts": 0.00053665 }, { "core_id": 0, @@ -870,7 +870,7 @@ "params": { "desc": "I#45=PWM0" }, - "ts": 0.000541625 + "ts": 0.00055275 }, { "core_id": 1, @@ -880,7 +880,7 @@ "params": { "desc": "I#45=PWM0" }, - "ts": 0.000541625 + "ts": 0.00055275 }, { "core_id": 0, @@ -890,7 +890,7 @@ "params": { "desc": "I#46=PWM1" }, - "ts": 0.0005553 + "ts": 0.0005676 }, { "core_id": 1, @@ -900,7 +900,7 @@ "params": { "desc": "I#46=PWM1" }, - "ts": 0.0005553 + "ts": 0.0005676 }, { "core_id": 0, @@ -910,7 +910,7 @@ "params": { "desc": "I#47=RESERVED" }, - "ts": 0.000565975 + "ts": 0.00057995 }, { "core_id": 1, @@ -920,7 +920,7 @@ "params": { "desc": "I#47=RESERVED" }, - "ts": 0.000565975 + "ts": 0.00057995 }, { "core_id": 0, @@ -930,7 +930,7 @@ "params": { "desc": "I#48=RESERVED" }, - "ts": 0.00057655 + "ts": 0.0005921 }, { "core_id": 1, @@ -940,7 +940,7 @@ "params": { "desc": "I#48=RESERVED" }, - "ts": 0.00057655 + "ts": 0.0005921 }, { "core_id": 0, @@ -950,7 +950,7 @@ "params": { "desc": "I#49=LEDC" }, - "ts": 0.000590325 + "ts": 0.000603425 }, { "core_id": 1, @@ -960,7 +960,7 @@ "params": { "desc": "I#49=LEDC" }, - "ts": 0.000590325 + "ts": 0.000603425 }, { "core_id": 0, @@ -970,7 +970,7 @@ "params": { "desc": "I#50=EFUSE" }, - "ts": 0.000604225 + "ts": 0.000622525 }, { "core_id": 1, @@ -980,7 +980,7 @@ "params": { "desc": "I#50=EFUSE" }, - "ts": 0.000604225 + "ts": 0.000622525 }, { "core_id": 0, @@ -990,7 +990,7 @@ "params": { "desc": "I#51=TWAI" }, - "ts": 0.000618075 + "ts": 0.00063395 }, { "core_id": 1, @@ -1000,7 +1000,7 @@ "params": { "desc": "I#51=TWAI" }, - "ts": 0.000618075 + "ts": 0.00063395 }, { "core_id": 0, @@ -1010,7 +1010,7 @@ "params": { "desc": "I#52=RTC_CORE" }, - "ts": 0.00062865 + "ts": 0.0006502 }, { "core_id": 1, @@ -1020,7 +1020,7 @@ "params": { "desc": "I#52=RTC_CORE" }, - "ts": 0.00062865 + "ts": 0.0006502 }, { "core_id": 0, @@ -1030,7 +1030,7 @@ "params": { "desc": "I#53=RMT" }, - "ts": 0.00063825 + "ts": 0.0006611 }, { "core_id": 1, @@ -1040,7 +1040,7 @@ "params": { "desc": "I#53=RMT" }, - "ts": 0.00063825 + "ts": 0.0006611 }, { "core_id": 0, @@ -1050,7 +1050,7 @@ "params": { "desc": "I#54=PCNT" }, - "ts": 0.000648075 + "ts": 0.0006721 }, { "core_id": 1, @@ -1060,7 +1060,7 @@ "params": { "desc": "I#54=PCNT" }, - "ts": 0.000648075 + "ts": 0.0006721 }, { "core_id": 0, @@ -1070,7 +1070,7 @@ "params": { "desc": "I#55=I2C_EXT0" }, - "ts": 0.0006627 + "ts": 0.00068805 }, { "core_id": 1, @@ -1080,7 +1080,7 @@ "params": { "desc": "I#55=I2C_EXT0" }, - "ts": 0.0006627 + "ts": 0.00068805 }, { "core_id": 0, @@ -1090,7 +1090,7 @@ "params": { "desc": "I#56=I2C_EXT1" }, - "ts": 0.000674475 + "ts": 0.000700025 }, { "core_id": 1, @@ -1100,7 +1100,7 @@ "params": { "desc": "I#56=I2C_EXT1" }, - "ts": 0.000674475 + "ts": 0.000700025 }, { "core_id": 0, @@ -1110,7 +1110,7 @@ "params": { "desc": "I#57=RSA" }, - "ts": 0.000689475 + "ts": 0.000710825 }, { "core_id": 1, @@ -1120,7 +1120,7 @@ "params": { "desc": "I#57=RSA" }, - "ts": 0.000689475 + "ts": 0.000710825 }, { "core_id": 0, @@ -1130,7 +1130,7 @@ "params": { "desc": "I#58=SPI1_DMA" }, - "ts": 0.000705425 + "ts": 0.0007269 }, { "core_id": 1, @@ -1140,7 +1140,7 @@ "params": { "desc": "I#58=SPI1_DMA" }, - "ts": 0.000705425 + "ts": 0.0007269 }, { "core_id": 0, @@ -1150,7 +1150,7 @@ "params": { "desc": "I#59=SPI2_DMA" }, - "ts": 0.00071735 + "ts": 0.000743075 }, { "core_id": 1, @@ -1160,7 +1160,7 @@ "params": { "desc": "I#59=SPI2_DMA" }, - "ts": 0.00071735 + "ts": 0.000743075 }, { "core_id": 0, @@ -1170,7 +1170,7 @@ "params": { "desc": "I#60=SPI3_DMA" }, - "ts": 0.000729475 + "ts": 0.00075505 }, { "core_id": 1, @@ -1180,7 +1180,7 @@ "params": { "desc": "I#60=SPI3_DMA" }, - "ts": 0.000729475 + "ts": 0.00075505 }, { "core_id": 0, @@ -1190,7 +1190,7 @@ "params": { "desc": "I#61=WDT" }, - "ts": 0.0007403 + "ts": 0.00076595 }, { "core_id": 1, @@ -1200,7 +1200,7 @@ "params": { "desc": "I#61=WDT" }, - "ts": 0.0007403 + "ts": 0.00076595 }, { "core_id": 0, @@ -1210,7 +1210,7 @@ "params": { "desc": "I#62=TIMER1" }, - "ts": 0.00076065 + "ts": 0.00078635 }, { "core_id": 1, @@ -1220,7 +1220,7 @@ "params": { "desc": "I#62=TIMER1" }, - "ts": 0.00076065 + "ts": 0.00078635 }, { "core_id": 0, @@ -1230,7 +1230,7 @@ "params": { "desc": "I#63=TIMER2" }, - "ts": 0.0007722 + "ts": 0.000797875 }, { "core_id": 1, @@ -1240,7 +1240,7 @@ "params": { "desc": "I#63=TIMER2" }, - "ts": 0.0007722 + "ts": 0.000797875 }, { "core_id": 0, @@ -1250,7 +1250,7 @@ "params": { "desc": "I#64=TG0_T0_EDGE" }, - "ts": 0.00078515 + "ts": 0.0008109 }, { "core_id": 1, @@ -1260,7 +1260,7 @@ "params": { "desc": "I#64=TG0_T0_EDGE" }, - "ts": 0.00078515 + "ts": 0.0008109 }, { "core_id": 0, @@ -1270,7 +1270,7 @@ "params": { "desc": "I#65=TG0_T1_EDGE" }, - "ts": 0.00080585 + "ts": 0.000827775 }, { "core_id": 1, @@ -1280,7 +1280,7 @@ "params": { "desc": "I#65=TG0_T1_EDGE" }, - "ts": 0.00080585 + "ts": 0.000827775 }, { "core_id": 0, @@ -1290,7 +1290,7 @@ "params": { "desc": "I#66=TG0_WDT_EDGE" }, - "ts": 0.00081875 + "ts": 0.00084455 }, { "core_id": 1, @@ -1300,7 +1300,7 @@ "params": { "desc": "I#66=TG0_WDT_EDGE" }, - "ts": 0.00081875 + "ts": 0.00084455 }, { "core_id": 0, @@ -1310,7 +1310,7 @@ "params": { "desc": "I#67=TG0_LACT_EDGE" }, - "ts": 0.00083605 + "ts": 0.0008618 }, { "core_id": 1, @@ -1320,7 +1320,7 @@ "params": { "desc": "I#67=TG0_LACT_EDGE" }, - "ts": 0.00083605 + "ts": 0.0008618 }, { "core_id": 0, @@ -1330,7 +1330,7 @@ "params": { "desc": "I#68=TG1_T0_EDGE" }, - "ts": 0.00084885 + "ts": 0.000874625 }, { "core_id": 1, @@ -1340,7 +1340,7 @@ "params": { "desc": "I#68=TG1_T0_EDGE" }, - "ts": 0.00084885 + "ts": 0.000874625 }, { "core_id": 0, @@ -1350,7 +1350,7 @@ "params": { "desc": "I#69=TG1_T1_EDGE" }, - "ts": 0.000861475 + "ts": 0.0008873 }, { "core_id": 1, @@ -1360,7 +1360,7 @@ "params": { "desc": "I#69=TG1_T1_EDGE" }, - "ts": 0.000861475 + "ts": 0.0008873 }, { "core_id": 0, @@ -1370,7 +1370,7 @@ "params": { "desc": "I#70=TG1_WDT_EDGE" }, - "ts": 0.000878425 + "ts": 0.00090425 }, { "core_id": 1, @@ -1380,7 +1380,7 @@ "params": { "desc": "I#70=TG1_WDT_EDGE" }, - "ts": 0.000878425 + "ts": 0.00090425 }, { "core_id": 0, @@ -1390,7 +1390,7 @@ "params": { "desc": "I#71=TG1_LACT_EDGE" }, - "ts": 0.000891925 + "ts": 0.0009179 }, { "core_id": 1, @@ -1400,7 +1400,7 @@ "params": { "desc": "I#71=TG1_LACT_EDGE" }, - "ts": 0.000891925 + "ts": 0.0009179 }, { "core_id": 0, @@ -1410,7 +1410,7 @@ "params": { "desc": "I#72=MMU_IA" }, - "ts": 0.000907825 + "ts": 0.0009332 }, { "core_id": 1, @@ -1420,7 +1420,7 @@ "params": { "desc": "I#72=MMU_IA" }, - "ts": 0.000907825 + "ts": 0.0009332 }, { "core_id": 0, @@ -1430,7 +1430,7 @@ "params": { "desc": "I#73=MPU_IA" }, - "ts": 0.0009233 + "ts": 0.000944575 }, { "core_id": 1, @@ -1440,7 +1440,7 @@ "params": { "desc": "I#73=MPU_IA" }, - "ts": 0.0009233 + "ts": 0.000944575 }, { "core_id": 0, @@ -1450,7 +1450,7 @@ "params": { "desc": "I#74=CACHE_IA" }, - "ts": 0.00093545 + "ts": 0.00096105 }, { "core_id": 1, @@ -1460,27 +1460,27 @@ "params": { "desc": "I#74=CACHE_IA" }, - "ts": 0.00093545 + "ts": 0.00096105 }, { "core_id": 0, "ctx_name": "IDLE1", - "id": 13, + "id": 12, "in_irq": false, "params": { - "time": 10000 + "cycles": 2890156 }, - "ts": 0.000944 + "ts": 0.000971475 }, { "core_id": 1, "ctx_name": "IDLE1", - "id": 13, + "id": 12, "in_irq": false, "params": { - "time": 10000 + "cycles": 2890156 }, - "ts": 0.000944 + "ts": 0.000971475 }, { "core_id": 0, @@ -1490,9 +1490,9 @@ "params": { "name": "ipc0", "prio": 24, - "tid": 12253204 + "tid": 12252316 }, - "ts": 0.001056 + "ts": 0.001084025 }, { "core_id": 1, @@ -1502,9 +1502,9 @@ "params": { "name": "ipc0", "prio": 24, - "tid": 12253204 + "tid": 12252316 }, - "ts": 0.001056 + "ts": 0.001084025 }, { "core_id": 0, @@ -1512,12 +1512,12 @@ "id": 21, "in_irq": false, "params": { - "base": 1073410064, - "sz": 1344, - "tid": 12253204, + "base": 1073409176, + "sz": 1352, + "tid": 12252316, "unused": 0 }, - "ts": 0.001061525 + "ts": 0.00108925 }, { "core_id": 1, @@ -1525,12 +1525,12 @@ "id": 21, "in_irq": false, "params": { - "base": 1073410064, - "sz": 1344, - "tid": 12253204, + "base": 1073409176, + "sz": 1352, + "tid": 12252316, "unused": 0 }, - "ts": 0.001061525 + "ts": 0.00108925 }, { "core_id": 0, @@ -1540,9 +1540,9 @@ "params": { "name": "ipc1", "prio": 24, - "tid": 12253560 + "tid": 12254724 }, - "ts": 0.00117065 + "ts": 0.0011949 }, { "core_id": 1, @@ -1552,9 +1552,9 @@ "params": { "name": "ipc1", "prio": 24, - "tid": 12253560 + "tid": 12254724 }, - "ts": 0.00117065 + "ts": 0.0011949 }, { "core_id": 0, @@ -1562,12 +1562,12 @@ "id": 21, "in_irq": false, "params": { - "base": 1073431024, + "base": 1073411584, "sz": 1344, - "tid": 12253560, + "tid": 12254724, "unused": 0 }, - "ts": 0.0011759 + "ts": 0.00120035 }, { "core_id": 1, @@ -1575,12 +1575,12 @@ "id": 21, "in_irq": false, "params": { - "base": 1073431024, + "base": 1073411584, "sz": 1344, - "tid": 12253560, + "tid": 12254724, "unused": 0 }, - "ts": 0.0011759 + "ts": 0.00120035 }, { "core_id": 0, @@ -1590,9 +1590,9 @@ "params": { "name": "main", "prio": 1, - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.001327475 + "ts": 0.0013883 }, { "core_id": 1, @@ -1602,9 +1602,9 @@ "params": { "name": "main", "prio": 1, - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.001327475 + "ts": 0.0013883 }, { "core_id": 0, @@ -1612,12 +1612,12 @@ "id": 21, "in_irq": false, "params": { - "base": 1073433076, - "sz": 1916, - "tid": 12254080, + "base": 1073429776, + "sz": 2400, + "tid": 12274964, "unused": 0 }, - "ts": 0.0013329 + "ts": 0.001393525 }, { "core_id": 1, @@ -1625,12 +1625,12 @@ "id": 21, "in_irq": false, "params": { - "base": 1073433076, - "sz": 1916, - "tid": 12254080, + "base": 1073429776, + "sz": 2400, + "tid": 12274964, "unused": 0 }, - "ts": 0.0013329 + "ts": 0.001393525 }, { "core_id": 0, @@ -1640,7 +1640,7 @@ "params": { "mod_cnt": 0 }, - "ts": 0.00134065 + "ts": 0.00140085 }, { "core_id": 1, @@ -1650,7 +1650,7 @@ "params": { "mod_cnt": 0 }, - "ts": 0.00134065 + "ts": 0.00140085 }, { "core_id": 1, @@ -1660,7 +1660,7 @@ "params": { "irq_num": 5 }, - "ts": 0.001348325 + "ts": 0.0014076 }, { "core_id": 0, @@ -1670,7 +1670,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0013597 + "ts": 0.001419325 }, { "core_id": 1, @@ -1678,7 +1678,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.001370975 + "ts": 0.00143035 }, { "core_id": 0, @@ -1686,9 +1686,9 @@ "id": 6, "in_irq": true, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.001381825 + "ts": 0.001441425 }, { "core_id": 1, @@ -1696,9 +1696,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.001381825 + "ts": 0.001441425 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.001452425 }, { "core_id": 0, @@ -1706,15 +1716,15 @@ "id": 3, "in_irq": false, "params": {}, - "ts": 0.0013969 + "ts": 0.00146355 }, { "core_id": 1, "ctx_name": "IDLE1", - "id": 17, + "id": 18, "in_irq": false, "params": {}, - "ts": 0.0014077 + "ts": 0.001474825 }, { "core_id": 0, @@ -1724,7 +1734,15 @@ "params": { "irq_num": 30 }, - "ts": 0.001419225 + "ts": 0.001485875 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.001496375 }, { "core_id": 0, @@ -1732,7 +1750,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.001430725 + "ts": 0.00150725 }, { "core_id": 0, @@ -1740,9 +1758,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.001447075 + "ts": 0.00152385 }, { "core_id": 0, @@ -1754,7 +1772,7 @@ "evt_off": 512, "mod_id": 0 }, - "ts": 0.00147395 + "ts": 0.001550575 }, { "core_id": 1, @@ -1766,17 +1784,35 @@ "evt_off": 512, "mod_id": 0 }, - "ts": 0.00147395 + "ts": 0.001550575 }, { - "addr": "0x3ffb70d8", + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.001564275 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 3, + "in_irq": false, + "params": {}, + "ts": 0.001579775 + }, + { + "addr": "0x3ffb68a0", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6bef", - "0x400e693b", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3caf", + "0x400e3898", + "0x400880dc", "0x0", "0x0", "0x0", @@ -1787,61 +1823,17 @@ "id": 512, "in_irq": false, "size": 8, - "ts": 0.00152955 + "ts": 0.001637325 }, { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.0016694 - }, - { - "core_id": 1, - "ctx_name": "IDLE1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.00168285 - }, - { - "core_id": 1, - "ctx_name": "IDLE1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.0016995 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.00181295 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 3, - "in_irq": false, - "params": {}, - "ts": 0.00182845 - }, - { - "addr": "0x3ffb70e8", + "addr": "0x3ffb68b0", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b304", - "0x400d6c38", - "0x400e693b", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a610", + "0x400d3cf8", + "0x400e3898", + "0x400880dc", "0x0", "0x0", "0x0", @@ -1852,17 +1844,17 @@ "id": 512, "in_irq": false, "size": 2500, - "ts": 0.00186425 + "ts": 0.00193905 }, { - "addr": "0x3ffb7aec", + "addr": "0x3ffb72b4", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b30f", - "0x400d6c38", - "0x400e693b", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a61b", + "0x400d3cf8", + "0x400e3898", + "0x400880dc", "0x0", "0x0", "0x0", @@ -1873,7 +1865,7 @@ "id": 512, "in_irq": false, "size": 340, - "ts": 0.0019041 + "ts": 0.00197995 }, { "core_id": 0, @@ -1881,9 +1873,9 @@ "id": 8, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.001926775 + "ts": 0.002010625 }, { "core_id": 0, @@ -1893,9 +1885,9 @@ "params": { "name": "alloc0", "prio": 5, - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.0019394 + "ts": 0.002023275 }, { "core_id": 1, @@ -1905,9 +1897,9 @@ "params": { "name": "alloc0", "prio": 5, - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.0019394 + "ts": 0.002023275 }, { "core_id": 0, @@ -1915,12 +1907,12 @@ "id": 21, "in_irq": false, "params": { - "base": 1073443048, - "sz": 4294965096, - "tid": 12286700, + "base": 1073440944, + "sz": 4294965088, + "tid": 12284596, "unused": 0 }, - "ts": 0.0019485 + "ts": 0.002032525 }, { "core_id": 1, @@ -1928,12 +1920,12 @@ "id": 21, "in_irq": false, "params": { - "base": 1073443048, - "sz": 4294965096, - "tid": 12286700, + "base": 1073440944, + "sz": 4294965088, + "tid": 12284596, "unused": 0 }, - "ts": 0.0019485 + "ts": 0.002032525 }, { "core_id": 0, @@ -1941,9 +1933,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.0019592 + "ts": 0.00204325 }, { "core_id": 1, @@ -1951,9 +1943,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.0019592 + "ts": 0.00204325 }, { "core_id": 0, @@ -1963,7 +1955,7 @@ "params": { "irq_num": 30 }, - "ts": 0.001974775 + "ts": 0.002058825 }, { "core_id": 0, @@ -1971,7 +1963,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.00198615 + "ts": 0.002070175 }, { "core_id": 0, @@ -1979,18 +1971,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.0020025 + "ts": 0.002086525 }, { - "addr": "0x3ffb7c50", + "addr": "0x3ffb7418", "callers": [ - "0x40081fef", - "0x40089414", - "0x40088679", - "0x400d6aa4", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x400879c1", + "0x400d3b64", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2002,7 +1994,7 @@ "id": 512, "in_irq": false, "size": 124, - "ts": 0.002037875 + "ts": 0.002130925 }, { "core_id": 0, @@ -2014,16 +2006,16 @@ "uxItemSize": 4, "uxQueueLength": 10 }, - "ts": 0.002052175 + "ts": 0.002145225 }, { - "addr": "0x3ffb7cd0", + "addr": "0x3ffb7498", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b304", - "0x400d6ae0", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a610", + "0x400d3ba0", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2035,16 +2027,16 @@ "id": 512, "in_irq": false, "size": 2500, - "ts": 0.0021074 + "ts": 0.00220545 }, { - "addr": "0x3ffb86d4", + "addr": "0x3ffb7e9c", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b30f", - "0x400d6ae0", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a61b", + "0x400d3ba0", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2056,7 +2048,7 @@ "id": 512, "in_irq": false, "size": 340, - "ts": 0.0021418 + "ts": 0.0022409 }, { "core_id": 0, @@ -2064,9 +2056,9 @@ "id": 8, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.0021685 + "ts": 0.002267725 }, { "core_id": 0, @@ -2076,9 +2068,9 @@ "params": { "name": "free0", "prio": 5, - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.002181 + "ts": 0.00228025 }, { "core_id": 1, @@ -2088,9 +2080,9 @@ "params": { "name": "free0", "prio": 5, - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.002181 + "ts": 0.00228025 }, { "core_id": 0, @@ -2098,12 +2090,12 @@ "id": 21, "in_irq": false, "params": { - "base": 1073446096, - "sz": 4294965088, - "tid": 12289748, + "base": 1073443992, + "sz": 4294965096, + "tid": 12287644, "unused": 0 }, - "ts": 0.00219015 + "ts": 0.002289425 }, { "core_id": 1, @@ -2111,12 +2103,12 @@ "id": 21, "in_irq": false, "params": { - "base": 1073446096, - "sz": 4294965088, - "tid": 12289748, + "base": 1073443992, + "sz": 4294965096, + "tid": 12287644, "unused": 0 }, - "ts": 0.00219015 + "ts": 0.002289425 }, { "core_id": 0, @@ -2124,9 +2116,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.002200975 + "ts": 0.002300275 }, { "core_id": 1, @@ -2134,9 +2126,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.002200975 + "ts": 0.002300275 }, { "core_id": 1, @@ -2146,7 +2138,7 @@ "params": { "irq_num": 31 }, - "ts": 0.00221635 + "ts": 0.002315625 }, { "core_id": 1, @@ -2154,16 +2146,16 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.00222925 + "ts": 0.002328675 }, { - "addr": "0x3ffb8838", + "addr": "0x3ffb8000", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2175,7 +2167,7 @@ "id": 512, "in_irq": false, "size": 1, - "ts": 0.00224565 + "ts": 0.00234585 }, { "core_id": 1, @@ -2183,9 +2175,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.00225695 + "ts": 0.002358 }, { "core_id": 1, @@ -2195,16 +2187,16 @@ "params": { "irq_num": 31 }, - "ts": 0.002286975 + "ts": 0.002387975 }, { - "addr": "0x3ffb8848", + "addr": "0x3ffb8010", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2216,7 +2208,7 @@ "id": 512, "in_irq": false, "size": 2, - "ts": 0.0022979 + "ts": 0.002399325 }, { "core_id": 1, @@ -2224,7 +2216,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.002308975 + "ts": 0.0024109 }, { "core_id": 0, @@ -2234,10 +2226,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.002321625 + "ts": 0.00242315 }, { "core_id": 1, @@ -2245,109 +2237,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.002332075 - }, - { - "core_id": 0, - "ctx_name": "alloc0", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12283904, - "xTicksToWait": 0 - }, - "ts": 0.00236625 - }, - { - "core_id": 0, - "ctx_name": "alloc0", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (310) example: Task[0x3ffb7aec]: allocated 2 bytes @ 0x3ffb8848\n", - "ts": 0.002605525 - }, - { - "core_id": 0, - "ctx_name": "alloc0", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (310) example: Task[0x3ffb7aec]: allocated 2 bytes @ 0x3ffb8848\n", - "ts": 0.002605525 - }, - { - "core_id": 0, - "ctx_name": "alloc0", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12287056, - "xTicksToWait": 0 - }, - "ts": 0.0026271 - }, - { - "core_id": 0, - "ctx_name": "alloc0", - "id": 6, - "in_irq": false, - "params": { - "tid": 12289748 - }, - "ts": 0.002640225 - }, - { - "core_id": 1, - "ctx_name": "free0", - "id": 6, - "in_irq": false, - "params": { - "tid": 12289748 - }, - "ts": 0.002640225 - }, - { - "core_id": 1, - "ctx_name": "FROM_CPU1", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 31 - }, - "ts": 0.002656425 - }, - { - "core_id": 0, - "ctx_name": "alloc0", - "id": 34, - "in_irq": false, - "params": { - "xTicksToDelay": 30 - }, - "ts": 0.0026673 - }, - { - "core_id": 1, - "ctx_name": "free0", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.002678075 - }, - { - "core_id": 0, - "ctx_name": "FROM_CPU0", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 30 - }, - "ts": 0.00269225 + "ts": 0.002440625 }, { "core_id": 1, @@ -2357,7 +2247,153 @@ "params": { "irq_num": 5 }, - "ts": 0.002703 + "ts": 0.0024566 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.002470175 + }, + { + "core_id": 0, + "ctx_name": "alloc0", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12281672, + "xTicksToWait": 0 + }, + "ts": 0.00248155 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.0024927 + }, + { + "core_id": 0, + "ctx_name": "alloc0", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (297) example: Task[0x3ffb72b4]: allocated 2 bytes @ 0x3ffb8010\n", + "ts": 0.002742275 + }, + { + "core_id": 0, + "ctx_name": "alloc0", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (297) example: Task[0x3ffb72b4]: allocated 2 bytes @ 0x3ffb8010\n", + "ts": 0.002742275 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.002759 + }, + { + "core_id": 0, + "ctx_name": "alloc0", + "id": 3, + "in_irq": false, + "params": {}, + "ts": 0.002774375 + }, + { + "core_id": 0, + "ctx_name": "alloc0", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12284952, + "xTicksToWait": 0 + }, + "ts": 0.002788425 + }, + { + "core_id": 0, + "ctx_name": "alloc0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12287644 + }, + "ts": 0.002801625 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12287644 + }, + "ts": 0.002801625 + }, + { + "core_id": 1, + "ctx_name": "FROM_CPU1", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 31 + }, + "ts": 0.002817875 + }, + { + "core_id": 0, + "ctx_name": "alloc0", + "id": 34, + "in_irq": false, + "params": { + "xTicksToDelay": 30 + }, + "ts": 0.002828825 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.002839525 + }, + { + "core_id": 0, + "ctx_name": "FROM_CPU0", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 30 + }, + "ts": 0.0028533 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 4, + "in_irq": false, + "params": { + "tid": 12287644 + }, + "ts": 0.002864225 }, { "core_id": 0, @@ -2365,35 +2401,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.002713925 - }, - { - "core_id": 1, - "ctx_name": "free0", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.002725475 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 4, - "in_irq": false, - "params": { - "tid": 12254080 - }, - "ts": 0.00273595 - }, - { - "core_id": 1, - "ctx_name": "free0", - "id": 4, - "in_irq": false, - "params": { - "tid": 12289748 - }, - "ts": 0.00275345 + "ts": 0.002875075 }, { "core_id": 1, @@ -2403,20 +2411,43 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 4294967295 }, - "ts": 0.00277025 + "ts": 0.0028871 }, { - "addr": "0x3ffb8858", + "core_id": 0, + "ctx_name": "main", + "id": 4, + "in_irq": false, + "params": { + "tid": 12274964 + }, + "ts": 0.002897825 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 49, + "in_irq": false, + "params": { + "pvBuffer": 3233808384, + "xJustPeek": 0, + "xQueue": 12281672, + "xTicksToWait": 10 + }, + "ts": 0.00293785 + }, + { + "addr": "0x3ffb8020", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6bef", - "0x400e693b", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3caf", + "0x400e3898", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2427,48 +2458,30 @@ "id": 512, "in_irq": false, "size": 8, - "ts": 0.002782075 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.00281335 + "ts": 0.002949925 }, { "core_id": 1, "ctx_name": "free0", - "id": 49, + "id": 53, "in_irq": false, "params": { - "pvBuffer": 3233808384, - "xJustPeek": 0, - "xQueue": 12283904, - "xTicksToWait": 10 + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12281672, + "xTicksToWait": 0 }, - "ts": 0.002824975 + "ts": 0.002992925 }, { - "core_id": 0, - "ctx_name": "main", - "id": 3, - "in_irq": false, - "params": {}, - "ts": 0.00283595 - }, - { - "addr": "0x3ffb8868", + "addr": "0x3ffb8030", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b304", - "0x400d6c38", - "0x400e693b", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a610", + "0x400d3cf8", + "0x400e3898", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2479,30 +2492,17 @@ "id": 512, "in_irq": false, "size": 2500, - "ts": 0.002860725 + "ts": 0.003004025 }, { - "core_id": 1, - "ctx_name": "free0", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12283904, - "xTicksToWait": 0 - }, - "ts": 0.002875775 - }, - { - "addr": "0x3ffb926c", + "addr": "0x3ffb8a34", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b30f", - "0x400d6c38", - "0x400e693b", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a61b", + "0x400d3cf8", + "0x400e3898", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2513,7 +2513,7 @@ "id": 512, "in_irq": false, "size": 340, - "ts": 0.002902375 + "ts": 0.00304465 }, { "core_id": 0, @@ -2521,9 +2521,9 @@ "id": 8, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.002925 + "ts": 0.0030675 }, { "core_id": 0, @@ -2533,9 +2533,9 @@ "params": { "name": "alloc1", "prio": 5, - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.00293765 + "ts": 0.00308015 }, { "core_id": 1, @@ -2545,9 +2545,9 @@ "params": { "name": "alloc1", "prio": 5, - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.00293765 + "ts": 0.00308015 }, { "core_id": 0, @@ -2555,12 +2555,12 @@ "id": 21, "in_irq": false, "params": { - "base": 1073449064, - "sz": 4294965096, - "tid": 12292716, + "base": 1073446960, + "sz": 4294965088, + "tid": 12290612, "unused": 0 }, - "ts": 0.0029468 + "ts": 0.003089275 }, { "core_id": 1, @@ -2568,12 +2568,12 @@ "id": 21, "in_irq": false, "params": { - "base": 1073449064, - "sz": 4294965096, - "tid": 12292716, + "base": 1073446960, + "sz": 4294965088, + "tid": 12290612, "unused": 0 }, - "ts": 0.0029468 + "ts": 0.003089275 }, { "core_id": 0, @@ -2581,9 +2581,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.002957675 + "ts": 0.0031 }, { "core_id": 1, @@ -2591,9 +2591,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.002957675 + "ts": 0.0031 }, { "core_id": 0, @@ -2603,7 +2603,7 @@ "params": { "irq_num": 30 }, - "ts": 0.0029733 + "ts": 0.003115575 }, { "core_id": 0, @@ -2611,7 +2611,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0029848 + "ts": 0.003126925 }, { "core_id": 0, @@ -2619,18 +2619,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.00300165 + "ts": 0.0031433 }, { - "addr": "0x3ffb93d0", + "addr": "0x3ffb8b98", "callers": [ - "0x40081fef", - "0x40089414", - "0x40088679", - "0x400d6aa4", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x400879c1", + "0x400d3b64", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2642,7 +2642,7 @@ "id": 512, "in_irq": false, "size": 124, - "ts": 0.0030371 + "ts": 0.003179725 }, { "core_id": 0, @@ -2654,16 +2654,16 @@ "uxItemSize": 4, "uxQueueLength": 10 }, - "ts": 0.003051375 + "ts": 0.003194025 }, { - "addr": "0x3ffb9450", + "addr": "0x3ffb8c18", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b304", - "0x400d6ae0", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a610", + "0x400d3ba0", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2675,16 +2675,16 @@ "id": 512, "in_irq": false, "size": 2500, - "ts": 0.00309075 + "ts": 0.003234475 }, { - "addr": "0x3ffb9e54", + "addr": "0x3ffb961c", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b30f", - "0x400d6ae0", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a61b", + "0x400d3ba0", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2696,7 +2696,7 @@ "id": 512, "in_irq": false, "size": 340, - "ts": 0.00312515 + "ts": 0.003269925 }, { "core_id": 0, @@ -2704,9 +2704,9 @@ "id": 8, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.0031519 + "ts": 0.00329665 }, { "core_id": 0, @@ -2716,9 +2716,9 @@ "params": { "name": "free1", "prio": 5, - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.0031644 + "ts": 0.00330915 }, { "core_id": 1, @@ -2728,9 +2728,9 @@ "params": { "name": "free1", "prio": 5, - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.0031644 + "ts": 0.00330915 }, { "core_id": 0, @@ -2738,12 +2738,12 @@ "id": 21, "in_irq": false, "params": { - "base": 1073452112, - "sz": 4294965088, - "tid": 12295764, + "base": 1073450008, + "sz": 4294965096, + "tid": 12293660, "unused": 0 }, - "ts": 0.00317355 + "ts": 0.00331835 }, { "core_id": 1, @@ -2751,12 +2751,12 @@ "id": 21, "in_irq": false, "params": { - "base": 1073452112, - "sz": 4294965088, - "tid": 12295764, + "base": 1073450008, + "sz": 4294965096, + "tid": 12293660, "unused": 0 }, - "ts": 0.00317355 + "ts": 0.00331835 }, { "core_id": 0, @@ -2764,9 +2764,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.003184375 + "ts": 0.003329175 }, { "core_id": 1, @@ -2774,18 +2774,18 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.003184375 + "ts": 0.003329175 }, { - "addr": "0x3ffb9fb8", + "addr": "0x3ffb9780", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2797,16 +2797,16 @@ "id": 512, "in_irq": false, "size": 2, - "ts": 0.0032206 + "ts": 0.00336635 }, { - "addr": "0x3ffb9fc8", + "addr": "0x3ffb9790", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2818,7 +2818,7 @@ "id": 512, "in_irq": false, "size": 4, - "ts": 0.00325505 + "ts": 0.003401775 }, { "core_id": 0, @@ -2828,10 +2828,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.00327195 + "ts": 0.0034187 }, { "core_id": 0, @@ -2841,10 +2841,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.003294125 + "ts": 0.003438675 }, { "core_id": 1, @@ -2852,8 +2852,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (310) example: Task[0x3ffb86d4]: free memory @ 0x3ffb8848\n", - "ts": 0.00333685 + "msg": "I (298) example: Task[0x3ffb7e9c]: free memory @ 0x3ffb8010\n", + "ts": 0.0034623 }, { "core_id": 1, @@ -2861,8 +2861,26 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (310) example: Task[0x3ffb86d4]: free memory @ 0x3ffb8848\n", - "ts": 0.00333685 + "msg": "I (298) example: Task[0x3ffb7e9c]: free memory @ 0x3ffb8010\n", + "ts": 0.0034623 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.003481375 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.003494825 }, { "core_id": 1, @@ -2872,7 +2890,25 @@ "params": { "irq_num": 31 }, - "ts": 0.003357 + "ts": 0.00350665 + }, + { + "core_id": 0, + "ctx_name": "alloc1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (298) example: Task[0x3ffb8a34]: allocated 4 bytes @ 0x3ffb9790\n", + "ts": 0.003526375 + }, + { + "core_id": 0, + "ctx_name": "alloc1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (298) example: Task[0x3ffb8a34]: allocated 4 bytes @ 0x3ffb9790\n", + "ts": 0.003526375 }, { "core_id": 1, @@ -2880,35 +2916,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.00336845 - }, - { - "core_id": 1, - "ctx_name": "free0", - "id": 4, - "in_irq": false, - "params": { - "tid": 12289748 - }, - "ts": 0.003385425 - }, - { - "core_id": 0, - "ctx_name": "alloc1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (311) example: Task[0x3ffb926c]: allocated 4 bytes @ 0x3ffb9fc8\n", - "ts": 0.00340425 - }, - { - "core_id": 0, - "ctx_name": "alloc1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (311) example: Task[0x3ffb926c]: allocated 4 bytes @ 0x3ffb9fc8\n", - "ts": 0.00340425 + "ts": 0.003537925 }, { "core_id": 0, @@ -2918,17 +2926,45 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 0 }, - "ts": 0.00341835 + "ts": 0.00355005 }, { - "addr": "0x3ffb8848", + "core_id": 1, + "ctx_name": "free0", + "id": 4, + "in_irq": false, + "params": { + "tid": 12287644 + }, + "ts": 0.003567875 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.00357885 + }, + { + "core_id": 0, + "ctx_name": "alloc1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.00359575 + }, + { + "addr": "0x3ffb8010", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2942,7 +2978,17 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.0034315 + "ts": 0.003606975 + }, + { + "core_id": 0, + "ctx_name": "alloc1", + "id": 4, + "in_irq": false, + "params": { + "tid": 12290612 + }, + "ts": 0.003617975 }, { "core_id": 0, @@ -2952,7 +2998,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.003443325 + "ts": 0.0036332 }, { "core_id": 0, @@ -2962,7 +3008,7 @@ "params": { "irq_num": 30 }, - "ts": 0.003462 + "ts": 0.0036529 }, { "core_id": 0, @@ -2970,7 +3016,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.00347595 + "ts": 0.00366705 }, { "core_id": 1, @@ -2980,7 +3026,7 @@ "params": { "irq_num": 31 }, - "ts": 0.003490025 + "ts": 0.00368095 }, { "core_id": 0, @@ -2988,9 +3034,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.003501925 + "ts": 0.0036928 }, { "core_id": 1, @@ -2998,7 +3044,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0035128 + "ts": 0.00370385 }, { "core_id": 1, @@ -3006,19 +3052,19 @@ "id": 4, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.00353205 + "ts": 0.003723175 }, { - "addr": "0x3ffb8848", + "addr": "0x3ffb8010", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6bef", - "0x400e693b", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3caf", + "0x400e3898", + "0x400880dc", "0x0", "0x0", "0x0", @@ -3029,7 +3075,7 @@ "id": 512, "in_irq": false, "size": 8, - "ts": 0.003544375 + "ts": 0.00373675 }, { "core_id": 1, @@ -3039,10 +3085,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 4294967295 }, - "ts": 0.003561425 + "ts": 0.0037538 }, { "core_id": 1, @@ -3052,20 +3098,33 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.0035801 + "ts": 0.003772075 }, { - "addr": "0x3ffb9fd8", + "core_id": 1, + "ctx_name": "free1", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12281672, + "xTicksToWait": 0 + }, + "ts": 0.00379115 + }, + { + "addr": "0x3ffb97a0", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b304", - "0x400d6c38", - "0x400e693b", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a610", + "0x400d3cf8", + "0x400e3898", + "0x400880dc", "0x0", "0x0", "0x0", @@ -3076,30 +3135,35 @@ "id": 512, "in_irq": false, "size": 2500, - "ts": 0.003597875 + "ts": 0.0038029 }, { "core_id": 1, "ctx_name": "free1", - "id": 53, + "id": 26, "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12283904, - "xTicksToWait": 0 - }, - "ts": 0.0036106 + "lvl": 0, + "msg": "I (299) example: Task[0x3ffb961c]: free memory @ 0x3ffb9790\n", + "ts": 0.003844025 }, { - "addr": "0x3ffba9dc", + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (299) example: Task[0x3ffb961c]: free memory @ 0x3ffb9790\n", + "ts": 0.003844025 + }, + { + "addr": "0x3ffba1a4", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b30f", - "0x400d6c38", - "0x400e693b", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a61b", + "0x400d3cf8", + "0x400e3898", + "0x400880dc", "0x0", "0x0", "0x0", @@ -3110,158 +3174,14 @@ "id": 512, "in_irq": false, "size": 340, - "ts": 0.003637125 + "ts": 0.00385595 }, { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (311) example: Task[0x3ffb9e54]: free memory @ 0x3ffb9fc8\n", - "ts": 0.003660625 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (311) example: Task[0x3ffb9e54]: free memory @ 0x3ffb9fc8\n", - "ts": 0.003660625 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 8, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.003672 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.0036882 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 9, - "in_irq": false, - "params": { - "name": "alloc2", - "prio": 5, - "tid": 12298716 - }, - "ts": 0.003700975 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 9, - "in_irq": true, - "params": { - "name": "alloc2", - "prio": 5, - "tid": 12298716 - }, - "ts": 0.003700975 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 21, - "in_irq": false, - "params": { - "base": 1073455064, - "sz": 4294965096, - "tid": 12298716, - "unused": 0 - }, - "ts": 0.00371195 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 21, - "in_irq": true, - "params": { - "base": 1073455064, - "sz": 4294965096, - "tid": 12298716, - "unused": 0 - }, - "ts": 0.00371195 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 6, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.00372485 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 6, - "in_irq": true, - "params": { - "tid": 12298716 - }, - "ts": 0.00372485 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.0037423 - }, - { - "core_id": 0, - "ctx_name": "FROM_CPU0", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 30 - }, - "ts": 0.00375315 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 4, - "in_irq": false, - "params": { - "tid": 12295764 - }, - "ts": 0.0037654 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.0037764 - }, - { - "addr": "0x3ffb9fc8", + "addr": "0x3ffb9790", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -3275,27 +3195,105 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.00379175 + "ts": 0.00386955 }, { "core_id": 0, - "ctx_name": "alloc2", - "id": 4, + "ctx_name": "main", + "id": 8, "in_irq": false, "params": { - "tid": 12298716 + "tid": 12296612 }, - "ts": 0.003803375 + "ts": 0.0038854 }, { "core_id": 0, - "ctx_name": "SysTick", + "ctx_name": "main", + "id": 9, + "in_irq": false, + "params": { + "name": "alloc2", + "prio": 5, + "tid": 12296612 + }, + "ts": 0.00390035 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 9, + "in_irq": false, + "params": { + "name": "alloc2", + "prio": 5, + "tid": 12296612 + }, + "ts": 0.00390035 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 21, + "in_irq": false, + "params": { + "base": 1073452960, + "sz": 4294965088, + "tid": 12296612, + "unused": 0 + }, + "ts": 0.003911525 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 21, + "in_irq": false, + "params": { + "base": 1073452960, + "sz": 4294965088, + "tid": 12296612, + "unused": 0 + }, + "ts": 0.003911525 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.00392455 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.00392455 + }, + { + "core_id": 0, + "ctx_name": "FROM_CPU0", "id": 2, "in_irq": true, "params": { - "irq_num": 5 + "irq_num": 30 }, - "ts": 0.003819875 + "ts": 0.003943225 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.003957125 }, { "core_id": 1, @@ -3305,15 +3303,17 @@ "params": { "irq_num": 31 }, - "ts": 0.003831475 + "ts": 0.003970975 }, { "core_id": 0, "ctx_name": "alloc2", - "id": 3, + "id": 4, "in_irq": false, - "params": {}, - "ts": 0.003843175 + "params": { + "tid": 12296612 + }, + "ts": 0.00398185 }, { "core_id": 1, @@ -3321,7 +3321,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.003853725 + "ts": 0.003992875 }, { "core_id": 1, @@ -3329,16 +3329,16 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.00387545 + "ts": 0.004014925 }, { - "addr": "0x3ffbab40", + "addr": "0x3ffba308", "callers": [ - "0x40081fef", - "0x40089414", - "0x40088679", - "0x400d6aa4", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x400879c1", + "0x400d3b64", + "0x400880dc", "0x0", "0x0", "0x0", @@ -3350,7 +3350,7 @@ "id": 512, "in_irq": false, "size": 124, - "ts": 0.003887725 + "ts": 0.004030875 }, { "core_id": 0, @@ -3362,16 +3362,16 @@ "uxItemSize": 4, "uxQueueLength": 10 }, - "ts": 0.003902275 + "ts": 0.0040452 }, { - "addr": "0x3ffbabc0", + "addr": "0x3ffba388", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b304", - "0x400d6ae0", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a610", + "0x400d3ba0", + "0x400880dc", "0x0", "0x0", "0x0", @@ -3383,16 +3383,16 @@ "id": 512, "in_irq": false, "size": 2500, - "ts": 0.003941625 + "ts": 0.004085625 }, { - "addr": "0x3ffbb5c4", + "addr": "0x3ffbad8c", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b30f", - "0x400d6ae0", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a61b", + "0x400d3ba0", + "0x400880dc", "0x0", "0x0", "0x0", @@ -3404,7 +3404,7 @@ "id": 512, "in_irq": false, "size": 340, - "ts": 0.003976025 + "ts": 0.0041211 }, { "core_id": 0, @@ -3412,9 +3412,9 @@ "id": 8, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.004002 + "ts": 0.004143675 }, { "core_id": 0, @@ -3424,9 +3424,9 @@ "params": { "name": "free2", "prio": 5, - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.004014625 + "ts": 0.00415625 }, { "core_id": 1, @@ -3436,9 +3436,9 @@ "params": { "name": "free2", "prio": 5, - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.004014625 + "ts": 0.00415625 }, { "core_id": 0, @@ -3446,12 +3446,12 @@ "id": 21, "in_irq": false, "params": { - "base": 1073458112, - "sz": 4294965088, - "tid": 12301764, + "base": 1073456008, + "sz": 4294965096, + "tid": 12299660, "unused": 0 }, - "ts": 0.0040238 + "ts": 0.004169425 }, { "core_id": 1, @@ -3459,12 +3459,12 @@ "id": 21, "in_irq": false, "params": { - "base": 1073458112, - "sz": 4294965088, - "tid": 12301764, + "base": 1073456008, + "sz": 4294965096, + "tid": 12299660, "unused": 0 }, - "ts": 0.0040238 + "ts": 0.004169425 }, { "core_id": 0, @@ -3472,9 +3472,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.0040346 + "ts": 0.00418015 }, { "core_id": 1, @@ -3482,9 +3482,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.0040346 + "ts": 0.00418015 }, { "core_id": 1, @@ -3494,7 +3494,7 @@ "params": { "irq_num": 31 }, - "ts": 0.00405085 + "ts": 0.00419625 }, { "core_id": 1, @@ -3502,16 +3502,16 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0040637 + "ts": 0.004209125 }, { - "addr": "0x3ffb9fc8", + "addr": "0x3ffb9790", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -3523,7 +3523,7 @@ "id": 512, "in_irq": false, "size": 3, - "ts": 0.004075375 + "ts": 0.00422135 }, { "core_id": 1, @@ -3531,9 +3531,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.004086825 + "ts": 0.004233575 }, { "core_id": 1, @@ -3543,16 +3543,16 @@ "params": { "irq_num": 31 }, - "ts": 0.0041132 + "ts": 0.00425995 }, { - "addr": "0x3ffbb728", + "addr": "0x3ffbaef0", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -3564,7 +3564,7 @@ "id": 512, "in_irq": false, "size": 6, - "ts": 0.00412495 + "ts": 0.004271525 }, { "core_id": 1, @@ -3572,7 +3572,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.004136375 + "ts": 0.004282925 }, { "core_id": 0, @@ -3582,10 +3582,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.00414835 + "ts": 0.00429495 }, { "core_id": 1, @@ -3593,7 +3593,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.004158625 + "ts": 0.00430615 }, { "core_id": 0, @@ -3603,10 +3603,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.004177025 + "ts": 0.004324575 }, { "core_id": 0, @@ -3614,8 +3614,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (312) example: Task[0x3ffba9dc]: allocated 6 bytes @ 0x3ffbb728\n", - "ts": 0.004229325 + "msg": "I (299) example: Task[0x3ffba1a4]: allocated 6 bytes @ 0x3ffbaef0\n", + "ts": 0.0043771 }, { "core_id": 0, @@ -3623,8 +3623,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (312) example: Task[0x3ffba9dc]: allocated 6 bytes @ 0x3ffbb728\n", - "ts": 0.004229325 + "msg": "I (299) example: Task[0x3ffba1a4]: allocated 6 bytes @ 0x3ffbaef0\n", + "ts": 0.0043771 }, { "core_id": 0, @@ -3634,10 +3634,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 0 }, - "ts": 0.004246325 + "ts": 0.004390575 }, { "core_id": 0, @@ -3645,9 +3645,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.004259475 + "ts": 0.004403775 }, { "core_id": 1, @@ -3655,9 +3655,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.004259475 + "ts": 0.004403775 }, { "core_id": 1, @@ -3667,7 +3667,7 @@ "params": { "irq_num": 31 }, - "ts": 0.00427575 + "ts": 0.004424325 }, { "core_id": 0, @@ -3677,7 +3677,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.0042866 + "ts": 0.004435175 }, { "core_id": 1, @@ -3685,7 +3685,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.004297375 + "ts": 0.004445975 }, { "core_id": 0, @@ -3695,17 +3695,17 @@ "params": { "irq_num": 30 }, - "ts": 0.00431125 + "ts": 0.004460225 }, { "core_id": 1, - "ctx_name": "free2", - "id": 4, - "in_irq": false, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, "params": { - "tid": 12301764 + "irq_num": 5 }, - "ts": 0.00432205 + "ts": 0.0044719 }, { "core_id": 0, @@ -3713,7 +3713,48 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0043329 + "ts": 0.004482925 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.004494925 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 4, + "in_irq": false, + "params": { + "tid": 12274964 + }, + "ts": 0.004505375 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 4, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.00452215 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 49, + "in_irq": false, + "params": { + "pvBuffer": 3233808384, + "xJustPeek": 0, + "xQueue": 12281672, + "xTicksToWait": 10 + }, + "ts": 0.004534325 }, { "core_id": 1, @@ -3723,10 +3764,68 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 4294967295 }, - "ts": 0.0043448 + "ts": 0.004546275 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.0045576 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 6, + "in_irq": true, + "params": { + "tid": 12274964 + }, + "ts": 0.0045687 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12274964 + }, + "ts": 0.0045687 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 39, + "in_irq": false, + "params": { + "pxMutexHolder": 1073433876 + }, + "ts": 0.00458235 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.004597425 + }, + { + "core_id": 1, + "ctx_name": "FROM_CPU1", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 31 + }, + "ts": 0.004608 }, { "core_id": 0, @@ -3734,9 +3833,134 @@ "id": 4, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.004355375 + "ts": 0.004618825 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.0046297 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12281672, + "xTicksToWait": 0 + }, + "ts": 0.004641 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.00465655 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 42, + "in_irq": false, + "params": { + "pxMutexHolder": 1073433876 + }, + "ts": 0.00467105 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 6, + "in_irq": false, + "params": { + "tid": 12274964 + }, + "ts": 0.004681725 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12274964 + }, + "ts": 0.004681725 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.0046955 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.0046955 + }, + { + "core_id": 1, + "ctx_name": "FROM_CPU1", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 31 + }, + "ts": 0.004711225 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.0047227 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (299) example: Wait notify 0\n", + "ts": 0.0047393 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (299) example: Wait notify 0\n", + "ts": 0.0047393 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 4, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.0047505 }, { "core_id": 1, @@ -3746,23 +3970,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.00436755 - }, - { - "core_id": 1, - "ctx_name": "free2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12283904, - "xTicksToWait": 0 - }, - "ts": 0.0043946 + "ts": 0.004767725 }, { "core_id": 0, @@ -3772,27 +3983,20 @@ "params": { "irq_num": 30 }, - "ts": 0.00440545 - }, - { - "core_id": 0, - "ctx_name": "FROM_CPU0", - "id": 6, - "in_irq": true, - "params": { - "tid": 12254080 - }, - "ts": 0.004417125 + "ts": 0.00477865 }, { "core_id": 1, "ctx_name": "free2", - "id": 6, + "id": 53, "in_irq": false, "params": { - "tid": 12254080 + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12281672, + "xTicksToWait": 0 }, - "ts": 0.004417125 + "ts": 0.004790975 }, { "core_id": 0, @@ -3800,30 +4004,15 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.004428475 + "ts": 0.004801725 }, { "core_id": 0, "ctx_name": "main", - "id": 4, + "id": 17, "in_irq": false, - "params": { - "tid": 12254080 - }, - "ts": 0.0044466 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 49, - "in_irq": false, - "params": { - "pvBuffer": 3233808384, - "xJustPeek": 0, - "xQueue": 12283904, - "xTicksToWait": 10 - }, - "ts": 0.00446105 + "params": {}, + "ts": 0.004819425 }, { "core_id": 1, @@ -3831,8 +4020,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (312) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb728\n", - "ts": 0.004485 + "msg": "I (299) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaef0\n", + "ts": 0.00484055 }, { "core_id": 1, @@ -3840,28 +4029,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (312) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb728\n", - "ts": 0.004485 + "msg": "I (299) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaef0\n", + "ts": 0.00484055 }, { - "core_id": 0, - "ctx_name": "main", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12283904, - "xTicksToWait": 0 - }, - "ts": 0.004501225 - }, - { - "addr": "0x3ffbb728", + "addr": "0x3ffbaef0", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -3875,25 +4051,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.00451485 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (312) example: Wait notify 0\n", - "ts": 0.004542 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (312) example: Wait notify 0\n", - "ts": 0.004542 + "ts": 0.004866125 }, { "core_id": 1, @@ -3903,7 +4061,7 @@ "params": { "irq_num": 31 }, - "ts": 0.004553025 + "ts": 0.004893775 }, { "core_id": 1, @@ -3911,17 +4069,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0045667 - }, - { - "core_id": 0, - "ctx_name": "FROM_CPU0", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 30 - }, - "ts": 0.004580775 + "ts": 0.004905175 }, { "core_id": 1, @@ -3929,23 +4077,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.00459145 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.004602475 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.0046186 + "ts": 0.00492175 }, { "core_id": 1, @@ -3955,7 +4087,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0046694 + "ts": 0.0054259 }, { "core_id": 1, @@ -3963,7 +4095,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.004682875 + "ts": 0.0054394 }, { "core_id": 1, @@ -3971,7 +4103,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.00469815 + "ts": 0.005454975 }, { "core_id": 0, @@ -3981,7 +4113,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0048132 + "ts": 0.0055467 }, { "core_id": 0, @@ -3989,7 +4121,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0048287 + "ts": 0.0055621 }, { "core_id": 0, @@ -3997,7 +4129,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.004843775 + "ts": 0.005577425 }, { "core_id": 1, @@ -4007,7 +4139,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0056694 + "ts": 0.0064259 }, { "core_id": 1, @@ -4015,7 +4147,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.005682975 + "ts": 0.0064394 }, { "core_id": 1, @@ -4023,7 +4155,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0056981 + "ts": 0.00645455 }, { "core_id": 0, @@ -4033,7 +4165,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0058132 + "ts": 0.0065467 }, { "core_id": 0, @@ -4041,7 +4173,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0058287 + "ts": 0.00656205 }, { "core_id": 0, @@ -4049,7 +4181,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.005843775 + "ts": 0.006577125 }, { "core_id": 1, @@ -4059,7 +4191,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0066694 + "ts": 0.0074259 }, { "core_id": 1, @@ -4067,7 +4199,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.006682925 + "ts": 0.0074394 }, { "core_id": 1, @@ -4075,7 +4207,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.006698075 + "ts": 0.007454675 }, { "core_id": 0, @@ -4085,7 +4217,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0068132 + "ts": 0.0075467 }, { "core_id": 0, @@ -4093,7 +4225,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0068286 + "ts": 0.00756205 }, { "core_id": 0, @@ -4101,7 +4233,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.006843825 + "ts": 0.00757715 }, { "core_id": 1, @@ -4111,7 +4243,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0076694 + "ts": 0.0084259 }, { "core_id": 1, @@ -4119,7 +4251,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.007682925 + "ts": 0.00843945 }, { "core_id": 1, @@ -4127,7 +4259,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.007698075 + "ts": 0.0084546 }, { "core_id": 0, @@ -4137,7 +4269,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0078132 + "ts": 0.0085467 }, { "core_id": 0, @@ -4145,7 +4277,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0078287 + "ts": 0.00856205 }, { "core_id": 0, @@ -4153,7 +4285,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.007843775 + "ts": 0.008577125 }, { "core_id": 1, @@ -4163,7 +4295,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0086694 + "ts": 0.0094259 }, { "core_id": 1, @@ -4171,7 +4303,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.008687175 + "ts": 0.0094394 }, { "core_id": 1, @@ -4179,7 +4311,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.008702325 + "ts": 0.00945455 }, { "core_id": 0, @@ -4189,7 +4321,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0088132 + "ts": 0.0095467 }, { "core_id": 0, @@ -4197,7 +4329,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0088287 + "ts": 0.0095621 }, { "core_id": 0, @@ -4205,7 +4337,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.008843775 + "ts": 0.009577425 }, { "core_id": 1, @@ -4215,7 +4347,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0096694 + "ts": 0.0104259 }, { "core_id": 1, @@ -4223,7 +4355,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.009682925 + "ts": 0.0104394 }, { "core_id": 1, @@ -4231,7 +4363,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.009698075 + "ts": 0.01045455 }, { "core_id": 0, @@ -4241,7 +4373,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0098132 + "ts": 0.0105467 }, { "core_id": 0, @@ -4249,7 +4381,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0098286 + "ts": 0.01056205 }, { "core_id": 0, @@ -4257,7 +4389,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.009843825 + "ts": 0.010577125 }, { "core_id": 1, @@ -4267,7 +4399,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0106694 + "ts": 0.0114259 }, { "core_id": 1, @@ -4275,7 +4407,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.010682925 + "ts": 0.0114394 }, { "core_id": 1, @@ -4283,7 +4415,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.010698075 + "ts": 0.011454675 }, { "core_id": 0, @@ -4293,7 +4425,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0108132 + "ts": 0.0115467 }, { "core_id": 0, @@ -4301,7 +4433,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0108287 + "ts": 0.01156205 }, { "core_id": 0, @@ -4309,7 +4441,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.010843775 + "ts": 0.01157715 }, { "core_id": 1, @@ -4319,7 +4451,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0116694 + "ts": 0.0124259 }, { "core_id": 1, @@ -4327,7 +4459,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.011682925 + "ts": 0.0124394 }, { "core_id": 1, @@ -4335,7 +4467,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.011698325 + "ts": 0.012454675 }, { "core_id": 0, @@ -4345,7 +4477,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0118132 + "ts": 0.0125467 }, { "core_id": 0, @@ -4353,7 +4485,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0118287 + "ts": 0.01256205 }, { "core_id": 0, @@ -4361,7 +4493,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.011843775 + "ts": 0.01257715 }, { "core_id": 1, @@ -4371,7 +4503,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0126694 + "ts": 0.0134259 }, { "core_id": 1, @@ -4379,7 +4511,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.012682975 + "ts": 0.01343945 }, { "core_id": 1, @@ -4387,7 +4519,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0126981 + "ts": 0.0134546 }, { "core_id": 0, @@ -4397,7 +4529,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0128132 + "ts": 0.0135467 }, { "core_id": 0, @@ -4405,7 +4537,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0128287 + "ts": 0.01356205 }, { "core_id": 0, @@ -4413,7 +4545,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.012843775 + "ts": 0.013577125 }, { "core_id": 1, @@ -4423,7 +4555,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0136694 + "ts": 0.0144259 }, { "core_id": 1, @@ -4431,7 +4563,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.013682925 + "ts": 0.0144394 }, { "core_id": 1, @@ -4439,7 +4571,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.013698075 + "ts": 0.01445455 }, { "core_id": 0, @@ -4449,7 +4581,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0138132 + "ts": 0.0145467 }, { "core_id": 0, @@ -4457,7 +4589,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.01382885 + "ts": 0.014562325 }, { "core_id": 0, @@ -4465,7 +4597,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.01384405 + "ts": 0.01457755 }, { "core_id": 1, @@ -4475,7 +4607,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0146694 + "ts": 0.0154259 }, { "core_id": 1, @@ -4483,7 +4615,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.014682925 + "ts": 0.0154394 }, { "core_id": 1, @@ -4491,7 +4623,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.014698075 + "ts": 0.01545455 }, { "core_id": 0, @@ -4501,7 +4633,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0148132 + "ts": 0.0155467 }, { "core_id": 0, @@ -4509,7 +4641,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0148287 + "ts": 0.01556205 }, { "core_id": 0, @@ -4517,7 +4649,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.014843775 + "ts": 0.015577125 }, { "core_id": 1, @@ -4527,7 +4659,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0156694 + "ts": 0.0164259 }, { "core_id": 1, @@ -4535,7 +4667,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.015682925 + "ts": 0.0164394 }, { "core_id": 1, @@ -4543,7 +4675,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.015698325 + "ts": 0.016454675 }, { "core_id": 0, @@ -4553,7 +4685,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0158132 + "ts": 0.0165467 }, { "core_id": 0, @@ -4561,7 +4693,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0158287 + "ts": 0.01656205 }, { "core_id": 0, @@ -4569,7 +4701,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.015843775 + "ts": 0.01657715 }, { "core_id": 1, @@ -4579,7 +4711,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0166694 + "ts": 0.0174259 }, { "core_id": 1, @@ -4587,7 +4719,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.016682975 + "ts": 0.01743945 }, { "core_id": 1, @@ -4595,7 +4727,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0166981 + "ts": 0.0174546 }, { "core_id": 0, @@ -4605,7 +4737,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0168132 + "ts": 0.0175467 }, { "core_id": 0, @@ -4613,7 +4745,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0168287 + "ts": 0.01756205 }, { "core_id": 0, @@ -4621,7 +4753,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.016843775 + "ts": 0.017577125 }, { "core_id": 1, @@ -4631,7 +4763,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0176694 + "ts": 0.0184259 }, { "core_id": 1, @@ -4639,7 +4771,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.017682925 + "ts": 0.0184394 }, { "core_id": 1, @@ -4647,7 +4779,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.017698075 + "ts": 0.01845455 }, { "core_id": 0, @@ -4657,7 +4789,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0178132 + "ts": 0.0185467 }, { "core_id": 0, @@ -4665,7 +4797,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0178286 + "ts": 0.0185621 }, { "core_id": 0, @@ -4673,7 +4805,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.017843825 + "ts": 0.018577425 }, { "core_id": 1, @@ -4683,7 +4815,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0186694 + "ts": 0.0194259 }, { "core_id": 1, @@ -4691,7 +4823,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.018682925 + "ts": 0.0194394 }, { "core_id": 1, @@ -4699,7 +4831,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.018698075 + "ts": 0.01945455 }, { "core_id": 0, @@ -4709,7 +4841,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0188132 + "ts": 0.0195467 }, { "core_id": 0, @@ -4717,7 +4849,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0188287 + "ts": 0.01956205 }, { "core_id": 0, @@ -4725,7 +4857,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.018843775 + "ts": 0.019577125 }, { "core_id": 1, @@ -4735,7 +4867,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0196694 + "ts": 0.0204259 }, { "core_id": 1, @@ -4743,7 +4875,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.019682925 + "ts": 0.0204394 }, { "core_id": 1, @@ -4751,7 +4883,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.019698325 + "ts": 0.020454675 }, { "core_id": 0, @@ -4761,7 +4893,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0198132 + "ts": 0.0205467 }, { "core_id": 0, @@ -4769,7 +4901,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0198287 + "ts": 0.02056205 }, { "core_id": 0, @@ -4777,7 +4909,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.019843775 + "ts": 0.02057715 }, { "core_id": 1, @@ -4787,7 +4919,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0206694 + "ts": 0.0214259 }, { "core_id": 1, @@ -4795,7 +4927,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0206872 + "ts": 0.02143945 }, { "core_id": 1, @@ -4803,7 +4935,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.020702325 + "ts": 0.0214546 }, { "core_id": 0, @@ -4813,7 +4945,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0208132 + "ts": 0.0215467 }, { "core_id": 0, @@ -4821,7 +4953,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0208287 + "ts": 0.02156205 }, { "core_id": 0, @@ -4829,7 +4961,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.020843775 + "ts": 0.021577125 }, { "core_id": 1, @@ -4839,7 +4971,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0216694 + "ts": 0.0224259 }, { "core_id": 1, @@ -4847,7 +4979,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.021682925 + "ts": 0.0224394 }, { "core_id": 1, @@ -4855,7 +4987,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.021698075 + "ts": 0.02245455 }, { "core_id": 0, @@ -4865,7 +4997,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0218132 + "ts": 0.0225467 }, { "core_id": 0, @@ -4873,7 +5005,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0218286 + "ts": 0.0225621 }, { "core_id": 0, @@ -4881,7 +5013,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.021843825 + "ts": 0.022577425 }, { "core_id": 1, @@ -4891,7 +5023,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0226694 + "ts": 0.0234259 }, { "core_id": 1, @@ -4899,7 +5031,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.022682925 + "ts": 0.0234394 }, { "core_id": 1, @@ -4907,7 +5039,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.022698075 + "ts": 0.02345455 }, { "core_id": 0, @@ -4917,7 +5049,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0228132 + "ts": 0.0235467 }, { "core_id": 0, @@ -4925,7 +5057,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0228287 + "ts": 0.02356205 }, { "core_id": 0, @@ -4933,7 +5065,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.022843775 + "ts": 0.023577125 }, { "core_id": 1, @@ -4943,7 +5075,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0236694 + "ts": 0.0244259 }, { "core_id": 1, @@ -4951,7 +5083,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.023682925 + "ts": 0.024443675 }, { "core_id": 1, @@ -4959,7 +5091,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.023698325 + "ts": 0.024458825 }, { "core_id": 0, @@ -4969,7 +5101,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0238132 + "ts": 0.0245467 }, { "core_id": 0, @@ -4977,7 +5109,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0238287 + "ts": 0.02456205 }, { "core_id": 0, @@ -4985,7 +5117,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.023843775 + "ts": 0.024577125 }, { "core_id": 1, @@ -4995,7 +5127,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0246694 + "ts": 0.0254259 }, { "core_id": 1, @@ -5003,7 +5135,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.024682975 + "ts": 0.0254394 }, { "core_id": 1, @@ -5011,7 +5143,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0246981 + "ts": 0.02545455 }, { "core_id": 0, @@ -5021,7 +5153,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0248132 + "ts": 0.0255467 }, { "core_id": 0, @@ -5029,7 +5161,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0248287 + "ts": 0.0255621 }, { "core_id": 0, @@ -5037,7 +5169,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.024843775 + "ts": 0.025577425 }, { "core_id": 1, @@ -5047,7 +5179,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0256694 + "ts": 0.0264259 }, { "core_id": 1, @@ -5055,7 +5187,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.025682925 + "ts": 0.0264394 }, { "core_id": 1, @@ -5063,7 +5195,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.025698075 + "ts": 0.02645455 }, { "core_id": 0, @@ -5073,7 +5205,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0258132 + "ts": 0.0265467 }, { "core_id": 0, @@ -5081,7 +5213,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0258286 + "ts": 0.02656205 }, { "core_id": 0, @@ -5089,7 +5221,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.025843825 + "ts": 0.026577125 }, { "core_id": 1, @@ -5099,7 +5231,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0266694 + "ts": 0.0274259 }, { "core_id": 1, @@ -5107,7 +5239,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.026682925 + "ts": 0.0274394 }, { "core_id": 1, @@ -5115,7 +5247,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.026698075 + "ts": 0.027454675 }, { "core_id": 0, @@ -5125,7 +5257,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0268132 + "ts": 0.0275467 }, { "core_id": 0, @@ -5133,7 +5265,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0268287 + "ts": 0.02756205 }, { "core_id": 0, @@ -5141,7 +5273,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.026843775 + "ts": 0.02757715 }, { "core_id": 1, @@ -5151,7 +5283,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0276694 + "ts": 0.0284259 }, { "core_id": 1, @@ -5159,7 +5291,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.027682925 + "ts": 0.02843945 }, { "core_id": 1, @@ -5167,7 +5299,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.027698325 + "ts": 0.0284546 }, { "core_id": 0, @@ -5177,7 +5309,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0278132 + "ts": 0.0285467 }, { "core_id": 0, @@ -5185,7 +5317,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0278287 + "ts": 0.02856205 }, { "core_id": 0, @@ -5193,7 +5325,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.027843775 + "ts": 0.028577125 }, { "core_id": 1, @@ -5203,7 +5335,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0286694 + "ts": 0.0294259 }, { "core_id": 1, @@ -5211,7 +5343,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.028682975 + "ts": 0.0294394 }, { "core_id": 1, @@ -5219,7 +5351,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0286981 + "ts": 0.02945455 }, { "core_id": 0, @@ -5229,7 +5361,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0288132 + "ts": 0.0295467 }, { "core_id": 0, @@ -5237,7 +5369,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0288287 + "ts": 0.0295621 }, { "core_id": 0, @@ -5245,7 +5377,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.028843775 + "ts": 0.029577425 }, { "core_id": 1, @@ -5255,7 +5387,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0296694 + "ts": 0.0304259 }, { "core_id": 1, @@ -5263,7 +5395,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.029682925 + "ts": 0.0304394 }, { "core_id": 1, @@ -5271,7 +5403,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.029698075 + "ts": 0.03045455 }, { "core_id": 0, @@ -5281,7 +5413,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0298132 + "ts": 0.0305467 }, { "core_id": 0, @@ -5289,7 +5421,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0298286 + "ts": 0.03056205 }, { "core_id": 0, @@ -5297,7 +5429,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.029843825 + "ts": 0.030577125 }, { "core_id": 1, @@ -5307,7 +5439,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0306694 + "ts": 0.0314259 }, { "core_id": 1, @@ -5315,7 +5447,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.030682925 + "ts": 0.0314394 }, { "core_id": 1, @@ -5323,7 +5455,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.030698075 + "ts": 0.031454675 }, { "core_id": 0, @@ -5333,7 +5465,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0308132 + "ts": 0.0315467 }, { "core_id": 0, @@ -5341,7 +5473,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0308287 + "ts": 0.03156205 }, { "core_id": 0, @@ -5349,7 +5481,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.030843775 + "ts": 0.03157715 }, { "core_id": 1, @@ -5359,7 +5491,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0316694 + "ts": 0.0324259 }, { "core_id": 1, @@ -5367,7 +5499,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.031682925 + "ts": 0.03243945 }, { "core_id": 1, @@ -5375,7 +5507,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.031698325 + "ts": 0.0324546 }, { "core_id": 0, @@ -5385,7 +5517,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0318132 + "ts": 0.0325467 }, { "core_id": 0, @@ -5393,9 +5525,9 @@ "id": 6, "in_irq": true, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.031828325 + "ts": 0.03256165 }, { "core_id": 1, @@ -5403,9 +5535,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.031828325 + "ts": 0.03256165 }, { "core_id": 0, @@ -5413,7 +5545,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0318409 + "ts": 0.0325743 }, { "core_id": 0, @@ -5421,18 +5553,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.0318604 + "ts": 0.032589975 }, { - "addr": "0x3ffbb728", + "addr": "0x3ffbaef0", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -5444,16 +5576,16 @@ "id": 512, "in_irq": false, "size": 2, - "ts": 0.0318958 + "ts": 0.032626425 }, { - "addr": "0x3ffbb738", + "addr": "0x3ffbaf00", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -5465,7 +5597,7 @@ "id": 512, "in_irq": false, "size": 4, - "ts": 0.03193035 + "ts": 0.03266185 }, { "core_id": 0, @@ -5475,10 +5607,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.031947275 + "ts": 0.0326823 }, { "core_id": 0, @@ -5488,10 +5620,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.031963225 + "ts": 0.032698225 }, { "core_id": 0, @@ -5499,8 +5631,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (340) example: Task[0x3ffb7aec]: allocated 4 bytes @ 0x3ffbb738\n", - "ts": 0.0320275 + "msg": "I (328) example: Task[0x3ffb72b4]: allocated 4 bytes @ 0x3ffbaf00\n", + "ts": 0.032750775 }, { "core_id": 0, @@ -5508,8 +5640,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (340) example: Task[0x3ffb7aec]: allocated 4 bytes @ 0x3ffbb738\n", - "ts": 0.0320275 + "msg": "I (328) example: Task[0x3ffb72b4]: allocated 4 bytes @ 0x3ffbaf00\n", + "ts": 0.032750775 }, { "core_id": 0, @@ -5519,10 +5651,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 0 }, - "ts": 0.0320412 + "ts": 0.032764225 }, { "core_id": 0, @@ -5530,9 +5662,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.03205445 + "ts": 0.03277745 }, { "core_id": 1, @@ -5540,9 +5672,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.03205445 + "ts": 0.03277745 }, { "core_id": 1, @@ -5552,7 +5684,7 @@ "params": { "irq_num": 31 }, - "ts": 0.032070625 + "ts": 0.0327937 }, { "core_id": 0, @@ -5562,7 +5694,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.032081475 + "ts": 0.03280465 }, { "core_id": 1, @@ -5570,7 +5702,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.032092275 + "ts": 0.0328154 }, { "core_id": 0, @@ -5580,7 +5712,7 @@ "params": { "irq_num": 30 }, - "ts": 0.032106075 + "ts": 0.03282915 }, { "core_id": 1, @@ -5588,9 +5720,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.032116925 + "ts": 0.032839875 }, { "core_id": 0, @@ -5598,7 +5730,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.032127825 + "ts": 0.032850675 }, { "core_id": 1, @@ -5608,10 +5740,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 4294967295 }, - "ts": 0.032139925 + "ts": 0.03286275 }, { "core_id": 0, @@ -5619,7 +5751,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0321505 + "ts": 0.03287395 }, { "core_id": 1, @@ -5629,10 +5761,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.032166625 + "ts": 0.0328912 }, { "core_id": 1, @@ -5642,10 +5774,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.032182825 + "ts": 0.032907525 }, { "core_id": 1, @@ -5653,8 +5785,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (340) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb738\n", - "ts": 0.032246375 + "msg": "I (328) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf00\n", + "ts": 0.0329553 }, { "core_id": 1, @@ -5662,15 +5794,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (340) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb738\n", - "ts": 0.032246375 + "msg": "I (328) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf00\n", + "ts": 0.0329553 }, { - "addr": "0x3ffbb738", + "addr": "0x3ffbaf00", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -5684,7 +5816,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.032267375 + "ts": 0.032980775 }, { "core_id": 1, @@ -5694,7 +5826,7 @@ "params": { "irq_num": 31 }, - "ts": 0.03229425 + "ts": 0.0330082 }, { "core_id": 1, @@ -5702,7 +5834,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.032305725 + "ts": 0.0330196 }, { "core_id": 1, @@ -5710,7 +5842,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.032322425 + "ts": 0.033036175 }, { "core_id": 1, @@ -5720,7 +5852,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0326694 + "ts": 0.0334259 }, { "core_id": 1, @@ -5728,7 +5860,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.03268285 + "ts": 0.03343945 }, { "core_id": 1, @@ -5736,7 +5868,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.032698425 + "ts": 0.03345515 }, { "core_id": 0, @@ -5746,7 +5878,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0328132 + "ts": 0.0335467 }, { "core_id": 0, @@ -5754,9 +5886,9 @@ "id": 6, "in_irq": true, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.032828225 + "ts": 0.03356165 }, { "core_id": 1, @@ -5764,9 +5896,29 @@ "id": 6, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.032828225 + "ts": 0.03356165 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 6, + "in_irq": true, + "params": { + "tid": 12296612 + }, + "ts": 0.03357355 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.03357355 }, { "core_id": 0, @@ -5774,7 +5926,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.03284085 + "ts": 0.0335861 }, { "core_id": 0, @@ -5782,18 +5934,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.032856525 + "ts": 0.033601775 }, { - "addr": "0x3ffbb738", + "addr": "0x3ffbaf00", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -5805,16 +5957,16 @@ "id": 512, "in_irq": false, "size": 4, - "ts": 0.0328917 + "ts": 0.033638 }, { - "addr": "0x3ffbb748", + "addr": "0x3ffbaf10", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -5826,7 +5978,7 @@ "id": 512, "in_irq": false, "size": 8, - "ts": 0.032926225 + "ts": 0.033673475 }, { "core_id": 0, @@ -5836,10 +5988,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.03294325 + "ts": 0.0336904 }, { "core_id": 0, @@ -5849,10 +6001,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.032963425 + "ts": 0.033706325 }, { "core_id": 0, @@ -5860,8 +6012,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (341) example: Task[0x3ffb926c]: allocated 8 bytes @ 0x3ffbb748\n", - "ts": 0.033027675 + "msg": "I (329) example: Task[0x3ffb8a34]: allocated 8 bytes @ 0x3ffbaf10\n", + "ts": 0.033758875 }, { "core_id": 0, @@ -5869,8 +6021,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (341) example: Task[0x3ffb926c]: allocated 8 bytes @ 0x3ffbb748\n", - "ts": 0.033027675 + "msg": "I (329) example: Task[0x3ffb8a34]: allocated 8 bytes @ 0x3ffbaf10\n", + "ts": 0.033758875 }, { "core_id": 0, @@ -5880,10 +6032,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 0 }, - "ts": 0.0330414 + "ts": 0.033776525 }, { "core_id": 0, @@ -5891,9 +6043,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.033054625 + "ts": 0.033789675 }, { "core_id": 1, @@ -5901,9 +6053,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.033054625 + "ts": 0.033789675 }, { "core_id": 1, @@ -5913,7 +6065,7 @@ "params": { "irq_num": 31 }, - "ts": 0.033070875 + "ts": 0.033806 }, { "core_id": 0, @@ -5923,7 +6075,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.033081725 + "ts": 0.03381685 }, { "core_id": 1, @@ -5931,7 +6083,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.033092475 + "ts": 0.03382765 }, { "core_id": 0, @@ -5941,7 +6093,7 @@ "params": { "irq_num": 30 }, - "ts": 0.0331062 + "ts": 0.0338417 }, { "core_id": 1, @@ -5949,9 +6101,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.033116975 + "ts": 0.0338535 }, { "core_id": 0, @@ -5959,7 +6111,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.033127725 + "ts": 0.03386475 }, { "core_id": 1, @@ -5969,18 +6121,20 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 4294967295 }, - "ts": 0.033139725 + "ts": 0.033876675 }, { "core_id": 0, - "ctx_name": "alloc1", - "id": 17, + "ctx_name": "alloc2", + "id": 4, "in_irq": false, - "params": {}, - "ts": 0.033151025 + "params": { + "tid": 12296612 + }, + "ts": 0.033888475 }, { "core_id": 1, @@ -5990,10 +6144,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.033162675 + "ts": 0.03390125 }, { "core_id": 1, @@ -6003,158 +6157,19 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.033179 + "ts": 0.033919975 }, { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (341) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb748\n", - "ts": 0.033242525 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (341) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb748\n", - "ts": 0.033242525 - }, - { - "addr": "0x3ffbb748", + "addr": "0x3ffbaf20", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0" - ], - "core_id": 1, - "ctx_name": "free1", - "id": 513, - "in_irq": false, - "size": 0, - "ts": 0.03326705 - }, - { - "core_id": 1, - "ctx_name": "FROM_CPU1", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 31 - }, - "ts": 0.03329405 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.033305475 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.03332205 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.0336694 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.03368295 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.033698525 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.0338132 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 6, - "in_irq": true, - "params": { - "tid": 12298716 - }, - "ts": 0.033828325 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 6, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.033828325 - }, - { - "core_id": 0, - "ctx_name": "alloc1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.033840975 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 4, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.03385665 - }, - { - "addr": "0x3ffbb748", - "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -6166,16 +6181,34 @@ "id": 512, "in_irq": false, "size": 6, - "ts": 0.033892175 + "ts": 0.033931975 }, { - "addr": "0x3ffbb758", + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (329) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf10\n", + "ts": 0.03397305 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (329) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf10\n", + "ts": 0.03397305 + }, + { + "addr": "0x3ffbaf30", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -6187,7 +6220,28 @@ "id": 512, "in_irq": false, "size": 12, - "ts": 0.033926575 + "ts": 0.0339889 + }, + { + "addr": "0x3ffbaf10", + "callers": [ + "0x4008da24", + "0x400d3c72", + "0x400880dc", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0" + ], + "core_id": 1, + "ctx_name": "free1", + "id": 513, + "in_irq": false, + "size": 0, + "ts": 0.0340032 }, { "core_id": 0, @@ -6197,10 +6251,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.033943475 + "ts": 0.034015625 }, { "core_id": 0, @@ -6210,61 +6264,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.03395945 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (342) example: Task[0x3ffba9dc]: allocated 12 bytes @ 0x3ffbb758\n", - "ts": 0.0340298 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (342) example: Task[0x3ffba9dc]: allocated 12 bytes @ 0x3ffbb758\n", - "ts": 0.0340298 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12299072, - "xTicksToWait": 0 - }, - "ts": 0.034047625 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 6, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.03406085 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 6, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.03406085 + "ts": 0.034035675 }, { "core_id": 1, @@ -6274,7 +6277,84 @@ "params": { "irq_num": 31 }, - "ts": 0.03407715 + "ts": 0.0340466 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.034058125 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.0340761 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (329) example: Task[0x3ffba1a4]: allocated 12 bytes @ 0x3ffbaf30\n", + "ts": 0.0340941 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (329) example: Task[0x3ffba1a4]: allocated 12 bytes @ 0x3ffbaf30\n", + "ts": 0.0340941 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12296968, + "xTicksToWait": 0 + }, + "ts": 0.034107525 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.034124925 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.034124925 + }, + { + "core_id": 1, + "ctx_name": "FROM_CPU1", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 31 + }, + "ts": 0.034141275 }, { "core_id": 0, @@ -6284,7 +6364,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.034088 + "ts": 0.034152125 }, { "core_id": 1, @@ -6292,7 +6372,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.034098775 + "ts": 0.03416295 }, { "core_id": 0, @@ -6302,7 +6382,7 @@ "params": { "irq_num": 30 }, - "ts": 0.0341125 + "ts": 0.03417675 }, { "core_id": 1, @@ -6310,9 +6390,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.034123375 + "ts": 0.0341875 }, { "core_id": 0, @@ -6320,7 +6400,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0341342 + "ts": 0.0341983 }, { "core_id": 1, @@ -6330,10 +6410,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 4294967295 }, - "ts": 0.0341462 + "ts": 0.03421025 }, { "core_id": 0, @@ -6341,7 +6421,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.03415645 + "ts": 0.034221475 }, { "core_id": 1, @@ -6351,10 +6431,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.03416785 + "ts": 0.0342333 }, { "core_id": 1, @@ -6364,10 +6444,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.034184225 + "ts": 0.03424955 }, { "core_id": 1, @@ -6375,8 +6455,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (342) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb758\n", - "ts": 0.0342479 + "msg": "I (329) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf30\n", + "ts": 0.034297325 }, { "core_id": 1, @@ -6384,15 +6464,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (342) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb758\n", - "ts": 0.0342479 + "msg": "I (329) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf30\n", + "ts": 0.034297325 }, { - "addr": "0x3ffbb758", + "addr": "0x3ffbaf30", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -6406,7 +6486,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.0342691 + "ts": 0.0343187 }, { "core_id": 1, @@ -6416,7 +6496,7 @@ "params": { "irq_num": 31 }, - "ts": 0.034300025 + "ts": 0.034346125 }, { "core_id": 1, @@ -6424,7 +6504,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0343115 + "ts": 0.034357525 }, { "core_id": 1, @@ -6432,7 +6512,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0343282 + "ts": 0.0343741 }, { "core_id": 1, @@ -6442,7 +6522,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0346694 + "ts": 0.0344259 }, { "core_id": 1, @@ -6450,7 +6530,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.03468285 + "ts": 0.03443945 }, { "core_id": 1, @@ -6458,7 +6538,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.034698425 + "ts": 0.03445515 }, { "core_id": 0, @@ -6468,7 +6548,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0348132 + "ts": 0.0345467 }, { "core_id": 0, @@ -6476,7 +6556,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0348286 + "ts": 0.03456205 }, { "core_id": 0, @@ -6484,7 +6564,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.034843825 + "ts": 0.034577125 }, { "core_id": 1, @@ -6494,7 +6574,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0356694 + "ts": 0.0354259 }, { "core_id": 1, @@ -6502,7 +6582,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.035682925 + "ts": 0.0354394 }, { "core_id": 1, @@ -6510,7 +6590,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.035698075 + "ts": 0.03545455 }, { "core_id": 0, @@ -6520,7 +6600,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0358132 + "ts": 0.0355467 }, { "core_id": 0, @@ -6528,7 +6608,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0358287 + "ts": 0.0355621 }, { "core_id": 0, @@ -6536,7 +6616,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.035843775 + "ts": 0.035577425 }, { "core_id": 1, @@ -6546,7 +6626,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0366694 + "ts": 0.0364259 }, { "core_id": 1, @@ -6554,7 +6634,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.036682925 + "ts": 0.0364394 }, { "core_id": 1, @@ -6562,7 +6642,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.036698325 + "ts": 0.03645455 }, { "core_id": 0, @@ -6572,7 +6652,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0368132 + "ts": 0.0365467 }, { "core_id": 0, @@ -6580,7 +6660,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0368287 + "ts": 0.03656635 }, { "core_id": 0, @@ -6588,7 +6668,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.036843775 + "ts": 0.03658155 }, { "core_id": 1, @@ -6598,7 +6678,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0376694 + "ts": 0.0374259 }, { "core_id": 1, @@ -6606,7 +6686,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.037682975 + "ts": 0.0374394 }, { "core_id": 1, @@ -6614,7 +6694,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0376981 + "ts": 0.03745455 }, { "core_id": 0, @@ -6624,7 +6704,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0378132 + "ts": 0.0375467 }, { "core_id": 0, @@ -6632,7 +6712,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0378287 + "ts": 0.03756205 }, { "core_id": 0, @@ -6640,7 +6720,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.037843775 + "ts": 0.037577125 }, { "core_id": 1, @@ -6650,7 +6730,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0386694 + "ts": 0.0384259 }, { "core_id": 1, @@ -6658,7 +6738,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.038682925 + "ts": 0.0384394 }, { "core_id": 1, @@ -6666,7 +6746,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.038698075 + "ts": 0.038454675 }, { "core_id": 0, @@ -6676,7 +6756,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0388132 + "ts": 0.0385467 }, { "core_id": 0, @@ -6684,7 +6764,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0388286 + "ts": 0.03856205 }, { "core_id": 0, @@ -6692,7 +6772,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.038843825 + "ts": 0.03857715 }, { "core_id": 1, @@ -6702,7 +6782,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0396694 + "ts": 0.0394259 }, { "core_id": 1, @@ -6710,7 +6790,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.039682925 + "ts": 0.03943945 }, { "core_id": 1, @@ -6718,7 +6798,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.039698075 + "ts": 0.0394546 }, { "core_id": 0, @@ -6728,7 +6808,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0398132 + "ts": 0.0395467 }, { "core_id": 0, @@ -6736,7 +6816,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0398287 + "ts": 0.03956205 }, { "core_id": 0, @@ -6744,7 +6824,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.039843775 + "ts": 0.039577125 }, { "core_id": 1, @@ -6754,7 +6834,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0406694 + "ts": 0.0404259 }, { "core_id": 1, @@ -6762,7 +6842,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.040682925 + "ts": 0.0404394 }, { "core_id": 1, @@ -6770,7 +6850,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.040698325 + "ts": 0.04045455 }, { "core_id": 0, @@ -6780,7 +6860,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0408132 + "ts": 0.0405467 }, { "core_id": 0, @@ -6788,7 +6868,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0408287 + "ts": 0.0405621 }, { "core_id": 0, @@ -6796,7 +6876,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.040843775 + "ts": 0.040577425 }, { "core_id": 1, @@ -6806,7 +6886,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0416694 + "ts": 0.0414259 }, { "core_id": 1, @@ -6814,7 +6894,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.041682975 + "ts": 0.0414394 }, { "core_id": 1, @@ -6822,7 +6902,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0416981 + "ts": 0.04145455 }, { "core_id": 0, @@ -6832,7 +6912,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0418132 + "ts": 0.0415467 }, { "core_id": 0, @@ -6840,7 +6920,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0418287 + "ts": 0.04156205 }, { "core_id": 0, @@ -6848,7 +6928,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.041843775 + "ts": 0.041577125 }, { "core_id": 1, @@ -6858,7 +6938,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0426694 + "ts": 0.0424259 }, { "core_id": 1, @@ -6866,7 +6946,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.042682925 + "ts": 0.0424394 }, { "core_id": 1, @@ -6874,7 +6954,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.042698075 + "ts": 0.042454675 }, { "core_id": 0, @@ -6884,7 +6964,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0428132 + "ts": 0.0425467 }, { "core_id": 0, @@ -6892,7 +6972,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0428286 + "ts": 0.04256205 }, { "core_id": 0, @@ -6900,7 +6980,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.042843825 + "ts": 0.04257715 }, { "core_id": 1, @@ -6910,7 +6990,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0436694 + "ts": 0.0434259 }, { "core_id": 1, @@ -6918,7 +6998,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.043682925 + "ts": 0.04343945 }, { "core_id": 1, @@ -6926,7 +7006,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.043698075 + "ts": 0.0434546 }, { "core_id": 0, @@ -6936,7 +7016,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0438132 + "ts": 0.0435467 }, { "core_id": 0, @@ -6944,7 +7024,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0438287 + "ts": 0.04356205 }, { "core_id": 0, @@ -6952,7 +7032,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.043843775 + "ts": 0.043577125 }, { "core_id": 1, @@ -6962,7 +7042,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0446694 + "ts": 0.0444259 }, { "core_id": 1, @@ -6970,7 +7050,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.044687175 + "ts": 0.0444394 }, { "core_id": 1, @@ -6978,7 +7058,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0447023 + "ts": 0.04445455 }, { "core_id": 0, @@ -6988,7 +7068,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0448132 + "ts": 0.0445467 }, { "core_id": 0, @@ -6996,7 +7076,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0448287 + "ts": 0.0445621 }, { "core_id": 0, @@ -7004,7 +7084,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.044843775 + "ts": 0.044577425 }, { "core_id": 1, @@ -7014,7 +7094,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0456694 + "ts": 0.0454259 }, { "core_id": 1, @@ -7022,7 +7102,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.045682925 + "ts": 0.0454394 }, { "core_id": 1, @@ -7030,7 +7110,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.045698075 + "ts": 0.04545455 }, { "core_id": 0, @@ -7040,7 +7120,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0458132 + "ts": 0.0455467 }, { "core_id": 0, @@ -7048,7 +7128,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0458286 + "ts": 0.04556205 }, { "core_id": 0, @@ -7056,7 +7136,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.045843825 + "ts": 0.045577125 }, { "core_id": 1, @@ -7066,7 +7146,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0466694 + "ts": 0.0464259 }, { "core_id": 1, @@ -7074,7 +7154,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.046682925 + "ts": 0.0464394 }, { "core_id": 1, @@ -7082,7 +7162,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.046698075 + "ts": 0.046454675 }, { "core_id": 0, @@ -7092,7 +7172,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0468132 + "ts": 0.0465467 }, { "core_id": 0, @@ -7100,7 +7180,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0468287 + "ts": 0.04656205 }, { "core_id": 0, @@ -7108,7 +7188,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.046843775 + "ts": 0.04657715 }, { "core_id": 1, @@ -7118,7 +7198,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0476694 + "ts": 0.0474259 }, { "core_id": 1, @@ -7126,7 +7206,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.047682925 + "ts": 0.04743945 }, { "core_id": 1, @@ -7134,7 +7214,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.047698325 + "ts": 0.0474546 }, { "core_id": 0, @@ -7144,7 +7224,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0478132 + "ts": 0.0475467 }, { "core_id": 0, @@ -7152,7 +7232,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0478287 + "ts": 0.04756205 }, { "core_id": 0, @@ -7160,7 +7240,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.047843775 + "ts": 0.047577125 }, { "core_id": 1, @@ -7170,7 +7250,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0486694 + "ts": 0.0484259 }, { "core_id": 1, @@ -7178,7 +7258,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.048682975 + "ts": 0.0484394 }, { "core_id": 1, @@ -7186,7 +7266,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0486981 + "ts": 0.04845455 }, { "core_id": 0, @@ -7196,7 +7276,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0488132 + "ts": 0.0485467 }, { "core_id": 0, @@ -7204,7 +7284,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0488287 + "ts": 0.048566325 }, { "core_id": 0, @@ -7212,7 +7292,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.048843775 + "ts": 0.04858155 }, { "core_id": 1, @@ -7222,7 +7302,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0496694 + "ts": 0.0494259 }, { "core_id": 1, @@ -7230,7 +7310,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.049682925 + "ts": 0.0494394 }, { "core_id": 1, @@ -7238,7 +7318,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.049698075 + "ts": 0.04945455 }, { "core_id": 0, @@ -7248,7 +7328,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0498132 + "ts": 0.0495467 }, { "core_id": 0, @@ -7256,7 +7336,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0498286 + "ts": 0.04956205 }, { "core_id": 0, @@ -7264,7 +7344,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.049843825 + "ts": 0.049577125 }, { "core_id": 1, @@ -7274,7 +7354,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0506694 + "ts": 0.0504259 }, { "core_id": 1, @@ -7282,7 +7362,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.050682925 + "ts": 0.0504394 }, { "core_id": 1, @@ -7290,7 +7370,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.050698075 + "ts": 0.050454675 }, { "core_id": 0, @@ -7300,7 +7380,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0508132 + "ts": 0.0505467 }, { "core_id": 0, @@ -7308,7 +7388,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0508287 + "ts": 0.05056205 }, { "core_id": 0, @@ -7316,7 +7396,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.050843775 + "ts": 0.05057715 }, { "core_id": 1, @@ -7326,7 +7406,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0516694 + "ts": 0.0514259 }, { "core_id": 1, @@ -7334,7 +7414,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.051682925 + "ts": 0.05143945 }, { "core_id": 1, @@ -7342,7 +7422,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.051698325 + "ts": 0.0514546 }, { "core_id": 0, @@ -7352,7 +7432,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0518132 + "ts": 0.0515467 }, { "core_id": 0, @@ -7360,7 +7440,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0518287 + "ts": 0.05156205 }, { "core_id": 0, @@ -7368,7 +7448,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.051843775 + "ts": 0.051577125 }, { "core_id": 1, @@ -7378,7 +7458,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0526694 + "ts": 0.0524259 }, { "core_id": 1, @@ -7386,7 +7466,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.052682975 + "ts": 0.0524394 }, { "core_id": 1, @@ -7394,7 +7474,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0526981 + "ts": 0.05245455 }, { "core_id": 0, @@ -7404,7 +7484,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0528132 + "ts": 0.0525467 }, { "core_id": 0, @@ -7412,7 +7492,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0528287 + "ts": 0.0525621 }, { "core_id": 0, @@ -7420,7 +7500,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.052843775 + "ts": 0.052577425 }, { "core_id": 1, @@ -7430,7 +7510,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0536694 + "ts": 0.0534259 }, { "core_id": 1, @@ -7438,7 +7518,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.053682925 + "ts": 0.0534394 }, { "core_id": 1, @@ -7446,7 +7526,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.053698075 + "ts": 0.05345455 }, { "core_id": 0, @@ -7456,7 +7536,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0538132 + "ts": 0.0535467 }, { "core_id": 0, @@ -7464,7 +7544,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0538286 + "ts": 0.05356205 }, { "core_id": 0, @@ -7472,7 +7552,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.053843825 + "ts": 0.053577125 }, { "core_id": 1, @@ -7482,7 +7562,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0546694 + "ts": 0.0544259 }, { "core_id": 1, @@ -7490,7 +7570,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.054682925 + "ts": 0.0544394 }, { "core_id": 1, @@ -7498,7 +7578,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.054698075 + "ts": 0.054454675 }, { "core_id": 0, @@ -7508,7 +7588,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0548132 + "ts": 0.0545467 }, { "core_id": 0, @@ -7516,7 +7596,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0548287 + "ts": 0.05456205 }, { "core_id": 0, @@ -7524,7 +7604,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.054843775 + "ts": 0.05457715 }, { "core_id": 1, @@ -7534,7 +7614,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0556694 + "ts": 0.0554259 }, { "core_id": 1, @@ -7542,7 +7622,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.055682925 + "ts": 0.05543945 }, { "core_id": 1, @@ -7550,7 +7630,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.055698325 + "ts": 0.0554546 }, { "core_id": 0, @@ -7560,7 +7640,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0558132 + "ts": 0.0555467 }, { "core_id": 0, @@ -7568,7 +7648,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0558287 + "ts": 0.05556205 }, { "core_id": 0, @@ -7576,7 +7656,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.055843775 + "ts": 0.055577125 }, { "core_id": 1, @@ -7586,7 +7666,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0566694 + "ts": 0.0564259 }, { "core_id": 1, @@ -7594,7 +7674,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0566872 + "ts": 0.0564394 }, { "core_id": 1, @@ -7602,7 +7682,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.05670235 + "ts": 0.05645455 }, { "core_id": 0, @@ -7612,7 +7692,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0568132 + "ts": 0.0565467 }, { "core_id": 0, @@ -7620,7 +7700,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0568287 + "ts": 0.0565621 }, { "core_id": 0, @@ -7628,7 +7708,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.056843775 + "ts": 0.056577425 }, { "core_id": 1, @@ -7638,7 +7718,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0576694 + "ts": 0.0574259 }, { "core_id": 1, @@ -7646,7 +7726,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.057682925 + "ts": 0.0574394 }, { "core_id": 1, @@ -7654,7 +7734,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.057698075 + "ts": 0.05745455 }, { "core_id": 0, @@ -7664,7 +7744,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0578132 + "ts": 0.0575467 }, { "core_id": 0, @@ -7672,7 +7752,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0578286 + "ts": 0.05756205 }, { "core_id": 0, @@ -7680,7 +7760,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.057843825 + "ts": 0.057577125 }, { "core_id": 1, @@ -7690,7 +7770,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0586694 + "ts": 0.0584259 }, { "core_id": 1, @@ -7698,7 +7778,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.058682925 + "ts": 0.0584394 }, { "core_id": 1, @@ -7706,7 +7786,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.058698075 + "ts": 0.058454675 }, { "core_id": 0, @@ -7716,7 +7796,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0588132 + "ts": 0.0585467 }, { "core_id": 0, @@ -7724,7 +7804,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0588287 + "ts": 0.05856205 }, { "core_id": 0, @@ -7732,7 +7812,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.058843775 + "ts": 0.05857715 }, { "core_id": 1, @@ -7742,7 +7822,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0596694 + "ts": 0.0594259 }, { "core_id": 1, @@ -7750,7 +7830,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.059682925 + "ts": 0.05943945 }, { "core_id": 1, @@ -7758,7 +7838,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.059698325 + "ts": 0.0594546 }, { "core_id": 0, @@ -7768,7 +7848,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0598132 + "ts": 0.0595467 }, { "core_id": 0, @@ -7776,7 +7856,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0598287 + "ts": 0.05956205 }, { "core_id": 0, @@ -7784,7 +7864,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.059843775 + "ts": 0.059577125 }, { "core_id": 1, @@ -7794,7 +7874,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0606694 + "ts": 0.0604259 }, { "core_id": 1, @@ -7802,7 +7882,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.060682975 + "ts": 0.0604394 }, { "core_id": 1, @@ -7810,7 +7890,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0606981 + "ts": 0.06045455 }, { "core_id": 0, @@ -7820,7 +7900,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0608132 + "ts": 0.0605467 }, { "core_id": 0, @@ -7828,7 +7908,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0608287 + "ts": 0.060566325 }, { "core_id": 0, @@ -7836,7 +7916,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.060843775 + "ts": 0.06058155 }, { "core_id": 1, @@ -7846,7 +7926,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0616694 + "ts": 0.0614259 }, { "core_id": 1, @@ -7854,7 +7934,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.061682925 + "ts": 0.0614394 }, { "core_id": 1, @@ -7862,7 +7942,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.061698075 + "ts": 0.06145455 }, { "core_id": 0, @@ -7872,7 +7952,59 @@ "params": { "irq_num": 5 }, - "ts": 0.0618132 + "ts": 0.0615467 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.06156205 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.061577125 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.0624259 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.0624394 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.062454675 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.0625467 }, { "core_id": 0, @@ -7880,9 +8012,9 @@ "id": 6, "in_irq": true, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.061828225 + "ts": 0.062561675 }, { "core_id": 1, @@ -7890,9 +8022,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.061828225 + "ts": 0.062561675 }, { "core_id": 0, @@ -7900,7 +8032,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.06184085 + "ts": 0.06257425 }, { "core_id": 0, @@ -7908,18 +8040,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.061856525 + "ts": 0.062589925 }, { - "addr": "0x3ffbb758", + "addr": "0x3ffbaf10", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -7931,16 +8063,16 @@ "id": 512, "in_irq": false, "size": 3, - "ts": 0.06189185 + "ts": 0.062624925 }, { - "addr": "0x3ffbb768", + "addr": "0x3ffbaf30", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -7952,7 +8084,7 @@ "id": 512, "in_irq": false, "size": 6, - "ts": 0.061926275 + "ts": 0.062660425 }, { "core_id": 0, @@ -7962,10 +8094,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.0619433 + "ts": 0.06267735 }, { "core_id": 0, @@ -7975,10 +8107,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.061959425 + "ts": 0.062693275 }, { "core_id": 0, @@ -7986,8 +8118,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (370) example: Task[0x3ffb7aec]: allocated 6 bytes @ 0x3ffbb768\n", - "ts": 0.062023675 + "msg": "I (358) example: Task[0x3ffb72b4]: allocated 6 bytes @ 0x3ffbaf30\n", + "ts": 0.062745825 }, { "core_id": 0, @@ -7995,8 +8127,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (370) example: Task[0x3ffb7aec]: allocated 6 bytes @ 0x3ffbb768\n", - "ts": 0.062023675 + "msg": "I (358) example: Task[0x3ffb72b4]: allocated 6 bytes @ 0x3ffbaf30\n", + "ts": 0.062745825 }, { "core_id": 0, @@ -8006,10 +8138,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 0 }, - "ts": 0.062041475 + "ts": 0.062759275 }, { "core_id": 0, @@ -8017,9 +8149,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.0620546 + "ts": 0.0627725 }, { "core_id": 1, @@ -8027,9 +8159,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.0620546 + "ts": 0.0627725 }, { "core_id": 1, @@ -8039,7 +8171,7 @@ "params": { "irq_num": 31 }, - "ts": 0.0620708 + "ts": 0.062792925 }, { "core_id": 0, @@ -8049,7 +8181,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.062081675 + "ts": 0.062803875 }, { "core_id": 1, @@ -8057,7 +8189,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.06209245 + "ts": 0.06281465 }, { "core_id": 0, @@ -8067,7 +8199,7 @@ "params": { "irq_num": 30 }, - "ts": 0.062106525 + "ts": 0.06282855 }, { "core_id": 1, @@ -8075,9 +8207,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.06211735 + "ts": 0.06283935 }, { "core_id": 0, @@ -8085,7 +8217,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.062128225 + "ts": 0.062850075 }, { "core_id": 1, @@ -8095,10 +8227,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 4294967295 }, - "ts": 0.0621401 + "ts": 0.0628623 }, { "core_id": 0, @@ -8106,7 +8238,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.062150525 + "ts": 0.062872475 }, { "core_id": 1, @@ -8116,10 +8248,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.062162975 + "ts": 0.062884375 }, { "core_id": 1, @@ -8129,10 +8261,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.062179175 + "ts": 0.06290065 }, { "core_id": 1, @@ -8140,8 +8272,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (370) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb768\n", - "ts": 0.062242725 + "msg": "I (358) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf30\n", + "ts": 0.062948525 }, { "core_id": 1, @@ -8149,15 +8281,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (370) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb768\n", - "ts": 0.062242725 + "msg": "I (358) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf30\n", + "ts": 0.062948525 }, { - "addr": "0x3ffbb768", + "addr": "0x3ffbaf30", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -8171,7 +8303,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.062263725 + "ts": 0.06296975 }, { "core_id": 1, @@ -8181,7 +8313,7 @@ "params": { "irq_num": 31 }, - "ts": 0.062294025 + "ts": 0.062997025 }, { "core_id": 1, @@ -8189,7 +8321,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0623055 + "ts": 0.063008475 }, { "core_id": 1, @@ -8197,7 +8329,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0623222 + "ts": 0.063025175 }, { "core_id": 1, @@ -8207,7 +8339,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0626694 + "ts": 0.0634259 }, { "core_id": 1, @@ -8215,7 +8347,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.06268285 + "ts": 0.06343945 }, { "core_id": 1, @@ -8223,7 +8355,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.062698425 + "ts": 0.06345515 }, { "core_id": 0, @@ -8233,7 +8365,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0628132 + "ts": 0.0635467 }, { "core_id": 0, @@ -8241,9 +8373,9 @@ "id": 6, "in_irq": true, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.062828225 + "ts": 0.0635617 }, { "core_id": 1, @@ -8251,9 +8383,29 @@ "id": 6, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.062828225 + "ts": 0.0635617 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 6, + "in_irq": true, + "params": { + "tid": 12296612 + }, + "ts": 0.06357355 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.06357355 }, { "core_id": 0, @@ -8261,7 +8413,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.06284085 + "ts": 0.06358605 }, { "core_id": 0, @@ -8269,18 +8421,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.062856525 + "ts": 0.063601725 }, { - "addr": "0x3ffbb768", + "addr": "0x3ffbaf30", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -8292,16 +8444,16 @@ "id": 512, "in_irq": false, "size": 6, - "ts": 0.06289185 + "ts": 0.06363815 }, { - "addr": "0x3ffbb778", + "addr": "0x3ffbaf40", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -8313,7 +8465,7 @@ "id": 512, "in_irq": false, "size": 12, - "ts": 0.062926275 + "ts": 0.0636778 }, { "core_id": 0, @@ -8323,10 +8475,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.0629433 + "ts": 0.063694725 }, { "core_id": 0, @@ -8336,10 +8488,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.062959425 + "ts": 0.06371075 }, { "core_id": 0, @@ -8347,8 +8499,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (371) example: Task[0x3ffb926c]: allocated 12 bytes @ 0x3ffbb778\n", - "ts": 0.0630259 + "msg": "I (359) example: Task[0x3ffb8a34]: allocated 12 bytes @ 0x3ffbaf40\n", + "ts": 0.063765475 }, { "core_id": 0, @@ -8356,8 +8508,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (371) example: Task[0x3ffb926c]: allocated 12 bytes @ 0x3ffbb778\n", - "ts": 0.0630259 + "msg": "I (359) example: Task[0x3ffb8a34]: allocated 12 bytes @ 0x3ffbaf40\n", + "ts": 0.063765475 }, { "core_id": 0, @@ -8367,10 +8519,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 0 }, - "ts": 0.06303945 + "ts": 0.0637789 }, { "core_id": 0, @@ -8378,9 +8530,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.06305685 + "ts": 0.06379215 }, { "core_id": 1, @@ -8388,9 +8540,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.06305685 + "ts": 0.06379215 }, { "core_id": 1, @@ -8400,7 +8552,7 @@ "params": { "irq_num": 31 }, - "ts": 0.063073175 + "ts": 0.063808625 }, { "core_id": 0, @@ -8410,7 +8562,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.063084025 + "ts": 0.063819475 }, { "core_id": 1, @@ -8418,7 +8570,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.063094775 + "ts": 0.0638303 }, { "core_id": 0, @@ -8428,7 +8580,7 @@ "params": { "irq_num": 30 }, - "ts": 0.0631085 + "ts": 0.0638441 }, { "core_id": 1, @@ -8436,9 +8588,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.06311935 + "ts": 0.0638558 }, { "core_id": 0, @@ -8446,7 +8598,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.063130175 + "ts": 0.063867475 }, { "core_id": 1, @@ -8456,18 +8608,20 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 4294967295 }, - "ts": 0.063142025 + "ts": 0.06388035 }, { "core_id": 0, - "ctx_name": "alloc1", - "id": 17, + "ctx_name": "alloc2", + "id": 4, "in_irq": false, - "params": {}, - "ts": 0.0631523 + "params": { + "tid": 12296612 + }, + "ts": 0.06389215 }, { "core_id": 1, @@ -8477,10 +8631,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.063163775 + "ts": 0.06390475 }, { "core_id": 1, @@ -8490,158 +8644,19 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.063180075 + "ts": 0.06392635 }, { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (371) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb778\n", - "ts": 0.063243525 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (371) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb778\n", - "ts": 0.063243525 - }, - { - "addr": "0x3ffbb778", + "addr": "0x3ffbaf50", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0" - ], - "core_id": 1, - "ctx_name": "free1", - "id": 513, - "in_irq": false, - "size": 0, - "ts": 0.063264675 - }, - { - "core_id": 1, - "ctx_name": "FROM_CPU1", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 31 - }, - "ts": 0.063291675 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.0633031 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.063319675 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.0636694 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.06368295 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.063698525 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.0638132 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 6, - "in_irq": true, - "params": { - "tid": 12298716 - }, - "ts": 0.063828325 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 6, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.063828325 - }, - { - "core_id": 0, - "ctx_name": "alloc1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.063840975 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 4, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.06385665 - }, - { - "addr": "0x3ffbb778", - "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -8653,16 +8668,34 @@ "id": 512, "in_irq": false, "size": 9, - "ts": 0.063892175 + "ts": 0.0639378 }, { - "addr": "0x3ffbb788", + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (359) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf40\n", + "ts": 0.0639792 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (359) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf40\n", + "ts": 0.0639792 + }, + { + "addr": "0x3ffbaf60", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -8674,7 +8707,28 @@ "id": 512, "in_irq": false, "size": 18, - "ts": 0.0639307 + "ts": 0.0639913 + }, + { + "addr": "0x3ffbaf40", + "callers": [ + "0x4008da24", + "0x400d3c72", + "0x400880dc", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0" + ], + "core_id": 1, + "ctx_name": "free1", + "id": 513, + "in_irq": false, + "size": 0, + "ts": 0.064005175 }, { "core_id": 0, @@ -8684,74 +8738,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.063947725 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12283904, - "xTicksToWait": 0 - }, - "ts": 0.0639637 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (372) example: Task[0x3ffba9dc]: allocated 18 bytes @ 0x3ffbb788\n", - "ts": 0.06403405 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (372) example: Task[0x3ffba9dc]: allocated 18 bytes @ 0x3ffbb788\n", - "ts": 0.06403405 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12299072, - "xTicksToWait": 0 - }, - "ts": 0.06404765 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 6, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.064060875 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 6, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.064060875 + "ts": 0.0640176 }, { "core_id": 1, @@ -8761,7 +8751,97 @@ "params": { "irq_num": 31 }, - "ts": 0.064077175 + "ts": 0.0640365 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12281672, + "xTicksToWait": 0 + }, + "ts": 0.064047725 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.0640585 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.06407665 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (359) example: Task[0x3ffba1a4]: allocated 18 bytes @ 0x3ffbaf60\n", + "ts": 0.06410445 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (359) example: Task[0x3ffba1a4]: allocated 18 bytes @ 0x3ffbaf60\n", + "ts": 0.06410445 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12296968, + "xTicksToWait": 0 + }, + "ts": 0.06412205 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.0641353 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.0641353 + }, + { + "core_id": 1, + "ctx_name": "FROM_CPU1", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 31 + }, + "ts": 0.06415165 }, { "core_id": 0, @@ -8771,7 +8851,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.064088025 + "ts": 0.0641625 }, { "core_id": 1, @@ -8779,7 +8859,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0640988 + "ts": 0.064173325 }, { "core_id": 0, @@ -8789,7 +8869,7 @@ "params": { "irq_num": 30 }, - "ts": 0.064112775 + "ts": 0.06418725 }, { "core_id": 1, @@ -8797,9 +8877,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.0641236 + "ts": 0.06419815 }, { "core_id": 0, @@ -8807,7 +8887,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.064134475 + "ts": 0.064209025 }, { "core_id": 1, @@ -8817,10 +8897,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 4294967295 }, - "ts": 0.064146325 + "ts": 0.06422095 }, { "core_id": 0, @@ -8828,7 +8908,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.064157625 + "ts": 0.064232175 }, { "core_id": 1, @@ -8838,10 +8918,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.06416925 + "ts": 0.064244 }, { "core_id": 1, @@ -8851,10 +8931,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.0641897 + "ts": 0.064260225 }, { "core_id": 1, @@ -8862,8 +8942,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (372) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb788\n", - "ts": 0.06425325 + "msg": "I (359) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf60\n", + "ts": 0.0643081 }, { "core_id": 1, @@ -8871,15 +8951,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (372) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb788\n", - "ts": 0.06425325 + "msg": "I (359) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf60\n", + "ts": 0.0643081 }, { - "addr": "0x3ffbb788", + "addr": "0x3ffbaf60", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -8893,7 +8973,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.06427445 + "ts": 0.0643295 }, { "core_id": 1, @@ -8903,7 +8983,7 @@ "params": { "irq_num": 31 }, - "ts": 0.06430135 + "ts": 0.06436085 }, { "core_id": 1, @@ -8911,7 +8991,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.064312775 + "ts": 0.0643723 }, { "core_id": 1, @@ -8919,7 +8999,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.06432935 + "ts": 0.064389 }, { "core_id": 1, @@ -8929,7 +9009,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0646694 + "ts": 0.0644259 }, { "core_id": 1, @@ -8937,7 +9017,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.06468295 + "ts": 0.06443945 }, { "core_id": 1, @@ -8945,7 +9025,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.064698525 + "ts": 0.06445515 }, { "core_id": 0, @@ -8955,7 +9035,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0648132 + "ts": 0.0645467 }, { "core_id": 0, @@ -8963,7 +9043,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0648287 + "ts": 0.0645621 }, { "core_id": 0, @@ -8971,7 +9051,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.064843775 + "ts": 0.064577425 }, { "core_id": 1, @@ -8981,7 +9061,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0656694 + "ts": 0.0654259 }, { "core_id": 1, @@ -8989,7 +9069,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.065682925 + "ts": 0.0654394 }, { "core_id": 1, @@ -8997,7 +9077,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.065698325 + "ts": 0.06545455 }, { "core_id": 0, @@ -9007,7 +9087,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0658132 + "ts": 0.0655467 }, { "core_id": 0, @@ -9015,7 +9095,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0658287 + "ts": 0.06556205 }, { "core_id": 0, @@ -9023,7 +9103,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.065843775 + "ts": 0.065577125 }, { "core_id": 1, @@ -9033,7 +9113,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0666694 + "ts": 0.0664259 }, { "core_id": 1, @@ -9041,7 +9121,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.066682975 + "ts": 0.0664394 }, { "core_id": 1, @@ -9049,7 +9129,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0666981 + "ts": 0.066454675 }, { "core_id": 0, @@ -9059,7 +9139,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0668132 + "ts": 0.0665467 }, { "core_id": 0, @@ -9067,7 +9147,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0668287 + "ts": 0.06656205 }, { "core_id": 0, @@ -9075,7 +9155,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.066843775 + "ts": 0.06657715 }, { "core_id": 1, @@ -9085,7 +9165,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0676694 + "ts": 0.0674259 }, { "core_id": 1, @@ -9093,7 +9173,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.067682925 + "ts": 0.06743945 }, { "core_id": 1, @@ -9101,7 +9181,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.067698075 + "ts": 0.0674546 }, { "core_id": 0, @@ -9111,7 +9191,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0678132 + "ts": 0.0675467 }, { "core_id": 0, @@ -9119,7 +9199,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0678286 + "ts": 0.06756205 }, { "core_id": 0, @@ -9127,7 +9207,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.067843825 + "ts": 0.067577125 }, { "core_id": 1, @@ -9137,7 +9217,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0686694 + "ts": 0.0684259 }, { "core_id": 1, @@ -9145,7 +9225,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.068682925 + "ts": 0.0684394 }, { "core_id": 1, @@ -9153,7 +9233,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.068698075 + "ts": 0.06845455 }, { "core_id": 0, @@ -9163,7 +9243,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0688132 + "ts": 0.0685467 }, { "core_id": 0, @@ -9171,7 +9251,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0688287 + "ts": 0.0685621 }, { "core_id": 0, @@ -9179,7 +9259,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.068843775 + "ts": 0.068577425 }, { "core_id": 1, @@ -9189,7 +9269,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0696694 + "ts": 0.0694259 }, { "core_id": 1, @@ -9197,7 +9277,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.069682925 + "ts": 0.0694394 }, { "core_id": 1, @@ -9205,7 +9285,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.069698325 + "ts": 0.06945455 }, { "core_id": 0, @@ -9215,7 +9295,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0698132 + "ts": 0.0695467 }, { "core_id": 0, @@ -9223,7 +9303,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0698287 + "ts": 0.06956205 }, { "core_id": 0, @@ -9231,7 +9311,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0698481 + "ts": 0.069577125 }, { "core_id": 1, @@ -9241,7 +9321,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0706694 + "ts": 0.0704259 }, { "core_id": 1, @@ -9249,7 +9329,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.070682925 + "ts": 0.0704394 }, { "core_id": 1, @@ -9257,7 +9337,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.070698075 + "ts": 0.070454675 }, { "core_id": 0, @@ -9267,7 +9347,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0708132 + "ts": 0.0705467 }, { "core_id": 0, @@ -9275,7 +9355,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0708287 + "ts": 0.07056205 }, { "core_id": 0, @@ -9283,7 +9363,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.070843775 + "ts": 0.07057715 }, { "core_id": 1, @@ -9293,7 +9373,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0716694 + "ts": 0.0714259 }, { "core_id": 1, @@ -9301,7 +9381,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.071682925 + "ts": 0.07143945 }, { "core_id": 1, @@ -9309,7 +9389,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.071698325 + "ts": 0.0714546 }, { "core_id": 0, @@ -9319,7 +9399,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0718132 + "ts": 0.0715467 }, { "core_id": 0, @@ -9327,7 +9407,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0718287 + "ts": 0.07156205 }, { "core_id": 0, @@ -9335,7 +9415,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.071843775 + "ts": 0.071577125 }, { "core_id": 1, @@ -9345,7 +9425,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0726694 + "ts": 0.0724259 }, { "core_id": 1, @@ -9353,7 +9433,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.072682975 + "ts": 0.0724394 }, { "core_id": 1, @@ -9361,7 +9441,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0726981 + "ts": 0.07245455 }, { "core_id": 0, @@ -9371,7 +9451,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0728132 + "ts": 0.0725467 }, { "core_id": 0, @@ -9379,7 +9459,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0728287 + "ts": 0.0725621 }, { "core_id": 0, @@ -9387,7 +9467,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.072843775 + "ts": 0.072577425 }, { "core_id": 1, @@ -9397,7 +9477,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0736694 + "ts": 0.0734259 }, { "core_id": 1, @@ -9405,7 +9485,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.073682925 + "ts": 0.0734394 }, { "core_id": 1, @@ -9413,7 +9493,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.073698075 + "ts": 0.07345455 }, { "core_id": 0, @@ -9423,7 +9503,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0738132 + "ts": 0.0735467 }, { "core_id": 0, @@ -9431,7 +9511,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0738286 + "ts": 0.07356205 }, { "core_id": 0, @@ -9439,7 +9519,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.073843825 + "ts": 0.073577125 }, { "core_id": 1, @@ -9449,7 +9529,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0746694 + "ts": 0.0744259 }, { "core_id": 1, @@ -9457,7 +9537,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.074682925 + "ts": 0.074443775 }, { "core_id": 1, @@ -9465,7 +9545,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.074698075 + "ts": 0.0744589 }, { "core_id": 0, @@ -9475,7 +9555,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0748132 + "ts": 0.0745467 }, { "core_id": 0, @@ -9483,7 +9563,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0748287 + "ts": 0.07456205 }, { "core_id": 0, @@ -9491,7 +9571,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.074843775 + "ts": 0.074577125 }, { "core_id": 1, @@ -9501,7 +9581,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0756694 + "ts": 0.0754259 }, { "core_id": 1, @@ -9509,7 +9589,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.075682925 + "ts": 0.0754394 }, { "core_id": 1, @@ -9517,7 +9597,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.075698325 + "ts": 0.07545455 }, { "core_id": 0, @@ -9527,7 +9607,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0758132 + "ts": 0.0755467 }, { "core_id": 0, @@ -9535,7 +9615,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0758287 + "ts": 0.0755621 }, { "core_id": 0, @@ -9543,7 +9623,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.075843775 + "ts": 0.075577425 }, { "core_id": 1, @@ -9553,7 +9633,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0766694 + "ts": 0.0764259 }, { "core_id": 1, @@ -9561,7 +9641,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.076682975 + "ts": 0.0764394 }, { "core_id": 1, @@ -9569,7 +9649,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0766981 + "ts": 0.07645455 }, { "core_id": 0, @@ -9579,7 +9659,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0768132 + "ts": 0.0765467 }, { "core_id": 0, @@ -9587,7 +9667,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0768287 + "ts": 0.07656205 }, { "core_id": 0, @@ -9595,7 +9675,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.076843775 + "ts": 0.076577125 }, { "core_id": 1, @@ -9605,7 +9685,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0776694 + "ts": 0.0774259 }, { "core_id": 1, @@ -9613,7 +9693,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.077682925 + "ts": 0.0774394 }, { "core_id": 1, @@ -9621,7 +9701,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.077698075 + "ts": 0.077454675 }, { "core_id": 0, @@ -9631,7 +9711,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0778132 + "ts": 0.0775467 }, { "core_id": 0, @@ -9639,7 +9719,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0778286 + "ts": 0.07756205 }, { "core_id": 0, @@ -9647,7 +9727,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.077843825 + "ts": 0.07757715 }, { "core_id": 1, @@ -9657,7 +9737,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0786694 + "ts": 0.0784259 }, { "core_id": 1, @@ -9665,7 +9745,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.078682925 + "ts": 0.07843945 }, { "core_id": 1, @@ -9673,7 +9753,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.078698075 + "ts": 0.0784546 }, { "core_id": 0, @@ -9683,7 +9763,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0788132 + "ts": 0.0785467 }, { "core_id": 0, @@ -9691,7 +9771,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0788287 + "ts": 0.07856205 }, { "core_id": 0, @@ -9699,7 +9779,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.078843775 + "ts": 0.078577125 }, { "core_id": 1, @@ -9709,7 +9789,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0796694 + "ts": 0.0794259 }, { "core_id": 1, @@ -9717,7 +9797,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.079682925 + "ts": 0.0794394 }, { "core_id": 1, @@ -9725,7 +9805,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.079698325 + "ts": 0.07945455 }, { "core_id": 0, @@ -9735,7 +9815,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0798132 + "ts": 0.0795467 }, { "core_id": 0, @@ -9743,7 +9823,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0798287 + "ts": 0.0795621 }, { "core_id": 0, @@ -9751,7 +9831,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.079843775 + "ts": 0.079577425 }, { "core_id": 1, @@ -9761,7 +9841,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0806694 + "ts": 0.0804259 }, { "core_id": 1, @@ -9769,7 +9849,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.080682975 + "ts": 0.0804394 }, { "core_id": 1, @@ -9777,7 +9857,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0806981 + "ts": 0.08045455 }, { "core_id": 0, @@ -9787,7 +9867,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0808132 + "ts": 0.0805467 }, { "core_id": 0, @@ -9795,7 +9875,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0808287 + "ts": 0.08056205 }, { "core_id": 0, @@ -9803,7 +9883,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.080843775 + "ts": 0.080577125 }, { "core_id": 1, @@ -9813,7 +9893,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0816694 + "ts": 0.0814259 }, { "core_id": 1, @@ -9821,7 +9901,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.081682925 + "ts": 0.0814394 }, { "core_id": 1, @@ -9829,7 +9909,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.081698075 + "ts": 0.081454675 }, { "core_id": 0, @@ -9839,7 +9919,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0818132 + "ts": 0.0815467 }, { "core_id": 0, @@ -9847,7 +9927,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0818286 + "ts": 0.08156205 }, { "core_id": 0, @@ -9855,7 +9935,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.081843825 + "ts": 0.08157715 }, { "core_id": 1, @@ -9865,7 +9945,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0826694 + "ts": 0.0824259 }, { "core_id": 1, @@ -9873,7 +9953,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.082682925 + "ts": 0.08243945 }, { "core_id": 1, @@ -9881,7 +9961,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.082698325 + "ts": 0.0824546 }, { "core_id": 0, @@ -9891,7 +9971,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0828132 + "ts": 0.0825467 }, { "core_id": 0, @@ -9899,7 +9979,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0828287 + "ts": 0.08256205 }, { "core_id": 0, @@ -9907,7 +9987,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.082843775 + "ts": 0.082577125 }, { "core_id": 1, @@ -9917,7 +9997,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0836694 + "ts": 0.0834259 }, { "core_id": 1, @@ -9925,7 +10005,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.083682975 + "ts": 0.0834394 }, { "core_id": 1, @@ -9933,7 +10013,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0836981 + "ts": 0.08345455 }, { "core_id": 0, @@ -9943,7 +10023,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0838132 + "ts": 0.0835467 }, { "core_id": 0, @@ -9951,7 +10031,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0838287 + "ts": 0.0835621 }, { "core_id": 0, @@ -9959,7 +10039,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.083843775 + "ts": 0.083577425 }, { "core_id": 1, @@ -9969,7 +10049,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0846694 + "ts": 0.0844259 }, { "core_id": 1, @@ -9977,7 +10057,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.084682925 + "ts": 0.0844394 }, { "core_id": 1, @@ -9985,7 +10065,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.084698075 + "ts": 0.08445455 }, { "core_id": 0, @@ -9995,7 +10075,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0848132 + "ts": 0.0845467 }, { "core_id": 0, @@ -10003,7 +10083,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0848286 + "ts": 0.08456205 }, { "core_id": 0, @@ -10011,7 +10091,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.084843825 + "ts": 0.084577125 }, { "core_id": 1, @@ -10021,7 +10101,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0856694 + "ts": 0.0854259 }, { "core_id": 1, @@ -10029,7 +10109,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.085682925 + "ts": 0.0854394 }, { "core_id": 1, @@ -10037,7 +10117,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.085698075 + "ts": 0.085454675 }, { "core_id": 0, @@ -10047,7 +10127,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0858132 + "ts": 0.0855467 }, { "core_id": 0, @@ -10055,7 +10135,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0858287 + "ts": 0.08556205 }, { "core_id": 0, @@ -10063,7 +10143,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.085843775 + "ts": 0.08557715 }, { "core_id": 1, @@ -10073,7 +10153,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0866694 + "ts": 0.0864259 }, { "core_id": 1, @@ -10081,7 +10161,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.086682925 + "ts": 0.086443675 }, { "core_id": 1, @@ -10089,7 +10169,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.086698325 + "ts": 0.086458825 }, { "core_id": 0, @@ -10099,7 +10179,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0868132 + "ts": 0.0865467 }, { "core_id": 0, @@ -10107,7 +10187,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0868287 + "ts": 0.08656205 }, { "core_id": 0, @@ -10115,7 +10195,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.086843775 + "ts": 0.086577125 }, { "core_id": 1, @@ -10125,7 +10205,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0876694 + "ts": 0.0874259 }, { "core_id": 1, @@ -10133,7 +10213,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.087682975 + "ts": 0.0874394 }, { "core_id": 1, @@ -10141,7 +10221,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0876981 + "ts": 0.08745455 }, { "core_id": 0, @@ -10151,7 +10231,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0878132 + "ts": 0.0875467 }, { "core_id": 0, @@ -10159,7 +10239,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0878287 + "ts": 0.0875621 }, { "core_id": 0, @@ -10167,7 +10247,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.087843775 + "ts": 0.087577425 }, { "core_id": 1, @@ -10177,7 +10257,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0886694 + "ts": 0.0884259 }, { "core_id": 1, @@ -10185,7 +10265,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.088682925 + "ts": 0.0884394 }, { "core_id": 1, @@ -10193,7 +10273,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.088698075 + "ts": 0.08845455 }, { "core_id": 0, @@ -10203,7 +10283,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0888132 + "ts": 0.0885467 }, { "core_id": 0, @@ -10211,7 +10291,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0888286 + "ts": 0.08856205 }, { "core_id": 0, @@ -10219,7 +10299,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.088843825 + "ts": 0.088577125 }, { "core_id": 1, @@ -10229,7 +10309,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0896694 + "ts": 0.0894259 }, { "core_id": 1, @@ -10237,7 +10317,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.089682925 + "ts": 0.0894394 }, { "core_id": 1, @@ -10245,7 +10325,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.089698075 + "ts": 0.089454675 }, { "core_id": 0, @@ -10255,7 +10335,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0898132 + "ts": 0.0895467 }, { "core_id": 0, @@ -10263,7 +10343,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0898287 + "ts": 0.08956205 }, { "core_id": 0, @@ -10271,7 +10351,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.089843775 + "ts": 0.08957715 }, { "core_id": 1, @@ -10281,7 +10361,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0906694 + "ts": 0.0904259 }, { "core_id": 1, @@ -10289,7 +10369,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.090682925 + "ts": 0.09043945 }, { "core_id": 1, @@ -10297,7 +10377,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.090698325 + "ts": 0.0904546 }, { "core_id": 0, @@ -10307,7 +10387,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0908132 + "ts": 0.0905467 }, { "core_id": 0, @@ -10315,7 +10395,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0908287 + "ts": 0.09056205 }, { "core_id": 0, @@ -10323,7 +10403,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.090843775 + "ts": 0.090577125 }, { "core_id": 1, @@ -10333,7 +10413,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0916694 + "ts": 0.0914259 }, { "core_id": 1, @@ -10341,7 +10421,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.091682975 + "ts": 0.0914394 }, { "core_id": 1, @@ -10349,7 +10429,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0916981 + "ts": 0.09145455 }, { "core_id": 0, @@ -10359,7 +10439,59 @@ "params": { "irq_num": 5 }, - "ts": 0.0918132 + "ts": 0.0915467 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.0915621 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.091577425 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.0924259 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.0924394 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.09245455 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.0925467 }, { "core_id": 0, @@ -10367,9 +10499,9 @@ "id": 6, "in_irq": true, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.091828325 + "ts": 0.09256165 }, { "core_id": 1, @@ -10377,9 +10509,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.091828325 + "ts": 0.09256165 }, { "core_id": 0, @@ -10387,7 +10519,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.091840975 + "ts": 0.0925743 }, { "core_id": 0, @@ -10395,18 +10527,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.09185665 + "ts": 0.092590225 }, { - "addr": "0x3ffbb788", + "addr": "0x3ffbaf40", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -10418,16 +10550,16 @@ "id": 512, "in_irq": false, "size": 4, - "ts": 0.091892175 + "ts": 0.0926253 }, { - "addr": "0x3ffbb798", + "addr": "0x3ffbaf60", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -10439,7 +10571,7 @@ "id": 512, "in_irq": false, "size": 8, - "ts": 0.09193 + "ts": 0.092660875 }, { "core_id": 0, @@ -10449,10 +10581,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.0919469 + "ts": 0.09267785 }, { "core_id": 0, @@ -10462,10 +10594,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.091962875 + "ts": 0.092693825 }, { "core_id": 0, @@ -10473,8 +10605,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (400) example: Task[0x3ffb7aec]: allocated 8 bytes @ 0x3ffbb798\n", - "ts": 0.09202705 + "msg": "I (388) example: Task[0x3ffb72b4]: allocated 8 bytes @ 0x3ffbaf60\n", + "ts": 0.0927506 }, { "core_id": 0, @@ -10482,8 +10614,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (400) example: Task[0x3ffb7aec]: allocated 8 bytes @ 0x3ffbb798\n", - "ts": 0.09202705 + "msg": "I (388) example: Task[0x3ffb72b4]: allocated 8 bytes @ 0x3ffbaf60\n", + "ts": 0.0927506 }, { "core_id": 0, @@ -10493,10 +10625,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 0 }, - "ts": 0.092040625 + "ts": 0.09276405 }, { "core_id": 0, @@ -10504,9 +10636,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.09205375 + "ts": 0.092777275 }, { "core_id": 1, @@ -10514,9 +10646,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.09205375 + "ts": 0.092777275 }, { "core_id": 1, @@ -10526,7 +10658,7 @@ "params": { "irq_num": 31 }, - "ts": 0.09206995 + "ts": 0.092793525 }, { "core_id": 0, @@ -10536,7 +10668,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.092080825 + "ts": 0.092804475 }, { "core_id": 1, @@ -10544,7 +10676,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0920916 + "ts": 0.092815225 }, { "core_id": 0, @@ -10554,7 +10686,7 @@ "params": { "irq_num": 30 }, - "ts": 0.0921055 + "ts": 0.092828975 }, { "core_id": 1, @@ -10562,9 +10694,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.0921163 + "ts": 0.0928397 }, { "core_id": 0, @@ -10572,7 +10704,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.09212715 + "ts": 0.0928505 }, { "core_id": 1, @@ -10582,10 +10714,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 4294967295 }, - "ts": 0.09213905 + "ts": 0.0928625 }, { "core_id": 0, @@ -10593,7 +10725,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.092149275 + "ts": 0.092872725 }, { "core_id": 1, @@ -10603,10 +10735,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.092160725 + "ts": 0.092884475 }, { "core_id": 1, @@ -10616,10 +10748,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.092181 + "ts": 0.09290075 }, { "core_id": 1, @@ -10627,8 +10759,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (400) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb798\n", - "ts": 0.09224455 + "msg": "I (388) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf60\n", + "ts": 0.092948525 }, { "core_id": 1, @@ -10636,15 +10768,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (400) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb798\n", - "ts": 0.09224455 + "msg": "I (388) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf60\n", + "ts": 0.092948525 }, { - "addr": "0x3ffbb798", + "addr": "0x3ffbaf60", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -10658,7 +10790,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.09226575 + "ts": 0.0929699 }, { "core_id": 1, @@ -10668,7 +10800,7 @@ "params": { "irq_num": 31 }, - "ts": 0.092292625 + "ts": 0.09300135 }, { "core_id": 1, @@ -10676,7 +10808,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.09230405 + "ts": 0.0930128 }, { "core_id": 1, @@ -10684,7 +10816,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.092320625 + "ts": 0.0930295 }, { "core_id": 1, @@ -10694,7 +10826,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0926694 + "ts": 0.0934259 }, { "core_id": 1, @@ -10702,7 +10834,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.09268295 + "ts": 0.09343945 }, { "core_id": 1, @@ -10710,7 +10842,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.092698525 + "ts": 0.09345515 }, { "core_id": 0, @@ -10720,7 +10852,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0928132 + "ts": 0.0935467 }, { "core_id": 0, @@ -10728,9 +10860,9 @@ "id": 6, "in_irq": true, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.092828325 + "ts": 0.0935617 }, { "core_id": 1, @@ -10738,9 +10870,29 @@ "id": 6, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.092828325 + "ts": 0.0935617 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 6, + "in_irq": true, + "params": { + "tid": 12296612 + }, + "ts": 0.09357355 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.09357355 }, { "core_id": 0, @@ -10748,7 +10900,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.092840975 + "ts": 0.09358605 }, { "core_id": 0, @@ -10756,18 +10908,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.092856775 + "ts": 0.093601725 }, { - "addr": "0x3ffbb798", + "addr": "0x3ffbaf60", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -10779,16 +10931,16 @@ "id": 512, "in_irq": false, "size": 8, - "ts": 0.092892175 + "ts": 0.09363815 }, { - "addr": "0x3ffbb7a8", + "addr": "0x3ffbaf70", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -10800,7 +10952,7 @@ "id": 512, "in_irq": false, "size": 16, - "ts": 0.0929267 + "ts": 0.093673575 }, { "core_id": 0, @@ -10810,10 +10962,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.09294365 + "ts": 0.093690525 }, { "core_id": 0, @@ -10823,10 +10975,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.092963825 + "ts": 0.093706525 }, { "core_id": 0, @@ -10834,8 +10986,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (401) example: Task[0x3ffb926c]: allocated 16 bytes @ 0x3ffbb7a8\n", - "ts": 0.0930303 + "msg": "I (389) example: Task[0x3ffb8a34]: allocated 16 bytes @ 0x3ffbaf70\n", + "ts": 0.093761375 }, { "core_id": 0, @@ -10843,8 +10995,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (401) example: Task[0x3ffb926c]: allocated 16 bytes @ 0x3ffbb7a8\n", - "ts": 0.0930303 + "msg": "I (389) example: Task[0x3ffb8a34]: allocated 16 bytes @ 0x3ffbaf70\n", + "ts": 0.093761375 }, { "core_id": 0, @@ -10854,10 +11006,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 0 }, - "ts": 0.09304395 + "ts": 0.093778675 }, { "core_id": 0, @@ -10865,9 +11017,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.093057125 + "ts": 0.093791925 }, { "core_id": 1, @@ -10875,9 +11027,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.093057125 + "ts": 0.093791925 }, { "core_id": 1, @@ -10887,7 +11039,7 @@ "params": { "irq_num": 31 }, - "ts": 0.09307345 + "ts": 0.093808275 }, { "core_id": 0, @@ -10897,7 +11049,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.0930843 + "ts": 0.093819125 }, { "core_id": 1, @@ -10905,7 +11057,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.09309505 + "ts": 0.09382995 }, { "core_id": 0, @@ -10915,7 +11067,7 @@ "params": { "irq_num": 30 }, - "ts": 0.093108775 + "ts": 0.09384375 }, { "core_id": 1, @@ -10923,9 +11075,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.093119625 + "ts": 0.093855475 }, { "core_id": 0, @@ -10933,7 +11085,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.09313045 + "ts": 0.09386685 }, { "core_id": 1, @@ -10943,18 +11095,20 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 4294967295 }, - "ts": 0.0931423 + "ts": 0.09387885 }, { "core_id": 0, - "ctx_name": "alloc1", - "id": 17, + "ctx_name": "alloc2", + "id": 4, "in_irq": false, - "params": {}, - "ts": 0.093152575 + "params": { + "tid": 12296612 + }, + "ts": 0.093890525 }, { "core_id": 1, @@ -10964,10 +11118,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.09316405 + "ts": 0.093903125 }, { "core_id": 1, @@ -10977,158 +11131,19 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.09318035 + "ts": 0.09392175 }, { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (401) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb7a8\n", - "ts": 0.0932438 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (401) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb7a8\n", - "ts": 0.0932438 - }, - { - "addr": "0x3ffbb7a8", + "addr": "0x3ffbaf84", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0" - ], - "core_id": 1, - "ctx_name": "free1", - "id": 513, - "in_irq": false, - "size": 0, - "ts": 0.093268825 - }, - { - "core_id": 1, - "ctx_name": "FROM_CPU1", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 31 - }, - "ts": 0.093295825 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.093307375 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.09332395 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.0936694 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.09368295 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.093698525 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.0938132 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 6, - "in_irq": true, - "params": { - "tid": 12298716 - }, - "ts": 0.093828325 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 6, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.093828325 - }, - { - "core_id": 0, - "ctx_name": "alloc1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.093840975 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 4, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.09385665 - }, - { - "addr": "0x3ffbb7a8", - "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -11140,16 +11155,34 @@ "id": 512, "in_irq": false, "size": 12, - "ts": 0.093892 + "ts": 0.09393375 }, { - "addr": "0x3ffbb7b8", + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (389) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf70\n", + "ts": 0.0939748 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (389) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf70\n", + "ts": 0.0939748 + }, + { + "addr": "0x3ffbaf94", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -11161,7 +11194,28 @@ "id": 512, "in_irq": false, "size": 24, - "ts": 0.0939264 + "ts": 0.09399075 + }, + { + "addr": "0x3ffbaf70", + "callers": [ + "0x4008da24", + "0x400d3c72", + "0x400880dc", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0" + ], + "core_id": 1, + "ctx_name": "free1", + "id": 513, + "in_irq": false, + "size": 0, + "ts": 0.094005125 }, { "core_id": 0, @@ -11171,74 +11225,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.0939433 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12283904, - "xTicksToWait": 0 - }, - "ts": 0.093959425 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (402) example: Task[0x3ffba9dc]: allocated 24 bytes @ 0x3ffbb7b8\n", - "ts": 0.09402975 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (402) example: Task[0x3ffba9dc]: allocated 24 bytes @ 0x3ffbb7b8\n", - "ts": 0.09402975 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12299072, - "xTicksToWait": 0 - }, - "ts": 0.094047575 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 6, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.0940608 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 6, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.0940608 + "ts": 0.094017575 }, { "core_id": 1, @@ -11248,7 +11238,97 @@ "params": { "irq_num": 31 }, - "ts": 0.094077125 + "ts": 0.094036725 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12281672, + "xTicksToWait": 0 + }, + "ts": 0.094047975 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.094058825 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.0940771 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (389) example: Task[0x3ffba1a4]: allocated 24 bytes @ 0x3ffbaf94\n", + "ts": 0.09410495 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (389) example: Task[0x3ffba1a4]: allocated 24 bytes @ 0x3ffbaf94\n", + "ts": 0.09410495 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12296968, + "xTicksToWait": 0 + }, + "ts": 0.094118375 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.094135775 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.094135775 + }, + { + "core_id": 1, + "ctx_name": "FROM_CPU1", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 31 + }, + "ts": 0.094152125 }, { "core_id": 0, @@ -11258,7 +11338,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.094087975 + "ts": 0.094162975 }, { "core_id": 1, @@ -11266,7 +11346,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.094098725 + "ts": 0.0941738 }, { "core_id": 0, @@ -11276,7 +11356,7 @@ "params": { "irq_num": 30 }, - "ts": 0.09411245 + "ts": 0.0941876 }, { "core_id": 1, @@ -11284,9 +11364,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.09412335 + "ts": 0.09419835 }, { "core_id": 0, @@ -11294,7 +11374,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.094134175 + "ts": 0.09420915 }, { "core_id": 1, @@ -11304,10 +11384,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 4294967295 }, - "ts": 0.094146025 + "ts": 0.0942211 }, { "core_id": 0, @@ -11315,7 +11395,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.094157325 + "ts": 0.094232325 }, { "core_id": 1, @@ -11325,10 +11405,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.09416895 + "ts": 0.09424415 }, { "core_id": 1, @@ -11338,10 +11418,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.09418535 + "ts": 0.0942604 }, { "core_id": 1, @@ -11349,8 +11429,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (402) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb7b8\n", - "ts": 0.0942489 + "msg": "I (389) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf94\n", + "ts": 0.094308175 }, { "core_id": 1, @@ -11358,15 +11438,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (402) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb7b8\n", - "ts": 0.0942489 + "msg": "I (389) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf94\n", + "ts": 0.094308175 }, { - "addr": "0x3ffbb7b8", + "addr": "0x3ffbaf94", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -11380,7 +11460,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.0942701 + "ts": 0.09432955 }, { "core_id": 1, @@ -11390,7 +11470,7 @@ "params": { "irq_num": 31 }, - "ts": 0.0943011 + "ts": 0.094356975 }, { "core_id": 1, @@ -11398,7 +11478,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.094312575 + "ts": 0.094368375 }, { "core_id": 1, @@ -11406,7 +11486,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.094329275 + "ts": 0.09438495 }, { "core_id": 1, @@ -11416,7 +11496,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0946694 + "ts": 0.0944259 }, { "core_id": 1, @@ -11424,7 +11504,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.09468285 + "ts": 0.09443945 }, { "core_id": 1, @@ -11432,7 +11512,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.094698425 + "ts": 0.09445515 }, { "core_id": 0, @@ -11442,7 +11522,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0948132 + "ts": 0.0945467 }, { "core_id": 0, @@ -11450,7 +11530,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0948286 + "ts": 0.09456205 }, { "core_id": 0, @@ -11458,7 +11538,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.094843825 + "ts": 0.094577125 }, { "core_id": 1, @@ -11468,7 +11548,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0956694 + "ts": 0.0954259 }, { "core_id": 1, @@ -11476,7 +11556,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.095682925 + "ts": 0.0954394 }, { "core_id": 1, @@ -11484,7 +11564,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.095698075 + "ts": 0.09545455 }, { "core_id": 0, @@ -11494,7 +11574,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0958132 + "ts": 0.0955467 }, { "core_id": 0, @@ -11502,7 +11582,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0958287 + "ts": 0.0955621 }, { "core_id": 0, @@ -11510,7 +11590,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.095843775 + "ts": 0.095577425 }, { "core_id": 1, @@ -11520,7 +11600,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0966694 + "ts": 0.0964259 }, { "core_id": 1, @@ -11528,7 +11608,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.096682925 + "ts": 0.0964394 }, { "core_id": 1, @@ -11536,7 +11616,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.096698325 + "ts": 0.09645455 }, { "core_id": 0, @@ -11546,7 +11626,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0968132 + "ts": 0.0965467 }, { "core_id": 0, @@ -11554,7 +11634,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0968287 + "ts": 0.09656635 }, { "core_id": 0, @@ -11562,7 +11642,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.096843775 + "ts": 0.09658155 }, { "core_id": 1, @@ -11572,7 +11652,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0976694 + "ts": 0.0974259 }, { "core_id": 1, @@ -11580,7 +11660,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.097682975 + "ts": 0.0974394 }, { "core_id": 1, @@ -11588,7 +11668,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0976981 + "ts": 0.09745455 }, { "core_id": 0, @@ -11598,7 +11678,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0978132 + "ts": 0.0975467 }, { "core_id": 0, @@ -11606,7 +11686,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0978287 + "ts": 0.09756205 }, { "core_id": 0, @@ -11614,7 +11694,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.097843775 + "ts": 0.097577125 }, { "core_id": 1, @@ -11624,7 +11704,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0986694 + "ts": 0.0984259 }, { "core_id": 1, @@ -11632,7 +11712,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.098682925 + "ts": 0.0984394 }, { "core_id": 1, @@ -11640,7 +11720,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.098698075 + "ts": 0.098454675 }, { "core_id": 0, @@ -11650,7 +11730,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0988132 + "ts": 0.0985467 }, { "core_id": 0, @@ -11658,7 +11738,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0988286 + "ts": 0.09856205 }, { "core_id": 0, @@ -11666,7 +11746,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.098843825 + "ts": 0.09857715 }, { "core_id": 1, @@ -11676,7 +11756,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0996694 + "ts": 0.0994259 }, { "core_id": 1, @@ -11684,7 +11764,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.099682925 + "ts": 0.09943945 }, { "core_id": 1, @@ -11692,7 +11772,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.099698075 + "ts": 0.0994546 }, { "core_id": 0, @@ -11702,7 +11782,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0998132 + "ts": 0.0995467 }, { "core_id": 0, @@ -11710,7 +11790,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0998287 + "ts": 0.09956205 }, { "core_id": 0, @@ -11718,7 +11798,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.099843775 + "ts": 0.099577125 }, { "core_id": 1, @@ -11728,7 +11808,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1006694 + "ts": 0.1004259 }, { "core_id": 1, @@ -11736,7 +11816,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.100682925 + "ts": 0.1004394 }, { "core_id": 1, @@ -11744,7 +11824,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.100698325 + "ts": 0.10045455 }, { "core_id": 0, @@ -11754,7 +11834,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1008132 + "ts": 0.1005467 }, { "core_id": 0, @@ -11762,7 +11842,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1008287 + "ts": 0.1005621 }, { "core_id": 0, @@ -11770,7 +11850,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.100843775 + "ts": 0.100577425 }, { "core_id": 1, @@ -11780,7 +11860,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1016694 + "ts": 0.1014259 }, { "core_id": 1, @@ -11788,7 +11868,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.101682975 + "ts": 0.1014394 }, { "core_id": 1, @@ -11796,7 +11876,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1016981 + "ts": 0.10145455 }, { "core_id": 0, @@ -11806,7 +11886,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1018132 + "ts": 0.1015467 }, { "core_id": 0, @@ -11814,7 +11894,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1018287 + "ts": 0.10156205 }, { "core_id": 0, @@ -11822,7 +11902,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.101843775 + "ts": 0.101577125 }, { "core_id": 1, @@ -11832,7 +11912,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1026694 + "ts": 0.1024259 }, { "core_id": 1, @@ -11840,7 +11920,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.102682925 + "ts": 0.1024394 }, { "core_id": 1, @@ -11848,7 +11928,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.102698075 + "ts": 0.102454675 }, { "core_id": 0, @@ -11858,7 +11938,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1028132 + "ts": 0.1025467 }, { "core_id": 0, @@ -11866,7 +11946,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1028286 + "ts": 0.10256205 }, { "core_id": 0, @@ -11874,7 +11954,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.102843825 + "ts": 0.10257715 }, { "core_id": 1, @@ -11884,7 +11964,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1036694 + "ts": 0.1034259 }, { "core_id": 1, @@ -11892,7 +11972,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.103682925 + "ts": 0.10343945 }, { "core_id": 1, @@ -11900,7 +11980,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.103698075 + "ts": 0.1034546 }, { "core_id": 0, @@ -11910,7 +11990,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1038132 + "ts": 0.1035467 }, { "core_id": 0, @@ -11918,7 +11998,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1038287 + "ts": 0.10356205 }, { "core_id": 0, @@ -11926,7 +12006,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.103843775 + "ts": 0.103577125 }, { "core_id": 1, @@ -11936,7 +12016,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1046694 + "ts": 0.1044259 }, { "core_id": 1, @@ -11944,7 +12024,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.10468655 + "ts": 0.1044394 }, { "core_id": 1, @@ -11952,7 +12032,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.104701825 + "ts": 0.10445455 }, { "core_id": 0, @@ -11962,7 +12042,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1048132 + "ts": 0.1045467 }, { "core_id": 0, @@ -11970,7 +12050,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1048287 + "ts": 0.1045621 }, { "core_id": 0, @@ -11978,7 +12058,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.104843775 + "ts": 0.104577425 }, { "core_id": 1, @@ -11988,7 +12068,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1056694 + "ts": 0.1054259 }, { "core_id": 1, @@ -11996,7 +12076,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.105682925 + "ts": 0.1054394 }, { "core_id": 1, @@ -12004,7 +12084,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.105698075 + "ts": 0.10545455 }, { "core_id": 0, @@ -12014,7 +12094,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1058132 + "ts": 0.1055467 }, { "core_id": 0, @@ -12022,7 +12102,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1058286 + "ts": 0.10556205 }, { "core_id": 0, @@ -12030,7 +12110,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.105843825 + "ts": 0.105577125 }, { "core_id": 1, @@ -12040,7 +12120,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1066694 + "ts": 0.1064259 }, { "core_id": 1, @@ -12048,7 +12128,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.106682925 + "ts": 0.1064394 }, { "core_id": 1, @@ -12056,7 +12136,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.106698075 + "ts": 0.106454675 }, { "core_id": 0, @@ -12066,7 +12146,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1068132 + "ts": 0.1065467 }, { "core_id": 0, @@ -12074,7 +12154,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1068287 + "ts": 0.10656205 }, { "core_id": 0, @@ -12082,7 +12162,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.106843775 + "ts": 0.10657715 }, { "core_id": 1, @@ -12092,7 +12172,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1076694 + "ts": 0.1074259 }, { "core_id": 1, @@ -12100,7 +12180,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.107682925 + "ts": 0.10743945 }, { "core_id": 1, @@ -12108,7 +12188,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.107698325 + "ts": 0.1074546 }, { "core_id": 0, @@ -12118,7 +12198,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1078132 + "ts": 0.1075467 }, { "core_id": 0, @@ -12126,7 +12206,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1078287 + "ts": 0.10756205 }, { "core_id": 0, @@ -12134,7 +12214,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.107843775 + "ts": 0.107577125 }, { "core_id": 1, @@ -12144,7 +12224,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1086694 + "ts": 0.1084259 }, { "core_id": 1, @@ -12152,7 +12232,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.108682975 + "ts": 0.1084394 }, { "core_id": 1, @@ -12160,7 +12240,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1086981 + "ts": 0.10845455 }, { "core_id": 0, @@ -12170,7 +12250,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1088132 + "ts": 0.1085467 }, { "core_id": 0, @@ -12178,7 +12258,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1088287 + "ts": 0.108566325 }, { "core_id": 0, @@ -12186,7 +12266,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.108843775 + "ts": 0.10858155 }, { "core_id": 1, @@ -12196,7 +12276,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1096694 + "ts": 0.1094259 }, { "core_id": 1, @@ -12204,7 +12284,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.109682925 + "ts": 0.1094394 }, { "core_id": 1, @@ -12212,7 +12292,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.109698075 + "ts": 0.10945455 }, { "core_id": 0, @@ -12222,7 +12302,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1098132 + "ts": 0.1095467 }, { "core_id": 0, @@ -12230,7 +12310,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1098286 + "ts": 0.10956205 }, { "core_id": 0, @@ -12238,7 +12318,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.109843825 + "ts": 0.109577125 }, { "core_id": 1, @@ -12248,7 +12328,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1106694 + "ts": 0.1104259 }, { "core_id": 1, @@ -12256,7 +12336,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.110682925 + "ts": 0.1104394 }, { "core_id": 1, @@ -12264,7 +12344,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.110698075 + "ts": 0.110454675 }, { "core_id": 0, @@ -12274,7 +12354,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1108132 + "ts": 0.1105467 }, { "core_id": 0, @@ -12282,7 +12362,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1108287 + "ts": 0.11056205 }, { "core_id": 0, @@ -12290,7 +12370,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.110843775 + "ts": 0.11057715 }, { "core_id": 1, @@ -12300,7 +12380,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1116694 + "ts": 0.1114259 }, { "core_id": 1, @@ -12308,7 +12388,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.111682925 + "ts": 0.11143945 }, { "core_id": 1, @@ -12316,7 +12396,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.111698325 + "ts": 0.1114546 }, { "core_id": 0, @@ -12326,7 +12406,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1118132 + "ts": 0.1115467 }, { "core_id": 0, @@ -12334,7 +12414,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1118287 + "ts": 0.11156205 }, { "core_id": 0, @@ -12342,7 +12422,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.111843775 + "ts": 0.111577125 }, { "core_id": 1, @@ -12352,7 +12432,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1126694 + "ts": 0.1124259 }, { "core_id": 1, @@ -12360,7 +12440,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.112682975 + "ts": 0.1124394 }, { "core_id": 1, @@ -12368,7 +12448,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1126981 + "ts": 0.11245455 }, { "core_id": 0, @@ -12378,7 +12458,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1128132 + "ts": 0.1125467 }, { "core_id": 0, @@ -12386,7 +12466,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1128287 + "ts": 0.1125621 }, { "core_id": 0, @@ -12394,7 +12474,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.112843775 + "ts": 0.112577425 }, { "core_id": 1, @@ -12404,7 +12484,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1136694 + "ts": 0.1134259 }, { "core_id": 1, @@ -12412,7 +12492,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.113682925 + "ts": 0.1134394 }, { "core_id": 1, @@ -12420,7 +12500,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.113698075 + "ts": 0.11345455 }, { "core_id": 0, @@ -12430,7 +12510,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1138132 + "ts": 0.1135467 }, { "core_id": 0, @@ -12438,7 +12518,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1138286 + "ts": 0.11356205 }, { "core_id": 0, @@ -12446,7 +12526,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.113843825 + "ts": 0.113577125 }, { "core_id": 1, @@ -12456,7 +12536,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1146694 + "ts": 0.1144259 }, { "core_id": 1, @@ -12464,7 +12544,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.114682925 + "ts": 0.1144394 }, { "core_id": 1, @@ -12472,7 +12552,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.114698075 + "ts": 0.114454675 }, { "core_id": 0, @@ -12482,7 +12562,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1148132 + "ts": 0.1145467 }, { "core_id": 0, @@ -12490,7 +12570,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1148287 + "ts": 0.11456205 }, { "core_id": 0, @@ -12498,7 +12578,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.114843775 + "ts": 0.11457715 }, { "core_id": 1, @@ -12508,7 +12588,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1156694 + "ts": 0.1154259 }, { "core_id": 1, @@ -12516,7 +12596,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.115682925 + "ts": 0.11543945 }, { "core_id": 1, @@ -12524,7 +12604,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.115698325 + "ts": 0.1154546 }, { "core_id": 0, @@ -12534,7 +12614,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1158132 + "ts": 0.1155467 }, { "core_id": 0, @@ -12542,7 +12622,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1158287 + "ts": 0.11556205 }, { "core_id": 0, @@ -12550,7 +12630,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.115843775 + "ts": 0.115577125 }, { "core_id": 1, @@ -12560,7 +12640,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1166694 + "ts": 0.1164259 }, { "core_id": 1, @@ -12568,7 +12648,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1166872 + "ts": 0.1164394 }, { "core_id": 1, @@ -12576,7 +12656,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.11670235 + "ts": 0.11645455 }, { "core_id": 0, @@ -12586,7 +12666,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1168132 + "ts": 0.1165467 }, { "core_id": 0, @@ -12594,7 +12674,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1168287 + "ts": 0.1165621 }, { "core_id": 0, @@ -12602,7 +12682,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.116843775 + "ts": 0.116577425 }, { "core_id": 1, @@ -12612,7 +12692,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1176694 + "ts": 0.1174259 }, { "core_id": 1, @@ -12620,7 +12700,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.117682925 + "ts": 0.1174394 }, { "core_id": 1, @@ -12628,7 +12708,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.117698075 + "ts": 0.11745455 }, { "core_id": 0, @@ -12638,7 +12718,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1178132 + "ts": 0.1175467 }, { "core_id": 0, @@ -12646,7 +12726,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1178286 + "ts": 0.11756205 }, { "core_id": 0, @@ -12654,7 +12734,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.117843825 + "ts": 0.117577125 }, { "core_id": 1, @@ -12664,7 +12744,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1186694 + "ts": 0.1184259 }, { "core_id": 1, @@ -12672,7 +12752,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.118682925 + "ts": 0.1184394 }, { "core_id": 1, @@ -12680,7 +12760,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.118698075 + "ts": 0.118454675 }, { "core_id": 0, @@ -12690,7 +12770,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1188132 + "ts": 0.1185467 }, { "core_id": 0, @@ -12698,7 +12778,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1188287 + "ts": 0.11856205 }, { "core_id": 0, @@ -12706,7 +12786,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.118843775 + "ts": 0.11857715 }, { "core_id": 1, @@ -12716,7 +12796,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1196694 + "ts": 0.1194259 }, { "core_id": 1, @@ -12724,7 +12804,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.119682925 + "ts": 0.11943945 }, { "core_id": 1, @@ -12732,7 +12812,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.119698325 + "ts": 0.1194546 }, { "core_id": 0, @@ -12742,7 +12822,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1198132 + "ts": 0.1195467 }, { "core_id": 0, @@ -12750,7 +12830,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1198287 + "ts": 0.11956205 }, { "core_id": 0, @@ -12758,7 +12838,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.119843775 + "ts": 0.119577125 }, { "core_id": 1, @@ -12768,7 +12848,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1206694 + "ts": 0.1204259 }, { "core_id": 1, @@ -12776,7 +12856,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.120682975 + "ts": 0.1204394 }, { "core_id": 1, @@ -12784,7 +12864,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1206981 + "ts": 0.12045455 }, { "core_id": 0, @@ -12794,7 +12874,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1208132 + "ts": 0.1205467 }, { "core_id": 0, @@ -12802,7 +12882,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1208287 + "ts": 0.120566325 }, { "core_id": 0, @@ -12810,7 +12890,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.120843775 + "ts": 0.12058155 }, { "core_id": 1, @@ -12820,7 +12900,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1216694 + "ts": 0.1214259 }, { "core_id": 1, @@ -12828,7 +12908,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.121682925 + "ts": 0.1214394 }, { "core_id": 1, @@ -12836,7 +12916,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.121698075 + "ts": 0.12145455 }, { "core_id": 0, @@ -12846,7 +12926,59 @@ "params": { "irq_num": 5 }, - "ts": 0.1218132 + "ts": 0.1215467 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.12156205 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.121577125 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.1224259 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.1224394 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.122454675 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.1225467 }, { "core_id": 0, @@ -12854,9 +12986,9 @@ "id": 6, "in_irq": true, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.121828225 + "ts": 0.122561675 }, { "core_id": 1, @@ -12864,9 +12996,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.121828225 + "ts": 0.122561675 }, { "core_id": 0, @@ -12874,7 +13006,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.12184085 + "ts": 0.12257425 }, { "core_id": 0, @@ -12882,18 +13014,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.121856525 + "ts": 0.122589925 }, { - "addr": "0x3ffbb7b8", + "addr": "0x3ffbaf70", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -12905,16 +13037,16 @@ "id": 512, "in_irq": false, "size": 5, - "ts": 0.12189185 + "ts": 0.122624925 }, { - "addr": "0x3ffbb7c8", + "addr": "0x3ffbaf94", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -12926,7 +13058,7 @@ "id": 512, "in_irq": false, "size": 10, - "ts": 0.121926275 + "ts": 0.122660425 }, { "core_id": 0, @@ -12936,10 +13068,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.1219433 + "ts": 0.12267735 }, { "core_id": 0, @@ -12949,10 +13081,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.121959425 + "ts": 0.122693275 }, { "core_id": 0, @@ -12960,8 +13092,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (430) example: Task[0x3ffb7aec]: allocated 10 bytes @ 0x3ffbb7c8\n", - "ts": 0.12202985 + "msg": "I (418) example: Task[0x3ffb72b4]: allocated 10 bytes @ 0x3ffbaf94\n", + "ts": 0.12274805 }, { "core_id": 0, @@ -12969,8 +13101,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (430) example: Task[0x3ffb7aec]: allocated 10 bytes @ 0x3ffbb7c8\n", - "ts": 0.12202985 + "msg": "I (418) example: Task[0x3ffb72b4]: allocated 10 bytes @ 0x3ffbaf94\n", + "ts": 0.12274805 }, { "core_id": 0, @@ -12980,10 +13112,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 0 }, - "ts": 0.122047575 + "ts": 0.12276155 }, { "core_id": 0, @@ -12991,9 +13123,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.1220608 + "ts": 0.122778975 }, { "core_id": 1, @@ -13001,9 +13133,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.1220608 + "ts": 0.122778975 }, { "core_id": 1, @@ -13013,7 +13145,7 @@ "params": { "irq_num": 31 }, - "ts": 0.12207705 + "ts": 0.12279525 }, { "core_id": 0, @@ -13023,7 +13155,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.1220879 + "ts": 0.1228061 }, { "core_id": 1, @@ -13031,7 +13163,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.122098675 + "ts": 0.122816975 }, { "core_id": 0, @@ -13041,7 +13173,7 @@ "params": { "irq_num": 30 }, - "ts": 0.1221125 + "ts": 0.1228308 }, { "core_id": 1, @@ -13049,9 +13181,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.1221234 + "ts": 0.12284165 }, { "core_id": 0, @@ -13059,7 +13191,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.122134225 + "ts": 0.1228525 }, { "core_id": 1, @@ -13069,10 +13201,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 4294967295 }, - "ts": 0.122146175 + "ts": 0.1228645 }, { "core_id": 0, @@ -13080,7 +13212,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.122156425 + "ts": 0.1228748 }, { "core_id": 1, @@ -13090,10 +13222,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.12216785 + "ts": 0.122886425 }, { "core_id": 1, @@ -13103,10 +13235,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.1221842 + "ts": 0.12290275 }, { "core_id": 1, @@ -13114,8 +13246,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (430) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb7c8\n", - "ts": 0.12224775 + "msg": "I (418) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf94\n", + "ts": 0.122950525 }, { "core_id": 1, @@ -13123,15 +13255,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (430) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb7c8\n", - "ts": 0.12224775 + "msg": "I (418) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf94\n", + "ts": 0.122950525 }, { - "addr": "0x3ffbb7c8", + "addr": "0x3ffbaf94", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -13145,7 +13277,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.12226895 + "ts": 0.1229719 }, { "core_id": 1, @@ -13155,7 +13287,7 @@ "params": { "irq_num": 31 }, - "ts": 0.122299975 + "ts": 0.122999325 }, { "core_id": 1, @@ -13163,7 +13295,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.12231145 + "ts": 0.12301085 }, { "core_id": 1, @@ -13171,7 +13303,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.12232815 + "ts": 0.123027425 }, { "core_id": 1, @@ -13181,7 +13313,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1226694 + "ts": 0.1234259 }, { "core_id": 1, @@ -13189,7 +13321,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.12268285 + "ts": 0.12343945 }, { "core_id": 1, @@ -13197,7 +13329,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.122698425 + "ts": 0.12345515 }, { "core_id": 0, @@ -13207,7 +13339,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1228132 + "ts": 0.1235467 }, { "core_id": 0, @@ -13215,9 +13347,9 @@ "id": 6, "in_irq": true, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.122828225 + "ts": 0.12356165 }, { "core_id": 1, @@ -13225,9 +13357,29 @@ "id": 6, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.122828225 + "ts": 0.12356165 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 6, + "in_irq": true, + "params": { + "tid": 12296612 + }, + "ts": 0.12357355 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.12357355 }, { "core_id": 0, @@ -13235,7 +13387,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.12284085 + "ts": 0.1235861 }, { "core_id": 0, @@ -13243,18 +13395,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.122856525 + "ts": 0.123601775 }, { - "addr": "0x3ffbb7c8", + "addr": "0x3ffbaf94", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -13266,16 +13418,16 @@ "id": 512, "in_irq": false, "size": 10, - "ts": 0.12289185 + "ts": 0.12363815 }, { - "addr": "0x3ffbb7d8", + "addr": "0x3ffbafa4", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -13287,7 +13439,7 @@ "id": 512, "in_irq": false, "size": 20, - "ts": 0.122926275 + "ts": 0.12367715 }, { "core_id": 0, @@ -13297,10 +13449,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.1229433 + "ts": 0.123694075 }, { "core_id": 0, @@ -13310,10 +13462,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.122959425 + "ts": 0.1237101 }, { "core_id": 0, @@ -13321,8 +13473,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (431) example: Task[0x3ffb926c]: allocated 20 bytes @ 0x3ffbb7d8\n", - "ts": 0.12302985 + "msg": "I (419) example: Task[0x3ffb8a34]: allocated 20 bytes @ 0x3ffbafa4\n", + "ts": 0.123764825 }, { "core_id": 0, @@ -13330,8 +13482,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (431) example: Task[0x3ffb926c]: allocated 20 bytes @ 0x3ffbb7d8\n", - "ts": 0.12302985 + "msg": "I (419) example: Task[0x3ffb8a34]: allocated 20 bytes @ 0x3ffbafa4\n", + "ts": 0.123764825 }, { "core_id": 0, @@ -13341,10 +13493,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 0 }, - "ts": 0.1230434 + "ts": 0.12377825 }, { "core_id": 0, @@ -13352,9 +13504,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.123060825 + "ts": 0.1237915 }, { "core_id": 1, @@ -13362,9 +13514,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.123060825 + "ts": 0.1237915 }, { "core_id": 1, @@ -13374,7 +13526,7 @@ "params": { "irq_num": 31 }, - "ts": 0.123077125 + "ts": 0.12380785 }, { "core_id": 0, @@ -13384,7 +13536,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.123087975 + "ts": 0.1238187 }, { "core_id": 1, @@ -13392,7 +13544,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.123098725 + "ts": 0.123829525 }, { "core_id": 0, @@ -13402,7 +13554,7 @@ "params": { "irq_num": 30 }, - "ts": 0.12311245 + "ts": 0.123843325 }, { "core_id": 1, @@ -13410,9 +13562,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.1231233 + "ts": 0.12385525 }, { "core_id": 0, @@ -13420,7 +13572,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.123134125 + "ts": 0.123866325 }, { "core_id": 1, @@ -13430,18 +13582,20 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 4294967295 }, - "ts": 0.123146 + "ts": 0.12387825 }, { "core_id": 0, - "ctx_name": "alloc1", - "id": 17, + "ctx_name": "alloc2", + "id": 4, "in_irq": false, - "params": {}, - "ts": 0.12315625 + "params": { + "tid": 12296612 + }, + "ts": 0.123889925 }, { "core_id": 1, @@ -13451,10 +13605,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.123167725 + "ts": 0.12390255 }, { "core_id": 1, @@ -13464,158 +13618,19 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.123184025 + "ts": 0.12392495 }, { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (431) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb7d8\n", - "ts": 0.123247475 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (431) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb7d8\n", - "ts": 0.123247475 - }, - { - "addr": "0x3ffbb7d8", + "addr": "0x3ffbafbc", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0" - ], - "core_id": 1, - "ctx_name": "free1", - "id": 513, - "in_irq": false, - "size": 0, - "ts": 0.12326865 - }, - { - "core_id": 1, - "ctx_name": "FROM_CPU1", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 31 - }, - "ts": 0.12329565 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.123307075 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.12332365 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.1236694 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.12368295 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.123698525 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.1238132 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 6, - "in_irq": true, - "params": { - "tid": 12298716 - }, - "ts": 0.123828325 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 6, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.123828325 - }, - { - "core_id": 0, - "ctx_name": "alloc1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.123840975 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 4, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.12385665 - }, - { - "addr": "0x3ffbb7d8", - "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -13627,16 +13642,34 @@ "id": 512, "in_irq": false, "size": 15, - "ts": 0.123892175 + "ts": 0.1239364 }, { - "addr": "0x3ffbb7ec", + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (419) example: Task[0x3ffb961c]: free memory @ 0x3ffbafa4\n", + "ts": 0.123977725 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (419) example: Task[0x3ffb961c]: free memory @ 0x3ffbafa4\n", + "ts": 0.123977725 + }, + { + "addr": "0x3ffbafd0", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -13648,7 +13681,28 @@ "id": 512, "in_irq": false, "size": 30, - "ts": 0.12393085 + "ts": 0.1239893 + }, + { + "addr": "0x3ffbafa4", + "callers": [ + "0x4008da24", + "0x400d3c72", + "0x400880dc", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0" + ], + "core_id": 1, + "ctx_name": "free1", + "id": 513, + "in_irq": false, + "size": 0, + "ts": 0.124003525 }, { "core_id": 0, @@ -13658,10 +13712,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.12394775 + "ts": 0.1240161 }, { "core_id": 0, @@ -13671,61 +13725,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.123963725 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (432) example: Task[0x3ffba9dc]: allocated 30 bytes @ 0x3ffbb7ec\n", - "ts": 0.124034075 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (432) example: Task[0x3ffba9dc]: allocated 30 bytes @ 0x3ffbb7ec\n", - "ts": 0.124034075 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12299072, - "xTicksToWait": 0 - }, - "ts": 0.1240478 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 6, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.124061025 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 6, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.124061025 + "ts": 0.12403595 }, { "core_id": 1, @@ -13735,7 +13738,84 @@ "params": { "irq_num": 31 }, - "ts": 0.124077325 + "ts": 0.124046875 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.1240584 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.12407635 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (419) example: Task[0x3ffba1a4]: allocated 30 bytes @ 0x3ffbafd0\n", + "ts": 0.1240941 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (419) example: Task[0x3ffba1a4]: allocated 30 bytes @ 0x3ffbafd0\n", + "ts": 0.1240941 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12296968, + "xTicksToWait": 0 + }, + "ts": 0.1241117 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.12412495 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.12412495 + }, + { + "core_id": 1, + "ctx_name": "FROM_CPU1", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 31 + }, + "ts": 0.1241413 }, { "core_id": 0, @@ -13745,7 +13825,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.124088175 + "ts": 0.12415215 }, { "core_id": 1, @@ -13753,7 +13833,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.12409895 + "ts": 0.124162975 }, { "core_id": 0, @@ -13763,7 +13843,7 @@ "params": { "irq_num": 30 }, - "ts": 0.124112675 + "ts": 0.1241768 }, { "core_id": 1, @@ -13771,9 +13851,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.124125 + "ts": 0.124187725 }, { "core_id": 0, @@ -13781,7 +13861,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.124135825 + "ts": 0.1241986 }, { "core_id": 1, @@ -13791,10 +13871,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 4294967295 }, - "ts": 0.1241477 + "ts": 0.12421055 }, { "core_id": 0, @@ -13802,7 +13882,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.124158975 + "ts": 0.124221775 }, { "core_id": 1, @@ -13812,10 +13892,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.124170625 + "ts": 0.124233575 }, { "core_id": 1, @@ -13825,10 +13905,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.124190325 + "ts": 0.124249925 }, { "core_id": 1, @@ -13836,8 +13916,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (432) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb7ec\n", - "ts": 0.124253875 + "msg": "I (419) example: Task[0x3ffbad8c]: free memory @ 0x3ffbafd0\n", + "ts": 0.1242978 }, { "core_id": 1, @@ -13845,15 +13925,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (432) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb7ec\n", - "ts": 0.124253875 + "msg": "I (419) example: Task[0x3ffbad8c]: free memory @ 0x3ffbafd0\n", + "ts": 0.1242978 }, { - "addr": "0x3ffbb7ec", + "addr": "0x3ffbafd0", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -13867,7 +13947,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.124275075 + "ts": 0.124319225 }, { "core_id": 1, @@ -13877,7 +13957,7 @@ "params": { "irq_num": 31 }, - "ts": 0.124301975 + "ts": 0.124349975 }, { "core_id": 1, @@ -13885,7 +13965,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1243134 + "ts": 0.124361425 }, { "core_id": 1, @@ -13893,7 +13973,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.124329975 + "ts": 0.124378125 }, { "core_id": 1, @@ -13903,7 +13983,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1246694 + "ts": 0.1244259 }, { "core_id": 1, @@ -13911,7 +13991,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.12468295 + "ts": 0.12443945 }, { "core_id": 1, @@ -13919,7 +13999,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.124698525 + "ts": 0.12445515 }, { "core_id": 0, @@ -13929,7 +14009,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1248132 + "ts": 0.1245467 }, { "core_id": 0, @@ -13937,7 +14017,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1248287 + "ts": 0.1245621 }, { "core_id": 0, @@ -13945,7 +14025,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.124843775 + "ts": 0.124577425 }, { "core_id": 1, @@ -13955,7 +14035,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1256694 + "ts": 0.1254259 }, { "core_id": 1, @@ -13963,7 +14043,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.125682925 + "ts": 0.1254394 }, { "core_id": 1, @@ -13971,7 +14051,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.125698325 + "ts": 0.12545455 }, { "core_id": 0, @@ -13981,7 +14061,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1258132 + "ts": 0.1255467 }, { "core_id": 0, @@ -13989,7 +14069,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1258287 + "ts": 0.12556205 }, { "core_id": 0, @@ -13997,7 +14077,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.125843775 + "ts": 0.125577125 }, { "core_id": 1, @@ -14007,7 +14087,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1266694 + "ts": 0.1264259 }, { "core_id": 1, @@ -14015,7 +14095,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.126682975 + "ts": 0.1264394 }, { "core_id": 1, @@ -14023,7 +14103,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1266981 + "ts": 0.126454675 }, { "core_id": 0, @@ -14033,7 +14113,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1268132 + "ts": 0.1265467 }, { "core_id": 0, @@ -14041,7 +14121,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1268287 + "ts": 0.12656205 }, { "core_id": 0, @@ -14049,7 +14129,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.126843775 + "ts": 0.12657715 }, { "core_id": 1, @@ -14059,7 +14139,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1276694 + "ts": 0.1274259 }, { "core_id": 1, @@ -14067,7 +14147,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.127682925 + "ts": 0.12743945 }, { "core_id": 1, @@ -14075,7 +14155,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.127698075 + "ts": 0.1274546 }, { "core_id": 0, @@ -14085,7 +14165,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1278132 + "ts": 0.1275467 }, { "core_id": 0, @@ -14093,7 +14173,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1278286 + "ts": 0.12756205 }, { "core_id": 0, @@ -14101,7 +14181,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.127843825 + "ts": 0.127577125 }, { "core_id": 1, @@ -14111,7 +14191,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1286694 + "ts": 0.1284259 }, { "core_id": 1, @@ -14119,7 +14199,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.128682925 + "ts": 0.1284394 }, { "core_id": 1, @@ -14127,7 +14207,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.128698075 + "ts": 0.12845455 }, { "core_id": 0, @@ -14137,7 +14217,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1288132 + "ts": 0.1285467 }, { "core_id": 0, @@ -14145,7 +14225,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1288287 + "ts": 0.1285621 }, { "core_id": 0, @@ -14153,7 +14233,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.128843775 + "ts": 0.128577425 }, { "core_id": 1, @@ -14163,7 +14243,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1296694 + "ts": 0.1294259 }, { "core_id": 1, @@ -14171,7 +14251,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.129682925 + "ts": 0.1294394 }, { "core_id": 1, @@ -14179,7 +14259,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.129698325 + "ts": 0.12945455 }, { "core_id": 0, @@ -14189,7 +14269,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1298132 + "ts": 0.1295467 }, { "core_id": 0, @@ -14197,7 +14277,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1298287 + "ts": 0.12956205 }, { "core_id": 0, @@ -14205,7 +14285,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1298481 + "ts": 0.129577125 }, { "core_id": 1, @@ -14215,7 +14295,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1306694 + "ts": 0.1304259 }, { "core_id": 1, @@ -14223,7 +14303,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.130682925 + "ts": 0.1304394 }, { "core_id": 1, @@ -14231,7 +14311,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.130698075 + "ts": 0.130454675 }, { "core_id": 0, @@ -14241,7 +14321,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1308132 + "ts": 0.1305467 }, { "core_id": 0, @@ -14249,7 +14329,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1308287 + "ts": 0.13056205 }, { "core_id": 0, @@ -14257,7 +14337,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.130843775 + "ts": 0.13057715 }, { "core_id": 1, @@ -14267,7 +14347,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1316694 + "ts": 0.1314259 }, { "core_id": 1, @@ -14275,7 +14355,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.131682925 + "ts": 0.13143945 }, { "core_id": 1, @@ -14283,7 +14363,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.131698325 + "ts": 0.1314546 }, { "core_id": 0, @@ -14293,7 +14373,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1318132 + "ts": 0.1315467 }, { "core_id": 0, @@ -14301,7 +14381,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1318287 + "ts": 0.13156205 }, { "core_id": 0, @@ -14309,7 +14389,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.131843775 + "ts": 0.131577125 }, { "core_id": 1, @@ -14319,7 +14399,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1326694 + "ts": 0.1324259 }, { "core_id": 1, @@ -14327,7 +14407,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.132682975 + "ts": 0.1324394 }, { "core_id": 1, @@ -14335,7 +14415,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1326981 + "ts": 0.13245455 }, { "core_id": 0, @@ -14345,7 +14425,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1328132 + "ts": 0.1325467 }, { "core_id": 0, @@ -14353,7 +14433,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1328287 + "ts": 0.1325621 }, { "core_id": 0, @@ -14361,7 +14441,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.132843775 + "ts": 0.132577425 }, { "core_id": 1, @@ -14371,7 +14451,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1336694 + "ts": 0.1334259 }, { "core_id": 1, @@ -14379,7 +14459,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.133682925 + "ts": 0.1334394 }, { "core_id": 1, @@ -14387,7 +14467,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.133698075 + "ts": 0.13345455 }, { "core_id": 0, @@ -14397,7 +14477,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1338132 + "ts": 0.1335467 }, { "core_id": 0, @@ -14405,7 +14485,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1338286 + "ts": 0.13356205 }, { "core_id": 0, @@ -14413,7 +14493,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.133843825 + "ts": 0.133577125 }, { "core_id": 1, @@ -14423,7 +14503,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1346694 + "ts": 0.1344259 }, { "core_id": 1, @@ -14431,7 +14511,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.134682925 + "ts": 0.13444365 }, { "core_id": 1, @@ -14439,7 +14519,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.134698075 + "ts": 0.1344588 }, { "core_id": 0, @@ -14449,7 +14529,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1348132 + "ts": 0.1345467 }, { "core_id": 0, @@ -14457,7 +14537,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1348287 + "ts": 0.13456205 }, { "core_id": 0, @@ -14465,7 +14545,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.134843775 + "ts": 0.134577125 }, { "core_id": 1, @@ -14475,7 +14555,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1356694 + "ts": 0.1354259 }, { "core_id": 1, @@ -14483,7 +14563,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.135682925 + "ts": 0.1354394 }, { "core_id": 1, @@ -14491,7 +14571,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.135698325 + "ts": 0.13545455 }, { "core_id": 0, @@ -14501,7 +14581,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1358132 + "ts": 0.1355467 }, { "core_id": 0, @@ -14509,7 +14589,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1358287 + "ts": 0.1355621 }, { "core_id": 0, @@ -14517,7 +14597,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.135843775 + "ts": 0.135577425 }, { "core_id": 1, @@ -14527,7 +14607,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1366694 + "ts": 0.1364259 }, { "core_id": 1, @@ -14535,7 +14615,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.136682975 + "ts": 0.1364394 }, { "core_id": 1, @@ -14543,7 +14623,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1366981 + "ts": 0.13645455 }, { "core_id": 0, @@ -14553,7 +14633,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1368132 + "ts": 0.1365467 }, { "core_id": 0, @@ -14561,7 +14641,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1368287 + "ts": 0.13656205 }, { "core_id": 0, @@ -14569,7 +14649,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.136843775 + "ts": 0.136577125 }, { "core_id": 1, @@ -14579,7 +14659,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1376694 + "ts": 0.1374259 }, { "core_id": 1, @@ -14587,7 +14667,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.137682925 + "ts": 0.1374394 }, { "core_id": 1, @@ -14595,7 +14675,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.137698075 + "ts": 0.137454675 }, { "core_id": 0, @@ -14605,7 +14685,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1378132 + "ts": 0.1375467 }, { "core_id": 0, @@ -14613,7 +14693,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1378286 + "ts": 0.13756205 }, { "core_id": 0, @@ -14621,7 +14701,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.137843825 + "ts": 0.13757715 }, { "core_id": 1, @@ -14631,7 +14711,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1386694 + "ts": 0.1384259 }, { "core_id": 1, @@ -14639,7 +14719,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.138682925 + "ts": 0.13843945 }, { "core_id": 1, @@ -14647,7 +14727,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.138698075 + "ts": 0.1384546 }, { "core_id": 0, @@ -14657,7 +14737,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1388132 + "ts": 0.1385467 }, { "core_id": 0, @@ -14665,7 +14745,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1388287 + "ts": 0.13856205 }, { "core_id": 0, @@ -14673,7 +14753,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.138843775 + "ts": 0.138577125 }, { "core_id": 1, @@ -14683,7 +14763,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1396694 + "ts": 0.1394259 }, { "core_id": 1, @@ -14691,7 +14771,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.139682925 + "ts": 0.1394394 }, { "core_id": 1, @@ -14699,7 +14779,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.139698325 + "ts": 0.13945455 }, { "core_id": 0, @@ -14709,7 +14789,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1398132 + "ts": 0.1395467 }, { "core_id": 0, @@ -14717,7 +14797,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1398287 + "ts": 0.1395621 }, { "core_id": 0, @@ -14725,7 +14805,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.139843775 + "ts": 0.139577425 }, { "core_id": 1, @@ -14735,7 +14815,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1406694 + "ts": 0.1404259 }, { "core_id": 1, @@ -14743,7 +14823,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.140682975 + "ts": 0.1404394 }, { "core_id": 1, @@ -14751,7 +14831,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1406981 + "ts": 0.14045455 }, { "core_id": 0, @@ -14761,7 +14841,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1408132 + "ts": 0.1405467 }, { "core_id": 0, @@ -14769,7 +14849,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1408287 + "ts": 0.14056205 }, { "core_id": 0, @@ -14777,7 +14857,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.140843775 + "ts": 0.140577125 }, { "core_id": 1, @@ -14787,7 +14867,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1416694 + "ts": 0.1414259 }, { "core_id": 1, @@ -14795,7 +14875,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.141682925 + "ts": 0.1414394 }, { "core_id": 1, @@ -14803,7 +14883,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.141698075 + "ts": 0.141454675 }, { "core_id": 0, @@ -14813,7 +14893,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1418132 + "ts": 0.1415467 }, { "core_id": 0, @@ -14821,7 +14901,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1418286 + "ts": 0.14156205 }, { "core_id": 0, @@ -14829,7 +14909,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.141843825 + "ts": 0.14157715 }, { "core_id": 1, @@ -14839,7 +14919,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1426694 + "ts": 0.1424259 }, { "core_id": 1, @@ -14847,7 +14927,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.142682925 + "ts": 0.14243945 }, { "core_id": 1, @@ -14855,7 +14935,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.142698325 + "ts": 0.1424546 }, { "core_id": 0, @@ -14865,7 +14945,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1428132 + "ts": 0.1425467 }, { "core_id": 0, @@ -14873,7 +14953,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1428287 + "ts": 0.14256205 }, { "core_id": 0, @@ -14881,7 +14961,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.142843775 + "ts": 0.142577125 }, { "core_id": 1, @@ -14891,7 +14971,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1436694 + "ts": 0.1434259 }, { "core_id": 1, @@ -14899,7 +14979,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.143682975 + "ts": 0.1434394 }, { "core_id": 1, @@ -14907,7 +14987,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1436981 + "ts": 0.14345455 }, { "core_id": 0, @@ -14917,7 +14997,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1438132 + "ts": 0.1435467 }, { "core_id": 0, @@ -14925,7 +15005,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1438287 + "ts": 0.1435621 }, { "core_id": 0, @@ -14933,7 +15013,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.143843775 + "ts": 0.143577425 }, { "core_id": 1, @@ -14943,7 +15023,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1446694 + "ts": 0.1444259 }, { "core_id": 1, @@ -14951,7 +15031,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.144682925 + "ts": 0.1444394 }, { "core_id": 1, @@ -14959,7 +15039,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.144698075 + "ts": 0.14445455 }, { "core_id": 0, @@ -14969,7 +15049,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1448132 + "ts": 0.1445467 }, { "core_id": 0, @@ -14977,7 +15057,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1448286 + "ts": 0.14456205 }, { "core_id": 0, @@ -14985,7 +15065,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.144843825 + "ts": 0.144577125 }, { "core_id": 1, @@ -14995,7 +15075,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1456694 + "ts": 0.1454259 }, { "core_id": 1, @@ -15003,7 +15083,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.145682925 + "ts": 0.1454394 }, { "core_id": 1, @@ -15011,7 +15091,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.145698075 + "ts": 0.145454675 }, { "core_id": 0, @@ -15021,7 +15101,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1458132 + "ts": 0.1455467 }, { "core_id": 0, @@ -15029,7 +15109,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1458287 + "ts": 0.14556205 }, { "core_id": 0, @@ -15037,7 +15117,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.145843775 + "ts": 0.14557715 }, { "core_id": 1, @@ -15047,7 +15127,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1466694 + "ts": 0.1464259 }, { "core_id": 1, @@ -15055,7 +15135,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.146682925 + "ts": 0.146443 }, { "core_id": 1, @@ -15063,7 +15143,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.146698325 + "ts": 0.146458125 }, { "core_id": 0, @@ -15073,7 +15153,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1468132 + "ts": 0.1465467 }, { "core_id": 0, @@ -15081,7 +15161,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1468287 + "ts": 0.14656205 }, { "core_id": 0, @@ -15089,7 +15169,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.146843775 + "ts": 0.146577125 }, { "core_id": 1, @@ -15099,7 +15179,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1476694 + "ts": 0.1474259 }, { "core_id": 1, @@ -15107,7 +15187,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.147682975 + "ts": 0.1474394 }, { "core_id": 1, @@ -15115,7 +15195,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1476981 + "ts": 0.14745455 }, { "core_id": 0, @@ -15125,7 +15205,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1478132 + "ts": 0.1475467 }, { "core_id": 0, @@ -15133,7 +15213,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1478287 + "ts": 0.1475621 }, { "core_id": 0, @@ -15141,7 +15221,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.147843775 + "ts": 0.147577425 }, { "core_id": 1, @@ -15151,7 +15231,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1486694 + "ts": 0.1484259 }, { "core_id": 1, @@ -15159,7 +15239,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.148682925 + "ts": 0.1484394 }, { "core_id": 1, @@ -15167,7 +15247,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.148698075 + "ts": 0.14845455 }, { "core_id": 0, @@ -15177,7 +15257,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1488132 + "ts": 0.1485467 }, { "core_id": 0, @@ -15185,7 +15265,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1488286 + "ts": 0.14856205 }, { "core_id": 0, @@ -15193,7 +15273,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.148843825 + "ts": 0.148577125 }, { "core_id": 1, @@ -15203,7 +15283,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1496694 + "ts": 0.1494259 }, { "core_id": 1, @@ -15211,7 +15291,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.149682925 + "ts": 0.1494394 }, { "core_id": 1, @@ -15219,7 +15299,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.149698075 + "ts": 0.149454675 }, { "core_id": 0, @@ -15229,7 +15309,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1498132 + "ts": 0.1495467 }, { "core_id": 0, @@ -15237,7 +15317,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1498287 + "ts": 0.14956205 }, { "core_id": 0, @@ -15245,7 +15325,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.149843775 + "ts": 0.14957715 }, { "core_id": 1, @@ -15255,7 +15335,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1506694 + "ts": 0.1504259 }, { "core_id": 1, @@ -15263,7 +15343,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.150682925 + "ts": 0.15043945 }, { "core_id": 1, @@ -15271,7 +15351,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.150698325 + "ts": 0.1504546 }, { "core_id": 0, @@ -15281,7 +15361,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1508132 + "ts": 0.1505467 }, { "core_id": 0, @@ -15289,7 +15369,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1508287 + "ts": 0.15056205 }, { "core_id": 0, @@ -15297,7 +15377,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.150843775 + "ts": 0.150577125 }, { "core_id": 1, @@ -15307,7 +15387,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1516694 + "ts": 0.1514259 }, { "core_id": 1, @@ -15315,7 +15395,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.151682975 + "ts": 0.1514394 }, { "core_id": 1, @@ -15323,7 +15403,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1516981 + "ts": 0.15145455 }, { "core_id": 0, @@ -15333,7 +15413,59 @@ "params": { "irq_num": 5 }, - "ts": 0.1518132 + "ts": 0.1515467 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.1515621 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.151577425 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.1524259 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.1524394 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.15245455 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.1525467 }, { "core_id": 0, @@ -15341,9 +15473,9 @@ "id": 6, "in_irq": true, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.151828325 + "ts": 0.15256165 }, { "core_id": 1, @@ -15351,9 +15483,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.151828325 + "ts": 0.15256165 }, { "core_id": 0, @@ -15361,7 +15493,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.151840975 + "ts": 0.1525743 }, { "core_id": 0, @@ -15369,18 +15501,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.15185665 + "ts": 0.152590225 }, { - "addr": "0x3ffbb7ec", + "addr": "0x3ffbafa4", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -15392,16 +15524,16 @@ "id": 512, "in_irq": false, "size": 6, - "ts": 0.151892175 + "ts": 0.15262545 }, { - "addr": "0x3ffbb7fc", + "addr": "0x3ffbafd0", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -15413,7 +15545,7 @@ "id": 512, "in_irq": false, "size": 12, - "ts": 0.15193065 + "ts": 0.15266115 }, { "core_id": 0, @@ -15423,10 +15555,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.15194755 + "ts": 0.152678125 }, { "core_id": 0, @@ -15436,10 +15568,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.15196355 + "ts": 0.1526941 }, { "core_id": 0, @@ -15447,8 +15579,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (460) example: Task[0x3ffb7aec]: allocated 12 bytes @ 0x3ffbb7fc\n", - "ts": 0.152033875 + "msg": "I (448) example: Task[0x3ffb72b4]: allocated 12 bytes @ 0x3ffbafd0\n", + "ts": 0.1527531 }, { "core_id": 0, @@ -15456,8 +15588,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (460) example: Task[0x3ffb7aec]: allocated 12 bytes @ 0x3ffbb7fc\n", - "ts": 0.152033875 + "msg": "I (448) example: Task[0x3ffb72b4]: allocated 12 bytes @ 0x3ffbafd0\n", + "ts": 0.1527531 }, { "core_id": 0, @@ -15467,10 +15599,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 0 }, - "ts": 0.152047475 + "ts": 0.1527666 }, { "core_id": 0, @@ -15478,9 +15610,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.1520607 + "ts": 0.15277975 }, { "core_id": 1, @@ -15488,9 +15620,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.1520607 + "ts": 0.15277975 }, { "core_id": 1, @@ -15500,7 +15632,7 @@ "params": { "irq_num": 31 }, - "ts": 0.15207695 + "ts": 0.152795975 }, { "core_id": 0, @@ -15510,7 +15642,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.1520878 + "ts": 0.152806925 }, { "core_id": 1, @@ -15518,7 +15650,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.152098575 + "ts": 0.152817675 }, { "core_id": 0, @@ -15528,7 +15660,7 @@ "params": { "irq_num": 30 }, - "ts": 0.152112375 + "ts": 0.15283175 }, { "core_id": 1, @@ -15536,9 +15668,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.152123175 + "ts": 0.15284255 }, { "core_id": 0, @@ -15546,7 +15678,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.152134025 + "ts": 0.152853275 }, { "core_id": 1, @@ -15556,10 +15688,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 4294967295 }, - "ts": 0.1521459 + "ts": 0.1528654 }, { "core_id": 0, @@ -15567,7 +15699,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1521562 + "ts": 0.152875575 }, { "core_id": 1, @@ -15577,10 +15709,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.152167725 + "ts": 0.15288735 }, { "core_id": 1, @@ -15590,10 +15722,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.15218815 + "ts": 0.152903675 }, { "core_id": 1, @@ -15601,8 +15733,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (460) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb7fc\n", - "ts": 0.1522517 + "msg": "I (448) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbafd0\n", + "ts": 0.15295155 }, { "core_id": 1, @@ -15610,15 +15742,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (460) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb7fc\n", - "ts": 0.1522517 + "msg": "I (448) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbafd0\n", + "ts": 0.15295155 }, { - "addr": "0x3ffbb7fc", + "addr": "0x3ffbafd0", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -15632,7 +15764,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.1522729 + "ts": 0.152972775 }, { "core_id": 1, @@ -15642,7 +15774,7 @@ "params": { "irq_num": 31 }, - "ts": 0.1522998 + "ts": 0.15300425 }, { "core_id": 1, @@ -15650,7 +15782,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.152311225 + "ts": 0.1530157 }, { "core_id": 1, @@ -15658,7 +15790,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1523278 + "ts": 0.1530324 }, { "core_id": 1, @@ -15668,7 +15800,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1526694 + "ts": 0.1534259 }, { "core_id": 1, @@ -15676,7 +15808,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.15268295 + "ts": 0.15343945 }, { "core_id": 1, @@ -15684,7 +15816,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.152698525 + "ts": 0.15345515 }, { "core_id": 0, @@ -15694,7 +15826,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1528132 + "ts": 0.1535467 }, { "core_id": 0, @@ -15702,9 +15834,9 @@ "id": 6, "in_irq": true, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.152828325 + "ts": 0.1535617 }, { "core_id": 1, @@ -15712,9 +15844,29 @@ "id": 6, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.152828325 + "ts": 0.1535617 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 6, + "in_irq": true, + "params": { + "tid": 12296612 + }, + "ts": 0.15357355 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.15357355 }, { "core_id": 0, @@ -15722,7 +15874,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.152840975 + "ts": 0.15358605 }, { "core_id": 0, @@ -15730,18 +15882,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.152856775 + "ts": 0.153601725 }, { - "addr": "0x3ffbb7fc", + "addr": "0x3ffbafd0", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -15753,16 +15905,16 @@ "id": 512, "in_irq": false, "size": 12, - "ts": 0.152892175 + "ts": 0.15363815 }, { - "addr": "0x3ffbb80c", + "addr": "0x3ffbafe0", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -15774,7 +15926,7 @@ "id": 512, "in_irq": false, "size": 24, - "ts": 0.1529267 + "ts": 0.153673575 }, { "core_id": 0, @@ -15784,10 +15936,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.15294365 + "ts": 0.153690525 }, { "core_id": 0, @@ -15797,10 +15949,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.152963825 + "ts": 0.153706525 }, { "core_id": 0, @@ -15808,8 +15960,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (461) example: Task[0x3ffb926c]: allocated 24 bytes @ 0x3ffbb80c\n", - "ts": 0.15303425 + "msg": "I (449) example: Task[0x3ffb8a34]: allocated 24 bytes @ 0x3ffbafe0\n", + "ts": 0.153761375 }, { "core_id": 0, @@ -15817,8 +15969,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (461) example: Task[0x3ffb926c]: allocated 24 bytes @ 0x3ffbb80c\n", - "ts": 0.15303425 + "msg": "I (449) example: Task[0x3ffb8a34]: allocated 24 bytes @ 0x3ffbafe0\n", + "ts": 0.153761375 }, { "core_id": 0, @@ -15828,10 +15980,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 0 }, - "ts": 0.1530479 + "ts": 0.153778675 }, { "core_id": 0, @@ -15839,9 +15991,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.153061075 + "ts": 0.153791925 }, { "core_id": 1, @@ -15849,9 +16001,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.153061075 + "ts": 0.153791925 }, { "core_id": 1, @@ -15861,7 +16013,7 @@ "params": { "irq_num": 31 }, - "ts": 0.1530774 + "ts": 0.153808275 }, { "core_id": 0, @@ -15871,7 +16023,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.15308825 + "ts": 0.153819125 }, { "core_id": 1, @@ -15879,7 +16031,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.153098975 + "ts": 0.15382995 }, { "core_id": 0, @@ -15889,7 +16041,7 @@ "params": { "irq_num": 30 }, - "ts": 0.15311275 + "ts": 0.15384375 }, { "core_id": 1, @@ -15897,9 +16049,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.1531237 + "ts": 0.153855475 }, { "core_id": 0, @@ -15907,7 +16059,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1531345 + "ts": 0.15386685 }, { "core_id": 1, @@ -15917,18 +16069,20 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 4294967295 }, - "ts": 0.153146375 + "ts": 0.15387885 }, { "core_id": 0, - "ctx_name": "alloc1", - "id": 17, + "ctx_name": "alloc2", + "id": 4, "in_irq": false, - "params": {}, - "ts": 0.153156625 + "params": { + "tid": 12296612 + }, + "ts": 0.153890525 }, { "core_id": 1, @@ -15938,10 +16092,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.1531681 + "ts": 0.153903125 }, { "core_id": 1, @@ -15951,158 +16105,19 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.1531844 + "ts": 0.15392175 }, { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (461) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb80c\n", - "ts": 0.15324785 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (461) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb80c\n", - "ts": 0.15324785 - }, - { - "addr": "0x3ffbb80c", + "addr": "0x3ffbaffc", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0" - ], - "core_id": 1, - "ctx_name": "free1", - "id": 513, - "in_irq": false, - "size": 0, - "ts": 0.1532729 - }, - { - "core_id": 1, - "ctx_name": "FROM_CPU1", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 31 - }, - "ts": 0.1532999 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.153311325 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.1533279 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.1536694 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.15368295 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.153698525 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.1538132 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 6, - "in_irq": true, - "params": { - "tid": 12298716 - }, - "ts": 0.153828325 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 6, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.153828325 - }, - { - "core_id": 0, - "ctx_name": "alloc1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.153840975 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 4, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.15385665 - }, - { - "addr": "0x3ffbb80c", - "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -16114,16 +16129,34 @@ "id": 512, "in_irq": false, "size": 18, - "ts": 0.153892175 + "ts": 0.15393375 }, { - "addr": "0x3ffbb824", + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (449) example: Task[0x3ffb961c]: free memory @ 0x3ffbafe0\n", + "ts": 0.153974925 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (449) example: Task[0x3ffb961c]: free memory @ 0x3ffbafe0\n", + "ts": 0.153974925 + }, + { + "addr": "0x3ffbb014", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -16135,7 +16168,28 @@ "id": 512, "in_irq": false, "size": 36, - "ts": 0.153926725 + "ts": 0.1539911 + }, + { + "addr": "0x3ffbafe0", + "callers": [ + "0x4008da24", + "0x400d3c72", + "0x400880dc", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0" + ], + "core_id": 1, + "ctx_name": "free1", + "id": 513, + "in_irq": false, + "size": 0, + "ts": 0.154005475 }, { "core_id": 0, @@ -16145,10 +16199,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.153943625 + "ts": 0.154017925 }, { "core_id": 0, @@ -16158,61 +16212,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.153959625 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (462) example: Task[0x3ffba9dc]: allocated 36 bytes @ 0x3ffbb824\n", - "ts": 0.15402995 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (462) example: Task[0x3ffba9dc]: allocated 36 bytes @ 0x3ffbb824\n", - "ts": 0.15402995 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12299072, - "xTicksToWait": 0 - }, - "ts": 0.154047775 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 6, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.154061125 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 6, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.154061125 + "ts": 0.154037825 }, { "core_id": 1, @@ -16222,7 +16225,84 @@ "params": { "irq_num": 31 }, - "ts": 0.15407745 + "ts": 0.15404875 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.1540603 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.15407825 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (449) example: Task[0x3ffba1a4]: allocated 36 bytes @ 0x3ffbb014\n", + "ts": 0.15409625 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (449) example: Task[0x3ffba1a4]: allocated 36 bytes @ 0x3ffbb014\n", + "ts": 0.15409625 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12296968, + "xTicksToWait": 0 + }, + "ts": 0.1541097 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.15412645 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.15412645 + }, + { + "core_id": 1, + "ctx_name": "FROM_CPU1", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 31 + }, + "ts": 0.1541428 }, { "core_id": 0, @@ -16232,7 +16312,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.1540883 + "ts": 0.154153675 }, { "core_id": 1, @@ -16240,7 +16320,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.15409905 + "ts": 0.154164475 }, { "core_id": 0, @@ -16250,7 +16330,7 @@ "params": { "irq_num": 30 }, - "ts": 0.154112775 + "ts": 0.1541783 }, { "core_id": 1, @@ -16258,9 +16338,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.154123675 + "ts": 0.154189225 }, { "core_id": 0, @@ -16268,7 +16348,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1541345 + "ts": 0.154200075 }, { "core_id": 1, @@ -16278,10 +16358,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 4294967295 }, - "ts": 0.15414635 + "ts": 0.154212025 }, { "core_id": 0, @@ -16289,7 +16369,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.15415765 + "ts": 0.15422325 }, { "core_id": 1, @@ -16299,10 +16379,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.154169275 + "ts": 0.15423505 }, { "core_id": 1, @@ -16312,10 +16392,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.154185675 + "ts": 0.154251325 }, { "core_id": 1, @@ -16323,8 +16403,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (462) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb824\n", - "ts": 0.154249225 + "msg": "I (449) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb014\n", + "ts": 0.1542991 }, { "core_id": 1, @@ -16332,15 +16412,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (462) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb824\n", - "ts": 0.154249225 + "msg": "I (449) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb014\n", + "ts": 0.1542991 }, { - "addr": "0x3ffbb824", + "addr": "0x3ffbb014", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -16354,7 +16434,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.154270425 + "ts": 0.154320475 }, { "core_id": 1, @@ -16364,7 +16444,7 @@ "params": { "irq_num": 31 }, - "ts": 0.154301425 + "ts": 0.154347875 }, { "core_id": 1, @@ -16372,7 +16452,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1543129 + "ts": 0.1543593 }, { "core_id": 1, @@ -16380,7 +16460,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1543296 + "ts": 0.15437585 }, { "core_id": 1, @@ -16390,7 +16470,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1546694 + "ts": 0.1544259 }, { "core_id": 1, @@ -16398,7 +16478,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.15468285 + "ts": 0.15443945 }, { "core_id": 1, @@ -16406,7 +16486,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.154698425 + "ts": 0.15445515 }, { "core_id": 0, @@ -16416,7 +16496,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1548132 + "ts": 0.1545467 }, { "core_id": 0, @@ -16424,7 +16504,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1548286 + "ts": 0.15456205 }, { "core_id": 0, @@ -16432,7 +16512,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.154843825 + "ts": 0.154577125 }, { "core_id": 1, @@ -16442,7 +16522,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1556694 + "ts": 0.1554259 }, { "core_id": 1, @@ -16450,7 +16530,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.155682925 + "ts": 0.1554394 }, { "core_id": 1, @@ -16458,7 +16538,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.155698075 + "ts": 0.15545455 }, { "core_id": 0, @@ -16468,7 +16548,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1558132 + "ts": 0.1555467 }, { "core_id": 0, @@ -16476,7 +16556,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1558287 + "ts": 0.1555621 }, { "core_id": 0, @@ -16484,7 +16564,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.155843775 + "ts": 0.155577425 }, { "core_id": 1, @@ -16494,7 +16574,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1566694 + "ts": 0.1564259 }, { "core_id": 1, @@ -16502,7 +16582,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.156682925 + "ts": 0.1564394 }, { "core_id": 1, @@ -16510,7 +16590,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.156698325 + "ts": 0.15645455 }, { "core_id": 0, @@ -16520,7 +16600,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1568132 + "ts": 0.1565467 }, { "core_id": 0, @@ -16528,7 +16608,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1568287 + "ts": 0.156565675 }, { "core_id": 0, @@ -16536,7 +16616,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.156843775 + "ts": 0.156580875 }, { "core_id": 1, @@ -16546,7 +16626,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1576694 + "ts": 0.1574259 }, { "core_id": 1, @@ -16554,7 +16634,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.157682975 + "ts": 0.1574394 }, { "core_id": 1, @@ -16562,7 +16642,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1576981 + "ts": 0.15745455 }, { "core_id": 0, @@ -16572,7 +16652,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1578132 + "ts": 0.1575467 }, { "core_id": 0, @@ -16580,7 +16660,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1578287 + "ts": 0.15756205 }, { "core_id": 0, @@ -16588,7 +16668,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.157843775 + "ts": 0.157577125 }, { "core_id": 1, @@ -16598,7 +16678,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1586694 + "ts": 0.1584259 }, { "core_id": 1, @@ -16606,7 +16686,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.158682925 + "ts": 0.1584394 }, { "core_id": 1, @@ -16614,7 +16694,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.158698075 + "ts": 0.158454675 }, { "core_id": 0, @@ -16624,7 +16704,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1588132 + "ts": 0.1585467 }, { "core_id": 0, @@ -16632,7 +16712,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1588286 + "ts": 0.15856205 }, { "core_id": 0, @@ -16640,7 +16720,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.158843825 + "ts": 0.15857715 }, { "core_id": 1, @@ -16650,7 +16730,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1596694 + "ts": 0.1594259 }, { "core_id": 1, @@ -16658,7 +16738,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.159682925 + "ts": 0.15943945 }, { "core_id": 1, @@ -16666,7 +16746,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.159698075 + "ts": 0.1594546 }, { "core_id": 0, @@ -16676,7 +16756,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1598132 + "ts": 0.1595467 }, { "core_id": 0, @@ -16684,7 +16764,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1598287 + "ts": 0.15956205 }, { "core_id": 0, @@ -16692,7 +16772,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.159843775 + "ts": 0.159577125 }, { "core_id": 1, @@ -16702,7 +16782,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1606694 + "ts": 0.1604259 }, { "core_id": 1, @@ -16710,7 +16790,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.160682925 + "ts": 0.1604394 }, { "core_id": 1, @@ -16718,7 +16798,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.160698325 + "ts": 0.16045455 }, { "core_id": 0, @@ -16728,7 +16808,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1608132 + "ts": 0.1605467 }, { "core_id": 0, @@ -16736,7 +16816,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1608287 + "ts": 0.1605621 }, { "core_id": 0, @@ -16744,7 +16824,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.160843775 + "ts": 0.160577425 }, { "core_id": 1, @@ -16754,7 +16834,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1616694 + "ts": 0.1614259 }, { "core_id": 1, @@ -16762,7 +16842,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.161682975 + "ts": 0.1614394 }, { "core_id": 1, @@ -16770,7 +16850,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1616981 + "ts": 0.16145455 }, { "core_id": 0, @@ -16780,7 +16860,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1618132 + "ts": 0.1615467 }, { "core_id": 0, @@ -16788,7 +16868,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1618287 + "ts": 0.16156205 }, { "core_id": 0, @@ -16796,7 +16876,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.161843775 + "ts": 0.161577125 }, { "core_id": 1, @@ -16806,7 +16886,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1626694 + "ts": 0.1624259 }, { "core_id": 1, @@ -16814,7 +16894,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.162682925 + "ts": 0.1624394 }, { "core_id": 1, @@ -16822,7 +16902,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.162698075 + "ts": 0.162454675 }, { "core_id": 0, @@ -16832,7 +16912,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1628132 + "ts": 0.1625467 }, { "core_id": 0, @@ -16840,7 +16920,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1628286 + "ts": 0.16256205 }, { "core_id": 0, @@ -16848,7 +16928,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.162843825 + "ts": 0.16257715 }, { "core_id": 1, @@ -16858,7 +16938,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1636694 + "ts": 0.1634259 }, { "core_id": 1, @@ -16866,7 +16946,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.163682925 + "ts": 0.16343945 }, { "core_id": 1, @@ -16874,7 +16954,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.163698075 + "ts": 0.1634546 }, { "core_id": 0, @@ -16884,7 +16964,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1638132 + "ts": 0.1635467 }, { "core_id": 0, @@ -16892,7 +16972,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1638287 + "ts": 0.16356205 }, { "core_id": 0, @@ -16900,7 +16980,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.163843775 + "ts": 0.163577125 }, { "core_id": 1, @@ -16910,7 +16990,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1646694 + "ts": 0.1644259 }, { "core_id": 1, @@ -16918,7 +16998,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.16468655 + "ts": 0.1644394 }, { "core_id": 1, @@ -16926,7 +17006,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.164701825 + "ts": 0.16445455 }, { "core_id": 0, @@ -16936,7 +17016,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1648132 + "ts": 0.1645467 }, { "core_id": 0, @@ -16944,7 +17024,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1648287 + "ts": 0.1645621 }, { "core_id": 0, @@ -16952,7 +17032,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.164843775 + "ts": 0.164577425 }, { "core_id": 1, @@ -16962,7 +17042,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1656694 + "ts": 0.1654259 }, { "core_id": 1, @@ -16970,7 +17050,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.165682925 + "ts": 0.1654394 }, { "core_id": 1, @@ -16978,7 +17058,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.165698075 + "ts": 0.16545455 }, { "core_id": 0, @@ -16988,7 +17068,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1658132 + "ts": 0.1655467 }, { "core_id": 0, @@ -16996,7 +17076,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1658286 + "ts": 0.16556205 }, { "core_id": 0, @@ -17004,7 +17084,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.165843825 + "ts": 0.165577125 }, { "core_id": 1, @@ -17014,7 +17094,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1666694 + "ts": 0.1664259 }, { "core_id": 1, @@ -17022,7 +17102,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.166682925 + "ts": 0.1664394 }, { "core_id": 1, @@ -17030,7 +17110,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.166698075 + "ts": 0.166454675 }, { "core_id": 0, @@ -17040,7 +17120,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1668132 + "ts": 0.1665467 }, { "core_id": 0, @@ -17048,7 +17128,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1668287 + "ts": 0.16656205 }, { "core_id": 0, @@ -17056,7 +17136,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.166843775 + "ts": 0.16657715 }, { "core_id": 1, @@ -17066,7 +17146,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1676694 + "ts": 0.1674259 }, { "core_id": 1, @@ -17074,7 +17154,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.167682925 + "ts": 0.16743945 }, { "core_id": 1, @@ -17082,7 +17162,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.167698325 + "ts": 0.1674546 }, { "core_id": 0, @@ -17092,7 +17172,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1678132 + "ts": 0.1675467 }, { "core_id": 0, @@ -17100,7 +17180,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1678287 + "ts": 0.16756205 }, { "core_id": 0, @@ -17108,7 +17188,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.167843775 + "ts": 0.167577125 }, { "core_id": 1, @@ -17118,7 +17198,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1686694 + "ts": 0.1684259 }, { "core_id": 1, @@ -17126,7 +17206,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.168682975 + "ts": 0.1684394 }, { "core_id": 1, @@ -17134,7 +17214,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1686981 + "ts": 0.16845455 }, { "core_id": 0, @@ -17144,7 +17224,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1688132 + "ts": 0.1685467 }, { "core_id": 0, @@ -17152,7 +17232,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1688287 + "ts": 0.168566325 }, { "core_id": 0, @@ -17160,7 +17240,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.168843775 + "ts": 0.16858155 }, { "core_id": 1, @@ -17170,7 +17250,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1696694 + "ts": 0.1694259 }, { "core_id": 1, @@ -17178,7 +17258,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.169682925 + "ts": 0.1694394 }, { "core_id": 1, @@ -17186,7 +17266,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.169698075 + "ts": 0.16945455 }, { "core_id": 0, @@ -17196,7 +17276,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1698132 + "ts": 0.1695467 }, { "core_id": 0, @@ -17204,7 +17284,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1698286 + "ts": 0.16956205 }, { "core_id": 0, @@ -17212,7 +17292,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.169843825 + "ts": 0.169577125 }, { "core_id": 1, @@ -17222,7 +17302,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1706694 + "ts": 0.1704259 }, { "core_id": 1, @@ -17230,7 +17310,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.170682925 + "ts": 0.1704394 }, { "core_id": 1, @@ -17238,7 +17318,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.170698075 + "ts": 0.170454675 }, { "core_id": 0, @@ -17248,7 +17328,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1708132 + "ts": 0.1705467 }, { "core_id": 0, @@ -17256,7 +17336,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1708287 + "ts": 0.17056205 }, { "core_id": 0, @@ -17264,7 +17344,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.170843775 + "ts": 0.17057715 }, { "core_id": 1, @@ -17274,7 +17354,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1716694 + "ts": 0.1714259 }, { "core_id": 1, @@ -17282,7 +17362,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.171682925 + "ts": 0.17143945 }, { "core_id": 1, @@ -17290,7 +17370,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.171698325 + "ts": 0.1714546 }, { "core_id": 0, @@ -17300,7 +17380,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1718132 + "ts": 0.1715467 }, { "core_id": 0, @@ -17308,7 +17388,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1718287 + "ts": 0.17156205 }, { "core_id": 0, @@ -17316,7 +17396,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.171843775 + "ts": 0.171577125 }, { "core_id": 1, @@ -17326,7 +17406,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1726694 + "ts": 0.1724259 }, { "core_id": 1, @@ -17334,7 +17414,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.172682975 + "ts": 0.1724394 }, { "core_id": 1, @@ -17342,7 +17422,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1726981 + "ts": 0.17245455 }, { "core_id": 0, @@ -17352,7 +17432,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1728132 + "ts": 0.1725467 }, { "core_id": 0, @@ -17360,7 +17440,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1728287 + "ts": 0.1725621 }, { "core_id": 0, @@ -17368,7 +17448,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.172843775 + "ts": 0.172577425 }, { "core_id": 1, @@ -17378,7 +17458,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1736694 + "ts": 0.1734259 }, { "core_id": 1, @@ -17386,7 +17466,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.173682925 + "ts": 0.1734394 }, { "core_id": 1, @@ -17394,7 +17474,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.173698075 + "ts": 0.17345455 }, { "core_id": 0, @@ -17404,7 +17484,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1738132 + "ts": 0.1735467 }, { "core_id": 0, @@ -17412,7 +17492,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1738286 + "ts": 0.17356205 }, { "core_id": 0, @@ -17420,7 +17500,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.173843825 + "ts": 0.173577125 }, { "core_id": 1, @@ -17430,7 +17510,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1746694 + "ts": 0.1744259 }, { "core_id": 1, @@ -17438,7 +17518,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.174682925 + "ts": 0.1744394 }, { "core_id": 1, @@ -17446,7 +17526,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.174698075 + "ts": 0.174454675 }, { "core_id": 0, @@ -17456,7 +17536,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1748132 + "ts": 0.1745467 }, { "core_id": 0, @@ -17464,7 +17544,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1748287 + "ts": 0.17456205 }, { "core_id": 0, @@ -17472,7 +17552,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.174843775 + "ts": 0.17457715 }, { "core_id": 1, @@ -17482,7 +17562,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1756694 + "ts": 0.1754259 }, { "core_id": 1, @@ -17490,7 +17570,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.175682925 + "ts": 0.17543945 }, { "core_id": 1, @@ -17498,7 +17578,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.175698325 + "ts": 0.1754546 }, { "core_id": 0, @@ -17508,7 +17588,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1758132 + "ts": 0.1755467 }, { "core_id": 0, @@ -17516,7 +17596,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1758287 + "ts": 0.17556205 }, { "core_id": 0, @@ -17524,7 +17604,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.175843775 + "ts": 0.175577125 }, { "core_id": 1, @@ -17534,7 +17614,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1766694 + "ts": 0.1764259 }, { "core_id": 1, @@ -17542,7 +17622,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1766872 + "ts": 0.1764394 }, { "core_id": 1, @@ -17550,7 +17630,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.17670235 + "ts": 0.17645455 }, { "core_id": 0, @@ -17560,7 +17640,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1768132 + "ts": 0.1765467 }, { "core_id": 0, @@ -17568,7 +17648,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1768287 + "ts": 0.1765621 }, { "core_id": 0, @@ -17576,7 +17656,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.176843775 + "ts": 0.176577425 }, { "core_id": 1, @@ -17586,7 +17666,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1776694 + "ts": 0.1774259 }, { "core_id": 1, @@ -17594,7 +17674,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.177682925 + "ts": 0.1774394 }, { "core_id": 1, @@ -17602,7 +17682,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.177698075 + "ts": 0.17745455 }, { "core_id": 0, @@ -17612,7 +17692,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1778132 + "ts": 0.1775467 }, { "core_id": 0, @@ -17620,7 +17700,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1778286 + "ts": 0.17756205 }, { "core_id": 0, @@ -17628,7 +17708,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.177843825 + "ts": 0.177577125 }, { "core_id": 1, @@ -17638,7 +17718,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1786694 + "ts": 0.1784259 }, { "core_id": 1, @@ -17646,7 +17726,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.178682925 + "ts": 0.1784394 }, { "core_id": 1, @@ -17654,7 +17734,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.178698075 + "ts": 0.178454675 }, { "core_id": 0, @@ -17664,7 +17744,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1788132 + "ts": 0.1785467 }, { "core_id": 0, @@ -17672,7 +17752,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1788287 + "ts": 0.17856205 }, { "core_id": 0, @@ -17680,7 +17760,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.178843775 + "ts": 0.17857715 }, { "core_id": 1, @@ -17690,7 +17770,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1796694 + "ts": 0.1794259 }, { "core_id": 1, @@ -17698,7 +17778,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.179682925 + "ts": 0.17943945 }, { "core_id": 1, @@ -17706,7 +17786,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.179698325 + "ts": 0.1794546 }, { "core_id": 0, @@ -17716,7 +17796,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1798132 + "ts": 0.1795467 }, { "core_id": 0, @@ -17724,7 +17804,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1798287 + "ts": 0.17956205 }, { "core_id": 0, @@ -17732,7 +17812,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.179843775 + "ts": 0.179577125 }, { "core_id": 1, @@ -17742,7 +17822,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1806694 + "ts": 0.1804259 }, { "core_id": 1, @@ -17750,7 +17830,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.180682975 + "ts": 0.1804394 }, { "core_id": 1, @@ -17758,7 +17838,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1806981 + "ts": 0.18045455 }, { "core_id": 0, @@ -17768,7 +17848,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1808132 + "ts": 0.1805467 }, { "core_id": 0, @@ -17776,7 +17856,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1808287 + "ts": 0.180566325 }, { "core_id": 0, @@ -17784,7 +17864,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.180843775 + "ts": 0.18058155 }, { "core_id": 1, @@ -17794,7 +17874,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1816694 + "ts": 0.1814259 }, { "core_id": 1, @@ -17802,7 +17882,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.181682925 + "ts": 0.1814394 }, { "core_id": 1, @@ -17810,7 +17890,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.181698075 + "ts": 0.18145455 }, { "core_id": 0, @@ -17820,7 +17900,59 @@ "params": { "irq_num": 5 }, - "ts": 0.1818132 + "ts": 0.1815467 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.18156205 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.181577125 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.1824259 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.1824394 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.182454675 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.1825467 }, { "core_id": 0, @@ -17828,9 +17960,9 @@ "id": 6, "in_irq": true, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.181828225 + "ts": 0.182561675 }, { "core_id": 1, @@ -17838,9 +17970,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.181828225 + "ts": 0.182561675 }, { "core_id": 0, @@ -17848,7 +17980,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.18184085 + "ts": 0.18257425 }, { "core_id": 0, @@ -17856,18 +17988,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.181856525 + "ts": 0.182589925 }, { - "addr": "0x3ffbb824", + "addr": "0x3ffbafe0", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -17879,16 +18011,16 @@ "id": 512, "in_irq": false, "size": 7, - "ts": 0.18189185 + "ts": 0.182624925 }, { - "addr": "0x3ffbb834", + "addr": "0x3ffbb014", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -17900,7 +18032,7 @@ "id": 512, "in_irq": false, "size": 14, - "ts": 0.181926275 + "ts": 0.182660425 }, { "core_id": 0, @@ -17910,10 +18042,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.1819433 + "ts": 0.18267735 }, { "core_id": 0, @@ -17923,10 +18055,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.1819593 + "ts": 0.182693275 }, { "core_id": 0, @@ -17934,8 +18066,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (490) example: Task[0x3ffb7aec]: allocated 14 bytes @ 0x3ffbb834\n", - "ts": 0.182029725 + "msg": "I (478) example: Task[0x3ffb72b4]: allocated 14 bytes @ 0x3ffbb014\n", + "ts": 0.18274805 }, { "core_id": 0, @@ -17943,8 +18075,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (490) example: Task[0x3ffb7aec]: allocated 14 bytes @ 0x3ffbb834\n", - "ts": 0.182029725 + "msg": "I (478) example: Task[0x3ffb72b4]: allocated 14 bytes @ 0x3ffbb014\n", + "ts": 0.18274805 }, { "core_id": 0, @@ -17954,10 +18086,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 0 }, - "ts": 0.182047475 + "ts": 0.18276155 }, { "core_id": 0, @@ -17965,9 +18097,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.1820607 + "ts": 0.182779025 }, { "core_id": 1, @@ -17975,9 +18107,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.1820607 + "ts": 0.182779025 }, { "core_id": 1, @@ -17987,7 +18119,7 @@ "params": { "irq_num": 31 }, - "ts": 0.182076925 + "ts": 0.182795275 }, { "core_id": 0, @@ -17997,7 +18129,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.1820878 + "ts": 0.1828061 }, { "core_id": 1, @@ -18005,7 +18137,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.18209855 + "ts": 0.182816975 }, { "core_id": 0, @@ -18015,7 +18147,7 @@ "params": { "irq_num": 30 }, - "ts": 0.1821124 + "ts": 0.1828308 }, { "core_id": 1, @@ -18023,9 +18155,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.182123275 + "ts": 0.18284165 }, { "core_id": 0, @@ -18033,7 +18165,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.18213415 + "ts": 0.1828525 }, { "core_id": 1, @@ -18043,10 +18175,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 4294967295 }, - "ts": 0.182146025 + "ts": 0.1828645 }, { "core_id": 0, @@ -18054,7 +18186,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.182156325 + "ts": 0.1828748 }, { "core_id": 1, @@ -18064,10 +18196,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.18216785 + "ts": 0.182886425 }, { "core_id": 1, @@ -18077,10 +18209,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.18218415 + "ts": 0.18290275 }, { "core_id": 1, @@ -18088,8 +18220,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (490) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb834\n", - "ts": 0.1822477 + "msg": "I (478) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb014\n", + "ts": 0.182950525 }, { "core_id": 1, @@ -18097,15 +18229,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (490) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb834\n", - "ts": 0.1822477 + "msg": "I (478) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb014\n", + "ts": 0.182950525 }, { - "addr": "0x3ffbb834", + "addr": "0x3ffbb014", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -18119,7 +18251,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.1822689 + "ts": 0.1829719 }, { "core_id": 1, @@ -18129,7 +18261,7 @@ "params": { "irq_num": 31 }, - "ts": 0.18230005 + "ts": 0.182999325 }, { "core_id": 1, @@ -18137,7 +18269,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.182311525 + "ts": 0.18301085 }, { "core_id": 1, @@ -18145,7 +18277,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.182328225 + "ts": 0.183027425 }, { "core_id": 1, @@ -18155,7 +18287,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1826694 + "ts": 0.1834259 }, { "core_id": 1, @@ -18163,7 +18295,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.18268285 + "ts": 0.18343945 }, { "core_id": 1, @@ -18171,7 +18303,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.182698425 + "ts": 0.18345515 }, { "core_id": 0, @@ -18181,7 +18313,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1828132 + "ts": 0.1835467 }, { "core_id": 0, @@ -18189,9 +18321,9 @@ "id": 6, "in_irq": true, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.182828225 + "ts": 0.18356165 }, { "core_id": 1, @@ -18199,9 +18331,29 @@ "id": 6, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.182828225 + "ts": 0.18356165 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 6, + "in_irq": true, + "params": { + "tid": 12296612 + }, + "ts": 0.18357355 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.18357355 }, { "core_id": 0, @@ -18209,7 +18361,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.18284085 + "ts": 0.1835861 }, { "core_id": 0, @@ -18217,18 +18369,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.182856525 + "ts": 0.183601775 }, { - "addr": "0x3ffbb834", + "addr": "0x3ffbb014", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -18240,16 +18392,16 @@ "id": 512, "in_irq": false, "size": 14, - "ts": 0.1828917 + "ts": 0.18363815 }, { - "addr": "0x3ffbb848", + "addr": "0x3ffbb028", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -18261,7 +18413,7 @@ "id": 512, "in_irq": false, "size": 28, - "ts": 0.182926225 + "ts": 0.183677725 }, { "core_id": 0, @@ -18271,10 +18423,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.18294325 + "ts": 0.18369465 }, { "core_id": 0, @@ -18284,10 +18436,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.18295925 + "ts": 0.183710675 }, { "core_id": 0, @@ -18295,8 +18447,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (491) example: Task[0x3ffb926c]: allocated 28 bytes @ 0x3ffbb848\n", - "ts": 0.183029675 + "msg": "I (479) example: Task[0x3ffb8a34]: allocated 28 bytes @ 0x3ffbb028\n", + "ts": 0.1837654 }, { "core_id": 0, @@ -18304,8 +18456,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (491) example: Task[0x3ffb926c]: allocated 28 bytes @ 0x3ffbb848\n", - "ts": 0.183029675 + "msg": "I (479) example: Task[0x3ffb8a34]: allocated 28 bytes @ 0x3ffbb028\n", + "ts": 0.1837654 }, { "core_id": 0, @@ -18315,10 +18467,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 0 }, - "ts": 0.183043225 + "ts": 0.183778825 }, { "core_id": 0, @@ -18326,9 +18478,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.18306065 + "ts": 0.183792075 }, { "core_id": 1, @@ -18336,9 +18488,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.18306065 + "ts": 0.183792075 }, { "core_id": 1, @@ -18348,7 +18500,7 @@ "params": { "irq_num": 31 }, - "ts": 0.183076975 + "ts": 0.183808675 }, { "core_id": 0, @@ -18358,7 +18510,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.183087825 + "ts": 0.18381945 }, { "core_id": 1, @@ -18366,7 +18518,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.183098575 + "ts": 0.183830375 }, { "core_id": 0, @@ -18376,7 +18528,7 @@ "params": { "irq_num": 30 }, - "ts": 0.1831123 + "ts": 0.183844225 }, { "core_id": 1, @@ -18384,9 +18536,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.18312315 + "ts": 0.18385615 }, { "core_id": 0, @@ -18394,7 +18546,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.183133975 + "ts": 0.183867325 }, { "core_id": 1, @@ -18404,18 +18556,20 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 4294967295 }, - "ts": 0.183145825 + "ts": 0.18387925 }, { "core_id": 0, - "ctx_name": "alloc1", - "id": 17, + "ctx_name": "alloc2", + "id": 4, "in_irq": false, - "params": {}, - "ts": 0.1831561 + "params": { + "tid": 12296612 + }, + "ts": 0.183891 }, { "core_id": 1, @@ -18425,10 +18579,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.183167575 + "ts": 0.183903625 }, { "core_id": 1, @@ -18438,158 +18592,19 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.183183875 + "ts": 0.18392605 }, { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (491) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb848\n", - "ts": 0.183247325 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (491) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb848\n", - "ts": 0.183247325 - }, - { - "addr": "0x3ffbb848", + "addr": "0x3ffbb048", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0" - ], - "core_id": 1, - "ctx_name": "free1", - "id": 513, - "in_irq": false, - "size": 0, - "ts": 0.1832686 - }, - { - "core_id": 1, - "ctx_name": "FROM_CPU1", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 31 - }, - "ts": 0.1832956 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.183307025 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.1833236 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.1836694 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.18368295 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.183698525 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.1838132 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 6, - "in_irq": true, - "params": { - "tid": 12298716 - }, - "ts": 0.183828325 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 6, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.183828325 - }, - { - "core_id": 0, - "ctx_name": "alloc1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.183840975 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 4, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.18385665 - }, - { - "addr": "0x3ffbb848", - "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -18601,16 +18616,34 @@ "id": 512, "in_irq": false, "size": 21, - "ts": 0.183892175 + "ts": 0.1839375 }, { - "addr": "0x3ffbb864", + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (479) example: Task[0x3ffb961c]: free memory @ 0x3ffbb028\n", + "ts": 0.18397865 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (479) example: Task[0x3ffb961c]: free memory @ 0x3ffbb028\n", + "ts": 0.18397865 + }, + { + "addr": "0x3ffbb064", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -18622,7 +18655,28 @@ "id": 512, "in_irq": false, "size": 42, - "ts": 0.18393085 + "ts": 0.183990225 + }, + { + "addr": "0x3ffbb028", + "callers": [ + "0x4008da24", + "0x400d3c72", + "0x400880dc", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0" + ], + "core_id": 1, + "ctx_name": "free1", + "id": 513, + "in_irq": false, + "size": 0, + "ts": 0.18400445 }, { "core_id": 0, @@ -18632,10 +18686,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.18394775 + "ts": 0.184017025 }, { "core_id": 0, @@ -18645,61 +18699,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.183963725 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (492) example: Task[0x3ffba9dc]: allocated 42 bytes @ 0x3ffbb864\n", - "ts": 0.184034075 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (492) example: Task[0x3ffba9dc]: allocated 42 bytes @ 0x3ffbb864\n", - "ts": 0.184034075 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12299072, - "xTicksToWait": 0 - }, - "ts": 0.1840478 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 6, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.184061025 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 6, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.184061025 + "ts": 0.184036875 }, { "core_id": 1, @@ -18709,7 +18712,84 @@ "params": { "irq_num": 31 }, - "ts": 0.184077325 + "ts": 0.1840478 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.184059325 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.184077275 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (479) example: Task[0x3ffba1a4]: allocated 42 bytes @ 0x3ffbb064\n", + "ts": 0.18409505 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (479) example: Task[0x3ffba1a4]: allocated 42 bytes @ 0x3ffbb064\n", + "ts": 0.18409505 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12296968, + "xTicksToWait": 0 + }, + "ts": 0.18411265 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.184126025 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.184126025 + }, + { + "core_id": 1, + "ctx_name": "FROM_CPU1", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 31 + }, + "ts": 0.184142375 }, { "core_id": 0, @@ -18719,7 +18799,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.184088175 + "ts": 0.184153225 }, { "core_id": 1, @@ -18727,7 +18807,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.18409895 + "ts": 0.18416405 }, { "core_id": 0, @@ -18737,7 +18817,7 @@ "params": { "irq_num": 30 }, - "ts": 0.184112675 + "ts": 0.18417785 }, { "core_id": 1, @@ -18745,9 +18825,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.184125 + "ts": 0.1841886 }, { "core_id": 0, @@ -18755,7 +18835,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.184135825 + "ts": 0.184199375 }, { "core_id": 1, @@ -18765,10 +18845,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 4294967295 }, - "ts": 0.1841477 + "ts": 0.184211475 }, { "core_id": 0, @@ -18776,7 +18856,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.184158975 + "ts": 0.184222675 }, { "core_id": 1, @@ -18786,10 +18866,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.184170625 + "ts": 0.184235025 }, { "core_id": 1, @@ -18799,10 +18879,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.184190325 + "ts": 0.18425125 }, { "core_id": 1, @@ -18810,8 +18890,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (492) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb864\n", - "ts": 0.184253875 + "msg": "I (479) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb064\n", + "ts": 0.18429925 }, { "core_id": 1, @@ -18819,15 +18899,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (492) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb864\n", - "ts": 0.184253875 + "msg": "I (479) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb064\n", + "ts": 0.18429925 }, { - "addr": "0x3ffbb864", + "addr": "0x3ffbb064", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -18841,7 +18921,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.184275075 + "ts": 0.184320675 }, { "core_id": 1, @@ -18851,7 +18931,7 @@ "params": { "irq_num": 31 }, - "ts": 0.184301975 + "ts": 0.1843521 }, { "core_id": 1, @@ -18859,7 +18939,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1843134 + "ts": 0.18436355 }, { "core_id": 1, @@ -18867,7 +18947,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.184329975 + "ts": 0.18438025 }, { "core_id": 1, @@ -18877,7 +18957,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1846694 + "ts": 0.1844259 }, { "core_id": 1, @@ -18885,7 +18965,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.18468295 + "ts": 0.18443945 }, { "core_id": 1, @@ -18893,7 +18973,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.184698525 + "ts": 0.18445515 }, { "core_id": 0, @@ -18903,7 +18983,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1848132 + "ts": 0.1845467 }, { "core_id": 0, @@ -18911,7 +18991,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1848287 + "ts": 0.1845621 }, { "core_id": 0, @@ -18919,7 +18999,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.184843775 + "ts": 0.184577425 }, { "core_id": 1, @@ -18929,7 +19009,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1856694 + "ts": 0.1854259 }, { "core_id": 1, @@ -18937,7 +19017,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.185682925 + "ts": 0.1854394 }, { "core_id": 1, @@ -18945,7 +19025,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.185698325 + "ts": 0.18545455 }, { "core_id": 0, @@ -18955,7 +19035,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1858132 + "ts": 0.1855467 }, { "core_id": 0, @@ -18963,7 +19043,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1858287 + "ts": 0.18556205 }, { "core_id": 0, @@ -18971,7 +19051,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.185843775 + "ts": 0.185577125 }, { "core_id": 1, @@ -18981,7 +19061,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1866694 + "ts": 0.1864259 }, { "core_id": 1, @@ -18989,7 +19069,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.186682975 + "ts": 0.1864394 }, { "core_id": 1, @@ -18997,7 +19077,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1866981 + "ts": 0.186454675 }, { "core_id": 0, @@ -19007,7 +19087,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1868132 + "ts": 0.1865467 }, { "core_id": 0, @@ -19015,7 +19095,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1868287 + "ts": 0.18656205 }, { "core_id": 0, @@ -19023,7 +19103,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.186843775 + "ts": 0.18657715 }, { "core_id": 1, @@ -19033,7 +19113,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1876694 + "ts": 0.1874259 }, { "core_id": 1, @@ -19041,7 +19121,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.187682925 + "ts": 0.18743945 }, { "core_id": 1, @@ -19049,7 +19129,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.187698075 + "ts": 0.1874546 }, { "core_id": 0, @@ -19059,7 +19139,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1878132 + "ts": 0.1875467 }, { "core_id": 0, @@ -19067,7 +19147,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1878286 + "ts": 0.18756205 }, { "core_id": 0, @@ -19075,7 +19155,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.187843825 + "ts": 0.187577125 }, { "core_id": 1, @@ -19085,7 +19165,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1886694 + "ts": 0.1884259 }, { "core_id": 1, @@ -19093,7 +19173,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.188682925 + "ts": 0.1884394 }, { "core_id": 1, @@ -19101,7 +19181,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.188698075 + "ts": 0.18845455 }, { "core_id": 0, @@ -19111,7 +19191,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1888132 + "ts": 0.1885467 }, { "core_id": 0, @@ -19119,7 +19199,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1888287 + "ts": 0.1885621 }, { "core_id": 0, @@ -19127,7 +19207,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.188843775 + "ts": 0.188577425 }, { "core_id": 1, @@ -19137,7 +19217,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1896694 + "ts": 0.1894259 }, { "core_id": 1, @@ -19145,7 +19225,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.189682925 + "ts": 0.1894394 }, { "core_id": 1, @@ -19153,7 +19233,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.189698325 + "ts": 0.18945455 }, { "core_id": 0, @@ -19163,7 +19243,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1898132 + "ts": 0.1895467 }, { "core_id": 0, @@ -19171,7 +19251,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1898287 + "ts": 0.18956205 }, { "core_id": 0, @@ -19179,7 +19259,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1898481 + "ts": 0.189577125 }, { "core_id": 1, @@ -19189,7 +19269,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1906694 + "ts": 0.1904259 }, { "core_id": 1, @@ -19197,7 +19277,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.190682925 + "ts": 0.1904394 }, { "core_id": 1, @@ -19205,7 +19285,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.190698075 + "ts": 0.190454675 }, { "core_id": 0, @@ -19215,7 +19295,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1908132 + "ts": 0.1905467 }, { "core_id": 0, @@ -19223,7 +19303,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1908287 + "ts": 0.19056205 }, { "core_id": 0, @@ -19231,7 +19311,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.190843775 + "ts": 0.19057715 }, { "core_id": 1, @@ -19241,7 +19321,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1916694 + "ts": 0.1914259 }, { "core_id": 1, @@ -19249,7 +19329,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.191682925 + "ts": 0.19143945 }, { "core_id": 1, @@ -19257,7 +19337,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.191698325 + "ts": 0.1914546 }, { "core_id": 0, @@ -19267,7 +19347,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1918132 + "ts": 0.1915467 }, { "core_id": 0, @@ -19275,7 +19355,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1918287 + "ts": 0.19156205 }, { "core_id": 0, @@ -19283,7 +19363,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.191843775 + "ts": 0.191577125 }, { "core_id": 1, @@ -19293,7 +19373,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1926694 + "ts": 0.1924259 }, { "core_id": 1, @@ -19301,7 +19381,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.192682975 + "ts": 0.1924394 }, { "core_id": 1, @@ -19309,7 +19389,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1926981 + "ts": 0.19245455 }, { "core_id": 0, @@ -19319,7 +19399,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1928132 + "ts": 0.1925467 }, { "core_id": 0, @@ -19327,7 +19407,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1928287 + "ts": 0.1925621 }, { "core_id": 0, @@ -19335,7 +19415,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.192843775 + "ts": 0.192577425 }, { "core_id": 1, @@ -19345,7 +19425,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1936694 + "ts": 0.1934259 }, { "core_id": 1, @@ -19353,7 +19433,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.193682925 + "ts": 0.1934394 }, { "core_id": 1, @@ -19361,7 +19441,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.193698075 + "ts": 0.19345455 }, { "core_id": 0, @@ -19371,7 +19451,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1938132 + "ts": 0.1935467 }, { "core_id": 0, @@ -19379,7 +19459,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1938286 + "ts": 0.19356205 }, { "core_id": 0, @@ -19387,7 +19467,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.193843825 + "ts": 0.193577125 }, { "core_id": 1, @@ -19397,7 +19477,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1946694 + "ts": 0.1944259 }, { "core_id": 1, @@ -19405,7 +19485,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.194682925 + "ts": 0.19444365 }, { "core_id": 1, @@ -19413,7 +19493,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.194698075 + "ts": 0.1944588 }, { "core_id": 0, @@ -19423,7 +19503,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1948132 + "ts": 0.1945467 }, { "core_id": 0, @@ -19431,7 +19511,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1948287 + "ts": 0.19456205 }, { "core_id": 0, @@ -19439,7 +19519,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.194843775 + "ts": 0.194577125 }, { "core_id": 1, @@ -19449,7 +19529,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1956694 + "ts": 0.1954259 }, { "core_id": 1, @@ -19457,7 +19537,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.195682925 + "ts": 0.1954394 }, { "core_id": 1, @@ -19465,7 +19545,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.195698325 + "ts": 0.19545455 }, { "core_id": 0, @@ -19475,7 +19555,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1958132 + "ts": 0.1955467 }, { "core_id": 0, @@ -19483,7 +19563,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1958287 + "ts": 0.1955621 }, { "core_id": 0, @@ -19491,7 +19571,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.195843775 + "ts": 0.195577425 }, { "core_id": 1, @@ -19501,7 +19581,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1966694 + "ts": 0.1964259 }, { "core_id": 1, @@ -19509,7 +19589,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.196682975 + "ts": 0.1964394 }, { "core_id": 1, @@ -19517,7 +19597,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1966981 + "ts": 0.19645455 }, { "core_id": 0, @@ -19527,7 +19607,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1968132 + "ts": 0.1965467 }, { "core_id": 0, @@ -19535,7 +19615,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1968287 + "ts": 0.19656205 }, { "core_id": 0, @@ -19543,7 +19623,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.196843775 + "ts": 0.196577125 }, { "core_id": 1, @@ -19553,7 +19633,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1976694 + "ts": 0.1974259 }, { "core_id": 1, @@ -19561,7 +19641,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.197682925 + "ts": 0.1974394 }, { "core_id": 1, @@ -19569,7 +19649,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.197698075 + "ts": 0.197454675 }, { "core_id": 0, @@ -19579,7 +19659,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1978132 + "ts": 0.1975467 }, { "core_id": 0, @@ -19587,7 +19667,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1978286 + "ts": 0.19756205 }, { "core_id": 0, @@ -19595,7 +19675,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.197843825 + "ts": 0.19757715 }, { "core_id": 1, @@ -19605,7 +19685,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1986694 + "ts": 0.1984259 }, { "core_id": 1, @@ -19613,7 +19693,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.198682925 + "ts": 0.19843945 }, { "core_id": 1, @@ -19621,7 +19701,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.198698075 + "ts": 0.1984546 }, { "core_id": 0, @@ -19631,7 +19711,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1988132 + "ts": 0.1985467 }, { "core_id": 0, @@ -19639,7 +19719,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1988287 + "ts": 0.19856205 }, { "core_id": 0, @@ -19647,7 +19727,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.198843775 + "ts": 0.198577125 }, { "core_id": 1, @@ -19657,7 +19737,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1996694 + "ts": 0.1994259 }, { "core_id": 1, @@ -19665,7 +19745,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.199682925 + "ts": 0.1994394 }, { "core_id": 1, @@ -19673,7 +19753,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.199698325 + "ts": 0.19945455 }, { "core_id": 0, @@ -19683,7 +19763,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1998132 + "ts": 0.1995467 }, { "core_id": 0, @@ -19691,7 +19771,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1998287 + "ts": 0.1995621 }, { "core_id": 0, @@ -19699,7 +19779,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.199843775 + "ts": 0.199577425 }, { "core_id": 1, @@ -19709,7 +19789,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2006694 + "ts": 0.2004259 }, { "core_id": 1, @@ -19717,7 +19797,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.200682975 + "ts": 0.2004394 }, { "core_id": 1, @@ -19725,7 +19805,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2006981 + "ts": 0.20045455 }, { "core_id": 0, @@ -19735,7 +19815,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2008132 + "ts": 0.2005467 }, { "core_id": 0, @@ -19743,7 +19823,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2008287 + "ts": 0.20056205 }, { "core_id": 0, @@ -19751,7 +19831,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.200843775 + "ts": 0.200577125 }, { "core_id": 1, @@ -19761,7 +19841,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2016694 + "ts": 0.2014259 }, { "core_id": 1, @@ -19769,7 +19849,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.201682925 + "ts": 0.2014394 }, { "core_id": 1, @@ -19777,7 +19857,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.201698075 + "ts": 0.201454675 }, { "core_id": 0, @@ -19787,7 +19867,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2018132 + "ts": 0.2015467 }, { "core_id": 0, @@ -19795,7 +19875,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2018286 + "ts": 0.20156205 }, { "core_id": 0, @@ -19803,7 +19883,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.201843825 + "ts": 0.20157715 }, { "core_id": 1, @@ -19813,7 +19893,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2026694 + "ts": 0.2024259 }, { "core_id": 1, @@ -19821,7 +19901,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.202682925 + "ts": 0.20243945 }, { "core_id": 1, @@ -19829,7 +19909,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.202698325 + "ts": 0.2024546 }, { "core_id": 0, @@ -19839,7 +19919,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2028132 + "ts": 0.2025467 }, { "core_id": 0, @@ -19847,7 +19927,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2028287 + "ts": 0.20256205 }, { "core_id": 0, @@ -19855,7 +19935,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.202843775 + "ts": 0.202577125 }, { "core_id": 1, @@ -19865,7 +19945,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2036694 + "ts": 0.2034259 }, { "core_id": 1, @@ -19873,7 +19953,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.203682975 + "ts": 0.2034394 }, { "core_id": 1, @@ -19881,7 +19961,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2036981 + "ts": 0.20345455 }, { "core_id": 0, @@ -19891,7 +19971,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2038132 + "ts": 0.2035467 }, { "core_id": 0, @@ -19899,7 +19979,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2038287 + "ts": 0.2035621 }, { "core_id": 0, @@ -19907,7 +19987,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.203843775 + "ts": 0.203577425 }, { "core_id": 1, @@ -19917,7 +19997,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2046694 + "ts": 0.2044259 }, { "core_id": 1, @@ -19925,7 +20005,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.204682925 + "ts": 0.2044394 }, { "core_id": 1, @@ -19933,7 +20013,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.204698075 + "ts": 0.20445455 }, { "core_id": 0, @@ -19943,7 +20023,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2048132 + "ts": 0.2045467 }, { "core_id": 0, @@ -19951,7 +20031,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2048286 + "ts": 0.20456205 }, { "core_id": 0, @@ -19959,7 +20039,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.204843825 + "ts": 0.204577125 }, { "core_id": 1, @@ -19969,7 +20049,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2056694 + "ts": 0.2054259 }, { "core_id": 1, @@ -19977,7 +20057,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.205682925 + "ts": 0.2054394 }, { "core_id": 1, @@ -19985,7 +20065,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.205698075 + "ts": 0.205454675 }, { "core_id": 0, @@ -19995,7 +20075,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2058132 + "ts": 0.2055467 }, { "core_id": 0, @@ -20003,7 +20083,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2058287 + "ts": 0.20556205 }, { "core_id": 0, @@ -20011,7 +20091,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.205843775 + "ts": 0.20557715 }, { "core_id": 1, @@ -20021,7 +20101,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2066694 + "ts": 0.2064259 }, { "core_id": 1, @@ -20029,7 +20109,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.206682925 + "ts": 0.206443675 }, { "core_id": 1, @@ -20037,7 +20117,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.206698325 + "ts": 0.206458925 }, { "core_id": 0, @@ -20047,7 +20127,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2068132 + "ts": 0.2065467 }, { "core_id": 0, @@ -20055,7 +20135,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2068287 + "ts": 0.20656205 }, { "core_id": 0, @@ -20063,7 +20143,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.206843775 + "ts": 0.206577125 }, { "core_id": 1, @@ -20073,7 +20153,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2076694 + "ts": 0.2074259 }, { "core_id": 1, @@ -20081,7 +20161,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.207682975 + "ts": 0.2074394 }, { "core_id": 1, @@ -20089,7 +20169,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2076981 + "ts": 0.20745455 }, { "core_id": 0, @@ -20099,7 +20179,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2078132 + "ts": 0.2075467 }, { "core_id": 0, @@ -20107,7 +20187,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2078287 + "ts": 0.2075621 }, { "core_id": 0, @@ -20115,7 +20195,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.207843775 + "ts": 0.207577425 }, { "core_id": 1, @@ -20125,7 +20205,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2086694 + "ts": 0.2084259 }, { "core_id": 1, @@ -20133,7 +20213,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.208682925 + "ts": 0.2084394 }, { "core_id": 1, @@ -20141,7 +20221,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.208698075 + "ts": 0.20845455 }, { "core_id": 0, @@ -20151,7 +20231,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2088132 + "ts": 0.2085467 }, { "core_id": 0, @@ -20159,7 +20239,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2088286 + "ts": 0.20856205 }, { "core_id": 0, @@ -20167,7 +20247,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.208843825 + "ts": 0.208577125 }, { "core_id": 1, @@ -20177,7 +20257,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2096694 + "ts": 0.2094259 }, { "core_id": 1, @@ -20185,7 +20265,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.209682925 + "ts": 0.2094394 }, { "core_id": 1, @@ -20193,7 +20273,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.209698075 + "ts": 0.209454675 }, { "core_id": 0, @@ -20203,7 +20283,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2098132 + "ts": 0.2095467 }, { "core_id": 0, @@ -20211,7 +20291,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2098287 + "ts": 0.20956205 }, { "core_id": 0, @@ -20219,7 +20299,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.209843775 + "ts": 0.20957715 }, { "core_id": 1, @@ -20229,7 +20309,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2106694 + "ts": 0.2104259 }, { "core_id": 1, @@ -20237,7 +20317,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.210682925 + "ts": 0.21043945 }, { "core_id": 1, @@ -20245,7 +20325,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.210698325 + "ts": 0.2104546 }, { "core_id": 0, @@ -20255,7 +20335,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2108132 + "ts": 0.2105467 }, { "core_id": 0, @@ -20263,7 +20343,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2108287 + "ts": 0.21056205 }, { "core_id": 0, @@ -20271,7 +20351,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.210843775 + "ts": 0.210577125 }, { "core_id": 1, @@ -20281,7 +20361,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2116694 + "ts": 0.2114259 }, { "core_id": 1, @@ -20289,7 +20369,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.211682975 + "ts": 0.2114394 }, { "core_id": 1, @@ -20297,7 +20377,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2116981 + "ts": 0.21145455 }, { "core_id": 0, @@ -20307,7 +20387,59 @@ "params": { "irq_num": 5 }, - "ts": 0.2118132 + "ts": 0.2115467 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.2115621 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.211577425 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.2124259 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.2124394 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.21245455 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.2125467 }, { "core_id": 0, @@ -20315,9 +20447,9 @@ "id": 6, "in_irq": true, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.211828325 + "ts": 0.21256165 }, { "core_id": 1, @@ -20325,9 +20457,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.211828325 + "ts": 0.21256165 }, { "core_id": 0, @@ -20335,7 +20467,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.211840975 + "ts": 0.2125743 }, { "core_id": 0, @@ -20343,18 +20475,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.21185665 + "ts": 0.212590225 }, { - "addr": "0x3ffbb864", + "addr": "0x3ffbb028", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -20366,16 +20498,16 @@ "id": 512, "in_irq": false, "size": 8, - "ts": 0.211892175 + "ts": 0.212626475 }, { - "addr": "0x3ffbb874", + "addr": "0x3ffbb064", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -20387,7 +20519,7 @@ "id": 512, "in_irq": false, "size": 16, - "ts": 0.21193065 + "ts": 0.21266205 }, { "core_id": 0, @@ -20397,10 +20529,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.21194755 + "ts": 0.212679025 }, { "core_id": 0, @@ -20410,10 +20542,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.21196355 + "ts": 0.212695 }, { "core_id": 0, @@ -20421,8 +20553,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (520) example: Task[0x3ffb7aec]: allocated 16 bytes @ 0x3ffbb874\n", - "ts": 0.212033875 + "msg": "I (508) example: Task[0x3ffb72b4]: allocated 16 bytes @ 0x3ffbb064\n", + "ts": 0.2127534 }, { "core_id": 0, @@ -20430,8 +20562,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (520) example: Task[0x3ffb7aec]: allocated 16 bytes @ 0x3ffbb874\n", - "ts": 0.212033875 + "msg": "I (508) example: Task[0x3ffb72b4]: allocated 16 bytes @ 0x3ffbb064\n", + "ts": 0.2127534 }, { "core_id": 0, @@ -20441,10 +20573,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 0 }, - "ts": 0.212047475 + "ts": 0.2127669 }, { "core_id": 0, @@ -20452,9 +20584,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.2120607 + "ts": 0.21278005 }, { "core_id": 1, @@ -20462,9 +20594,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.2120607 + "ts": 0.21278005 }, { "core_id": 1, @@ -20474,7 +20606,7 @@ "params": { "irq_num": 31 }, - "ts": 0.21207695 + "ts": 0.212796275 }, { "core_id": 0, @@ -20484,7 +20616,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.2120878 + "ts": 0.2128071 }, { "core_id": 1, @@ -20492,7 +20624,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.212098575 + "ts": 0.212817975 }, { "core_id": 0, @@ -20502,7 +20634,7 @@ "params": { "irq_num": 30 }, - "ts": 0.212112375 + "ts": 0.212831875 }, { "core_id": 1, @@ -20510,9 +20642,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.212123175 + "ts": 0.212842675 }, { "core_id": 0, @@ -20520,7 +20652,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.212134025 + "ts": 0.2128534 }, { "core_id": 1, @@ -20530,10 +20662,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 4294967295 }, - "ts": 0.2121459 + "ts": 0.212865525 }, { "core_id": 0, @@ -20541,7 +20673,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2121562 + "ts": 0.212875725 }, { "core_id": 1, @@ -20551,10 +20683,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.212167725 + "ts": 0.212887475 }, { "core_id": 1, @@ -20564,10 +20696,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.21218815 + "ts": 0.212903825 }, { "core_id": 1, @@ -20575,8 +20707,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (520) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb874\n", - "ts": 0.2122517 + "msg": "I (508) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb064\n", + "ts": 0.2129517 }, { "core_id": 1, @@ -20584,15 +20716,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (520) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb874\n", - "ts": 0.2122517 + "msg": "I (508) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb064\n", + "ts": 0.2129517 }, { - "addr": "0x3ffbb874", + "addr": "0x3ffbb064", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -20606,7 +20738,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.2122729 + "ts": 0.2129729 }, { "core_id": 1, @@ -20616,7 +20748,7 @@ "params": { "irq_num": 31 }, - "ts": 0.2122998 + "ts": 0.213004375 }, { "core_id": 1, @@ -20624,7 +20756,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.212311225 + "ts": 0.213015825 }, { "core_id": 1, @@ -20632,7 +20764,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2123278 + "ts": 0.213032525 }, { "core_id": 1, @@ -20642,7 +20774,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2126694 + "ts": 0.2134259 }, { "core_id": 1, @@ -20650,7 +20782,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.21268295 + "ts": 0.21343945 }, { "core_id": 1, @@ -20658,7 +20790,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.212698525 + "ts": 0.21345515 }, { "core_id": 0, @@ -20668,7 +20800,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2128132 + "ts": 0.2135467 }, { "core_id": 0, @@ -20676,9 +20808,9 @@ "id": 6, "in_irq": true, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.212828325 + "ts": 0.2135617 }, { "core_id": 1, @@ -20686,9 +20818,29 @@ "id": 6, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.212828325 + "ts": 0.2135617 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 6, + "in_irq": true, + "params": { + "tid": 12296612 + }, + "ts": 0.21357355 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.21357355 }, { "core_id": 0, @@ -20696,7 +20848,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.212840975 + "ts": 0.21358605 }, { "core_id": 0, @@ -20704,18 +20856,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.212856775 + "ts": 0.213601725 }, { - "addr": "0x3ffbb874", + "addr": "0x3ffbb064", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -20727,16 +20879,16 @@ "id": 512, "in_irq": false, "size": 16, - "ts": 0.212892175 + "ts": 0.21363815 }, { - "addr": "0x3ffbb888", + "addr": "0x3ffbb078", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -20748,7 +20900,7 @@ "id": 512, "in_irq": false, "size": 32, - "ts": 0.212926875 + "ts": 0.213673775 }, { "core_id": 0, @@ -20758,10 +20910,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.2129438 + "ts": 0.2136907 }, { "core_id": 0, @@ -20771,10 +20923,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.212963975 + "ts": 0.213706725 }, { "core_id": 0, @@ -20782,8 +20934,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (521) example: Task[0x3ffb926c]: allocated 32 bytes @ 0x3ffbb888\n", - "ts": 0.213034425 + "msg": "I (509) example: Task[0x3ffb8a34]: allocated 32 bytes @ 0x3ffbb078\n", + "ts": 0.21376145 }, { "core_id": 0, @@ -20791,8 +20943,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (521) example: Task[0x3ffb926c]: allocated 32 bytes @ 0x3ffbb888\n", - "ts": 0.213034425 + "msg": "I (509) example: Task[0x3ffb8a34]: allocated 32 bytes @ 0x3ffbb078\n", + "ts": 0.21376145 }, { "core_id": 0, @@ -20802,10 +20954,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 0 }, - "ts": 0.21304805 + "ts": 0.21377875 }, { "core_id": 0, @@ -20813,9 +20965,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.21306125 + "ts": 0.213792 }, { "core_id": 1, @@ -20823,9 +20975,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.21306125 + "ts": 0.213792 }, { "core_id": 1, @@ -20835,7 +20987,7 @@ "params": { "irq_num": 31 }, - "ts": 0.21307755 + "ts": 0.21380835 }, { "core_id": 0, @@ -20845,7 +20997,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.2130884 + "ts": 0.2138192 }, { "core_id": 1, @@ -20853,7 +21005,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.21309915 + "ts": 0.213830025 }, { "core_id": 0, @@ -20863,7 +21015,7 @@ "params": { "irq_num": 30 }, - "ts": 0.213112875 + "ts": 0.2138438 }, { "core_id": 1, @@ -20871,9 +21023,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.213123725 + "ts": 0.21385575 }, { "core_id": 0, @@ -20881,7 +21033,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.21313455 + "ts": 0.2138669 }, { "core_id": 1, @@ -20891,18 +21043,20 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 4294967295 }, - "ts": 0.213146575 + "ts": 0.21387885 }, { "core_id": 0, - "ctx_name": "alloc1", - "id": 17, + "ctx_name": "alloc2", + "id": 4, "in_irq": false, - "params": {}, - "ts": 0.21315695 + "params": { + "tid": 12296612 + }, + "ts": 0.2138905 }, { "core_id": 1, @@ -20912,10 +21066,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.21316835 + "ts": 0.2139022 }, { "core_id": 1, @@ -20925,158 +21079,19 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.21318475 + "ts": 0.2139208 }, { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (521) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb888\n", - "ts": 0.2132482 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (521) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb888\n", - "ts": 0.2132482 - }, - { - "addr": "0x3ffbb888", + "addr": "0x3ffbb09c", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0" - ], - "core_id": 1, - "ctx_name": "free1", - "id": 513, - "in_irq": false, - "size": 0, - "ts": 0.213273225 - }, - { - "core_id": 1, - "ctx_name": "FROM_CPU1", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 31 - }, - "ts": 0.213300225 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.21331165 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.213328225 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.2136694 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.21368295 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.213698525 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.2138132 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 6, - "in_irq": true, - "params": { - "tid": 12298716 - }, - "ts": 0.213828325 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 6, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.213828325 - }, - { - "core_id": 0, - "ctx_name": "alloc1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.213840975 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 4, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.21385665 - }, - { - "addr": "0x3ffbb888", - "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -21088,16 +21103,34 @@ "id": 512, "in_irq": false, "size": 24, - "ts": 0.213892175 + "ts": 0.213933875 }, { - "addr": "0x3ffbb8a4", + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (509) example: Task[0x3ffb961c]: free memory @ 0x3ffbb078\n", + "ts": 0.21397465 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (509) example: Task[0x3ffb961c]: free memory @ 0x3ffbb078\n", + "ts": 0.21397465 + }, + { + "addr": "0x3ffbb0b8", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -21109,7 +21142,28 @@ "id": 512, "in_irq": false, "size": 48, - "ts": 0.213926725 + "ts": 0.2139905 + }, + { + "addr": "0x3ffbb078", + "callers": [ + "0x4008da24", + "0x400d3c72", + "0x400880dc", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0" + ], + "core_id": 1, + "ctx_name": "free1", + "id": 513, + "in_irq": false, + "size": 0, + "ts": 0.2140048 }, { "core_id": 0, @@ -21119,10 +21173,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.213943625 + "ts": 0.214017225 }, { "core_id": 0, @@ -21132,61 +21186,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.213959625 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (522) example: Task[0x3ffba9dc]: allocated 48 bytes @ 0x3ffbb8a4\n", - "ts": 0.21402995 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (522) example: Task[0x3ffba9dc]: allocated 48 bytes @ 0x3ffbb8a4\n", - "ts": 0.21402995 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12299072, - "xTicksToWait": 0 - }, - "ts": 0.21405045 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 6, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.214063675 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 6, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.214063675 + "ts": 0.21403725 }, { "core_id": 1, @@ -21196,7 +21199,184 @@ "params": { "irq_num": 31 }, - "ts": 0.21408 + "ts": 0.214048175 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.214059725 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.214077675 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (509) example: Task[0x3ffba1a4]: allocated 48 bytes @ 0x3ffbb0b8\n", + "ts": 0.214095675 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (509) example: Task[0x3ffba1a4]: allocated 48 bytes @ 0x3ffbb0b8\n", + "ts": 0.214095675 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12296968, + "xTicksToWait": 0 + }, + "ts": 0.214109125 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.21565445 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.215666025 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 6, + "in_irq": true, + "params": { + "tid": 12299660 + }, + "ts": 0.215666025 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.215683825 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.21569495 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.21570585 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.2157175 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.215728 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.215738875 + }, + { + "core_id": 1, + "ctx_name": "FROM_CPU1", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 31 + }, + "ts": 0.2157498 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.21576155 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.2157723 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 4, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.21578375 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 4, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.215801425 }, { "core_id": 0, @@ -21206,43 +21386,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.21409085 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.2141016 - }, - { - "core_id": 0, - "ctx_name": "FROM_CPU0", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 30 - }, - "ts": 0.2141155 - }, - { - "core_id": 1, - "ctx_name": "free2", - "id": 4, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.214126375 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.2141372 + "ts": 0.21581525 }, { "core_id": 1, @@ -21252,18 +21396,20 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 4294967295 }, - "ts": 0.21414905 + "ts": 0.215827525 }, { "core_id": 0, - "ctx_name": "alloc2", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.21416035 + "ctx_name": "FROM_CPU0", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 30 + }, + "ts": 0.215838975 }, { "core_id": 1, @@ -21273,10 +21419,18 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.214171975 + "ts": 0.21585105 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.2158621 }, { "core_id": 1, @@ -21286,10 +21440,18 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.214188375 + "ts": 0.2158743 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.215885925 }, { "core_id": 1, @@ -21297,8 +21459,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (522) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb8a4\n", - "ts": 0.214251925 + "msg": "I (511) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb0b8\n", + "ts": 0.21593595 }, { "core_id": 1, @@ -21306,15 +21468,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (522) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb8a4\n", - "ts": 0.214251925 + "msg": "I (511) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb0b8\n", + "ts": 0.21593595 }, { - "addr": "0x3ffbb8a4", + "addr": "0x3ffbb0b8", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -21328,7 +21490,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.214273125 + "ts": 0.215957325 }, { "core_id": 1, @@ -21338,7 +21500,7 @@ "params": { "irq_num": 31 }, - "ts": 0.21430345 + "ts": 0.21598475 }, { "core_id": 1, @@ -21346,7 +21508,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.214314925 + "ts": 0.21599615 }, { "core_id": 1, @@ -21354,7 +21516,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.214331625 + "ts": 0.216012725 }, { "core_id": 1, @@ -21364,7 +21526,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2146694 + "ts": 0.2164259 }, { "core_id": 1, @@ -21372,7 +21534,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.21468285 + "ts": 0.2164394 }, { "core_id": 1, @@ -21380,7 +21542,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.214698425 + "ts": 0.216454975 }, { "core_id": 0, @@ -21390,7 +21552,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2148132 + "ts": 0.2165467 }, { "core_id": 0, @@ -21398,7 +21560,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2148286 + "ts": 0.2165621 }, { "core_id": 0, @@ -21406,7 +21568,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.214843825 + "ts": 0.216577425 }, { "core_id": 1, @@ -21416,7 +21578,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2156694 + "ts": 0.2174259 }, { "core_id": 1, @@ -21424,7 +21586,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.215682925 + "ts": 0.2174394 }, { "core_id": 1, @@ -21432,7 +21594,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.215698075 + "ts": 0.217454675 }, { "core_id": 0, @@ -21442,7 +21604,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2158132 + "ts": 0.2175467 }, { "core_id": 0, @@ -21450,7 +21612,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2158287 + "ts": 0.21756205 }, { "core_id": 0, @@ -21458,7 +21620,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.215843775 + "ts": 0.21757715 }, { "core_id": 1, @@ -21468,7 +21630,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2166694 + "ts": 0.2184259 }, { "core_id": 1, @@ -21476,7 +21638,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.216682925 + "ts": 0.21843945 }, { "core_id": 1, @@ -21484,7 +21646,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.216698325 + "ts": 0.2184546 }, { "core_id": 0, @@ -21494,7 +21656,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2168132 + "ts": 0.2185467 }, { "core_id": 0, @@ -21502,7 +21664,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2168287 + "ts": 0.21856205 }, { "core_id": 0, @@ -21510,7 +21672,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.216843775 + "ts": 0.218577125 }, { "core_id": 1, @@ -21520,7 +21682,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2176694 + "ts": 0.2194259 }, { "core_id": 1, @@ -21528,7 +21690,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.217682975 + "ts": 0.2194394 }, { "core_id": 1, @@ -21536,7 +21698,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2176981 + "ts": 0.21945455 }, { "core_id": 0, @@ -21546,7 +21708,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2178132 + "ts": 0.2195467 }, { "core_id": 0, @@ -21554,7 +21716,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2178287 + "ts": 0.2195621 }, { "core_id": 0, @@ -21562,7 +21724,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.217843775 + "ts": 0.219577425 }, { "core_id": 1, @@ -21572,7 +21734,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2186694 + "ts": 0.2204259 }, { "core_id": 1, @@ -21580,7 +21742,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.218682925 + "ts": 0.2204394 }, { "core_id": 1, @@ -21588,7 +21750,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.218698075 + "ts": 0.22045455 }, { "core_id": 0, @@ -21598,7 +21760,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2188132 + "ts": 0.2205467 }, { "core_id": 0, @@ -21606,7 +21768,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2188286 + "ts": 0.22056205 }, { "core_id": 0, @@ -21614,7 +21776,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.218843825 + "ts": 0.220577125 }, { "core_id": 1, @@ -21624,7 +21786,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2196694 + "ts": 0.2214259 }, { "core_id": 1, @@ -21632,7 +21794,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.219682925 + "ts": 0.2214394 }, { "core_id": 1, @@ -21640,7 +21802,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.219698075 + "ts": 0.221454675 }, { "core_id": 0, @@ -21650,7 +21812,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2198132 + "ts": 0.2215467 }, { "core_id": 0, @@ -21658,7 +21820,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2198287 + "ts": 0.22156205 }, { "core_id": 0, @@ -21666,7 +21828,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.219843775 + "ts": 0.22157715 }, { "core_id": 1, @@ -21676,7 +21838,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2206694 + "ts": 0.2224259 }, { "core_id": 1, @@ -21684,7 +21846,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.220682925 + "ts": 0.22243945 }, { "core_id": 1, @@ -21692,7 +21854,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.220698325 + "ts": 0.2224546 }, { "core_id": 0, @@ -21702,7 +21864,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2208132 + "ts": 0.2225467 }, { "core_id": 0, @@ -21710,7 +21872,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2208287 + "ts": 0.22256205 }, { "core_id": 0, @@ -21718,7 +21880,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.220843775 + "ts": 0.222577125 }, { "core_id": 1, @@ -21728,7 +21890,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2216694 + "ts": 0.2234259 }, { "core_id": 1, @@ -21736,7 +21898,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.221682975 + "ts": 0.2234394 }, { "core_id": 1, @@ -21744,7 +21906,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2216981 + "ts": 0.22345455 }, { "core_id": 0, @@ -21754,7 +21916,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2218132 + "ts": 0.2235467 }, { "core_id": 0, @@ -21762,7 +21924,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2218287 + "ts": 0.2235621 }, { "core_id": 0, @@ -21770,7 +21932,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.221843775 + "ts": 0.223577425 }, { "core_id": 1, @@ -21780,7 +21942,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2226694 + "ts": 0.2244259 }, { "core_id": 1, @@ -21788,7 +21950,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.222682925 + "ts": 0.2244394 }, { "core_id": 1, @@ -21796,7 +21958,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.222698075 + "ts": 0.22445455 }, { "core_id": 0, @@ -21806,7 +21968,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2228132 + "ts": 0.2245467 }, { "core_id": 0, @@ -21814,7 +21976,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2228286 + "ts": 0.22456205 }, { "core_id": 0, @@ -21822,7 +21984,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.222843825 + "ts": 0.224577125 }, { "core_id": 1, @@ -21832,7 +21994,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2236694 + "ts": 0.2254259 }, { "core_id": 1, @@ -21840,7 +22002,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.223682925 + "ts": 0.2254394 }, { "core_id": 1, @@ -21848,7 +22010,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.223698075 + "ts": 0.225454675 }, { "core_id": 0, @@ -21858,7 +22020,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2238132 + "ts": 0.2255467 }, { "core_id": 0, @@ -21866,7 +22028,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2238287 + "ts": 0.22556205 }, { "core_id": 0, @@ -21874,7 +22036,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.223843775 + "ts": 0.22557715 }, { "core_id": 1, @@ -21884,7 +22046,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2246694 + "ts": 0.2264259 }, { "core_id": 1, @@ -21892,7 +22054,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.224687175 + "ts": 0.22643945 }, { "core_id": 1, @@ -21900,7 +22062,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.224702325 + "ts": 0.2264546 }, { "core_id": 0, @@ -21910,7 +22072,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2248132 + "ts": 0.2265467 }, { "core_id": 0, @@ -21918,7 +22080,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2248287 + "ts": 0.22656205 }, { "core_id": 0, @@ -21926,7 +22088,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.224843775 + "ts": 0.226577125 }, { "core_id": 1, @@ -21936,7 +22098,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2256694 + "ts": 0.2274259 }, { "core_id": 1, @@ -21944,7 +22106,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.225682925 + "ts": 0.2274394 }, { "core_id": 1, @@ -21952,7 +22114,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.225698075 + "ts": 0.22745455 }, { "core_id": 0, @@ -21962,7 +22124,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2258132 + "ts": 0.2275467 }, { "core_id": 0, @@ -21970,7 +22132,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2258286 + "ts": 0.2275621 }, { "core_id": 0, @@ -21978,7 +22140,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.225843825 + "ts": 0.227577425 }, { "core_id": 1, @@ -21988,7 +22150,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2266694 + "ts": 0.2284259 }, { "core_id": 1, @@ -21996,7 +22158,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.226682925 + "ts": 0.2284394 }, { "core_id": 1, @@ -22004,7 +22166,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.226698075 + "ts": 0.22845455 }, { "core_id": 0, @@ -22014,7 +22176,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2268132 + "ts": 0.2285467 }, { "core_id": 0, @@ -22022,7 +22184,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2268287 + "ts": 0.22856205 }, { "core_id": 0, @@ -22030,7 +22192,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.226843775 + "ts": 0.228577125 }, { "core_id": 1, @@ -22040,7 +22202,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2276694 + "ts": 0.2294259 }, { "core_id": 1, @@ -22048,7 +22210,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.227682925 + "ts": 0.229443675 }, { "core_id": 1, @@ -22056,7 +22218,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.227698325 + "ts": 0.229458825 }, { "core_id": 0, @@ -22066,7 +22228,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2278132 + "ts": 0.2295467 }, { "core_id": 0, @@ -22074,7 +22236,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2278287 + "ts": 0.22956205 }, { "core_id": 0, @@ -22082,7 +22244,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.227843775 + "ts": 0.229577125 }, { "core_id": 1, @@ -22092,7 +22254,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2286694 + "ts": 0.2304259 }, { "core_id": 1, @@ -22100,7 +22262,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.228682975 + "ts": 0.2304394 }, { "core_id": 1, @@ -22108,7 +22270,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2286981 + "ts": 0.23045455 }, { "core_id": 0, @@ -22118,7 +22280,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2288132 + "ts": 0.2305467 }, { "core_id": 0, @@ -22126,7 +22288,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2288287 + "ts": 0.2305621 }, { "core_id": 0, @@ -22134,7 +22296,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.228843775 + "ts": 0.230577425 }, { "core_id": 1, @@ -22144,7 +22306,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2296694 + "ts": 0.2314259 }, { "core_id": 1, @@ -22152,7 +22314,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.229682925 + "ts": 0.2314394 }, { "core_id": 1, @@ -22160,7 +22322,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.229698075 + "ts": 0.23145455 }, { "core_id": 0, @@ -22170,7 +22332,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2298132 + "ts": 0.2315467 }, { "core_id": 0, @@ -22178,7 +22340,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2298286 + "ts": 0.23156205 }, { "core_id": 0, @@ -22186,7 +22348,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.229843825 + "ts": 0.231577125 }, { "core_id": 1, @@ -22196,7 +22358,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2306694 + "ts": 0.2324259 }, { "core_id": 1, @@ -22204,7 +22366,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.230682925 + "ts": 0.2324394 }, { "core_id": 1, @@ -22212,7 +22374,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.230698075 + "ts": 0.232454675 }, { "core_id": 0, @@ -22222,7 +22384,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2308132 + "ts": 0.2325467 }, { "core_id": 0, @@ -22230,7 +22392,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2308287 + "ts": 0.23256205 }, { "core_id": 0, @@ -22238,7 +22400,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.230843775 + "ts": 0.23257715 }, { "core_id": 1, @@ -22248,7 +22410,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2316694 + "ts": 0.2334259 }, { "core_id": 1, @@ -22256,7 +22418,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.231682925 + "ts": 0.23343945 }, { "core_id": 1, @@ -22264,7 +22426,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.231698325 + "ts": 0.2334546 }, { "core_id": 0, @@ -22274,7 +22436,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2318132 + "ts": 0.2335467 }, { "core_id": 0, @@ -22282,7 +22444,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2318287 + "ts": 0.23356205 }, { "core_id": 0, @@ -22290,7 +22452,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.231843775 + "ts": 0.233577125 }, { "core_id": 1, @@ -22300,7 +22462,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2326694 + "ts": 0.2344259 }, { "core_id": 1, @@ -22308,7 +22470,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.232682975 + "ts": 0.2344394 }, { "core_id": 1, @@ -22316,7 +22478,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2326981 + "ts": 0.23445455 }, { "core_id": 0, @@ -22326,7 +22488,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2328132 + "ts": 0.2345467 }, { "core_id": 0, @@ -22334,7 +22496,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2328287 + "ts": 0.2345621 }, { "core_id": 0, @@ -22342,7 +22504,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.232843775 + "ts": 0.234577425 }, { "core_id": 1, @@ -22352,7 +22514,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2336694 + "ts": 0.2354259 }, { "core_id": 1, @@ -22360,7 +22522,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.233682925 + "ts": 0.2354394 }, { "core_id": 1, @@ -22368,7 +22530,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.233698075 + "ts": 0.23545455 }, { "core_id": 0, @@ -22378,7 +22540,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2338132 + "ts": 0.2355467 }, { "core_id": 0, @@ -22386,7 +22548,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2338286 + "ts": 0.23556205 }, { "core_id": 0, @@ -22394,7 +22556,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.233843825 + "ts": 0.235577125 }, { "core_id": 1, @@ -22404,7 +22566,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2346694 + "ts": 0.2364259 }, { "core_id": 1, @@ -22412,7 +22574,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.234682925 + "ts": 0.2364394 }, { "core_id": 1, @@ -22420,7 +22582,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.234698075 + "ts": 0.236454675 }, { "core_id": 0, @@ -22430,7 +22592,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2348132 + "ts": 0.2365467 }, { "core_id": 0, @@ -22438,7 +22600,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2348287 + "ts": 0.23656205 }, { "core_id": 0, @@ -22446,7 +22608,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.234843775 + "ts": 0.23657715 }, { "core_id": 1, @@ -22456,7 +22618,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2356694 + "ts": 0.2374259 }, { "core_id": 1, @@ -22464,7 +22626,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.235682925 + "ts": 0.23743945 }, { "core_id": 1, @@ -22472,7 +22634,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.235698325 + "ts": 0.2374546 }, { "core_id": 0, @@ -22482,7 +22644,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2358132 + "ts": 0.2375467 }, { "core_id": 0, @@ -22490,7 +22652,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2358287 + "ts": 0.23756205 }, { "core_id": 0, @@ -22498,7 +22660,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.235843775 + "ts": 0.237577125 }, { "core_id": 1, @@ -22508,7 +22670,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2366694 + "ts": 0.2384259 }, { "core_id": 1, @@ -22516,7 +22678,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.236686525 + "ts": 0.2384394 }, { "core_id": 1, @@ -22524,7 +22686,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.23670165 + "ts": 0.23845455 }, { "core_id": 0, @@ -22534,7 +22696,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2368132 + "ts": 0.2385467 }, { "core_id": 0, @@ -22542,7 +22704,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2368287 + "ts": 0.2385621 }, { "core_id": 0, @@ -22550,7 +22712,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.236843775 + "ts": 0.238577425 }, { "core_id": 1, @@ -22560,7 +22722,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2376694 + "ts": 0.2394259 }, { "core_id": 1, @@ -22568,7 +22730,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.237682925 + "ts": 0.2394394 }, { "core_id": 1, @@ -22576,7 +22738,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.237698075 + "ts": 0.23945455 }, { "core_id": 0, @@ -22586,7 +22748,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2378132 + "ts": 0.2395467 }, { "core_id": 0, @@ -22594,7 +22756,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2378286 + "ts": 0.23956205 }, { "core_id": 0, @@ -22602,7 +22764,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.237843825 + "ts": 0.239577125 }, { "core_id": 1, @@ -22612,7 +22774,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2386694 + "ts": 0.2404259 }, { "core_id": 1, @@ -22620,7 +22782,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.238682925 + "ts": 0.2404394 }, { "core_id": 1, @@ -22628,7 +22790,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.238698075 + "ts": 0.240454675 }, { "core_id": 0, @@ -22638,7 +22800,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2388132 + "ts": 0.2405467 }, { "core_id": 0, @@ -22646,7 +22808,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2388287 + "ts": 0.24056205 }, { "core_id": 0, @@ -22654,7 +22816,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.238843775 + "ts": 0.24057715 }, { "core_id": 1, @@ -22664,7 +22826,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2396694 + "ts": 0.2414259 }, { "core_id": 1, @@ -22672,7 +22834,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.239682925 + "ts": 0.241443 }, { "core_id": 1, @@ -22680,7 +22842,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.239698325 + "ts": 0.241458125 }, { "core_id": 0, @@ -22690,7 +22852,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2398132 + "ts": 0.2415467 }, { "core_id": 0, @@ -22698,7 +22860,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2398287 + "ts": 0.24156205 }, { "core_id": 0, @@ -22706,7 +22868,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.239843775 + "ts": 0.241577125 }, { "core_id": 1, @@ -22716,7 +22878,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2406694 + "ts": 0.2424259 }, { "core_id": 1, @@ -22724,7 +22886,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.240682975 + "ts": 0.2424394 }, { "core_id": 1, @@ -22732,7 +22894,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2406981 + "ts": 0.24245455 }, { "core_id": 0, @@ -22742,59 +22904,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2408132 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.2408287 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.240843775 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.2416694 - }, - { - "core_id": 1, - "ctx_name": "free2", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.241682925 - }, - { - "core_id": 1, - "ctx_name": "free2", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.241698075 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.2418132 + "ts": 0.2425467 }, { "core_id": 0, @@ -22802,9 +22912,9 @@ "id": 6, "in_irq": true, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.241828225 + "ts": 0.2425617 }, { "core_id": 1, @@ -22812,9 +22922,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.241828225 + "ts": 0.2425617 }, { "core_id": 0, @@ -22822,7 +22932,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.24184085 + "ts": 0.2425743 }, { "core_id": 0, @@ -22830,18 +22940,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.241856525 + "ts": 0.242589975 }, { - "addr": "0x3ffbb8a4", + "addr": "0x3ffbb038", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -22853,16 +22963,16 @@ "id": 512, "in_irq": false, "size": 9, - "ts": 0.24189185 + "ts": 0.2426251 }, { - "addr": "0x3ffbb8b4", + "addr": "0x3ffbb078", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -22874,7 +22984,7 @@ "id": 512, "in_irq": false, "size": 18, - "ts": 0.241926275 + "ts": 0.24265935 }, { "core_id": 0, @@ -22884,10 +22994,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.2419433 + "ts": 0.2426764 }, { "core_id": 0, @@ -22897,10 +23007,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.2419593 + "ts": 0.242692425 }, { "core_id": 0, @@ -22908,8 +23018,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (550) example: Task[0x3ffb7aec]: allocated 18 bytes @ 0x3ffbb8b4\n", - "ts": 0.242029725 + "msg": "I (538) example: Task[0x3ffb72b4]: allocated 18 bytes @ 0x3ffbb078\n", + "ts": 0.24274725 }, { "core_id": 0, @@ -22917,8 +23027,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (550) example: Task[0x3ffb7aec]: allocated 18 bytes @ 0x3ffbb8b4\n", - "ts": 0.242029725 + "msg": "I (538) example: Task[0x3ffb72b4]: allocated 18 bytes @ 0x3ffbb078\n", + "ts": 0.24274725 }, { "core_id": 0, @@ -22928,10 +23038,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 0 }, - "ts": 0.24204755 + "ts": 0.242760625 }, { "core_id": 0, @@ -22939,9 +23049,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.242060775 + "ts": 0.242774025 }, { "core_id": 1, @@ -22949,9 +23059,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.242060775 + "ts": 0.242774025 }, { "core_id": 1, @@ -22961,7 +23071,7 @@ "params": { "irq_num": 31 }, - "ts": 0.242077 + "ts": 0.2427902 }, { "core_id": 0, @@ -22971,7 +23081,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.242087875 + "ts": 0.2428061 }, { "core_id": 1, @@ -22979,7 +23089,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.242098625 + "ts": 0.2428168 }, { "core_id": 0, @@ -22989,7 +23099,7 @@ "params": { "irq_num": 30 }, - "ts": 0.242112475 + "ts": 0.242830525 }, { "core_id": 1, @@ -22997,9 +23107,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.24212335 + "ts": 0.2428413 }, { "core_id": 0, @@ -23007,7 +23117,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.242134175 + "ts": 0.24285205 }, { "core_id": 1, @@ -23017,10 +23127,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 4294967295 }, - "ts": 0.24214615 + "ts": 0.2428643 }, { "core_id": 0, @@ -23028,7 +23138,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2421564 + "ts": 0.24287555 }, { "core_id": 1, @@ -23038,10 +23148,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.2421678 + "ts": 0.2428928 }, { "core_id": 1, @@ -23051,10 +23161,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.242184175 + "ts": 0.24290905 }, { "core_id": 1, @@ -23062,8 +23172,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (550) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb8b4\n", - "ts": 0.242247725 + "msg": "I (538) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb078\n", + "ts": 0.242956925 }, { "core_id": 1, @@ -23071,15 +23181,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (550) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb8b4\n", - "ts": 0.242247725 + "msg": "I (538) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb078\n", + "ts": 0.242956925 }, { - "addr": "0x3ffbb8b4", + "addr": "0x3ffbb078", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -23093,7 +23203,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.242268925 + "ts": 0.242978325 }, { "core_id": 1, @@ -23103,7 +23213,7 @@ "params": { "irq_num": 31 }, - "ts": 0.242299925 + "ts": 0.2430048 }, { "core_id": 1, @@ -23111,7 +23221,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2423114 + "ts": 0.2430162 }, { "core_id": 1, @@ -23119,7 +23229,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2423281 + "ts": 0.243032775 }, { "core_id": 1, @@ -23129,7 +23239,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2426694 + "ts": 0.2434259 }, { "core_id": 1, @@ -23137,7 +23247,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.24268285 + "ts": 0.24343945 }, { "core_id": 1, @@ -23145,7 +23255,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.242698425 + "ts": 0.24345515 }, { "core_id": 0, @@ -23155,7 +23265,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2428132 + "ts": 0.2435467 }, { "core_id": 0, @@ -23163,9 +23273,9 @@ "id": 6, "in_irq": true, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.242828225 + "ts": 0.24356165 }, { "core_id": 1, @@ -23173,9 +23283,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.242828225 + "ts": 0.24356165 }, { "core_id": 0, @@ -23183,7 +23293,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.24284085 + "ts": 0.2435743 }, { "core_id": 0, @@ -23191,18 +23301,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.242856525 + "ts": 0.243590225 }, { - "addr": "0x3ffbb8b4", + "addr": "0x3ffbb078", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -23214,16 +23324,16 @@ "id": 512, "in_irq": false, "size": 18, - "ts": 0.24289185 + "ts": 0.24362545 }, { - "addr": "0x3ffbb8cc", + "addr": "0x3ffbb0b8", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -23235,7 +23345,7 @@ "id": 512, "in_irq": false, "size": 36, - "ts": 0.242926425 + "ts": 0.2436612 }, { "core_id": 0, @@ -23245,10 +23355,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.24294345 + "ts": 0.24368235 }, { "core_id": 0, @@ -23258,10 +23368,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.24295945 + "ts": 0.2436983 }, { "core_id": 0, @@ -23269,8 +23379,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (551) example: Task[0x3ffb926c]: allocated 36 bytes @ 0x3ffbb8cc\n", - "ts": 0.243029875 + "msg": "I (539) example: Task[0x3ffb8a34]: allocated 36 bytes @ 0x3ffbb0b8\n", + "ts": 0.243753075 }, { "core_id": 0, @@ -23278,8 +23388,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (551) example: Task[0x3ffb926c]: allocated 36 bytes @ 0x3ffbb8cc\n", - "ts": 0.243029875 + "msg": "I (539) example: Task[0x3ffb8a34]: allocated 36 bytes @ 0x3ffbb0b8\n", + "ts": 0.243753075 }, { "core_id": 0, @@ -23289,10 +23399,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 0 }, - "ts": 0.243043425 + "ts": 0.24376655 }, { "core_id": 0, @@ -23300,9 +23410,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.24306025 + "ts": 0.243779725 }, { "core_id": 1, @@ -23310,9 +23420,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.24306025 + "ts": 0.243779725 }, { "core_id": 1, @@ -23322,7 +23432,7 @@ "params": { "irq_num": 31 }, - "ts": 0.24307655 + "ts": 0.243796025 }, { "core_id": 0, @@ -23332,7 +23442,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.2430874 + "ts": 0.243806875 }, { "core_id": 1, @@ -23340,7 +23450,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.24309815 + "ts": 0.2438177 }, { "core_id": 0, @@ -23350,7 +23460,7 @@ "params": { "irq_num": 30 }, - "ts": 0.243111875 + "ts": 0.243831575 }, { "core_id": 1, @@ -23358,9 +23468,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.243122725 + "ts": 0.243842375 }, { "core_id": 0, @@ -23368,7 +23478,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.24313355 + "ts": 0.2438531 }, { "core_id": 1, @@ -23378,10 +23488,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 4294967295 }, - "ts": 0.243145575 + "ts": 0.243865225 }, { "core_id": 0, @@ -23389,7 +23499,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.24315595 + "ts": 0.243876425 }, { "core_id": 1, @@ -23399,10 +23509,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.24316735 + "ts": 0.24388815 }, { "core_id": 1, @@ -23412,10 +23522,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.24318375 + "ts": 0.24390455 }, { "core_id": 1, @@ -23423,8 +23533,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (551) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb8cc\n", - "ts": 0.2432472 + "msg": "I (539) example: Task[0x3ffb961c]: free memory @ 0x3ffbb0b8\n", + "ts": 0.243952425 }, { "core_id": 1, @@ -23432,15 +23542,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (551) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb8cc\n", - "ts": 0.2432472 + "msg": "I (539) example: Task[0x3ffb961c]: free memory @ 0x3ffbb0b8\n", + "ts": 0.243952425 }, { - "addr": "0x3ffbb8cc", + "addr": "0x3ffbb0b8", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -23454,7 +23564,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.24326835 + "ts": 0.24397795 }, { "core_id": 1, @@ -23464,7 +23574,7 @@ "params": { "irq_num": 31 }, - "ts": 0.24329535 + "ts": 0.24400535 }, { "core_id": 1, @@ -23472,7 +23582,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.243306775 + "ts": 0.244016775 }, { "core_id": 1, @@ -23480,7 +23590,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.24332335 + "ts": 0.244033325 }, { "core_id": 1, @@ -23490,7 +23600,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2436694 + "ts": 0.2444259 }, { "core_id": 1, @@ -23498,7 +23608,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.24368295 + "ts": 0.24443945 }, { "core_id": 1, @@ -23506,7 +23616,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.243698525 + "ts": 0.24445515 }, { "core_id": 0, @@ -23516,27 +23626,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2438132 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 6, - "in_irq": true, - "params": { - "tid": 12298716 - }, - "ts": 0.243828325 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 6, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.243828325 + "ts": 0.2445467 }, { "core_id": 0, @@ -23544,7 +23634,79 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.243840975 + "ts": 0.24456205 + }, + { + "core_id": 0, + "ctx_name": "alloc1", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.244577125 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.2454259 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.2454394 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.24545455 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.2455467 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 6, + "in_irq": true, + "params": { + "tid": 12296612 + }, + "ts": 0.2455617 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.2455617 + }, + { + "core_id": 0, + "ctx_name": "alloc1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.2455743 }, { "core_id": 0, @@ -23552,18 +23714,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12298716 + "tid": 12296612 }, - "ts": 0.24385665 + "ts": 0.245589975 }, { - "addr": "0x3ffbb8cc", + "addr": "0x3ffbb0b8", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -23575,16 +23737,16 @@ "id": 512, "in_irq": false, "size": 27, - "ts": 0.243892175 + "ts": 0.245626175 }, { - "addr": "0x3ffbb8ec", + "addr": "0x3ffbb0d8", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -23596,7 +23758,7 @@ "id": 512, "in_irq": false, "size": 54, - "ts": 0.24393085 + "ts": 0.2456618 }, { "core_id": 0, @@ -23606,10 +23768,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.24394775 + "ts": 0.24567885 }, { "core_id": 0, @@ -23619,10 +23781,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.243963875 + "ts": 0.245699 }, { "core_id": 0, @@ -23630,8 +23792,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (552) example: Task[0x3ffba9dc]: allocated 54 bytes @ 0x3ffbb8ec\n", - "ts": 0.244034325 + "msg": "I (541) example: Task[0x3ffba1a4]: allocated 54 bytes @ 0x3ffbb0d8\n", + "ts": 0.245753825 }, { "core_id": 0, @@ -23639,8 +23801,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (552) example: Task[0x3ffba9dc]: allocated 54 bytes @ 0x3ffbb8ec\n", - "ts": 0.244034325 + "msg": "I (541) example: Task[0x3ffba1a4]: allocated 54 bytes @ 0x3ffbb0d8\n", + "ts": 0.245753825 }, { "core_id": 0, @@ -23650,10 +23812,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 0 }, - "ts": 0.244047925 + "ts": 0.245767425 }, { "core_id": 0, @@ -23661,9 +23823,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.24406115 + "ts": 0.245780625 }, { "core_id": 1, @@ -23671,9 +23833,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.24406115 + "ts": 0.245780625 }, { "core_id": 1, @@ -23683,7 +23845,7 @@ "params": { "irq_num": 31 }, - "ts": 0.244077475 + "ts": 0.245796975 }, { "core_id": 0, @@ -23693,7 +23855,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.244088325 + "ts": 0.24580785 }, { "core_id": 1, @@ -23701,7 +23863,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.244099075 + "ts": 0.24581865 }, { "core_id": 0, @@ -23711,7 +23873,7 @@ "params": { "irq_num": 30 }, - "ts": 0.2441128 + "ts": 0.24583235 }, { "core_id": 1, @@ -23719,9 +23881,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.2441237 + "ts": 0.2458432 }, { "core_id": 0, @@ -23729,7 +23891,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.244134525 + "ts": 0.245854025 }, { "core_id": 1, @@ -23739,10 +23901,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 4294967295 }, - "ts": 0.244146375 + "ts": 0.245865975 }, { "core_id": 0, @@ -23750,7 +23912,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.244157675 + "ts": 0.245877175 }, { "core_id": 1, @@ -23760,10 +23922,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.2441693 + "ts": 0.245889575 }, { "core_id": 1, @@ -23773,10 +23935,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.24418975 + "ts": 0.245905825 }, { "core_id": 1, @@ -23784,8 +23946,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (552) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb8ec\n", - "ts": 0.2442533 + "msg": "I (541) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb0d8\n", + "ts": 0.2459536 }, { "core_id": 1, @@ -23793,15 +23955,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (552) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb8ec\n", - "ts": 0.2442533 + "msg": "I (541) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb0d8\n", + "ts": 0.2459536 }, { - "addr": "0x3ffbb8ec", + "addr": "0x3ffbb0d8", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -23815,7 +23977,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.2442745 + "ts": 0.24597885 }, { "core_id": 1, @@ -23825,7 +23987,7 @@ "params": { "irq_num": 31 }, - "ts": 0.2443014 + "ts": 0.24600625 }, { "core_id": 1, @@ -23833,7 +23995,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.244312825 + "ts": 0.246017675 }, { "core_id": 1, @@ -23841,7 +24003,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2443294 + "ts": 0.246034225 }, { "core_id": 1, @@ -23851,7 +24013,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2446694 + "ts": 0.2464259 }, { "core_id": 1, @@ -23859,7 +24021,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.24468295 + "ts": 0.24643945 }, { "core_id": 1, @@ -23867,7 +24029,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.244698525 + "ts": 0.24645515 }, { "core_id": 0, @@ -23877,7 +24039,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2448132 + "ts": 0.2465467 }, { "core_id": 0, @@ -23885,7 +24047,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2448287 + "ts": 0.24656205 }, { "core_id": 0, @@ -23893,7 +24055,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.244843775 + "ts": 0.246577125 }, { "core_id": 1, @@ -23903,7 +24065,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2456694 + "ts": 0.2474259 }, { "core_id": 1, @@ -23911,7 +24073,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.245682925 + "ts": 0.2474394 }, { "core_id": 1, @@ -23919,7 +24081,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.245698325 + "ts": 0.24745455 }, { "core_id": 0, @@ -23929,7 +24091,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2458132 + "ts": 0.2475467 }, { "core_id": 0, @@ -23937,7 +24099,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2458287 + "ts": 0.2475621 }, { "core_id": 0, @@ -23945,7 +24107,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.245843775 + "ts": 0.247577425 }, { "core_id": 1, @@ -23955,7 +24117,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2466694 + "ts": 0.2484259 }, { "core_id": 1, @@ -23963,7 +24125,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.246682975 + "ts": 0.2484394 }, { "core_id": 1, @@ -23971,7 +24133,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2466981 + "ts": 0.24845455 }, { "core_id": 0, @@ -23981,7 +24143,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2468132 + "ts": 0.2485467 }, { "core_id": 0, @@ -23989,7 +24151,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2468287 + "ts": 0.24856205 }, { "core_id": 0, @@ -23997,7 +24159,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.246843775 + "ts": 0.248577125 }, { "core_id": 1, @@ -24007,7 +24169,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2476694 + "ts": 0.2494259 }, { "core_id": 1, @@ -24015,7 +24177,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.247682925 + "ts": 0.2494394 }, { "core_id": 1, @@ -24023,7 +24185,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.247698075 + "ts": 0.249454675 }, { "core_id": 0, @@ -24033,7 +24195,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2478132 + "ts": 0.2495467 }, { "core_id": 0, @@ -24041,7 +24203,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2478286 + "ts": 0.24956205 }, { "core_id": 0, @@ -24049,7 +24211,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.247843825 + "ts": 0.24957715 }, { "core_id": 1, @@ -24059,7 +24221,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2486694 + "ts": 0.2504259 }, { "core_id": 1, @@ -24067,7 +24229,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.248682925 + "ts": 0.25043945 }, { "core_id": 1, @@ -24075,7 +24237,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.248698075 + "ts": 0.2504546 }, { "core_id": 0, @@ -24085,7 +24247,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2488132 + "ts": 0.2505467 }, { "core_id": 0, @@ -24093,7 +24255,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2488287 + "ts": 0.25056205 }, { "core_id": 0, @@ -24101,7 +24263,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.248843775 + "ts": 0.250577125 }, { "core_id": 1, @@ -24111,7 +24273,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2496694 + "ts": 0.2514259 }, { "core_id": 1, @@ -24119,7 +24281,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.249682925 + "ts": 0.2514394 }, { "core_id": 1, @@ -24127,7 +24289,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.249698325 + "ts": 0.25145455 }, { "core_id": 0, @@ -24137,7 +24299,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2498132 + "ts": 0.2515467 }, { "core_id": 0, @@ -24145,7 +24307,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2498287 + "ts": 0.2515621 }, { "core_id": 0, @@ -24153,7 +24315,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.249848325 + "ts": 0.251577425 }, { "core_id": 1, @@ -24163,7 +24325,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2506694 + "ts": 0.2524259 }, { "core_id": 1, @@ -24171,7 +24333,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.250682925 + "ts": 0.2524394 }, { "core_id": 1, @@ -24179,7 +24341,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.250698075 + "ts": 0.25245455 }, { "core_id": 0, @@ -24189,7 +24351,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2508132 + "ts": 0.2525467 }, { "core_id": 0, @@ -24197,7 +24359,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2508287 + "ts": 0.25256205 }, { "core_id": 0, @@ -24205,7 +24367,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.250843775 + "ts": 0.252577125 }, { "core_id": 1, @@ -24215,7 +24377,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2516694 + "ts": 0.2534259 }, { "core_id": 1, @@ -24223,7 +24385,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.251682925 + "ts": 0.253443075 }, { "core_id": 1, @@ -24231,7 +24393,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.251698325 + "ts": 0.2534582 }, { "core_id": 0, @@ -24241,7 +24403,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2518132 + "ts": 0.2535467 }, { "core_id": 0, @@ -24249,7 +24411,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2518287 + "ts": 0.25356205 }, { "core_id": 0, @@ -24257,7 +24419,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.251843775 + "ts": 0.253577125 }, { "core_id": 1, @@ -24267,7 +24429,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2526694 + "ts": 0.2544259 }, { "core_id": 1, @@ -24275,7 +24437,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.252682975 + "ts": 0.2544394 }, { "core_id": 1, @@ -24283,7 +24445,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2526981 + "ts": 0.25445455 }, { "core_id": 0, @@ -24293,7 +24455,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2528132 + "ts": 0.2545467 }, { "core_id": 0, @@ -24301,7 +24463,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2528287 + "ts": 0.2545621 }, { "core_id": 0, @@ -24309,7 +24471,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.252843775 + "ts": 0.254577425 }, { "core_id": 1, @@ -24319,7 +24481,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2536694 + "ts": 0.2554259 }, { "core_id": 1, @@ -24327,7 +24489,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.253682925 + "ts": 0.2554394 }, { "core_id": 1, @@ -24335,7 +24497,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.253698075 + "ts": 0.25545455 }, { "core_id": 0, @@ -24345,7 +24507,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2538132 + "ts": 0.2555467 }, { "core_id": 0, @@ -24353,7 +24515,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2538286 + "ts": 0.25556205 }, { "core_id": 0, @@ -24361,7 +24523,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.253843825 + "ts": 0.255577125 }, { "core_id": 1, @@ -24371,7 +24533,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2546694 + "ts": 0.2564259 }, { "core_id": 1, @@ -24379,7 +24541,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.254682925 + "ts": 0.2564394 }, { "core_id": 1, @@ -24387,7 +24549,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.254698075 + "ts": 0.256454675 }, { "core_id": 0, @@ -24397,7 +24559,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2548132 + "ts": 0.2565467 }, { "core_id": 0, @@ -24405,7 +24567,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2548287 + "ts": 0.25656205 }, { "core_id": 0, @@ -24413,7 +24575,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.254843775 + "ts": 0.25657715 }, { "core_id": 1, @@ -24423,7 +24585,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2556694 + "ts": 0.2574259 }, { "core_id": 1, @@ -24431,7 +24593,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.255682925 + "ts": 0.25743945 }, { "core_id": 1, @@ -24439,7 +24601,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.255698325 + "ts": 0.2574546 }, { "core_id": 0, @@ -24449,7 +24611,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2558132 + "ts": 0.2575467 }, { "core_id": 0, @@ -24457,7 +24619,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2558287 + "ts": 0.25756205 }, { "core_id": 0, @@ -24465,7 +24627,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.255843775 + "ts": 0.257577125 }, { "core_id": 1, @@ -24475,7 +24637,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2566694 + "ts": 0.2584259 }, { "core_id": 1, @@ -24483,7 +24645,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.256682975 + "ts": 0.2584394 }, { "core_id": 1, @@ -24491,7 +24653,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2566981 + "ts": 0.25845455 }, { "core_id": 0, @@ -24501,7 +24663,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2568132 + "ts": 0.2585467 }, { "core_id": 0, @@ -24509,7 +24671,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2568287 + "ts": 0.2585621 }, { "core_id": 0, @@ -24517,7 +24679,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.256843775 + "ts": 0.258577425 }, { "core_id": 1, @@ -24527,7 +24689,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2576694 + "ts": 0.2594259 }, { "core_id": 1, @@ -24535,7 +24697,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.257682925 + "ts": 0.2594394 }, { "core_id": 1, @@ -24543,7 +24705,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.257698075 + "ts": 0.25945455 }, { "core_id": 0, @@ -24553,7 +24715,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2578132 + "ts": 0.2595467 }, { "core_id": 0, @@ -24561,7 +24723,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2578286 + "ts": 0.25956205 }, { "core_id": 0, @@ -24569,7 +24731,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.257843825 + "ts": 0.259577125 }, { "core_id": 1, @@ -24579,7 +24741,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2586694 + "ts": 0.2604259 }, { "core_id": 1, @@ -24587,7 +24749,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.258682925 + "ts": 0.2604394 }, { "core_id": 1, @@ -24595,7 +24757,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.258698075 + "ts": 0.260454675 }, { "core_id": 0, @@ -24605,7 +24767,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2588132 + "ts": 0.2605467 }, { "core_id": 0, @@ -24613,7 +24775,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2588287 + "ts": 0.26056205 }, { "core_id": 0, @@ -24621,7 +24783,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.258843775 + "ts": 0.26057715 }, { "core_id": 1, @@ -24631,7 +24793,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2596694 + "ts": 0.2614259 }, { "core_id": 1, @@ -24639,7 +24801,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.259682925 + "ts": 0.26143945 }, { "core_id": 1, @@ -24647,7 +24809,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.259698325 + "ts": 0.2614546 }, { "core_id": 0, @@ -24657,7 +24819,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2598132 + "ts": 0.2615467 }, { "core_id": 0, @@ -24665,7 +24827,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2598287 + "ts": 0.26156205 }, { "core_id": 0, @@ -24673,7 +24835,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.259843775 + "ts": 0.261577125 }, { "core_id": 1, @@ -24683,7 +24845,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2606694 + "ts": 0.2624259 }, { "core_id": 1, @@ -24691,7 +24853,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.260682975 + "ts": 0.2624394 }, { "core_id": 1, @@ -24699,7 +24861,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2606981 + "ts": 0.26245455 }, { "core_id": 0, @@ -24709,7 +24871,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2608132 + "ts": 0.2625467 }, { "core_id": 0, @@ -24717,7 +24879,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2608287 + "ts": 0.2625621 }, { "core_id": 0, @@ -24725,7 +24887,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.260843775 + "ts": 0.262577425 }, { "core_id": 1, @@ -24735,7 +24897,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2616694 + "ts": 0.2634259 }, { "core_id": 1, @@ -24743,7 +24905,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.261682925 + "ts": 0.2634394 }, { "core_id": 1, @@ -24751,7 +24913,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.261698075 + "ts": 0.26345455 }, { "core_id": 0, @@ -24761,7 +24923,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2618132 + "ts": 0.2635467 }, { "core_id": 0, @@ -24769,7 +24931,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2618286 + "ts": 0.26356205 }, { "core_id": 0, @@ -24777,7 +24939,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.261843825 + "ts": 0.263577125 }, { "core_id": 1, @@ -24787,7 +24949,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2626694 + "ts": 0.2644259 }, { "core_id": 1, @@ -24795,7 +24957,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.262682925 + "ts": 0.2644394 }, { "core_id": 1, @@ -24803,7 +24965,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.262698325 + "ts": 0.264454675 }, { "core_id": 0, @@ -24813,7 +24975,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2628132 + "ts": 0.2645467 }, { "core_id": 0, @@ -24821,7 +24983,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2628287 + "ts": 0.26456205 }, { "core_id": 0, @@ -24829,7 +24991,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.262843775 + "ts": 0.26457715 }, { "core_id": 1, @@ -24839,7 +25001,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2636694 + "ts": 0.2654259 }, { "core_id": 1, @@ -24847,7 +25009,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.263682975 + "ts": 0.265443675 }, { "core_id": 1, @@ -24855,7 +25017,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2636981 + "ts": 0.265458825 }, { "core_id": 0, @@ -24865,7 +25027,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2638132 + "ts": 0.2655467 }, { "core_id": 0, @@ -24873,7 +25035,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2638287 + "ts": 0.26556205 }, { "core_id": 0, @@ -24881,7 +25043,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.263843775 + "ts": 0.265577125 }, { "core_id": 1, @@ -24891,7 +25053,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2646694 + "ts": 0.2664259 }, { "core_id": 1, @@ -24899,7 +25061,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.264682925 + "ts": 0.2664394 }, { "core_id": 1, @@ -24907,7 +25069,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.264698075 + "ts": 0.26645455 }, { "core_id": 0, @@ -24917,7 +25079,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2648132 + "ts": 0.2665467 }, { "core_id": 0, @@ -24925,7 +25087,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2648286 + "ts": 0.2665621 }, { "core_id": 0, @@ -24933,7 +25095,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.264843825 + "ts": 0.266577425 }, { "core_id": 1, @@ -24943,7 +25105,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2656694 + "ts": 0.2674259 }, { "core_id": 1, @@ -24951,7 +25113,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.265682925 + "ts": 0.2674394 }, { "core_id": 1, @@ -24959,7 +25121,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.265698075 + "ts": 0.26745455 }, { "core_id": 0, @@ -24969,7 +25131,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2658132 + "ts": 0.2675467 }, { "core_id": 0, @@ -24977,7 +25139,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2658287 + "ts": 0.26756205 }, { "core_id": 0, @@ -24985,7 +25147,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.265843775 + "ts": 0.267577125 }, { "core_id": 1, @@ -24995,7 +25157,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2666694 + "ts": 0.2684259 }, { "core_id": 1, @@ -25003,7 +25165,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.266682925 + "ts": 0.2684394 }, { "core_id": 1, @@ -25011,7 +25173,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.266698325 + "ts": 0.268454675 }, { "core_id": 0, @@ -25021,7 +25183,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2668132 + "ts": 0.2685467 }, { "core_id": 0, @@ -25029,7 +25191,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2668287 + "ts": 0.26856205 }, { "core_id": 0, @@ -25037,7 +25199,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.266843775 + "ts": 0.26857715 }, { "core_id": 1, @@ -25047,7 +25209,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2676694 + "ts": 0.2694259 }, { "core_id": 1, @@ -25055,7 +25217,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.267682975 + "ts": 0.26943945 }, { "core_id": 1, @@ -25063,7 +25225,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2676981 + "ts": 0.2694546 }, { "core_id": 0, @@ -25073,7 +25235,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2678132 + "ts": 0.2695467 }, { "core_id": 0, @@ -25081,7 +25243,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2678287 + "ts": 0.26956205 }, { "core_id": 0, @@ -25089,7 +25251,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.267843775 + "ts": 0.269577125 }, { "core_id": 1, @@ -25099,7 +25261,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2686694 + "ts": 0.2704259 }, { "core_id": 1, @@ -25107,7 +25269,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.268682925 + "ts": 0.2704394 }, { "core_id": 1, @@ -25115,7 +25277,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.268698075 + "ts": 0.27045455 }, { "core_id": 0, @@ -25125,7 +25287,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2688132 + "ts": 0.2705467 }, { "core_id": 0, @@ -25133,7 +25295,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2688286 + "ts": 0.2705621 }, { "core_id": 0, @@ -25141,7 +25303,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.268843825 + "ts": 0.270577425 }, { "core_id": 1, @@ -25151,7 +25313,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2696694 + "ts": 0.2714259 }, { "core_id": 1, @@ -25159,7 +25321,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.269682925 + "ts": 0.2714394 }, { "core_id": 1, @@ -25167,7 +25329,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.269698075 + "ts": 0.27145455 }, { "core_id": 0, @@ -25177,7 +25339,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2698132 + "ts": 0.2715467 }, { "core_id": 0, @@ -25185,7 +25347,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2698287 + "ts": 0.27156205 }, { "core_id": 0, @@ -25193,7 +25355,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.269843775 + "ts": 0.271577125 }, { "core_id": 1, @@ -25203,7 +25365,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2706694 + "ts": 0.2724259 }, { "core_id": 1, @@ -25211,7 +25373,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.270682925 + "ts": 0.2724394 }, { "core_id": 1, @@ -25219,7 +25381,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.270698325 + "ts": 0.272454675 }, { "core_id": 0, @@ -25229,59 +25391,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2708132 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.2708287 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.270843775 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.2716694 - }, - { - "core_id": 1, - "ctx_name": "free2", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.271682975 - }, - { - "core_id": 1, - "ctx_name": "free2", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.2716981 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.2718132 + "ts": 0.2725467 }, { "core_id": 0, @@ -25289,9 +25399,9 @@ "id": 6, "in_irq": true, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.271828325 + "ts": 0.272561675 }, { "core_id": 1, @@ -25299,9 +25409,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.271828325 + "ts": 0.272561675 }, { "core_id": 0, @@ -25309,7 +25419,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.271840975 + "ts": 0.27257425 }, { "core_id": 0, @@ -25317,9 +25427,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.27185665 + "ts": 0.272589925 }, { "core_id": 0, @@ -25330,9 +25440,9 @@ "eAction": 2, "pulPreviousNotificationValue": 0, "ulValue": 0, - "xTaskToNotify": 12254080 + "xTaskToNotify": 12274964 }, - "ts": 0.27187515 + "ts": 0.2726081 }, { "core_id": 0, @@ -25340,9 +25450,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.271886225 + "ts": 0.272619125 }, { "core_id": 1, @@ -25350,9 +25460,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.271886225 + "ts": 0.272619125 }, { "core_id": 0, @@ -25362,7 +25472,7 @@ "params": { "xTicksToDelay": 100 }, - "ts": 0.271899375 + "ts": 0.272632225 }, { "core_id": 0, @@ -25372,7 +25482,7 @@ "params": { "irq_num": 30 }, - "ts": 0.271915925 + "ts": 0.272648775 }, { "core_id": 0, @@ -25380,7 +25490,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2719273 + "ts": 0.27266015 }, { "core_id": 0, @@ -25388,9 +25498,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.27194425 + "ts": 0.2726771 }, { "core_id": 0, @@ -25401,7 +25511,7 @@ "xClearCountOnExit": 0, "xTicksToWait": 4294967295 }, - "ts": 0.271962125 + "ts": 0.27269085 }, { "core_id": 0, @@ -25411,10 +25521,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.271978075 + "ts": 0.272706775 }, { "core_id": 0, @@ -25424,10 +25534,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.271993975 + "ts": 0.2727228 }, { "core_id": 0, @@ -25435,8 +25545,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (580) example: Got notify val 1\n", - "ts": 0.2720432 + "msg": "I (568) example: Got notify val 1\n", + "ts": 0.272764375 }, { "core_id": 0, @@ -25444,8 +25554,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (580) example: Got notify val 1\n", - "ts": 0.2720432 + "msg": "I (568) example: Got notify val 1\n", + "ts": 0.272764375 }, { "core_id": 0, @@ -25455,10 +25565,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.2720595 + "ts": 0.272784725 }, { "core_id": 0, @@ -25468,10 +25578,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.27207545 + "ts": 0.27280065 }, { "core_id": 0, @@ -25479,8 +25589,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (580) example: Wait notify 1\n", - "ts": 0.2721198 + "msg": "I (568) example: Wait notify 1\n", + "ts": 0.2728372 }, { "core_id": 0, @@ -25488,8 +25598,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (580) example: Wait notify 1\n", - "ts": 0.2721198 + "msg": "I (568) example: Wait notify 1\n", + "ts": 0.2728372 }, { "core_id": 0, @@ -25499,7 +25609,7 @@ "params": { "irq_num": 30 }, - "ts": 0.272138175 + "ts": 0.272855425 }, { "core_id": 0, @@ -25507,7 +25617,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.272149575 + "ts": 0.272866775 }, { "core_id": 0, @@ -25515,7 +25625,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.272165625 + "ts": 0.2728827 }, { "core_id": 1, @@ -25525,7 +25635,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2726694 + "ts": 0.2734259 }, { "core_id": 1, @@ -25533,7 +25643,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.272682925 + "ts": 0.2734394 }, { "core_id": 1, @@ -25541,7 +25651,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.272698075 + "ts": 0.273454675 }, { "core_id": 0, @@ -25551,7 +25661,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2728132 + "ts": 0.2735467 }, { "core_id": 0, @@ -25559,9 +25669,9 @@ "id": 6, "in_irq": true, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.272828325 + "ts": 0.273561675 }, { "core_id": 1, @@ -25569,9 +25679,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.272828325 + "ts": 0.273561675 }, { "core_id": 0, @@ -25579,7 +25689,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.272840975 + "ts": 0.27357425 }, { "core_id": 0, @@ -25587,9 +25697,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.272856775 + "ts": 0.273589925 }, { "core_id": 0, @@ -25600,9 +25710,9 @@ "eAction": 2, "pulPreviousNotificationValue": 0, "ulValue": 0, - "xTaskToNotify": 12254080 + "xTaskToNotify": 12274964 }, - "ts": 0.2728712 + "ts": 0.2736043 }, { "core_id": 0, @@ -25610,9 +25720,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.2728822 + "ts": 0.273615325 }, { "core_id": 1, @@ -25620,9 +25730,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.2728822 + "ts": 0.273615325 }, { "core_id": 0, @@ -25632,7 +25742,7 @@ "params": { "xTicksToDelay": 100 }, - "ts": 0.272895325 + "ts": 0.273628425 }, { "core_id": 0, @@ -25642,7 +25752,7 @@ "params": { "irq_num": 30 }, - "ts": 0.272911925 + "ts": 0.273644975 }, { "core_id": 0, @@ -25650,7 +25760,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2729233 + "ts": 0.27365635 }, { "core_id": 0, @@ -25658,9 +25768,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.27294025 + "ts": 0.2736733 }, { "core_id": 0, @@ -25671,7 +25781,7 @@ "xClearCountOnExit": 0, "xTicksToWait": 4294967295 }, - "ts": 0.27295395 + "ts": 0.27368705 }, { "core_id": 0, @@ -25681,10 +25791,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.272969875 + "ts": 0.273702975 }, { "core_id": 0, @@ -25694,10 +25804,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.272985925 + "ts": 0.273719 }, { "core_id": 0, @@ -25705,8 +25815,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (581) example: Got notify val 1\n", - "ts": 0.273035525 + "msg": "I (569) example: Got notify val 1\n", + "ts": 0.273756475 }, { "core_id": 0, @@ -25714,8 +25824,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (581) example: Got notify val 1\n", - "ts": 0.273035525 + "msg": "I (569) example: Got notify val 1\n", + "ts": 0.273756475 }, { "core_id": 0, @@ -25725,10 +25835,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.273051825 + "ts": 0.27377665 }, { "core_id": 0, @@ -25738,10 +25848,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.273067775 + "ts": 0.273792575 }, { "core_id": 0, @@ -25749,8 +25859,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (581) example: Wait notify 2\n", - "ts": 0.27311225 + "msg": "I (569) example: Wait notify 2\n", + "ts": 0.273829125 }, { "core_id": 0, @@ -25758,8 +25868,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (581) example: Wait notify 2\n", - "ts": 0.27311225 + "msg": "I (569) example: Wait notify 2\n", + "ts": 0.273829125 }, { "core_id": 0, @@ -25769,7 +25879,7 @@ "params": { "irq_num": 30 }, - "ts": 0.273130625 + "ts": 0.27384735 }, { "core_id": 0, @@ -25777,7 +25887,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.273142025 + "ts": 0.2738587 }, { "core_id": 0, @@ -25785,7 +25895,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.273158075 + "ts": 0.273874625 }, { "core_id": 1, @@ -25795,7 +25905,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2736694 + "ts": 0.2744259 }, { "core_id": 1, @@ -25803,7 +25913,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.273682925 + "ts": 0.2744394 }, { "core_id": 1, @@ -25811,7 +25921,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.273698075 + "ts": 0.274454675 }, { "core_id": 0, @@ -25821,27 +25931,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2738132 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 6, - "in_irq": true, - "params": { - "tid": 12298716 - }, - "ts": 0.273828325 - }, - { - "core_id": 1, - "ctx_name": "free2", - "id": 6, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.273828325 + "ts": 0.2745467 }, { "core_id": 0, @@ -25849,7 +25939,79 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.273840975 + "ts": 0.27456205 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.27457715 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.2754259 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.27543945 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.2754546 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.2755467 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 6, + "in_irq": true, + "params": { + "tid": 12296612 + }, + "ts": 0.27556165 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.27556165 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.2755743 }, { "core_id": 0, @@ -25857,9 +26019,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12298716 + "tid": 12296612 }, - "ts": 0.273856775 + "ts": 0.275589975 }, { "core_id": 0, @@ -25870,9 +26032,9 @@ "eAction": 2, "pulPreviousNotificationValue": 0, "ulValue": 0, - "xTaskToNotify": 12254080 + "xTaskToNotify": 12274964 }, - "ts": 0.2738712 + "ts": 0.2756044 }, { "core_id": 0, @@ -25880,9 +26042,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.2738822 + "ts": 0.2756154 }, { "core_id": 1, @@ -25890,9 +26052,9 @@ "id": 6, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.2738822 + "ts": 0.2756154 }, { "core_id": 0, @@ -25902,7 +26064,7 @@ "params": { "xTicksToDelay": 100 }, - "ts": 0.273895325 + "ts": 0.27562855 }, { "core_id": 0, @@ -25912,7 +26074,7 @@ "params": { "irq_num": 30 }, - "ts": 0.273911925 + "ts": 0.275645125 }, { "core_id": 0, @@ -25920,7 +26082,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2739233 + "ts": 0.275656475 }, { "core_id": 0, @@ -25928,9 +26090,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.27394025 + "ts": 0.275673425 }, { "core_id": 0, @@ -25941,7 +26103,7 @@ "xClearCountOnExit": 0, "xTicksToWait": 4294967295 }, - "ts": 0.27395395 + "ts": 0.27568725 }, { "core_id": 0, @@ -25951,10 +26113,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.273969875 + "ts": 0.27570325 }, { "core_id": 0, @@ -25964,10 +26126,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.273985925 + "ts": 0.275719275 }, { "core_id": 0, @@ -25975,8 +26137,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (582) example: Got notify val 1\n", - "ts": 0.274031175 + "msg": "I (571) example: Got notify val 1\n", + "ts": 0.27575685 }, { "core_id": 0, @@ -25984,8 +26146,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (582) example: Got notify val 1\n", - "ts": 0.274031175 + "msg": "I (571) example: Got notify val 1\n", + "ts": 0.27575685 }, { "core_id": 0, @@ -25995,10 +26157,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.329656225 + "ts": 0.329911225 }, { "core_id": 0, @@ -26006,7 +26168,7 @@ "id": 11, "in_irq": false, "params": {}, - "ts": 0.32966495 + "ts": 0.32991995 }, { "core_id": 1, @@ -26014,7 +26176,7 @@ "id": 11, "in_irq": false, "params": {}, - "ts": 0.32966495 + "ts": 0.32991995 } ], "streams": { diff --git a/tools/esp_app_trace/test/sysview/expected_output_mcore b/tools/esp_app_trace/test/sysview/expected_output_mcore index 7e621cef33e..aade7f94cc1 100644 --- a/tools/esp_app_trace/test/sysview/expected_output_mcore +++ b/tools/esp_app_trace/test/sysview/expected_output_mcore @@ -1,3562 +1,3749 @@ -EVENT[0]: 0.000000000 - core[0].svTraceStart(10), plen 0: [] -EVENT[1]: 0.000006625 - core[0].svInit(24), plen 14: [sys_freq: 40000000, cpu_freq: 160000000, ram_base: 1061158912, id_shift: 0] -EVENT[2]: 0.000018550 - core[0].svSysDesc(14), plen 0: [desc: N=FreeRTOS Application,D=esp32,C=xtensa,O=FreeRTOS] -EVENT[3]: 0.000027675 - core[0].svSysDesc(14), plen 0: [desc: I#5=SysTick] -EVENT[4]: 0.000049775 - core[0].svSysDesc(14), plen 0: [desc: I#6=WIFI_MAC] -EVENT[5]: 0.000063875 - core[0].svSysDesc(14), plen 0: [desc: I#7=WIFI_NMI] -EVENT[6]: 0.000073800 - core[0].svSysDesc(14), plen 0: [desc: I#8=WIFI_BB] -EVENT[7]: 0.000087500 - core[0].svSysDesc(14), plen 0: [desc: I#9=BT_MAC] -EVENT[8]: 0.000101550 - core[0].svSysDesc(14), plen 0: [desc: I#10=BT_BB] -EVENT[9]: 0.000112375 - core[0].svSysDesc(14), plen 0: [desc: I#11=BT_BB_NMI] -EVENT[10]: 0.000122300 - core[0].svSysDesc(14), plen 0: [desc: I#12=RWBT] -EVENT[11]: 0.000132275 - core[0].svSysDesc(14), plen 0: [desc: I#13=RWBLE] -EVENT[12]: 0.000146800 - core[0].svSysDesc(14), plen 0: [desc: I#14=RWBT_NMI] -EVENT[13]: 0.000157600 - core[0].svSysDesc(14), plen 0: [desc: I#15=RWBLE_NMI] -EVENT[14]: 0.000171875 - core[0].svSysDesc(14), plen 0: [desc: I#16=SLC0] -EVENT[15]: 0.000189525 - core[0].svSysDesc(14), plen 0: [desc: I#17=SLC1] -EVENT[16]: 0.000199650 - core[0].svSysDesc(14), plen 0: [desc: I#18=UHCI0] -EVENT[17]: 0.000209600 - core[0].svSysDesc(14), plen 0: [desc: I#19=UHCI1] -EVENT[18]: 0.000224875 - core[0].svSysDesc(14), plen 0: [desc: I#20=TG0_T0_LEVEL] -EVENT[19]: 0.000236275 - core[0].svSysDesc(14), plen 0: [desc: I#21=TG0_T1_LEVEL] -EVENT[20]: 0.000251975 - core[0].svSysDesc(14), plen 0: [desc: I#22=TG0_WDT_LEVEL] -EVENT[21]: 0.000263750 - core[0].svSysDesc(14), plen 0: [desc: I#23=TG0_LACT_LEVEL] -EVENT[22]: 0.000279150 - core[0].svSysDesc(14), plen 0: [desc: I#24=TG1_T0_LEVEL] -EVENT[23]: 0.000294550 - core[0].svSysDesc(14), plen 0: [desc: I#25=TG1_T1_LEVEL] -EVENT[24]: 0.000310125 - core[0].svSysDesc(14), plen 0: [desc: I#26=TG1_WDT_LEVEL] -EVENT[25]: 0.000322075 - core[0].svSysDesc(14), plen 0: [desc: I#27=TG1_LACT_LEVEL] -EVENT[26]: 0.000331975 - core[0].svSysDesc(14), plen 0: [desc: I#28=GPIO] -EVENT[27]: 0.000350900 - core[0].svSysDesc(14), plen 0: [desc: I#29=GPIO_NMI] -EVENT[28]: 0.000361800 - core[0].svSysDesc(14), plen 0: [desc: I#30=FROM_CPU0] -EVENT[29]: 0.000376500 - core[0].svSysDesc(14), plen 0: [desc: I#31=FROM_CPU1] -EVENT[30]: 0.000387300 - core[0].svSysDesc(14), plen 0: [desc: I#32=FROM_CPU2] -EVENT[31]: 0.000402000 - core[0].svSysDesc(14), plen 0: [desc: I#33=FROM_CPU3] -EVENT[32]: 0.000415750 - core[0].svSysDesc(14), plen 0: [desc: I#34=SPI0] -EVENT[33]: 0.000425500 - core[0].svSysDesc(14), plen 0: [desc: I#35=SPI1] -EVENT[34]: 0.000435275 - core[0].svSysDesc(14), plen 0: [desc: I#36=SPI2] -EVENT[35]: 0.000445025 - core[0].svSysDesc(14), plen 0: [desc: I#37=SPI3] -EVENT[36]: 0.000458825 - core[0].svSysDesc(14), plen 0: [desc: I#38=I2S0] -EVENT[37]: 0.000468575 - core[0].svSysDesc(14), plen 0: [desc: I#39=I2S1] -EVENT[38]: 0.000478575 - core[0].svSysDesc(14), plen 0: [desc: I#40=UART0] -EVENT[39]: 0.000492500 - core[0].svSysDesc(14), plen 0: [desc: I#41=UART1] -EVENT[40]: 0.000506375 - core[0].svSysDesc(14), plen 0: [desc: I#42=UART2] -EVENT[41]: 0.000517125 - core[0].svSysDesc(14), plen 0: [desc: I#43=SDIO_HOST] -EVENT[42]: 0.000527475 - core[0].svSysDesc(14), plen 0: [desc: I#44=ETH_MAC] -EVENT[43]: 0.000541600 - core[0].svSysDesc(14), plen 0: [desc: I#45=PWM0] -EVENT[44]: 0.000555300 - core[0].svSysDesc(14), plen 0: [desc: I#46=PWM1] -EVENT[45]: 0.000565950 - core[0].svSysDesc(14), plen 0: [desc: I#47=RESERVED] -EVENT[46]: 0.000576550 - core[0].svSysDesc(14), plen 0: [desc: I#48=RESERVED] -EVENT[47]: 0.000590325 - core[0].svSysDesc(14), plen 0: [desc: I#49=LEDC] -EVENT[48]: 0.000604225 - core[0].svSysDesc(14), plen 0: [desc: I#50=EFUSE] -EVENT[49]: 0.000618075 - core[0].svSysDesc(14), plen 0: [desc: I#51=TWAI] -EVENT[50]: 0.000628650 - core[0].svSysDesc(14), plen 0: [desc: I#52=RTC_CORE] -EVENT[51]: 0.000638225 - core[0].svSysDesc(14), plen 0: [desc: I#53=RMT] -EVENT[52]: 0.000648075 - core[0].svSysDesc(14), plen 0: [desc: I#54=PCNT] -EVENT[53]: 0.000663050 - core[0].svSysDesc(14), plen 0: [desc: I#55=I2C_EXT0] -EVENT[54]: 0.000675200 - core[0].svSysDesc(14), plen 0: [desc: I#56=I2C_EXT1] -EVENT[55]: 0.000690175 - core[0].svSysDesc(14), plen 0: [desc: I#57=RSA] -EVENT[56]: 0.000705900 - core[0].svSysDesc(14), plen 0: [desc: I#58=SPI1_DMA] -EVENT[57]: 0.000718025 - core[0].svSysDesc(14), plen 0: [desc: I#59=SPI2_DMA] -EVENT[58]: 0.000730375 - core[0].svSysDesc(14), plen 0: [desc: I#60=SPI3_DMA] -EVENT[59]: 0.000741300 - core[0].svSysDesc(14), plen 0: [desc: I#61=WDT] -EVENT[60]: 0.000761650 - core[0].svSysDesc(14), plen 0: [desc: I#62=TIMER1] -EVENT[61]: 0.000773525 - core[0].svSysDesc(14), plen 0: [desc: I#63=TIMER2] -EVENT[62]: 0.000786275 - core[0].svSysDesc(14), plen 0: [desc: I#64=TG0_T0_EDGE] -EVENT[63]: 0.000806925 - core[0].svSysDesc(14), plen 0: [desc: I#65=TG0_T1_EDGE] -EVENT[64]: 0.000819950 - core[0].svSysDesc(14), plen 0: [desc: I#66=TG0_WDT_EDGE] -EVENT[65]: 0.000837025 - core[0].svSysDesc(14), plen 0: [desc: I#67=TG0_LACT_EDGE] -EVENT[66]: 0.000850025 - core[0].svSysDesc(14), plen 0: [desc: I#68=TG1_T0_EDGE] -EVENT[67]: 0.000863125 - core[0].svSysDesc(14), plen 0: [desc: I#69=TG1_T1_EDGE] -EVENT[68]: 0.000880425 - core[0].svSysDesc(14), plen 0: [desc: I#70=TG1_WDT_EDGE] -EVENT[69]: 0.000893750 - core[0].svSysDesc(14), plen 0: [desc: I#71=TG1_LACT_EDGE] -EVENT[70]: 0.000909350 - core[0].svSysDesc(14), plen 0: [desc: I#72=MMU_IA] -EVENT[71]: 0.000925000 - core[0].svSysDesc(14), plen 0: [desc: I#73=MPU_IA] -EVENT[72]: 0.000937125 - core[0].svSysDesc(14), plen 0: [desc: I#74=CACHE_IA] -EVENT[73]: 0.000945400 - core[0].svSysTimeUs(13), plen 0: [time: 10000] -EVENT[74]: 0.001060300 - core[0].svTaskInfo(9), plen 0: [tid: 12253204, prio: 24, name: ipc0] -EVENT[75]: 0.001065550 - core[0].svStackInfo(21), plen 0: [tid: 12253204, base: 1073410064, sz: 1344, unused: 0] -EVENT[76]: 0.001174450 - core[0].svTaskInfo(9), plen 0: [tid: 12253560, prio: 24, name: ipc1] -EVENT[77]: 0.001179775 - core[0].svStackInfo(21), plen 0: [tid: 12253560, base: 1073431024, sz: 1344, unused: 0] -EVENT[78]: 0.001331775 - core[0].svTaskInfo(9), plen 0: [tid: 12254080, prio: 1, name: main] -EVENT[79]: 0.001337150 - core[0].svStackInfo(21), plen 0: [tid: 12254080, base: 1073433076, sz: 1916, unused: 0] -EVENT[80]: 0.001344450 - core[0].svNumModules(27), plen 1: [mod_cnt: 0] -EVENT[81]: 0.001351275 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[82]: 0.001362850 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[83]: 0.001373800 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[84]: 0.001384750 - core[0].svTaskStartReady(6), plen 0: [tid: 12254080] -EVENT[85]: 0.001399850 - core[0].svIsrExit(3), plen 0: [] -EVENT[86]: 0.001410650 - core[1].svIdle(17), plen 0: [] -EVENT[87]: 0.001422175 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[88]: 0.001433675 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[89]: 0.001450025 - core[0].svTaskStartExec(4), plen 0: [tid: 12254080] -EVENT[90]: 0.001476900 - core[0].svModuleDesc(22), plen 0: [mod_id: 0, evt_off: 512, desc: M=ESP32 SystemView Heap Tracing Module] -EVENT[91]: 0.001532525 - core[0].esp_sysview_heap_trace_alloc(512), plen 40: [addr: 1073443032, size: 8, callers: [1074274287, 1074274340, 1074325096, 1074621423, 1074686267, 1074302356, 0, 0, 0, 0]] -[0.001532525] HEAP: Allocated 8 bytes @ 0x3ffb70d8 from task "main" on core 0 by: +EVENT[0]: 0.000000000 - core[0].svNop(0), plen 0: [] +EVENT[1]: 0.000000000 - core[0].svNop(0), plen 0: [] +EVENT[2]: 0.000000000 - core[0].svNop(0), plen 0: [] +EVENT[3]: 0.000000000 - core[0].svNop(0), plen 0: [] +EVENT[4]: 0.000000000 - core[0].svNop(0), plen 0: [] +EVENT[5]: 0.000000000 - core[0].svTraceStart(10), plen 0: [] +EVENT[6]: 0.000000000 - core[1].svNop(0), plen 0: [] +EVENT[7]: 0.000000000 - core[1].svNop(0), plen 0: [] +EVENT[8]: 0.000000000 - core[1].svNop(0), plen 0: [] +EVENT[9]: 0.000000000 - core[1].svNop(0), plen 0: [] +EVENT[10]: 0.000000000 - core[1].svNop(0), plen 0: [] +EVENT[11]: 0.000000000 - core[1].svTraceStart(10), plen 0: [] +EVENT[12]: 0.000006650 - core[0].svInit(24), plen 14: [sys_freq: 40000000, cpu_freq: 160000000, ram_base: 1061158912, id_shift: 0] +EVENT[13]: 0.000006650 - core[1].svInit(24), plen 14: [sys_freq: 40000000, cpu_freq: 160000000, ram_base: 1061158912, id_shift: 0] +EVENT[14]: 0.000018600 - core[0].svSysDesc(14), plen 0: [desc: N=FreeRTOS Application,D=esp32,C=xtensa,O=FreeRTOS] +EVENT[15]: 0.000018600 - core[1].svSysDesc(14), plen 0: [desc: N=FreeRTOS Application,D=esp32,C=xtensa,O=FreeRTOS] +EVENT[16]: 0.000027750 - core[0].svSysDesc(14), plen 0: [desc: I#5=SysTick] +EVENT[17]: 0.000027750 - core[1].svSysDesc(14), plen 0: [desc: I#5=SysTick] +EVENT[18]: 0.000045900 - core[0].svSysDesc(14), plen 0: [desc: I#6=WIFI_MAC] +EVENT[19]: 0.000045900 - core[1].svSysDesc(14), plen 0: [desc: I#6=WIFI_MAC] +EVENT[20]: 0.000060025 - core[0].svSysDesc(14), plen 0: [desc: I#7=WIFI_NMI] +EVENT[21]: 0.000060025 - core[1].svSysDesc(14), plen 0: [desc: I#7=WIFI_NMI] +EVENT[22]: 0.000069975 - core[0].svSysDesc(14), plen 0: [desc: I#8=WIFI_BB] +EVENT[23]: 0.000069975 - core[1].svSysDesc(14), plen 0: [desc: I#8=WIFI_BB] +EVENT[24]: 0.000079725 - core[0].svSysDesc(14), plen 0: [desc: I#9=BT_MAC] +EVENT[25]: 0.000079725 - core[1].svSysDesc(14), plen 0: [desc: I#9=BT_MAC] +EVENT[26]: 0.000093800 - core[0].svSysDesc(14), plen 0: [desc: I#10=BT_BB] +EVENT[27]: 0.000093800 - core[1].svSysDesc(14), plen 0: [desc: I#10=BT_BB] +EVENT[28]: 0.000108600 - core[0].svSysDesc(14), plen 0: [desc: I#11=BT_BB_NMI] +EVENT[29]: 0.000108600 - core[1].svSysDesc(14), plen 0: [desc: I#11=BT_BB_NMI] +EVENT[30]: 0.000118550 - core[0].svSysDesc(14), plen 0: [desc: I#12=RWBT] +EVENT[31]: 0.000118550 - core[1].svSysDesc(14), plen 0: [desc: I#12=RWBT] +EVENT[32]: 0.000128550 - core[0].svSysDesc(14), plen 0: [desc: I#13=RWBLE] +EVENT[33]: 0.000128550 - core[1].svSysDesc(14), plen 0: [desc: I#13=RWBLE] +EVENT[34]: 0.000143075 - core[0].svSysDesc(14), plen 0: [desc: I#14=RWBT_NMI] +EVENT[35]: 0.000143075 - core[1].svSysDesc(14), plen 0: [desc: I#14=RWBT_NMI] +EVENT[36]: 0.000153900 - core[0].svSysDesc(14), plen 0: [desc: I#15=RWBLE_NMI] +EVENT[37]: 0.000153900 - core[1].svSysDesc(14), plen 0: [desc: I#15=RWBLE_NMI] +EVENT[38]: 0.000168200 - core[0].svSysDesc(14), plen 0: [desc: I#16=SLC0] +EVENT[39]: 0.000168200 - core[1].svSysDesc(14), plen 0: [desc: I#16=SLC0] +EVENT[40]: 0.000181925 - core[0].svSysDesc(14), plen 0: [desc: I#17=SLC1] +EVENT[41]: 0.000181925 - core[1].svSysDesc(14), plen 0: [desc: I#17=SLC1] +EVENT[42]: 0.000195875 - core[0].svSysDesc(14), plen 0: [desc: I#18=UHCI0] +EVENT[43]: 0.000195875 - core[1].svSysDesc(14), plen 0: [desc: I#18=UHCI0] +EVENT[44]: 0.000205850 - core[0].svSysDesc(14), plen 0: [desc: I#19=UHCI1] +EVENT[45]: 0.000205850 - core[1].svSysDesc(14), plen 0: [desc: I#19=UHCI1] +EVENT[46]: 0.000221150 - core[0].svSysDesc(14), plen 0: [desc: I#20=TG0_T0_LEVEL] +EVENT[47]: 0.000221150 - core[1].svSysDesc(14), plen 0: [desc: I#20=TG0_T0_LEVEL] +EVENT[48]: 0.000232575 - core[0].svSysDesc(14), plen 0: [desc: I#21=TG0_T1_LEVEL] +EVENT[49]: 0.000232575 - core[1].svSysDesc(14), plen 0: [desc: I#21=TG0_T1_LEVEL] +EVENT[50]: 0.000248275 - core[0].svSysDesc(14), plen 0: [desc: I#22=TG0_WDT_LEVEL] +EVENT[51]: 0.000248275 - core[1].svSysDesc(14), plen 0: [desc: I#22=TG0_WDT_LEVEL] +EVENT[52]: 0.000260075 - core[0].svSysDesc(14), plen 0: [desc: I#23=TG0_LACT_LEVEL] +EVENT[53]: 0.000260075 - core[1].svSysDesc(14), plen 0: [desc: I#23=TG0_LACT_LEVEL] +EVENT[54]: 0.000275525 - core[0].svSysDesc(14), plen 0: [desc: I#24=TG1_T0_LEVEL] +EVENT[55]: 0.000275525 - core[1].svSysDesc(14), plen 0: [desc: I#24=TG1_T0_LEVEL] +EVENT[56]: 0.000287000 - core[0].svSysDesc(14), plen 0: [desc: I#25=TG1_T1_LEVEL] +EVENT[57]: 0.000287000 - core[1].svSysDesc(14), plen 0: [desc: I#25=TG1_T1_LEVEL] +EVENT[58]: 0.000306525 - core[0].svSysDesc(14), plen 0: [desc: I#26=TG1_WDT_LEVEL] +EVENT[59]: 0.000306525 - core[1].svSysDesc(14), plen 0: [desc: I#26=TG1_WDT_LEVEL] +EVENT[60]: 0.000318500 - core[0].svSysDesc(14), plen 0: [desc: I#27=TG1_LACT_LEVEL] +EVENT[61]: 0.000318500 - core[1].svSysDesc(14), plen 0: [desc: I#27=TG1_LACT_LEVEL] +EVENT[62]: 0.000328425 - core[0].svSysDesc(14), plen 0: [desc: I#28=GPIO] +EVENT[63]: 0.000328425 - core[1].svSysDesc(14), plen 0: [desc: I#28=GPIO] +EVENT[64]: 0.000347375 - core[0].svSysDesc(14), plen 0: [desc: I#29=GPIO_NMI] +EVENT[65]: 0.000347375 - core[1].svSysDesc(14), plen 0: [desc: I#29=GPIO_NMI] +EVENT[66]: 0.000358275 - core[0].svSysDesc(14), plen 0: [desc: I#30=FROM_CPU0] +EVENT[67]: 0.000358275 - core[1].svSysDesc(14), plen 0: [desc: I#30=FROM_CPU0] +EVENT[68]: 0.000369025 - core[0].svSysDesc(14), plen 0: [desc: I#31=FROM_CPU1] +EVENT[69]: 0.000369025 - core[1].svSysDesc(14), plen 0: [desc: I#31=FROM_CPU1] +EVENT[70]: 0.000383800 - core[0].svSysDesc(14), plen 0: [desc: I#32=FROM_CPU2] +EVENT[71]: 0.000383800 - core[1].svSysDesc(14), plen 0: [desc: I#32=FROM_CPU2] +EVENT[72]: 0.000394550 - core[0].svSysDesc(14), plen 0: [desc: I#33=FROM_CPU3] +EVENT[73]: 0.000394550 - core[1].svSysDesc(14), plen 0: [desc: I#33=FROM_CPU3] +EVENT[74]: 0.000408325 - core[0].svSysDesc(14), plen 0: [desc: I#34=SPI0] +EVENT[75]: 0.000408325 - core[1].svSysDesc(14), plen 0: [desc: I#34=SPI0] +EVENT[76]: 0.000422050 - core[0].svSysDesc(14), plen 0: [desc: I#35=SPI1] +EVENT[77]: 0.000422050 - core[1].svSysDesc(14), plen 0: [desc: I#35=SPI1] +EVENT[78]: 0.000431850 - core[0].svSysDesc(14), plen 0: [desc: I#36=SPI2] +EVENT[79]: 0.000431850 - core[1].svSysDesc(14), plen 0: [desc: I#36=SPI2] +EVENT[80]: 0.000441625 - core[0].svSysDesc(14), plen 0: [desc: I#37=SPI3] +EVENT[81]: 0.000441625 - core[1].svSysDesc(14), plen 0: [desc: I#37=SPI3] +EVENT[82]: 0.000452800 - core[0].svSysDesc(14), plen 0: [desc: I#38=I2S0] +EVENT[83]: 0.000452800 - core[1].svSysDesc(14), plen 0: [desc: I#38=I2S0] +EVENT[84]: 0.000468025 - core[0].svSysDesc(14), plen 0: [desc: I#39=I2S1] +EVENT[85]: 0.000468025 - core[1].svSysDesc(14), plen 0: [desc: I#39=I2S1] +EVENT[86]: 0.000479250 - core[0].svSysDesc(14), plen 0: [desc: I#40=UART0] +EVENT[87]: 0.000479250 - core[1].svSysDesc(14), plen 0: [desc: I#40=UART0] +EVENT[88]: 0.000490675 - core[0].svSysDesc(14), plen 0: [desc: I#41=UART1] +EVENT[89]: 0.000490675 - core[1].svSysDesc(14), plen 0: [desc: I#41=UART1] +EVENT[90]: 0.000506125 - core[0].svSysDesc(14), plen 0: [desc: I#42=UART2] +EVENT[91]: 0.000506125 - core[1].svSysDesc(14), plen 0: [desc: I#42=UART2] +EVENT[92]: 0.000522400 - core[0].svSysDesc(14), plen 0: [desc: I#43=SDIO_HOST] +EVENT[93]: 0.000522400 - core[1].svSysDesc(14), plen 0: [desc: I#43=SDIO_HOST] +EVENT[94]: 0.000534425 - core[0].svSysDesc(14), plen 0: [desc: I#44=ETH_MAC] +EVENT[95]: 0.000534425 - core[1].svSysDesc(14), plen 0: [desc: I#44=ETH_MAC] +EVENT[96]: 0.000550275 - core[0].svSysDesc(14), plen 0: [desc: I#45=PWM0] +EVENT[97]: 0.000550275 - core[1].svSysDesc(14), plen 0: [desc: I#45=PWM0] +EVENT[98]: 0.000565375 - core[0].svSysDesc(14), plen 0: [desc: I#46=PWM1] +EVENT[99]: 0.000565375 - core[1].svSysDesc(14), plen 0: [desc: I#46=PWM1] +EVENT[100]: 0.000577225 - core[0].svSysDesc(14), plen 0: [desc: I#47=RESERVED] +EVENT[101]: 0.000577225 - core[1].svSysDesc(14), plen 0: [desc: I#47=RESERVED] +EVENT[102]: 0.000589025 - core[0].svSysDesc(14), plen 0: [desc: I#48=RESERVED] +EVENT[103]: 0.000589025 - core[1].svSysDesc(14), plen 0: [desc: I#48=RESERVED] +EVENT[104]: 0.000600050 - core[0].svSysDesc(14), plen 0: [desc: I#49=LEDC] +EVENT[105]: 0.000600050 - core[1].svSysDesc(14), plen 0: [desc: I#49=LEDC] +EVENT[106]: 0.000619275 - core[0].svSysDesc(14), plen 0: [desc: I#50=EFUSE] +EVENT[107]: 0.000619275 - core[1].svSysDesc(14), plen 0: [desc: I#50=EFUSE] +EVENT[108]: 0.000630775 - core[0].svSysDesc(14), plen 0: [desc: I#51=TWAI] +EVENT[109]: 0.000630775 - core[1].svSysDesc(14), plen 0: [desc: I#51=TWAI] +EVENT[110]: 0.000646650 - core[0].svSysDesc(14), plen 0: [desc: I#52=RTC_CORE] +EVENT[111]: 0.000646650 - core[1].svSysDesc(14), plen 0: [desc: I#52=RTC_CORE] +EVENT[112]: 0.000657625 - core[0].svSysDesc(14), plen 0: [desc: I#53=RMT] +EVENT[113]: 0.000657625 - core[1].svSysDesc(14), plen 0: [desc: I#53=RMT] +EVENT[114]: 0.000668850 - core[0].svSysDesc(14), plen 0: [desc: I#54=PCNT] +EVENT[115]: 0.000668850 - core[1].svSysDesc(14), plen 0: [desc: I#54=PCNT] +EVENT[116]: 0.000685000 - core[0].svSysDesc(14), plen 0: [desc: I#55=I2C_EXT0] +EVENT[117]: 0.000685000 - core[1].svSysDesc(14), plen 0: [desc: I#55=I2C_EXT0] +EVENT[118]: 0.000696775 - core[0].svSysDesc(14), plen 0: [desc: I#56=I2C_EXT1] +EVENT[119]: 0.000696775 - core[1].svSysDesc(14), plen 0: [desc: I#56=I2C_EXT1] +EVENT[120]: 0.000707625 - core[0].svSysDesc(14), plen 0: [desc: I#57=RSA] +EVENT[121]: 0.000707625 - core[1].svSysDesc(14), plen 0: [desc: I#57=RSA] +EVENT[122]: 0.000723625 - core[0].svSysDesc(14), plen 0: [desc: I#58=SPI1_DMA] +EVENT[123]: 0.000723625 - core[1].svSysDesc(14), plen 0: [desc: I#58=SPI1_DMA] +EVENT[124]: 0.000739800 - core[0].svSysDesc(14), plen 0: [desc: I#59=SPI2_DMA] +EVENT[125]: 0.000739800 - core[1].svSysDesc(14), plen 0: [desc: I#59=SPI2_DMA] +EVENT[126]: 0.000752125 - core[0].svSysDesc(14), plen 0: [desc: I#60=SPI3_DMA] +EVENT[127]: 0.000752125 - core[1].svSysDesc(14), plen 0: [desc: I#60=SPI3_DMA] +EVENT[128]: 0.000763075 - core[0].svSysDesc(14), plen 0: [desc: I#61=WDT] +EVENT[129]: 0.000763075 - core[1].svSysDesc(14), plen 0: [desc: I#61=WDT] +EVENT[130]: 0.000783475 - core[0].svSysDesc(14), plen 0: [desc: I#62=TIMER1] +EVENT[131]: 0.000783475 - core[1].svSysDesc(14), plen 0: [desc: I#62=TIMER1] +EVENT[132]: 0.000795000 - core[0].svSysDesc(14), plen 0: [desc: I#63=TIMER2] +EVENT[133]: 0.000795000 - core[1].svSysDesc(14), plen 0: [desc: I#63=TIMER2] +EVENT[134]: 0.000808000 - core[0].svSysDesc(14), plen 0: [desc: I#64=TG0_T0_EDGE] +EVENT[135]: 0.000808000 - core[1].svSysDesc(14), plen 0: [desc: I#64=TG0_T0_EDGE] +EVENT[136]: 0.000824900 - core[0].svSysDesc(14), plen 0: [desc: I#65=TG0_T1_EDGE] +EVENT[137]: 0.000824900 - core[1].svSysDesc(14), plen 0: [desc: I#65=TG0_T1_EDGE] +EVENT[138]: 0.000841650 - core[0].svSysDesc(14), plen 0: [desc: I#66=TG0_WDT_EDGE] +EVENT[139]: 0.000841650 - core[1].svSysDesc(14), plen 0: [desc: I#66=TG0_WDT_EDGE] +EVENT[140]: 0.000858925 - core[0].svSysDesc(14), plen 0: [desc: I#67=TG0_LACT_EDGE] +EVENT[141]: 0.000858925 - core[1].svSysDesc(14), plen 0: [desc: I#67=TG0_LACT_EDGE] +EVENT[142]: 0.000871750 - core[0].svSysDesc(14), plen 0: [desc: I#68=TG1_T0_EDGE] +EVENT[143]: 0.000871750 - core[1].svSysDesc(14), plen 0: [desc: I#68=TG1_T0_EDGE] +EVENT[144]: 0.000884400 - core[0].svSysDesc(14), plen 0: [desc: I#69=TG1_T1_EDGE] +EVENT[145]: 0.000884400 - core[1].svSysDesc(14), plen 0: [desc: I#69=TG1_T1_EDGE] +EVENT[146]: 0.000901550 - core[0].svSysDesc(14), plen 0: [desc: I#70=TG1_WDT_EDGE] +EVENT[147]: 0.000901550 - core[1].svSysDesc(14), plen 0: [desc: I#70=TG1_WDT_EDGE] +EVENT[148]: 0.000914850 - core[0].svSysDesc(14), plen 0: [desc: I#71=TG1_LACT_EDGE] +EVENT[149]: 0.000914850 - core[1].svSysDesc(14), plen 0: [desc: I#71=TG1_LACT_EDGE] +EVENT[150]: 0.000930350 - core[0].svSysDesc(14), plen 0: [desc: I#72=MMU_IA] +EVENT[151]: 0.000930350 - core[1].svSysDesc(14), plen 0: [desc: I#72=MMU_IA] +EVENT[152]: 0.000941925 - core[0].svSysDesc(14), plen 0: [desc: I#73=MPU_IA] +EVENT[153]: 0.000941925 - core[1].svSysDesc(14), plen 0: [desc: I#73=MPU_IA] +EVENT[154]: 0.000958150 - core[0].svSysDesc(14), plen 0: [desc: I#74=CACHE_IA] +EVENT[155]: 0.000958150 - core[1].svSysDesc(14), plen 0: [desc: I#74=CACHE_IA] +EVENT[156]: 0.000968650 - core[0].svSysTimeCycles(12), plen 0: [cycles: 2739609] +EVENT[157]: 0.000968650 - core[1].svSysTimeCycles(12), plen 0: [cycles: 2739609] +EVENT[158]: 0.001084500 - core[0].svTaskInfo(9), plen 0: [tid: 12252316, prio: 24, name: ipc0] +EVENT[159]: 0.001084500 - core[1].svTaskInfo(9), plen 0: [tid: 12252316, prio: 24, name: ipc0] +EVENT[160]: 0.001089775 - core[0].svStackInfo(21), plen 0: [tid: 12252316, base: 1073409176, sz: 1352, unused: 0] +EVENT[161]: 0.001089775 - core[1].svStackInfo(21), plen 0: [tid: 12252316, base: 1073409176, sz: 1352, unused: 0] +EVENT[162]: 0.001195350 - core[0].svTaskInfo(9), plen 0: [tid: 12254724, prio: 24, name: ipc1] +EVENT[163]: 0.001195350 - core[1].svTaskInfo(9), plen 0: [tid: 12254724, prio: 24, name: ipc1] +EVENT[164]: 0.001200800 - core[0].svStackInfo(21), plen 0: [tid: 12254724, base: 1073411584, sz: 1344, unused: 0] +EVENT[165]: 0.001200800 - core[1].svStackInfo(21), plen 0: [tid: 12254724, base: 1073411584, sz: 1344, unused: 0] +EVENT[166]: 0.001388725 - core[0].svTaskInfo(9), plen 0: [tid: 12274964, prio: 1, name: main] +EVENT[167]: 0.001388725 - core[1].svTaskInfo(9), plen 0: [tid: 12274964, prio: 1, name: main] +EVENT[168]: 0.001394000 - core[0].svStackInfo(21), plen 0: [tid: 12274964, base: 1073429776, sz: 2400, unused: 0] +EVENT[169]: 0.001394000 - core[1].svStackInfo(21), plen 0: [tid: 12274964, base: 1073429776, sz: 2400, unused: 0] +EVENT[170]: 0.001401225 - core[0].svNumModules(27), plen 1: [mod_cnt: 0] +EVENT[171]: 0.001401225 - core[1].svNumModules(27), plen 1: [mod_cnt: 0] +EVENT[172]: 0.001407975 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[173]: 0.001419700 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[174]: 0.001430725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[175]: 0.001441675 - core[0].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[176]: 0.001441675 - core[1].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[177]: 0.001456950 - core[0].svIsrExit(3), plen 0: [] +EVENT[178]: 0.001467975 - core[1].svIdle(17), plen 0: [] +EVENT[179]: 0.001479225 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[180]: 0.001490125 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[181]: 0.001501375 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[182]: 0.001512375 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[183]: 0.001523775 - core[0].svTaskStartExec(4), plen 0: [tid: 12274964] +EVENT[184]: 0.001554300 - core[0].svModuleDesc(22), plen 0: [mod_id: 0, evt_off: 512, desc: M=ESP32 SystemView Heap Tracing Module] +EVENT[185]: 0.001554300 - core[1].svModuleDesc(22), plen 0: [mod_id: 0, evt_off: 512, desc: M=ESP32 SystemView Heap Tracing Module] +EVENT[186]: 0.001566225 - core[1].svIdle(17), plen 0: [] +EVENT[187]: 0.001577550 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[188]: 0.001593250 - core[0].svIsrExit(3), plen 0: [] +EVENT[189]: 0.001650800 - core[0].esp_sysview_heap_trace_alloc(512), plen 40: [addr: 1073440928, size: 8, callers: [1074274047, 1074274100, 1074321944, 1074609327, 1074673816, 1074299100, 0, 0, 0, 0]] +[0.001650800] HEAP: Allocated 8 bytes @ 0x3ffb68a0 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:87 -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[92]: 0.001666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[93]: 0.001679850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[94]: 0.001696525 - core[1].svIdle(17), plen 0: [] -EVENT[95]: 0.001833550 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[96]: 0.001848925 - core[0].svIsrExit(3), plen 0: [] -EVENT[97]: 0.001870025 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073443048, size: 2500, callers: [1074274287, 1074304020, 1074311940, 1074621496, 1074686267, 1074302356, 0, 0, 0, 0]] -[0.001870025] HEAP: Allocated 2500 bytes @ 0x3ffb70e8 from task "main" on core 0 by: +EVENT[190]: 0.001952550 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073440944, size: 2500, callers: [1074274047, 1074300704, 1074308624, 1074609400, 1074673816, 1074299100, 0, 0, 0, 0]] +[0.001952550] HEAP: Allocated 2500 bytes @ 0x3ffb68b0 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[98]: 0.001909875 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073445612, size: 340, callers: [1074274287, 1074304020, 1074311951, 1074621496, 1074686267, 1074302356, 0, 0, 0, 0]] -[0.001909875] HEAP: Allocated 340 bytes @ 0x3ffb7aec from task "main" on core 0 by: +EVENT[191]: 0.001993450 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073443508, size: 340, callers: [1074274047, 1074300704, 1074308635, 1074609400, 1074673816, 1074299100, 0, 0, 0, 0]] +[0.001993450] HEAP: Allocated 340 bytes @ 0x3ffb72b4 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[99]: 0.001932550 - core[0].svTaskCreate(8), plen 0: [tid: 12286700] -EVENT[100]: 0.001945175 - core[0].svTaskInfo(9), plen 0: [tid: 12286700, prio: 5, name: alloc0] -EVENT[101]: 0.001954275 - core[0].svStackInfo(21), plen 0: [tid: 12286700, base: 1073443048, sz: 4294965096, unused: 0] -EVENT[102]: 0.001964975 - core[0].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[103]: 0.001980675 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[104]: 0.001992175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[105]: 0.002008650 - core[0].svTaskStartExec(4), plen 0: [tid: 12286700] -EVENT[106]: 0.002044025 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073445968, size: 124, callers: [1074274287, 1074304020, 1074300537, 1074621092, 1074302356, 0, 0, 0, 0, 0]] -[0.002044025] HEAP: Allocated 124 bytes @ 0x3ffb7c50 from task "alloc0" on core 0 by: +EVENT[192]: 0.002024125 - core[0].svTaskCreate(8), plen 0: [tid: 12284596] +EVENT[193]: 0.002036775 - core[0].svTaskInfo(9), plen 0: [tid: 12284596, prio: 5, name: alloc0] +EVENT[194]: 0.002036775 - core[1].svTaskInfo(9), plen 0: [tid: 12284596, prio: 5, name: alloc0] +EVENT[195]: 0.002045900 - core[0].svStackInfo(21), plen 0: [tid: 12284596, base: 1073440944, sz: 4294965088, unused: 0] +EVENT[196]: 0.002045900 - core[1].svStackInfo(21), plen 0: [tid: 12284596, base: 1073440944, sz: 4294965088, unused: 0] +EVENT[197]: 0.002056625 - core[0].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[198]: 0.002056625 - core[1].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[199]: 0.002072325 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[200]: 0.002083675 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[201]: 0.002100025 - core[0].svTaskStartExec(4), plen 0: [tid: 12284596] +EVENT[202]: 0.002144425 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073443864, size: 124, callers: [1074274047, 1074300704, 1074297281, 1074608996, 1074299100, 0, 0, 0, 0, 0]] +[0.002144425] HEAP: Allocated 124 bytes @ 0x3ffb7418 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/queue.c:545 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:48 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[107]: 0.002058325 - core[0].xQueueGenericCreate(47), plen 3: [uxQueueLength: 10, uxItemSize: 4, ucQueueType: 0] -EVENT[108]: 0.002113550 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073446096, size: 2500, callers: [1074274287, 1074304020, 1074311940, 1074621152, 1074302356, 0, 0, 0, 0, 0]] -[0.002113550] HEAP: Allocated 2500 bytes @ 0x3ffb7cd0 from task "alloc0" on core 0 by: +EVENT[203]: 0.002158725 - core[0].xQueueGenericCreate(47), plen 3: [uxQueueLength: 10, uxItemSize: 4, ucQueueType: 0] +EVENT[204]: 0.002218950 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073443992, size: 2500, callers: [1074274047, 1074300704, 1074308624, 1074609056, 1074299100, 0, 0, 0, 0, 0]] +[0.002218950] HEAP: Allocated 2500 bytes @ 0x3ffb7498 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[109]: 0.002147950 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073448660, size: 340, callers: [1074274287, 1074304020, 1074311951, 1074621152, 1074302356, 0, 0, 0, 0, 0]] -[0.002147950] HEAP: Allocated 340 bytes @ 0x3ffb86d4 from task "alloc0" on core 0 by: +EVENT[205]: 0.002254400 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073446556, size: 340, callers: [1074274047, 1074300704, 1074308635, 1074609056, 1074299100, 0, 0, 0, 0, 0]] +[0.002254400] HEAP: Allocated 340 bytes @ 0x3ffb7e9c from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[110]: 0.002174650 - core[0].svTaskCreate(8), plen 0: [tid: 12289748] -EVENT[111]: 0.002187150 - core[0].svTaskInfo(9), plen 0: [tid: 12289748, prio: 5, name: free0] -EVENT[112]: 0.002196300 - core[0].svStackInfo(21), plen 0: [tid: 12289748, base: 1073446096, sz: 4294965088, unused: 0] -EVENT[113]: 0.002207125 - core[0].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[114]: 0.002222500 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[115]: 0.002235400 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[116]: 0.002251800 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073449016, size: 1, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.002251800] HEAP: Allocated 1 bytes @ 0x3ffb8838 from task "alloc0" on core 0 by: +EVENT[206]: 0.002281100 - core[0].svTaskCreate(8), plen 0: [tid: 12287644] +EVENT[207]: 0.002293625 - core[0].svTaskInfo(9), plen 0: [tid: 12287644, prio: 5, name: free0] +EVENT[208]: 0.002293625 - core[1].svTaskInfo(9), plen 0: [tid: 12287644, prio: 5, name: free0] +EVENT[209]: 0.002302800 - core[0].svStackInfo(21), plen 0: [tid: 12287644, base: 1073443992, sz: 4294965096, unused: 0] +EVENT[210]: 0.002302800 - core[1].svStackInfo(21), plen 0: [tid: 12287644, base: 1073443992, sz: 4294965096, unused: 0] +EVENT[211]: 0.002313650 - core[0].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[212]: 0.002313650 - core[1].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[213]: 0.002329000 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[214]: 0.002342325 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[215]: 0.002359325 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073446912, size: 1, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.002359325] HEAP: Allocated 1 bytes @ 0x3ffb8000 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[117]: 0.002263100 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[118]: 0.002293125 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[119]: 0.002304050 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073449032, size: 2, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.002304050] HEAP: Allocated 2 bytes @ 0x3ffb8848 from task "alloc0" on core 0 by: +EVENT[216]: 0.002370750 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[217]: 0.002400875 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[218]: 0.002412175 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073446928, size: 2, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.002412175] HEAP: Allocated 2 bytes @ 0x3ffb8010 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[120]: 0.002315125 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[121]: 0.002327775 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[122]: 0.002338225 - core[1].svIdle(17), plen 0: [] -EVENT[123]: 0.002372400 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[124]: 0.002611675 - core[0].svPrint(26), plen 69: [msg: I (310) example: Task[0x3ffb7aec]: allocated 2 bytes @ 0x3ffb8848 +EVENT[219]: 0.002423750 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[220]: 0.002436000 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[221]: 0.002447000 - core[1].svIdle(17), plen 0: [] +EVENT[222]: 0.002462975 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[223]: 0.002476525 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[224]: 0.002487925 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[225]: 0.002499075 - core[1].svIdle(17), plen 0: [] +EVENT[226]: 0.002748650 - core[0].svPrint(26), plen 69: [msg: I (297) example: Task[0x3ffb72b4]: allocated 2 bytes @ 0x3ffb8010 , lvl: 0, unused: 0] -[0.002611675] LOG: I (310) example: Task[0x3ffb7aec]: allocated 2 bytes @ 0x3ffb8848 -EVENT[125]: 0.002633250 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12287056, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[126]: 0.002646375 - core[0].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[127]: 0.002662575 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[128]: 0.002673450 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[129]: 0.002684225 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[130]: 0.002698400 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[131]: 0.002709150 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[132]: 0.002720075 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[133]: 0.002731625 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[134]: 0.002742100 - core[0].svTaskStartExec(4), plen 0: [tid: 12254080] -EVENT[135]: 0.002759600 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[136]: 0.002776550 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12287056, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[137]: 0.002788050 - core[0].esp_sysview_heap_trace_alloc(512), plen 40: [addr: 1073449048, size: 8, callers: [1074274287, 1074274340, 1074325096, 1074621423, 1074686267, 1074302356, 0, 0, 0, 0]] -[0.002788050] HEAP: Allocated 8 bytes @ 0x3ffb8858 from task "main" on core 0 by: +[0.002748650] LOG: I (297) example: Task[0x3ffb72b4]: allocated 2 bytes @ 0x3ffb8010 +EVENT[227]: 0.002765925 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[228]: 0.002781300 - core[0].svIsrExit(3), plen 0: [] +EVENT[229]: 0.002795350 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12284952, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[230]: 0.002808550 - core[0].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[231]: 0.002808550 - core[1].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[232]: 0.002824800 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[233]: 0.002835750 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[234]: 0.002846450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[235]: 0.002860225 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[236]: 0.002870975 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[237]: 0.002881775 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[238]: 0.002893725 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12284952, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[239]: 0.002904450 - core[0].svTaskStartExec(4), plen 0: [tid: 12274964] +EVENT[240]: 0.002943850 - core[0].esp_sysview_heap_trace_alloc(512), plen 40: [addr: 1073446944, size: 8, callers: [1074274047, 1074274100, 1074321944, 1074609327, 1074673816, 1074299100, 0, 0, 0, 0]] +[0.002943850] HEAP: Allocated 8 bytes @ 0x3ffb8020 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:87 -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[138]: 0.002824000 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[139]: 0.002835875 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[140]: 0.002851250 - core[0].svIsrExit(3), plen 0: [] -EVENT[141]: 0.002863625 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073449064, size: 2500, callers: [1074274287, 1074304020, 1074311940, 1074621496, 1074686267, 1074302356, 0, 0, 0, 0]] -[0.002863625] HEAP: Allocated 2500 bytes @ 0x3ffb8868 from task "main" on core 0 by: +EVENT[241]: 0.002956000 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[242]: 0.002990650 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073446960, size: 2500, callers: [1074274047, 1074300704, 1074308624, 1074609400, 1074673816, 1074299100, 0, 0, 0, 0]] +[0.002990650] HEAP: Allocated 2500 bytes @ 0x3ffb8030 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[142]: 0.002878375 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[143]: 0.002905675 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073451628, size: 340, callers: [1074274287, 1074304020, 1074311951, 1074621496, 1074686267, 1074302356, 0, 0, 0, 0]] -[0.002905675] HEAP: Allocated 340 bytes @ 0x3ffb926c from task "main" on core 0 by: +EVENT[243]: 0.003010625 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[244]: 0.003033925 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073449524, size: 340, callers: [1074274047, 1074300704, 1074308635, 1074609400, 1074673816, 1074299100, 0, 0, 0, 0]] +[0.003033925] HEAP: Allocated 340 bytes @ 0x3ffb8a34 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[144]: 0.002928325 - core[0].svTaskCreate(8), plen 0: [tid: 12292716] -EVENT[145]: 0.002941000 - core[0].svTaskInfo(9), plen 0: [tid: 12292716, prio: 5, name: alloc1] -EVENT[146]: 0.002950000 - core[0].svStackInfo(21), plen 0: [tid: 12292716, base: 1073449064, sz: 4294965096, unused: 0] -EVENT[147]: 0.002960900 - core[0].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[148]: 0.002976625 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[149]: 0.002988000 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[150]: 0.003004850 - core[0].svTaskStartExec(4), plen 0: [tid: 12292716] -EVENT[151]: 0.003040300 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073451984, size: 124, callers: [1074274287, 1074304020, 1074300537, 1074621092, 1074302356, 0, 0, 0, 0, 0]] -[0.003040300] HEAP: Allocated 124 bytes @ 0x3ffb93d0 from task "alloc1" on core 0 by: +EVENT[245]: 0.003056650 - core[0].svTaskCreate(8), plen 0: [tid: 12290612] +EVENT[246]: 0.003069350 - core[0].svTaskInfo(9), plen 0: [tid: 12290612, prio: 5, name: alloc1] +EVENT[247]: 0.003069350 - core[1].svTaskInfo(9), plen 0: [tid: 12290612, prio: 5, name: alloc1] +EVENT[248]: 0.003078400 - core[0].svStackInfo(21), plen 0: [tid: 12290612, base: 1073446960, sz: 4294965088, unused: 0] +EVENT[249]: 0.003078400 - core[1].svStackInfo(21), plen 0: [tid: 12290612, base: 1073446960, sz: 4294965088, unused: 0] +EVENT[250]: 0.003089300 - core[0].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[251]: 0.003089300 - core[1].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[252]: 0.003104950 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[253]: 0.003116300 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[254]: 0.003132675 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[255]: 0.003169150 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073449880, size: 124, callers: [1074274047, 1074300704, 1074297281, 1074608996, 1074299100, 0, 0, 0, 0, 0]] +[0.003169150] HEAP: Allocated 124 bytes @ 0x3ffb8b98 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/queue.c:545 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:48 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[152]: 0.003054600 - core[0].xQueueGenericCreate(47), plen 3: [uxQueueLength: 10, uxItemSize: 4, ucQueueType: 0] -EVENT[153]: 0.003093950 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073452112, size: 2500, callers: [1074274287, 1074304020, 1074311940, 1074621152, 1074302356, 0, 0, 0, 0, 0]] -[0.003093950] HEAP: Allocated 2500 bytes @ 0x3ffb9450 from task "alloc1" on core 0 by: +EVENT[256]: 0.003183450 - core[0].xQueueGenericCreate(47), plen 3: [uxQueueLength: 10, uxItemSize: 4, ucQueueType: 0] +EVENT[257]: 0.003223850 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073450008, size: 2500, callers: [1074274047, 1074300704, 1074308624, 1074609056, 1074299100, 0, 0, 0, 0, 0]] +[0.003223850] HEAP: Allocated 2500 bytes @ 0x3ffb8c18 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[154]: 0.003128350 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073454676, size: 340, callers: [1074274287, 1074304020, 1074311951, 1074621152, 1074302356, 0, 0, 0, 0, 0]] -[0.003128350] HEAP: Allocated 340 bytes @ 0x3ffb9e54 from task "alloc1" on core 0 by: +EVENT[258]: 0.003259400 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073452572, size: 340, callers: [1074274047, 1074300704, 1074308635, 1074609056, 1074299100, 0, 0, 0, 0, 0]] +[0.003259400] HEAP: Allocated 340 bytes @ 0x3ffb961c from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[155]: 0.003155100 - core[0].svTaskCreate(8), plen 0: [tid: 12295764] -EVENT[156]: 0.003167600 - core[0].svTaskInfo(9), plen 0: [tid: 12295764, prio: 5, name: free1] -EVENT[157]: 0.003176775 - core[0].svStackInfo(21), plen 0: [tid: 12295764, base: 1073452112, sz: 4294965088, unused: 0] -EVENT[158]: 0.003187575 - core[0].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[159]: 0.003223700 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073455032, size: 2, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.003223700] HEAP: Allocated 2 bytes @ 0x3ffb9fb8 from task "alloc1" on core 0 by: +EVENT[259]: 0.003286175 - core[0].svTaskCreate(8), plen 0: [tid: 12293660] +EVENT[260]: 0.003298675 - core[0].svTaskInfo(9), plen 0: [tid: 12293660, prio: 5, name: free1] +EVENT[261]: 0.003298675 - core[1].svTaskInfo(9), plen 0: [tid: 12293660, prio: 5, name: free1] +EVENT[262]: 0.003307875 - core[0].svStackInfo(21), plen 0: [tid: 12293660, base: 1073450008, sz: 4294965096, unused: 0] +EVENT[263]: 0.003307875 - core[1].svStackInfo(21), plen 0: [tid: 12293660, base: 1073450008, sz: 4294965096, unused: 0] +EVENT[264]: 0.003318700 - core[0].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[265]: 0.003318700 - core[1].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[266]: 0.003355850 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073452928, size: 2, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.003355850] HEAP: Allocated 2 bytes @ 0x3ffb9780 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[160]: 0.003258100 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073455048, size: 4, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.003258100] HEAP: Allocated 4 bytes @ 0x3ffb9fc8 from task "alloc1" on core 0 by: +EVENT[267]: 0.003391275 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073452944, size: 4, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.003391275] HEAP: Allocated 4 bytes @ 0x3ffb9790 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[161]: 0.003275000 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[162]: 0.003296925 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[163]: 0.003339650 - core[1].svPrint(26), plen 63: [msg: I (310) example: Task[0x3ffb86d4]: free memory @ 0x3ffb8848 +EVENT[268]: 0.003408225 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[269]: 0.003428300 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[270]: 0.003484300 - core[1].svPrint(26), plen 63: [msg: I (298) example: Task[0x3ffb7e9c]: free memory @ 0x3ffb8010 , lvl: 0, unused: 0] -[0.003339650] LOG: I (310) example: Task[0x3ffb86d4]: free memory @ 0x3ffb8848 -EVENT[164]: 0.003359800 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[165]: 0.003371250 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[166]: 0.003388225 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[167]: 0.003407050 - core[0].svPrint(26), plen 69: [msg: I (311) example: Task[0x3ffb926c]: allocated 4 bytes @ 0x3ffb9fc8 +[0.003484300] LOG: I (298) example: Task[0x3ffb7e9c]: free memory @ 0x3ffb8010 +EVENT[271]: 0.003503800 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[272]: 0.003517225 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[273]: 0.003529075 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[274]: 0.003548800 - core[0].svPrint(26), plen 69: [msg: I (298) example: Task[0x3ffb8a34]: allocated 4 bytes @ 0x3ffb9790 , lvl: 0, unused: 0] -[0.003407050] LOG: I (311) example: Task[0x3ffb926c]: allocated 4 bytes @ 0x3ffb9fc8 -EVENT[168]: 0.003421150 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12293072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[169]: 0.003434300 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073449032, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.003434300] HEAP: Freed bytes @ 0x3ffb8848 from task "free0" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.003548800] LOG: I (298) example: Task[0x3ffb8a34]: allocated 4 bytes @ 0x3ffb9790 +EVENT[275]: 0.003560325 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[276]: 0.003571875 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[277]: 0.003582750 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[278]: 0.003598000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[279]: 0.003614550 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[280]: 0.003626250 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073446928, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.003626250] HEAP: Freed bytes @ 0x3ffb8010 from task "free0" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[170]: 0.003446125 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[171]: 0.003464800 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[172]: 0.003478750 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[173]: 0.003492825 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[174]: 0.003504725 - core[0].svTaskStartExec(4), plen 0: [tid: 12254080] -EVENT[175]: 0.003515600 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[176]: 0.003534850 - core[1].svTaskStartExec(4), plen 0: [tid: 12295764] -EVENT[177]: 0.003547175 - core[0].esp_sysview_heap_trace_alloc(512), plen 40: [addr: 1073449032, size: 8, callers: [1074274287, 1074274340, 1074325096, 1074621423, 1074686267, 1074302356, 0, 0, 0, 0]] -[0.003547175] HEAP: Allocated 8 bytes @ 0x3ffb8848 from task "main" on core 0 by: +EVENT[281]: 0.003637375 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12290968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[282]: 0.003651350 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[283]: 0.003671100 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[284]: 0.003685125 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[285]: 0.003699025 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[286]: 0.003710900 - core[0].svTaskStartExec(4), plen 0: [tid: 12274964] +EVENT[287]: 0.003721925 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[288]: 0.003741250 - core[1].svTaskStartExec(4), plen 0: [tid: 12293660] +EVENT[289]: 0.003754850 - core[0].esp_sysview_heap_trace_alloc(512), plen 40: [addr: 1073446928, size: 8, callers: [1074274047, 1074274100, 1074321944, 1074609327, 1074673816, 1074299100, 0, 0, 0, 0]] +[0.003754850] HEAP: Allocated 8 bytes @ 0x3ffb8010 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:87 -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[178]: 0.003564225 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12293072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[179]: 0.003582900 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[180]: 0.003600675 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073455064, size: 2500, callers: [1074274287, 1074304020, 1074311940, 1074621496, 1074686267, 1074302356, 0, 0, 0, 0]] -[0.003600675] HEAP: Allocated 2500 bytes @ 0x3ffb9fd8 from task "main" on core 0 by: +EVENT[290]: 0.003771850 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12290968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[291]: 0.003790150 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[292]: 0.003809225 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[293]: 0.003820975 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073452960, size: 2500, callers: [1074274047, 1074300704, 1074308624, 1074609400, 1074673816, 1074299100, 0, 0, 0, 0]] +[0.003820975] HEAP: Allocated 2500 bytes @ 0x3ffb97a0 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[181]: 0.003613400 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[182]: 0.003639925 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073457628, size: 340, callers: [1074274287, 1074304020, 1074311951, 1074621496, 1074686267, 1074302356, 0, 0, 0, 0]] -[0.003639925] HEAP: Allocated 340 bytes @ 0x3ffba9dc from task "main" on core 0 by: +EVENT[294]: 0.003862100 - core[1].svPrint(26), plen 63: [msg: I (299) example: Task[0x3ffb961c]: free memory @ 0x3ffb9790 +, lvl: 0, unused: 0] +[0.003862100] LOG: I (299) example: Task[0x3ffb961c]: free memory @ 0x3ffb9790 +EVENT[295]: 0.003874025 - core[0].esp_sysview_heap_trace_alloc(512), plen 41: [addr: 1073455524, size: 340, callers: [1074274047, 1074300704, 1074308635, 1074609400, 1074673816, 1074299100, 0, 0, 0, 0]] +[0.003874025] HEAP: Allocated 340 bytes @ 0x3ffba1a4 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[183]: 0.003663425 - core[1].svPrint(26), plen 63: [msg: I (311) example: Task[0x3ffb9e54]: free memory @ 0x3ffb9fc8 -, lvl: 0, unused: 0] -[0.003663425] LOG: I (311) example: Task[0x3ffb9e54]: free memory @ 0x3ffb9fc8 -EVENT[184]: 0.003674800 - core[0].svTaskCreate(8), plen 0: [tid: 12298716] -EVENT[185]: 0.003691000 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[186]: 0.003703775 - core[0].svTaskInfo(9), plen 0: [tid: 12298716, prio: 5, name: alloc2] -EVENT[187]: 0.003714750 - core[0].svStackInfo(21), plen 0: [tid: 12298716, base: 1073455064, sz: 4294965096, unused: 0] -EVENT[188]: 0.003727650 - core[0].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[189]: 0.003745100 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[190]: 0.003755950 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[191]: 0.003766625 - core[1].svTaskStartExec(4), plen 0: [tid: 12295764] -EVENT[192]: 0.003777475 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[193]: 0.003792825 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073455048, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.003792825] HEAP: Freed bytes @ 0x3ffb9fc8 from task "free1" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +EVENT[296]: 0.003887625 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073452944, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.003887625] HEAP: Freed bytes @ 0x3ffb9790 from task "free1" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[194]: 0.003804450 - core[0].svTaskStartExec(4), plen 0: [tid: 12298716] -EVENT[195]: 0.003827350 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[196]: 0.003839325 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[197]: 0.003850500 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[198]: 0.003862175 - core[0].svIsrExit(3), plen 0: [] -EVENT[199]: 0.003872050 - core[1].svIdle(17), plen 0: [] -EVENT[200]: 0.003888100 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073457984, size: 124, callers: [1074274287, 1074304020, 1074300537, 1074621092, 1074302356, 0, 0, 0, 0, 0]] -[0.003888100] HEAP: Allocated 124 bytes @ 0x3ffbab40 from task "alloc2" on core 0 by: +EVENT[297]: 0.003903450 - core[0].svTaskCreate(8), plen 0: [tid: 12296612] +EVENT[298]: 0.003918375 - core[0].svTaskInfo(9), plen 0: [tid: 12296612, prio: 5, name: alloc2] +EVENT[299]: 0.003918375 - core[1].svTaskInfo(9), plen 0: [tid: 12296612, prio: 5, name: alloc2] +EVENT[300]: 0.003929550 - core[0].svStackInfo(21), plen 0: [tid: 12296612, base: 1073452960, sz: 4294965088, unused: 0] +EVENT[301]: 0.003929550 - core[1].svStackInfo(21), plen 0: [tid: 12296612, base: 1073452960, sz: 4294965088, unused: 0] +EVENT[302]: 0.003942575 - core[0].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[303]: 0.003942575 - core[1].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[304]: 0.003961250 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[305]: 0.003975150 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[306]: 0.003989000 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[307]: 0.003999875 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[308]: 0.004011000 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[309]: 0.004033050 - core[1].svIdle(17), plen 0: [] +EVENT[310]: 0.004044725 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073455880, size: 124, callers: [1074274047, 1074300704, 1074297281, 1074608996, 1074299100, 0, 0, 0, 0, 0]] +[0.004044725] HEAP: Allocated 124 bytes @ 0x3ffba308 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/queue.c:545 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:48 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[201]: 0.003902475 - core[0].xQueueGenericCreate(47), plen 3: [uxQueueLength: 10, uxItemSize: 4, ucQueueType: 0] -EVENT[202]: 0.003941825 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073458112, size: 2500, callers: [1074274287, 1074304020, 1074311940, 1074621152, 1074302356, 0, 0, 0, 0, 0]] -[0.003941825] HEAP: Allocated 2500 bytes @ 0x3ffbabc0 from task "alloc2" on core 0 by: +EVENT[311]: 0.004059250 - core[0].xQueueGenericCreate(47), plen 3: [uxQueueLength: 10, uxItemSize: 4, ucQueueType: 0] +EVENT[312]: 0.004099675 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073456008, size: 2500, callers: [1074274047, 1074300704, 1074308624, 1074609056, 1074299100, 0, 0, 0, 0, 0]] +[0.004099675] HEAP: Allocated 2500 bytes @ 0x3ffba388 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[203]: 0.003976225 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073460676, size: 340, callers: [1074274287, 1074304020, 1074311951, 1074621152, 1074302356, 0, 0, 0, 0, 0]] -[0.003976225] HEAP: Allocated 340 bytes @ 0x3ffbb5c4 from task "alloc2" on core 0 by: +EVENT[313]: 0.004135150 - core[0].esp_sysview_heap_trace_alloc(512), plen 37: [addr: 1073458572, size: 340, callers: [1074274047, 1074300704, 1074308635, 1074609056, 1074299100, 0, 0, 0, 0, 0]] +[0.004135150] HEAP: Allocated 340 bytes @ 0x3ffbad8c from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[204]: 0.004002200 - core[0].svTaskCreate(8), plen 0: [tid: 12301764] -EVENT[205]: 0.004014700 - core[0].svTaskInfo(9), plen 0: [tid: 12301764, prio: 5, name: free2] -EVENT[206]: 0.004023875 - core[0].svStackInfo(21), plen 0: [tid: 12301764, base: 1073458112, sz: 4294965088, unused: 0] -EVENT[207]: 0.004034675 - core[0].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[208]: 0.004050925 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[209]: 0.004063775 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[210]: 0.004075450 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073455048, size: 3, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.004075450] HEAP: Allocated 3 bytes @ 0x3ffb9fc8 from task "alloc2" on core 0 by: +EVENT[314]: 0.004157725 - core[0].svTaskCreate(8), plen 0: [tid: 12299660] +EVENT[315]: 0.004170300 - core[0].svTaskInfo(9), plen 0: [tid: 12299660, prio: 5, name: free2] +EVENT[316]: 0.004170300 - core[1].svTaskInfo(9), plen 0: [tid: 12299660, prio: 5, name: free2] +EVENT[317]: 0.004183575 - core[0].svStackInfo(21), plen 0: [tid: 12299660, base: 1073456008, sz: 4294965096, unused: 0] +EVENT[318]: 0.004183575 - core[1].svStackInfo(21), plen 0: [tid: 12299660, base: 1073456008, sz: 4294965096, unused: 0] +EVENT[319]: 0.004194300 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[320]: 0.004194300 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[321]: 0.004210400 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[322]: 0.004223275 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[323]: 0.004235500 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073452944, size: 3, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.004235500] HEAP: Allocated 3 bytes @ 0x3ffb9790 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[211]: 0.004086900 - core[1].svTaskStartExec(4), plen 0: [tid: 12301764] -EVENT[212]: 0.004113275 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[213]: 0.004125025 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461032, size: 6, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.004125025] HEAP: Allocated 6 bytes @ 0x3ffbb728 from task "alloc2" on core 0 by: +EVENT[324]: 0.004248275 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[325]: 0.004274675 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[326]: 0.004286525 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073458928, size: 6, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.004286525] HEAP: Allocated 6 bytes @ 0x3ffbaef0 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[214]: 0.004136450 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[215]: 0.004148425 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[216]: 0.004158700 - core[1].svIdle(17), plen 0: [] -EVENT[217]: 0.004177100 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[218]: 0.004229400 - core[0].svPrint(26), plen 69: [msg: I (312) example: Task[0x3ffba9dc]: allocated 6 bytes @ 0x3ffbb728 +EVENT[327]: 0.004297700 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[328]: 0.004309925 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[329]: 0.004320700 - core[1].svIdle(17), plen 0: [] +EVENT[330]: 0.004339100 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[331]: 0.004391650 - core[0].svPrint(26), plen 69: [msg: I (299) example: Task[0x3ffba1a4]: allocated 6 bytes @ 0x3ffbaef0 , lvl: 0, unused: 0] -[0.004229400] LOG: I (312) example: Task[0x3ffba9dc]: allocated 6 bytes @ 0x3ffbb728 -EVENT[219]: 0.004246400 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12299072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[220]: 0.004259550 - core[0].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[221]: 0.004275825 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[222]: 0.004286675 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[223]: 0.004297450 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[224]: 0.004311325 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[225]: 0.004322125 - core[1].svTaskStartExec(4), plen 0: [tid: 12301764] -EVENT[226]: 0.004332975 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[227]: 0.004344875 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12299072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[228]: 0.004355450 - core[0].svTaskStartExec(4), plen 0: [tid: 12254080] -EVENT[229]: 0.004367625 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[230]: 0.004394675 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[231]: 0.004405525 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[232]: 0.004417200 - core[1].svTaskStartReady(6), plen 0: [tid: 12254080] -EVENT[233]: 0.004428550 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[234]: 0.004446675 - core[0].svTaskStartExec(4), plen 0: [tid: 12254080] -EVENT[235]: 0.004461000 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[236]: 0.004477875 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[237]: 0.004496725 - core[1].svPrint(26), plen 63: [msg: I (312) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb728 +[0.004391650] LOG: I (299) example: Task[0x3ffba1a4]: allocated 6 bytes @ 0x3ffbaef0 +EVENT[332]: 0.004405100 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12296968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[333]: 0.004418325 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[334]: 0.004418325 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[335]: 0.004438850 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[336]: 0.004449700 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[337]: 0.004460525 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[338]: 0.004474625 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[339]: 0.004485350 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[340]: 0.004496325 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[341]: 0.004507800 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[342]: 0.004518275 - core[0].svTaskStartExec(4), plen 0: [tid: 12274964] +EVENT[343]: 0.004535000 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[344]: 0.004547200 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[345]: 0.004559125 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12296968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[346]: 0.004570475 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[347]: 0.004581575 - core[0].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[348]: 0.004581575 - core[1].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[349]: 0.004595225 - core[1].vTaskPriorityInherit(39), plen 5: [pxMutexHolder: 1073433876] +EVENT[350]: 0.004610300 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[351]: 0.004620875 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[352]: 0.004631850 - core[0].svTaskStartExec(4), plen 0: [tid: 12274964] +EVENT[353]: 0.004642525 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[354]: 0.004654100 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[355]: 0.004665575 - core[1].svIdle(17), plen 0: [] +EVENT[356]: 0.004680075 - core[0].xTaskPriorityDisinherit(42), plen 5: [pxMutexHolder: 1073433876] +EVENT[357]: 0.004690775 - core[0].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[358]: 0.004690775 - core[1].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[359]: 0.004704550 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[360]: 0.004704550 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[361]: 0.004720275 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[362]: 0.004731750 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[363]: 0.004748350 - core[0].svPrint(26), plen 34: [msg: I (299) example: Wait notify 0 , lvl: 0, unused: 0] -[0.004496725] LOG: I (312) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb728 -EVENT[238]: 0.004524000 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461032, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.004524000] HEAP: Freed bytes @ 0x3ffbb728 from task "free2" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.004748350] LOG: I (299) example: Wait notify 0 +EVENT[364]: 0.004759525 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[365]: 0.004776775 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[366]: 0.004787675 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[367]: 0.004800000 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[368]: 0.004810750 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[369]: 0.004828350 - core[0].svIdle(17), plen 0: [] +EVENT[370]: 0.004849600 - core[1].svPrint(26), plen 63: [msg: I (299) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaef0 +, lvl: 0, unused: 0] +[0.004849600] LOG: I (299) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaef0 +EVENT[371]: 0.004875275 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073458928, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.004875275] HEAP: Freed bytes @ 0x3ffbaef0 from task "free2" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[239]: 0.004538425 - core[0].svPrint(26), plen 34: [msg: I (312) example: Wait notify 0 -, lvl: 0, unused: 0] -[0.004538425] LOG: I (312) example: Wait notify 0 -EVENT[240]: 0.004553625 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[241]: 0.004567700 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[242]: 0.004581650 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[243]: 0.004592100 - core[1].svIdle(17), plen 0: [] -EVENT[244]: 0.004603225 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[245]: 0.004619375 - core[0].svIdle(17), plen 0: [] -EVENT[246]: 0.004666675 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[247]: 0.004680100 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[248]: 0.004695250 - core[1].svIdle(17), plen 0: [] -EVENT[249]: 0.004833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[250]: 0.004849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[251]: 0.004864250 - core[0].svIdle(17), plen 0: [] -EVENT[252]: 0.005666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[253]: 0.005680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[254]: 0.005695225 - core[1].svIdle(17), plen 0: [] -EVENT[255]: 0.005833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[256]: 0.005849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[257]: 0.005864425 - core[0].svIdle(17), plen 0: [] -EVENT[258]: 0.006666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[259]: 0.006679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[260]: 0.006695100 - core[1].svIdle(17), plen 0: [] -EVENT[261]: 0.006833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[262]: 0.006849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[263]: 0.006864250 - core[0].svIdle(17), plen 0: [] -EVENT[264]: 0.007666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[265]: 0.007680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[266]: 0.007695350 - core[1].svIdle(17), plen 0: [] -EVENT[267]: 0.007833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[268]: 0.007849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[269]: 0.007864250 - core[0].svIdle(17), plen 0: [] -EVENT[270]: 0.008666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[271]: 0.008680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[272]: 0.008695125 - core[1].svIdle(17), plen 0: [] -EVENT[273]: 0.008833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[274]: 0.008849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[275]: 0.008868000 - core[0].svIdle(17), plen 0: [] -EVENT[276]: 0.009666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[277]: 0.009679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[278]: 0.009695100 - core[1].svIdle(17), plen 0: [] -EVENT[279]: 0.009833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[280]: 0.009849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[281]: 0.009864250 - core[0].svIdle(17), plen 0: [] -EVENT[282]: 0.010666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[283]: 0.010680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[284]: 0.010695350 - core[1].svIdle(17), plen 0: [] -EVENT[285]: 0.010833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[286]: 0.010849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[287]: 0.010864250 - core[0].svIdle(17), plen 0: [] -EVENT[288]: 0.011666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[289]: 0.011680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[290]: 0.011695125 - core[1].svIdle(17), plen 0: [] -EVENT[291]: 0.011833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[292]: 0.011849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[293]: 0.011864250 - core[0].svIdle(17), plen 0: [] -EVENT[294]: 0.012666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[295]: 0.012680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[296]: 0.012695225 - core[1].svIdle(17), plen 0: [] -EVENT[297]: 0.012833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[298]: 0.012849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[299]: 0.012864425 - core[0].svIdle(17), plen 0: [] -EVENT[300]: 0.013666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[301]: 0.013679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[302]: 0.013695100 - core[1].svIdle(17), plen 0: [] -EVENT[303]: 0.013833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[304]: 0.013849400 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[305]: 0.013864500 - core[0].svIdle(17), plen 0: [] -EVENT[306]: 0.014666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[307]: 0.014680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[308]: 0.014695350 - core[1].svIdle(17), plen 0: [] -EVENT[309]: 0.014833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[310]: 0.014849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[311]: 0.014864250 - core[0].svIdle(17), plen 0: [] -EVENT[312]: 0.015666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[313]: 0.015680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[314]: 0.015695125 - core[1].svIdle(17), plen 0: [] -EVENT[315]: 0.015833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[316]: 0.015849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[317]: 0.015864250 - core[0].svIdle(17), plen 0: [] -EVENT[318]: 0.016666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[319]: 0.016680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[320]: 0.016695225 - core[1].svIdle(17), plen 0: [] -EVENT[321]: 0.016833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[322]: 0.016849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[323]: 0.016864425 - core[0].svIdle(17), plen 0: [] -EVENT[324]: 0.017666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[325]: 0.017679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[326]: 0.017695100 - core[1].svIdle(17), plen 0: [] -EVENT[327]: 0.017833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[328]: 0.017849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[329]: 0.017864250 - core[0].svIdle(17), plen 0: [] -EVENT[330]: 0.018666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[331]: 0.018680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[332]: 0.018695350 - core[1].svIdle(17), plen 0: [] -EVENT[333]: 0.018833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[334]: 0.018849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[335]: 0.018864250 - core[0].svIdle(17), plen 0: [] -EVENT[336]: 0.019666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[337]: 0.019680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[338]: 0.019695125 - core[1].svIdle(17), plen 0: [] -EVENT[339]: 0.019833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[340]: 0.019849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[341]: 0.019864250 - core[0].svIdle(17), plen 0: [] -EVENT[342]: 0.020666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[343]: 0.020680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[344]: 0.020695225 - core[1].svIdle(17), plen 0: [] -EVENT[345]: 0.020833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[346]: 0.020849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[347]: 0.020864425 - core[0].svIdle(17), plen 0: [] -EVENT[348]: 0.021666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[349]: 0.021680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[350]: 0.021695350 - core[1].svIdle(17), plen 0: [] -EVENT[351]: 0.021833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[352]: 0.021849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[353]: 0.021864250 - core[0].svIdle(17), plen 0: [] -EVENT[354]: 0.022666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[355]: 0.022680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[356]: 0.022695125 - core[1].svIdle(17), plen 0: [] -EVENT[357]: 0.022833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[358]: 0.022849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[359]: 0.022864250 - core[0].svIdle(17), plen 0: [] -EVENT[360]: 0.023666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[361]: 0.023680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[362]: 0.023695225 - core[1].svIdle(17), plen 0: [] -EVENT[363]: 0.023833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[364]: 0.023849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[365]: 0.023864425 - core[0].svIdle(17), plen 0: [] -EVENT[366]: 0.024666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[367]: 0.024679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[368]: 0.024695100 - core[1].svIdle(17), plen 0: [] -EVENT[369]: 0.024833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[370]: 0.024849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[371]: 0.024864250 - core[0].svIdle(17), plen 0: [] -EVENT[372]: 0.025666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[373]: 0.025680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[374]: 0.025695350 - core[1].svIdle(17), plen 0: [] -EVENT[375]: 0.025833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[376]: 0.025849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[377]: 0.025864250 - core[0].svIdle(17), plen 0: [] -EVENT[378]: 0.026666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[379]: 0.026680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[380]: 0.026695125 - core[1].svIdle(17), plen 0: [] -EVENT[381]: 0.026833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[382]: 0.026849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[383]: 0.026864250 - core[0].svIdle(17), plen 0: [] -EVENT[384]: 0.027666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[385]: 0.027680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[386]: 0.027695225 - core[1].svIdle(17), plen 0: [] -EVENT[387]: 0.027833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[388]: 0.027849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[389]: 0.027864425 - core[0].svIdle(17), plen 0: [] -EVENT[390]: 0.028666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[391]: 0.028679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[392]: 0.028695100 - core[1].svIdle(17), plen 0: [] -EVENT[393]: 0.028833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[394]: 0.028849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[395]: 0.028864250 - core[0].svIdle(17), plen 0: [] -EVENT[396]: 0.029666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[397]: 0.029680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[398]: 0.029695350 - core[1].svIdle(17), plen 0: [] -EVENT[399]: 0.029833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[400]: 0.029849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[401]: 0.029864250 - core[0].svIdle(17), plen 0: [] -EVENT[402]: 0.030666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[403]: 0.030680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[404]: 0.030695125 - core[1].svIdle(17), plen 0: [] -EVENT[405]: 0.030833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[406]: 0.030849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[407]: 0.030864250 - core[0].svIdle(17), plen 0: [] -EVENT[408]: 0.031666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[409]: 0.031680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[410]: 0.031695225 - core[1].svIdle(17), plen 0: [] -EVENT[411]: 0.031833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[412]: 0.031848825 - core[0].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[413]: 0.031861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[414]: 0.031877250 - core[0].svTaskStartExec(4), plen 0: [tid: 12286700] -EVENT[415]: 0.031912575 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461032, size: 2, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.031912575] HEAP: Allocated 2 bytes @ 0x3ffbb728 from task "alloc0" on core 0 by: +EVENT[372]: 0.004903000 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[373]: 0.004914400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[374]: 0.004930975 - core[1].svIdle(17), plen 0: [] +EVENT[375]: 0.005448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[376]: 0.005461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[377]: 0.005477300 - core[1].svIdle(17), plen 0: [] +EVENT[378]: 0.005546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[379]: 0.005562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[380]: 0.005577275 - core[0].svIdle(17), plen 0: [] +EVENT[381]: 0.006448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[382]: 0.006461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[383]: 0.006476850 - core[1].svIdle(17), plen 0: [] +EVENT[384]: 0.006546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[385]: 0.006562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[386]: 0.006577075 - core[0].svIdle(17), plen 0: [] +EVENT[387]: 0.007448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[388]: 0.007461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[389]: 0.007476975 - core[1].svIdle(17), plen 0: [] +EVENT[390]: 0.007546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[391]: 0.007562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[392]: 0.007577225 - core[0].svIdle(17), plen 0: [] +EVENT[393]: 0.008448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[394]: 0.008461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[395]: 0.008476900 - core[1].svIdle(17), plen 0: [] +EVENT[396]: 0.008546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[397]: 0.008562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[398]: 0.008577075 - core[0].svIdle(17), plen 0: [] +EVENT[399]: 0.009448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[400]: 0.009461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[401]: 0.009476850 - core[1].svIdle(17), plen 0: [] +EVENT[402]: 0.009546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[403]: 0.009562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[404]: 0.009577275 - core[0].svIdle(17), plen 0: [] +EVENT[405]: 0.010448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[406]: 0.010461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[407]: 0.010476850 - core[1].svIdle(17), plen 0: [] +EVENT[408]: 0.010546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[409]: 0.010562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[410]: 0.010577075 - core[0].svIdle(17), plen 0: [] +EVENT[411]: 0.011448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[412]: 0.011461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[413]: 0.011476975 - core[1].svIdle(17), plen 0: [] +EVENT[414]: 0.011546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[415]: 0.011562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[416]: 0.011577225 - core[0].svIdle(17), plen 0: [] +EVENT[417]: 0.012448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[418]: 0.012461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[419]: 0.012476975 - core[1].svIdle(17), plen 0: [] +EVENT[420]: 0.012546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[421]: 0.012562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[422]: 0.012577225 - core[0].svIdle(17), plen 0: [] +EVENT[423]: 0.013448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[424]: 0.013461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[425]: 0.013476900 - core[1].svIdle(17), plen 0: [] +EVENT[426]: 0.013546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[427]: 0.013562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[428]: 0.013577075 - core[0].svIdle(17), plen 0: [] +EVENT[429]: 0.014448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[430]: 0.014461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[431]: 0.014476850 - core[1].svIdle(17), plen 0: [] +EVENT[432]: 0.014546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[433]: 0.014562300 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[434]: 0.014577500 - core[0].svIdle(17), plen 0: [] +EVENT[435]: 0.015448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[436]: 0.015461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[437]: 0.015476850 - core[1].svIdle(17), plen 0: [] +EVENT[438]: 0.015546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[439]: 0.015562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[440]: 0.015577075 - core[0].svIdle(17), plen 0: [] +EVENT[441]: 0.016448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[442]: 0.016461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[443]: 0.016476975 - core[1].svIdle(17), plen 0: [] +EVENT[444]: 0.016546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[445]: 0.016562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[446]: 0.016577225 - core[0].svIdle(17), plen 0: [] +EVENT[447]: 0.017448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[448]: 0.017461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[449]: 0.017476900 - core[1].svIdle(17), plen 0: [] +EVENT[450]: 0.017546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[451]: 0.017562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[452]: 0.017577075 - core[0].svIdle(17), plen 0: [] +EVENT[453]: 0.018448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[454]: 0.018461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[455]: 0.018476850 - core[1].svIdle(17), plen 0: [] +EVENT[456]: 0.018546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[457]: 0.018562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[458]: 0.018577275 - core[0].svIdle(17), plen 0: [] +EVENT[459]: 0.019448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[460]: 0.019461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[461]: 0.019476850 - core[1].svIdle(17), plen 0: [] +EVENT[462]: 0.019546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[463]: 0.019562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[464]: 0.019577075 - core[0].svIdle(17), plen 0: [] +EVENT[465]: 0.020448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[466]: 0.020461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[467]: 0.020476975 - core[1].svIdle(17), plen 0: [] +EVENT[468]: 0.020546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[469]: 0.020562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[470]: 0.020577225 - core[0].svIdle(17), plen 0: [] +EVENT[471]: 0.021448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[472]: 0.021461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[473]: 0.021476900 - core[1].svIdle(17), plen 0: [] +EVENT[474]: 0.021546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[475]: 0.021562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[476]: 0.021577075 - core[0].svIdle(17), plen 0: [] +EVENT[477]: 0.022448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[478]: 0.022461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[479]: 0.022476850 - core[1].svIdle(17), plen 0: [] +EVENT[480]: 0.022546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[481]: 0.022562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[482]: 0.022577275 - core[0].svIdle(17), plen 0: [] +EVENT[483]: 0.023448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[484]: 0.023461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[485]: 0.023476850 - core[1].svIdle(17), plen 0: [] +EVENT[486]: 0.023546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[487]: 0.023562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[488]: 0.023577075 - core[0].svIdle(17), plen 0: [] +EVENT[489]: 0.024448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[490]: 0.024465975 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[491]: 0.024481125 - core[1].svIdle(17), plen 0: [] +EVENT[492]: 0.024546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[493]: 0.024562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[494]: 0.024577075 - core[0].svIdle(17), plen 0: [] +EVENT[495]: 0.025448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[496]: 0.025461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[497]: 0.025476850 - core[1].svIdle(17), plen 0: [] +EVENT[498]: 0.025546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[499]: 0.025562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[500]: 0.025577275 - core[0].svIdle(17), plen 0: [] +EVENT[501]: 0.026448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[502]: 0.026461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[503]: 0.026476850 - core[1].svIdle(17), plen 0: [] +EVENT[504]: 0.026546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[505]: 0.026562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[506]: 0.026577075 - core[0].svIdle(17), plen 0: [] +EVENT[507]: 0.027448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[508]: 0.027461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[509]: 0.027476975 - core[1].svIdle(17), plen 0: [] +EVENT[510]: 0.027546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[511]: 0.027562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[512]: 0.027577225 - core[0].svIdle(17), plen 0: [] +EVENT[513]: 0.028448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[514]: 0.028461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[515]: 0.028476900 - core[1].svIdle(17), plen 0: [] +EVENT[516]: 0.028546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[517]: 0.028562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[518]: 0.028577075 - core[0].svIdle(17), plen 0: [] +EVENT[519]: 0.029448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[520]: 0.029461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[521]: 0.029476850 - core[1].svIdle(17), plen 0: [] +EVENT[522]: 0.029546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[523]: 0.029562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[524]: 0.029577275 - core[0].svIdle(17), plen 0: [] +EVENT[525]: 0.030448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[526]: 0.030461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[527]: 0.030476850 - core[1].svIdle(17), plen 0: [] +EVENT[528]: 0.030546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[529]: 0.030562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[530]: 0.030577075 - core[0].svIdle(17), plen 0: [] +EVENT[531]: 0.031448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[532]: 0.031461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[533]: 0.031476975 - core[1].svIdle(17), plen 0: [] +EVENT[534]: 0.031546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[535]: 0.031562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[536]: 0.031577225 - core[0].svIdle(17), plen 0: [] +EVENT[537]: 0.032448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[538]: 0.032461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[539]: 0.032476900 - core[1].svIdle(17), plen 0: [] +EVENT[540]: 0.032546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[541]: 0.032561625 - core[0].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[542]: 0.032561625 - core[1].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[543]: 0.032574275 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[544]: 0.032589950 - core[0].svTaskStartExec(4), plen 0: [tid: 12284596] +EVENT[545]: 0.032626375 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073458928, size: 2, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.032626375] HEAP: Allocated 2 bytes @ 0x3ffbaef0 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[416]: 0.031951200 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461048, size: 4, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.031951200] HEAP: Allocated 4 bytes @ 0x3ffbb738 from task "alloc0" on core 0 by: +EVENT[546]: 0.032661800 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073458944, size: 4, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.032661800] HEAP: Allocated 4 bytes @ 0x3ffbaf00 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[417]: 0.031968100 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[418]: 0.031984075 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[419]: 0.032048250 - core[0].svPrint(26), plen 69: [msg: I (340) example: Task[0x3ffb7aec]: allocated 4 bytes @ 0x3ffbb738 +EVENT[547]: 0.032682850 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[548]: 0.032698775 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[549]: 0.032751325 - core[0].svPrint(26), plen 69: [msg: I (328) example: Task[0x3ffb72b4]: allocated 4 bytes @ 0x3ffbaf00 , lvl: 0, unused: 0] -[0.032048250] LOG: I (340) example: Task[0x3ffb7aec]: allocated 4 bytes @ 0x3ffbb738 -EVENT[420]: 0.032061825 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12287056, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[421]: 0.032074950 - core[0].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[422]: 0.032091150 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[423]: 0.032102025 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[424]: 0.032112800 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[425]: 0.032126700 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[426]: 0.032137500 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[427]: 0.032148350 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[428]: 0.032160325 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12287056, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[429]: 0.032170550 - core[0].svIdle(17), plen 0: [] -EVENT[430]: 0.032182025 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[431]: 0.032202300 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[432]: 0.032265850 - core[1].svPrint(26), plen 63: [msg: I (340) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb738 +[0.032751325] LOG: I (328) example: Task[0x3ffb72b4]: allocated 4 bytes @ 0x3ffbaf00 +EVENT[550]: 0.032764775 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12284952, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[551]: 0.032778000 - core[0].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[552]: 0.032778000 - core[1].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[553]: 0.032794250 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[554]: 0.032805200 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[555]: 0.032815950 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[556]: 0.032829700 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[557]: 0.032840425 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[558]: 0.032851225 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[559]: 0.032863225 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12284952, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[560]: 0.032873450 - core[0].svIdle(17), plen 0: [] +EVENT[561]: 0.032885200 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[562]: 0.032901475 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[563]: 0.032949375 - core[1].svPrint(26), plen 63: [msg: I (328) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf00 , lvl: 0, unused: 0] -[0.032265850] LOG: I (340) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb738 -EVENT[433]: 0.032287050 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461048, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.032287050] HEAP: Freed bytes @ 0x3ffbb738 from task "free0" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.032949375] LOG: I (328) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf00 +EVENT[564]: 0.032975100 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073458944, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.032975100] HEAP: Freed bytes @ 0x3ffbaf00 from task "free0" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[434]: 0.032313925 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[435]: 0.032325350 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[436]: 0.032342050 - core[1].svIdle(17), plen 0: [] -EVENT[437]: 0.032666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[438]: 0.032679850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[439]: 0.032695550 - core[1].svIdle(17), plen 0: [] -EVENT[440]: 0.032833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[441]: 0.032848800 - core[0].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[442]: 0.032861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[443]: 0.032877375 - core[0].svTaskStartExec(4), plen 0: [tid: 12292716] -EVENT[444]: 0.032912600 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461048, size: 4, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.032912600] HEAP: Allocated 4 bytes @ 0x3ffbb738 from task "alloc1" on core 0 by: +EVENT[565]: 0.033002525 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[566]: 0.033013925 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[567]: 0.033030500 - core[1].svIdle(17), plen 0: [] +EVENT[568]: 0.033448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[569]: 0.033461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[570]: 0.033477300 - core[1].svIdle(17), plen 0: [] +EVENT[571]: 0.033546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[572]: 0.033561675 - core[0].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[573]: 0.033561675 - core[1].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[574]: 0.033573500 - core[0].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[575]: 0.033573500 - core[1].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[576]: 0.033586000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[577]: 0.033601675 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[578]: 0.033637950 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073458944, size: 4, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.033637950] HEAP: Allocated 4 bytes @ 0x3ffbaf00 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[445]: 0.032947150 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461064, size: 8, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.032947150] HEAP: Allocated 8 bytes @ 0x3ffbb748 from task "alloc1" on core 0 by: +EVENT[579]: 0.033673375 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073458960, size: 8, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.033673375] HEAP: Allocated 8 bytes @ 0x3ffbaf10 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[446]: 0.032964075 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[447]: 0.032984250 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[448]: 0.033048500 - core[0].svPrint(26), plen 69: [msg: I (341) example: Task[0x3ffb926c]: allocated 8 bytes @ 0x3ffbb748 +EVENT[580]: 0.033690325 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[581]: 0.033706325 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[582]: 0.033762425 - core[0].svPrint(26), plen 69: [msg: I (329) example: Task[0x3ffb8a34]: allocated 8 bytes @ 0x3ffbaf10 , lvl: 0, unused: 0] -[0.033048500] LOG: I (341) example: Task[0x3ffb926c]: allocated 8 bytes @ 0x3ffbb748 -EVENT[449]: 0.033062225 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12293072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[450]: 0.033075450 - core[0].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[451]: 0.033091700 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[452]: 0.033102550 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[453]: 0.033113300 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[454]: 0.033127025 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[455]: 0.033137800 - core[1].svTaskStartExec(4), plen 0: [tid: 12295764] -EVENT[456]: 0.033148550 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[457]: 0.033160550 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12293072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[458]: 0.033171875 - core[0].svIdle(17), plen 0: [] -EVENT[459]: 0.033184100 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[460]: 0.033200475 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[461]: 0.033263975 - core[1].svPrint(26), plen 63: [msg: I (341) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb748 -, lvl: 0, unused: 0] -[0.033263975] LOG: I (341) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb748 -EVENT[462]: 0.033288500 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461064, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.033288500] HEAP: Freed bytes @ 0x3ffbb748 from task "free1" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 -/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 -/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 - -EVENT[463]: 0.033315625 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[464]: 0.033327050 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[465]: 0.033343625 - core[1].svIdle(17), plen 0: [] -EVENT[466]: 0.033666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[467]: 0.033679850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[468]: 0.033695550 - core[1].svIdle(17), plen 0: [] -EVENT[469]: 0.033833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[470]: 0.033848800 - core[0].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[471]: 0.033861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[472]: 0.033877250 - core[0].svTaskStartExec(4), plen 0: [tid: 12298716] -EVENT[473]: 0.033912650 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461064, size: 6, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.033912650] HEAP: Allocated 6 bytes @ 0x3ffbb748 from task "alloc2" on core 0 by: +[0.033762425] LOG: I (329) example: Task[0x3ffb8a34]: allocated 8 bytes @ 0x3ffbaf10 +EVENT[583]: 0.033775900 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12290968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[584]: 0.033789100 - core[0].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[585]: 0.033789100 - core[1].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[586]: 0.033805450 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[587]: 0.033816325 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[588]: 0.033827125 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[589]: 0.033840925 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[590]: 0.033852750 - core[1].svTaskStartExec(4), plen 0: [tid: 12293660] +EVENT[591]: 0.033864000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[592]: 0.033875950 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12290968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[593]: 0.033887525 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[594]: 0.033900150 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[595]: 0.033918850 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[596]: 0.033930825 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073458976, size: 6, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.033930825] HEAP: Allocated 6 bytes @ 0x3ffbaf20 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[474]: 0.033947050 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461080, size: 12, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.033947050] HEAP: Allocated 12 bytes @ 0x3ffbb758 from task "alloc2" on core 0 by: +EVENT[597]: 0.033971825 - core[1].svPrint(26), plen 63: [msg: I (329) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf10 +, lvl: 0, unused: 0] +[0.033971825] LOG: I (329) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf10 +EVENT[598]: 0.033987775 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073458992, size: 12, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.033987775] HEAP: Allocated 12 bytes @ 0x3ffbaf30 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[475]: 0.033963950 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[476]: 0.033980050 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[477]: 0.034050525 - core[0].svPrint(26), plen 70: [msg: I (342) example: Task[0x3ffba9dc]: allocated 12 bytes @ 0x3ffbb758 -, lvl: 0, unused: 0] -[0.034050525] LOG: I (342) example: Task[0x3ffba9dc]: allocated 12 bytes @ 0x3ffbb758 -EVENT[478]: 0.034068350 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12299072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[479]: 0.034081575 - core[0].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[480]: 0.034097875 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[481]: 0.034108725 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[482]: 0.034119500 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[483]: 0.034133225 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[484]: 0.034144100 - core[1].svTaskStartExec(4), plen 0: [tid: 12301764] -EVENT[485]: 0.034154925 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[486]: 0.034166800 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12299072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[487]: 0.034178075 - core[0].svIdle(17), plen 0: [] -EVENT[488]: 0.034189725 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[489]: 0.034206100 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[490]: 0.034269650 - core[1].svPrint(26), plen 63: [msg: I (342) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb758 -, lvl: 0, unused: 0] -[0.034269650] LOG: I (342) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb758 -EVENT[491]: 0.034290850 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461080, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.034290850] HEAP: Freed bytes @ 0x3ffbb758 from task "free2" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +EVENT[599]: 0.034002150 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073458960, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.034002150] HEAP: Freed bytes @ 0x3ffbaf10 from task "free1" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[492]: 0.034321900 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[493]: 0.034333375 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[494]: 0.034350075 - core[1].svIdle(17), plen 0: [] -EVENT[495]: 0.034666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[496]: 0.034679875 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[497]: 0.034695450 - core[1].svIdle(17), plen 0: [] -EVENT[498]: 0.034833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[499]: 0.034849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[500]: 0.034864425 - core[0].svIdle(17), plen 0: [] -EVENT[501]: 0.035666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[502]: 0.035679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[503]: 0.035695100 - core[1].svIdle(17), plen 0: [] -EVENT[504]: 0.035833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[505]: 0.035849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[506]: 0.035864250 - core[0].svIdle(17), plen 0: [] -EVENT[507]: 0.036666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[508]: 0.036680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[509]: 0.036695350 - core[1].svIdle(17), plen 0: [] -EVENT[510]: 0.036833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[511]: 0.036849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[512]: 0.036864250 - core[0].svIdle(17), plen 0: [] -EVENT[513]: 0.037666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[514]: 0.037680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[515]: 0.037695125 - core[1].svIdle(17), plen 0: [] -EVENT[516]: 0.037833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[517]: 0.037849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[518]: 0.037864250 - core[0].svIdle(17), plen 0: [] -EVENT[519]: 0.038666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[520]: 0.038680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[521]: 0.038695225 - core[1].svIdle(17), plen 0: [] -EVENT[522]: 0.038833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[523]: 0.038849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[524]: 0.038864425 - core[0].svIdle(17), plen 0: [] -EVENT[525]: 0.039666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[526]: 0.039679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[527]: 0.039695100 - core[1].svIdle(17), plen 0: [] -EVENT[528]: 0.039833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[529]: 0.039849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[530]: 0.039864250 - core[0].svIdle(17), plen 0: [] -EVENT[531]: 0.040666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[532]: 0.040680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[533]: 0.040695350 - core[1].svIdle(17), plen 0: [] -EVENT[534]: 0.040833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[535]: 0.040849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[536]: 0.040864250 - core[0].svIdle(17), plen 0: [] -EVENT[537]: 0.041666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[538]: 0.041680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[539]: 0.041695125 - core[1].svIdle(17), plen 0: [] -EVENT[540]: 0.041833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[541]: 0.041849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[542]: 0.041864250 - core[0].svIdle(17), plen 0: [] -EVENT[543]: 0.042666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[544]: 0.042680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[545]: 0.042695225 - core[1].svIdle(17), plen 0: [] -EVENT[546]: 0.042833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[547]: 0.042849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[548]: 0.042864425 - core[0].svIdle(17), plen 0: [] -EVENT[549]: 0.043666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[550]: 0.043679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[551]: 0.043695100 - core[1].svIdle(17), plen 0: [] -EVENT[552]: 0.043833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[553]: 0.043849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[554]: 0.043864250 - core[0].svIdle(17), plen 0: [] -EVENT[555]: 0.044666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[556]: 0.044684200 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[557]: 0.044699325 - core[1].svIdle(17), plen 0: [] -EVENT[558]: 0.044833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[559]: 0.044849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[560]: 0.044864250 - core[0].svIdle(17), plen 0: [] -EVENT[561]: 0.045666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[562]: 0.045680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[563]: 0.045695225 - core[1].svIdle(17), plen 0: [] -EVENT[564]: 0.045833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[565]: 0.045849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[566]: 0.045864425 - core[0].svIdle(17), plen 0: [] -EVENT[567]: 0.046666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[568]: 0.046679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[569]: 0.046695100 - core[1].svIdle(17), plen 0: [] -EVENT[570]: 0.046833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[571]: 0.046849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[572]: 0.046864250 - core[0].svIdle(17), plen 0: [] -EVENT[573]: 0.047666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[574]: 0.047680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[575]: 0.047695350 - core[1].svIdle(17), plen 0: [] -EVENT[576]: 0.047833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[577]: 0.047849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[578]: 0.047864250 - core[0].svIdle(17), plen 0: [] -EVENT[579]: 0.048666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[580]: 0.048680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[581]: 0.048695125 - core[1].svIdle(17), plen 0: [] -EVENT[582]: 0.048833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[583]: 0.048849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[584]: 0.048864250 - core[0].svIdle(17), plen 0: [] -EVENT[585]: 0.049666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[586]: 0.049680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[587]: 0.049695225 - core[1].svIdle(17), plen 0: [] -EVENT[588]: 0.049833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[589]: 0.049849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[590]: 0.049864425 - core[0].svIdle(17), plen 0: [] -EVENT[591]: 0.050666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[592]: 0.050679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[593]: 0.050695100 - core[1].svIdle(17), plen 0: [] -EVENT[594]: 0.050833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[595]: 0.050849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[596]: 0.050864250 - core[0].svIdle(17), plen 0: [] -EVENT[597]: 0.051666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[598]: 0.051680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[599]: 0.051695350 - core[1].svIdle(17), plen 0: [] -EVENT[600]: 0.051833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[601]: 0.051849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[602]: 0.051864250 - core[0].svIdle(17), plen 0: [] -EVENT[603]: 0.052666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[604]: 0.052680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[605]: 0.052695125 - core[1].svIdle(17), plen 0: [] -EVENT[606]: 0.052833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[607]: 0.052849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[608]: 0.052864250 - core[0].svIdle(17), plen 0: [] -EVENT[609]: 0.053666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[610]: 0.053680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[611]: 0.053695225 - core[1].svIdle(17), plen 0: [] -EVENT[612]: 0.053833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[613]: 0.053849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[614]: 0.053864425 - core[0].svIdle(17), plen 0: [] -EVENT[615]: 0.054666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[616]: 0.054679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[617]: 0.054695100 - core[1].svIdle(17), plen 0: [] -EVENT[618]: 0.054833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[619]: 0.054849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[620]: 0.054864250 - core[0].svIdle(17), plen 0: [] -EVENT[621]: 0.055666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[622]: 0.055680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[623]: 0.055695350 - core[1].svIdle(17), plen 0: [] -EVENT[624]: 0.055833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[625]: 0.055849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[626]: 0.055864250 - core[0].svIdle(17), plen 0: [] -EVENT[627]: 0.056666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[628]: 0.056684225 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[629]: 0.056699375 - core[1].svIdle(17), plen 0: [] -EVENT[630]: 0.056833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[631]: 0.056849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[632]: 0.056864250 - core[0].svIdle(17), plen 0: [] -EVENT[633]: 0.057666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[634]: 0.057680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[635]: 0.057695225 - core[1].svIdle(17), plen 0: [] -EVENT[636]: 0.057833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[637]: 0.057849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[638]: 0.057864425 - core[0].svIdle(17), plen 0: [] -EVENT[639]: 0.058666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[640]: 0.058679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[641]: 0.058695100 - core[1].svIdle(17), plen 0: [] -EVENT[642]: 0.058833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[643]: 0.058849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[644]: 0.058864250 - core[0].svIdle(17), plen 0: [] -EVENT[645]: 0.059666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[646]: 0.059680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[647]: 0.059695350 - core[1].svIdle(17), plen 0: [] -EVENT[648]: 0.059833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[649]: 0.059849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[650]: 0.059864250 - core[0].svIdle(17), plen 0: [] -EVENT[651]: 0.060666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[652]: 0.060680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[653]: 0.060695125 - core[1].svIdle(17), plen 0: [] -EVENT[654]: 0.060833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[655]: 0.060849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[656]: 0.060864250 - core[0].svIdle(17), plen 0: [] -EVENT[657]: 0.061666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[658]: 0.061680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[659]: 0.061695225 - core[1].svIdle(17), plen 0: [] -EVENT[660]: 0.061833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[661]: 0.061848825 - core[0].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[662]: 0.061861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[663]: 0.061877250 - core[0].svTaskStartExec(4), plen 0: [tid: 12286700] -EVENT[664]: 0.061912575 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461080, size: 3, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.061912575] HEAP: Allocated 3 bytes @ 0x3ffbb758 from task "alloc0" on core 0 by: +EVENT[600]: 0.034014600 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[601]: 0.034034500 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[602]: 0.034045425 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[603]: 0.034056975 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[604]: 0.034074925 - core[1].svIdle(17), plen 0: [] +EVENT[605]: 0.034092925 - core[0].svPrint(26), plen 70: [msg: I (329) example: Task[0x3ffba1a4]: allocated 12 bytes @ 0x3ffbaf30 +, lvl: 0, unused: 0] +[0.034092925] LOG: I (329) example: Task[0x3ffba1a4]: allocated 12 bytes @ 0x3ffbaf30 +EVENT[606]: 0.034106375 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12296968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[607]: 0.034123750 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[608]: 0.034123750 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[609]: 0.034140100 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[610]: 0.034150975 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[611]: 0.034161775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[612]: 0.034175600 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[613]: 0.034186525 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[614]: 0.034197375 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[615]: 0.034209325 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12296968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[616]: 0.034220550 - core[0].svIdle(17), plen 0: [] +EVENT[617]: 0.034232350 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[618]: 0.034248625 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[619]: 0.034296400 - core[1].svPrint(26), plen 63: [msg: I (329) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf30 +, lvl: 0, unused: 0] +[0.034296400] LOG: I (329) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf30 +EVENT[620]: 0.034317775 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073458992, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.034317775] HEAP: Freed bytes @ 0x3ffbaf30 from task "free2" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 +/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 +/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 + +EVENT[621]: 0.034345175 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[622]: 0.034356600 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[623]: 0.034373150 - core[1].svIdle(17), plen 0: [] +EVENT[624]: 0.034448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[625]: 0.034461625 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[626]: 0.034477200 - core[1].svIdle(17), plen 0: [] +EVENT[627]: 0.034546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[628]: 0.034562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[629]: 0.034577075 - core[0].svIdle(17), plen 0: [] +EVENT[630]: 0.035448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[631]: 0.035461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[632]: 0.035476850 - core[1].svIdle(17), plen 0: [] +EVENT[633]: 0.035546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[634]: 0.035562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[635]: 0.035577275 - core[0].svIdle(17), plen 0: [] +EVENT[636]: 0.036448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[637]: 0.036461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[638]: 0.036476850 - core[1].svIdle(17), plen 0: [] +EVENT[639]: 0.036546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[640]: 0.036566300 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[641]: 0.036581525 - core[0].svIdle(17), plen 0: [] +EVENT[642]: 0.037448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[643]: 0.037461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[644]: 0.037476850 - core[1].svIdle(17), plen 0: [] +EVENT[645]: 0.037546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[646]: 0.037562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[647]: 0.037577075 - core[0].svIdle(17), plen 0: [] +EVENT[648]: 0.038448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[649]: 0.038461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[650]: 0.038476975 - core[1].svIdle(17), plen 0: [] +EVENT[651]: 0.038546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[652]: 0.038562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[653]: 0.038577225 - core[0].svIdle(17), plen 0: [] +EVENT[654]: 0.039448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[655]: 0.039461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[656]: 0.039476900 - core[1].svIdle(17), plen 0: [] +EVENT[657]: 0.039546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[658]: 0.039562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[659]: 0.039577075 - core[0].svIdle(17), plen 0: [] +EVENT[660]: 0.040448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[661]: 0.040461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[662]: 0.040476850 - core[1].svIdle(17), plen 0: [] +EVENT[663]: 0.040546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[664]: 0.040562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[665]: 0.040577275 - core[0].svIdle(17), plen 0: [] +EVENT[666]: 0.041448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[667]: 0.041461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[668]: 0.041476850 - core[1].svIdle(17), plen 0: [] +EVENT[669]: 0.041546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[670]: 0.041562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[671]: 0.041577075 - core[0].svIdle(17), plen 0: [] +EVENT[672]: 0.042448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[673]: 0.042461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[674]: 0.042476975 - core[1].svIdle(17), plen 0: [] +EVENT[675]: 0.042546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[676]: 0.042562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[677]: 0.042577225 - core[0].svIdle(17), plen 0: [] +EVENT[678]: 0.043448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[679]: 0.043461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[680]: 0.043476900 - core[1].svIdle(17), plen 0: [] +EVENT[681]: 0.043546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[682]: 0.043562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[683]: 0.043577075 - core[0].svIdle(17), plen 0: [] +EVENT[684]: 0.044448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[685]: 0.044461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[686]: 0.044476850 - core[1].svIdle(17), plen 0: [] +EVENT[687]: 0.044546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[688]: 0.044562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[689]: 0.044577275 - core[0].svIdle(17), plen 0: [] +EVENT[690]: 0.045448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[691]: 0.045461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[692]: 0.045476850 - core[1].svIdle(17), plen 0: [] +EVENT[693]: 0.045546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[694]: 0.045562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[695]: 0.045577075 - core[0].svIdle(17), plen 0: [] +EVENT[696]: 0.046448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[697]: 0.046461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[698]: 0.046476975 - core[1].svIdle(17), plen 0: [] +EVENT[699]: 0.046546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[700]: 0.046562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[701]: 0.046577225 - core[0].svIdle(17), plen 0: [] +EVENT[702]: 0.047448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[703]: 0.047461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[704]: 0.047476900 - core[1].svIdle(17), plen 0: [] +EVENT[705]: 0.047546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[706]: 0.047562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[707]: 0.047577075 - core[0].svIdle(17), plen 0: [] +EVENT[708]: 0.048448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[709]: 0.048461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[710]: 0.048476850 - core[1].svIdle(17), plen 0: [] +EVENT[711]: 0.048546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[712]: 0.048566300 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[713]: 0.048581500 - core[0].svIdle(17), plen 0: [] +EVENT[714]: 0.049448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[715]: 0.049461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[716]: 0.049476850 - core[1].svIdle(17), plen 0: [] +EVENT[717]: 0.049546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[718]: 0.049562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[719]: 0.049577075 - core[0].svIdle(17), plen 0: [] +EVENT[720]: 0.050448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[721]: 0.050461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[722]: 0.050476975 - core[1].svIdle(17), plen 0: [] +EVENT[723]: 0.050546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[724]: 0.050562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[725]: 0.050577225 - core[0].svIdle(17), plen 0: [] +EVENT[726]: 0.051448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[727]: 0.051461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[728]: 0.051476900 - core[1].svIdle(17), plen 0: [] +EVENT[729]: 0.051546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[730]: 0.051562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[731]: 0.051577075 - core[0].svIdle(17), plen 0: [] +EVENT[732]: 0.052448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[733]: 0.052461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[734]: 0.052476850 - core[1].svIdle(17), plen 0: [] +EVENT[735]: 0.052546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[736]: 0.052562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[737]: 0.052577275 - core[0].svIdle(17), plen 0: [] +EVENT[738]: 0.053448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[739]: 0.053461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[740]: 0.053476850 - core[1].svIdle(17), plen 0: [] +EVENT[741]: 0.053546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[742]: 0.053562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[743]: 0.053577075 - core[0].svIdle(17), plen 0: [] +EVENT[744]: 0.054448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[745]: 0.054461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[746]: 0.054476975 - core[1].svIdle(17), plen 0: [] +EVENT[747]: 0.054546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[748]: 0.054562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[749]: 0.054577225 - core[0].svIdle(17), plen 0: [] +EVENT[750]: 0.055448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[751]: 0.055461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[752]: 0.055476900 - core[1].svIdle(17), plen 0: [] +EVENT[753]: 0.055546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[754]: 0.055562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[755]: 0.055577075 - core[0].svIdle(17), plen 0: [] +EVENT[756]: 0.056448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[757]: 0.056461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[758]: 0.056476850 - core[1].svIdle(17), plen 0: [] +EVENT[759]: 0.056546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[760]: 0.056562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[761]: 0.056577275 - core[0].svIdle(17), plen 0: [] +EVENT[762]: 0.057448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[763]: 0.057461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[764]: 0.057476850 - core[1].svIdle(17), plen 0: [] +EVENT[765]: 0.057546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[766]: 0.057562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[767]: 0.057577075 - core[0].svIdle(17), plen 0: [] +EVENT[768]: 0.058448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[769]: 0.058461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[770]: 0.058476975 - core[1].svIdle(17), plen 0: [] +EVENT[771]: 0.058546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[772]: 0.058562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[773]: 0.058577225 - core[0].svIdle(17), plen 0: [] +EVENT[774]: 0.059448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[775]: 0.059461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[776]: 0.059476900 - core[1].svIdle(17), plen 0: [] +EVENT[777]: 0.059546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[778]: 0.059562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[779]: 0.059577075 - core[0].svIdle(17), plen 0: [] +EVENT[780]: 0.060448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[781]: 0.060461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[782]: 0.060476850 - core[1].svIdle(17), plen 0: [] +EVENT[783]: 0.060546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[784]: 0.060566300 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[785]: 0.060581500 - core[0].svIdle(17), plen 0: [] +EVENT[786]: 0.061448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[787]: 0.061461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[788]: 0.061476850 - core[1].svIdle(17), plen 0: [] +EVENT[789]: 0.061546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[790]: 0.061562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[791]: 0.061577075 - core[0].svIdle(17), plen 0: [] +EVENT[792]: 0.062448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[793]: 0.062461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[794]: 0.062476975 - core[1].svIdle(17), plen 0: [] +EVENT[795]: 0.062546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[796]: 0.062561625 - core[0].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[797]: 0.062561625 - core[1].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[798]: 0.062574225 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[799]: 0.062589875 - core[0].svTaskStartExec(4), plen 0: [tid: 12284596] +EVENT[800]: 0.062624900 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073458960, size: 3, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.062624900] HEAP: Allocated 3 bytes @ 0x3ffbaf10 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[665]: 0.061947000 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461096, size: 6, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.061947000] HEAP: Allocated 6 bytes @ 0x3ffbb768 from task "alloc0" on core 0 by: +EVENT[801]: 0.062660375 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073458992, size: 6, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.062660375] HEAP: Allocated 6 bytes @ 0x3ffbaf30 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[666]: 0.061964025 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[667]: 0.061980025 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[668]: 0.062044275 - core[0].svPrint(26), plen 69: [msg: I (370) example: Task[0x3ffb7aec]: allocated 6 bytes @ 0x3ffbb768 +EVENT[802]: 0.062677300 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[803]: 0.062693250 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[804]: 0.062745775 - core[0].svPrint(26), plen 69: [msg: I (358) example: Task[0x3ffb72b4]: allocated 6 bytes @ 0x3ffbaf30 , lvl: 0, unused: 0] -[0.062044275] LOG: I (370) example: Task[0x3ffb7aec]: allocated 6 bytes @ 0x3ffbb768 -EVENT[669]: 0.062062075 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12287056, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[670]: 0.062075200 - core[0].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[671]: 0.062091350 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[672]: 0.062102400 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[673]: 0.062113150 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[674]: 0.062127150 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[675]: 0.062138000 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[676]: 0.062148875 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[677]: 0.062160875 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12287056, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[678]: 0.062171200 - core[0].svIdle(17), plen 0: [] -EVENT[679]: 0.062183675 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[680]: 0.062199850 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[681]: 0.062263400 - core[1].svPrint(26), plen 63: [msg: I (370) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb768 +[0.062745775] LOG: I (358) example: Task[0x3ffb72b4]: allocated 6 bytes @ 0x3ffbaf30 +EVENT[805]: 0.062759250 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12284952, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[806]: 0.062772450 - core[0].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[807]: 0.062772450 - core[1].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[808]: 0.062792900 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[809]: 0.062803850 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[810]: 0.062814600 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[811]: 0.062828500 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[812]: 0.062839300 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[813]: 0.062850025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[814]: 0.062862150 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12284952, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[815]: 0.062872350 - core[0].svIdle(17), plen 0: [] +EVENT[816]: 0.062884100 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[817]: 0.062900450 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[818]: 0.062948325 - core[1].svPrint(26), plen 63: [msg: I (358) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf30 , lvl: 0, unused: 0] -[0.062263400] LOG: I (370) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb768 -EVENT[682]: 0.062284400 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461096, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.062284400] HEAP: Freed bytes @ 0x3ffbb768 from task "free0" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.062948325] LOG: I (358) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf30 +EVENT[819]: 0.062969525 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073458992, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.062969525] HEAP: Freed bytes @ 0x3ffbaf30 from task "free0" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[683]: 0.062314725 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[684]: 0.062326200 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[685]: 0.062342900 - core[1].svIdle(17), plen 0: [] -EVENT[686]: 0.062666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[687]: 0.062679875 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[688]: 0.062695450 - core[1].svIdle(17), plen 0: [] -EVENT[689]: 0.062833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[690]: 0.062848825 - core[0].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[691]: 0.062861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[692]: 0.062877250 - core[0].svTaskStartExec(4), plen 0: [tid: 12292716] -EVENT[693]: 0.062912575 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461096, size: 6, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.062912575] HEAP: Allocated 6 bytes @ 0x3ffbb768 from task "alloc1" on core 0 by: +EVENT[820]: 0.062996800 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[821]: 0.063008250 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[822]: 0.063024950 - core[1].svIdle(17), plen 0: [] +EVENT[823]: 0.063448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[824]: 0.063461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[825]: 0.063477300 - core[1].svIdle(17), plen 0: [] +EVENT[826]: 0.063546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[827]: 0.063561625 - core[0].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[828]: 0.063561625 - core[1].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[829]: 0.063573500 - core[0].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[830]: 0.063573500 - core[1].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[831]: 0.063585975 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[832]: 0.063601625 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[833]: 0.063638000 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073458992, size: 6, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.063638000] HEAP: Allocated 6 bytes @ 0x3ffbaf30 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[694]: 0.062947000 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461112, size: 12, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.062947000] HEAP: Allocated 12 bytes @ 0x3ffbb778 from task "alloc1" on core 0 by: +EVENT[834]: 0.063677550 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459008, size: 12, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.063677550] HEAP: Allocated 12 bytes @ 0x3ffbaf40 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[695]: 0.062964025 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[696]: 0.062980025 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[697]: 0.063046500 - core[0].svPrint(26), plen 70: [msg: I (371) example: Task[0x3ffb926c]: allocated 12 bytes @ 0x3ffbb778 +EVENT[835]: 0.063694500 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[836]: 0.063710500 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[837]: 0.063765225 - core[0].svPrint(26), plen 70: [msg: I (359) example: Task[0x3ffb8a34]: allocated 12 bytes @ 0x3ffbaf40 , lvl: 0, unused: 0] -[0.063046500] LOG: I (371) example: Task[0x3ffb926c]: allocated 12 bytes @ 0x3ffbb778 -EVENT[698]: 0.063060050 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12293072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[699]: 0.063077450 - core[0].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[700]: 0.063093775 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[701]: 0.063104625 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[702]: 0.063115375 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[703]: 0.063129100 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[704]: 0.063139950 - core[1].svTaskStartExec(4), plen 0: [tid: 12295764] -EVENT[705]: 0.063150775 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[706]: 0.063162625 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12293072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[707]: 0.063172900 - core[0].svIdle(17), plen 0: [] -EVENT[708]: 0.063184375 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[709]: 0.063200675 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[710]: 0.063264125 - core[1].svPrint(26), plen 63: [msg: I (371) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb778 -, lvl: 0, unused: 0] -[0.063264125] LOG: I (371) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb778 -EVENT[711]: 0.063285275 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461112, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.063285275] HEAP: Freed bytes @ 0x3ffbb778 from task "free1" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 -/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 -/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 - -EVENT[712]: 0.063312400 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[713]: 0.063323825 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[714]: 0.063340400 - core[1].svIdle(17), plen 0: [] -EVENT[715]: 0.063666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[716]: 0.063679850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[717]: 0.063695550 - core[1].svIdle(17), plen 0: [] -EVENT[718]: 0.063833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[719]: 0.063848800 - core[0].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[720]: 0.063861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[721]: 0.063877250 - core[0].svTaskStartExec(4), plen 0: [tid: 12298716] -EVENT[722]: 0.063912650 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461112, size: 9, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.063912650] HEAP: Allocated 9 bytes @ 0x3ffbb778 from task "alloc2" on core 0 by: +[0.063765225] LOG: I (359) example: Task[0x3ffb8a34]: allocated 12 bytes @ 0x3ffbaf40 +EVENT[838]: 0.063778675 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12290968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[839]: 0.063791925 - core[0].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[840]: 0.063791925 - core[1].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[841]: 0.063808275 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[842]: 0.063819125 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[843]: 0.063830100 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[844]: 0.063844100 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[845]: 0.063855800 - core[1].svTaskStartExec(4), plen 0: [tid: 12293660] +EVENT[846]: 0.063867200 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[847]: 0.063879175 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12290968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[848]: 0.063890875 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[849]: 0.063903475 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[850]: 0.063925875 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[851]: 0.063937325 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459024, size: 9, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.063937325] HEAP: Allocated 9 bytes @ 0x3ffbaf50 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[723]: 0.063951300 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461128, size: 18, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.063951300] HEAP: Allocated 18 bytes @ 0x3ffbb788 from task "alloc2" on core 0 by: +EVENT[852]: 0.063978425 - core[1].svPrint(26), plen 63: [msg: I (359) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf40 +, lvl: 0, unused: 0] +[0.063978425] LOG: I (359) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf40 +EVENT[853]: 0.063989600 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459040, size: 18, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.063989600] HEAP: Allocated 18 bytes @ 0x3ffbaf60 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[724]: 0.063968200 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[725]: 0.063984175 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[726]: 0.064054525 - core[0].svPrint(26), plen 70: [msg: I (372) example: Task[0x3ffba9dc]: allocated 18 bytes @ 0x3ffbb788 -, lvl: 0, unused: 0] -[0.064054525] LOG: I (372) example: Task[0x3ffba9dc]: allocated 18 bytes @ 0x3ffbb788 -EVENT[727]: 0.064068125 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12299072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[728]: 0.064081350 - core[0].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[729]: 0.064097650 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[730]: 0.064108500 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[731]: 0.064119275 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[732]: 0.064133000 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[733]: 0.064143875 - core[1].svTaskStartExec(4), plen 0: [tid: 12301764] -EVENT[734]: 0.064154700 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[735]: 0.064166575 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12299072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[736]: 0.064177850 - core[0].svIdle(17), plen 0: [] -EVENT[737]: 0.064189500 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[738]: 0.064209950 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[739]: 0.064273500 - core[1].svPrint(26), plen 63: [msg: I (372) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb788 -, lvl: 0, unused: 0] -[0.064273500] LOG: I (372) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb788 -EVENT[740]: 0.064294700 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461128, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.064294700] HEAP: Freed bytes @ 0x3ffbb788 from task "free2" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +EVENT[854]: 0.064003900 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459008, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.064003900] HEAP: Freed bytes @ 0x3ffbaf40 from task "free1" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[741]: 0.064321575 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[742]: 0.064333000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[743]: 0.064349575 - core[1].svIdle(17), plen 0: [] -EVENT[744]: 0.064666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[745]: 0.064679850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[746]: 0.064695550 - core[1].svIdle(17), plen 0: [] -EVENT[747]: 0.064833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[748]: 0.064849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[749]: 0.064864250 - core[0].svIdle(17), plen 0: [] -EVENT[750]: 0.065666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[751]: 0.065680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[752]: 0.065695350 - core[1].svIdle(17), plen 0: [] -EVENT[753]: 0.065833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[754]: 0.065849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[755]: 0.065864250 - core[0].svIdle(17), plen 0: [] -EVENT[756]: 0.066666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[757]: 0.066680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[758]: 0.066695125 - core[1].svIdle(17), plen 0: [] -EVENT[759]: 0.066833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[760]: 0.066849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[761]: 0.066864250 - core[0].svIdle(17), plen 0: [] -EVENT[762]: 0.067666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[763]: 0.067680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[764]: 0.067695225 - core[1].svIdle(17), plen 0: [] -EVENT[765]: 0.067833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[766]: 0.067849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[767]: 0.067864425 - core[0].svIdle(17), plen 0: [] -EVENT[768]: 0.068666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[769]: 0.068679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[770]: 0.068695100 - core[1].svIdle(17), plen 0: [] -EVENT[771]: 0.068833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[772]: 0.068849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[773]: 0.068864250 - core[0].svIdle(17), plen 0: [] -EVENT[774]: 0.069666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[775]: 0.069680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[776]: 0.069695350 - core[1].svIdle(17), plen 0: [] -EVENT[777]: 0.069833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[778]: 0.069849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[779]: 0.069868575 - core[0].svIdle(17), plen 0: [] -EVENT[780]: 0.070666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[781]: 0.070679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[782]: 0.070695100 - core[1].svIdle(17), plen 0: [] -EVENT[783]: 0.070833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[784]: 0.070849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[785]: 0.070864250 - core[0].svIdle(17), plen 0: [] -EVENT[786]: 0.071666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[787]: 0.071680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[788]: 0.071695350 - core[1].svIdle(17), plen 0: [] -EVENT[789]: 0.071833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[790]: 0.071849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[791]: 0.071864250 - core[0].svIdle(17), plen 0: [] -EVENT[792]: 0.072666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[793]: 0.072680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[794]: 0.072695125 - core[1].svIdle(17), plen 0: [] -EVENT[795]: 0.072833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[796]: 0.072849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[797]: 0.072864250 - core[0].svIdle(17), plen 0: [] -EVENT[798]: 0.073666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[799]: 0.073680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[800]: 0.073695225 - core[1].svIdle(17), plen 0: [] -EVENT[801]: 0.073833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[802]: 0.073849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[803]: 0.073864425 - core[0].svIdle(17), plen 0: [] -EVENT[804]: 0.074666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[805]: 0.074679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[806]: 0.074695100 - core[1].svIdle(17), plen 0: [] -EVENT[807]: 0.074833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[808]: 0.074849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[809]: 0.074864250 - core[0].svIdle(17), plen 0: [] -EVENT[810]: 0.075666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[811]: 0.075680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[812]: 0.075695350 - core[1].svIdle(17), plen 0: [] -EVENT[813]: 0.075833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[814]: 0.075849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[815]: 0.075864250 - core[0].svIdle(17), plen 0: [] -EVENT[816]: 0.076666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[817]: 0.076680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[818]: 0.076695125 - core[1].svIdle(17), plen 0: [] -EVENT[819]: 0.076833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[820]: 0.076849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[821]: 0.076864250 - core[0].svIdle(17), plen 0: [] -EVENT[822]: 0.077666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[823]: 0.077680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[824]: 0.077695225 - core[1].svIdle(17), plen 0: [] -EVENT[825]: 0.077833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[826]: 0.077849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[827]: 0.077864425 - core[0].svIdle(17), plen 0: [] -EVENT[828]: 0.078666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[829]: 0.078679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[830]: 0.078695100 - core[1].svIdle(17), plen 0: [] -EVENT[831]: 0.078833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[832]: 0.078849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[833]: 0.078864250 - core[0].svIdle(17), plen 0: [] -EVENT[834]: 0.079666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[835]: 0.079680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[836]: 0.079695350 - core[1].svIdle(17), plen 0: [] -EVENT[837]: 0.079833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[838]: 0.079849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[839]: 0.079864250 - core[0].svIdle(17), plen 0: [] -EVENT[840]: 0.080666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[841]: 0.080680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[842]: 0.080695125 - core[1].svIdle(17), plen 0: [] -EVENT[843]: 0.080833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[844]: 0.080849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[845]: 0.080864250 - core[0].svIdle(17), plen 0: [] -EVENT[846]: 0.081666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[847]: 0.081680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[848]: 0.081695225 - core[1].svIdle(17), plen 0: [] -EVENT[849]: 0.081833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[850]: 0.081849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[851]: 0.081864425 - core[0].svIdle(17), plen 0: [] -EVENT[852]: 0.082666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[853]: 0.082680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[854]: 0.082695350 - core[1].svIdle(17), plen 0: [] -EVENT[855]: 0.082833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[856]: 0.082849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[857]: 0.082864250 - core[0].svIdle(17), plen 0: [] -EVENT[858]: 0.083666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[859]: 0.083680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[860]: 0.083695125 - core[1].svIdle(17), plen 0: [] -EVENT[861]: 0.083833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[862]: 0.083849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[863]: 0.083864250 - core[0].svIdle(17), plen 0: [] -EVENT[864]: 0.084666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[865]: 0.084680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[866]: 0.084695225 - core[1].svIdle(17), plen 0: [] -EVENT[867]: 0.084833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[868]: 0.084849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[869]: 0.084864425 - core[0].svIdle(17), plen 0: [] -EVENT[870]: 0.085666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[871]: 0.085679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[872]: 0.085695100 - core[1].svIdle(17), plen 0: [] -EVENT[873]: 0.085833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[874]: 0.085849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[875]: 0.085864250 - core[0].svIdle(17), plen 0: [] -EVENT[876]: 0.086666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[877]: 0.086680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[878]: 0.086695350 - core[1].svIdle(17), plen 0: [] -EVENT[879]: 0.086833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[880]: 0.086849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[881]: 0.086864250 - core[0].svIdle(17), plen 0: [] -EVENT[882]: 0.087666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[883]: 0.087680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[884]: 0.087695125 - core[1].svIdle(17), plen 0: [] -EVENT[885]: 0.087833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[886]: 0.087849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[887]: 0.087864250 - core[0].svIdle(17), plen 0: [] -EVENT[888]: 0.088666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[889]: 0.088680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[890]: 0.088695225 - core[1].svIdle(17), plen 0: [] -EVENT[891]: 0.088833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[892]: 0.088849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[893]: 0.088864425 - core[0].svIdle(17), plen 0: [] -EVENT[894]: 0.089666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[895]: 0.089679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[896]: 0.089695100 - core[1].svIdle(17), plen 0: [] -EVENT[897]: 0.089833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[898]: 0.089849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[899]: 0.089864250 - core[0].svIdle(17), plen 0: [] -EVENT[900]: 0.090666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[901]: 0.090680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[902]: 0.090695350 - core[1].svIdle(17), plen 0: [] -EVENT[903]: 0.090833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[904]: 0.090849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[905]: 0.090864250 - core[0].svIdle(17), plen 0: [] -EVENT[906]: 0.091666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[907]: 0.091680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[908]: 0.091695125 - core[1].svIdle(17), plen 0: [] -EVENT[909]: 0.091833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[910]: 0.091848800 - core[0].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[911]: 0.091861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[912]: 0.091877250 - core[0].svTaskStartExec(4), plen 0: [tid: 12286700] -EVENT[913]: 0.091912475 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461128, size: 4, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.091912475] HEAP: Allocated 4 bytes @ 0x3ffbb788 from task "alloc0" on core 0 by: +EVENT[855]: 0.064017000 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[856]: 0.064035500 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[857]: 0.064046775 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[858]: 0.064057575 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[859]: 0.064075725 - core[1].svIdle(17), plen 0: [] +EVENT[860]: 0.064103500 - core[0].svPrint(26), plen 70: [msg: I (359) example: Task[0x3ffba1a4]: allocated 18 bytes @ 0x3ffbaf60 +, lvl: 0, unused: 0] +[0.064103500] LOG: I (359) example: Task[0x3ffba1a4]: allocated 18 bytes @ 0x3ffbaf60 +EVENT[861]: 0.064121100 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12296968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[862]: 0.064134350 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[863]: 0.064134350 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[864]: 0.064150700 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[865]: 0.064161550 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[866]: 0.064172375 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[867]: 0.064186200 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[868]: 0.064196950 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[869]: 0.064207700 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[870]: 0.064219800 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12296968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[871]: 0.064231025 - core[0].svIdle(17), plen 0: [] +EVENT[872]: 0.064243350 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[873]: 0.064259600 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[874]: 0.064307475 - core[1].svPrint(26), plen 63: [msg: I (359) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf60 +, lvl: 0, unused: 0] +[0.064307475] LOG: I (359) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf60 +EVENT[875]: 0.064328875 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459040, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.064328875] HEAP: Freed bytes @ 0x3ffbaf60 from task "free2" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 +/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 +/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 + +EVENT[876]: 0.064359750 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[877]: 0.064371325 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[878]: 0.064388025 - core[1].svIdle(17), plen 0: [] +EVENT[879]: 0.064448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[880]: 0.064461625 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[881]: 0.064477200 - core[1].svIdle(17), plen 0: [] +EVENT[882]: 0.064546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[883]: 0.064562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[884]: 0.064577275 - core[0].svIdle(17), plen 0: [] +EVENT[885]: 0.065448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[886]: 0.065461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[887]: 0.065476850 - core[1].svIdle(17), plen 0: [] +EVENT[888]: 0.065546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[889]: 0.065562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[890]: 0.065577075 - core[0].svIdle(17), plen 0: [] +EVENT[891]: 0.066448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[892]: 0.066461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[893]: 0.066476975 - core[1].svIdle(17), plen 0: [] +EVENT[894]: 0.066546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[895]: 0.066562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[896]: 0.066577225 - core[0].svIdle(17), plen 0: [] +EVENT[897]: 0.067448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[898]: 0.067461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[899]: 0.067476900 - core[1].svIdle(17), plen 0: [] +EVENT[900]: 0.067546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[901]: 0.067562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[902]: 0.067577075 - core[0].svIdle(17), plen 0: [] +EVENT[903]: 0.068448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[904]: 0.068461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[905]: 0.068476850 - core[1].svIdle(17), plen 0: [] +EVENT[906]: 0.068546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[907]: 0.068562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[908]: 0.068577275 - core[0].svIdle(17), plen 0: [] +EVENT[909]: 0.069448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[910]: 0.069461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[911]: 0.069476850 - core[1].svIdle(17), plen 0: [] +EVENT[912]: 0.069546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[913]: 0.069562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[914]: 0.069577075 - core[0].svIdle(17), plen 0: [] +EVENT[915]: 0.070448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[916]: 0.070461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[917]: 0.070476975 - core[1].svIdle(17), plen 0: [] +EVENT[918]: 0.070546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[919]: 0.070562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[920]: 0.070577225 - core[0].svIdle(17), plen 0: [] +EVENT[921]: 0.071448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[922]: 0.071461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[923]: 0.071476900 - core[1].svIdle(17), plen 0: [] +EVENT[924]: 0.071546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[925]: 0.071562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[926]: 0.071577075 - core[0].svIdle(17), plen 0: [] +EVENT[927]: 0.072448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[928]: 0.072461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[929]: 0.072476850 - core[1].svIdle(17), plen 0: [] +EVENT[930]: 0.072546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[931]: 0.072562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[932]: 0.072577275 - core[0].svIdle(17), plen 0: [] +EVENT[933]: 0.073448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[934]: 0.073461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[935]: 0.073476850 - core[1].svIdle(17), plen 0: [] +EVENT[936]: 0.073546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[937]: 0.073562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[938]: 0.073577075 - core[0].svIdle(17), plen 0: [] +EVENT[939]: 0.074448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[940]: 0.074465975 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[941]: 0.074481225 - core[1].svIdle(17), plen 0: [] +EVENT[942]: 0.074546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[943]: 0.074562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[944]: 0.074577075 - core[0].svIdle(17), plen 0: [] +EVENT[945]: 0.075448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[946]: 0.075461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[947]: 0.075476850 - core[1].svIdle(17), plen 0: [] +EVENT[948]: 0.075546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[949]: 0.075562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[950]: 0.075577275 - core[0].svIdle(17), plen 0: [] +EVENT[951]: 0.076448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[952]: 0.076461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[953]: 0.076476850 - core[1].svIdle(17), plen 0: [] +EVENT[954]: 0.076546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[955]: 0.076562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[956]: 0.076577075 - core[0].svIdle(17), plen 0: [] +EVENT[957]: 0.077448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[958]: 0.077461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[959]: 0.077476975 - core[1].svIdle(17), plen 0: [] +EVENT[960]: 0.077546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[961]: 0.077562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[962]: 0.077577225 - core[0].svIdle(17), plen 0: [] +EVENT[963]: 0.078448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[964]: 0.078461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[965]: 0.078476900 - core[1].svIdle(17), plen 0: [] +EVENT[966]: 0.078546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[967]: 0.078562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[968]: 0.078577075 - core[0].svIdle(17), plen 0: [] +EVENT[969]: 0.079448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[970]: 0.079461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[971]: 0.079476850 - core[1].svIdle(17), plen 0: [] +EVENT[972]: 0.079546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[973]: 0.079562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[974]: 0.079577275 - core[0].svIdle(17), plen 0: [] +EVENT[975]: 0.080448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[976]: 0.080461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[977]: 0.080476850 - core[1].svIdle(17), plen 0: [] +EVENT[978]: 0.080546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[979]: 0.080562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[980]: 0.080577075 - core[0].svIdle(17), plen 0: [] +EVENT[981]: 0.081448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[982]: 0.081461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[983]: 0.081476975 - core[1].svIdle(17), plen 0: [] +EVENT[984]: 0.081546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[985]: 0.081562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[986]: 0.081577225 - core[0].svIdle(17), plen 0: [] +EVENT[987]: 0.082448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[988]: 0.082461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[989]: 0.082476900 - core[1].svIdle(17), plen 0: [] +EVENT[990]: 0.082546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[991]: 0.082562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[992]: 0.082577075 - core[0].svIdle(17), plen 0: [] +EVENT[993]: 0.083448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[994]: 0.083461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[995]: 0.083476850 - core[1].svIdle(17), plen 0: [] +EVENT[996]: 0.083546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[997]: 0.083562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[998]: 0.083577275 - core[0].svIdle(17), plen 0: [] +EVENT[999]: 0.084448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1000]: 0.084461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1001]: 0.084476850 - core[1].svIdle(17), plen 0: [] +EVENT[1002]: 0.084546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1003]: 0.084562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1004]: 0.084577075 - core[0].svIdle(17), plen 0: [] +EVENT[1005]: 0.085448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1006]: 0.085461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1007]: 0.085476975 - core[1].svIdle(17), plen 0: [] +EVENT[1008]: 0.085546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1009]: 0.085562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1010]: 0.085577225 - core[0].svIdle(17), plen 0: [] +EVENT[1011]: 0.086448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1012]: 0.086465300 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1013]: 0.086480450 - core[1].svIdle(17), plen 0: [] +EVENT[1014]: 0.086546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1015]: 0.086562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1016]: 0.086577075 - core[0].svIdle(17), plen 0: [] +EVENT[1017]: 0.087448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1018]: 0.087461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1019]: 0.087476850 - core[1].svIdle(17), plen 0: [] +EVENT[1020]: 0.087546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1021]: 0.087562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1022]: 0.087577275 - core[0].svIdle(17), plen 0: [] +EVENT[1023]: 0.088448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1024]: 0.088461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1025]: 0.088476850 - core[1].svIdle(17), plen 0: [] +EVENT[1026]: 0.088546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1027]: 0.088562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1028]: 0.088577075 - core[0].svIdle(17), plen 0: [] +EVENT[1029]: 0.089448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1030]: 0.089461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1031]: 0.089476975 - core[1].svIdle(17), plen 0: [] +EVENT[1032]: 0.089546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1033]: 0.089562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1034]: 0.089577225 - core[0].svIdle(17), plen 0: [] +EVENT[1035]: 0.090448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1036]: 0.090461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1037]: 0.090476900 - core[1].svIdle(17), plen 0: [] +EVENT[1038]: 0.090546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1039]: 0.090562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1040]: 0.090577075 - core[0].svIdle(17), plen 0: [] +EVENT[1041]: 0.091448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1042]: 0.091461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1043]: 0.091476850 - core[1].svIdle(17), plen 0: [] +EVENT[1044]: 0.091546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1045]: 0.091562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1046]: 0.091577275 - core[0].svIdle(17), plen 0: [] +EVENT[1047]: 0.092448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1048]: 0.092461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1049]: 0.092476850 - core[1].svIdle(17), plen 0: [] +EVENT[1050]: 0.092546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1051]: 0.092561625 - core[0].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[1052]: 0.092561625 - core[1].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[1053]: 0.092574275 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1054]: 0.092590075 - core[0].svTaskStartExec(4), plen 0: [tid: 12284596] +EVENT[1055]: 0.092625125 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459008, size: 4, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.092625125] HEAP: Allocated 4 bytes @ 0x3ffbaf40 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[914]: 0.091950300 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461144, size: 8, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.091950300] HEAP: Allocated 8 bytes @ 0x3ffbb798 from task "alloc0" on core 0 by: +EVENT[1056]: 0.092660700 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459040, size: 8, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.092660700] HEAP: Allocated 8 bytes @ 0x3ffbaf60 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[915]: 0.091967200 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[916]: 0.091983200 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[917]: 0.092047350 - core[0].svPrint(26), plen 69: [msg: I (400) example: Task[0x3ffb7aec]: allocated 8 bytes @ 0x3ffbb798 +EVENT[1057]: 0.092677675 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1058]: 0.092693775 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1059]: 0.092750550 - core[0].svPrint(26), plen 69: [msg: I (388) example: Task[0x3ffb72b4]: allocated 8 bytes @ 0x3ffbaf60 , lvl: 0, unused: 0] -[0.092047350] LOG: I (400) example: Task[0x3ffb7aec]: allocated 8 bytes @ 0x3ffbb798 -EVENT[918]: 0.092060925 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12287056, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[919]: 0.092074075 - core[0].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[920]: 0.092090275 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[921]: 0.092101125 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[922]: 0.092111925 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[923]: 0.092125800 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[924]: 0.092136625 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[925]: 0.092147475 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[926]: 0.092159350 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12287056, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[927]: 0.092169575 - core[0].svIdle(17), plen 0: [] -EVENT[928]: 0.092181050 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[929]: 0.092201300 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[930]: 0.092264850 - core[1].svPrint(26), plen 63: [msg: I (400) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb798 +[0.092750550] LOG: I (388) example: Task[0x3ffb72b4]: allocated 8 bytes @ 0x3ffbaf60 +EVENT[1060]: 0.092764000 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12284952, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1061]: 0.092777225 - core[0].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[1062]: 0.092777225 - core[1].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[1063]: 0.092793475 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1064]: 0.092804425 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1065]: 0.092815175 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1066]: 0.092828925 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1067]: 0.092839650 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[1068]: 0.092850450 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1069]: 0.092862450 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12284952, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1070]: 0.092872675 - core[0].svIdle(17), plen 0: [] +EVENT[1071]: 0.092884425 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1072]: 0.092900700 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1073]: 0.092948475 - core[1].svPrint(26), plen 63: [msg: I (388) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf60 , lvl: 0, unused: 0] -[0.092264850] LOG: I (400) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb798 -EVENT[931]: 0.092286050 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461144, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.092286050] HEAP: Freed bytes @ 0x3ffbb798 from task "free0" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.092948475] LOG: I (388) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf60 +EVENT[1074]: 0.092969850 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459040, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.092969850] HEAP: Freed bytes @ 0x3ffbaf60 from task "free0" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[932]: 0.092312950 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[933]: 0.092324500 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[934]: 0.092341075 - core[1].svIdle(17), plen 0: [] -EVENT[935]: 0.092666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[936]: 0.092679850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[937]: 0.092695550 - core[1].svIdle(17), plen 0: [] -EVENT[938]: 0.092833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[939]: 0.092848800 - core[0].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[940]: 0.092861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[941]: 0.092877375 - core[0].svTaskStartExec(4), plen 0: [tid: 12292716] -EVENT[942]: 0.092912775 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461144, size: 8, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.092912775] HEAP: Allocated 8 bytes @ 0x3ffbb798 from task "alloc1" on core 0 by: +EVENT[1075]: 0.093001300 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1076]: 0.093012750 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1077]: 0.093029450 - core[1].svIdle(17), plen 0: [] +EVENT[1078]: 0.093448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1079]: 0.093461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1080]: 0.093477300 - core[1].svIdle(17), plen 0: [] +EVENT[1081]: 0.093546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1082]: 0.093561625 - core[0].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[1083]: 0.093561625 - core[1].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[1084]: 0.093573500 - core[0].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[1085]: 0.093573500 - core[1].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[1086]: 0.093585975 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1087]: 0.093601625 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[1088]: 0.093638000 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459040, size: 8, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.093638000] HEAP: Allocated 8 bytes @ 0x3ffbaf60 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[943]: 0.092947300 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461160, size: 16, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.092947300] HEAP: Allocated 16 bytes @ 0x3ffbb7a8 from task "alloc1" on core 0 by: +EVENT[1089]: 0.093673450 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459056, size: 16, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.093673450] HEAP: Allocated 16 bytes @ 0x3ffbaf70 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[944]: 0.092964250 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[945]: 0.092984425 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[946]: 0.093050900 - core[0].svPrint(26), plen 70: [msg: I (401) example: Task[0x3ffb926c]: allocated 16 bytes @ 0x3ffbb7a8 +EVENT[1090]: 0.093690500 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1091]: 0.093706525 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1092]: 0.093761350 - core[0].svPrint(26), plen 70: [msg: I (389) example: Task[0x3ffb8a34]: allocated 16 bytes @ 0x3ffbaf70 , lvl: 0, unused: 0] -[0.093050900] LOG: I (401) example: Task[0x3ffb926c]: allocated 16 bytes @ 0x3ffbb7a8 -EVENT[947]: 0.093064550 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12293072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[948]: 0.093077850 - core[0].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[949]: 0.093094175 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[950]: 0.093105025 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[951]: 0.093115775 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[952]: 0.093129500 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[953]: 0.093140350 - core[1].svTaskStartExec(4), plen 0: [tid: 12295764] -EVENT[954]: 0.093151175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[955]: 0.093163025 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12293072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[956]: 0.093173300 - core[0].svIdle(17), plen 0: [] -EVENT[957]: 0.093184775 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[958]: 0.093201075 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[959]: 0.093264525 - core[1].svPrint(26), plen 63: [msg: I (401) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb7a8 -, lvl: 0, unused: 0] -[0.093264525] LOG: I (401) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb7a8 -EVENT[960]: 0.093289550 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461160, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.093289550] HEAP: Freed bytes @ 0x3ffbb7a8 from task "free1" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 -/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 -/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 - -EVENT[961]: 0.093316550 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[962]: 0.093327975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[963]: 0.093344550 - core[1].svIdle(17), plen 0: [] -EVENT[964]: 0.093666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[965]: 0.093679850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[966]: 0.093695550 - core[1].svIdle(17), plen 0: [] -EVENT[967]: 0.093833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[968]: 0.093848800 - core[0].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[969]: 0.093861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[970]: 0.093877250 - core[0].svTaskStartExec(4), plen 0: [tid: 12298716] -EVENT[971]: 0.093912650 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461160, size: 12, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.093912650] HEAP: Allocated 12 bytes @ 0x3ffbb7a8 from task "alloc2" on core 0 by: +[0.093761350] LOG: I (389) example: Task[0x3ffb8a34]: allocated 16 bytes @ 0x3ffbaf70 +EVENT[1093]: 0.093778125 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12290968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1094]: 0.093791500 - core[0].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[1095]: 0.093791500 - core[1].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[1096]: 0.093807850 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1097]: 0.093818700 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1098]: 0.093829525 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1099]: 0.093843300 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1100]: 0.093855250 - core[1].svTaskStartExec(4), plen 0: [tid: 12293660] +EVENT[1101]: 0.093866400 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1102]: 0.093878350 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12290968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1103]: 0.093890000 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[1104]: 0.093901700 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1105]: 0.093920300 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1106]: 0.093933400 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459076, size: 12, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.093933400] HEAP: Allocated 12 bytes @ 0x3ffbaf84 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[972]: 0.093947050 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461176, size: 24, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.093947050] HEAP: Allocated 24 bytes @ 0x3ffbb7b8 from task "alloc2" on core 0 by: +EVENT[1107]: 0.093973950 - core[1].svPrint(26), plen 63: [msg: I (389) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf70 +, lvl: 0, unused: 0] +[0.093973950] LOG: I (389) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf70 +EVENT[1108]: 0.093989825 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459092, size: 24, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.093989825] HEAP: Allocated 24 bytes @ 0x3ffbaf94 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[973]: 0.093963950 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[974]: 0.093980050 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[975]: 0.094050525 - core[0].svPrint(26), plen 70: [msg: I (402) example: Task[0x3ffba9dc]: allocated 24 bytes @ 0x3ffbb7b8 -, lvl: 0, unused: 0] -[0.094050525] LOG: I (402) example: Task[0x3ffba9dc]: allocated 24 bytes @ 0x3ffbb7b8 -EVENT[976]: 0.094068350 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12299072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[977]: 0.094081575 - core[0].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[978]: 0.094097875 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[979]: 0.094108725 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[980]: 0.094119500 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[981]: 0.094133225 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[982]: 0.094144100 - core[1].svTaskStartExec(4), plen 0: [tid: 12301764] -EVENT[983]: 0.094154925 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[984]: 0.094166800 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12299072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[985]: 0.094178075 - core[0].svIdle(17), plen 0: [] -EVENT[986]: 0.094189725 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[987]: 0.094206100 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[988]: 0.094269650 - core[1].svPrint(26), plen 63: [msg: I (402) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb7b8 -, lvl: 0, unused: 0] -[0.094269650] LOG: I (402) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb7b8 -EVENT[989]: 0.094290850 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461176, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.094290850] HEAP: Freed bytes @ 0x3ffbb7b8 from task "free2" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +EVENT[1109]: 0.094004125 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459056, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.094004125] HEAP: Freed bytes @ 0x3ffbaf70 from task "free1" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[990]: 0.094321875 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[991]: 0.094333350 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[992]: 0.094350050 - core[1].svIdle(17), plen 0: [] -EVENT[993]: 0.094666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[994]: 0.094679875 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[995]: 0.094695450 - core[1].svIdle(17), plen 0: [] -EVENT[996]: 0.094833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[997]: 0.094849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[998]: 0.094864425 - core[0].svIdle(17), plen 0: [] -EVENT[999]: 0.095666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1000]: 0.095679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1001]: 0.095695100 - core[1].svIdle(17), plen 0: [] -EVENT[1002]: 0.095833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1003]: 0.095849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1004]: 0.095864250 - core[0].svIdle(17), plen 0: [] -EVENT[1005]: 0.096666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1006]: 0.096680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1007]: 0.096695350 - core[1].svIdle(17), plen 0: [] -EVENT[1008]: 0.096833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1009]: 0.096849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1010]: 0.096864250 - core[0].svIdle(17), plen 0: [] -EVENT[1011]: 0.097666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1012]: 0.097680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1013]: 0.097695125 - core[1].svIdle(17), plen 0: [] -EVENT[1014]: 0.097833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1015]: 0.097849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1016]: 0.097864250 - core[0].svIdle(17), plen 0: [] -EVENT[1017]: 0.098666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1018]: 0.098680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1019]: 0.098695225 - core[1].svIdle(17), plen 0: [] -EVENT[1020]: 0.098833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1021]: 0.098849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1022]: 0.098864425 - core[0].svIdle(17), plen 0: [] -EVENT[1023]: 0.099666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1024]: 0.099679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1025]: 0.099695100 - core[1].svIdle(17), plen 0: [] -EVENT[1026]: 0.099833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1027]: 0.099849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1028]: 0.099864250 - core[0].svIdle(17), plen 0: [] -EVENT[1029]: 0.100666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1030]: 0.100680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1031]: 0.100695350 - core[1].svIdle(17), plen 0: [] -EVENT[1032]: 0.100833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1033]: 0.100849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1034]: 0.100864250 - core[0].svIdle(17), plen 0: [] -EVENT[1035]: 0.101666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1036]: 0.101680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1037]: 0.101695125 - core[1].svIdle(17), plen 0: [] -EVENT[1038]: 0.101833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1039]: 0.101849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1040]: 0.101864250 - core[0].svIdle(17), plen 0: [] -EVENT[1041]: 0.102666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1042]: 0.102680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1043]: 0.102695225 - core[1].svIdle(17), plen 0: [] -EVENT[1044]: 0.102833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1045]: 0.102849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1046]: 0.102864425 - core[0].svIdle(17), plen 0: [] -EVENT[1047]: 0.103666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1048]: 0.103679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1049]: 0.103695100 - core[1].svIdle(17), plen 0: [] -EVENT[1050]: 0.103833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1051]: 0.103849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1052]: 0.103864250 - core[0].svIdle(17), plen 0: [] -EVENT[1053]: 0.104666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1054]: 0.104683575 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1055]: 0.104698725 - core[1].svIdle(17), plen 0: [] -EVENT[1056]: 0.104833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1057]: 0.104849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1058]: 0.104864250 - core[0].svIdle(17), plen 0: [] -EVENT[1059]: 0.105666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1060]: 0.105680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1061]: 0.105695225 - core[1].svIdle(17), plen 0: [] -EVENT[1062]: 0.105833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1063]: 0.105849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1064]: 0.105864425 - core[0].svIdle(17), plen 0: [] -EVENT[1065]: 0.106666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1066]: 0.106679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1067]: 0.106695100 - core[1].svIdle(17), plen 0: [] -EVENT[1068]: 0.106833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1069]: 0.106849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1070]: 0.106864250 - core[0].svIdle(17), plen 0: [] -EVENT[1071]: 0.107666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1072]: 0.107680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1073]: 0.107695350 - core[1].svIdle(17), plen 0: [] -EVENT[1074]: 0.107833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1075]: 0.107849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1076]: 0.107864250 - core[0].svIdle(17), plen 0: [] -EVENT[1077]: 0.108666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1078]: 0.108680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1079]: 0.108695125 - core[1].svIdle(17), plen 0: [] -EVENT[1080]: 0.108833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1081]: 0.108849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1082]: 0.108864250 - core[0].svIdle(17), plen 0: [] -EVENT[1083]: 0.109666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1084]: 0.109680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1085]: 0.109695225 - core[1].svIdle(17), plen 0: [] -EVENT[1086]: 0.109833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1087]: 0.109849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1088]: 0.109864425 - core[0].svIdle(17), plen 0: [] -EVENT[1089]: 0.110666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1090]: 0.110679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1091]: 0.110695100 - core[1].svIdle(17), plen 0: [] -EVENT[1092]: 0.110833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1093]: 0.110849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1094]: 0.110864250 - core[0].svIdle(17), plen 0: [] -EVENT[1095]: 0.111666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1096]: 0.111680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1097]: 0.111695350 - core[1].svIdle(17), plen 0: [] -EVENT[1098]: 0.111833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1099]: 0.111849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1100]: 0.111864250 - core[0].svIdle(17), plen 0: [] -EVENT[1101]: 0.112666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1102]: 0.112680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1103]: 0.112695125 - core[1].svIdle(17), plen 0: [] -EVENT[1104]: 0.112833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1105]: 0.112849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1106]: 0.112864250 - core[0].svIdle(17), plen 0: [] -EVENT[1107]: 0.113666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1108]: 0.113680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1109]: 0.113695225 - core[1].svIdle(17), plen 0: [] -EVENT[1110]: 0.113833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1111]: 0.113849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1112]: 0.113864425 - core[0].svIdle(17), plen 0: [] -EVENT[1113]: 0.114666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1114]: 0.114679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1115]: 0.114695100 - core[1].svIdle(17), plen 0: [] -EVENT[1116]: 0.114833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1117]: 0.114849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1118]: 0.114864250 - core[0].svIdle(17), plen 0: [] -EVENT[1119]: 0.115666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1120]: 0.115680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1121]: 0.115695350 - core[1].svIdle(17), plen 0: [] -EVENT[1122]: 0.115833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1123]: 0.115849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1124]: 0.115864250 - core[0].svIdle(17), plen 0: [] -EVENT[1125]: 0.116666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1126]: 0.116684225 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1127]: 0.116699375 - core[1].svIdle(17), plen 0: [] -EVENT[1128]: 0.116833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1129]: 0.116849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1130]: 0.116864250 - core[0].svIdle(17), plen 0: [] -EVENT[1131]: 0.117666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1132]: 0.117680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1133]: 0.117695225 - core[1].svIdle(17), plen 0: [] -EVENT[1134]: 0.117833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1135]: 0.117849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1136]: 0.117864425 - core[0].svIdle(17), plen 0: [] -EVENT[1137]: 0.118666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1138]: 0.118679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1139]: 0.118695100 - core[1].svIdle(17), plen 0: [] -EVENT[1140]: 0.118833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1141]: 0.118849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1142]: 0.118864250 - core[0].svIdle(17), plen 0: [] -EVENT[1143]: 0.119666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1144]: 0.119680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1145]: 0.119695350 - core[1].svIdle(17), plen 0: [] -EVENT[1146]: 0.119833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1147]: 0.119849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1148]: 0.119864250 - core[0].svIdle(17), plen 0: [] -EVENT[1149]: 0.120666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1150]: 0.120680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1151]: 0.120695125 - core[1].svIdle(17), plen 0: [] -EVENT[1152]: 0.120833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1153]: 0.120849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1154]: 0.120864250 - core[0].svIdle(17), plen 0: [] -EVENT[1155]: 0.121666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1156]: 0.121680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1157]: 0.121695225 - core[1].svIdle(17), plen 0: [] -EVENT[1158]: 0.121833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1159]: 0.121848825 - core[0].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[1160]: 0.121861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1161]: 0.121877250 - core[0].svTaskStartExec(4), plen 0: [tid: 12286700] -EVENT[1162]: 0.121912575 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461176, size: 5, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.121912575] HEAP: Allocated 5 bytes @ 0x3ffbb7b8 from task "alloc0" on core 0 by: +EVENT[1110]: 0.094016550 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1111]: 0.094036600 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1112]: 0.094047525 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1113]: 0.094059050 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1114]: 0.094077025 - core[1].svIdle(17), plen 0: [] +EVENT[1115]: 0.094095025 - core[0].svPrint(26), plen 70: [msg: I (389) example: Task[0x3ffba1a4]: allocated 24 bytes @ 0x3ffbaf94 +, lvl: 0, unused: 0] +[0.094095025] LOG: I (389) example: Task[0x3ffba1a4]: allocated 24 bytes @ 0x3ffbaf94 +EVENT[1116]: 0.094108450 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12296968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1117]: 0.094125225 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[1118]: 0.094125225 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[1119]: 0.094141575 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1120]: 0.094152425 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1121]: 0.094163250 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1122]: 0.094177050 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1123]: 0.094187800 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[1124]: 0.094198600 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1125]: 0.094210550 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12296968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1126]: 0.094221775 - core[0].svIdle(17), plen 0: [] +EVENT[1127]: 0.094233600 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1128]: 0.094249850 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1129]: 0.094297625 - core[1].svPrint(26), plen 63: [msg: I (389) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf94 +, lvl: 0, unused: 0] +[0.094297625] LOG: I (389) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf94 +EVENT[1130]: 0.094319000 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459092, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.094319000] HEAP: Freed bytes @ 0x3ffbaf94 from task "free2" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 +/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 +/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 + +EVENT[1131]: 0.094346425 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1132]: 0.094357825 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1133]: 0.094374400 - core[1].svIdle(17), plen 0: [] +EVENT[1134]: 0.094448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1135]: 0.094461625 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1136]: 0.094477200 - core[1].svIdle(17), plen 0: [] +EVENT[1137]: 0.094546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1138]: 0.094562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1139]: 0.094577075 - core[0].svIdle(17), plen 0: [] +EVENT[1140]: 0.095448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1141]: 0.095461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1142]: 0.095476850 - core[1].svIdle(17), plen 0: [] +EVENT[1143]: 0.095546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1144]: 0.095562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1145]: 0.095577275 - core[0].svIdle(17), plen 0: [] +EVENT[1146]: 0.096448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1147]: 0.096461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1148]: 0.096476850 - core[1].svIdle(17), plen 0: [] +EVENT[1149]: 0.096546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1150]: 0.096565625 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1151]: 0.096580850 - core[0].svIdle(17), plen 0: [] +EVENT[1152]: 0.097448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1153]: 0.097461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1154]: 0.097476850 - core[1].svIdle(17), plen 0: [] +EVENT[1155]: 0.097546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1156]: 0.097562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1157]: 0.097577075 - core[0].svIdle(17), plen 0: [] +EVENT[1158]: 0.098448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1159]: 0.098461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1160]: 0.098476975 - core[1].svIdle(17), plen 0: [] +EVENT[1161]: 0.098546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1162]: 0.098562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1163]: 0.098577225 - core[0].svIdle(17), plen 0: [] +EVENT[1164]: 0.099448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1165]: 0.099461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1166]: 0.099476900 - core[1].svIdle(17), plen 0: [] +EVENT[1167]: 0.099546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1168]: 0.099562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1169]: 0.099577075 - core[0].svIdle(17), plen 0: [] +EVENT[1170]: 0.100448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1171]: 0.100461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1172]: 0.100476850 - core[1].svIdle(17), plen 0: [] +EVENT[1173]: 0.100546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1174]: 0.100562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1175]: 0.100577275 - core[0].svIdle(17), plen 0: [] +EVENT[1176]: 0.101448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1177]: 0.101461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1178]: 0.101476850 - core[1].svIdle(17), plen 0: [] +EVENT[1179]: 0.101546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1180]: 0.101562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1181]: 0.101577075 - core[0].svIdle(17), plen 0: [] +EVENT[1182]: 0.102448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1183]: 0.102461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1184]: 0.102476975 - core[1].svIdle(17), plen 0: [] +EVENT[1185]: 0.102546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1186]: 0.102562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1187]: 0.102577225 - core[0].svIdle(17), plen 0: [] +EVENT[1188]: 0.103448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1189]: 0.103461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1190]: 0.103476900 - core[1].svIdle(17), plen 0: [] +EVENT[1191]: 0.103546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1192]: 0.103562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1193]: 0.103577075 - core[0].svIdle(17), plen 0: [] +EVENT[1194]: 0.104448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1195]: 0.104461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1196]: 0.104476850 - core[1].svIdle(17), plen 0: [] +EVENT[1197]: 0.104546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1198]: 0.104562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1199]: 0.104577275 - core[0].svIdle(17), plen 0: [] +EVENT[1200]: 0.105448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1201]: 0.105461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1202]: 0.105476850 - core[1].svIdle(17), plen 0: [] +EVENT[1203]: 0.105546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1204]: 0.105562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1205]: 0.105577075 - core[0].svIdle(17), plen 0: [] +EVENT[1206]: 0.106448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1207]: 0.106461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1208]: 0.106476975 - core[1].svIdle(17), plen 0: [] +EVENT[1209]: 0.106546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1210]: 0.106562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1211]: 0.106577225 - core[0].svIdle(17), plen 0: [] +EVENT[1212]: 0.107448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1213]: 0.107461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1214]: 0.107476900 - core[1].svIdle(17), plen 0: [] +EVENT[1215]: 0.107546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1216]: 0.107562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1217]: 0.107577075 - core[0].svIdle(17), plen 0: [] +EVENT[1218]: 0.108448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1219]: 0.108461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1220]: 0.108476850 - core[1].svIdle(17), plen 0: [] +EVENT[1221]: 0.108546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1222]: 0.108566300 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1223]: 0.108581500 - core[0].svIdle(17), plen 0: [] +EVENT[1224]: 0.109448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1225]: 0.109461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1226]: 0.109476850 - core[1].svIdle(17), plen 0: [] +EVENT[1227]: 0.109546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1228]: 0.109562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1229]: 0.109577075 - core[0].svIdle(17), plen 0: [] +EVENT[1230]: 0.110448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1231]: 0.110461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1232]: 0.110476975 - core[1].svIdle(17), plen 0: [] +EVENT[1233]: 0.110546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1234]: 0.110562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1235]: 0.110577225 - core[0].svIdle(17), plen 0: [] +EVENT[1236]: 0.111448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1237]: 0.111461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1238]: 0.111476900 - core[1].svIdle(17), plen 0: [] +EVENT[1239]: 0.111546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1240]: 0.111562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1241]: 0.111577075 - core[0].svIdle(17), plen 0: [] +EVENT[1242]: 0.112448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1243]: 0.112461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1244]: 0.112476850 - core[1].svIdle(17), plen 0: [] +EVENT[1245]: 0.112546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1246]: 0.112562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1247]: 0.112577275 - core[0].svIdle(17), plen 0: [] +EVENT[1248]: 0.113448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1249]: 0.113461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1250]: 0.113476850 - core[1].svIdle(17), plen 0: [] +EVENT[1251]: 0.113546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1252]: 0.113562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1253]: 0.113577075 - core[0].svIdle(17), plen 0: [] +EVENT[1254]: 0.114448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1255]: 0.114461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1256]: 0.114476975 - core[1].svIdle(17), plen 0: [] +EVENT[1257]: 0.114546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1258]: 0.114562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1259]: 0.114577225 - core[0].svIdle(17), plen 0: [] +EVENT[1260]: 0.115448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1261]: 0.115461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1262]: 0.115476900 - core[1].svIdle(17), plen 0: [] +EVENT[1263]: 0.115546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1264]: 0.115562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1265]: 0.115577075 - core[0].svIdle(17), plen 0: [] +EVENT[1266]: 0.116448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1267]: 0.116461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1268]: 0.116476850 - core[1].svIdle(17), plen 0: [] +EVENT[1269]: 0.116546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1270]: 0.116562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1271]: 0.116577275 - core[0].svIdle(17), plen 0: [] +EVENT[1272]: 0.117448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1273]: 0.117461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1274]: 0.117476850 - core[1].svIdle(17), plen 0: [] +EVENT[1275]: 0.117546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1276]: 0.117562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1277]: 0.117577075 - core[0].svIdle(17), plen 0: [] +EVENT[1278]: 0.118448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1279]: 0.118461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1280]: 0.118476975 - core[1].svIdle(17), plen 0: [] +EVENT[1281]: 0.118546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1282]: 0.118562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1283]: 0.118577225 - core[0].svIdle(17), plen 0: [] +EVENT[1284]: 0.119448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1285]: 0.119461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1286]: 0.119476900 - core[1].svIdle(17), plen 0: [] +EVENT[1287]: 0.119546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1288]: 0.119562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1289]: 0.119577075 - core[0].svIdle(17), plen 0: [] +EVENT[1290]: 0.120448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1291]: 0.120461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1292]: 0.120476850 - core[1].svIdle(17), plen 0: [] +EVENT[1293]: 0.120546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1294]: 0.120566300 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1295]: 0.120581500 - core[0].svIdle(17), plen 0: [] +EVENT[1296]: 0.121448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1297]: 0.121461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1298]: 0.121476850 - core[1].svIdle(17), plen 0: [] +EVENT[1299]: 0.121546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1300]: 0.121562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1301]: 0.121577075 - core[0].svIdle(17), plen 0: [] +EVENT[1302]: 0.122448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1303]: 0.122461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1304]: 0.122476975 - core[1].svIdle(17), plen 0: [] +EVENT[1305]: 0.122546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1306]: 0.122561625 - core[0].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[1307]: 0.122561625 - core[1].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[1308]: 0.122574225 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1309]: 0.122589875 - core[0].svTaskStartExec(4), plen 0: [tid: 12284596] +EVENT[1310]: 0.122624900 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459056, size: 5, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.122624900] HEAP: Allocated 5 bytes @ 0x3ffbaf70 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1163]: 0.121947000 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461192, size: 10, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.121947000] HEAP: Allocated 10 bytes @ 0x3ffbb7c8 from task "alloc0" on core 0 by: +EVENT[1311]: 0.122660375 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459092, size: 10, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.122660375] HEAP: Allocated 10 bytes @ 0x3ffbaf94 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1164]: 0.121964025 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1165]: 0.121980025 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1166]: 0.122050450 - core[0].svPrint(26), plen 70: [msg: I (430) example: Task[0x3ffb7aec]: allocated 10 bytes @ 0x3ffbb7c8 +EVENT[1312]: 0.122677300 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1313]: 0.122693250 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1314]: 0.122748025 - core[0].svPrint(26), plen 70: [msg: I (418) example: Task[0x3ffb72b4]: allocated 10 bytes @ 0x3ffbaf94 , lvl: 0, unused: 0] -[0.122050450] LOG: I (430) example: Task[0x3ffb7aec]: allocated 10 bytes @ 0x3ffbb7c8 -EVENT[1167]: 0.122068175 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12287056, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1168]: 0.122081400 - core[0].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[1169]: 0.122097650 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1170]: 0.122108500 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1171]: 0.122119275 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1172]: 0.122133100 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1173]: 0.122144000 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[1174]: 0.122154825 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1175]: 0.122166775 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12287056, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1176]: 0.122177025 - core[0].svIdle(17), plen 0: [] -EVENT[1177]: 0.122188450 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1178]: 0.122204800 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1179]: 0.122268350 - core[1].svPrint(26), plen 63: [msg: I (430) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb7c8 +[0.122748025] LOG: I (418) example: Task[0x3ffb72b4]: allocated 10 bytes @ 0x3ffbaf94 +EVENT[1315]: 0.122761500 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12284952, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1316]: 0.122778850 - core[0].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[1317]: 0.122778850 - core[1].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[1318]: 0.122795100 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1319]: 0.122806050 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1320]: 0.122816825 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1321]: 0.122830550 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1322]: 0.122841300 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[1323]: 0.122852100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1324]: 0.122864075 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12284952, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1325]: 0.122874325 - core[0].svIdle(17), plen 0: [] +EVENT[1326]: 0.122886075 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1327]: 0.122902350 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1328]: 0.122950125 - core[1].svPrint(26), plen 63: [msg: I (418) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf94 , lvl: 0, unused: 0] -[0.122268350] LOG: I (430) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb7c8 -EVENT[1180]: 0.122289550 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461192, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.122289550] HEAP: Freed bytes @ 0x3ffbb7c8 from task "free0" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.122950125] LOG: I (418) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf94 +EVENT[1329]: 0.122971500 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459092, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.122971500] HEAP: Freed bytes @ 0x3ffbaf94 from task "free0" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1181]: 0.122320575 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1182]: 0.122332175 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1183]: 0.122348875 - core[1].svIdle(17), plen 0: [] -EVENT[1184]: 0.122666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1185]: 0.122679875 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1186]: 0.122695450 - core[1].svIdle(17), plen 0: [] -EVENT[1187]: 0.122833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1188]: 0.122848825 - core[0].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[1189]: 0.122861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1190]: 0.122877250 - core[0].svTaskStartExec(4), plen 0: [tid: 12292716] -EVENT[1191]: 0.122912575 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461192, size: 10, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.122912575] HEAP: Allocated 10 bytes @ 0x3ffbb7c8 from task "alloc1" on core 0 by: +EVENT[1330]: 0.122998900 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1331]: 0.123010325 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1332]: 0.123026875 - core[1].svIdle(17), plen 0: [] +EVENT[1333]: 0.123448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1334]: 0.123461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1335]: 0.123477300 - core[1].svIdle(17), plen 0: [] +EVENT[1336]: 0.123546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1337]: 0.123561675 - core[0].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[1338]: 0.123561675 - core[1].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[1339]: 0.123573500 - core[0].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[1340]: 0.123573500 - core[1].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[1341]: 0.123586000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1342]: 0.123601675 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[1343]: 0.123638125 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459092, size: 10, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.123638125] HEAP: Allocated 10 bytes @ 0x3ffbaf94 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1192]: 0.122947000 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461208, size: 20, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.122947000] HEAP: Allocated 20 bytes @ 0x3ffbb7d8 from task "alloc1" on core 0 by: +EVENT[1344]: 0.123677700 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459108, size: 20, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.123677700] HEAP: Allocated 20 bytes @ 0x3ffbafa4 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1193]: 0.122964025 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1194]: 0.122980025 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1195]: 0.123050450 - core[0].svPrint(26), plen 70: [msg: I (431) example: Task[0x3ffb926c]: allocated 20 bytes @ 0x3ffbb7d8 +EVENT[1345]: 0.123694650 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1346]: 0.123710775 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1347]: 0.123765500 - core[0].svPrint(26), plen 70: [msg: I (419) example: Task[0x3ffb8a34]: allocated 20 bytes @ 0x3ffbafa4 , lvl: 0, unused: 0] -[0.123050450] LOG: I (431) example: Task[0x3ffb926c]: allocated 20 bytes @ 0x3ffbb7d8 -EVENT[1196]: 0.123064000 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12293072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1197]: 0.123081425 - core[0].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[1198]: 0.123097725 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1199]: 0.123108575 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1200]: 0.123119325 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1201]: 0.123133050 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1202]: 0.123143900 - core[1].svTaskStartExec(4), plen 0: [tid: 12295764] -EVENT[1203]: 0.123154725 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1204]: 0.123166600 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12293072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1205]: 0.123176850 - core[0].svIdle(17), plen 0: [] -EVENT[1206]: 0.123188325 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1207]: 0.123204625 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1208]: 0.123268075 - core[1].svPrint(26), plen 63: [msg: I (431) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb7d8 -, lvl: 0, unused: 0] -[0.123268075] LOG: I (431) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb7d8 -EVENT[1209]: 0.123289250 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461208, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.123289250] HEAP: Freed bytes @ 0x3ffbb7d8 from task "free1" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 -/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 -/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 - -EVENT[1210]: 0.123316250 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1211]: 0.123327675 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1212]: 0.123344250 - core[1].svIdle(17), plen 0: [] -EVENT[1213]: 0.123666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1214]: 0.123679850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1215]: 0.123695550 - core[1].svIdle(17), plen 0: [] -EVENT[1216]: 0.123833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1217]: 0.123848800 - core[0].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[1218]: 0.123861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1219]: 0.123877250 - core[0].svTaskStartExec(4), plen 0: [tid: 12298716] -EVENT[1220]: 0.123912650 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461208, size: 15, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.123912650] HEAP: Allocated 15 bytes @ 0x3ffbb7d8 from task "alloc2" on core 0 by: +[0.123765500] LOG: I (419) example: Task[0x3ffb8a34]: allocated 20 bytes @ 0x3ffbafa4 +EVENT[1348]: 0.123778950 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12290968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1349]: 0.123792325 - core[0].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[1350]: 0.123792325 - core[1].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[1351]: 0.123808675 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1352]: 0.123819525 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1353]: 0.123830350 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1354]: 0.123844125 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1355]: 0.123856075 - core[1].svTaskStartExec(4), plen 0: [tid: 12293660] +EVENT[1356]: 0.123867225 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1357]: 0.123879175 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12290968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1358]: 0.123890825 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[1359]: 0.123902525 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1360]: 0.123924350 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1361]: 0.123936825 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459132, size: 15, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.123936825] HEAP: Allocated 15 bytes @ 0x3ffbafbc from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1221]: 0.123951325 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461228, size: 30, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.123951325] HEAP: Allocated 30 bytes @ 0x3ffbb7ec from task "alloc2" on core 0 by: +EVENT[1362]: 0.123977900 - core[1].svPrint(26), plen 63: [msg: I (419) example: Task[0x3ffb961c]: free memory @ 0x3ffbafa4 +, lvl: 0, unused: 0] +[0.123977900] LOG: I (419) example: Task[0x3ffb961c]: free memory @ 0x3ffbafa4 +EVENT[1363]: 0.123989450 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459152, size: 30, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.123989450] HEAP: Allocated 30 bytes @ 0x3ffbafd0 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1222]: 0.123968225 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1223]: 0.123984200 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1224]: 0.124054550 - core[0].svPrint(26), plen 70: [msg: I (432) example: Task[0x3ffba9dc]: allocated 30 bytes @ 0x3ffbb7ec -, lvl: 0, unused: 0] -[0.124054550] LOG: I (432) example: Task[0x3ffba9dc]: allocated 30 bytes @ 0x3ffbb7ec -EVENT[1225]: 0.124068150 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12299072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1226]: 0.124081375 - core[0].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[1227]: 0.124097675 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1228]: 0.124108525 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1229]: 0.124119300 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1230]: 0.124133175 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1231]: 0.124144050 - core[1].svTaskStartExec(4), plen 0: [tid: 12301764] -EVENT[1232]: 0.124154875 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1233]: 0.124166750 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12299072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1234]: 0.124178025 - core[0].svIdle(17), plen 0: [] -EVENT[1235]: 0.124189675 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1236]: 0.124209375 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1237]: 0.124272925 - core[1].svPrint(26), plen 63: [msg: I (432) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb7ec -, lvl: 0, unused: 0] -[0.124272925] LOG: I (432) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb7ec -EVENT[1238]: 0.124294125 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461228, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.124294125] HEAP: Freed bytes @ 0x3ffbb7ec from task "free2" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +EVENT[1364]: 0.124003700 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459108, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.124003700] HEAP: Freed bytes @ 0x3ffbafa4 from task "free1" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1239]: 0.124321025 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1240]: 0.124332575 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1241]: 0.124349150 - core[1].svIdle(17), plen 0: [] -EVENT[1242]: 0.124666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1243]: 0.124679850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1244]: 0.124695550 - core[1].svIdle(17), plen 0: [] -EVENT[1245]: 0.124833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1246]: 0.124849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1247]: 0.124864250 - core[0].svIdle(17), plen 0: [] -EVENT[1248]: 0.125666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1249]: 0.125680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1250]: 0.125695350 - core[1].svIdle(17), plen 0: [] -EVENT[1251]: 0.125833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1252]: 0.125849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1253]: 0.125864250 - core[0].svIdle(17), plen 0: [] -EVENT[1254]: 0.126666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1255]: 0.126680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1256]: 0.126695125 - core[1].svIdle(17), plen 0: [] -EVENT[1257]: 0.126833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1258]: 0.126849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1259]: 0.126864250 - core[0].svIdle(17), plen 0: [] -EVENT[1260]: 0.127666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1261]: 0.127680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1262]: 0.127695225 - core[1].svIdle(17), plen 0: [] -EVENT[1263]: 0.127833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1264]: 0.127849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1265]: 0.127864425 - core[0].svIdle(17), plen 0: [] -EVENT[1266]: 0.128666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1267]: 0.128679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1268]: 0.128695100 - core[1].svIdle(17), plen 0: [] -EVENT[1269]: 0.128833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1270]: 0.128849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1271]: 0.128864250 - core[0].svIdle(17), plen 0: [] -EVENT[1272]: 0.129666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1273]: 0.129680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1274]: 0.129695350 - core[1].svIdle(17), plen 0: [] -EVENT[1275]: 0.129833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1276]: 0.129849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1277]: 0.129868575 - core[0].svIdle(17), plen 0: [] -EVENT[1278]: 0.130666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1279]: 0.130679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1280]: 0.130695100 - core[1].svIdle(17), plen 0: [] -EVENT[1281]: 0.130833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1282]: 0.130849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1283]: 0.130864250 - core[0].svIdle(17), plen 0: [] -EVENT[1284]: 0.131666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1285]: 0.131680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1286]: 0.131695350 - core[1].svIdle(17), plen 0: [] -EVENT[1287]: 0.131833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1288]: 0.131849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1289]: 0.131864250 - core[0].svIdle(17), plen 0: [] -EVENT[1290]: 0.132666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1291]: 0.132680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1292]: 0.132695125 - core[1].svIdle(17), plen 0: [] -EVENT[1293]: 0.132833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1294]: 0.132849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1295]: 0.132864250 - core[0].svIdle(17), plen 0: [] -EVENT[1296]: 0.133666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1297]: 0.133680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1298]: 0.133695225 - core[1].svIdle(17), plen 0: [] -EVENT[1299]: 0.133833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1300]: 0.133849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1301]: 0.133864425 - core[0].svIdle(17), plen 0: [] -EVENT[1302]: 0.134666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1303]: 0.134679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1304]: 0.134695100 - core[1].svIdle(17), plen 0: [] -EVENT[1305]: 0.134833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1306]: 0.134849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1307]: 0.134864250 - core[0].svIdle(17), plen 0: [] -EVENT[1308]: 0.135666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1309]: 0.135680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1310]: 0.135695350 - core[1].svIdle(17), plen 0: [] -EVENT[1311]: 0.135833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1312]: 0.135849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1313]: 0.135864250 - core[0].svIdle(17), plen 0: [] -EVENT[1314]: 0.136666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1315]: 0.136680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1316]: 0.136695125 - core[1].svIdle(17), plen 0: [] -EVENT[1317]: 0.136833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1318]: 0.136849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1319]: 0.136864250 - core[0].svIdle(17), plen 0: [] -EVENT[1320]: 0.137666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1321]: 0.137680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1322]: 0.137695225 - core[1].svIdle(17), plen 0: [] -EVENT[1323]: 0.137833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1324]: 0.137849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1325]: 0.137864425 - core[0].svIdle(17), plen 0: [] -EVENT[1326]: 0.138666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1327]: 0.138679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1328]: 0.138695100 - core[1].svIdle(17), plen 0: [] -EVENT[1329]: 0.138833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1330]: 0.138849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1331]: 0.138864250 - core[0].svIdle(17), plen 0: [] -EVENT[1332]: 0.139666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1333]: 0.139680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1334]: 0.139695350 - core[1].svIdle(17), plen 0: [] -EVENT[1335]: 0.139833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1336]: 0.139849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1337]: 0.139864250 - core[0].svIdle(17), plen 0: [] -EVENT[1338]: 0.140666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1339]: 0.140680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1340]: 0.140695125 - core[1].svIdle(17), plen 0: [] -EVENT[1341]: 0.140833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1342]: 0.140849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1343]: 0.140864250 - core[0].svIdle(17), plen 0: [] -EVENT[1344]: 0.141666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1345]: 0.141680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1346]: 0.141695225 - core[1].svIdle(17), plen 0: [] -EVENT[1347]: 0.141833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1348]: 0.141849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1349]: 0.141864425 - core[0].svIdle(17), plen 0: [] -EVENT[1350]: 0.142666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1351]: 0.142680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1352]: 0.142695350 - core[1].svIdle(17), plen 0: [] -EVENT[1353]: 0.142833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1354]: 0.142849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1355]: 0.142864250 - core[0].svIdle(17), plen 0: [] -EVENT[1356]: 0.143666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1357]: 0.143680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1358]: 0.143695125 - core[1].svIdle(17), plen 0: [] -EVENT[1359]: 0.143833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1360]: 0.143849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1361]: 0.143864250 - core[0].svIdle(17), plen 0: [] -EVENT[1362]: 0.144666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1363]: 0.144680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1364]: 0.144695225 - core[1].svIdle(17), plen 0: [] -EVENT[1365]: 0.144833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1366]: 0.144849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1367]: 0.144864425 - core[0].svIdle(17), plen 0: [] -EVENT[1368]: 0.145666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1369]: 0.145679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1370]: 0.145695100 - core[1].svIdle(17), plen 0: [] -EVENT[1371]: 0.145833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1372]: 0.145849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1373]: 0.145864250 - core[0].svIdle(17), plen 0: [] -EVENT[1374]: 0.146666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1375]: 0.146680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1376]: 0.146695350 - core[1].svIdle(17), plen 0: [] -EVENT[1377]: 0.146833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1378]: 0.146849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1379]: 0.146864250 - core[0].svIdle(17), plen 0: [] -EVENT[1380]: 0.147666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1381]: 0.147680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1382]: 0.147695125 - core[1].svIdle(17), plen 0: [] -EVENT[1383]: 0.147833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1384]: 0.147849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1385]: 0.147864250 - core[0].svIdle(17), plen 0: [] -EVENT[1386]: 0.148666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1387]: 0.148680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1388]: 0.148695225 - core[1].svIdle(17), plen 0: [] -EVENT[1389]: 0.148833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1390]: 0.148849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1391]: 0.148864425 - core[0].svIdle(17), plen 0: [] -EVENT[1392]: 0.149666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1393]: 0.149679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1394]: 0.149695100 - core[1].svIdle(17), plen 0: [] -EVENT[1395]: 0.149833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1396]: 0.149849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1397]: 0.149864250 - core[0].svIdle(17), plen 0: [] -EVENT[1398]: 0.150666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1399]: 0.150680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1400]: 0.150695350 - core[1].svIdle(17), plen 0: [] -EVENT[1401]: 0.150833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1402]: 0.150849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1403]: 0.150864250 - core[0].svIdle(17), plen 0: [] -EVENT[1404]: 0.151666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1405]: 0.151680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1406]: 0.151695125 - core[1].svIdle(17), plen 0: [] -EVENT[1407]: 0.151833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1408]: 0.151848800 - core[0].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[1409]: 0.151861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1410]: 0.151877250 - core[0].svTaskStartExec(4), plen 0: [tid: 12286700] -EVENT[1411]: 0.151912650 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461228, size: 6, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.151912650] HEAP: Allocated 6 bytes @ 0x3ffbb7ec from task "alloc0" on core 0 by: +EVENT[1365]: 0.124016225 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1366]: 0.124035575 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1367]: 0.124046775 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1368]: 0.124057550 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1369]: 0.124075700 - core[1].svIdle(17), plen 0: [] +EVENT[1370]: 0.124103475 - core[0].svPrint(26), plen 70: [msg: I (419) example: Task[0x3ffba1a4]: allocated 30 bytes @ 0x3ffbafd0 +, lvl: 0, unused: 0] +[0.124103475] LOG: I (419) example: Task[0x3ffba1a4]: allocated 30 bytes @ 0x3ffbafd0 +EVENT[1371]: 0.124121075 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12296968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1372]: 0.124134325 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[1373]: 0.124134325 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[1374]: 0.124150675 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1375]: 0.124161525 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1376]: 0.124172350 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1377]: 0.124186175 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1378]: 0.124196925 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[1379]: 0.124207675 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1380]: 0.124219775 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12296968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1381]: 0.124231000 - core[0].svIdle(17), plen 0: [] +EVENT[1382]: 0.124243325 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1383]: 0.124259575 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1384]: 0.124307450 - core[1].svPrint(26), plen 63: [msg: I (419) example: Task[0x3ffbad8c]: free memory @ 0x3ffbafd0 +, lvl: 0, unused: 0] +[0.124307450] LOG: I (419) example: Task[0x3ffbad8c]: free memory @ 0x3ffbafd0 +EVENT[1385]: 0.124328850 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459152, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.124328850] HEAP: Freed bytes @ 0x3ffbafd0 from task "free2" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 +/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 +/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 + +EVENT[1386]: 0.124360200 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1387]: 0.124371650 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1388]: 0.124388350 - core[1].svIdle(17), plen 0: [] +EVENT[1389]: 0.124448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1390]: 0.124461625 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1391]: 0.124477200 - core[1].svIdle(17), plen 0: [] +EVENT[1392]: 0.124546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1393]: 0.124562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1394]: 0.124577275 - core[0].svIdle(17), plen 0: [] +EVENT[1395]: 0.125448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1396]: 0.125461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1397]: 0.125476850 - core[1].svIdle(17), plen 0: [] +EVENT[1398]: 0.125546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1399]: 0.125562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1400]: 0.125577075 - core[0].svIdle(17), plen 0: [] +EVENT[1401]: 0.126448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1402]: 0.126461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1403]: 0.126476975 - core[1].svIdle(17), plen 0: [] +EVENT[1404]: 0.126546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1405]: 0.126562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1406]: 0.126577225 - core[0].svIdle(17), plen 0: [] +EVENT[1407]: 0.127448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1408]: 0.127461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1409]: 0.127476900 - core[1].svIdle(17), plen 0: [] +EVENT[1410]: 0.127546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1411]: 0.127562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1412]: 0.127577075 - core[0].svIdle(17), plen 0: [] +EVENT[1413]: 0.128448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1414]: 0.128461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1415]: 0.128476850 - core[1].svIdle(17), plen 0: [] +EVENT[1416]: 0.128546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1417]: 0.128562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1418]: 0.128577275 - core[0].svIdle(17), plen 0: [] +EVENT[1419]: 0.129448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1420]: 0.129461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1421]: 0.129476850 - core[1].svIdle(17), plen 0: [] +EVENT[1422]: 0.129546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1423]: 0.129562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1424]: 0.129577075 - core[0].svIdle(17), plen 0: [] +EVENT[1425]: 0.130448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1426]: 0.130461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1427]: 0.130476975 - core[1].svIdle(17), plen 0: [] +EVENT[1428]: 0.130546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1429]: 0.130562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1430]: 0.130577225 - core[0].svIdle(17), plen 0: [] +EVENT[1431]: 0.131448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1432]: 0.131461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1433]: 0.131476900 - core[1].svIdle(17), plen 0: [] +EVENT[1434]: 0.131546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1435]: 0.131562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1436]: 0.131577075 - core[0].svIdle(17), plen 0: [] +EVENT[1437]: 0.132448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1438]: 0.132461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1439]: 0.132476850 - core[1].svIdle(17), plen 0: [] +EVENT[1440]: 0.132546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1441]: 0.132562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1442]: 0.132577275 - core[0].svIdle(17), plen 0: [] +EVENT[1443]: 0.133448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1444]: 0.133461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1445]: 0.133476850 - core[1].svIdle(17), plen 0: [] +EVENT[1446]: 0.133546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1447]: 0.133562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1448]: 0.133577075 - core[0].svIdle(17), plen 0: [] +EVENT[1449]: 0.134448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1450]: 0.134465950 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1451]: 0.134481100 - core[1].svIdle(17), plen 0: [] +EVENT[1452]: 0.134546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1453]: 0.134562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1454]: 0.134577075 - core[0].svIdle(17), plen 0: [] +EVENT[1455]: 0.135448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1456]: 0.135461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1457]: 0.135476850 - core[1].svIdle(17), plen 0: [] +EVENT[1458]: 0.135546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1459]: 0.135562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1460]: 0.135577275 - core[0].svIdle(17), plen 0: [] +EVENT[1461]: 0.136448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1462]: 0.136461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1463]: 0.136476850 - core[1].svIdle(17), plen 0: [] +EVENT[1464]: 0.136546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1465]: 0.136562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1466]: 0.136577075 - core[0].svIdle(17), plen 0: [] +EVENT[1467]: 0.137448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1468]: 0.137461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1469]: 0.137476975 - core[1].svIdle(17), plen 0: [] +EVENT[1470]: 0.137546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1471]: 0.137562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1472]: 0.137577225 - core[0].svIdle(17), plen 0: [] +EVENT[1473]: 0.138448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1474]: 0.138461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1475]: 0.138476900 - core[1].svIdle(17), plen 0: [] +EVENT[1476]: 0.138546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1477]: 0.138562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1478]: 0.138577075 - core[0].svIdle(17), plen 0: [] +EVENT[1479]: 0.139448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1480]: 0.139461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1481]: 0.139476850 - core[1].svIdle(17), plen 0: [] +EVENT[1482]: 0.139546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1483]: 0.139562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1484]: 0.139577275 - core[0].svIdle(17), plen 0: [] +EVENT[1485]: 0.140448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1486]: 0.140461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1487]: 0.140476850 - core[1].svIdle(17), plen 0: [] +EVENT[1488]: 0.140546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1489]: 0.140562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1490]: 0.140577075 - core[0].svIdle(17), plen 0: [] +EVENT[1491]: 0.141448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1492]: 0.141461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1493]: 0.141476975 - core[1].svIdle(17), plen 0: [] +EVENT[1494]: 0.141546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1495]: 0.141562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1496]: 0.141577225 - core[0].svIdle(17), plen 0: [] +EVENT[1497]: 0.142448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1498]: 0.142461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1499]: 0.142476900 - core[1].svIdle(17), plen 0: [] +EVENT[1500]: 0.142546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1501]: 0.142562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1502]: 0.142577075 - core[0].svIdle(17), plen 0: [] +EVENT[1503]: 0.143448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1504]: 0.143461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1505]: 0.143476850 - core[1].svIdle(17), plen 0: [] +EVENT[1506]: 0.143546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1507]: 0.143562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1508]: 0.143577275 - core[0].svIdle(17), plen 0: [] +EVENT[1509]: 0.144448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1510]: 0.144461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1511]: 0.144476850 - core[1].svIdle(17), plen 0: [] +EVENT[1512]: 0.144546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1513]: 0.144562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1514]: 0.144577075 - core[0].svIdle(17), plen 0: [] +EVENT[1515]: 0.145448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1516]: 0.145461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1517]: 0.145476975 - core[1].svIdle(17), plen 0: [] +EVENT[1518]: 0.145546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1519]: 0.145562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1520]: 0.145577225 - core[0].svIdle(17), plen 0: [] +EVENT[1521]: 0.146448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1522]: 0.146466000 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1523]: 0.146481125 - core[1].svIdle(17), plen 0: [] +EVENT[1524]: 0.146546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1525]: 0.146562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1526]: 0.146577075 - core[0].svIdle(17), plen 0: [] +EVENT[1527]: 0.147448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1528]: 0.147461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1529]: 0.147476850 - core[1].svIdle(17), plen 0: [] +EVENT[1530]: 0.147546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1531]: 0.147562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1532]: 0.147577275 - core[0].svIdle(17), plen 0: [] +EVENT[1533]: 0.148448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1534]: 0.148461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1535]: 0.148476850 - core[1].svIdle(17), plen 0: [] +EVENT[1536]: 0.148546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1537]: 0.148562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1538]: 0.148577075 - core[0].svIdle(17), plen 0: [] +EVENT[1539]: 0.149448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1540]: 0.149461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1541]: 0.149476975 - core[1].svIdle(17), plen 0: [] +EVENT[1542]: 0.149546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1543]: 0.149562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1544]: 0.149577225 - core[0].svIdle(17), plen 0: [] +EVENT[1545]: 0.150448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1546]: 0.150461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1547]: 0.150476900 - core[1].svIdle(17), plen 0: [] +EVENT[1548]: 0.150546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1549]: 0.150562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1550]: 0.150577075 - core[0].svIdle(17), plen 0: [] +EVENT[1551]: 0.151448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1552]: 0.151461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1553]: 0.151476850 - core[1].svIdle(17), plen 0: [] +EVENT[1554]: 0.151546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1555]: 0.151562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1556]: 0.151577275 - core[0].svIdle(17), plen 0: [] +EVENT[1557]: 0.152448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1558]: 0.152461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1559]: 0.152476850 - core[1].svIdle(17), plen 0: [] +EVENT[1560]: 0.152546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1561]: 0.152561625 - core[0].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[1562]: 0.152561625 - core[1].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[1563]: 0.152574275 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1564]: 0.152590075 - core[0].svTaskStartExec(4), plen 0: [tid: 12284596] +EVENT[1565]: 0.152625125 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459108, size: 6, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.152625125] HEAP: Allocated 6 bytes @ 0x3ffbafa4 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1412]: 0.151951250 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461244, size: 12, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.151951250] HEAP: Allocated 12 bytes @ 0x3ffbb7fc from task "alloc0" on core 0 by: +EVENT[1566]: 0.152660700 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459152, size: 12, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.152660700] HEAP: Allocated 12 bytes @ 0x3ffbafd0 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1413]: 0.151968150 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1414]: 0.151984150 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1415]: 0.152054475 - core[0].svPrint(26), plen 70: [msg: I (460) example: Task[0x3ffb7aec]: allocated 12 bytes @ 0x3ffbb7fc +EVENT[1567]: 0.152677675 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1568]: 0.152693775 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1569]: 0.152752800 - core[0].svPrint(26), plen 70: [msg: I (448) example: Task[0x3ffb72b4]: allocated 12 bytes @ 0x3ffbafd0 , lvl: 0, unused: 0] -[0.152054475] LOG: I (460) example: Task[0x3ffb7aec]: allocated 12 bytes @ 0x3ffbb7fc -EVENT[1416]: 0.152068075 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12287056, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1417]: 0.152081300 - core[0].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[1418]: 0.152097675 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1419]: 0.152108525 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1420]: 0.152119300 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1421]: 0.152133125 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1422]: 0.152144025 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[1423]: 0.152154850 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1424]: 0.152166800 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12287056, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1425]: 0.152177050 - core[0].svIdle(17), plen 0: [] -EVENT[1426]: 0.152188475 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1427]: 0.152208850 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1428]: 0.152272400 - core[1].svPrint(26), plen 63: [msg: I (460) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb7fc +[0.152752800] LOG: I (448) example: Task[0x3ffb72b4]: allocated 12 bytes @ 0x3ffbafd0 +EVENT[1570]: 0.152766275 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12284952, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1571]: 0.152779450 - core[0].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[1572]: 0.152779450 - core[1].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[1573]: 0.152795650 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1574]: 0.152806600 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1575]: 0.152817375 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1576]: 0.152831275 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1577]: 0.152842075 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[1578]: 0.152852800 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1579]: 0.152864925 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12284952, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1580]: 0.152875100 - core[0].svIdle(17), plen 0: [] +EVENT[1581]: 0.152886875 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1582]: 0.152903200 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1583]: 0.152951075 - core[1].svPrint(26), plen 63: [msg: I (448) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbafd0 , lvl: 0, unused: 0] -[0.152272400] LOG: I (460) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb7fc -EVENT[1429]: 0.152293600 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461244, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.152293600] HEAP: Freed bytes @ 0x3ffbb7fc from task "free0" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.152951075] LOG: I (448) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbafd0 +EVENT[1584]: 0.152972300 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459152, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.152972300] HEAP: Freed bytes @ 0x3ffbafd0 from task "free0" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1430]: 0.152320475 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1431]: 0.152331900 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1432]: 0.152348475 - core[1].svIdle(17), plen 0: [] -EVENT[1433]: 0.152666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1434]: 0.152679850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1435]: 0.152695550 - core[1].svIdle(17), plen 0: [] -EVENT[1436]: 0.152833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1437]: 0.152848800 - core[0].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[1438]: 0.152861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1439]: 0.152877375 - core[0].svTaskStartExec(4), plen 0: [tid: 12292716] -EVENT[1440]: 0.152912775 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461244, size: 12, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.152912775] HEAP: Allocated 12 bytes @ 0x3ffbb7fc from task "alloc1" on core 0 by: +EVENT[1585]: 0.153003750 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1586]: 0.153015325 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1587]: 0.153032025 - core[1].svIdle(17), plen 0: [] +EVENT[1588]: 0.153448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1589]: 0.153461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1590]: 0.153477300 - core[1].svIdle(17), plen 0: [] +EVENT[1591]: 0.153546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1592]: 0.153561625 - core[0].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[1593]: 0.153561625 - core[1].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[1594]: 0.153573500 - core[0].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[1595]: 0.153573500 - core[1].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[1596]: 0.153585975 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1597]: 0.153601625 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[1598]: 0.153638000 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459152, size: 12, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.153638000] HEAP: Allocated 12 bytes @ 0x3ffbafd0 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1441]: 0.152947300 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461260, size: 24, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.152947300] HEAP: Allocated 24 bytes @ 0x3ffbb80c from task "alloc1" on core 0 by: +EVENT[1599]: 0.153673450 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459168, size: 24, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.153673450] HEAP: Allocated 24 bytes @ 0x3ffbafe0 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1442]: 0.152964250 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1443]: 0.152984425 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1444]: 0.153054850 - core[0].svPrint(26), plen 70: [msg: I (461) example: Task[0x3ffb926c]: allocated 24 bytes @ 0x3ffbb80c +EVENT[1600]: 0.153690500 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1601]: 0.153706525 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1602]: 0.153761350 - core[0].svPrint(26), plen 70: [msg: I (449) example: Task[0x3ffb8a34]: allocated 24 bytes @ 0x3ffbafe0 , lvl: 0, unused: 0] -[0.153054850] LOG: I (461) example: Task[0x3ffb926c]: allocated 24 bytes @ 0x3ffbb80c -EVENT[1445]: 0.153068500 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12293072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1446]: 0.153081675 - core[0].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[1447]: 0.153097875 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1448]: 0.153108925 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1449]: 0.153119675 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1450]: 0.153133400 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1451]: 0.153144350 - core[1].svTaskStartExec(4), plen 0: [tid: 12295764] -EVENT[1452]: 0.153155150 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1453]: 0.153167000 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12293072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1454]: 0.153177275 - core[0].svIdle(17), plen 0: [] -EVENT[1455]: 0.153188750 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1456]: 0.153205050 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1457]: 0.153268500 - core[1].svPrint(26), plen 63: [msg: I (461) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb80c -, lvl: 0, unused: 0] -[0.153268500] LOG: I (461) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb80c -EVENT[1458]: 0.153293525 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461260, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.153293525] HEAP: Freed bytes @ 0x3ffbb80c from task "free1" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 -/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 -/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 - -EVENT[1459]: 0.153320525 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1460]: 0.153331950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1461]: 0.153348525 - core[1].svIdle(17), plen 0: [] -EVENT[1462]: 0.153666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1463]: 0.153679850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1464]: 0.153695550 - core[1].svIdle(17), plen 0: [] -EVENT[1465]: 0.153833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1466]: 0.153848800 - core[0].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[1467]: 0.153861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1468]: 0.153877250 - core[0].svTaskStartExec(4), plen 0: [tid: 12298716] -EVENT[1469]: 0.153912650 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461260, size: 18, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.153912650] HEAP: Allocated 18 bytes @ 0x3ffbb80c from task "alloc2" on core 0 by: +[0.153761350] LOG: I (449) example: Task[0x3ffb8a34]: allocated 24 bytes @ 0x3ffbafe0 +EVENT[1603]: 0.153778125 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12290968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1604]: 0.153791500 - core[0].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[1605]: 0.153791500 - core[1].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[1606]: 0.153807850 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1607]: 0.153818700 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1608]: 0.153829525 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1609]: 0.153843300 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1610]: 0.153855250 - core[1].svTaskStartExec(4), plen 0: [tid: 12293660] +EVENT[1611]: 0.153866400 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1612]: 0.153878350 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12290968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1613]: 0.153890000 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[1614]: 0.153901700 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1615]: 0.153920300 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1616]: 0.153933400 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459196, size: 18, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.153933400] HEAP: Allocated 18 bytes @ 0x3ffbaffc from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1470]: 0.153947200 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461284, size: 36, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.153947200] HEAP: Allocated 36 bytes @ 0x3ffbb824 from task "alloc2" on core 0 by: +EVENT[1617]: 0.153973975 - core[1].svPrint(26), plen 63: [msg: I (449) example: Task[0x3ffb961c]: free memory @ 0x3ffbafe0 +, lvl: 0, unused: 0] +[0.153973975] LOG: I (449) example: Task[0x3ffb961c]: free memory @ 0x3ffbafe0 +EVENT[1618]: 0.153989950 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459220, size: 36, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.153989950] HEAP: Allocated 36 bytes @ 0x3ffbb014 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1471]: 0.153964350 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1472]: 0.153980350 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1473]: 0.154050675 - core[0].svPrint(26), plen 70: [msg: I (462) example: Task[0x3ffba9dc]: allocated 36 bytes @ 0x3ffbb824 -, lvl: 0, unused: 0] -[0.154050675] LOG: I (462) example: Task[0x3ffba9dc]: allocated 36 bytes @ 0x3ffbb824 -EVENT[1474]: 0.154068500 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12299072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1475]: 0.154081850 - core[0].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[1476]: 0.154098175 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1477]: 0.154109025 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1478]: 0.154119775 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1479]: 0.154133500 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1480]: 0.154144400 - core[1].svTaskStartExec(4), plen 0: [tid: 12301764] -EVENT[1481]: 0.154155225 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1482]: 0.154167075 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12299072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1483]: 0.154178375 - core[0].svIdle(17), plen 0: [] -EVENT[1484]: 0.154190000 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1485]: 0.154206400 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1486]: 0.154269950 - core[1].svPrint(26), plen 63: [msg: I (462) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb824 -, lvl: 0, unused: 0] -[0.154269950] LOG: I (462) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb824 -EVENT[1487]: 0.154291150 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461284, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.154291150] HEAP: Freed bytes @ 0x3ffbb824 from task "free2" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +EVENT[1619]: 0.154004325 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459168, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.154004325] HEAP: Freed bytes @ 0x3ffbafe0 from task "free1" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1488]: 0.154322150 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1489]: 0.154333625 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1490]: 0.154350325 - core[1].svIdle(17), plen 0: [] -EVENT[1491]: 0.154666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1492]: 0.154679875 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1493]: 0.154695450 - core[1].svIdle(17), plen 0: [] -EVENT[1494]: 0.154833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1495]: 0.154849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1496]: 0.154864425 - core[0].svIdle(17), plen 0: [] -EVENT[1497]: 0.155666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1498]: 0.155679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1499]: 0.155695100 - core[1].svIdle(17), plen 0: [] -EVENT[1500]: 0.155833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1501]: 0.155849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1502]: 0.155864250 - core[0].svIdle(17), plen 0: [] -EVENT[1503]: 0.156666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1504]: 0.156680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1505]: 0.156695350 - core[1].svIdle(17), plen 0: [] -EVENT[1506]: 0.156833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1507]: 0.156849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1508]: 0.156864250 - core[0].svIdle(17), plen 0: [] -EVENT[1509]: 0.157666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1510]: 0.157680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1511]: 0.157695125 - core[1].svIdle(17), plen 0: [] -EVENT[1512]: 0.157833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1513]: 0.157849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1514]: 0.157864250 - core[0].svIdle(17), plen 0: [] -EVENT[1515]: 0.158666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1516]: 0.158680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1517]: 0.158695225 - core[1].svIdle(17), plen 0: [] -EVENT[1518]: 0.158833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1519]: 0.158849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1520]: 0.158864425 - core[0].svIdle(17), plen 0: [] -EVENT[1521]: 0.159666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1522]: 0.159679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1523]: 0.159695100 - core[1].svIdle(17), plen 0: [] -EVENT[1524]: 0.159833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1525]: 0.159849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1526]: 0.159864250 - core[0].svIdle(17), plen 0: [] -EVENT[1527]: 0.160666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1528]: 0.160680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1529]: 0.160695350 - core[1].svIdle(17), plen 0: [] -EVENT[1530]: 0.160833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1531]: 0.160849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1532]: 0.160864250 - core[0].svIdle(17), plen 0: [] -EVENT[1533]: 0.161666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1534]: 0.161680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1535]: 0.161695125 - core[1].svIdle(17), plen 0: [] -EVENT[1536]: 0.161833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1537]: 0.161849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1538]: 0.161864250 - core[0].svIdle(17), plen 0: [] -EVENT[1539]: 0.162666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1540]: 0.162680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1541]: 0.162695225 - core[1].svIdle(17), plen 0: [] -EVENT[1542]: 0.162833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1543]: 0.162849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1544]: 0.162864425 - core[0].svIdle(17), plen 0: [] -EVENT[1545]: 0.163666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1546]: 0.163679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1547]: 0.163695100 - core[1].svIdle(17), plen 0: [] -EVENT[1548]: 0.163833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1549]: 0.163849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1550]: 0.163864250 - core[0].svIdle(17), plen 0: [] -EVENT[1551]: 0.164666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1552]: 0.164683575 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1553]: 0.164698725 - core[1].svIdle(17), plen 0: [] -EVENT[1554]: 0.164833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1555]: 0.164849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1556]: 0.164864250 - core[0].svIdle(17), plen 0: [] -EVENT[1557]: 0.165666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1558]: 0.165680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1559]: 0.165695225 - core[1].svIdle(17), plen 0: [] -EVENT[1560]: 0.165833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1561]: 0.165849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1562]: 0.165864425 - core[0].svIdle(17), plen 0: [] -EVENT[1563]: 0.166666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1564]: 0.166679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1565]: 0.166695100 - core[1].svIdle(17), plen 0: [] -EVENT[1566]: 0.166833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1567]: 0.166849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1568]: 0.166864250 - core[0].svIdle(17), plen 0: [] -EVENT[1569]: 0.167666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1570]: 0.167680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1571]: 0.167695350 - core[1].svIdle(17), plen 0: [] -EVENT[1572]: 0.167833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1573]: 0.167849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1574]: 0.167864250 - core[0].svIdle(17), plen 0: [] -EVENT[1575]: 0.168666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1576]: 0.168680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1577]: 0.168695125 - core[1].svIdle(17), plen 0: [] -EVENT[1578]: 0.168833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1579]: 0.168849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1580]: 0.168864250 - core[0].svIdle(17), plen 0: [] -EVENT[1581]: 0.169666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1582]: 0.169680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1583]: 0.169695225 - core[1].svIdle(17), plen 0: [] -EVENT[1584]: 0.169833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1585]: 0.169849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1586]: 0.169864425 - core[0].svIdle(17), plen 0: [] -EVENT[1587]: 0.170666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1588]: 0.170679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1589]: 0.170695100 - core[1].svIdle(17), plen 0: [] -EVENT[1590]: 0.170833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1591]: 0.170849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1592]: 0.170864250 - core[0].svIdle(17), plen 0: [] -EVENT[1593]: 0.171666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1594]: 0.171680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1595]: 0.171695350 - core[1].svIdle(17), plen 0: [] -EVENT[1596]: 0.171833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1597]: 0.171849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1598]: 0.171864250 - core[0].svIdle(17), plen 0: [] -EVENT[1599]: 0.172666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1600]: 0.172680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1601]: 0.172695125 - core[1].svIdle(17), plen 0: [] -EVENT[1602]: 0.172833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1603]: 0.172849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1604]: 0.172864250 - core[0].svIdle(17), plen 0: [] -EVENT[1605]: 0.173666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1606]: 0.173680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1607]: 0.173695225 - core[1].svIdle(17), plen 0: [] -EVENT[1608]: 0.173833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1609]: 0.173849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1610]: 0.173864425 - core[0].svIdle(17), plen 0: [] -EVENT[1611]: 0.174666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1612]: 0.174679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1613]: 0.174695100 - core[1].svIdle(17), plen 0: [] -EVENT[1614]: 0.174833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1615]: 0.174849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1616]: 0.174864250 - core[0].svIdle(17), plen 0: [] -EVENT[1617]: 0.175666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1618]: 0.175680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1619]: 0.175695350 - core[1].svIdle(17), plen 0: [] -EVENT[1620]: 0.175833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1621]: 0.175849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1622]: 0.175864250 - core[0].svIdle(17), plen 0: [] -EVENT[1623]: 0.176666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1624]: 0.176684225 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1625]: 0.176699375 - core[1].svIdle(17), plen 0: [] -EVENT[1626]: 0.176833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1627]: 0.176849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1628]: 0.176864250 - core[0].svIdle(17), plen 0: [] -EVENT[1629]: 0.177666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1630]: 0.177680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1631]: 0.177695225 - core[1].svIdle(17), plen 0: [] -EVENT[1632]: 0.177833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1633]: 0.177849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1634]: 0.177864425 - core[0].svIdle(17), plen 0: [] -EVENT[1635]: 0.178666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1636]: 0.178679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1637]: 0.178695100 - core[1].svIdle(17), plen 0: [] -EVENT[1638]: 0.178833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1639]: 0.178849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1640]: 0.178864250 - core[0].svIdle(17), plen 0: [] -EVENT[1641]: 0.179666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1642]: 0.179680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1643]: 0.179695350 - core[1].svIdle(17), plen 0: [] -EVENT[1644]: 0.179833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1645]: 0.179849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1646]: 0.179864250 - core[0].svIdle(17), plen 0: [] -EVENT[1647]: 0.180666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1648]: 0.180680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1649]: 0.180695125 - core[1].svIdle(17), plen 0: [] -EVENT[1650]: 0.180833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1651]: 0.180849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1652]: 0.180864250 - core[0].svIdle(17), plen 0: [] -EVENT[1653]: 0.181666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1654]: 0.181680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1655]: 0.181695225 - core[1].svIdle(17), plen 0: [] -EVENT[1656]: 0.181833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1657]: 0.181848825 - core[0].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[1658]: 0.181861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1659]: 0.181877250 - core[0].svTaskStartExec(4), plen 0: [tid: 12286700] -EVENT[1660]: 0.181912575 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461284, size: 7, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.181912575] HEAP: Allocated 7 bytes @ 0x3ffbb824 from task "alloc0" on core 0 by: +EVENT[1620]: 0.154016775 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1621]: 0.154036150 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1622]: 0.154047400 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1623]: 0.154058200 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1624]: 0.154076400 - core[1].svIdle(17), plen 0: [] +EVENT[1625]: 0.154104125 - core[0].svPrint(26), plen 70: [msg: I (449) example: Task[0x3ffba1a4]: allocated 36 bytes @ 0x3ffbb014 +, lvl: 0, unused: 0] +[0.154104125] LOG: I (449) example: Task[0x3ffba1a4]: allocated 36 bytes @ 0x3ffbb014 +EVENT[1626]: 0.154117575 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12296968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1627]: 0.154134325 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[1628]: 0.154134325 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[1629]: 0.154150675 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1630]: 0.154161550 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1631]: 0.154172400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1632]: 0.154186075 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1633]: 0.154196825 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[1634]: 0.154207625 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1635]: 0.154219575 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12296968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1636]: 0.154230800 - core[0].svIdle(17), plen 0: [] +EVENT[1637]: 0.154242625 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1638]: 0.154258875 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1639]: 0.154306650 - core[1].svPrint(26), plen 63: [msg: I (449) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb014 +, lvl: 0, unused: 0] +[0.154306650] LOG: I (449) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb014 +EVENT[1640]: 0.154328025 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459220, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.154328025] HEAP: Freed bytes @ 0x3ffbb014 from task "free2" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 +/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 +/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 + +EVENT[1641]: 0.154355450 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1642]: 0.154366850 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1643]: 0.154383425 - core[1].svIdle(17), plen 0: [] +EVENT[1644]: 0.154448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1645]: 0.154461625 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1646]: 0.154477200 - core[1].svIdle(17), plen 0: [] +EVENT[1647]: 0.154546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1648]: 0.154562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1649]: 0.154577075 - core[0].svIdle(17), plen 0: [] +EVENT[1650]: 0.155448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1651]: 0.155461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1652]: 0.155476850 - core[1].svIdle(17), plen 0: [] +EVENT[1653]: 0.155546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1654]: 0.155562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1655]: 0.155577275 - core[0].svIdle(17), plen 0: [] +EVENT[1656]: 0.156448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1657]: 0.156461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1658]: 0.156476850 - core[1].svIdle(17), plen 0: [] +EVENT[1659]: 0.156546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1660]: 0.156565625 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1661]: 0.156580850 - core[0].svIdle(17), plen 0: [] +EVENT[1662]: 0.157448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1663]: 0.157461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1664]: 0.157476850 - core[1].svIdle(17), plen 0: [] +EVENT[1665]: 0.157546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1666]: 0.157562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1667]: 0.157577075 - core[0].svIdle(17), plen 0: [] +EVENT[1668]: 0.158448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1669]: 0.158461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1670]: 0.158476975 - core[1].svIdle(17), plen 0: [] +EVENT[1671]: 0.158546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1672]: 0.158562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1673]: 0.158577225 - core[0].svIdle(17), plen 0: [] +EVENT[1674]: 0.159448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1675]: 0.159461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1676]: 0.159476900 - core[1].svIdle(17), plen 0: [] +EVENT[1677]: 0.159546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1678]: 0.159562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1679]: 0.159577075 - core[0].svIdle(17), plen 0: [] +EVENT[1680]: 0.160448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1681]: 0.160461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1682]: 0.160476850 - core[1].svIdle(17), plen 0: [] +EVENT[1683]: 0.160546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1684]: 0.160562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1685]: 0.160577275 - core[0].svIdle(17), plen 0: [] +EVENT[1686]: 0.161448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1687]: 0.161461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1688]: 0.161476850 - core[1].svIdle(17), plen 0: [] +EVENT[1689]: 0.161546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1690]: 0.161562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1691]: 0.161577075 - core[0].svIdle(17), plen 0: [] +EVENT[1692]: 0.162448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1693]: 0.162461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1694]: 0.162476975 - core[1].svIdle(17), plen 0: [] +EVENT[1695]: 0.162546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1696]: 0.162562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1697]: 0.162577225 - core[0].svIdle(17), plen 0: [] +EVENT[1698]: 0.163448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1699]: 0.163461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1700]: 0.163476900 - core[1].svIdle(17), plen 0: [] +EVENT[1701]: 0.163546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1702]: 0.163562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1703]: 0.163577075 - core[0].svIdle(17), plen 0: [] +EVENT[1704]: 0.164448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1705]: 0.164461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1706]: 0.164476850 - core[1].svIdle(17), plen 0: [] +EVENT[1707]: 0.164546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1708]: 0.164562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1709]: 0.164577275 - core[0].svIdle(17), plen 0: [] +EVENT[1710]: 0.165448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1711]: 0.165461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1712]: 0.165476850 - core[1].svIdle(17), plen 0: [] +EVENT[1713]: 0.165546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1714]: 0.165562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1715]: 0.165577075 - core[0].svIdle(17), plen 0: [] +EVENT[1716]: 0.166448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1717]: 0.166461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1718]: 0.166476975 - core[1].svIdle(17), plen 0: [] +EVENT[1719]: 0.166546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1720]: 0.166562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1721]: 0.166577225 - core[0].svIdle(17), plen 0: [] +EVENT[1722]: 0.167448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1723]: 0.167461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1724]: 0.167476900 - core[1].svIdle(17), plen 0: [] +EVENT[1725]: 0.167546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1726]: 0.167562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1727]: 0.167577075 - core[0].svIdle(17), plen 0: [] +EVENT[1728]: 0.168448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1729]: 0.168461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1730]: 0.168476850 - core[1].svIdle(17), plen 0: [] +EVENT[1731]: 0.168546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1732]: 0.168566300 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1733]: 0.168581500 - core[0].svIdle(17), plen 0: [] +EVENT[1734]: 0.169448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1735]: 0.169461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1736]: 0.169476850 - core[1].svIdle(17), plen 0: [] +EVENT[1737]: 0.169546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1738]: 0.169562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1739]: 0.169577075 - core[0].svIdle(17), plen 0: [] +EVENT[1740]: 0.170448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1741]: 0.170461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1742]: 0.170476975 - core[1].svIdle(17), plen 0: [] +EVENT[1743]: 0.170546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1744]: 0.170562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1745]: 0.170577225 - core[0].svIdle(17), plen 0: [] +EVENT[1746]: 0.171448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1747]: 0.171461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1748]: 0.171476900 - core[1].svIdle(17), plen 0: [] +EVENT[1749]: 0.171546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1750]: 0.171562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1751]: 0.171577075 - core[0].svIdle(17), plen 0: [] +EVENT[1752]: 0.172448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1753]: 0.172461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1754]: 0.172476850 - core[1].svIdle(17), plen 0: [] +EVENT[1755]: 0.172546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1756]: 0.172562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1757]: 0.172577275 - core[0].svIdle(17), plen 0: [] +EVENT[1758]: 0.173448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1759]: 0.173461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1760]: 0.173476850 - core[1].svIdle(17), plen 0: [] +EVENT[1761]: 0.173546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1762]: 0.173562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1763]: 0.173577075 - core[0].svIdle(17), plen 0: [] +EVENT[1764]: 0.174448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1765]: 0.174461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1766]: 0.174476975 - core[1].svIdle(17), plen 0: [] +EVENT[1767]: 0.174546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1768]: 0.174562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1769]: 0.174577225 - core[0].svIdle(17), plen 0: [] +EVENT[1770]: 0.175448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1771]: 0.175461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1772]: 0.175476900 - core[1].svIdle(17), plen 0: [] +EVENT[1773]: 0.175546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1774]: 0.175562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1775]: 0.175577075 - core[0].svIdle(17), plen 0: [] +EVENT[1776]: 0.176448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1777]: 0.176461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1778]: 0.176476850 - core[1].svIdle(17), plen 0: [] +EVENT[1779]: 0.176546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1780]: 0.176562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1781]: 0.176577275 - core[0].svIdle(17), plen 0: [] +EVENT[1782]: 0.177448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1783]: 0.177461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1784]: 0.177476850 - core[1].svIdle(17), plen 0: [] +EVENT[1785]: 0.177546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1786]: 0.177562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1787]: 0.177577075 - core[0].svIdle(17), plen 0: [] +EVENT[1788]: 0.178448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1789]: 0.178461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1790]: 0.178476975 - core[1].svIdle(17), plen 0: [] +EVENT[1791]: 0.178546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1792]: 0.178562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1793]: 0.178577225 - core[0].svIdle(17), plen 0: [] +EVENT[1794]: 0.179448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1795]: 0.179461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1796]: 0.179476900 - core[1].svIdle(17), plen 0: [] +EVENT[1797]: 0.179546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1798]: 0.179562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1799]: 0.179577075 - core[0].svIdle(17), plen 0: [] +EVENT[1800]: 0.180448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1801]: 0.180461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1802]: 0.180476850 - core[1].svIdle(17), plen 0: [] +EVENT[1803]: 0.180546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1804]: 0.180566300 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1805]: 0.180581500 - core[0].svIdle(17), plen 0: [] +EVENT[1806]: 0.181448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1807]: 0.181461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1808]: 0.181476850 - core[1].svIdle(17), plen 0: [] +EVENT[1809]: 0.181546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1810]: 0.181562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1811]: 0.181577075 - core[0].svIdle(17), plen 0: [] +EVENT[1812]: 0.182448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1813]: 0.182461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1814]: 0.182476975 - core[1].svIdle(17), plen 0: [] +EVENT[1815]: 0.182546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1816]: 0.182561625 - core[0].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[1817]: 0.182561625 - core[1].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[1818]: 0.182574225 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1819]: 0.182589875 - core[0].svTaskStartExec(4), plen 0: [tid: 12284596] +EVENT[1820]: 0.182624900 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459168, size: 7, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.182624900] HEAP: Allocated 7 bytes @ 0x3ffbafe0 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1661]: 0.181947000 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461300, size: 14, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.181947000] HEAP: Allocated 14 bytes @ 0x3ffbb834 from task "alloc0" on core 0 by: +EVENT[1821]: 0.182660375 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459220, size: 14, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.182660375] HEAP: Allocated 14 bytes @ 0x3ffbb014 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1662]: 0.181964025 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1663]: 0.181980025 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1664]: 0.182050450 - core[0].svPrint(26), plen 70: [msg: I (490) example: Task[0x3ffb7aec]: allocated 14 bytes @ 0x3ffbb834 +EVENT[1822]: 0.182677300 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1823]: 0.182693250 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1824]: 0.182748025 - core[0].svPrint(26), plen 70: [msg: I (478) example: Task[0x3ffb72b4]: allocated 14 bytes @ 0x3ffbb014 , lvl: 0, unused: 0] -[0.182050450] LOG: I (490) example: Task[0x3ffb7aec]: allocated 14 bytes @ 0x3ffbb834 -EVENT[1665]: 0.182068200 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12287056, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1666]: 0.182081425 - core[0].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[1667]: 0.182097650 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1668]: 0.182108525 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1669]: 0.182119275 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1670]: 0.182133125 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1671]: 0.182144000 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[1672]: 0.182154825 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1673]: 0.182166800 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12287056, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1674]: 0.182177050 - core[0].svIdle(17), plen 0: [] -EVENT[1675]: 0.182188450 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1676]: 0.182204825 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1677]: 0.182268375 - core[1].svPrint(26), plen 63: [msg: I (490) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb834 +[0.182748025] LOG: I (478) example: Task[0x3ffb72b4]: allocated 14 bytes @ 0x3ffbb014 +EVENT[1825]: 0.182761500 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12284952, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1826]: 0.182778850 - core[0].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[1827]: 0.182778850 - core[1].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[1828]: 0.182795100 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1829]: 0.182806050 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1830]: 0.182816825 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1831]: 0.182830550 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1832]: 0.182841300 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[1833]: 0.182852100 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1834]: 0.182864075 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12284952, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1835]: 0.182874325 - core[0].svIdle(17), plen 0: [] +EVENT[1836]: 0.182886075 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1837]: 0.182902350 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1838]: 0.182950125 - core[1].svPrint(26), plen 63: [msg: I (478) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb014 , lvl: 0, unused: 0] -[0.182268375] LOG: I (490) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb834 -EVENT[1678]: 0.182289575 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461300, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.182289575] HEAP: Freed bytes @ 0x3ffbb834 from task "free0" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.182950125] LOG: I (478) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb014 +EVENT[1839]: 0.182971500 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459220, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.182971500] HEAP: Freed bytes @ 0x3ffbb014 from task "free0" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1679]: 0.182320575 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1680]: 0.182332050 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1681]: 0.182348750 - core[1].svIdle(17), plen 0: [] -EVENT[1682]: 0.182666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1683]: 0.182679875 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1684]: 0.182695450 - core[1].svIdle(17), plen 0: [] -EVENT[1685]: 0.182833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1686]: 0.182848825 - core[0].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[1687]: 0.182861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1688]: 0.182877250 - core[0].svTaskStartExec(4), plen 0: [tid: 12292716] -EVENT[1689]: 0.182912575 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461300, size: 14, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.182912575] HEAP: Allocated 14 bytes @ 0x3ffbb834 from task "alloc1" on core 0 by: +EVENT[1840]: 0.182998900 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1841]: 0.183010325 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1842]: 0.183026875 - core[1].svIdle(17), plen 0: [] +EVENT[1843]: 0.183448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1844]: 0.183461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1845]: 0.183477300 - core[1].svIdle(17), plen 0: [] +EVENT[1846]: 0.183546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1847]: 0.183561675 - core[0].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[1848]: 0.183561675 - core[1].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[1849]: 0.183573500 - core[0].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[1850]: 0.183573500 - core[1].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[1851]: 0.183586000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1852]: 0.183601675 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[1853]: 0.183638125 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459220, size: 14, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.183638125] HEAP: Allocated 14 bytes @ 0x3ffbb014 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1690]: 0.182947000 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461320, size: 28, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.182947000] HEAP: Allocated 28 bytes @ 0x3ffbb848 from task "alloc1" on core 0 by: +EVENT[1854]: 0.183677700 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459240, size: 28, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.183677700] HEAP: Allocated 28 bytes @ 0x3ffbb028 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1691]: 0.182964025 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1692]: 0.182980025 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1693]: 0.183050450 - core[0].svPrint(26), plen 70: [msg: I (491) example: Task[0x3ffb926c]: allocated 28 bytes @ 0x3ffbb848 +EVENT[1855]: 0.183694650 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1856]: 0.183710775 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1857]: 0.183765500 - core[0].svPrint(26), plen 70: [msg: I (479) example: Task[0x3ffb8a34]: allocated 28 bytes @ 0x3ffbb028 , lvl: 0, unused: 0] -[0.183050450] LOG: I (491) example: Task[0x3ffb926c]: allocated 28 bytes @ 0x3ffbb848 -EVENT[1694]: 0.183064000 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12293072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1695]: 0.183081425 - core[0].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[1696]: 0.183097725 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1697]: 0.183108575 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1698]: 0.183119325 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1699]: 0.183133050 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1700]: 0.183143900 - core[1].svTaskStartExec(4), plen 0: [tid: 12295764] -EVENT[1701]: 0.183154725 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1702]: 0.183166600 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12293072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1703]: 0.183176850 - core[0].svIdle(17), plen 0: [] -EVENT[1704]: 0.183188325 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1705]: 0.183204625 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1706]: 0.183268075 - core[1].svPrint(26), plen 63: [msg: I (491) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb848 -, lvl: 0, unused: 0] -[0.183268075] LOG: I (491) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb848 -EVENT[1707]: 0.183289250 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461320, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.183289250] HEAP: Freed bytes @ 0x3ffbb848 from task "free1" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 -/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 -/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 - -EVENT[1708]: 0.183316250 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1709]: 0.183327675 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1710]: 0.183344250 - core[1].svIdle(17), plen 0: [] -EVENT[1711]: 0.183666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1712]: 0.183679850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1713]: 0.183695550 - core[1].svIdle(17), plen 0: [] -EVENT[1714]: 0.183833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1715]: 0.183848800 - core[0].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[1716]: 0.183861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1717]: 0.183877250 - core[0].svTaskStartExec(4), plen 0: [tid: 12298716] -EVENT[1718]: 0.183912650 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461320, size: 21, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.183912650] HEAP: Allocated 21 bytes @ 0x3ffbb848 from task "alloc2" on core 0 by: +[0.183765500] LOG: I (479) example: Task[0x3ffb8a34]: allocated 28 bytes @ 0x3ffbb028 +EVENT[1858]: 0.183778950 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12290968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1859]: 0.183792325 - core[0].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[1860]: 0.183792325 - core[1].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[1861]: 0.183808675 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1862]: 0.183819525 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1863]: 0.183830350 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1864]: 0.183844125 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1865]: 0.183856075 - core[1].svTaskStartExec(4), plen 0: [tid: 12293660] +EVENT[1866]: 0.183867225 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1867]: 0.183879175 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12290968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1868]: 0.183890825 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[1869]: 0.183902500 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1870]: 0.183924575 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1871]: 0.183936150 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459272, size: 21, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.183936150] HEAP: Allocated 21 bytes @ 0x3ffbb048 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1719]: 0.183951325 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461348, size: 42, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.183951325] HEAP: Allocated 42 bytes @ 0x3ffbb864 from task "alloc2" on core 0 by: +EVENT[1872]: 0.183977500 - core[1].svPrint(26), plen 63: [msg: I (479) example: Task[0x3ffb961c]: free memory @ 0x3ffbb028 +, lvl: 0, unused: 0] +[0.183977500] LOG: I (479) example: Task[0x3ffb961c]: free memory @ 0x3ffbb028 +EVENT[1873]: 0.183988600 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459300, size: 42, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.183988600] HEAP: Allocated 42 bytes @ 0x3ffbb064 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1720]: 0.183968225 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1721]: 0.183984200 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1722]: 0.184054550 - core[0].svPrint(26), plen 70: [msg: I (492) example: Task[0x3ffba9dc]: allocated 42 bytes @ 0x3ffbb864 -, lvl: 0, unused: 0] -[0.184054550] LOG: I (492) example: Task[0x3ffba9dc]: allocated 42 bytes @ 0x3ffbb864 -EVENT[1723]: 0.184068150 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12299072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1724]: 0.184081375 - core[0].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[1725]: 0.184097675 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1726]: 0.184108525 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1727]: 0.184119300 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1728]: 0.184133175 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1729]: 0.184144050 - core[1].svTaskStartExec(4), plen 0: [tid: 12301764] -EVENT[1730]: 0.184154875 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1731]: 0.184166750 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12299072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1732]: 0.184178025 - core[0].svIdle(17), plen 0: [] -EVENT[1733]: 0.184189675 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1734]: 0.184209375 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1735]: 0.184272925 - core[1].svPrint(26), plen 63: [msg: I (492) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb864 -, lvl: 0, unused: 0] -[0.184272925] LOG: I (492) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb864 -EVENT[1736]: 0.184294125 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461348, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.184294125] HEAP: Freed bytes @ 0x3ffbb864 from task "free2" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +EVENT[1874]: 0.184003025 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459240, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.184003025] HEAP: Freed bytes @ 0x3ffbb028 from task "free1" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1737]: 0.184321025 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1738]: 0.184332575 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1739]: 0.184349150 - core[1].svIdle(17), plen 0: [] -EVENT[1740]: 0.184666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1741]: 0.184679850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1742]: 0.184695550 - core[1].svIdle(17), plen 0: [] -EVENT[1743]: 0.184833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1744]: 0.184849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1745]: 0.184864250 - core[0].svIdle(17), plen 0: [] -EVENT[1746]: 0.185666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1747]: 0.185680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1748]: 0.185695350 - core[1].svIdle(17), plen 0: [] -EVENT[1749]: 0.185833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1750]: 0.185849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1751]: 0.185864250 - core[0].svIdle(17), plen 0: [] -EVENT[1752]: 0.186666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1753]: 0.186680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1754]: 0.186695125 - core[1].svIdle(17), plen 0: [] -EVENT[1755]: 0.186833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1756]: 0.186849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1757]: 0.186864250 - core[0].svIdle(17), plen 0: [] -EVENT[1758]: 0.187666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1759]: 0.187680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1760]: 0.187695225 - core[1].svIdle(17), plen 0: [] -EVENT[1761]: 0.187833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1762]: 0.187849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1763]: 0.187864425 - core[0].svIdle(17), plen 0: [] -EVENT[1764]: 0.188666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1765]: 0.188679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1766]: 0.188695100 - core[1].svIdle(17), plen 0: [] -EVENT[1767]: 0.188833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1768]: 0.188849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1769]: 0.188864250 - core[0].svIdle(17), plen 0: [] -EVENT[1770]: 0.189666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1771]: 0.189680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1772]: 0.189695350 - core[1].svIdle(17), plen 0: [] -EVENT[1773]: 0.189833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1774]: 0.189849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1775]: 0.189868575 - core[0].svIdle(17), plen 0: [] -EVENT[1776]: 0.190666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1777]: 0.190679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1778]: 0.190695100 - core[1].svIdle(17), plen 0: [] -EVENT[1779]: 0.190833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1780]: 0.190849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1781]: 0.190864250 - core[0].svIdle(17), plen 0: [] -EVENT[1782]: 0.191666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1783]: 0.191680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1784]: 0.191695350 - core[1].svIdle(17), plen 0: [] -EVENT[1785]: 0.191833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1786]: 0.191849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1787]: 0.191864250 - core[0].svIdle(17), plen 0: [] -EVENT[1788]: 0.192666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1789]: 0.192680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1790]: 0.192695125 - core[1].svIdle(17), plen 0: [] -EVENT[1791]: 0.192833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1792]: 0.192849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1793]: 0.192864250 - core[0].svIdle(17), plen 0: [] -EVENT[1794]: 0.193666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1795]: 0.193680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1796]: 0.193695225 - core[1].svIdle(17), plen 0: [] -EVENT[1797]: 0.193833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1798]: 0.193849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1799]: 0.193864425 - core[0].svIdle(17), plen 0: [] -EVENT[1800]: 0.194666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1801]: 0.194679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1802]: 0.194695100 - core[1].svIdle(17), plen 0: [] -EVENT[1803]: 0.194833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1804]: 0.194849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1805]: 0.194864250 - core[0].svIdle(17), plen 0: [] -EVENT[1806]: 0.195666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1807]: 0.195680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1808]: 0.195695350 - core[1].svIdle(17), plen 0: [] -EVENT[1809]: 0.195833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1810]: 0.195849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1811]: 0.195864250 - core[0].svIdle(17), plen 0: [] -EVENT[1812]: 0.196666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1813]: 0.196680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1814]: 0.196695125 - core[1].svIdle(17), plen 0: [] -EVENT[1815]: 0.196833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1816]: 0.196849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1817]: 0.196864250 - core[0].svIdle(17), plen 0: [] -EVENT[1818]: 0.197666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1819]: 0.197680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1820]: 0.197695225 - core[1].svIdle(17), plen 0: [] -EVENT[1821]: 0.197833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1822]: 0.197849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1823]: 0.197864425 - core[0].svIdle(17), plen 0: [] -EVENT[1824]: 0.198666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1825]: 0.198679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1826]: 0.198695100 - core[1].svIdle(17), plen 0: [] -EVENT[1827]: 0.198833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1828]: 0.198849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1829]: 0.198864250 - core[0].svIdle(17), plen 0: [] -EVENT[1830]: 0.199666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1831]: 0.199680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1832]: 0.199695350 - core[1].svIdle(17), plen 0: [] -EVENT[1833]: 0.199833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1834]: 0.199849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1835]: 0.199864250 - core[0].svIdle(17), plen 0: [] -EVENT[1836]: 0.200666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1837]: 0.200680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1838]: 0.200695125 - core[1].svIdle(17), plen 0: [] -EVENT[1839]: 0.200833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1840]: 0.200849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1841]: 0.200864250 - core[0].svIdle(17), plen 0: [] -EVENT[1842]: 0.201666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1843]: 0.201680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1844]: 0.201695225 - core[1].svIdle(17), plen 0: [] -EVENT[1845]: 0.201833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1846]: 0.201849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1847]: 0.201864425 - core[0].svIdle(17), plen 0: [] -EVENT[1848]: 0.202666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1849]: 0.202680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1850]: 0.202695350 - core[1].svIdle(17), plen 0: [] -EVENT[1851]: 0.202833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1852]: 0.202849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1853]: 0.202864250 - core[0].svIdle(17), plen 0: [] -EVENT[1854]: 0.203666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1855]: 0.203680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1856]: 0.203695125 - core[1].svIdle(17), plen 0: [] -EVENT[1857]: 0.203833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1858]: 0.203849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1859]: 0.203864250 - core[0].svIdle(17), plen 0: [] -EVENT[1860]: 0.204666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1861]: 0.204680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1862]: 0.204695225 - core[1].svIdle(17), plen 0: [] -EVENT[1863]: 0.204833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1864]: 0.204849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1865]: 0.204864425 - core[0].svIdle(17), plen 0: [] -EVENT[1866]: 0.205666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1867]: 0.205679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1868]: 0.205695100 - core[1].svIdle(17), plen 0: [] -EVENT[1869]: 0.205833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1870]: 0.205849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1871]: 0.205864250 - core[0].svIdle(17), plen 0: [] -EVENT[1872]: 0.206666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1873]: 0.206680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1874]: 0.206695350 - core[1].svIdle(17), plen 0: [] -EVENT[1875]: 0.206833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1876]: 0.206849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1877]: 0.206864250 - core[0].svIdle(17), plen 0: [] -EVENT[1878]: 0.207666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1879]: 0.207680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1880]: 0.207695125 - core[1].svIdle(17), plen 0: [] -EVENT[1881]: 0.207833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1882]: 0.207849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1883]: 0.207864250 - core[0].svIdle(17), plen 0: [] -EVENT[1884]: 0.208666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1885]: 0.208680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1886]: 0.208695225 - core[1].svIdle(17), plen 0: [] -EVENT[1887]: 0.208833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1888]: 0.208849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1889]: 0.208864425 - core[0].svIdle(17), plen 0: [] -EVENT[1890]: 0.209666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1891]: 0.209679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1892]: 0.209695100 - core[1].svIdle(17), plen 0: [] -EVENT[1893]: 0.209833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1894]: 0.209849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1895]: 0.209864250 - core[0].svIdle(17), plen 0: [] -EVENT[1896]: 0.210666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1897]: 0.210680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1898]: 0.210695350 - core[1].svIdle(17), plen 0: [] -EVENT[1899]: 0.210833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1900]: 0.210849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1901]: 0.210864250 - core[0].svIdle(17), plen 0: [] -EVENT[1902]: 0.211666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1903]: 0.211680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1904]: 0.211695125 - core[1].svIdle(17), plen 0: [] -EVENT[1905]: 0.211833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1906]: 0.211848800 - core[0].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[1907]: 0.211861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1908]: 0.211877250 - core[0].svTaskStartExec(4), plen 0: [tid: 12286700] -EVENT[1909]: 0.211912650 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461348, size: 8, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.211912650] HEAP: Allocated 8 bytes @ 0x3ffbb864 from task "alloc0" on core 0 by: +EVENT[1875]: 0.184015600 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1876]: 0.184034475 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1877]: 0.184045700 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1878]: 0.184056475 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1879]: 0.184074625 - core[1].svIdle(17), plen 0: [] +EVENT[1880]: 0.184102425 - core[0].svPrint(26), plen 70: [msg: I (479) example: Task[0x3ffba1a4]: allocated 42 bytes @ 0x3ffbb064 +, lvl: 0, unused: 0] +[0.184102425] LOG: I (479) example: Task[0x3ffba1a4]: allocated 42 bytes @ 0x3ffbb064 +EVENT[1881]: 0.184120150 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12296968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1882]: 0.184133400 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[1883]: 0.184133400 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[1884]: 0.184149750 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1885]: 0.184160600 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[1886]: 0.184171425 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1887]: 0.184185225 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[1888]: 0.184195975 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[1889]: 0.184206750 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1890]: 0.184218850 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12296968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[1891]: 0.184230050 - core[0].svIdle(17), plen 0: [] +EVENT[1892]: 0.184242400 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[1893]: 0.184258625 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[1894]: 0.184306500 - core[1].svPrint(26), plen 63: [msg: I (479) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb064 +, lvl: 0, unused: 0] +[0.184306500] LOG: I (479) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb064 +EVENT[1895]: 0.184327925 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459300, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.184327925] HEAP: Freed bytes @ 0x3ffbb064 from task "free2" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 +/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 +/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 + +EVENT[1896]: 0.184359250 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[1897]: 0.184370825 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1898]: 0.184387525 - core[1].svIdle(17), plen 0: [] +EVENT[1899]: 0.184448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1900]: 0.184461625 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1901]: 0.184477200 - core[1].svIdle(17), plen 0: [] +EVENT[1902]: 0.184546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1903]: 0.184562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1904]: 0.184577275 - core[0].svIdle(17), plen 0: [] +EVENT[1905]: 0.185448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1906]: 0.185461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1907]: 0.185476850 - core[1].svIdle(17), plen 0: [] +EVENT[1908]: 0.185546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1909]: 0.185562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1910]: 0.185577075 - core[0].svIdle(17), plen 0: [] +EVENT[1911]: 0.186448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1912]: 0.186461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1913]: 0.186476975 - core[1].svIdle(17), plen 0: [] +EVENT[1914]: 0.186546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1915]: 0.186562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1916]: 0.186577225 - core[0].svIdle(17), plen 0: [] +EVENT[1917]: 0.187448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1918]: 0.187461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1919]: 0.187476900 - core[1].svIdle(17), plen 0: [] +EVENT[1920]: 0.187546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1921]: 0.187562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1922]: 0.187577075 - core[0].svIdle(17), plen 0: [] +EVENT[1923]: 0.188448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1924]: 0.188461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1925]: 0.188476850 - core[1].svIdle(17), plen 0: [] +EVENT[1926]: 0.188546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1927]: 0.188562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1928]: 0.188577275 - core[0].svIdle(17), plen 0: [] +EVENT[1929]: 0.189448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1930]: 0.189461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1931]: 0.189476850 - core[1].svIdle(17), plen 0: [] +EVENT[1932]: 0.189546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1933]: 0.189562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1934]: 0.189577075 - core[0].svIdle(17), plen 0: [] +EVENT[1935]: 0.190448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1936]: 0.190461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1937]: 0.190476975 - core[1].svIdle(17), plen 0: [] +EVENT[1938]: 0.190546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1939]: 0.190562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1940]: 0.190577225 - core[0].svIdle(17), plen 0: [] +EVENT[1941]: 0.191448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1942]: 0.191461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1943]: 0.191476900 - core[1].svIdle(17), plen 0: [] +EVENT[1944]: 0.191546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1945]: 0.191562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1946]: 0.191577075 - core[0].svIdle(17), plen 0: [] +EVENT[1947]: 0.192448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1948]: 0.192461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1949]: 0.192476850 - core[1].svIdle(17), plen 0: [] +EVENT[1950]: 0.192546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1951]: 0.192562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1952]: 0.192577275 - core[0].svIdle(17), plen 0: [] +EVENT[1953]: 0.193448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1954]: 0.193461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1955]: 0.193476850 - core[1].svIdle(17), plen 0: [] +EVENT[1956]: 0.193546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1957]: 0.193562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1958]: 0.193577075 - core[0].svIdle(17), plen 0: [] +EVENT[1959]: 0.194448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1960]: 0.194465950 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1961]: 0.194481100 - core[1].svIdle(17), plen 0: [] +EVENT[1962]: 0.194546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1963]: 0.194562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1964]: 0.194577075 - core[0].svIdle(17), plen 0: [] +EVENT[1965]: 0.195448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1966]: 0.195461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1967]: 0.195476850 - core[1].svIdle(17), plen 0: [] +EVENT[1968]: 0.195546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1969]: 0.195562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1970]: 0.195577275 - core[0].svIdle(17), plen 0: [] +EVENT[1971]: 0.196448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1972]: 0.196461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1973]: 0.196476850 - core[1].svIdle(17), plen 0: [] +EVENT[1974]: 0.196546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1975]: 0.196562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1976]: 0.196577075 - core[0].svIdle(17), plen 0: [] +EVENT[1977]: 0.197448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1978]: 0.197461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1979]: 0.197476975 - core[1].svIdle(17), plen 0: [] +EVENT[1980]: 0.197546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1981]: 0.197562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1982]: 0.197577225 - core[0].svIdle(17), plen 0: [] +EVENT[1983]: 0.198448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1984]: 0.198461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1985]: 0.198476900 - core[1].svIdle(17), plen 0: [] +EVENT[1986]: 0.198546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1987]: 0.198562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1988]: 0.198577075 - core[0].svIdle(17), plen 0: [] +EVENT[1989]: 0.199448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1990]: 0.199461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1991]: 0.199476850 - core[1].svIdle(17), plen 0: [] +EVENT[1992]: 0.199546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1993]: 0.199562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[1994]: 0.199577275 - core[0].svIdle(17), plen 0: [] +EVENT[1995]: 0.200448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1996]: 0.200461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[1997]: 0.200476850 - core[1].svIdle(17), plen 0: [] +EVENT[1998]: 0.200546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[1999]: 0.200562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2000]: 0.200577075 - core[0].svIdle(17), plen 0: [] +EVENT[2001]: 0.201448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2002]: 0.201461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2003]: 0.201476975 - core[1].svIdle(17), plen 0: [] +EVENT[2004]: 0.201546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2005]: 0.201562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2006]: 0.201577225 - core[0].svIdle(17), plen 0: [] +EVENT[2007]: 0.202448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2008]: 0.202461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2009]: 0.202476900 - core[1].svIdle(17), plen 0: [] +EVENT[2010]: 0.202546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2011]: 0.202562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2012]: 0.202577075 - core[0].svIdle(17), plen 0: [] +EVENT[2013]: 0.203448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2014]: 0.203461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2015]: 0.203476850 - core[1].svIdle(17), plen 0: [] +EVENT[2016]: 0.203546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2017]: 0.203562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2018]: 0.203577275 - core[0].svIdle(17), plen 0: [] +EVENT[2019]: 0.204448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2020]: 0.204461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2021]: 0.204476850 - core[1].svIdle(17), plen 0: [] +EVENT[2022]: 0.204546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2023]: 0.204562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2024]: 0.204577075 - core[0].svIdle(17), plen 0: [] +EVENT[2025]: 0.205448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2026]: 0.205461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2027]: 0.205476975 - core[1].svIdle(17), plen 0: [] +EVENT[2028]: 0.205546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2029]: 0.205562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2030]: 0.205577225 - core[0].svIdle(17), plen 0: [] +EVENT[2031]: 0.206448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2032]: 0.206466000 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2033]: 0.206481125 - core[1].svIdle(17), plen 0: [] +EVENT[2034]: 0.206546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2035]: 0.206562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2036]: 0.206577075 - core[0].svIdle(17), plen 0: [] +EVENT[2037]: 0.207448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2038]: 0.207461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2039]: 0.207476850 - core[1].svIdle(17), plen 0: [] +EVENT[2040]: 0.207546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2041]: 0.207562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2042]: 0.207577275 - core[0].svIdle(17), plen 0: [] +EVENT[2043]: 0.208448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2044]: 0.208461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2045]: 0.208476850 - core[1].svIdle(17), plen 0: [] +EVENT[2046]: 0.208546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2047]: 0.208562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2048]: 0.208577075 - core[0].svIdle(17), plen 0: [] +EVENT[2049]: 0.209448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2050]: 0.209461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2051]: 0.209476975 - core[1].svIdle(17), plen 0: [] +EVENT[2052]: 0.209546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2053]: 0.209562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2054]: 0.209577225 - core[0].svIdle(17), plen 0: [] +EVENT[2055]: 0.210448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2056]: 0.210461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2057]: 0.210476900 - core[1].svIdle(17), plen 0: [] +EVENT[2058]: 0.210546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2059]: 0.210562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2060]: 0.210577075 - core[0].svIdle(17), plen 0: [] +EVENT[2061]: 0.211448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2062]: 0.211461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2063]: 0.211476850 - core[1].svIdle(17), plen 0: [] +EVENT[2064]: 0.211546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2065]: 0.211562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2066]: 0.211577275 - core[0].svIdle(17), plen 0: [] +EVENT[2067]: 0.212448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2068]: 0.212461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2069]: 0.212476850 - core[1].svIdle(17), plen 0: [] +EVENT[2070]: 0.212546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2071]: 0.212561625 - core[0].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[2072]: 0.212561625 - core[1].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[2073]: 0.212574275 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2074]: 0.212590075 - core[0].svTaskStartExec(4), plen 0: [tid: 12284596] +EVENT[2075]: 0.212626150 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459240, size: 8, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.212626150] HEAP: Allocated 8 bytes @ 0x3ffbb028 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1910]: 0.211951250 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461364, size: 16, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.211951250] HEAP: Allocated 16 bytes @ 0x3ffbb874 from task "alloc0" on core 0 by: +EVENT[2076]: 0.212661725 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459300, size: 16, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.212661725] HEAP: Allocated 16 bytes @ 0x3ffbb064 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1911]: 0.211968150 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1912]: 0.211984150 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1913]: 0.212054475 - core[0].svPrint(26), plen 70: [msg: I (520) example: Task[0x3ffb7aec]: allocated 16 bytes @ 0x3ffbb874 +EVENT[2077]: 0.212678700 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2078]: 0.212694675 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2079]: 0.212753700 - core[0].svPrint(26), plen 70: [msg: I (508) example: Task[0x3ffb72b4]: allocated 16 bytes @ 0x3ffbb064 , lvl: 0, unused: 0] -[0.212054475] LOG: I (520) example: Task[0x3ffb7aec]: allocated 16 bytes @ 0x3ffbb874 -EVENT[1914]: 0.212068075 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12287056, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1915]: 0.212081300 - core[0].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[1916]: 0.212097675 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1917]: 0.212108525 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1918]: 0.212119300 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1919]: 0.212133125 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1920]: 0.212144025 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[1921]: 0.212154850 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1922]: 0.212166800 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12287056, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1923]: 0.212177050 - core[0].svIdle(17), plen 0: [] -EVENT[1924]: 0.212188475 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1925]: 0.212208850 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1926]: 0.212272400 - core[1].svPrint(26), plen 63: [msg: I (520) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb874 +[0.212753700] LOG: I (508) example: Task[0x3ffb72b4]: allocated 16 bytes @ 0x3ffbb064 +EVENT[2080]: 0.212767175 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12284952, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2081]: 0.212780350 - core[0].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[2082]: 0.212780350 - core[1].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[2083]: 0.212796550 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2084]: 0.212807500 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[2085]: 0.212818275 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2086]: 0.212832325 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2087]: 0.212844475 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[2088]: 0.212855425 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2089]: 0.212867375 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12284952, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[2090]: 0.212877575 - core[0].svIdle(17), plen 0: [] +EVENT[2091]: 0.212889300 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2092]: 0.212905650 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2093]: 0.212953525 - core[1].svPrint(26), plen 63: [msg: I (508) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb064 , lvl: 0, unused: 0] -[0.212272400] LOG: I (520) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb874 -EVENT[1927]: 0.212293600 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461364, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.212293600] HEAP: Freed bytes @ 0x3ffbb874 from task "free0" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.212953525] LOG: I (508) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb064 +EVENT[2094]: 0.212974725 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459300, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.212974725] HEAP: Freed bytes @ 0x3ffbb064 from task "free0" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1928]: 0.212320475 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1929]: 0.212331900 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1930]: 0.212348475 - core[1].svIdle(17), plen 0: [] -EVENT[1931]: 0.212666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1932]: 0.212679850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1933]: 0.212695550 - core[1].svIdle(17), plen 0: [] -EVENT[1934]: 0.212833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1935]: 0.212848800 - core[0].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[1936]: 0.212861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1937]: 0.212877375 - core[0].svTaskStartExec(4), plen 0: [tid: 12292716] -EVENT[1938]: 0.212912775 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461364, size: 16, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.212912775] HEAP: Allocated 16 bytes @ 0x3ffbb874 from task "alloc1" on core 0 by: +EVENT[2095]: 0.213006200 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2096]: 0.213017650 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2097]: 0.213034350 - core[1].svIdle(17), plen 0: [] +EVENT[2098]: 0.213448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2099]: 0.213461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2100]: 0.213477300 - core[1].svIdle(17), plen 0: [] +EVENT[2101]: 0.213546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2102]: 0.213561625 - core[0].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[2103]: 0.213561625 - core[1].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[2104]: 0.213573500 - core[0].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[2105]: 0.213573500 - core[1].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[2106]: 0.213585975 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2107]: 0.213601625 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[2108]: 0.213638000 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459300, size: 16, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.213638000] HEAP: Allocated 16 bytes @ 0x3ffbb064 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1939]: 0.212947475 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461384, size: 32, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.212947475] HEAP: Allocated 32 bytes @ 0x3ffbb888 from task "alloc1" on core 0 by: +EVENT[2109]: 0.213673625 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459320, size: 32, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.213673625] HEAP: Allocated 32 bytes @ 0x3ffbb078 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1940]: 0.212964400 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1941]: 0.212984575 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1942]: 0.213055025 - core[0].svPrint(26), plen 70: [msg: I (521) example: Task[0x3ffb926c]: allocated 32 bytes @ 0x3ffbb888 +EVENT[2110]: 0.213690700 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2111]: 0.213706725 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2112]: 0.213761525 - core[0].svPrint(26), plen 70: [msg: I (509) example: Task[0x3ffb8a34]: allocated 32 bytes @ 0x3ffbb078 , lvl: 0, unused: 0] -[0.213055025] LOG: I (521) example: Task[0x3ffb926c]: allocated 32 bytes @ 0x3ffbb888 -EVENT[1943]: 0.213068650 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12293072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1944]: 0.213081850 - core[0].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[1945]: 0.213098150 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1946]: 0.213109000 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1947]: 0.213119750 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1948]: 0.213133475 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1949]: 0.213144325 - core[1].svTaskStartExec(4), plen 0: [tid: 12295764] -EVENT[1950]: 0.213155150 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1951]: 0.213167025 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12293072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1952]: 0.213177275 - core[0].svIdle(17), plen 0: [] -EVENT[1953]: 0.213188750 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1954]: 0.213205050 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1955]: 0.213268500 - core[1].svPrint(26), plen 63: [msg: I (521) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb888 -, lvl: 0, unused: 0] -[0.213268500] LOG: I (521) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb888 -EVENT[1956]: 0.213293550 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461384, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.213293550] HEAP: Freed bytes @ 0x3ffbb888 from task "free1" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 -/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 -/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 - -EVENT[1957]: 0.213320550 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1958]: 0.213331975 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1959]: 0.213348550 - core[1].svIdle(17), plen 0: [] -EVENT[1960]: 0.213666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1961]: 0.213679850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1962]: 0.213695550 - core[1].svIdle(17), plen 0: [] -EVENT[1963]: 0.213833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1964]: 0.213848800 - core[0].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[1965]: 0.213861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1966]: 0.213877250 - core[0].svTaskStartExec(4), plen 0: [tid: 12298716] -EVENT[1967]: 0.213912650 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461384, size: 24, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.213912650] HEAP: Allocated 24 bytes @ 0x3ffbb888 from task "alloc2" on core 0 by: +[0.213761525] LOG: I (509) example: Task[0x3ffb8a34]: allocated 32 bytes @ 0x3ffbb078 +EVENT[2113]: 0.213778300 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12290968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2114]: 0.213791550 - core[0].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[2115]: 0.213791550 - core[1].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[2116]: 0.213807900 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2117]: 0.213818750 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[2118]: 0.213829575 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2119]: 0.213843375 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2120]: 0.213855300 - core[1].svTaskStartExec(4), plen 0: [tid: 12293660] +EVENT[2121]: 0.213866475 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2122]: 0.213878400 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12290968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[2123]: 0.213890050 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[2124]: 0.213901775 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2125]: 0.213920350 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2126]: 0.213933475 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459356, size: 24, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.213933475] HEAP: Allocated 24 bytes @ 0x3ffbb09c from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1968]: 0.213947200 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461412, size: 48, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.213947200] HEAP: Allocated 48 bytes @ 0x3ffbb8a4 from task "alloc2" on core 0 by: +EVENT[2127]: 0.213974050 - core[1].svPrint(26), plen 63: [msg: I (509) example: Task[0x3ffb961c]: free memory @ 0x3ffbb078 +, lvl: 0, unused: 0] +[0.213974050] LOG: I (509) example: Task[0x3ffb961c]: free memory @ 0x3ffbb078 +EVENT[2128]: 0.213990025 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459384, size: 48, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.213990025] HEAP: Allocated 48 bytes @ 0x3ffbb0b8 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1969]: 0.213964350 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1970]: 0.213980350 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1971]: 0.214050675 - core[0].svPrint(26), plen 70: [msg: I (522) example: Task[0x3ffba9dc]: allocated 48 bytes @ 0x3ffbb8a4 -, lvl: 0, unused: 0] -[0.214050675] LOG: I (522) example: Task[0x3ffba9dc]: allocated 48 bytes @ 0x3ffbb8a4 -EVENT[1972]: 0.214071175 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12299072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1973]: 0.214084400 - core[0].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[1974]: 0.214100725 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1975]: 0.214111575 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[1976]: 0.214122325 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1977]: 0.214136050 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[1978]: 0.214146950 - core[1].svTaskStartExec(4), plen 0: [tid: 12301764] -EVENT[1979]: 0.214157775 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1980]: 0.214169625 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12299072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[1981]: 0.214180925 - core[0].svIdle(17), plen 0: [] -EVENT[1982]: 0.214192550 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[1983]: 0.214208950 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[1984]: 0.214272500 - core[1].svPrint(26), plen 63: [msg: I (522) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb8a4 -, lvl: 0, unused: 0] -[0.214272500] LOG: I (522) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb8a4 -EVENT[1985]: 0.214293700 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461412, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.214293700] HEAP: Freed bytes @ 0x3ffbb8a4 from task "free2" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +EVENT[2129]: 0.214004375 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459320, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.214004375] HEAP: Freed bytes @ 0x3ffbb078 from task "free1" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[1986]: 0.214324025 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[1987]: 0.214335500 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1988]: 0.214352200 - core[1].svIdle(17), plen 0: [] -EVENT[1989]: 0.214666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1990]: 0.214679875 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1991]: 0.214695450 - core[1].svIdle(17), plen 0: [] -EVENT[1992]: 0.214833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1993]: 0.214849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[1994]: 0.214864425 - core[0].svIdle(17), plen 0: [] -EVENT[1995]: 0.215666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1996]: 0.215679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[1997]: 0.215695100 - core[1].svIdle(17), plen 0: [] -EVENT[1998]: 0.215833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[1999]: 0.215849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2000]: 0.215864250 - core[0].svIdle(17), plen 0: [] -EVENT[2001]: 0.216666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2002]: 0.216680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2003]: 0.216695350 - core[1].svIdle(17), plen 0: [] -EVENT[2004]: 0.216833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2005]: 0.216849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2006]: 0.216864250 - core[0].svIdle(17), plen 0: [] -EVENT[2007]: 0.217666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2008]: 0.217680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2009]: 0.217695125 - core[1].svIdle(17), plen 0: [] -EVENT[2010]: 0.217833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2011]: 0.217849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2012]: 0.217864250 - core[0].svIdle(17), plen 0: [] -EVENT[2013]: 0.218666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2014]: 0.218680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2015]: 0.218695225 - core[1].svIdle(17), plen 0: [] -EVENT[2016]: 0.218833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2017]: 0.218849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2018]: 0.218864425 - core[0].svIdle(17), plen 0: [] -EVENT[2019]: 0.219666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2020]: 0.219679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2021]: 0.219695100 - core[1].svIdle(17), plen 0: [] -EVENT[2022]: 0.219833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2023]: 0.219849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2024]: 0.219864250 - core[0].svIdle(17), plen 0: [] -EVENT[2025]: 0.220666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2026]: 0.220680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2027]: 0.220695350 - core[1].svIdle(17), plen 0: [] -EVENT[2028]: 0.220833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2029]: 0.220849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2030]: 0.220864250 - core[0].svIdle(17), plen 0: [] -EVENT[2031]: 0.221666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2032]: 0.221680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2033]: 0.221695125 - core[1].svIdle(17), plen 0: [] -EVENT[2034]: 0.221833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2035]: 0.221849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2036]: 0.221864250 - core[0].svIdle(17), plen 0: [] -EVENT[2037]: 0.222666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2038]: 0.222680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2039]: 0.222695225 - core[1].svIdle(17), plen 0: [] -EVENT[2040]: 0.222833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2041]: 0.222849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2042]: 0.222864425 - core[0].svIdle(17), plen 0: [] -EVENT[2043]: 0.223666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2044]: 0.223679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2045]: 0.223695100 - core[1].svIdle(17), plen 0: [] -EVENT[2046]: 0.223833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2047]: 0.223849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2048]: 0.223864250 - core[0].svIdle(17), plen 0: [] -EVENT[2049]: 0.224666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2050]: 0.224684200 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2051]: 0.224699350 - core[1].svIdle(17), plen 0: [] -EVENT[2052]: 0.224833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2053]: 0.224849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2054]: 0.224864250 - core[0].svIdle(17), plen 0: [] -EVENT[2055]: 0.225666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2056]: 0.225680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2057]: 0.225695225 - core[1].svIdle(17), plen 0: [] -EVENT[2058]: 0.225833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2059]: 0.225849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2060]: 0.225864425 - core[0].svIdle(17), plen 0: [] -EVENT[2061]: 0.226666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2062]: 0.226679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2063]: 0.226695100 - core[1].svIdle(17), plen 0: [] -EVENT[2064]: 0.226833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2065]: 0.226849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2066]: 0.226864250 - core[0].svIdle(17), plen 0: [] -EVENT[2067]: 0.227666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2068]: 0.227680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2069]: 0.227695350 - core[1].svIdle(17), plen 0: [] -EVENT[2070]: 0.227833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2071]: 0.227849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2072]: 0.227864250 - core[0].svIdle(17), plen 0: [] -EVENT[2073]: 0.228666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2074]: 0.228680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2075]: 0.228695125 - core[1].svIdle(17), plen 0: [] -EVENT[2076]: 0.228833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2077]: 0.228849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2078]: 0.228864250 - core[0].svIdle(17), plen 0: [] -EVENT[2079]: 0.229666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2080]: 0.229680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2081]: 0.229695225 - core[1].svIdle(17), plen 0: [] -EVENT[2082]: 0.229833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2083]: 0.229849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2084]: 0.229864425 - core[0].svIdle(17), plen 0: [] -EVENT[2085]: 0.230666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2086]: 0.230679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2087]: 0.230695100 - core[1].svIdle(17), plen 0: [] -EVENT[2088]: 0.230833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2089]: 0.230849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2090]: 0.230864250 - core[0].svIdle(17), plen 0: [] -EVENT[2091]: 0.231666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2092]: 0.231680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2093]: 0.231695350 - core[1].svIdle(17), plen 0: [] -EVENT[2094]: 0.231833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2095]: 0.231849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2096]: 0.231864250 - core[0].svIdle(17), plen 0: [] -EVENT[2097]: 0.232666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2098]: 0.232680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2099]: 0.232695125 - core[1].svIdle(17), plen 0: [] -EVENT[2100]: 0.232833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2101]: 0.232849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2102]: 0.232864250 - core[0].svIdle(17), plen 0: [] -EVENT[2103]: 0.233666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2104]: 0.233680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2105]: 0.233695225 - core[1].svIdle(17), plen 0: [] -EVENT[2106]: 0.233833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2107]: 0.233849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2108]: 0.233864425 - core[0].svIdle(17), plen 0: [] -EVENT[2109]: 0.234666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2110]: 0.234679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2111]: 0.234695100 - core[1].svIdle(17), plen 0: [] -EVENT[2112]: 0.234833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2113]: 0.234849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2114]: 0.234864250 - core[0].svIdle(17), plen 0: [] -EVENT[2115]: 0.235666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2116]: 0.235680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2117]: 0.235695350 - core[1].svIdle(17), plen 0: [] -EVENT[2118]: 0.235833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2119]: 0.235849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2120]: 0.235864250 - core[0].svIdle(17), plen 0: [] -EVENT[2121]: 0.236666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2122]: 0.236683550 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2123]: 0.236698675 - core[1].svIdle(17), plen 0: [] -EVENT[2124]: 0.236833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2125]: 0.236849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2126]: 0.236864250 - core[0].svIdle(17), plen 0: [] -EVENT[2127]: 0.237666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2128]: 0.237680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2129]: 0.237695225 - core[1].svIdle(17), plen 0: [] -EVENT[2130]: 0.237833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2131]: 0.237849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2132]: 0.237864425 - core[0].svIdle(17), plen 0: [] -EVENT[2133]: 0.238666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2134]: 0.238679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2135]: 0.238695100 - core[1].svIdle(17), plen 0: [] -EVENT[2136]: 0.238833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2137]: 0.238849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2138]: 0.238864250 - core[0].svIdle(17), plen 0: [] -EVENT[2139]: 0.239666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2140]: 0.239680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2141]: 0.239695350 - core[1].svIdle(17), plen 0: [] -EVENT[2142]: 0.239833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2143]: 0.239849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2144]: 0.239864250 - core[0].svIdle(17), plen 0: [] -EVENT[2145]: 0.240666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2146]: 0.240680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2147]: 0.240695125 - core[1].svIdle(17), plen 0: [] -EVENT[2148]: 0.240833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2149]: 0.240849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2150]: 0.240864250 - core[0].svIdle(17), plen 0: [] -EVENT[2151]: 0.241666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2152]: 0.241680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2153]: 0.241695225 - core[1].svIdle(17), plen 0: [] -EVENT[2154]: 0.241833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2155]: 0.241848825 - core[0].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[2156]: 0.241861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2157]: 0.241877250 - core[0].svTaskStartExec(4), plen 0: [tid: 12286700] -EVENT[2158]: 0.241912575 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461412, size: 9, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.241912575] HEAP: Allocated 9 bytes @ 0x3ffbb8a4 from task "alloc0" on core 0 by: +EVENT[2130]: 0.214016825 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2131]: 0.214035975 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2132]: 0.214047225 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2133]: 0.214058075 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2134]: 0.214076350 - core[1].svIdle(17), plen 0: [] +EVENT[2135]: 0.214104200 - core[0].svPrint(26), plen 70: [msg: I (509) example: Task[0x3ffba1a4]: allocated 48 bytes @ 0x3ffbb0b8 +, lvl: 0, unused: 0] +[0.214104200] LOG: I (509) example: Task[0x3ffba1a4]: allocated 48 bytes @ 0x3ffbb0b8 +EVENT[2136]: 0.214117650 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12296968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2137]: 0.215663675 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2138]: 0.215675325 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[2139]: 0.215675325 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[2140]: 0.215693125 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2141]: 0.215704250 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2142]: 0.215715175 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2143]: 0.215726825 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2144]: 0.215737325 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2145]: 0.215748175 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2146]: 0.215759125 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2147]: 0.215770850 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2148]: 0.215781625 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2149]: 0.215793125 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[2150]: 0.215810975 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[2151]: 0.215824800 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[2152]: 0.215837075 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12296968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[2153]: 0.215848525 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2154]: 0.215860600 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2155]: 0.215871650 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2156]: 0.215883675 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2157]: 0.215894125 - core[0].svIdle(17), plen 0: [] +EVENT[2158]: 0.215944175 - core[1].svPrint(26), plen 63: [msg: I (511) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb0b8 +, lvl: 0, unused: 0] +[0.215944175] LOG: I (511) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb0b8 +EVENT[2159]: 0.215965550 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459384, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.215965550] HEAP: Freed bytes @ 0x3ffbb0b8 from task "free2" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 +/Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 +/Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 + +EVENT[2160]: 0.215992975 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2161]: 0.216004375 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2162]: 0.216020950 - core[1].svIdle(17), plen 0: [] +EVENT[2163]: 0.216448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2164]: 0.216461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2165]: 0.216477300 - core[1].svIdle(17), plen 0: [] +EVENT[2166]: 0.216546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2167]: 0.216562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2168]: 0.216577275 - core[0].svIdle(17), plen 0: [] +EVENT[2169]: 0.217448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2170]: 0.217461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2171]: 0.217476975 - core[1].svIdle(17), plen 0: [] +EVENT[2172]: 0.217546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2173]: 0.217562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2174]: 0.217577225 - core[0].svIdle(17), plen 0: [] +EVENT[2175]: 0.218448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2176]: 0.218461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2177]: 0.218476900 - core[1].svIdle(17), plen 0: [] +EVENT[2178]: 0.218546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2179]: 0.218562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2180]: 0.218577075 - core[0].svIdle(17), plen 0: [] +EVENT[2181]: 0.219448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2182]: 0.219461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2183]: 0.219476850 - core[1].svIdle(17), plen 0: [] +EVENT[2184]: 0.219546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2185]: 0.219562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2186]: 0.219577275 - core[0].svIdle(17), plen 0: [] +EVENT[2187]: 0.220448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2188]: 0.220461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2189]: 0.220476850 - core[1].svIdle(17), plen 0: [] +EVENT[2190]: 0.220546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2191]: 0.220562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2192]: 0.220577075 - core[0].svIdle(17), plen 0: [] +EVENT[2193]: 0.221448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2194]: 0.221461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2195]: 0.221476975 - core[1].svIdle(17), plen 0: [] +EVENT[2196]: 0.221546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2197]: 0.221562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2198]: 0.221577225 - core[0].svIdle(17), plen 0: [] +EVENT[2199]: 0.222448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2200]: 0.222461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2201]: 0.222476900 - core[1].svIdle(17), plen 0: [] +EVENT[2202]: 0.222546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2203]: 0.222562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2204]: 0.222577075 - core[0].svIdle(17), plen 0: [] +EVENT[2205]: 0.223448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2206]: 0.223461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2207]: 0.223476850 - core[1].svIdle(17), plen 0: [] +EVENT[2208]: 0.223546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2209]: 0.223562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2210]: 0.223577275 - core[0].svIdle(17), plen 0: [] +EVENT[2211]: 0.224448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2212]: 0.224461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2213]: 0.224476850 - core[1].svIdle(17), plen 0: [] +EVENT[2214]: 0.224546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2215]: 0.224562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2216]: 0.224577075 - core[0].svIdle(17), plen 0: [] +EVENT[2217]: 0.225448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2218]: 0.225461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2219]: 0.225476975 - core[1].svIdle(17), plen 0: [] +EVENT[2220]: 0.225546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2221]: 0.225562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2222]: 0.225577225 - core[0].svIdle(17), plen 0: [] +EVENT[2223]: 0.226448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2224]: 0.226461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2225]: 0.226476900 - core[1].svIdle(17), plen 0: [] +EVENT[2226]: 0.226546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2227]: 0.226562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2228]: 0.226577075 - core[0].svIdle(17), plen 0: [] +EVENT[2229]: 0.227448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2230]: 0.227461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2231]: 0.227476850 - core[1].svIdle(17), plen 0: [] +EVENT[2232]: 0.227546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2233]: 0.227562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2234]: 0.227577275 - core[0].svIdle(17), plen 0: [] +EVENT[2235]: 0.228448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2236]: 0.228461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2237]: 0.228476850 - core[1].svIdle(17), plen 0: [] +EVENT[2238]: 0.228546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2239]: 0.228562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2240]: 0.228577075 - core[0].svIdle(17), plen 0: [] +EVENT[2241]: 0.229448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2242]: 0.229466000 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2243]: 0.229481125 - core[1].svIdle(17), plen 0: [] +EVENT[2244]: 0.229546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2245]: 0.229562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2246]: 0.229577075 - core[0].svIdle(17), plen 0: [] +EVENT[2247]: 0.230448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2248]: 0.230461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2249]: 0.230476850 - core[1].svIdle(17), plen 0: [] +EVENT[2250]: 0.230546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2251]: 0.230562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2252]: 0.230577275 - core[0].svIdle(17), plen 0: [] +EVENT[2253]: 0.231448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2254]: 0.231461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2255]: 0.231476850 - core[1].svIdle(17), plen 0: [] +EVENT[2256]: 0.231546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2257]: 0.231562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2258]: 0.231577075 - core[0].svIdle(17), plen 0: [] +EVENT[2259]: 0.232448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2260]: 0.232461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2261]: 0.232476975 - core[1].svIdle(17), plen 0: [] +EVENT[2262]: 0.232546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2263]: 0.232562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2264]: 0.232577225 - core[0].svIdle(17), plen 0: [] +EVENT[2265]: 0.233448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2266]: 0.233461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2267]: 0.233476900 - core[1].svIdle(17), plen 0: [] +EVENT[2268]: 0.233546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2269]: 0.233562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2270]: 0.233577075 - core[0].svIdle(17), plen 0: [] +EVENT[2271]: 0.234448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2272]: 0.234461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2273]: 0.234476850 - core[1].svIdle(17), plen 0: [] +EVENT[2274]: 0.234546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2275]: 0.234562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2276]: 0.234577275 - core[0].svIdle(17), plen 0: [] +EVENT[2277]: 0.235448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2278]: 0.235461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2279]: 0.235476850 - core[1].svIdle(17), plen 0: [] +EVENT[2280]: 0.235546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2281]: 0.235562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2282]: 0.235577075 - core[0].svIdle(17), plen 0: [] +EVENT[2283]: 0.236448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2284]: 0.236461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2285]: 0.236476975 - core[1].svIdle(17), plen 0: [] +EVENT[2286]: 0.236546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2287]: 0.236562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2288]: 0.236577225 - core[0].svIdle(17), plen 0: [] +EVENT[2289]: 0.237448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2290]: 0.237461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2291]: 0.237476900 - core[1].svIdle(17), plen 0: [] +EVENT[2292]: 0.237546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2293]: 0.237562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2294]: 0.237577075 - core[0].svIdle(17), plen 0: [] +EVENT[2295]: 0.238448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2296]: 0.238461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2297]: 0.238476850 - core[1].svIdle(17), plen 0: [] +EVENT[2298]: 0.238546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2299]: 0.238562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2300]: 0.238577275 - core[0].svIdle(17), plen 0: [] +EVENT[2301]: 0.239448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2302]: 0.239461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2303]: 0.239476850 - core[1].svIdle(17), plen 0: [] +EVENT[2304]: 0.239546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2305]: 0.239562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2306]: 0.239577075 - core[0].svIdle(17), plen 0: [] +EVENT[2307]: 0.240448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2308]: 0.240461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2309]: 0.240476975 - core[1].svIdle(17), plen 0: [] +EVENT[2310]: 0.240546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2311]: 0.240562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2312]: 0.240577225 - core[0].svIdle(17), plen 0: [] +EVENT[2313]: 0.241448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2314]: 0.241465300 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2315]: 0.241480450 - core[1].svIdle(17), plen 0: [] +EVENT[2316]: 0.241546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2317]: 0.241562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2318]: 0.241577075 - core[0].svIdle(17), plen 0: [] +EVENT[2319]: 0.242448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2320]: 0.242461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2321]: 0.242476850 - core[1].svIdle(17), plen 0: [] +EVENT[2322]: 0.242546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2323]: 0.242561675 - core[0].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[2324]: 0.242561675 - core[1].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[2325]: 0.242574275 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2326]: 0.242589925 - core[0].svTaskStartExec(4), plen 0: [tid: 12284596] +EVENT[2327]: 0.242624900 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459256, size: 9, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.242624900] HEAP: Allocated 9 bytes @ 0x3ffbb038 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2159]: 0.241947000 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461428, size: 18, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.241947000] HEAP: Allocated 18 bytes @ 0x3ffbb8b4 from task "alloc0" on core 0 by: +EVENT[2328]: 0.242659150 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459320, size: 18, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.242659150] HEAP: Allocated 18 bytes @ 0x3ffbb078 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2160]: 0.241964025 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2161]: 0.241980025 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2162]: 0.242050450 - core[0].svPrint(26), plen 70: [msg: I (550) example: Task[0x3ffb7aec]: allocated 18 bytes @ 0x3ffbb8b4 +EVENT[2329]: 0.242676200 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2330]: 0.242692225 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2331]: 0.242747050 - core[0].svPrint(26), plen 70: [msg: I (538) example: Task[0x3ffb72b4]: allocated 18 bytes @ 0x3ffbb078 , lvl: 0, unused: 0] -[0.242050450] LOG: I (550) example: Task[0x3ffb7aec]: allocated 18 bytes @ 0x3ffbb8b4 -EVENT[2163]: 0.242068275 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12287056, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2164]: 0.242081500 - core[0].svTaskStartReady(6), plen 0: [tid: 12289748] -EVENT[2165]: 0.242097725 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[2166]: 0.242108600 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[2167]: 0.242119350 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2168]: 0.242133200 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[2169]: 0.242144075 - core[1].svTaskStartExec(4), plen 0: [tid: 12289748] -EVENT[2170]: 0.242154900 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2171]: 0.242166875 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12287056, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[2172]: 0.242177125 - core[0].svIdle(17), plen 0: [] -EVENT[2173]: 0.242188525 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2174]: 0.242204900 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2175]: 0.242268450 - core[1].svPrint(26), plen 63: [msg: I (550) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb8b4 +[0.242747050] LOG: I (538) example: Task[0x3ffb72b4]: allocated 18 bytes @ 0x3ffbb078 +EVENT[2332]: 0.242760425 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12284952, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2333]: 0.242773825 - core[0].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[2334]: 0.242773825 - core[1].svTaskStartReady(6), plen 0: [tid: 12287644] +EVENT[2335]: 0.242790000 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2336]: 0.242805900 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[2337]: 0.242816600 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2338]: 0.242830325 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2339]: 0.242841100 - core[1].svTaskStartExec(4), plen 0: [tid: 12287644] +EVENT[2340]: 0.242851850 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2341]: 0.242864100 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12284952, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[2342]: 0.242875350 - core[0].svIdle(17), plen 0: [] +EVENT[2343]: 0.242892600 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2344]: 0.242908850 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2345]: 0.242956725 - core[1].svPrint(26), plen 63: [msg: I (538) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb078 , lvl: 0, unused: 0] -[0.242268450] LOG: I (550) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb8b4 -EVENT[2176]: 0.242289650 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461428, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.242289650] HEAP: Freed bytes @ 0x3ffbb8b4 from task "free0" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.242956725] LOG: I (538) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb078 +EVENT[2346]: 0.242978125 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459320, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.242978125] HEAP: Freed bytes @ 0x3ffbb078 from task "free0" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2177]: 0.242320650 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[2178]: 0.242332125 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2179]: 0.242348825 - core[1].svIdle(17), plen 0: [] -EVENT[2180]: 0.242666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2181]: 0.242679875 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2182]: 0.242695450 - core[1].svIdle(17), plen 0: [] -EVENT[2183]: 0.242833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2184]: 0.242848825 - core[0].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[2185]: 0.242861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2186]: 0.242877250 - core[0].svTaskStartExec(4), plen 0: [tid: 12292716] -EVENT[2187]: 0.242912575 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461428, size: 18, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.242912575] HEAP: Allocated 18 bytes @ 0x3ffbb8b4 from task "alloc1" on core 0 by: +EVENT[2347]: 0.243004600 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2348]: 0.243016000 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2349]: 0.243032575 - core[1].svIdle(17), plen 0: [] +EVENT[2350]: 0.243448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2351]: 0.243461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2352]: 0.243477425 - core[1].svIdle(17), plen 0: [] +EVENT[2353]: 0.243546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2354]: 0.243561625 - core[0].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[2355]: 0.243561625 - core[1].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[2356]: 0.243574225 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2357]: 0.243589875 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[2358]: 0.243625050 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459320, size: 18, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.243625050] HEAP: Allocated 18 bytes @ 0x3ffbb078 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2188]: 0.242947150 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461452, size: 36, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.242947150] HEAP: Allocated 36 bytes @ 0x3ffbb8cc from task "alloc1" on core 0 by: +EVENT[2359]: 0.243664650 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459384, size: 36, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.243664650] HEAP: Allocated 36 bytes @ 0x3ffbb0b8 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2189]: 0.242964175 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2190]: 0.242980175 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2191]: 0.243050600 - core[0].svPrint(26), plen 70: [msg: I (551) example: Task[0x3ffb926c]: allocated 36 bytes @ 0x3ffbb8cc +EVENT[2360]: 0.243681600 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2361]: 0.243697725 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2362]: 0.243752450 - core[0].svPrint(26), plen 70: [msg: I (539) example: Task[0x3ffb8a34]: allocated 36 bytes @ 0x3ffbb0b8 , lvl: 0, unused: 0] -[0.243050600] LOG: I (551) example: Task[0x3ffb926c]: allocated 36 bytes @ 0x3ffbb8cc -EVENT[2192]: 0.243064150 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12293072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2193]: 0.243080975 - core[0].svTaskStartReady(6), plen 0: [tid: 12295764] -EVENT[2194]: 0.243097275 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[2195]: 0.243108125 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[2196]: 0.243118875 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2197]: 0.243132600 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[2198]: 0.243143450 - core[1].svTaskStartExec(4), plen 0: [tid: 12295764] -EVENT[2199]: 0.243154275 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2200]: 0.243166150 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12293072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[2201]: 0.243176400 - core[0].svIdle(17), plen 0: [] -EVENT[2202]: 0.243187875 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2203]: 0.243204375 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2204]: 0.243267825 - core[1].svPrint(26), plen 63: [msg: I (551) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb8cc +[0.243752450] LOG: I (539) example: Task[0x3ffb8a34]: allocated 36 bytes @ 0x3ffbb0b8 +EVENT[2363]: 0.243765900 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12290968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2364]: 0.243779150 - core[0].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[2365]: 0.243779150 - core[1].svTaskStartReady(6), plen 0: [tid: 12293660] +EVENT[2366]: 0.243795500 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2367]: 0.243806350 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[2368]: 0.243817175 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2369]: 0.243830875 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2370]: 0.243841750 - core[1].svTaskStartExec(4), plen 0: [tid: 12293660] +EVENT[2371]: 0.243852625 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2372]: 0.243864575 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12290968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[2373]: 0.243875800 - core[0].svIdle(17), plen 0: [] +EVENT[2374]: 0.243887600 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2375]: 0.243908225 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2376]: 0.243956100 - core[1].svPrint(26), plen 63: [msg: I (539) example: Task[0x3ffb961c]: free memory @ 0x3ffbb0b8 , lvl: 0, unused: 0] -[0.243267825] LOG: I (551) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb8cc -EVENT[2205]: 0.243288975 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461452, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.243288975] HEAP: Freed bytes @ 0x3ffbb8cc from task "free1" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.243956100] LOG: I (539) example: Task[0x3ffb961c]: free memory @ 0x3ffbb0b8 +EVENT[2377]: 0.243977525 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459384, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.243977525] HEAP: Freed bytes @ 0x3ffbb0b8 from task "free1" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2206]: 0.243315975 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[2207]: 0.243327400 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2208]: 0.243343975 - core[1].svIdle(17), plen 0: [] -EVENT[2209]: 0.243666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2210]: 0.243679850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2211]: 0.243695550 - core[1].svIdle(17), plen 0: [] -EVENT[2212]: 0.243833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2213]: 0.243848800 - core[0].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[2214]: 0.243861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2215]: 0.243877250 - core[0].svTaskStartExec(4), plen 0: [tid: 12298716] -EVENT[2216]: 0.243912650 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461452, size: 27, callers: [1074274287, 1074274340, 1074325096, 1074621171, 1074302356, 0, 0, 0, 0, 0]] -[0.243912650] HEAP: Allocated 27 bytes @ 0x3ffbb8cc from task "alloc2" on core 0 by: +EVENT[2378]: 0.244004825 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2379]: 0.244016225 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2380]: 0.244032800 - core[1].svIdle(17), plen 0: [] +EVENT[2381]: 0.244448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2382]: 0.244461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2383]: 0.244477425 - core[1].svIdle(17), plen 0: [] +EVENT[2384]: 0.244546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2385]: 0.244562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2386]: 0.244577225 - core[0].svIdle(17), plen 0: [] +EVENT[2387]: 0.245448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2388]: 0.245461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2389]: 0.245476900 - core[1].svIdle(17), plen 0: [] +EVENT[2390]: 0.245546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2391]: 0.245561625 - core[0].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[2392]: 0.245561625 - core[1].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[2393]: 0.245574275 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2394]: 0.245589950 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[2395]: 0.245626225 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459384, size: 27, callers: [1074274047, 1074274100, 1074321944, 1074609076, 1074299100, 0, 0, 0, 0, 0]] +[0.245626225] HEAP: Allocated 27 bytes @ 0x3ffbb0b8 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2217]: 0.243951325 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073461484, size: 54, callers: [1074274287, 1074274340, 1074325096, 1074621178, 1074302356, 0, 0, 0, 0, 0]] -[0.243951325] HEAP: Allocated 54 bytes @ 0x3ffbb8ec from task "alloc2" on core 0 by: +EVENT[2396]: 0.245661825 - core[0].esp_sysview_heap_trace_alloc(512), plen 36: [addr: 1073459416, size: 54, callers: [1074274047, 1074274100, 1074321944, 1074609083, 1074299100, 0, 0, 0, 0, 0]] +[0.245661825] HEAP: Allocated 54 bytes @ 0x3ffbb0d8 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:61 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2218]: 0.243968350 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2219]: 0.243984350 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2220]: 0.244054675 - core[0].svPrint(26), plen 70: [msg: I (552) example: Task[0x3ffba9dc]: allocated 54 bytes @ 0x3ffbb8ec +EVENT[2397]: 0.245682250 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2398]: 0.245698175 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2399]: 0.245752950 - core[0].svPrint(26), plen 70: [msg: I (541) example: Task[0x3ffba1a4]: allocated 54 bytes @ 0x3ffbb0d8 , lvl: 0, unused: 0] -[0.244054675] LOG: I (552) example: Task[0x3ffba9dc]: allocated 54 bytes @ 0x3ffbb8ec -EVENT[2221]: 0.244068400 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12299072, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2222]: 0.244081625 - core[0].svTaskStartReady(6), plen 0: [tid: 12301764] -EVENT[2223]: 0.244097950 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[2224]: 0.244108800 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] -EVENT[2225]: 0.244119550 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2226]: 0.244133275 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[2227]: 0.244144175 - core[1].svTaskStartExec(4), plen 0: [tid: 12301764] -EVENT[2228]: 0.244155000 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2229]: 0.244166850 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12299072, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] -EVENT[2230]: 0.244178150 - core[0].svIdle(17), plen 0: [] -EVENT[2231]: 0.244189775 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2232]: 0.244210225 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2233]: 0.244273900 - core[1].svPrint(26), plen 63: [msg: I (552) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb8ec +[0.245752950] LOG: I (541) example: Task[0x3ffba1a4]: allocated 54 bytes @ 0x3ffbb0d8 +EVENT[2400]: 0.245766450 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12296968, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2401]: 0.245779600 - core[0].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[2402]: 0.245779600 - core[1].svTaskStartReady(6), plen 0: [tid: 12299660] +EVENT[2403]: 0.245795925 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2404]: 0.245806775 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 30] +EVENT[2405]: 0.245817575 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2406]: 0.245831475 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2407]: 0.245842275 - core[1].svTaskStartExec(4), plen 0: [tid: 12299660] +EVENT[2408]: 0.245853025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2409]: 0.245865475 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12296968, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 1] +EVENT[2410]: 0.245876550 - core[0].svIdle(17), plen 0: [] +EVENT[2411]: 0.245888475 - core[1].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2412]: 0.245904775 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2413]: 0.245952650 - core[1].svPrint(26), plen 63: [msg: I (541) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb0d8 , lvl: 0, unused: 0] -[0.244273900] LOG: I (552) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb8ec -EVENT[2234]: 0.244295100 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073461484, callers: [1074325108, 1074621362, 1074302356, 0, 0, 0, 0, 0, 0, 0]] -[0.244295100] HEAP: Freed bytes @ 0x3ffbb8ec from task "free2" on core 1 by: -/Users/erhan/dev/esp-idf/components/newlib/heap.c:40 +[0.245952650] LOG: I (541) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb0d8 +EVENT[2414]: 0.245978075 - core[1].esp_sysview_heap_trace_free(513), plen 27: [addr: 1073459416, callers: [1074321956, 1074609266, 1074299100, 0, 0, 0, 0, 0, 0, 0]] +[0.245978075] HEAP: Freed bytes @ 0x3ffbb0d8 from task "free2" on core 1 by: +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:35 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:26 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -EVENT[2235]: 0.244322000 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] -EVENT[2236]: 0.244333425 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2237]: 0.244350000 - core[1].svIdle(17), plen 0: [] -EVENT[2238]: 0.244666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2239]: 0.244679850 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2240]: 0.244695550 - core[1].svIdle(17), plen 0: [] -EVENT[2241]: 0.244833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2242]: 0.244849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2243]: 0.244864250 - core[0].svIdle(17), plen 0: [] -EVENT[2244]: 0.245666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2245]: 0.245680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2246]: 0.245695350 - core[1].svIdle(17), plen 0: [] -EVENT[2247]: 0.245833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2248]: 0.245849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2249]: 0.245864250 - core[0].svIdle(17), plen 0: [] -EVENT[2250]: 0.246666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2251]: 0.246680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2252]: 0.246695125 - core[1].svIdle(17), plen 0: [] -EVENT[2253]: 0.246833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2254]: 0.246849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2255]: 0.246864250 - core[0].svIdle(17), plen 0: [] -EVENT[2256]: 0.247666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2257]: 0.247680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2258]: 0.247695225 - core[1].svIdle(17), plen 0: [] -EVENT[2259]: 0.247833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2260]: 0.247849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2261]: 0.247864425 - core[0].svIdle(17), plen 0: [] -EVENT[2262]: 0.248666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2263]: 0.248679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2264]: 0.248695100 - core[1].svIdle(17), plen 0: [] -EVENT[2265]: 0.248833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2266]: 0.248849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2267]: 0.248864250 - core[0].svIdle(17), plen 0: [] -EVENT[2268]: 0.249666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2269]: 0.249680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2270]: 0.249695350 - core[1].svIdle(17), plen 0: [] -EVENT[2271]: 0.249833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2272]: 0.249849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2273]: 0.249868675 - core[0].svIdle(17), plen 0: [] -EVENT[2274]: 0.250666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2275]: 0.250679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2276]: 0.250695100 - core[1].svIdle(17), plen 0: [] -EVENT[2277]: 0.250833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2278]: 0.250849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2279]: 0.250864250 - core[0].svIdle(17), plen 0: [] -EVENT[2280]: 0.251666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2281]: 0.251680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2282]: 0.251695350 - core[1].svIdle(17), plen 0: [] -EVENT[2283]: 0.251833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2284]: 0.251849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2285]: 0.251864250 - core[0].svIdle(17), plen 0: [] -EVENT[2286]: 0.252666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2287]: 0.252680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2288]: 0.252695125 - core[1].svIdle(17), plen 0: [] -EVENT[2289]: 0.252833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2290]: 0.252849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2291]: 0.252864250 - core[0].svIdle(17), plen 0: [] -EVENT[2292]: 0.253666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2293]: 0.253680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2294]: 0.253695225 - core[1].svIdle(17), plen 0: [] -EVENT[2295]: 0.253833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2296]: 0.253849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2297]: 0.253864425 - core[0].svIdle(17), plen 0: [] -EVENT[2298]: 0.254666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2299]: 0.254679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2300]: 0.254695100 - core[1].svIdle(17), plen 0: [] -EVENT[2301]: 0.254833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2302]: 0.254849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2303]: 0.254864250 - core[0].svIdle(17), plen 0: [] -EVENT[2304]: 0.255666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2305]: 0.255680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2306]: 0.255695350 - core[1].svIdle(17), plen 0: [] -EVENT[2307]: 0.255833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2308]: 0.255849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2309]: 0.255864250 - core[0].svIdle(17), plen 0: [] -EVENT[2310]: 0.256666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2311]: 0.256680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2312]: 0.256695125 - core[1].svIdle(17), plen 0: [] -EVENT[2313]: 0.256833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2314]: 0.256849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2315]: 0.256864250 - core[0].svIdle(17), plen 0: [] -EVENT[2316]: 0.257666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2317]: 0.257680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2318]: 0.257695225 - core[1].svIdle(17), plen 0: [] -EVENT[2319]: 0.257833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2320]: 0.257849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2321]: 0.257864425 - core[0].svIdle(17), plen 0: [] -EVENT[2322]: 0.258666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2323]: 0.258679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2324]: 0.258695100 - core[1].svIdle(17), plen 0: [] -EVENT[2325]: 0.258833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2326]: 0.258849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2327]: 0.258864250 - core[0].svIdle(17), plen 0: [] -EVENT[2328]: 0.259666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2329]: 0.259680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2330]: 0.259695350 - core[1].svIdle(17), plen 0: [] -EVENT[2331]: 0.259833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2332]: 0.259849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2333]: 0.259864250 - core[0].svIdle(17), plen 0: [] -EVENT[2334]: 0.260666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2335]: 0.260680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2336]: 0.260695125 - core[1].svIdle(17), plen 0: [] -EVENT[2337]: 0.260833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2338]: 0.260849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2339]: 0.260864250 - core[0].svIdle(17), plen 0: [] -EVENT[2340]: 0.261666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2341]: 0.261680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2342]: 0.261695225 - core[1].svIdle(17), plen 0: [] -EVENT[2343]: 0.261833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2344]: 0.261849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2345]: 0.261864425 - core[0].svIdle(17), plen 0: [] -EVENT[2346]: 0.262666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2347]: 0.262680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2348]: 0.262695350 - core[1].svIdle(17), plen 0: [] -EVENT[2349]: 0.262833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2350]: 0.262849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2351]: 0.262864250 - core[0].svIdle(17), plen 0: [] -EVENT[2352]: 0.263666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2353]: 0.263680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2354]: 0.263695125 - core[1].svIdle(17), plen 0: [] -EVENT[2355]: 0.263833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2356]: 0.263849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2357]: 0.263864250 - core[0].svIdle(17), plen 0: [] -EVENT[2358]: 0.264666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2359]: 0.264680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2360]: 0.264695225 - core[1].svIdle(17), plen 0: [] -EVENT[2361]: 0.264833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2362]: 0.264849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2363]: 0.264864425 - core[0].svIdle(17), plen 0: [] -EVENT[2364]: 0.265666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2365]: 0.265679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2366]: 0.265695100 - core[1].svIdle(17), plen 0: [] -EVENT[2367]: 0.265833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2368]: 0.265849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2369]: 0.265864250 - core[0].svIdle(17), plen 0: [] -EVENT[2370]: 0.266666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2371]: 0.266680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2372]: 0.266695350 - core[1].svIdle(17), plen 0: [] -EVENT[2373]: 0.266833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2374]: 0.266849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2375]: 0.266864250 - core[0].svIdle(17), plen 0: [] -EVENT[2376]: 0.267666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2377]: 0.267680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2378]: 0.267695125 - core[1].svIdle(17), plen 0: [] -EVENT[2379]: 0.267833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2380]: 0.267849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2381]: 0.267864250 - core[0].svIdle(17), plen 0: [] -EVENT[2382]: 0.268666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2383]: 0.268680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2384]: 0.268695225 - core[1].svIdle(17), plen 0: [] -EVENT[2385]: 0.268833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2386]: 0.268849200 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2387]: 0.268864425 - core[0].svIdle(17), plen 0: [] -EVENT[2388]: 0.269666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2389]: 0.269679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2390]: 0.269695100 - core[1].svIdle(17), plen 0: [] -EVENT[2391]: 0.269833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2392]: 0.269849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2393]: 0.269864250 - core[0].svIdle(17), plen 0: [] -EVENT[2394]: 0.270666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2395]: 0.270680075 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2396]: 0.270695350 - core[1].svIdle(17), plen 0: [] -EVENT[2397]: 0.270833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2398]: 0.270849175 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2399]: 0.270864250 - core[0].svIdle(17), plen 0: [] -EVENT[2400]: 0.271666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2401]: 0.271680000 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2402]: 0.271695125 - core[1].svIdle(17), plen 0: [] -EVENT[2403]: 0.271833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2404]: 0.271848800 - core[0].svTaskStartReady(6), plen 0: [tid: 12286700] -EVENT[2405]: 0.271861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2406]: 0.271877250 - core[0].svTaskStartExec(4), plen 0: [tid: 12286700] -EVENT[2407]: 0.271895625 - core[0].xTaskGenericNotify(44), plen 7: [xTaskToNotify: 12254080, ulValue: 0, eAction: 2, pulPreviousNotificationValue: 0] -EVENT[2408]: 0.271906575 - core[0].svTaskStartReady(6), plen 0: [tid: 12254080] -EVENT[2409]: 0.271919725 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 100] -EVENT[2410]: 0.271936275 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[2411]: 0.271947650 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2412]: 0.271964600 - core[0].svTaskStartExec(4), plen 0: [tid: 12254080] -EVENT[2413]: 0.271982475 - core[0].ulTaskNotifyTake(37), plen 6: [xClearCountOnExit: 0, xTicksToWait: 4294967295] -EVENT[2414]: 0.271998425 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2415]: 0.272014325 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2416]: 0.272063675 - core[0].svPrint(26), plen 37: [msg: I (580) example: Got notify val 1 +EVENT[2415]: 0.246005475 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[2416]: 0.246016900 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2417]: 0.246033450 - core[1].svIdle(17), plen 0: [] +EVENT[2418]: 0.246448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2419]: 0.246461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2420]: 0.246477300 - core[1].svIdle(17), plen 0: [] +EVENT[2421]: 0.246546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2422]: 0.246562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2423]: 0.246577275 - core[0].svIdle(17), plen 0: [] +EVENT[2424]: 0.247448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2425]: 0.247461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2426]: 0.247476850 - core[1].svIdle(17), plen 0: [] +EVENT[2427]: 0.247546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2428]: 0.247562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2429]: 0.247577075 - core[0].svIdle(17), plen 0: [] +EVENT[2430]: 0.248448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2431]: 0.248461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2432]: 0.248476975 - core[1].svIdle(17), plen 0: [] +EVENT[2433]: 0.248546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2434]: 0.248562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2435]: 0.248577225 - core[0].svIdle(17), plen 0: [] +EVENT[2436]: 0.249448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2437]: 0.249461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2438]: 0.249476900 - core[1].svIdle(17), plen 0: [] +EVENT[2439]: 0.249546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2440]: 0.249562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2441]: 0.249577075 - core[0].svIdle(17), plen 0: [] +EVENT[2442]: 0.250448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2443]: 0.250461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2444]: 0.250476850 - core[1].svIdle(17), plen 0: [] +EVENT[2445]: 0.250546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2446]: 0.250562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2447]: 0.250577275 - core[0].svIdle(17), plen 0: [] +EVENT[2448]: 0.251448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2449]: 0.251461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2450]: 0.251476850 - core[1].svIdle(17), plen 0: [] +EVENT[2451]: 0.251546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2452]: 0.251562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2453]: 0.251577075 - core[0].svIdle(17), plen 0: [] +EVENT[2454]: 0.252448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2455]: 0.252461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2456]: 0.252476975 - core[1].svIdle(17), plen 0: [] +EVENT[2457]: 0.252546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2458]: 0.252562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2459]: 0.252577225 - core[0].svIdle(17), plen 0: [] +EVENT[2460]: 0.253448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2461]: 0.253461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2462]: 0.253476975 - core[1].svIdle(17), plen 0: [] +EVENT[2463]: 0.253546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2464]: 0.253562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2465]: 0.253577225 - core[0].svIdle(17), plen 0: [] +EVENT[2466]: 0.254448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2467]: 0.254461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2468]: 0.254476900 - core[1].svIdle(17), plen 0: [] +EVENT[2469]: 0.254546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2470]: 0.254562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2471]: 0.254577075 - core[0].svIdle(17), plen 0: [] +EVENT[2472]: 0.255448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2473]: 0.255461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2474]: 0.255476850 - core[1].svIdle(17), plen 0: [] +EVENT[2475]: 0.255546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2476]: 0.255562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2477]: 0.255577275 - core[0].svIdle(17), plen 0: [] +EVENT[2478]: 0.256448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2479]: 0.256461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2480]: 0.256476850 - core[1].svIdle(17), plen 0: [] +EVENT[2481]: 0.256546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2482]: 0.256562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2483]: 0.256577075 - core[0].svIdle(17), plen 0: [] +EVENT[2484]: 0.257448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2485]: 0.257461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2486]: 0.257476975 - core[1].svIdle(17), plen 0: [] +EVENT[2487]: 0.257546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2488]: 0.257562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2489]: 0.257577225 - core[0].svIdle(17), plen 0: [] +EVENT[2490]: 0.258448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2491]: 0.258461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2492]: 0.258476900 - core[1].svIdle(17), plen 0: [] +EVENT[2493]: 0.258546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2494]: 0.258562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2495]: 0.258577075 - core[0].svIdle(17), plen 0: [] +EVENT[2496]: 0.259448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2497]: 0.259461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2498]: 0.259476850 - core[1].svIdle(17), plen 0: [] +EVENT[2499]: 0.259546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2500]: 0.259562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2501]: 0.259577275 - core[0].svIdle(17), plen 0: [] +EVENT[2502]: 0.260448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2503]: 0.260461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2504]: 0.260476850 - core[1].svIdle(17), plen 0: [] +EVENT[2505]: 0.260546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2506]: 0.260562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2507]: 0.260577075 - core[0].svIdle(17), plen 0: [] +EVENT[2508]: 0.261448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2509]: 0.261461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2510]: 0.261476975 - core[1].svIdle(17), plen 0: [] +EVENT[2511]: 0.261546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2512]: 0.261562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2513]: 0.261577225 - core[0].svIdle(17), plen 0: [] +EVENT[2514]: 0.262448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2515]: 0.262461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2516]: 0.262476900 - core[1].svIdle(17), plen 0: [] +EVENT[2517]: 0.262546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2518]: 0.262562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2519]: 0.262577075 - core[0].svIdle(17), plen 0: [] +EVENT[2520]: 0.263448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2521]: 0.263461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2522]: 0.263476850 - core[1].svIdle(17), plen 0: [] +EVENT[2523]: 0.263546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2524]: 0.263562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2525]: 0.263577275 - core[0].svIdle(17), plen 0: [] +EVENT[2526]: 0.264448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2527]: 0.264461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2528]: 0.264476850 - core[1].svIdle(17), plen 0: [] +EVENT[2529]: 0.264546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2530]: 0.264562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2531]: 0.264577075 - core[0].svIdle(17), plen 0: [] +EVENT[2532]: 0.265448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2533]: 0.265466000 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2534]: 0.265481125 - core[1].svIdle(17), plen 0: [] +EVENT[2535]: 0.265546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2536]: 0.265562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2537]: 0.265577075 - core[0].svIdle(17), plen 0: [] +EVENT[2538]: 0.266448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2539]: 0.266461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2540]: 0.266476850 - core[1].svIdle(17), plen 0: [] +EVENT[2541]: 0.266546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2542]: 0.266562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2543]: 0.266577275 - core[0].svIdle(17), plen 0: [] +EVENT[2544]: 0.267448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2545]: 0.267461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2546]: 0.267476850 - core[1].svIdle(17), plen 0: [] +EVENT[2547]: 0.267546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2548]: 0.267562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2549]: 0.267577075 - core[0].svIdle(17), plen 0: [] +EVENT[2550]: 0.268448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2551]: 0.268461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2552]: 0.268476975 - core[1].svIdle(17), plen 0: [] +EVENT[2553]: 0.268546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2554]: 0.268562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2555]: 0.268577225 - core[0].svIdle(17), plen 0: [] +EVENT[2556]: 0.269448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2557]: 0.269461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2558]: 0.269476900 - core[1].svIdle(17), plen 0: [] +EVENT[2559]: 0.269546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2560]: 0.269562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2561]: 0.269577075 - core[0].svIdle(17), plen 0: [] +EVENT[2562]: 0.270448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2563]: 0.270461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2564]: 0.270476850 - core[1].svIdle(17), plen 0: [] +EVENT[2565]: 0.270546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2566]: 0.270562050 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2567]: 0.270577275 - core[0].svIdle(17), plen 0: [] +EVENT[2568]: 0.271448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2569]: 0.271461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2570]: 0.271476850 - core[1].svIdle(17), plen 0: [] +EVENT[2571]: 0.271546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2572]: 0.271562000 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2573]: 0.271577075 - core[0].svIdle(17), plen 0: [] +EVENT[2574]: 0.272448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2575]: 0.272461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2576]: 0.272476975 - core[1].svIdle(17), plen 0: [] +EVENT[2577]: 0.272546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2578]: 0.272561625 - core[0].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[2579]: 0.272561625 - core[1].svTaskStartReady(6), plen 0: [tid: 12284596] +EVENT[2580]: 0.272574225 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2581]: 0.272589875 - core[0].svTaskStartExec(4), plen 0: [tid: 12284596] +EVENT[2582]: 0.272608050 - core[0].xTaskGenericNotify(44), plen 7: [xTaskToNotify: 12274964, ulValue: 0, eAction: 2, pulPreviousNotificationValue: 0] +EVENT[2583]: 0.272619100 - core[0].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[2584]: 0.272619100 - core[1].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[2585]: 0.272632200 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 100] +EVENT[2586]: 0.272648750 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2587]: 0.272660225 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2588]: 0.272677175 - core[0].svTaskStartExec(4), plen 0: [tid: 12274964] +EVENT[2589]: 0.272690950 - core[0].ulTaskNotifyTake(37), plen 6: [xClearCountOnExit: 0, xTicksToWait: 4294967295] +EVENT[2590]: 0.272706875 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2591]: 0.272722875 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2592]: 0.272764325 - core[0].svPrint(26), plen 37: [msg: I (568) example: Got notify val 1 , lvl: 0, unused: 0] -[0.272063675] LOG: I (580) example: Got notify val 1 -EVENT[2417]: 0.272079975 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2418]: 0.272095925 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2419]: 0.272140275 - core[0].svPrint(26), plen 34: [msg: I (580) example: Wait notify 1 +[0.272764325] LOG: I (568) example: Got notify val 1 +EVENT[2593]: 0.272784675 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2594]: 0.272800725 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2595]: 0.272837275 - core[0].svPrint(26), plen 34: [msg: I (568) example: Wait notify 1 , lvl: 0, unused: 0] -[0.272140275] LOG: I (580) example: Wait notify 1 -EVENT[2420]: 0.272158650 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[2421]: 0.272170050 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2422]: 0.272186100 - core[0].svIdle(17), plen 0: [] -EVENT[2423]: 0.272666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2424]: 0.272679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2425]: 0.272695100 - core[1].svIdle(17), plen 0: [] -EVENT[2426]: 0.272833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2427]: 0.272848800 - core[0].svTaskStartReady(6), plen 0: [tid: 12292716] -EVENT[2428]: 0.272861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2429]: 0.272877375 - core[0].svTaskStartExec(4), plen 0: [tid: 12292716] -EVENT[2430]: 0.272891800 - core[0].xTaskGenericNotify(44), plen 7: [xTaskToNotify: 12254080, ulValue: 0, eAction: 2, pulPreviousNotificationValue: 0] -EVENT[2431]: 0.272902925 - core[0].svTaskStartReady(6), plen 0: [tid: 12254080] -EVENT[2432]: 0.272916050 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 100] -EVENT[2433]: 0.272932650 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[2434]: 0.272944025 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2435]: 0.272960975 - core[0].svTaskStartExec(4), plen 0: [tid: 12254080] -EVENT[2436]: 0.272974675 - core[0].ulTaskNotifyTake(37), plen 6: [xClearCountOnExit: 0, xTicksToWait: 4294967295] -EVENT[2437]: 0.272990600 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2438]: 0.273006525 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2439]: 0.273056000 - core[0].svPrint(26), plen 37: [msg: I (581) example: Got notify val 1 +[0.272837275] LOG: I (568) example: Wait notify 1 +EVENT[2596]: 0.272855500 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2597]: 0.272866850 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2598]: 0.272882775 - core[0].svIdle(17), plen 0: [] +EVENT[2599]: 0.273448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2600]: 0.273461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2601]: 0.273476975 - core[1].svIdle(17), plen 0: [] +EVENT[2602]: 0.273546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2603]: 0.273561625 - core[0].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[2604]: 0.273561625 - core[1].svTaskStartReady(6), plen 0: [tid: 12290612] +EVENT[2605]: 0.273574225 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2606]: 0.273589875 - core[0].svTaskStartExec(4), plen 0: [tid: 12290612] +EVENT[2607]: 0.273604250 - core[0].xTaskGenericNotify(44), plen 7: [xTaskToNotify: 12274964, ulValue: 0, eAction: 2, pulPreviousNotificationValue: 0] +EVENT[2608]: 0.273615300 - core[0].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[2609]: 0.273615300 - core[1].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[2610]: 0.273628400 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 100] +EVENT[2611]: 0.273644950 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2612]: 0.273656300 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2613]: 0.273673250 - core[0].svTaskStartExec(4), plen 0: [tid: 12274964] +EVENT[2614]: 0.273687025 - core[0].ulTaskNotifyTake(37), plen 6: [xClearCountOnExit: 0, xTicksToWait: 4294967295] +EVENT[2615]: 0.273702950 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2616]: 0.273718950 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2617]: 0.273756450 - core[0].svPrint(26), plen 37: [msg: I (569) example: Got notify val 1 , lvl: 0, unused: 0] -[0.273056000] LOG: I (581) example: Got notify val 1 -EVENT[2440]: 0.273072300 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2441]: 0.273088250 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2442]: 0.273132600 - core[0].svPrint(26), plen 34: [msg: I (581) example: Wait notify 2 +[0.273756450] LOG: I (569) example: Got notify val 1 +EVENT[2618]: 0.273776100 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2619]: 0.273792050 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2620]: 0.273828600 - core[0].svPrint(26), plen 34: [msg: I (569) example: Wait notify 2 , lvl: 0, unused: 0] -[0.273132600] LOG: I (581) example: Wait notify 2 -EVENT[2443]: 0.273150975 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[2444]: 0.273162375 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2445]: 0.273178550 - core[0].svIdle(17), plen 0: [] -EVENT[2446]: 0.273666425 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2447]: 0.273679950 - core[1].svExitIsrToScheduler(18), plen 0: [] -EVENT[2448]: 0.273695100 - core[1].svIdle(17), plen 0: [] -EVENT[2449]: 0.273833800 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] -EVENT[2450]: 0.273848800 - core[0].svTaskStartReady(6), plen 0: [tid: 12298716] -EVENT[2451]: 0.273861575 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2452]: 0.273877375 - core[0].svTaskStartExec(4), plen 0: [tid: 12298716] -EVENT[2453]: 0.273891800 - core[0].xTaskGenericNotify(44), plen 7: [xTaskToNotify: 12254080, ulValue: 0, eAction: 2, pulPreviousNotificationValue: 0] -EVENT[2454]: 0.273902925 - core[0].svTaskStartReady(6), plen 0: [tid: 12254080] -EVENT[2455]: 0.273916050 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 100] -EVENT[2456]: 0.273932650 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] -EVENT[2457]: 0.273944025 - core[0].svExitIsrToScheduler(18), plen 0: [] -EVENT[2458]: 0.273960975 - core[0].svTaskStartExec(4), plen 0: [tid: 12254080] -EVENT[2459]: 0.273974675 - core[0].ulTaskNotifyTake(37), plen 6: [xClearCountOnExit: 0, xTicksToWait: 4294967295] -EVENT[2460]: 0.273990600 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2461]: 0.274006525 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12283904, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] -EVENT[2462]: 0.274051775 - core[0].svPrint(26), plen 37: [msg: I (582) example: Got notify val 1 +[0.273828600] LOG: I (569) example: Wait notify 2 +EVENT[2621]: 0.273846825 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2622]: 0.273858175 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2623]: 0.273874200 - core[0].svIdle(17), plen 0: [] +EVENT[2624]: 0.274448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2625]: 0.274461725 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2626]: 0.274476975 - core[1].svIdle(17), plen 0: [] +EVENT[2627]: 0.274546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2628]: 0.274562025 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2629]: 0.274577225 - core[0].svIdle(17), plen 0: [] +EVENT[2630]: 0.275448200 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2631]: 0.275461775 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[2632]: 0.275476900 - core[1].svIdle(17), plen 0: [] +EVENT[2633]: 0.275546650 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[2634]: 0.275561625 - core[0].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[2635]: 0.275561625 - core[1].svTaskStartReady(6), plen 0: [tid: 12296612] +EVENT[2636]: 0.275574275 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2637]: 0.275589950 - core[0].svTaskStartExec(4), plen 0: [tid: 12296612] +EVENT[2638]: 0.275604375 - core[0].xTaskGenericNotify(44), plen 7: [xTaskToNotify: 12274964, ulValue: 0, eAction: 2, pulPreviousNotificationValue: 0] +EVENT[2639]: 0.275615350 - core[0].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[2640]: 0.275615350 - core[1].svTaskStartReady(6), plen 0: [tid: 12274964] +EVENT[2641]: 0.275628525 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 100] +EVENT[2642]: 0.275645075 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[2643]: 0.275656425 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[2644]: 0.275673375 - core[0].svTaskStartExec(4), plen 0: [tid: 12274964] +EVENT[2645]: 0.275687075 - core[0].ulTaskNotifyTake(37), plen 6: [xClearCountOnExit: 0, xTicksToWait: 4294967295] +EVENT[2646]: 0.275703075 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2647]: 0.275719225 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12281672, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[2648]: 0.275756800 - core[0].svPrint(26), plen 37: [msg: I (571) example: Got notify val 1 , lvl: 0, unused: 0] -[0.274051775] LOG: I (582) example: Got notify val 1 -EVENT[2463]: 0.330505425 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12283904, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] -EVENT[2464]: 0.330514125 - core[0].svTraceStop(11), plen 0: [] -Processed 2465 events +[0.275756800] LOG: I (571) example: Got notify val 1 +EVENT[2649]: 0.327035450 - core[0].xQueueGenericReceive(49), plen 11: [xQueue: 12281672, pvBuffer: 3233808384, xTicksToWait: 10, xJustPeek: 0] +EVENT[2650]: 0.327044075 - core[0].svTraceStop(11), plen 0: [] +EVENT[2651]: 0.327044075 - core[1].svTraceStop(11), plen 0: [] +Processed 2652 events =============== LOG TRACE REPORT =============== Processed 60 log messages. =============== HEAP TRACE REPORT =============== Processed 99 heap events. -[0.001532525] HEAP: Allocated 8 bytes @ 0x3ffb70d8 from task "main" on core 0 by: +[0.001650800] HEAP: Allocated 8 bytes @ 0x3ffb68a0 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:87 -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.001870025] HEAP: Allocated 2500 bytes @ 0x3ffb70e8 from task "main" on core 0 by: +[0.001952550] HEAP: Allocated 2500 bytes @ 0x3ffb68b0 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.001909875] HEAP: Allocated 340 bytes @ 0x3ffb7aec from task "main" on core 0 by: +[0.001993450] HEAP: Allocated 340 bytes @ 0x3ffb72b4 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.002044025] HEAP: Allocated 124 bytes @ 0x3ffb7c50 from task "alloc0" on core 0 by: +[0.002144425] HEAP: Allocated 124 bytes @ 0x3ffb7418 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/queue.c:545 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:48 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.002113550] HEAP: Allocated 2500 bytes @ 0x3ffb7cd0 from task "alloc0" on core 0 by: +[0.002218950] HEAP: Allocated 2500 bytes @ 0x3ffb7498 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.002147950] HEAP: Allocated 340 bytes @ 0x3ffb86d4 from task "alloc0" on core 0 by: +[0.002254400] HEAP: Allocated 340 bytes @ 0x3ffb7e9c from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.002251800] HEAP: Allocated 1 bytes @ 0x3ffb8838 from task "alloc0" on core 0 by: +[0.002359325] HEAP: Allocated 1 bytes @ 0x3ffb8000 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.002788050] HEAP: Allocated 8 bytes @ 0x3ffb8858 from task "main" on core 0 by: +[0.002943850] HEAP: Allocated 8 bytes @ 0x3ffb8020 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:87 -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.002863625] HEAP: Allocated 2500 bytes @ 0x3ffb8868 from task "main" on core 0 by: +[0.002990650] HEAP: Allocated 2500 bytes @ 0x3ffb8030 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.002905675] HEAP: Allocated 340 bytes @ 0x3ffb926c from task "main" on core 0 by: +[0.003033925] HEAP: Allocated 340 bytes @ 0x3ffb8a34 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.003040300] HEAP: Allocated 124 bytes @ 0x3ffb93d0 from task "alloc1" on core 0 by: +[0.003169150] HEAP: Allocated 124 bytes @ 0x3ffb8b98 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/queue.c:545 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:48 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.003093950] HEAP: Allocated 2500 bytes @ 0x3ffb9450 from task "alloc1" on core 0 by: +[0.003223850] HEAP: Allocated 2500 bytes @ 0x3ffb8c18 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.003128350] HEAP: Allocated 340 bytes @ 0x3ffb9e54 from task "alloc1" on core 0 by: +[0.003259400] HEAP: Allocated 340 bytes @ 0x3ffb961c from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.003223700] HEAP: Allocated 2 bytes @ 0x3ffb9fb8 from task "alloc1" on core 0 by: +[0.003355850] HEAP: Allocated 2 bytes @ 0x3ffb9780 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.003547175] HEAP: Allocated 8 bytes @ 0x3ffb8848 from task "main" on core 0 by: +[0.003754850] HEAP: Allocated 8 bytes @ 0x3ffb8010 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:87 -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.003600675] HEAP: Allocated 2500 bytes @ 0x3ffb9fd8 from task "main" on core 0 by: +[0.003820975] HEAP: Allocated 2500 bytes @ 0x3ffb97a0 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.003639925] HEAP: Allocated 340 bytes @ 0x3ffba9dc from task "main" on core 0 by: +[0.003874025] HEAP: Allocated 340 bytes @ 0x3ffba1a4 from task "main" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:86 (discriminator 2) -/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 13) +/Users/erhan/dev/esp-idf/components/freertos/app_startup.c:209 (discriminator 10) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.003888100] HEAP: Allocated 124 bytes @ 0x3ffbab40 from task "alloc2" on core 0 by: +[0.004044725] HEAP: Allocated 124 bytes @ 0x3ffba308 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/queue.c:545 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:48 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.003941825] HEAP: Allocated 2500 bytes @ 0x3ffbabc0 from task "alloc2" on core 0 by: +[0.004099675] HEAP: Allocated 2500 bytes @ 0x3ffba388 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:231 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.003976225] HEAP: Allocated 340 bytes @ 0x3ffbb5c4 from task "alloc2" on core 0 by: +[0.004135150] HEAP: Allocated 340 bytes @ 0x3ffbad8c from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/freertos/heap_idf.c:58 /Users/erhan/dev/esp-idf/components/freertos/esp_additions/freertos_tasks_c_additions.h:236 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:57 /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.004075450] HEAP: Allocated 3 bytes @ 0x3ffb9fc8 from task "alloc2" on core 0 by: +[0.004235500] HEAP: Allocated 3 bytes @ 0x3ffb9790 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.031912575] HEAP: Allocated 2 bytes @ 0x3ffbb728 from task "alloc0" on core 0 by: +[0.032626375] HEAP: Allocated 2 bytes @ 0x3ffbaef0 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.032912600] HEAP: Allocated 4 bytes @ 0x3ffbb738 from task "alloc1" on core 0 by: +[0.033637950] HEAP: Allocated 4 bytes @ 0x3ffbaf00 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.033912650] HEAP: Allocated 6 bytes @ 0x3ffbb748 from task "alloc2" on core 0 by: +[0.033930825] HEAP: Allocated 6 bytes @ 0x3ffbaf20 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.061912575] HEAP: Allocated 3 bytes @ 0x3ffbb758 from task "alloc0" on core 0 by: +[0.062624900] HEAP: Allocated 3 bytes @ 0x3ffbaf10 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.062912575] HEAP: Allocated 6 bytes @ 0x3ffbb768 from task "alloc1" on core 0 by: +[0.063638000] HEAP: Allocated 6 bytes @ 0x3ffbaf30 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.063912650] HEAP: Allocated 9 bytes @ 0x3ffbb778 from task "alloc2" on core 0 by: +[0.063937325] HEAP: Allocated 9 bytes @ 0x3ffbaf50 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.091912475] HEAP: Allocated 4 bytes @ 0x3ffbb788 from task "alloc0" on core 0 by: +[0.092625125] HEAP: Allocated 4 bytes @ 0x3ffbaf40 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.092912775] HEAP: Allocated 8 bytes @ 0x3ffbb798 from task "alloc1" on core 0 by: +[0.093638000] HEAP: Allocated 8 bytes @ 0x3ffbaf60 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.093912650] HEAP: Allocated 12 bytes @ 0x3ffbb7a8 from task "alloc2" on core 0 by: +[0.093933400] HEAP: Allocated 12 bytes @ 0x3ffbaf84 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.121912575] HEAP: Allocated 5 bytes @ 0x3ffbb7b8 from task "alloc0" on core 0 by: +[0.122624900] HEAP: Allocated 5 bytes @ 0x3ffbaf70 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.122912575] HEAP: Allocated 10 bytes @ 0x3ffbb7c8 from task "alloc1" on core 0 by: +[0.123638125] HEAP: Allocated 10 bytes @ 0x3ffbaf94 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.123912650] HEAP: Allocated 15 bytes @ 0x3ffbb7d8 from task "alloc2" on core 0 by: +[0.123936825] HEAP: Allocated 15 bytes @ 0x3ffbafbc from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.151912650] HEAP: Allocated 6 bytes @ 0x3ffbb7ec from task "alloc0" on core 0 by: +[0.152625125] HEAP: Allocated 6 bytes @ 0x3ffbafa4 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.152912775] HEAP: Allocated 12 bytes @ 0x3ffbb7fc from task "alloc1" on core 0 by: +[0.153638000] HEAP: Allocated 12 bytes @ 0x3ffbafd0 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.153912650] HEAP: Allocated 18 bytes @ 0x3ffbb80c from task "alloc2" on core 0 by: +[0.153933400] HEAP: Allocated 18 bytes @ 0x3ffbaffc from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.181912575] HEAP: Allocated 7 bytes @ 0x3ffbb824 from task "alloc0" on core 0 by: +[0.182624900] HEAP: Allocated 7 bytes @ 0x3ffbafe0 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.182912575] HEAP: Allocated 14 bytes @ 0x3ffbb834 from task "alloc1" on core 0 by: +[0.183638125] HEAP: Allocated 14 bytes @ 0x3ffbb014 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.183912650] HEAP: Allocated 21 bytes @ 0x3ffbb848 from task "alloc2" on core 0 by: +[0.183936150] HEAP: Allocated 21 bytes @ 0x3ffbb048 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.211912650] HEAP: Allocated 8 bytes @ 0x3ffbb864 from task "alloc0" on core 0 by: +[0.212626150] HEAP: Allocated 8 bytes @ 0x3ffbb028 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.212912775] HEAP: Allocated 16 bytes @ 0x3ffbb874 from task "alloc1" on core 0 by: +[0.213638000] HEAP: Allocated 16 bytes @ 0x3ffbb064 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.213912650] HEAP: Allocated 24 bytes @ 0x3ffbb888 from task "alloc2" on core 0 by: +[0.213933475] HEAP: Allocated 24 bytes @ 0x3ffbb09c from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.241912575] HEAP: Allocated 9 bytes @ 0x3ffbb8a4 from task "alloc0" on core 0 by: +[0.242624900] HEAP: Allocated 9 bytes @ 0x3ffbb038 from task "alloc0" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.242912575] HEAP: Allocated 18 bytes @ 0x3ffbb8b4 from task "alloc1" on core 0 by: +[0.243625050] HEAP: Allocated 18 bytes @ 0x3ffbb078 from task "alloc1" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 -[0.243912650] HEAP: Allocated 27 bytes @ 0x3ffbb8cc from task "alloc2" on core 0 by: +[0.245626225] HEAP: Allocated 27 bytes @ 0x3ffbb0b8 from task "alloc2" on core 0 by: /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:84 /Users/erhan/dev/esp-idf/components/heap/heap_caps.c:110 -/Users/erhan/dev/esp-idf/components/newlib/heap.c:25 +/Users/erhan/dev/esp-idf/components/newlib/src/heap.c:25 /Users/erhan/dev/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:59 (discriminator 1) /Users/erhan/dev/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:141 diff --git a/tools/esp_app_trace/test/sysview/expected_output_mcore.json b/tools/esp_app_trace/test/sysview/expected_output_mcore.json index d13ad8bb407..c3e5325b94b 100644 --- a/tools/esp_app_trace/test/sysview/expected_output_mcore.json +++ b/tools/esp_app_trace/test/sysview/expected_output_mcore.json @@ -3,6 +3,94 @@ { "core_id": 0, "ctx_name": "IDLE1", + "id": 0, + "in_irq": false, + "params": {}, + "ts": 0 + }, + { + "core_id": 0, + "ctx_name": "IDLE1", + "id": 0, + "in_irq": false, + "params": {}, + "ts": 0 + }, + { + "core_id": 0, + "ctx_name": "IDLE1", + "id": 0, + "in_irq": false, + "params": {}, + "ts": 0 + }, + { + "core_id": 0, + "ctx_name": "IDLE1", + "id": 0, + "in_irq": false, + "params": {}, + "ts": 0 + }, + { + "core_id": 0, + "ctx_name": "IDLE1", + "id": 0, + "in_irq": false, + "params": {}, + "ts": 0 + }, + { + "core_id": 0, + "ctx_name": "IDLE1", + "id": 10, + "in_irq": false, + "params": {}, + "ts": 0 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 0, + "in_irq": false, + "params": {}, + "ts": 0 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 0, + "in_irq": false, + "params": {}, + "ts": 0 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 0, + "in_irq": false, + "params": {}, + "ts": 0 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 0, + "in_irq": false, + "params": {}, + "ts": 0 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 0, + "in_irq": false, + "params": {}, + "ts": 0 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", "id": 10, "in_irq": false, "params": {}, @@ -19,7 +107,20 @@ "ram_base": 1061158912, "sys_freq": 40000000 }, - "ts": 6.625e-06 + "ts": 6.65e-06 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 24, + "in_irq": false, + "params": { + "cpu_freq": 160000000, + "id_shift": 0, + "ram_base": 1061158912, + "sys_freq": 40000000 + }, + "ts": 6.65e-06 }, { "core_id": 0, @@ -29,7 +130,17 @@ "params": { "desc": "N=FreeRTOS Application,D=esp32,C=xtensa,O=FreeRTOS" }, - "ts": 1.855e-05 + "ts": 1.86e-05 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "N=FreeRTOS Application,D=esp32,C=xtensa,O=FreeRTOS" + }, + "ts": 1.86e-05 }, { "core_id": 0, @@ -39,7 +150,17 @@ "params": { "desc": "I#5=SysTick" }, - "ts": 2.7675e-05 + "ts": 2.775e-05 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#5=SysTick" + }, + "ts": 2.775e-05 }, { "core_id": 0, @@ -49,7 +170,17 @@ "params": { "desc": "I#6=WIFI_MAC" }, - "ts": 4.9775e-05 + "ts": 4.59e-05 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#6=WIFI_MAC" + }, + "ts": 4.59e-05 }, { "core_id": 0, @@ -59,7 +190,17 @@ "params": { "desc": "I#7=WIFI_NMI" }, - "ts": 6.3875e-05 + "ts": 6.0025e-05 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#7=WIFI_NMI" + }, + "ts": 6.0025e-05 }, { "core_id": 0, @@ -69,7 +210,17 @@ "params": { "desc": "I#8=WIFI_BB" }, - "ts": 7.38e-05 + "ts": 6.9975e-05 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#8=WIFI_BB" + }, + "ts": 6.9975e-05 }, { "core_id": 0, @@ -79,7 +230,17 @@ "params": { "desc": "I#9=BT_MAC" }, - "ts": 8.75e-05 + "ts": 7.9725e-05 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#9=BT_MAC" + }, + "ts": 7.9725e-05 }, { "core_id": 0, @@ -89,7 +250,17 @@ "params": { "desc": "I#10=BT_BB" }, - "ts": 0.00010155 + "ts": 9.38e-05 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#10=BT_BB" + }, + "ts": 9.38e-05 }, { "core_id": 0, @@ -99,7 +270,17 @@ "params": { "desc": "I#11=BT_BB_NMI" }, - "ts": 0.000112375 + "ts": 0.0001086 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#11=BT_BB_NMI" + }, + "ts": 0.0001086 }, { "core_id": 0, @@ -109,7 +290,17 @@ "params": { "desc": "I#12=RWBT" }, - "ts": 0.0001223 + "ts": 0.00011855 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#12=RWBT" + }, + "ts": 0.00011855 }, { "core_id": 0, @@ -119,7 +310,17 @@ "params": { "desc": "I#13=RWBLE" }, - "ts": 0.000132275 + "ts": 0.00012855 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#13=RWBLE" + }, + "ts": 0.00012855 }, { "core_id": 0, @@ -129,7 +330,17 @@ "params": { "desc": "I#14=RWBT_NMI" }, - "ts": 0.0001468 + "ts": 0.000143075 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#14=RWBT_NMI" + }, + "ts": 0.000143075 }, { "core_id": 0, @@ -139,7 +350,17 @@ "params": { "desc": "I#15=RWBLE_NMI" }, - "ts": 0.0001576 + "ts": 0.0001539 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#15=RWBLE_NMI" + }, + "ts": 0.0001539 }, { "core_id": 0, @@ -149,7 +370,17 @@ "params": { "desc": "I#16=SLC0" }, - "ts": 0.000171875 + "ts": 0.0001682 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#16=SLC0" + }, + "ts": 0.0001682 }, { "core_id": 0, @@ -159,7 +390,17 @@ "params": { "desc": "I#17=SLC1" }, - "ts": 0.000189525 + "ts": 0.000181925 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#17=SLC1" + }, + "ts": 0.000181925 }, { "core_id": 0, @@ -169,7 +410,17 @@ "params": { "desc": "I#18=UHCI0" }, - "ts": 0.00019965 + "ts": 0.000195875 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#18=UHCI0" + }, + "ts": 0.000195875 }, { "core_id": 0, @@ -179,7 +430,17 @@ "params": { "desc": "I#19=UHCI1" }, - "ts": 0.0002096 + "ts": 0.00020585 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#19=UHCI1" + }, + "ts": 0.00020585 }, { "core_id": 0, @@ -189,7 +450,17 @@ "params": { "desc": "I#20=TG0_T0_LEVEL" }, - "ts": 0.000224875 + "ts": 0.00022115 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#20=TG0_T0_LEVEL" + }, + "ts": 0.00022115 }, { "core_id": 0, @@ -199,7 +470,17 @@ "params": { "desc": "I#21=TG0_T1_LEVEL" }, - "ts": 0.000236275 + "ts": 0.000232575 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#21=TG0_T1_LEVEL" + }, + "ts": 0.000232575 }, { "core_id": 0, @@ -209,7 +490,17 @@ "params": { "desc": "I#22=TG0_WDT_LEVEL" }, - "ts": 0.000251975 + "ts": 0.000248275 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#22=TG0_WDT_LEVEL" + }, + "ts": 0.000248275 }, { "core_id": 0, @@ -219,7 +510,17 @@ "params": { "desc": "I#23=TG0_LACT_LEVEL" }, - "ts": 0.00026375 + "ts": 0.000260075 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#23=TG0_LACT_LEVEL" + }, + "ts": 0.000260075 }, { "core_id": 0, @@ -229,7 +530,17 @@ "params": { "desc": "I#24=TG1_T0_LEVEL" }, - "ts": 0.00027915 + "ts": 0.000275525 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#24=TG1_T0_LEVEL" + }, + "ts": 0.000275525 }, { "core_id": 0, @@ -239,7 +550,17 @@ "params": { "desc": "I#25=TG1_T1_LEVEL" }, - "ts": 0.00029455 + "ts": 0.000287 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#25=TG1_T1_LEVEL" + }, + "ts": 0.000287 }, { "core_id": 0, @@ -249,7 +570,17 @@ "params": { "desc": "I#26=TG1_WDT_LEVEL" }, - "ts": 0.000310125 + "ts": 0.000306525 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#26=TG1_WDT_LEVEL" + }, + "ts": 0.000306525 }, { "core_id": 0, @@ -259,7 +590,17 @@ "params": { "desc": "I#27=TG1_LACT_LEVEL" }, - "ts": 0.000322075 + "ts": 0.0003185 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#27=TG1_LACT_LEVEL" + }, + "ts": 0.0003185 }, { "core_id": 0, @@ -269,7 +610,17 @@ "params": { "desc": "I#28=GPIO" }, - "ts": 0.000331975 + "ts": 0.000328425 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#28=GPIO" + }, + "ts": 0.000328425 }, { "core_id": 0, @@ -279,7 +630,17 @@ "params": { "desc": "I#29=GPIO_NMI" }, - "ts": 0.0003509 + "ts": 0.000347375 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#29=GPIO_NMI" + }, + "ts": 0.000347375 }, { "core_id": 0, @@ -289,7 +650,17 @@ "params": { "desc": "I#30=FROM_CPU0" }, - "ts": 0.0003618 + "ts": 0.000358275 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#30=FROM_CPU0" + }, + "ts": 0.000358275 }, { "core_id": 0, @@ -299,7 +670,17 @@ "params": { "desc": "I#31=FROM_CPU1" }, - "ts": 0.0003765 + "ts": 0.000369025 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#31=FROM_CPU1" + }, + "ts": 0.000369025 }, { "core_id": 0, @@ -309,7 +690,17 @@ "params": { "desc": "I#32=FROM_CPU2" }, - "ts": 0.0003873 + "ts": 0.0003838 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#32=FROM_CPU2" + }, + "ts": 0.0003838 }, { "core_id": 0, @@ -319,7 +710,17 @@ "params": { "desc": "I#33=FROM_CPU3" }, - "ts": 0.000402 + "ts": 0.00039455 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#33=FROM_CPU3" + }, + "ts": 0.00039455 }, { "core_id": 0, @@ -329,7 +730,17 @@ "params": { "desc": "I#34=SPI0" }, - "ts": 0.00041575 + "ts": 0.000408325 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#34=SPI0" + }, + "ts": 0.000408325 }, { "core_id": 0, @@ -339,7 +750,17 @@ "params": { "desc": "I#35=SPI1" }, - "ts": 0.0004255 + "ts": 0.00042205 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#35=SPI1" + }, + "ts": 0.00042205 }, { "core_id": 0, @@ -349,7 +770,17 @@ "params": { "desc": "I#36=SPI2" }, - "ts": 0.000435275 + "ts": 0.00043185 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#36=SPI2" + }, + "ts": 0.00043185 }, { "core_id": 0, @@ -359,7 +790,17 @@ "params": { "desc": "I#37=SPI3" }, - "ts": 0.000445025 + "ts": 0.000441625 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#37=SPI3" + }, + "ts": 0.000441625 }, { "core_id": 0, @@ -369,7 +810,17 @@ "params": { "desc": "I#38=I2S0" }, - "ts": 0.000458825 + "ts": 0.0004528 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#38=I2S0" + }, + "ts": 0.0004528 }, { "core_id": 0, @@ -379,7 +830,17 @@ "params": { "desc": "I#39=I2S1" }, - "ts": 0.000468575 + "ts": 0.000468025 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#39=I2S1" + }, + "ts": 0.000468025 }, { "core_id": 0, @@ -389,7 +850,17 @@ "params": { "desc": "I#40=UART0" }, - "ts": 0.000478575 + "ts": 0.00047925 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#40=UART0" + }, + "ts": 0.00047925 }, { "core_id": 0, @@ -399,7 +870,17 @@ "params": { "desc": "I#41=UART1" }, - "ts": 0.0004925 + "ts": 0.000490675 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#41=UART1" + }, + "ts": 0.000490675 }, { "core_id": 0, @@ -409,7 +890,17 @@ "params": { "desc": "I#42=UART2" }, - "ts": 0.000506375 + "ts": 0.000506125 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#42=UART2" + }, + "ts": 0.000506125 }, { "core_id": 0, @@ -419,7 +910,17 @@ "params": { "desc": "I#43=SDIO_HOST" }, - "ts": 0.000517125 + "ts": 0.0005224 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#43=SDIO_HOST" + }, + "ts": 0.0005224 }, { "core_id": 0, @@ -429,7 +930,17 @@ "params": { "desc": "I#44=ETH_MAC" }, - "ts": 0.000527475 + "ts": 0.000534425 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#44=ETH_MAC" + }, + "ts": 0.000534425 }, { "core_id": 0, @@ -439,7 +950,17 @@ "params": { "desc": "I#45=PWM0" }, - "ts": 0.0005416 + "ts": 0.000550275 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#45=PWM0" + }, + "ts": 0.000550275 }, { "core_id": 0, @@ -449,7 +970,17 @@ "params": { "desc": "I#46=PWM1" }, - "ts": 0.0005553 + "ts": 0.000565375 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#46=PWM1" + }, + "ts": 0.000565375 }, { "core_id": 0, @@ -459,7 +990,17 @@ "params": { "desc": "I#47=RESERVED" }, - "ts": 0.00056595 + "ts": 0.000577225 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#47=RESERVED" + }, + "ts": 0.000577225 }, { "core_id": 0, @@ -469,7 +1010,17 @@ "params": { "desc": "I#48=RESERVED" }, - "ts": 0.00057655 + "ts": 0.000589025 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#48=RESERVED" + }, + "ts": 0.000589025 }, { "core_id": 0, @@ -479,7 +1030,17 @@ "params": { "desc": "I#49=LEDC" }, - "ts": 0.000590325 + "ts": 0.00060005 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#49=LEDC" + }, + "ts": 0.00060005 }, { "core_id": 0, @@ -489,7 +1050,17 @@ "params": { "desc": "I#50=EFUSE" }, - "ts": 0.000604225 + "ts": 0.000619275 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#50=EFUSE" + }, + "ts": 0.000619275 }, { "core_id": 0, @@ -499,7 +1070,17 @@ "params": { "desc": "I#51=TWAI" }, - "ts": 0.000618075 + "ts": 0.000630775 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#51=TWAI" + }, + "ts": 0.000630775 }, { "core_id": 0, @@ -509,7 +1090,17 @@ "params": { "desc": "I#52=RTC_CORE" }, - "ts": 0.00062865 + "ts": 0.00064665 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#52=RTC_CORE" + }, + "ts": 0.00064665 }, { "core_id": 0, @@ -519,7 +1110,17 @@ "params": { "desc": "I#53=RMT" }, - "ts": 0.000638225 + "ts": 0.000657625 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#53=RMT" + }, + "ts": 0.000657625 }, { "core_id": 0, @@ -529,7 +1130,17 @@ "params": { "desc": "I#54=PCNT" }, - "ts": 0.000648075 + "ts": 0.00066885 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#54=PCNT" + }, + "ts": 0.00066885 }, { "core_id": 0, @@ -539,7 +1150,17 @@ "params": { "desc": "I#55=I2C_EXT0" }, - "ts": 0.00066305 + "ts": 0.000685 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#55=I2C_EXT0" + }, + "ts": 0.000685 }, { "core_id": 0, @@ -549,7 +1170,17 @@ "params": { "desc": "I#56=I2C_EXT1" }, - "ts": 0.0006752 + "ts": 0.000696775 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#56=I2C_EXT1" + }, + "ts": 0.000696775 }, { "core_id": 0, @@ -559,7 +1190,17 @@ "params": { "desc": "I#57=RSA" }, - "ts": 0.000690175 + "ts": 0.000707625 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#57=RSA" + }, + "ts": 0.000707625 }, { "core_id": 0, @@ -569,7 +1210,17 @@ "params": { "desc": "I#58=SPI1_DMA" }, - "ts": 0.0007059 + "ts": 0.000723625 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#58=SPI1_DMA" + }, + "ts": 0.000723625 }, { "core_id": 0, @@ -579,7 +1230,17 @@ "params": { "desc": "I#59=SPI2_DMA" }, - "ts": 0.000718025 + "ts": 0.0007398 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#59=SPI2_DMA" + }, + "ts": 0.0007398 }, { "core_id": 0, @@ -589,7 +1250,17 @@ "params": { "desc": "I#60=SPI3_DMA" }, - "ts": 0.000730375 + "ts": 0.000752125 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#60=SPI3_DMA" + }, + "ts": 0.000752125 }, { "core_id": 0, @@ -599,7 +1270,17 @@ "params": { "desc": "I#61=WDT" }, - "ts": 0.0007413 + "ts": 0.000763075 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#61=WDT" + }, + "ts": 0.000763075 }, { "core_id": 0, @@ -609,7 +1290,17 @@ "params": { "desc": "I#62=TIMER1" }, - "ts": 0.00076165 + "ts": 0.000783475 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#62=TIMER1" + }, + "ts": 0.000783475 }, { "core_id": 0, @@ -619,7 +1310,17 @@ "params": { "desc": "I#63=TIMER2" }, - "ts": 0.000773525 + "ts": 0.000795 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#63=TIMER2" + }, + "ts": 0.000795 }, { "core_id": 0, @@ -629,7 +1330,17 @@ "params": { "desc": "I#64=TG0_T0_EDGE" }, - "ts": 0.000786275 + "ts": 0.000808 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#64=TG0_T0_EDGE" + }, + "ts": 0.000808 }, { "core_id": 0, @@ -639,7 +1350,17 @@ "params": { "desc": "I#65=TG0_T1_EDGE" }, - "ts": 0.000806925 + "ts": 0.0008249 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#65=TG0_T1_EDGE" + }, + "ts": 0.0008249 }, { "core_id": 0, @@ -649,7 +1370,17 @@ "params": { "desc": "I#66=TG0_WDT_EDGE" }, - "ts": 0.00081995 + "ts": 0.00084165 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#66=TG0_WDT_EDGE" + }, + "ts": 0.00084165 }, { "core_id": 0, @@ -659,7 +1390,17 @@ "params": { "desc": "I#67=TG0_LACT_EDGE" }, - "ts": 0.000837025 + "ts": 0.000858925 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#67=TG0_LACT_EDGE" + }, + "ts": 0.000858925 }, { "core_id": 0, @@ -669,7 +1410,17 @@ "params": { "desc": "I#68=TG1_T0_EDGE" }, - "ts": 0.000850025 + "ts": 0.00087175 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#68=TG1_T0_EDGE" + }, + "ts": 0.00087175 }, { "core_id": 0, @@ -679,7 +1430,17 @@ "params": { "desc": "I#69=TG1_T1_EDGE" }, - "ts": 0.000863125 + "ts": 0.0008844 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#69=TG1_T1_EDGE" + }, + "ts": 0.0008844 }, { "core_id": 0, @@ -689,7 +1450,17 @@ "params": { "desc": "I#70=TG1_WDT_EDGE" }, - "ts": 0.000880425 + "ts": 0.00090155 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#70=TG1_WDT_EDGE" + }, + "ts": 0.00090155 }, { "core_id": 0, @@ -699,7 +1470,17 @@ "params": { "desc": "I#71=TG1_LACT_EDGE" }, - "ts": 0.00089375 + "ts": 0.00091485 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#71=TG1_LACT_EDGE" + }, + "ts": 0.00091485 }, { "core_id": 0, @@ -709,7 +1490,17 @@ "params": { "desc": "I#72=MMU_IA" }, - "ts": 0.00090935 + "ts": 0.00093035 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#72=MMU_IA" + }, + "ts": 0.00093035 }, { "core_id": 0, @@ -719,7 +1510,17 @@ "params": { "desc": "I#73=MPU_IA" }, - "ts": 0.000925 + "ts": 0.000941925 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#73=MPU_IA" + }, + "ts": 0.000941925 }, { "core_id": 0, @@ -729,17 +1530,37 @@ "params": { "desc": "I#74=CACHE_IA" }, - "ts": 0.000937125 + "ts": 0.00095815 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 14, + "in_irq": false, + "params": { + "desc": "I#74=CACHE_IA" + }, + "ts": 0.00095815 }, { "core_id": 0, "ctx_name": "IDLE1", - "id": 13, + "id": 12, "in_irq": false, "params": { - "time": 10000 + "cycles": 2739609 }, - "ts": 0.0009454 + "ts": 0.00096865 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 12, + "in_irq": false, + "params": { + "cycles": 2739609 + }, + "ts": 0.00096865 }, { "core_id": 0, @@ -749,9 +1570,21 @@ "params": { "name": "ipc0", "prio": 24, - "tid": 12253204 + "tid": 12252316 }, - "ts": 0.0010603 + "ts": 0.0010845 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 9, + "in_irq": false, + "params": { + "name": "ipc0", + "prio": 24, + "tid": 12252316 + }, + "ts": 0.0010845 }, { "core_id": 0, @@ -759,12 +1592,25 @@ "id": 21, "in_irq": false, "params": { - "base": 1073410064, - "sz": 1344, - "tid": 12253204, + "base": 1073409176, + "sz": 1352, + "tid": 12252316, "unused": 0 }, - "ts": 0.00106555 + "ts": 0.001089775 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 21, + "in_irq": false, + "params": { + "base": 1073409176, + "sz": 1352, + "tid": 12252316, + "unused": 0 + }, + "ts": 0.001089775 }, { "core_id": 0, @@ -774,9 +1620,21 @@ "params": { "name": "ipc1", "prio": 24, - "tid": 12253560 + "tid": 12254724 }, - "ts": 0.00117445 + "ts": 0.00119535 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 9, + "in_irq": false, + "params": { + "name": "ipc1", + "prio": 24, + "tid": 12254724 + }, + "ts": 0.00119535 }, { "core_id": 0, @@ -784,12 +1642,25 @@ "id": 21, "in_irq": false, "params": { - "base": 1073431024, + "base": 1073411584, "sz": 1344, - "tid": 12253560, + "tid": 12254724, "unused": 0 }, - "ts": 0.001179775 + "ts": 0.0012008 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 21, + "in_irq": false, + "params": { + "base": 1073411584, + "sz": 1344, + "tid": 12254724, + "unused": 0 + }, + "ts": 0.0012008 }, { "core_id": 0, @@ -799,9 +1670,21 @@ "params": { "name": "main", "prio": 1, - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.001331775 + "ts": 0.001388725 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 9, + "in_irq": false, + "params": { + "name": "main", + "prio": 1, + "tid": 12274964 + }, + "ts": 0.001388725 }, { "core_id": 0, @@ -809,12 +1692,25 @@ "id": 21, "in_irq": false, "params": { - "base": 1073433076, - "sz": 1916, - "tid": 12254080, + "base": 1073429776, + "sz": 2400, + "tid": 12274964, "unused": 0 }, - "ts": 0.00133715 + "ts": 0.001394 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 21, + "in_irq": false, + "params": { + "base": 1073429776, + "sz": 2400, + "tid": 12274964, + "unused": 0 + }, + "ts": 0.001394 }, { "core_id": 0, @@ -824,7 +1720,17 @@ "params": { "mod_cnt": 0 }, - "ts": 0.00134445 + "ts": 0.001401225 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 27, + "in_irq": false, + "params": { + "mod_cnt": 0 + }, + "ts": 0.001401225 }, { "core_id": 1, @@ -834,7 +1740,7 @@ "params": { "irq_num": 5 }, - "ts": 0.001351275 + "ts": 0.001407975 }, { "core_id": 0, @@ -844,7 +1750,7 @@ "params": { "irq_num": 5 }, - "ts": 0.00136285 + "ts": 0.0014197 }, { "core_id": 1, @@ -852,7 +1758,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0013738 + "ts": 0.001430725 }, { "core_id": 0, @@ -860,9 +1766,19 @@ "id": 6, "in_irq": true, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.00138475 + "ts": 0.001441675 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 6, + "in_irq": false, + "params": { + "tid": 12274964 + }, + "ts": 0.001441675 }, { "core_id": 0, @@ -870,7 +1786,7 @@ "id": 3, "in_irq": false, "params": {}, - "ts": 0.00139985 + "ts": 0.00145695 }, { "core_id": 1, @@ -878,7 +1794,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.00141065 + "ts": 0.001467975 }, { "core_id": 0, @@ -888,7 +1804,17 @@ "params": { "irq_num": 30 }, - "ts": 0.001422175 + "ts": 0.001479225 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.001490125 }, { "core_id": 0, @@ -896,7 +1822,15 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.001433675 + "ts": 0.001501375 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.001512375 }, { "core_id": 0, @@ -904,9 +1838,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.001450025 + "ts": 0.001523775 }, { "core_id": 0, @@ -918,17 +1852,55 @@ "evt_off": 512, "mod_id": 0 }, - "ts": 0.0014769 + "ts": 0.0015543 }, { - "addr": "0x3ffb70d8", + "core_id": 1, + "ctx_name": "IDLE1", + "id": 22, + "in_irq": false, + "params": { + "desc": "M=ESP32 SystemView Heap Tracing Module", + "evt_off": 512, + "mod_id": 0 + }, + "ts": 0.0015543 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.001566225 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.00157755 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 3, + "in_irq": false, + "params": {}, + "ts": 0.00159325 + }, + { + "addr": "0x3ffb68a0", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6bef", - "0x400e693b", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3caf", + "0x400e3898", + "0x400880dc", "0x0", "0x0", "0x0", @@ -939,61 +1911,17 @@ "id": 512, "in_irq": false, "size": 8, - "ts": 0.001532525 + "ts": 0.0016508 }, { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.001666425 - }, - { - "core_id": 1, - "ctx_name": "IDLE1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.00167985 - }, - { - "core_id": 1, - "ctx_name": "IDLE1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.001696525 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.00183355 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 3, - "in_irq": false, - "params": {}, - "ts": 0.001848925 - }, - { - "addr": "0x3ffb70e8", + "addr": "0x3ffb68b0", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b304", - "0x400d6c38", - "0x400e693b", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a610", + "0x400d3cf8", + "0x400e3898", + "0x400880dc", "0x0", "0x0", "0x0", @@ -1004,17 +1932,17 @@ "id": 512, "in_irq": false, "size": 2500, - "ts": 0.001870025 + "ts": 0.00195255 }, { - "addr": "0x3ffb7aec", + "addr": "0x3ffb72b4", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b30f", - "0x400d6c38", - "0x400e693b", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a61b", + "0x400d3cf8", + "0x400e3898", + "0x400880dc", "0x0", "0x0", "0x0", @@ -1025,7 +1953,7 @@ "id": 512, "in_irq": false, "size": 340, - "ts": 0.001909875 + "ts": 0.00199345 }, { "core_id": 0, @@ -1033,9 +1961,9 @@ "id": 8, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.00193255 + "ts": 0.002024125 }, { "core_id": 0, @@ -1045,9 +1973,21 @@ "params": { "name": "alloc0", "prio": 5, - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.001945175 + "ts": 0.002036775 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 9, + "in_irq": false, + "params": { + "name": "alloc0", + "prio": 5, + "tid": 12284596 + }, + "ts": 0.002036775 }, { "core_id": 0, @@ -1055,12 +1995,25 @@ "id": 21, "in_irq": false, "params": { - "base": 1073443048, - "sz": 4294965096, - "tid": 12286700, + "base": 1073440944, + "sz": 4294965088, + "tid": 12284596, "unused": 0 }, - "ts": 0.001954275 + "ts": 0.0020459 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 21, + "in_irq": false, + "params": { + "base": 1073440944, + "sz": 4294965088, + "tid": 12284596, + "unused": 0 + }, + "ts": 0.0020459 }, { "core_id": 0, @@ -1068,9 +2021,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.001964975 + "ts": 0.002056625 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 6, + "in_irq": false, + "params": { + "tid": 12284596 + }, + "ts": 0.002056625 }, { "core_id": 0, @@ -1080,7 +2043,7 @@ "params": { "irq_num": 30 }, - "ts": 0.001980675 + "ts": 0.002072325 }, { "core_id": 0, @@ -1088,7 +2051,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.001992175 + "ts": 0.002083675 }, { "core_id": 0, @@ -1096,18 +2059,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.00200865 + "ts": 0.002100025 }, { - "addr": "0x3ffb7c50", + "addr": "0x3ffb7418", "callers": [ - "0x40081fef", - "0x40089414", - "0x40088679", - "0x400d6aa4", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x400879c1", + "0x400d3b64", + "0x400880dc", "0x0", "0x0", "0x0", @@ -1119,7 +2082,7 @@ "id": 512, "in_irq": false, "size": 124, - "ts": 0.002044025 + "ts": 0.002144425 }, { "core_id": 0, @@ -1131,16 +2094,16 @@ "uxItemSize": 4, "uxQueueLength": 10 }, - "ts": 0.002058325 + "ts": 0.002158725 }, { - "addr": "0x3ffb7cd0", + "addr": "0x3ffb7498", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b304", - "0x400d6ae0", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a610", + "0x400d3ba0", + "0x400880dc", "0x0", "0x0", "0x0", @@ -1152,16 +2115,16 @@ "id": 512, "in_irq": false, "size": 2500, - "ts": 0.00211355 + "ts": 0.00221895 }, { - "addr": "0x3ffb86d4", + "addr": "0x3ffb7e9c", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b30f", - "0x400d6ae0", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a61b", + "0x400d3ba0", + "0x400880dc", "0x0", "0x0", "0x0", @@ -1173,7 +2136,7 @@ "id": 512, "in_irq": false, "size": 340, - "ts": 0.00214795 + "ts": 0.0022544 }, { "core_id": 0, @@ -1181,9 +2144,9 @@ "id": 8, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.00217465 + "ts": 0.0022811 }, { "core_id": 0, @@ -1193,9 +2156,21 @@ "params": { "name": "free0", "prio": 5, - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.00218715 + "ts": 0.002293625 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 9, + "in_irq": false, + "params": { + "name": "free0", + "prio": 5, + "tid": 12287644 + }, + "ts": 0.002293625 }, { "core_id": 0, @@ -1203,12 +2178,25 @@ "id": 21, "in_irq": false, "params": { - "base": 1073446096, - "sz": 4294965088, - "tid": 12289748, + "base": 1073443992, + "sz": 4294965096, + "tid": 12287644, "unused": 0 }, - "ts": 0.0021963 + "ts": 0.0023028 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 21, + "in_irq": false, + "params": { + "base": 1073443992, + "sz": 4294965096, + "tid": 12287644, + "unused": 0 + }, + "ts": 0.0023028 }, { "core_id": 0, @@ -1216,9 +2204,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.002207125 + "ts": 0.00231365 + }, + { + "core_id": 1, + "ctx_name": "IDLE1", + "id": 6, + "in_irq": false, + "params": { + "tid": 12287644 + }, + "ts": 0.00231365 }, { "core_id": 1, @@ -1228,7 +2226,7 @@ "params": { "irq_num": 31 }, - "ts": 0.0022225 + "ts": 0.002329 }, { "core_id": 1, @@ -1236,16 +2234,16 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0022354 + "ts": 0.002342325 }, { - "addr": "0x3ffb8838", + "addr": "0x3ffb8000", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -1257,7 +2255,7 @@ "id": 512, "in_irq": false, "size": 1, - "ts": 0.0022518 + "ts": 0.002359325 }, { "core_id": 1, @@ -1265,9 +2263,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.0022631 + "ts": 0.00237075 }, { "core_id": 1, @@ -1277,16 +2275,16 @@ "params": { "irq_num": 31 }, - "ts": 0.002293125 + "ts": 0.002400875 }, { - "addr": "0x3ffb8848", + "addr": "0x3ffb8010", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -1298,7 +2296,7 @@ "id": 512, "in_irq": false, "size": 2, - "ts": 0.00230405 + "ts": 0.002412175 }, { "core_id": 1, @@ -1306,7 +2304,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.002315125 + "ts": 0.00242375 }, { "core_id": 0, @@ -1316,10 +2314,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.002327775 + "ts": 0.002436 }, { "core_id": 1, @@ -1327,99 +2325,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.002338225 - }, - { - "core_id": 0, - "ctx_name": "alloc0", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12283904, - "xTicksToWait": 0 - }, - "ts": 0.0023724 - }, - { - "core_id": 0, - "ctx_name": "alloc0", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (310) example: Task[0x3ffb7aec]: allocated 2 bytes @ 0x3ffb8848\n", - "ts": 0.002611675 - }, - { - "core_id": 0, - "ctx_name": "alloc0", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (310) example: Task[0x3ffb7aec]: allocated 2 bytes @ 0x3ffb8848\n", - "ts": 0.002611675 - }, - { - "core_id": 0, - "ctx_name": "alloc0", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12287056, - "xTicksToWait": 0 - }, - "ts": 0.00263325 - }, - { - "core_id": 0, - "ctx_name": "alloc0", - "id": 6, - "in_irq": false, - "params": { - "tid": 12289748 - }, - "ts": 0.002646375 - }, - { - "core_id": 1, - "ctx_name": "FROM_CPU1", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 31 - }, - "ts": 0.002662575 - }, - { - "core_id": 0, - "ctx_name": "alloc0", - "id": 34, - "in_irq": false, - "params": { - "xTicksToDelay": 30 - }, - "ts": 0.00267345 - }, - { - "core_id": 1, - "ctx_name": "free0", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.002684225 - }, - { - "core_id": 0, - "ctx_name": "FROM_CPU0", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 30 - }, - "ts": 0.0026984 + "ts": 0.002447 }, { "core_id": 1, @@ -1429,7 +2335,153 @@ "params": { "irq_num": 5 }, - "ts": 0.00270915 + "ts": 0.002462975 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.002476525 + }, + { + "core_id": 0, + "ctx_name": "alloc0", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12281672, + "xTicksToWait": 0 + }, + "ts": 0.002487925 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.002499075 + }, + { + "core_id": 0, + "ctx_name": "alloc0", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (297) example: Task[0x3ffb72b4]: allocated 2 bytes @ 0x3ffb8010\n", + "ts": 0.00274865 + }, + { + "core_id": 0, + "ctx_name": "alloc0", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (297) example: Task[0x3ffb72b4]: allocated 2 bytes @ 0x3ffb8010\n", + "ts": 0.00274865 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.002765925 + }, + { + "core_id": 0, + "ctx_name": "alloc0", + "id": 3, + "in_irq": false, + "params": {}, + "ts": 0.0027813 + }, + { + "core_id": 0, + "ctx_name": "alloc0", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12284952, + "xTicksToWait": 0 + }, + "ts": 0.00279535 + }, + { + "core_id": 0, + "ctx_name": "alloc0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12287644 + }, + "ts": 0.00280855 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12287644 + }, + "ts": 0.00280855 + }, + { + "core_id": 1, + "ctx_name": "FROM_CPU1", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 31 + }, + "ts": 0.0028248 + }, + { + "core_id": 0, + "ctx_name": "alloc0", + "id": 34, + "in_irq": false, + "params": { + "xTicksToDelay": 30 + }, + "ts": 0.00283575 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.00284645 + }, + { + "core_id": 0, + "ctx_name": "FROM_CPU0", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 30 + }, + "ts": 0.002860225 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 4, + "in_irq": false, + "params": { + "tid": 12287644 + }, + "ts": 0.002870975 }, { "core_id": 0, @@ -1437,35 +2489,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.002720075 - }, - { - "core_id": 1, - "ctx_name": "free0", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.002731625 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 4, - "in_irq": false, - "params": { - "tid": 12254080 - }, - "ts": 0.0027421 - }, - { - "core_id": 1, - "ctx_name": "free0", - "id": 4, - "in_irq": false, - "params": { - "tid": 12289748 - }, - "ts": 0.0027596 + "ts": 0.002881775 }, { "core_id": 1, @@ -1475,20 +2499,30 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 4294967295 }, - "ts": 0.00277655 + "ts": 0.002893725 }, { - "addr": "0x3ffb8858", + "core_id": 0, + "ctx_name": "main", + "id": 4, + "in_irq": false, + "params": { + "tid": 12274964 + }, + "ts": 0.00290445 + }, + { + "addr": "0x3ffb8020", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6bef", - "0x400e693b", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3caf", + "0x400e3898", + "0x400880dc", "0x0", "0x0", "0x0", @@ -1499,7 +2533,7 @@ "id": 512, "in_irq": false, "size": 8, - "ts": 0.00278805 + "ts": 0.00294385 }, { "core_id": 1, @@ -1509,38 +2543,20 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.002824 + "ts": 0.002956 }, { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.002835875 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 3, - "in_irq": false, - "params": {}, - "ts": 0.00285125 - }, - { - "addr": "0x3ffb8868", + "addr": "0x3ffb8030", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b304", - "0x400d6c38", - "0x400e693b", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a610", + "0x400d3cf8", + "0x400e3898", + "0x400880dc", "0x0", "0x0", "0x0", @@ -1551,7 +2567,7 @@ "id": 512, "in_irq": false, "size": 2500, - "ts": 0.002863625 + "ts": 0.00299065 }, { "core_id": 1, @@ -1561,20 +2577,20 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.002878375 + "ts": 0.003010625 }, { - "addr": "0x3ffb926c", + "addr": "0x3ffb8a34", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b30f", - "0x400d6c38", - "0x400e693b", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a61b", + "0x400d3cf8", + "0x400e3898", + "0x400880dc", "0x0", "0x0", "0x0", @@ -1585,7 +2601,7 @@ "id": 512, "in_irq": false, "size": 340, - "ts": 0.002905675 + "ts": 0.003033925 }, { "core_id": 0, @@ -1593,9 +2609,9 @@ "id": 8, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.002928325 + "ts": 0.00305665 }, { "core_id": 0, @@ -1605,9 +2621,21 @@ "params": { "name": "alloc1", "prio": 5, - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.002941 + "ts": 0.00306935 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 9, + "in_irq": false, + "params": { + "name": "alloc1", + "prio": 5, + "tid": 12290612 + }, + "ts": 0.00306935 }, { "core_id": 0, @@ -1615,12 +2643,25 @@ "id": 21, "in_irq": false, "params": { - "base": 1073449064, - "sz": 4294965096, - "tid": 12292716, + "base": 1073446960, + "sz": 4294965088, + "tid": 12290612, "unused": 0 }, - "ts": 0.00295 + "ts": 0.0030784 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 21, + "in_irq": false, + "params": { + "base": 1073446960, + "sz": 4294965088, + "tid": 12290612, + "unused": 0 + }, + "ts": 0.0030784 }, { "core_id": 0, @@ -1628,9 +2669,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.0029609 + "ts": 0.0030893 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12290612 + }, + "ts": 0.0030893 }, { "core_id": 0, @@ -1640,7 +2691,7 @@ "params": { "irq_num": 30 }, - "ts": 0.002976625 + "ts": 0.00310495 }, { "core_id": 0, @@ -1648,7 +2699,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.002988 + "ts": 0.0031163 }, { "core_id": 0, @@ -1656,18 +2707,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.00300485 + "ts": 0.003132675 }, { - "addr": "0x3ffb93d0", + "addr": "0x3ffb8b98", "callers": [ - "0x40081fef", - "0x40089414", - "0x40088679", - "0x400d6aa4", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x400879c1", + "0x400d3b64", + "0x400880dc", "0x0", "0x0", "0x0", @@ -1679,7 +2730,7 @@ "id": 512, "in_irq": false, "size": 124, - "ts": 0.0030403 + "ts": 0.00316915 }, { "core_id": 0, @@ -1691,16 +2742,16 @@ "uxItemSize": 4, "uxQueueLength": 10 }, - "ts": 0.0030546 + "ts": 0.00318345 }, { - "addr": "0x3ffb9450", + "addr": "0x3ffb8c18", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b304", - "0x400d6ae0", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a610", + "0x400d3ba0", + "0x400880dc", "0x0", "0x0", "0x0", @@ -1712,16 +2763,16 @@ "id": 512, "in_irq": false, "size": 2500, - "ts": 0.00309395 + "ts": 0.00322385 }, { - "addr": "0x3ffb9e54", + "addr": "0x3ffb961c", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b30f", - "0x400d6ae0", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a61b", + "0x400d3ba0", + "0x400880dc", "0x0", "0x0", "0x0", @@ -1733,7 +2784,7 @@ "id": 512, "in_irq": false, "size": 340, - "ts": 0.00312835 + "ts": 0.0032594 }, { "core_id": 0, @@ -1741,9 +2792,9 @@ "id": 8, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.0031551 + "ts": 0.003286175 }, { "core_id": 0, @@ -1753,9 +2804,21 @@ "params": { "name": "free1", "prio": 5, - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.0031676 + "ts": 0.003298675 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 9, + "in_irq": false, + "params": { + "name": "free1", + "prio": 5, + "tid": 12293660 + }, + "ts": 0.003298675 }, { "core_id": 0, @@ -1763,12 +2826,25 @@ "id": 21, "in_irq": false, "params": { - "base": 1073452112, - "sz": 4294965088, - "tid": 12295764, + "base": 1073450008, + "sz": 4294965096, + "tid": 12293660, "unused": 0 }, - "ts": 0.003176775 + "ts": 0.003307875 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 21, + "in_irq": false, + "params": { + "base": 1073450008, + "sz": 4294965096, + "tid": 12293660, + "unused": 0 + }, + "ts": 0.003307875 }, { "core_id": 0, @@ -1776,18 +2852,28 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.003187575 + "ts": 0.0033187 }, { - "addr": "0x3ffb9fb8", + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12293660 + }, + "ts": 0.0033187 + }, + { + "addr": "0x3ffb9780", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -1799,16 +2885,16 @@ "id": 512, "in_irq": false, "size": 2, - "ts": 0.0032237 + "ts": 0.00335585 }, { - "addr": "0x3ffb9fc8", + "addr": "0x3ffb9790", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -1820,7 +2906,7 @@ "id": 512, "in_irq": false, "size": 4, - "ts": 0.0032581 + "ts": 0.003391275 }, { "core_id": 0, @@ -1830,10 +2916,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.003275 + "ts": 0.003408225 }, { "core_id": 0, @@ -1843,10 +2929,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.003296925 + "ts": 0.0034283 }, { "core_id": 1, @@ -1854,8 +2940,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (310) example: Task[0x3ffb86d4]: free memory @ 0x3ffb8848\n", - "ts": 0.00333965 + "msg": "I (298) example: Task[0x3ffb7e9c]: free memory @ 0x3ffb8010\n", + "ts": 0.0034843 }, { "core_id": 1, @@ -1863,8 +2949,26 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (310) example: Task[0x3ffb86d4]: free memory @ 0x3ffb8848\n", - "ts": 0.00333965 + "msg": "I (298) example: Task[0x3ffb7e9c]: free memory @ 0x3ffb8010\n", + "ts": 0.0034843 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.0035038 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.003517225 }, { "core_id": 1, @@ -1874,7 +2978,25 @@ "params": { "irq_num": 31 }, - "ts": 0.0033598 + "ts": 0.003529075 + }, + { + "core_id": 0, + "ctx_name": "alloc1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (298) example: Task[0x3ffb8a34]: allocated 4 bytes @ 0x3ffb9790\n", + "ts": 0.0035488 + }, + { + "core_id": 0, + "ctx_name": "alloc1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (298) example: Task[0x3ffb8a34]: allocated 4 bytes @ 0x3ffb9790\n", + "ts": 0.0035488 }, { "core_id": 1, @@ -1882,7 +3004,17 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.00337125 + "ts": 0.003560325 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.003571875 }, { "core_id": 1, @@ -1890,47 +3022,34 @@ "id": 4, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.003388225 + "ts": 0.00358275 }, { "core_id": 0, "ctx_name": "alloc1", - "id": 26, + "id": 18, "in_irq": false, - "lvl": 0, - "msg": "I (311) example: Task[0x3ffb926c]: allocated 4 bytes @ 0x3ffb9fc8\n", - "ts": 0.00340705 + "params": {}, + "ts": 0.003598 }, { "core_id": 0, "ctx_name": "alloc1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (311) example: Task[0x3ffb926c]: allocated 4 bytes @ 0x3ffb9fc8\n", - "ts": 0.00340705 - }, - { - "core_id": 0, - "ctx_name": "alloc1", - "id": 53, + "id": 4, "in_irq": false, "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12293072, - "xTicksToWait": 0 + "tid": 12290612 }, - "ts": 0.00342115 + "ts": 0.00361455 }, { - "addr": "0x3ffb8848", + "addr": "0x3ffb8010", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -1944,7 +3063,20 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.0034343 + "ts": 0.00362625 + }, + { + "core_id": 0, + "ctx_name": "alloc1", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12290968, + "xTicksToWait": 0 + }, + "ts": 0.003637375 }, { "core_id": 0, @@ -1954,7 +3086,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.003446125 + "ts": 0.00365135 }, { "core_id": 0, @@ -1964,7 +3096,7 @@ "params": { "irq_num": 30 }, - "ts": 0.0034648 + "ts": 0.0036711 }, { "core_id": 0, @@ -1972,7 +3104,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.00347875 + "ts": 0.003685125 }, { "core_id": 1, @@ -1982,7 +3114,7 @@ "params": { "irq_num": 31 }, - "ts": 0.003492825 + "ts": 0.003699025 }, { "core_id": 0, @@ -1990,9 +3122,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.003504725 + "ts": 0.0037109 }, { "core_id": 1, @@ -2000,7 +3132,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0035156 + "ts": 0.003721925 }, { "core_id": 1, @@ -2008,19 +3140,19 @@ "id": 4, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.00353485 + "ts": 0.00374125 }, { - "addr": "0x3ffb8848", + "addr": "0x3ffb8010", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6bef", - "0x400e693b", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3caf", + "0x400e3898", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2031,7 +3163,7 @@ "id": 512, "in_irq": false, "size": 8, - "ts": 0.003547175 + "ts": 0.00375485 }, { "core_id": 1, @@ -2041,10 +3173,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 4294967295 }, - "ts": 0.003564225 + "ts": 0.00377185 }, { "core_id": 1, @@ -2054,20 +3186,33 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.0035829 + "ts": 0.00379015 }, { - "addr": "0x3ffb9fd8", + "core_id": 1, + "ctx_name": "free1", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12281672, + "xTicksToWait": 0 + }, + "ts": 0.003809225 + }, + { + "addr": "0x3ffb97a0", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b304", - "0x400d6c38", - "0x400e693b", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a610", + "0x400d3cf8", + "0x400e3898", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2078,30 +3223,35 @@ "id": 512, "in_irq": false, "size": 2500, - "ts": 0.003600675 + "ts": 0.003820975 }, { "core_id": 1, "ctx_name": "free1", - "id": 53, + "id": 26, "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12283904, - "xTicksToWait": 0 - }, - "ts": 0.0036134 + "lvl": 0, + "msg": "I (299) example: Task[0x3ffb961c]: free memory @ 0x3ffb9790\n", + "ts": 0.0038621 }, { - "addr": "0x3ffba9dc", + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (299) example: Task[0x3ffb961c]: free memory @ 0x3ffb9790\n", + "ts": 0.0038621 + }, + { + "addr": "0x3ffba1a4", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b30f", - "0x400d6c38", - "0x400e693b", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a61b", + "0x400d3cf8", + "0x400e3898", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2112,123 +3262,14 @@ "id": 512, "in_irq": false, "size": 340, - "ts": 0.003639925 + "ts": 0.003874025 }, { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (311) example: Task[0x3ffb9e54]: free memory @ 0x3ffb9fc8\n", - "ts": 0.003663425 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (311) example: Task[0x3ffb9e54]: free memory @ 0x3ffb9fc8\n", - "ts": 0.003663425 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 8, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.0036748 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.003691 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 9, - "in_irq": false, - "params": { - "name": "alloc2", - "prio": 5, - "tid": 12298716 - }, - "ts": 0.003703775 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 21, - "in_irq": false, - "params": { - "base": 1073455064, - "sz": 4294965096, - "tid": 12298716, - "unused": 0 - }, - "ts": 0.00371475 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 6, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.00372765 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.0037451 - }, - { - "core_id": 0, - "ctx_name": "FROM_CPU0", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 30 - }, - "ts": 0.00375595 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 4, - "in_irq": false, - "params": { - "tid": 12295764 - }, - "ts": 0.003766625 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.003777475 - }, - { - "addr": "0x3ffb9fc8", + "addr": "0x3ffb9790", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2242,17 +3283,105 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.003792825 + "ts": 0.003887625 }, { "core_id": 0, - "ctx_name": "alloc2", - "id": 4, + "ctx_name": "main", + "id": 8, "in_irq": false, "params": { - "tid": 12298716 + "tid": 12296612 }, - "ts": 0.00380445 + "ts": 0.00390345 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 9, + "in_irq": false, + "params": { + "name": "alloc2", + "prio": 5, + "tid": 12296612 + }, + "ts": 0.003918375 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 9, + "in_irq": false, + "params": { + "name": "alloc2", + "prio": 5, + "tid": 12296612 + }, + "ts": 0.003918375 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 21, + "in_irq": false, + "params": { + "base": 1073452960, + "sz": 4294965088, + "tid": 12296612, + "unused": 0 + }, + "ts": 0.00392955 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 21, + "in_irq": false, + "params": { + "base": 1073452960, + "sz": 4294965088, + "tid": 12296612, + "unused": 0 + }, + "ts": 0.00392955 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.003942575 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.003942575 + }, + { + "core_id": 0, + "ctx_name": "FROM_CPU0", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 30 + }, + "ts": 0.00396125 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.00397515 }, { "core_id": 1, @@ -2262,17 +3391,17 @@ "params": { "irq_num": 31 }, - "ts": 0.00382735 + "ts": 0.003989 }, { "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, + "ctx_name": "alloc2", + "id": 4, + "in_irq": false, "params": { - "irq_num": 5 + "tid": 12296612 }, - "ts": 0.003839325 + "ts": 0.003999875 }, { "core_id": 1, @@ -2280,15 +3409,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0038505 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 3, - "in_irq": false, - "params": {}, - "ts": 0.003862175 + "ts": 0.004011 }, { "core_id": 1, @@ -2296,16 +3417,16 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.00387205 + "ts": 0.00403305 }, { - "addr": "0x3ffbab40", + "addr": "0x3ffba308", "callers": [ - "0x40081fef", - "0x40089414", - "0x40088679", - "0x400d6aa4", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x400879c1", + "0x400d3b64", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2317,7 +3438,7 @@ "id": 512, "in_irq": false, "size": 124, - "ts": 0.0038881 + "ts": 0.004044725 }, { "core_id": 0, @@ -2329,16 +3450,16 @@ "uxItemSize": 4, "uxQueueLength": 10 }, - "ts": 0.003902475 + "ts": 0.00405925 }, { - "addr": "0x3ffbabc0", + "addr": "0x3ffba388", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b304", - "0x400d6ae0", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a610", + "0x400d3ba0", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2350,16 +3471,16 @@ "id": 512, "in_irq": false, "size": 2500, - "ts": 0.003941825 + "ts": 0.004099675 }, { - "addr": "0x3ffbb5c4", + "addr": "0x3ffbad8c", "callers": [ - "0x40081fef", - "0x40089414", - "0x4008b30f", - "0x400d6ae0", - "0x40088d94", + "0x40081eff", + "0x40088720", + "0x4008a61b", + "0x400d3ba0", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2371,7 +3492,7 @@ "id": 512, "in_irq": false, "size": 340, - "ts": 0.003976225 + "ts": 0.00413515 }, { "core_id": 0, @@ -2379,9 +3500,9 @@ "id": 8, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.0040022 + "ts": 0.004157725 }, { "core_id": 0, @@ -2391,9 +3512,21 @@ "params": { "name": "free2", "prio": 5, - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.0040147 + "ts": 0.0041703 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 9, + "in_irq": false, + "params": { + "name": "free2", + "prio": 5, + "tid": 12299660 + }, + "ts": 0.0041703 }, { "core_id": 0, @@ -2401,12 +3534,25 @@ "id": 21, "in_irq": false, "params": { - "base": 1073458112, - "sz": 4294965088, - "tid": 12301764, + "base": 1073456008, + "sz": 4294965096, + "tid": 12299660, "unused": 0 }, - "ts": 0.004023875 + "ts": 0.004183575 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 21, + "in_irq": false, + "params": { + "base": 1073456008, + "sz": 4294965096, + "tid": 12299660, + "unused": 0 + }, + "ts": 0.004183575 }, { "core_id": 0, @@ -2414,9 +3560,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.004034675 + "ts": 0.0041943 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.0041943 }, { "core_id": 1, @@ -2426,7 +3582,7 @@ "params": { "irq_num": 31 }, - "ts": 0.004050925 + "ts": 0.0042104 }, { "core_id": 1, @@ -2434,16 +3590,16 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.004063775 + "ts": 0.004223275 }, { - "addr": "0x3ffb9fc8", + "addr": "0x3ffb9790", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2455,7 +3611,7 @@ "id": 512, "in_irq": false, "size": 3, - "ts": 0.00407545 + "ts": 0.0042355 }, { "core_id": 1, @@ -2463,9 +3619,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.0040869 + "ts": 0.004248275 }, { "core_id": 1, @@ -2475,16 +3631,16 @@ "params": { "irq_num": 31 }, - "ts": 0.004113275 + "ts": 0.004274675 }, { - "addr": "0x3ffbb728", + "addr": "0x3ffbaef0", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2496,7 +3652,7 @@ "id": 512, "in_irq": false, "size": 6, - "ts": 0.004125025 + "ts": 0.004286525 }, { "core_id": 1, @@ -2504,7 +3660,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.00413645 + "ts": 0.0042977 }, { "core_id": 0, @@ -2514,10 +3670,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.004148425 + "ts": 0.004309925 }, { "core_id": 1, @@ -2525,7 +3681,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0041587 + "ts": 0.0043207 }, { "core_id": 0, @@ -2535,10 +3691,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.0041771 + "ts": 0.0043391 }, { "core_id": 0, @@ -2546,8 +3702,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (312) example: Task[0x3ffba9dc]: allocated 6 bytes @ 0x3ffbb728\n", - "ts": 0.0042294 + "msg": "I (299) example: Task[0x3ffba1a4]: allocated 6 bytes @ 0x3ffbaef0\n", + "ts": 0.00439165 }, { "core_id": 0, @@ -2555,8 +3711,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (312) example: Task[0x3ffba9dc]: allocated 6 bytes @ 0x3ffbb728\n", - "ts": 0.0042294 + "msg": "I (299) example: Task[0x3ffba1a4]: allocated 6 bytes @ 0x3ffbaef0\n", + "ts": 0.00439165 }, { "core_id": 0, @@ -2566,10 +3722,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 0 }, - "ts": 0.0042464 + "ts": 0.0044051 }, { "core_id": 0, @@ -2577,9 +3733,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.00425955 + "ts": 0.004418325 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.004418325 }, { "core_id": 1, @@ -2589,7 +3755,7 @@ "params": { "irq_num": 31 }, - "ts": 0.004275825 + "ts": 0.00443885 }, { "core_id": 0, @@ -2599,7 +3765,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.004286675 + "ts": 0.0044497 }, { "core_id": 1, @@ -2607,7 +3773,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.00429745 + "ts": 0.004460525 }, { "core_id": 0, @@ -2617,17 +3783,17 @@ "params": { "irq_num": 30 }, - "ts": 0.004311325 + "ts": 0.004474625 }, { "core_id": 1, - "ctx_name": "free2", - "id": 4, - "in_irq": false, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, "params": { - "tid": 12301764 + "irq_num": 5 }, - "ts": 0.004322125 + "ts": 0.00448535 }, { "core_id": 0, @@ -2635,7 +3801,48 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.004332975 + "ts": 0.004496325 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.0045078 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 4, + "in_irq": false, + "params": { + "tid": 12274964 + }, + "ts": 0.004518275 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 4, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.004535 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 49, + "in_irq": false, + "params": { + "pvBuffer": 3233808384, + "xJustPeek": 0, + "xQueue": 12281672, + "xTicksToWait": 10 + }, + "ts": 0.0045472 }, { "core_id": 1, @@ -2645,10 +3852,68 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 4294967295 }, - "ts": 0.004344875 + "ts": 0.004559125 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.004570475 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 6, + "in_irq": true, + "params": { + "tid": 12274964 + }, + "ts": 0.004581575 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12274964 + }, + "ts": 0.004581575 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 39, + "in_irq": false, + "params": { + "pxMutexHolder": 1073433876 + }, + "ts": 0.004595225 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.0046103 + }, + { + "core_id": 1, + "ctx_name": "FROM_CPU1", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 31 + }, + "ts": 0.004620875 }, { "core_id": 0, @@ -2656,9 +3921,134 @@ "id": 4, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.00435545 + "ts": 0.00463185 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.004642525 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12281672, + "xTicksToWait": 0 + }, + "ts": 0.0046541 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.004665575 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 42, + "in_irq": false, + "params": { + "pxMutexHolder": 1073433876 + }, + "ts": 0.004680075 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 6, + "in_irq": false, + "params": { + "tid": 12274964 + }, + "ts": 0.004690775 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12274964 + }, + "ts": 0.004690775 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.00470455 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.00470455 + }, + { + "core_id": 1, + "ctx_name": "FROM_CPU1", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 31 + }, + "ts": 0.004720275 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.00473175 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (299) example: Wait notify 0\n", + "ts": 0.00474835 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (299) example: Wait notify 0\n", + "ts": 0.00474835 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 4, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.004759525 }, { "core_id": 1, @@ -2668,23 +4058,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.004367625 - }, - { - "core_id": 1, - "ctx_name": "free2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12283904, - "xTicksToWait": 0 - }, - "ts": 0.004394675 + "ts": 0.004776775 }, { "core_id": 0, @@ -2694,17 +4071,20 @@ "params": { "irq_num": 30 }, - "ts": 0.004405525 + "ts": 0.004787675 }, { "core_id": 1, "ctx_name": "free2", - "id": 6, + "id": 53, "in_irq": false, "params": { - "tid": 12254080 + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12281672, + "xTicksToWait": 0 }, - "ts": 0.0044172 + "ts": 0.0048 }, { "core_id": 0, @@ -2712,43 +4092,15 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.00442855 + "ts": 0.00481075 }, { "core_id": 0, "ctx_name": "main", - "id": 4, + "id": 17, "in_irq": false, - "params": { - "tid": 12254080 - }, - "ts": 0.004446675 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 49, - "in_irq": false, - "params": { - "pvBuffer": 3233808384, - "xJustPeek": 0, - "xQueue": 12283904, - "xTicksToWait": 10 - }, - "ts": 0.004461 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12283904, - "xTicksToWait": 0 - }, - "ts": 0.004477875 + "params": {}, + "ts": 0.00482835 }, { "core_id": 1, @@ -2756,8 +4108,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (312) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb728\n", - "ts": 0.004496725 + "msg": "I (299) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaef0\n", + "ts": 0.0048496 }, { "core_id": 1, @@ -2765,15 +4117,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (312) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb728\n", - "ts": 0.004496725 + "msg": "I (299) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaef0\n", + "ts": 0.0048496 }, { - "addr": "0x3ffbb728", + "addr": "0x3ffbaef0", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -2787,25 +4139,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.004524 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (312) example: Wait notify 0\n", - "ts": 0.004538425 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (312) example: Wait notify 0\n", - "ts": 0.004538425 + "ts": 0.004875275 }, { "core_id": 1, @@ -2815,7 +4149,7 @@ "params": { "irq_num": 31 }, - "ts": 0.004553625 + "ts": 0.004903 }, { "core_id": 1, @@ -2823,17 +4157,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0045677 - }, - { - "core_id": 0, - "ctx_name": "FROM_CPU0", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 30 - }, - "ts": 0.00458165 + "ts": 0.0049144 }, { "core_id": 1, @@ -2841,23 +4165,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0045921 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.004603225 - }, - { - "core_id": 0, - "ctx_name": "main", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.004619375 + "ts": 0.004930975 }, { "core_id": 1, @@ -2867,7 +4175,7 @@ "params": { "irq_num": 5 }, - "ts": 0.004666675 + "ts": 0.0054482 }, { "core_id": 1, @@ -2875,7 +4183,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0046801 + "ts": 0.005461725 }, { "core_id": 1, @@ -2883,7 +4191,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.00469525 + "ts": 0.0054773 }, { "core_id": 0, @@ -2893,7 +4201,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0048338 + "ts": 0.00554665 }, { "core_id": 0, @@ -2901,7 +4209,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.004849175 + "ts": 0.00556205 }, { "core_id": 0, @@ -2909,7 +4217,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.00486425 + "ts": 0.005577275 }, { "core_id": 1, @@ -2919,7 +4227,7 @@ "params": { "irq_num": 5 }, - "ts": 0.005666425 + "ts": 0.0064482 }, { "core_id": 1, @@ -2927,7 +4235,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.005680075 + "ts": 0.006461725 }, { "core_id": 1, @@ -2935,7 +4243,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.005695225 + "ts": 0.00647685 }, { "core_id": 0, @@ -2945,7 +4253,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0058338 + "ts": 0.00654665 }, { "core_id": 0, @@ -2953,7 +4261,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0058492 + "ts": 0.006562 }, { "core_id": 0, @@ -2961,7 +4269,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.005864425 + "ts": 0.006577075 }, { "core_id": 1, @@ -2971,7 +4279,7 @@ "params": { "irq_num": 5 }, - "ts": 0.006666425 + "ts": 0.0074482 }, { "core_id": 1, @@ -2979,7 +4287,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.00667995 + "ts": 0.007461725 }, { "core_id": 1, @@ -2987,7 +4295,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0066951 + "ts": 0.007476975 }, { "core_id": 0, @@ -2997,7 +4305,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0068338 + "ts": 0.00754665 }, { "core_id": 0, @@ -3005,7 +4313,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.006849175 + "ts": 0.007562025 }, { "core_id": 0, @@ -3013,7 +4321,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.00686425 + "ts": 0.007577225 }, { "core_id": 1, @@ -3023,7 +4331,7 @@ "params": { "irq_num": 5 }, - "ts": 0.007666425 + "ts": 0.0084482 }, { "core_id": 1, @@ -3031,7 +4339,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.007680075 + "ts": 0.008461775 }, { "core_id": 1, @@ -3039,7 +4347,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.00769535 + "ts": 0.0084769 }, { "core_id": 0, @@ -3049,7 +4357,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0078338 + "ts": 0.00854665 }, { "core_id": 0, @@ -3057,7 +4365,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.007849175 + "ts": 0.008562 }, { "core_id": 0, @@ -3065,7 +4373,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.00786425 + "ts": 0.008577075 }, { "core_id": 1, @@ -3075,7 +4383,7 @@ "params": { "irq_num": 5 }, - "ts": 0.008666425 + "ts": 0.0094482 }, { "core_id": 1, @@ -3083,7 +4391,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.00868 + "ts": 0.009461725 }, { "core_id": 1, @@ -3091,7 +4399,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.008695125 + "ts": 0.00947685 }, { "core_id": 0, @@ -3101,7 +4409,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0088338 + "ts": 0.00954665 }, { "core_id": 0, @@ -3109,7 +4417,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.008849175 + "ts": 0.00956205 }, { "core_id": 0, @@ -3117,7 +4425,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.008868 + "ts": 0.009577275 }, { "core_id": 1, @@ -3127,7 +4435,7 @@ "params": { "irq_num": 5 }, - "ts": 0.009666425 + "ts": 0.0104482 }, { "core_id": 1, @@ -3135,7 +4443,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.00967995 + "ts": 0.010461725 }, { "core_id": 1, @@ -3143,7 +4451,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0096951 + "ts": 0.01047685 }, { "core_id": 0, @@ -3153,7 +4461,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0098338 + "ts": 0.01054665 }, { "core_id": 0, @@ -3161,7 +4469,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.009849175 + "ts": 0.010562 }, { "core_id": 0, @@ -3169,7 +4477,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.00986425 + "ts": 0.010577075 }, { "core_id": 1, @@ -3179,7 +4487,7 @@ "params": { "irq_num": 5 }, - "ts": 0.010666425 + "ts": 0.0114482 }, { "core_id": 1, @@ -3187,7 +4495,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.010680075 + "ts": 0.011461725 }, { "core_id": 1, @@ -3195,7 +4503,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.01069535 + "ts": 0.011476975 }, { "core_id": 0, @@ -3205,7 +4513,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0108338 + "ts": 0.01154665 }, { "core_id": 0, @@ -3213,7 +4521,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.010849175 + "ts": 0.011562025 }, { "core_id": 0, @@ -3221,7 +4529,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.01086425 + "ts": 0.011577225 }, { "core_id": 1, @@ -3231,7 +4539,7 @@ "params": { "irq_num": 5 }, - "ts": 0.011666425 + "ts": 0.0124482 }, { "core_id": 1, @@ -3239,7 +4547,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.01168 + "ts": 0.012461725 }, { "core_id": 1, @@ -3247,7 +4555,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.011695125 + "ts": 0.012476975 }, { "core_id": 0, @@ -3257,7 +4565,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0118338 + "ts": 0.01254665 }, { "core_id": 0, @@ -3265,7 +4573,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.011849175 + "ts": 0.012562025 }, { "core_id": 0, @@ -3273,7 +4581,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.01186425 + "ts": 0.012577225 }, { "core_id": 1, @@ -3283,7 +4591,7 @@ "params": { "irq_num": 5 }, - "ts": 0.012666425 + "ts": 0.0134482 }, { "core_id": 1, @@ -3291,7 +4599,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.012680075 + "ts": 0.013461775 }, { "core_id": 1, @@ -3299,7 +4607,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.012695225 + "ts": 0.0134769 }, { "core_id": 0, @@ -3309,7 +4617,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0128338 + "ts": 0.01354665 }, { "core_id": 0, @@ -3317,7 +4625,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0128492 + "ts": 0.013562 }, { "core_id": 0, @@ -3325,7 +4633,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.012864425 + "ts": 0.013577075 }, { "core_id": 1, @@ -3335,7 +4643,7 @@ "params": { "irq_num": 5 }, - "ts": 0.013666425 + "ts": 0.0144482 }, { "core_id": 1, @@ -3343,7 +4651,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.01367995 + "ts": 0.014461725 }, { "core_id": 1, @@ -3351,7 +4659,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0136951 + "ts": 0.01447685 }, { "core_id": 0, @@ -3361,7 +4669,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0138338 + "ts": 0.01454665 }, { "core_id": 0, @@ -3369,7 +4677,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0138494 + "ts": 0.0145623 }, { "core_id": 0, @@ -3377,7 +4685,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0138645 + "ts": 0.0145775 }, { "core_id": 1, @@ -3387,7 +4695,7 @@ "params": { "irq_num": 5 }, - "ts": 0.014666425 + "ts": 0.0154482 }, { "core_id": 1, @@ -3395,7 +4703,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.014680075 + "ts": 0.015461725 }, { "core_id": 1, @@ -3403,7 +4711,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.01469535 + "ts": 0.01547685 }, { "core_id": 0, @@ -3413,7 +4721,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0148338 + "ts": 0.01554665 }, { "core_id": 0, @@ -3421,7 +4729,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.014849175 + "ts": 0.015562 }, { "core_id": 0, @@ -3429,7 +4737,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.01486425 + "ts": 0.015577075 }, { "core_id": 1, @@ -3439,7 +4747,7 @@ "params": { "irq_num": 5 }, - "ts": 0.015666425 + "ts": 0.0164482 }, { "core_id": 1, @@ -3447,7 +4755,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.01568 + "ts": 0.016461725 }, { "core_id": 1, @@ -3455,7 +4763,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.015695125 + "ts": 0.016476975 }, { "core_id": 0, @@ -3465,7 +4773,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0158338 + "ts": 0.01654665 }, { "core_id": 0, @@ -3473,7 +4781,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.015849175 + "ts": 0.016562025 }, { "core_id": 0, @@ -3481,7 +4789,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.01586425 + "ts": 0.016577225 }, { "core_id": 1, @@ -3491,7 +4799,7 @@ "params": { "irq_num": 5 }, - "ts": 0.016666425 + "ts": 0.0174482 }, { "core_id": 1, @@ -3499,7 +4807,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.016680075 + "ts": 0.017461775 }, { "core_id": 1, @@ -3507,7 +4815,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.016695225 + "ts": 0.0174769 }, { "core_id": 0, @@ -3517,7 +4825,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0168338 + "ts": 0.01754665 }, { "core_id": 0, @@ -3525,7 +4833,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0168492 + "ts": 0.017562 }, { "core_id": 0, @@ -3533,7 +4841,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.016864425 + "ts": 0.017577075 }, { "core_id": 1, @@ -3543,7 +4851,7 @@ "params": { "irq_num": 5 }, - "ts": 0.017666425 + "ts": 0.0184482 }, { "core_id": 1, @@ -3551,7 +4859,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.01767995 + "ts": 0.018461725 }, { "core_id": 1, @@ -3559,7 +4867,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0176951 + "ts": 0.01847685 }, { "core_id": 0, @@ -3569,7 +4877,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0178338 + "ts": 0.01854665 }, { "core_id": 0, @@ -3577,7 +4885,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.017849175 + "ts": 0.01856205 }, { "core_id": 0, @@ -3585,7 +4893,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.01786425 + "ts": 0.018577275 }, { "core_id": 1, @@ -3595,7 +4903,7 @@ "params": { "irq_num": 5 }, - "ts": 0.018666425 + "ts": 0.0194482 }, { "core_id": 1, @@ -3603,7 +4911,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.018680075 + "ts": 0.019461725 }, { "core_id": 1, @@ -3611,7 +4919,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.01869535 + "ts": 0.01947685 }, { "core_id": 0, @@ -3621,7 +4929,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0188338 + "ts": 0.01954665 }, { "core_id": 0, @@ -3629,7 +4937,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.018849175 + "ts": 0.019562 }, { "core_id": 0, @@ -3637,7 +4945,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.01886425 + "ts": 0.019577075 }, { "core_id": 1, @@ -3647,7 +4955,7 @@ "params": { "irq_num": 5 }, - "ts": 0.019666425 + "ts": 0.0204482 }, { "core_id": 1, @@ -3655,7 +4963,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.01968 + "ts": 0.020461725 }, { "core_id": 1, @@ -3663,7 +4971,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.019695125 + "ts": 0.020476975 }, { "core_id": 0, @@ -3673,7 +4981,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0198338 + "ts": 0.02054665 }, { "core_id": 0, @@ -3681,7 +4989,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.019849175 + "ts": 0.020562025 }, { "core_id": 0, @@ -3689,7 +4997,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.01986425 + "ts": 0.020577225 }, { "core_id": 1, @@ -3699,7 +5007,7 @@ "params": { "irq_num": 5 }, - "ts": 0.020666425 + "ts": 0.0214482 }, { "core_id": 1, @@ -3707,7 +5015,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.020680075 + "ts": 0.021461775 }, { "core_id": 1, @@ -3715,7 +5023,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.020695225 + "ts": 0.0214769 }, { "core_id": 0, @@ -3725,7 +5033,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0208338 + "ts": 0.02154665 }, { "core_id": 0, @@ -3733,7 +5041,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0208492 + "ts": 0.021562 }, { "core_id": 0, @@ -3741,7 +5049,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.020864425 + "ts": 0.021577075 }, { "core_id": 1, @@ -3751,7 +5059,7 @@ "params": { "irq_num": 5 }, - "ts": 0.021666425 + "ts": 0.0224482 }, { "core_id": 1, @@ -3759,7 +5067,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.021680075 + "ts": 0.022461725 }, { "core_id": 1, @@ -3767,7 +5075,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.02169535 + "ts": 0.02247685 }, { "core_id": 0, @@ -3777,7 +5085,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0218338 + "ts": 0.02254665 }, { "core_id": 0, @@ -3785,7 +5093,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.021849175 + "ts": 0.02256205 }, { "core_id": 0, @@ -3793,7 +5101,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.02186425 + "ts": 0.022577275 }, { "core_id": 1, @@ -3803,7 +5111,7 @@ "params": { "irq_num": 5 }, - "ts": 0.022666425 + "ts": 0.0234482 }, { "core_id": 1, @@ -3811,7 +5119,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.02268 + "ts": 0.023461725 }, { "core_id": 1, @@ -3819,7 +5127,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.022695125 + "ts": 0.02347685 }, { "core_id": 0, @@ -3829,7 +5137,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0228338 + "ts": 0.02354665 }, { "core_id": 0, @@ -3837,7 +5145,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.022849175 + "ts": 0.023562 }, { "core_id": 0, @@ -3845,7 +5153,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.02286425 + "ts": 0.023577075 }, { "core_id": 1, @@ -3855,7 +5163,7 @@ "params": { "irq_num": 5 }, - "ts": 0.023666425 + "ts": 0.0244482 }, { "core_id": 1, @@ -3863,7 +5171,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.023680075 + "ts": 0.024465975 }, { "core_id": 1, @@ -3871,7 +5179,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.023695225 + "ts": 0.024481125 }, { "core_id": 0, @@ -3881,7 +5189,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0238338 + "ts": 0.02454665 }, { "core_id": 0, @@ -3889,7 +5197,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0238492 + "ts": 0.024562 }, { "core_id": 0, @@ -3897,7 +5205,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.023864425 + "ts": 0.024577075 }, { "core_id": 1, @@ -3907,7 +5215,7 @@ "params": { "irq_num": 5 }, - "ts": 0.024666425 + "ts": 0.0254482 }, { "core_id": 1, @@ -3915,7 +5223,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.02467995 + "ts": 0.025461725 }, { "core_id": 1, @@ -3923,7 +5231,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0246951 + "ts": 0.02547685 }, { "core_id": 0, @@ -3933,7 +5241,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0248338 + "ts": 0.02554665 }, { "core_id": 0, @@ -3941,7 +5249,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.024849175 + "ts": 0.02556205 }, { "core_id": 0, @@ -3949,7 +5257,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.02486425 + "ts": 0.025577275 }, { "core_id": 1, @@ -3959,7 +5267,7 @@ "params": { "irq_num": 5 }, - "ts": 0.025666425 + "ts": 0.0264482 }, { "core_id": 1, @@ -3967,7 +5275,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.025680075 + "ts": 0.026461725 }, { "core_id": 1, @@ -3975,7 +5283,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.02569535 + "ts": 0.02647685 }, { "core_id": 0, @@ -3985,7 +5293,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0258338 + "ts": 0.02654665 }, { "core_id": 0, @@ -3993,7 +5301,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.025849175 + "ts": 0.026562 }, { "core_id": 0, @@ -4001,7 +5309,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.02586425 + "ts": 0.026577075 }, { "core_id": 1, @@ -4011,7 +5319,7 @@ "params": { "irq_num": 5 }, - "ts": 0.026666425 + "ts": 0.0274482 }, { "core_id": 1, @@ -4019,7 +5327,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.02668 + "ts": 0.027461725 }, { "core_id": 1, @@ -4027,7 +5335,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.026695125 + "ts": 0.027476975 }, { "core_id": 0, @@ -4037,7 +5345,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0268338 + "ts": 0.02754665 }, { "core_id": 0, @@ -4045,7 +5353,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.026849175 + "ts": 0.027562025 }, { "core_id": 0, @@ -4053,7 +5361,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.02686425 + "ts": 0.027577225 }, { "core_id": 1, @@ -4063,7 +5371,7 @@ "params": { "irq_num": 5 }, - "ts": 0.027666425 + "ts": 0.0284482 }, { "core_id": 1, @@ -4071,7 +5379,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.027680075 + "ts": 0.028461775 }, { "core_id": 1, @@ -4079,7 +5387,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.027695225 + "ts": 0.0284769 }, { "core_id": 0, @@ -4089,7 +5397,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0278338 + "ts": 0.02854665 }, { "core_id": 0, @@ -4097,7 +5405,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0278492 + "ts": 0.028562 }, { "core_id": 0, @@ -4105,7 +5413,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.027864425 + "ts": 0.028577075 }, { "core_id": 1, @@ -4115,7 +5423,7 @@ "params": { "irq_num": 5 }, - "ts": 0.028666425 + "ts": 0.0294482 }, { "core_id": 1, @@ -4123,7 +5431,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.02867995 + "ts": 0.029461725 }, { "core_id": 1, @@ -4131,7 +5439,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0286951 + "ts": 0.02947685 }, { "core_id": 0, @@ -4141,7 +5449,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0288338 + "ts": 0.02954665 }, { "core_id": 0, @@ -4149,7 +5457,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.028849175 + "ts": 0.02956205 }, { "core_id": 0, @@ -4157,7 +5465,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.02886425 + "ts": 0.029577275 }, { "core_id": 1, @@ -4167,7 +5475,7 @@ "params": { "irq_num": 5 }, - "ts": 0.029666425 + "ts": 0.0304482 }, { "core_id": 1, @@ -4175,7 +5483,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.029680075 + "ts": 0.030461725 }, { "core_id": 1, @@ -4183,7 +5491,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.02969535 + "ts": 0.03047685 }, { "core_id": 0, @@ -4193,7 +5501,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0298338 + "ts": 0.03054665 }, { "core_id": 0, @@ -4201,7 +5509,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.029849175 + "ts": 0.030562 }, { "core_id": 0, @@ -4209,7 +5517,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.02986425 + "ts": 0.030577075 }, { "core_id": 1, @@ -4219,7 +5527,7 @@ "params": { "irq_num": 5 }, - "ts": 0.030666425 + "ts": 0.0314482 }, { "core_id": 1, @@ -4227,7 +5535,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.03068 + "ts": 0.031461725 }, { "core_id": 1, @@ -4235,7 +5543,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.030695125 + "ts": 0.031476975 }, { "core_id": 0, @@ -4245,7 +5553,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0308338 + "ts": 0.03154665 }, { "core_id": 0, @@ -4253,7 +5561,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.030849175 + "ts": 0.031562025 }, { "core_id": 0, @@ -4261,7 +5569,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.03086425 + "ts": 0.031577225 }, { "core_id": 1, @@ -4271,7 +5579,7 @@ "params": { "irq_num": 5 }, - "ts": 0.031666425 + "ts": 0.0324482 }, { "core_id": 1, @@ -4279,7 +5587,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.031680075 + "ts": 0.032461775 }, { "core_id": 1, @@ -4287,7 +5595,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.031695225 + "ts": 0.0324769 }, { "core_id": 0, @@ -4297,7 +5605,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0318338 + "ts": 0.03254665 }, { "core_id": 0, @@ -4305,9 +5613,19 @@ "id": 6, "in_irq": true, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.031848825 + "ts": 0.032561625 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12284596 + }, + "ts": 0.032561625 }, { "core_id": 0, @@ -4315,7 +5633,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.031861575 + "ts": 0.032574275 }, { "core_id": 0, @@ -4323,18 +5641,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.03187725 + "ts": 0.03258995 }, { - "addr": "0x3ffbb728", + "addr": "0x3ffbaef0", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -4346,16 +5664,16 @@ "id": 512, "in_irq": false, "size": 2, - "ts": 0.031912575 + "ts": 0.032626375 }, { - "addr": "0x3ffbb738", + "addr": "0x3ffbaf00", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -4367,7 +5685,7 @@ "id": 512, "in_irq": false, "size": 4, - "ts": 0.0319512 + "ts": 0.0326618 }, { "core_id": 0, @@ -4377,10 +5695,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.0319681 + "ts": 0.03268285 }, { "core_id": 0, @@ -4390,10 +5708,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.031984075 + "ts": 0.032698775 }, { "core_id": 0, @@ -4401,8 +5719,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (340) example: Task[0x3ffb7aec]: allocated 4 bytes @ 0x3ffbb738\n", - "ts": 0.03204825 + "msg": "I (328) example: Task[0x3ffb72b4]: allocated 4 bytes @ 0x3ffbaf00\n", + "ts": 0.032751325 }, { "core_id": 0, @@ -4410,8 +5728,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (340) example: Task[0x3ffb7aec]: allocated 4 bytes @ 0x3ffbb738\n", - "ts": 0.03204825 + "msg": "I (328) example: Task[0x3ffb72b4]: allocated 4 bytes @ 0x3ffbaf00\n", + "ts": 0.032751325 }, { "core_id": 0, @@ -4421,10 +5739,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 0 }, - "ts": 0.032061825 + "ts": 0.032764775 }, { "core_id": 0, @@ -4432,9 +5750,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.03207495 + "ts": 0.032778 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12287644 + }, + "ts": 0.032778 }, { "core_id": 1, @@ -4444,7 +5772,7 @@ "params": { "irq_num": 31 }, - "ts": 0.03209115 + "ts": 0.03279425 }, { "core_id": 0, @@ -4454,7 +5782,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.032102025 + "ts": 0.0328052 }, { "core_id": 1, @@ -4462,7 +5790,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0321128 + "ts": 0.03281595 }, { "core_id": 0, @@ -4472,7 +5800,7 @@ "params": { "irq_num": 30 }, - "ts": 0.0321267 + "ts": 0.0328297 }, { "core_id": 1, @@ -4480,9 +5808,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.0321375 + "ts": 0.032840425 }, { "core_id": 0, @@ -4490,7 +5818,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.03214835 + "ts": 0.032851225 }, { "core_id": 1, @@ -4500,10 +5828,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 4294967295 }, - "ts": 0.032160325 + "ts": 0.032863225 }, { "core_id": 0, @@ -4511,7 +5839,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.03217055 + "ts": 0.03287345 }, { "core_id": 1, @@ -4521,10 +5849,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.032182025 + "ts": 0.0328852 }, { "core_id": 1, @@ -4534,10 +5862,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.0322023 + "ts": 0.032901475 }, { "core_id": 1, @@ -4545,8 +5873,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (340) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb738\n", - "ts": 0.03226585 + "msg": "I (328) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf00\n", + "ts": 0.032949375 }, { "core_id": 1, @@ -4554,15 +5882,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (340) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb738\n", - "ts": 0.03226585 + "msg": "I (328) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf00\n", + "ts": 0.032949375 }, { - "addr": "0x3ffbb738", + "addr": "0x3ffbaf00", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -4576,7 +5904,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.03228705 + "ts": 0.0329751 }, { "core_id": 1, @@ -4586,7 +5914,7 @@ "params": { "irq_num": 31 }, - "ts": 0.032313925 + "ts": 0.033002525 }, { "core_id": 1, @@ -4594,7 +5922,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.03232535 + "ts": 0.033013925 }, { "core_id": 1, @@ -4602,7 +5930,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.03234205 + "ts": 0.0330305 }, { "core_id": 1, @@ -4612,7 +5940,7 @@ "params": { "irq_num": 5 }, - "ts": 0.032666425 + "ts": 0.0334482 }, { "core_id": 1, @@ -4620,7 +5948,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.03267985 + "ts": 0.033461725 }, { "core_id": 1, @@ -4628,7 +5956,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.03269555 + "ts": 0.0334773 }, { "core_id": 0, @@ -4638,7 +5966,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0328338 + "ts": 0.03354665 }, { "core_id": 0, @@ -4646,9 +5974,39 @@ "id": 6, "in_irq": true, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.0328488 + "ts": 0.033561675 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12290612 + }, + "ts": 0.033561675 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 6, + "in_irq": true, + "params": { + "tid": 12296612 + }, + "ts": 0.0335735 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.0335735 }, { "core_id": 0, @@ -4656,7 +6014,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.032861575 + "ts": 0.033586 }, { "core_id": 0, @@ -4664,18 +6022,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.032877375 + "ts": 0.033601675 }, { - "addr": "0x3ffbb738", + "addr": "0x3ffbaf00", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -4687,16 +6045,16 @@ "id": 512, "in_irq": false, "size": 4, - "ts": 0.0329126 + "ts": 0.03363795 }, { - "addr": "0x3ffbb748", + "addr": "0x3ffbaf10", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -4708,7 +6066,7 @@ "id": 512, "in_irq": false, "size": 8, - "ts": 0.03294715 + "ts": 0.033673375 }, { "core_id": 0, @@ -4718,10 +6076,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.032964075 + "ts": 0.033690325 }, { "core_id": 0, @@ -4731,10 +6089,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.03298425 + "ts": 0.033706325 }, { "core_id": 0, @@ -4742,8 +6100,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (341) example: Task[0x3ffb926c]: allocated 8 bytes @ 0x3ffbb748\n", - "ts": 0.0330485 + "msg": "I (329) example: Task[0x3ffb8a34]: allocated 8 bytes @ 0x3ffbaf10\n", + "ts": 0.033762425 }, { "core_id": 0, @@ -4751,8 +6109,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (341) example: Task[0x3ffb926c]: allocated 8 bytes @ 0x3ffbb748\n", - "ts": 0.0330485 + "msg": "I (329) example: Task[0x3ffb8a34]: allocated 8 bytes @ 0x3ffbaf10\n", + "ts": 0.033762425 }, { "core_id": 0, @@ -4762,10 +6120,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 0 }, - "ts": 0.033062225 + "ts": 0.0337759 }, { "core_id": 0, @@ -4773,9 +6131,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.03307545 + "ts": 0.0337891 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12293660 + }, + "ts": 0.0337891 }, { "core_id": 1, @@ -4785,7 +6153,7 @@ "params": { "irq_num": 31 }, - "ts": 0.0330917 + "ts": 0.03380545 }, { "core_id": 0, @@ -4795,7 +6163,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.03310255 + "ts": 0.033816325 }, { "core_id": 1, @@ -4803,7 +6171,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0331133 + "ts": 0.033827125 }, { "core_id": 0, @@ -4813,7 +6181,7 @@ "params": { "irq_num": 30 }, - "ts": 0.033127025 + "ts": 0.033840925 }, { "core_id": 1, @@ -4821,9 +6189,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.0331378 + "ts": 0.03385275 }, { "core_id": 0, @@ -4831,7 +6199,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.03314855 + "ts": 0.033864 }, { "core_id": 1, @@ -4841,18 +6209,20 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 4294967295 }, - "ts": 0.03316055 + "ts": 0.03387595 }, { "core_id": 0, - "ctx_name": "alloc1", - "id": 17, + "ctx_name": "alloc2", + "id": 4, "in_irq": false, - "params": {}, - "ts": 0.033171875 + "params": { + "tid": 12296612 + }, + "ts": 0.033887525 }, { "core_id": 1, @@ -4862,10 +6232,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.0331841 + "ts": 0.03390015 }, { "core_id": 1, @@ -4875,148 +6245,19 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.033200475 + "ts": 0.03391885 }, { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (341) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb748\n", - "ts": 0.033263975 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (341) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb748\n", - "ts": 0.033263975 - }, - { - "addr": "0x3ffbb748", + "addr": "0x3ffbaf20", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0" - ], - "core_id": 1, - "ctx_name": "free1", - "id": 513, - "in_irq": false, - "size": 0, - "ts": 0.0332885 - }, - { - "core_id": 1, - "ctx_name": "FROM_CPU1", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 31 - }, - "ts": 0.033315625 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.03332705 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.033343625 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.033666425 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.03367985 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.03369555 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.0338338 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 6, - "in_irq": true, - "params": { - "tid": 12298716 - }, - "ts": 0.0338488 - }, - { - "core_id": 0, - "ctx_name": "alloc1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.033861575 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 4, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.03387725 - }, - { - "addr": "0x3ffbb748", - "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -5028,16 +6269,34 @@ "id": 512, "in_irq": false, "size": 6, - "ts": 0.03391265 + "ts": 0.033930825 }, { - "addr": "0x3ffbb758", + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (329) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf10\n", + "ts": 0.033971825 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (329) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf10\n", + "ts": 0.033971825 + }, + { + "addr": "0x3ffbaf30", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -5049,7 +6308,28 @@ "id": 512, "in_irq": false, "size": 12, - "ts": 0.03394705 + "ts": 0.033987775 + }, + { + "addr": "0x3ffbaf10", + "callers": [ + "0x4008da24", + "0x400d3c72", + "0x400880dc", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0" + ], + "core_id": 1, + "ctx_name": "free1", + "id": 513, + "in_irq": false, + "size": 0, + "ts": 0.03400215 }, { "core_id": 0, @@ -5059,10 +6339,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.03396395 + "ts": 0.0340146 }, { "core_id": 0, @@ -5072,51 +6352,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.03398005 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (342) example: Task[0x3ffba9dc]: allocated 12 bytes @ 0x3ffbb758\n", - "ts": 0.034050525 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (342) example: Task[0x3ffba9dc]: allocated 12 bytes @ 0x3ffbb758\n", - "ts": 0.034050525 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12299072, - "xTicksToWait": 0 - }, - "ts": 0.03406835 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 6, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.034081575 + "ts": 0.0340345 }, { "core_id": 1, @@ -5126,7 +6365,84 @@ "params": { "irq_num": 31 }, - "ts": 0.034097875 + "ts": 0.034045425 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.034056975 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.034074925 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (329) example: Task[0x3ffba1a4]: allocated 12 bytes @ 0x3ffbaf30\n", + "ts": 0.034092925 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (329) example: Task[0x3ffba1a4]: allocated 12 bytes @ 0x3ffbaf30\n", + "ts": 0.034092925 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12296968, + "xTicksToWait": 0 + }, + "ts": 0.034106375 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.03412375 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.03412375 + }, + { + "core_id": 1, + "ctx_name": "FROM_CPU1", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 31 + }, + "ts": 0.0341401 }, { "core_id": 0, @@ -5136,7 +6452,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.034108725 + "ts": 0.034150975 }, { "core_id": 1, @@ -5144,7 +6460,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0341195 + "ts": 0.034161775 }, { "core_id": 0, @@ -5154,7 +6470,7 @@ "params": { "irq_num": 30 }, - "ts": 0.034133225 + "ts": 0.0341756 }, { "core_id": 1, @@ -5162,9 +6478,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.0341441 + "ts": 0.034186525 }, { "core_id": 0, @@ -5172,7 +6488,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.034154925 + "ts": 0.034197375 }, { "core_id": 1, @@ -5182,10 +6498,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 4294967295 }, - "ts": 0.0341668 + "ts": 0.034209325 }, { "core_id": 0, @@ -5193,7 +6509,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.034178075 + "ts": 0.03422055 }, { "core_id": 1, @@ -5203,10 +6519,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.034189725 + "ts": 0.03423235 }, { "core_id": 1, @@ -5216,10 +6532,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.0342061 + "ts": 0.034248625 }, { "core_id": 1, @@ -5227,8 +6543,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (342) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb758\n", - "ts": 0.03426965 + "msg": "I (329) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf30\n", + "ts": 0.0342964 }, { "core_id": 1, @@ -5236,15 +6552,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (342) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb758\n", - "ts": 0.03426965 + "msg": "I (329) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf30\n", + "ts": 0.0342964 }, { - "addr": "0x3ffbb758", + "addr": "0x3ffbaf30", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -5258,7 +6574,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.03429085 + "ts": 0.034317775 }, { "core_id": 1, @@ -5268,7 +6584,7 @@ "params": { "irq_num": 31 }, - "ts": 0.0343219 + "ts": 0.034345175 }, { "core_id": 1, @@ -5276,7 +6592,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.034333375 + "ts": 0.0343566 }, { "core_id": 1, @@ -5284,7 +6600,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.034350075 + "ts": 0.03437315 }, { "core_id": 1, @@ -5294,7 +6610,7 @@ "params": { "irq_num": 5 }, - "ts": 0.034666425 + "ts": 0.0344482 }, { "core_id": 1, @@ -5302,7 +6618,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.034679875 + "ts": 0.034461625 }, { "core_id": 1, @@ -5310,7 +6626,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.03469545 + "ts": 0.0344772 }, { "core_id": 0, @@ -5320,7 +6636,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0348338 + "ts": 0.03454665 }, { "core_id": 0, @@ -5328,7 +6644,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0348492 + "ts": 0.034562 }, { "core_id": 0, @@ -5336,7 +6652,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.034864425 + "ts": 0.034577075 }, { "core_id": 1, @@ -5346,7 +6662,7 @@ "params": { "irq_num": 5 }, - "ts": 0.035666425 + "ts": 0.0354482 }, { "core_id": 1, @@ -5354,7 +6670,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.03567995 + "ts": 0.035461725 }, { "core_id": 1, @@ -5362,7 +6678,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0356951 + "ts": 0.03547685 }, { "core_id": 0, @@ -5372,7 +6688,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0358338 + "ts": 0.03554665 }, { "core_id": 0, @@ -5380,7 +6696,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.035849175 + "ts": 0.03556205 }, { "core_id": 0, @@ -5388,7 +6704,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.03586425 + "ts": 0.035577275 }, { "core_id": 1, @@ -5398,7 +6714,7 @@ "params": { "irq_num": 5 }, - "ts": 0.036666425 + "ts": 0.0364482 }, { "core_id": 1, @@ -5406,7 +6722,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.036680075 + "ts": 0.036461725 }, { "core_id": 1, @@ -5414,7 +6730,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.03669535 + "ts": 0.03647685 }, { "core_id": 0, @@ -5424,7 +6740,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0368338 + "ts": 0.03654665 }, { "core_id": 0, @@ -5432,7 +6748,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.036849175 + "ts": 0.0365663 }, { "core_id": 0, @@ -5440,7 +6756,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.03686425 + "ts": 0.036581525 }, { "core_id": 1, @@ -5450,7 +6766,7 @@ "params": { "irq_num": 5 }, - "ts": 0.037666425 + "ts": 0.0374482 }, { "core_id": 1, @@ -5458,7 +6774,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.03768 + "ts": 0.037461725 }, { "core_id": 1, @@ -5466,7 +6782,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.037695125 + "ts": 0.03747685 }, { "core_id": 0, @@ -5476,7 +6792,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0378338 + "ts": 0.03754665 }, { "core_id": 0, @@ -5484,7 +6800,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.037849175 + "ts": 0.037562 }, { "core_id": 0, @@ -5492,7 +6808,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.03786425 + "ts": 0.037577075 }, { "core_id": 1, @@ -5502,7 +6818,7 @@ "params": { "irq_num": 5 }, - "ts": 0.038666425 + "ts": 0.0384482 }, { "core_id": 1, @@ -5510,7 +6826,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.038680075 + "ts": 0.038461725 }, { "core_id": 1, @@ -5518,7 +6834,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.038695225 + "ts": 0.038476975 }, { "core_id": 0, @@ -5528,7 +6844,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0388338 + "ts": 0.03854665 }, { "core_id": 0, @@ -5536,7 +6852,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0388492 + "ts": 0.038562025 }, { "core_id": 0, @@ -5544,7 +6860,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.038864425 + "ts": 0.038577225 }, { "core_id": 1, @@ -5554,7 +6870,7 @@ "params": { "irq_num": 5 }, - "ts": 0.039666425 + "ts": 0.0394482 }, { "core_id": 1, @@ -5562,7 +6878,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.03967995 + "ts": 0.039461775 }, { "core_id": 1, @@ -5570,7 +6886,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0396951 + "ts": 0.0394769 }, { "core_id": 0, @@ -5580,7 +6896,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0398338 + "ts": 0.03954665 }, { "core_id": 0, @@ -5588,7 +6904,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.039849175 + "ts": 0.039562 }, { "core_id": 0, @@ -5596,7 +6912,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.03986425 + "ts": 0.039577075 }, { "core_id": 1, @@ -5606,7 +6922,7 @@ "params": { "irq_num": 5 }, - "ts": 0.040666425 + "ts": 0.0404482 }, { "core_id": 1, @@ -5614,7 +6930,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.040680075 + "ts": 0.040461725 }, { "core_id": 1, @@ -5622,7 +6938,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.04069535 + "ts": 0.04047685 }, { "core_id": 0, @@ -5632,7 +6948,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0408338 + "ts": 0.04054665 }, { "core_id": 0, @@ -5640,7 +6956,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.040849175 + "ts": 0.04056205 }, { "core_id": 0, @@ -5648,7 +6964,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.04086425 + "ts": 0.040577275 }, { "core_id": 1, @@ -5658,7 +6974,7 @@ "params": { "irq_num": 5 }, - "ts": 0.041666425 + "ts": 0.0414482 }, { "core_id": 1, @@ -5666,7 +6982,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.04168 + "ts": 0.041461725 }, { "core_id": 1, @@ -5674,7 +6990,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.041695125 + "ts": 0.04147685 }, { "core_id": 0, @@ -5684,7 +7000,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0418338 + "ts": 0.04154665 }, { "core_id": 0, @@ -5692,7 +7008,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.041849175 + "ts": 0.041562 }, { "core_id": 0, @@ -5700,7 +7016,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.04186425 + "ts": 0.041577075 }, { "core_id": 1, @@ -5710,7 +7026,7 @@ "params": { "irq_num": 5 }, - "ts": 0.042666425 + "ts": 0.0424482 }, { "core_id": 1, @@ -5718,7 +7034,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.042680075 + "ts": 0.042461725 }, { "core_id": 1, @@ -5726,7 +7042,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.042695225 + "ts": 0.042476975 }, { "core_id": 0, @@ -5736,7 +7052,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0428338 + "ts": 0.04254665 }, { "core_id": 0, @@ -5744,7 +7060,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0428492 + "ts": 0.042562025 }, { "core_id": 0, @@ -5752,7 +7068,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.042864425 + "ts": 0.042577225 }, { "core_id": 1, @@ -5762,7 +7078,7 @@ "params": { "irq_num": 5 }, - "ts": 0.043666425 + "ts": 0.0434482 }, { "core_id": 1, @@ -5770,7 +7086,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.04367995 + "ts": 0.043461775 }, { "core_id": 1, @@ -5778,7 +7094,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0436951 + "ts": 0.0434769 }, { "core_id": 0, @@ -5788,7 +7104,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0438338 + "ts": 0.04354665 }, { "core_id": 0, @@ -5796,7 +7112,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.043849175 + "ts": 0.043562 }, { "core_id": 0, @@ -5804,7 +7120,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.04386425 + "ts": 0.043577075 }, { "core_id": 1, @@ -5814,7 +7130,7 @@ "params": { "irq_num": 5 }, - "ts": 0.044666425 + "ts": 0.0444482 }, { "core_id": 1, @@ -5822,7 +7138,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0446842 + "ts": 0.044461725 }, { "core_id": 1, @@ -5830,7 +7146,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.044699325 + "ts": 0.04447685 }, { "core_id": 0, @@ -5840,7 +7156,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0448338 + "ts": 0.04454665 }, { "core_id": 0, @@ -5848,7 +7164,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.044849175 + "ts": 0.04456205 }, { "core_id": 0, @@ -5856,7 +7172,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.04486425 + "ts": 0.044577275 }, { "core_id": 1, @@ -5866,7 +7182,7 @@ "params": { "irq_num": 5 }, - "ts": 0.045666425 + "ts": 0.0454482 }, { "core_id": 1, @@ -5874,7 +7190,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.045680075 + "ts": 0.045461725 }, { "core_id": 1, @@ -5882,7 +7198,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.045695225 + "ts": 0.04547685 }, { "core_id": 0, @@ -5892,7 +7208,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0458338 + "ts": 0.04554665 }, { "core_id": 0, @@ -5900,7 +7216,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0458492 + "ts": 0.045562 }, { "core_id": 0, @@ -5908,7 +7224,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.045864425 + "ts": 0.045577075 }, { "core_id": 1, @@ -5918,7 +7234,7 @@ "params": { "irq_num": 5 }, - "ts": 0.046666425 + "ts": 0.0464482 }, { "core_id": 1, @@ -5926,7 +7242,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.04667995 + "ts": 0.046461725 }, { "core_id": 1, @@ -5934,7 +7250,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0466951 + "ts": 0.046476975 }, { "core_id": 0, @@ -5944,7 +7260,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0468338 + "ts": 0.04654665 }, { "core_id": 0, @@ -5952,7 +7268,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.046849175 + "ts": 0.046562025 }, { "core_id": 0, @@ -5960,7 +7276,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.04686425 + "ts": 0.046577225 }, { "core_id": 1, @@ -5970,7 +7286,7 @@ "params": { "irq_num": 5 }, - "ts": 0.047666425 + "ts": 0.0474482 }, { "core_id": 1, @@ -5978,7 +7294,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.047680075 + "ts": 0.047461775 }, { "core_id": 1, @@ -5986,7 +7302,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.04769535 + "ts": 0.0474769 }, { "core_id": 0, @@ -5996,7 +7312,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0478338 + "ts": 0.04754665 }, { "core_id": 0, @@ -6004,7 +7320,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.047849175 + "ts": 0.047562 }, { "core_id": 0, @@ -6012,7 +7328,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.04786425 + "ts": 0.047577075 }, { "core_id": 1, @@ -6022,7 +7338,7 @@ "params": { "irq_num": 5 }, - "ts": 0.048666425 + "ts": 0.0484482 }, { "core_id": 1, @@ -6030,7 +7346,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.04868 + "ts": 0.048461725 }, { "core_id": 1, @@ -6038,7 +7354,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.048695125 + "ts": 0.04847685 }, { "core_id": 0, @@ -6048,7 +7364,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0488338 + "ts": 0.04854665 }, { "core_id": 0, @@ -6056,7 +7372,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.048849175 + "ts": 0.0485663 }, { "core_id": 0, @@ -6064,7 +7380,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.04886425 + "ts": 0.0485815 }, { "core_id": 1, @@ -6074,7 +7390,7 @@ "params": { "irq_num": 5 }, - "ts": 0.049666425 + "ts": 0.0494482 }, { "core_id": 1, @@ -6082,7 +7398,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.049680075 + "ts": 0.049461725 }, { "core_id": 1, @@ -6090,7 +7406,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.049695225 + "ts": 0.04947685 }, { "core_id": 0, @@ -6100,7 +7416,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0498338 + "ts": 0.04954665 }, { "core_id": 0, @@ -6108,7 +7424,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0498492 + "ts": 0.049562 }, { "core_id": 0, @@ -6116,7 +7432,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.049864425 + "ts": 0.049577075 }, { "core_id": 1, @@ -6126,7 +7442,7 @@ "params": { "irq_num": 5 }, - "ts": 0.050666425 + "ts": 0.0504482 }, { "core_id": 1, @@ -6134,7 +7450,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.05067995 + "ts": 0.050461725 }, { "core_id": 1, @@ -6142,7 +7458,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0506951 + "ts": 0.050476975 }, { "core_id": 0, @@ -6152,7 +7468,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0508338 + "ts": 0.05054665 }, { "core_id": 0, @@ -6160,7 +7476,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.050849175 + "ts": 0.050562025 }, { "core_id": 0, @@ -6168,7 +7484,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.05086425 + "ts": 0.050577225 }, { "core_id": 1, @@ -6178,7 +7494,7 @@ "params": { "irq_num": 5 }, - "ts": 0.051666425 + "ts": 0.0514482 }, { "core_id": 1, @@ -6186,7 +7502,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.051680075 + "ts": 0.051461775 }, { "core_id": 1, @@ -6194,7 +7510,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.05169535 + "ts": 0.0514769 }, { "core_id": 0, @@ -6204,7 +7520,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0518338 + "ts": 0.05154665 }, { "core_id": 0, @@ -6212,7 +7528,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.051849175 + "ts": 0.051562 }, { "core_id": 0, @@ -6220,7 +7536,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.05186425 + "ts": 0.051577075 }, { "core_id": 1, @@ -6230,7 +7546,7 @@ "params": { "irq_num": 5 }, - "ts": 0.052666425 + "ts": 0.0524482 }, { "core_id": 1, @@ -6238,7 +7554,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.05268 + "ts": 0.052461725 }, { "core_id": 1, @@ -6246,7 +7562,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.052695125 + "ts": 0.05247685 }, { "core_id": 0, @@ -6256,7 +7572,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0528338 + "ts": 0.05254665 }, { "core_id": 0, @@ -6264,7 +7580,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.052849175 + "ts": 0.05256205 }, { "core_id": 0, @@ -6272,7 +7588,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.05286425 + "ts": 0.052577275 }, { "core_id": 1, @@ -6282,7 +7598,7 @@ "params": { "irq_num": 5 }, - "ts": 0.053666425 + "ts": 0.0534482 }, { "core_id": 1, @@ -6290,7 +7606,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.053680075 + "ts": 0.053461725 }, { "core_id": 1, @@ -6298,7 +7614,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.053695225 + "ts": 0.05347685 }, { "core_id": 0, @@ -6308,7 +7624,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0538338 + "ts": 0.05354665 }, { "core_id": 0, @@ -6316,7 +7632,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0538492 + "ts": 0.053562 }, { "core_id": 0, @@ -6324,7 +7640,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.053864425 + "ts": 0.053577075 }, { "core_id": 1, @@ -6334,7 +7650,7 @@ "params": { "irq_num": 5 }, - "ts": 0.054666425 + "ts": 0.0544482 }, { "core_id": 1, @@ -6342,7 +7658,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.05467995 + "ts": 0.054461725 }, { "core_id": 1, @@ -6350,7 +7666,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0546951 + "ts": 0.054476975 }, { "core_id": 0, @@ -6360,7 +7676,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0548338 + "ts": 0.05454665 }, { "core_id": 0, @@ -6368,7 +7684,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.054849175 + "ts": 0.054562025 }, { "core_id": 0, @@ -6376,7 +7692,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.05486425 + "ts": 0.054577225 }, { "core_id": 1, @@ -6386,7 +7702,7 @@ "params": { "irq_num": 5 }, - "ts": 0.055666425 + "ts": 0.0554482 }, { "core_id": 1, @@ -6394,7 +7710,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.055680075 + "ts": 0.055461775 }, { "core_id": 1, @@ -6402,7 +7718,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.05569535 + "ts": 0.0554769 }, { "core_id": 0, @@ -6412,7 +7728,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0558338 + "ts": 0.05554665 }, { "core_id": 0, @@ -6420,7 +7736,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.055849175 + "ts": 0.055562 }, { "core_id": 0, @@ -6428,7 +7744,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.05586425 + "ts": 0.055577075 }, { "core_id": 1, @@ -6438,7 +7754,7 @@ "params": { "irq_num": 5 }, - "ts": 0.056666425 + "ts": 0.0564482 }, { "core_id": 1, @@ -6446,7 +7762,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.056684225 + "ts": 0.056461725 }, { "core_id": 1, @@ -6454,7 +7770,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.056699375 + "ts": 0.05647685 }, { "core_id": 0, @@ -6464,7 +7780,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0568338 + "ts": 0.05654665 }, { "core_id": 0, @@ -6472,7 +7788,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.056849175 + "ts": 0.05656205 }, { "core_id": 0, @@ -6480,7 +7796,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.05686425 + "ts": 0.056577275 }, { "core_id": 1, @@ -6490,7 +7806,7 @@ "params": { "irq_num": 5 }, - "ts": 0.057666425 + "ts": 0.0574482 }, { "core_id": 1, @@ -6498,7 +7814,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.057680075 + "ts": 0.057461725 }, { "core_id": 1, @@ -6506,7 +7822,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.057695225 + "ts": 0.05747685 }, { "core_id": 0, @@ -6516,7 +7832,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0578338 + "ts": 0.05754665 }, { "core_id": 0, @@ -6524,7 +7840,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0578492 + "ts": 0.057562 }, { "core_id": 0, @@ -6532,7 +7848,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.057864425 + "ts": 0.057577075 }, { "core_id": 1, @@ -6542,7 +7858,7 @@ "params": { "irq_num": 5 }, - "ts": 0.058666425 + "ts": 0.0584482 }, { "core_id": 1, @@ -6550,7 +7866,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.05867995 + "ts": 0.058461725 }, { "core_id": 1, @@ -6558,7 +7874,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0586951 + "ts": 0.058476975 }, { "core_id": 0, @@ -6568,7 +7884,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0588338 + "ts": 0.05854665 }, { "core_id": 0, @@ -6576,7 +7892,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.058849175 + "ts": 0.058562025 }, { "core_id": 0, @@ -6584,7 +7900,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.05886425 + "ts": 0.058577225 }, { "core_id": 1, @@ -6594,7 +7910,7 @@ "params": { "irq_num": 5 }, - "ts": 0.059666425 + "ts": 0.0594482 }, { "core_id": 1, @@ -6602,7 +7918,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.059680075 + "ts": 0.059461775 }, { "core_id": 1, @@ -6610,7 +7926,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.05969535 + "ts": 0.0594769 }, { "core_id": 0, @@ -6620,7 +7936,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0598338 + "ts": 0.05954665 }, { "core_id": 0, @@ -6628,7 +7944,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.059849175 + "ts": 0.059562 }, { "core_id": 0, @@ -6636,7 +7952,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.05986425 + "ts": 0.059577075 }, { "core_id": 1, @@ -6646,7 +7962,7 @@ "params": { "irq_num": 5 }, - "ts": 0.060666425 + "ts": 0.0604482 }, { "core_id": 1, @@ -6654,7 +7970,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.06068 + "ts": 0.060461725 }, { "core_id": 1, @@ -6662,7 +7978,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.060695125 + "ts": 0.06047685 }, { "core_id": 0, @@ -6672,7 +7988,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0608338 + "ts": 0.06054665 }, { "core_id": 0, @@ -6680,7 +7996,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.060849175 + "ts": 0.0605663 }, { "core_id": 0, @@ -6688,7 +8004,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.06086425 + "ts": 0.0605815 }, { "core_id": 1, @@ -6698,7 +8014,7 @@ "params": { "irq_num": 5 }, - "ts": 0.061666425 + "ts": 0.0614482 }, { "core_id": 1, @@ -6706,7 +8022,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.061680075 + "ts": 0.061461725 }, { "core_id": 1, @@ -6714,7 +8030,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.061695225 + "ts": 0.06147685 }, { "core_id": 0, @@ -6724,7 +8040,59 @@ "params": { "irq_num": 5 }, - "ts": 0.0618338 + "ts": 0.06154665 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.061562 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.061577075 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.0624482 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.062461725 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.062476975 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.06254665 }, { "core_id": 0, @@ -6732,9 +8100,19 @@ "id": 6, "in_irq": true, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.061848825 + "ts": 0.062561625 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12284596 + }, + "ts": 0.062561625 }, { "core_id": 0, @@ -6742,7 +8120,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.061861575 + "ts": 0.062574225 }, { "core_id": 0, @@ -6750,18 +8128,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.06187725 + "ts": 0.062589875 }, { - "addr": "0x3ffbb758", + "addr": "0x3ffbaf10", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -6773,16 +8151,16 @@ "id": 512, "in_irq": false, "size": 3, - "ts": 0.061912575 + "ts": 0.0626249 }, { - "addr": "0x3ffbb768", + "addr": "0x3ffbaf30", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -6794,7 +8172,7 @@ "id": 512, "in_irq": false, "size": 6, - "ts": 0.061947 + "ts": 0.062660375 }, { "core_id": 0, @@ -6804,10 +8182,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.061964025 + "ts": 0.0626773 }, { "core_id": 0, @@ -6817,10 +8195,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.061980025 + "ts": 0.06269325 }, { "core_id": 0, @@ -6828,8 +8206,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (370) example: Task[0x3ffb7aec]: allocated 6 bytes @ 0x3ffbb768\n", - "ts": 0.062044275 + "msg": "I (358) example: Task[0x3ffb72b4]: allocated 6 bytes @ 0x3ffbaf30\n", + "ts": 0.062745775 }, { "core_id": 0, @@ -6837,8 +8215,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (370) example: Task[0x3ffb7aec]: allocated 6 bytes @ 0x3ffbb768\n", - "ts": 0.062044275 + "msg": "I (358) example: Task[0x3ffb72b4]: allocated 6 bytes @ 0x3ffbaf30\n", + "ts": 0.062745775 }, { "core_id": 0, @@ -6848,10 +8226,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 0 }, - "ts": 0.062062075 + "ts": 0.06275925 }, { "core_id": 0, @@ -6859,9 +8237,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.0620752 + "ts": 0.06277245 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12287644 + }, + "ts": 0.06277245 }, { "core_id": 1, @@ -6871,7 +8259,7 @@ "params": { "irq_num": 31 }, - "ts": 0.06209135 + "ts": 0.0627929 }, { "core_id": 0, @@ -6881,7 +8269,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.0621024 + "ts": 0.06280385 }, { "core_id": 1, @@ -6889,7 +8277,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.06211315 + "ts": 0.0628146 }, { "core_id": 0, @@ -6899,7 +8287,7 @@ "params": { "irq_num": 30 }, - "ts": 0.06212715 + "ts": 0.0628285 }, { "core_id": 1, @@ -6907,9 +8295,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.062138 + "ts": 0.0628393 }, { "core_id": 0, @@ -6917,7 +8305,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.062148875 + "ts": 0.062850025 }, { "core_id": 1, @@ -6927,10 +8315,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 4294967295 }, - "ts": 0.062160875 + "ts": 0.06286215 }, { "core_id": 0, @@ -6938,7 +8326,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0621712 + "ts": 0.06287235 }, { "core_id": 1, @@ -6948,10 +8336,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.062183675 + "ts": 0.0628841 }, { "core_id": 1, @@ -6961,10 +8349,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.06219985 + "ts": 0.06290045 }, { "core_id": 1, @@ -6972,8 +8360,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (370) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb768\n", - "ts": 0.0622634 + "msg": "I (358) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf30\n", + "ts": 0.062948325 }, { "core_id": 1, @@ -6981,15 +8369,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (370) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb768\n", - "ts": 0.0622634 + "msg": "I (358) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf30\n", + "ts": 0.062948325 }, { - "addr": "0x3ffbb768", + "addr": "0x3ffbaf30", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -7003,7 +8391,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.0622844 + "ts": 0.062969525 }, { "core_id": 1, @@ -7013,7 +8401,7 @@ "params": { "irq_num": 31 }, - "ts": 0.062314725 + "ts": 0.0629968 }, { "core_id": 1, @@ -7021,7 +8409,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0623262 + "ts": 0.06300825 }, { "core_id": 1, @@ -7029,7 +8417,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0623429 + "ts": 0.06302495 }, { "core_id": 1, @@ -7039,7 +8427,7 @@ "params": { "irq_num": 5 }, - "ts": 0.062666425 + "ts": 0.0634482 }, { "core_id": 1, @@ -7047,7 +8435,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.062679875 + "ts": 0.063461725 }, { "core_id": 1, @@ -7055,7 +8443,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.06269545 + "ts": 0.0634773 }, { "core_id": 0, @@ -7065,7 +8453,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0628338 + "ts": 0.06354665 }, { "core_id": 0, @@ -7073,9 +8461,39 @@ "id": 6, "in_irq": true, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.062848825 + "ts": 0.063561625 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12290612 + }, + "ts": 0.063561625 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 6, + "in_irq": true, + "params": { + "tid": 12296612 + }, + "ts": 0.0635735 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.0635735 }, { "core_id": 0, @@ -7083,7 +8501,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.062861575 + "ts": 0.063585975 }, { "core_id": 0, @@ -7091,18 +8509,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.06287725 + "ts": 0.063601625 }, { - "addr": "0x3ffbb768", + "addr": "0x3ffbaf30", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -7114,16 +8532,16 @@ "id": 512, "in_irq": false, "size": 6, - "ts": 0.062912575 + "ts": 0.063638 }, { - "addr": "0x3ffbb778", + "addr": "0x3ffbaf40", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -7135,7 +8553,7 @@ "id": 512, "in_irq": false, "size": 12, - "ts": 0.062947 + "ts": 0.06367755 }, { "core_id": 0, @@ -7145,10 +8563,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.062964025 + "ts": 0.0636945 }, { "core_id": 0, @@ -7158,10 +8576,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.062980025 + "ts": 0.0637105 }, { "core_id": 0, @@ -7169,8 +8587,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (371) example: Task[0x3ffb926c]: allocated 12 bytes @ 0x3ffbb778\n", - "ts": 0.0630465 + "msg": "I (359) example: Task[0x3ffb8a34]: allocated 12 bytes @ 0x3ffbaf40\n", + "ts": 0.063765225 }, { "core_id": 0, @@ -7178,8 +8596,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (371) example: Task[0x3ffb926c]: allocated 12 bytes @ 0x3ffbb778\n", - "ts": 0.0630465 + "msg": "I (359) example: Task[0x3ffb8a34]: allocated 12 bytes @ 0x3ffbaf40\n", + "ts": 0.063765225 }, { "core_id": 0, @@ -7189,10 +8607,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 0 }, - "ts": 0.06306005 + "ts": 0.063778675 }, { "core_id": 0, @@ -7200,9 +8618,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.06307745 + "ts": 0.063791925 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12293660 + }, + "ts": 0.063791925 }, { "core_id": 1, @@ -7212,7 +8640,7 @@ "params": { "irq_num": 31 }, - "ts": 0.063093775 + "ts": 0.063808275 }, { "core_id": 0, @@ -7222,7 +8650,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.063104625 + "ts": 0.063819125 }, { "core_id": 1, @@ -7230,7 +8658,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.063115375 + "ts": 0.0638301 }, { "core_id": 0, @@ -7240,7 +8668,7 @@ "params": { "irq_num": 30 }, - "ts": 0.0631291 + "ts": 0.0638441 }, { "core_id": 1, @@ -7248,9 +8676,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.06313995 + "ts": 0.0638558 }, { "core_id": 0, @@ -7258,7 +8686,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.063150775 + "ts": 0.0638672 }, { "core_id": 1, @@ -7268,18 +8696,20 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 4294967295 }, - "ts": 0.063162625 + "ts": 0.063879175 }, { "core_id": 0, - "ctx_name": "alloc1", - "id": 17, + "ctx_name": "alloc2", + "id": 4, "in_irq": false, - "params": {}, - "ts": 0.0631729 + "params": { + "tid": 12296612 + }, + "ts": 0.063890875 }, { "core_id": 1, @@ -7289,10 +8719,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.063184375 + "ts": 0.063903475 }, { "core_id": 1, @@ -7302,148 +8732,19 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.063200675 + "ts": 0.063925875 }, { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (371) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb778\n", - "ts": 0.063264125 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (371) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb778\n", - "ts": 0.063264125 - }, - { - "addr": "0x3ffbb778", + "addr": "0x3ffbaf50", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0" - ], - "core_id": 1, - "ctx_name": "free1", - "id": 513, - "in_irq": false, - "size": 0, - "ts": 0.063285275 - }, - { - "core_id": 1, - "ctx_name": "FROM_CPU1", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 31 - }, - "ts": 0.0633124 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.063323825 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.0633404 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.063666425 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.06367985 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.06369555 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.0638338 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 6, - "in_irq": true, - "params": { - "tid": 12298716 - }, - "ts": 0.0638488 - }, - { - "core_id": 0, - "ctx_name": "alloc1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.063861575 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 4, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.06387725 - }, - { - "addr": "0x3ffbb778", - "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -7455,16 +8756,34 @@ "id": 512, "in_irq": false, "size": 9, - "ts": 0.06391265 + "ts": 0.063937325 }, { - "addr": "0x3ffbb788", + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (359) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf40\n", + "ts": 0.063978425 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (359) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf40\n", + "ts": 0.063978425 + }, + { + "addr": "0x3ffbaf60", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -7476,7 +8795,28 @@ "id": 512, "in_irq": false, "size": 18, - "ts": 0.0639513 + "ts": 0.0639896 + }, + { + "addr": "0x3ffbaf40", + "callers": [ + "0x4008da24", + "0x400d3c72", + "0x400880dc", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0" + ], + "core_id": 1, + "ctx_name": "free1", + "id": 513, + "in_irq": false, + "size": 0, + "ts": 0.0640039 }, { "core_id": 0, @@ -7486,64 +8826,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.0639682 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12283904, - "xTicksToWait": 0 - }, - "ts": 0.063984175 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (372) example: Task[0x3ffba9dc]: allocated 18 bytes @ 0x3ffbb788\n", - "ts": 0.064054525 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (372) example: Task[0x3ffba9dc]: allocated 18 bytes @ 0x3ffbb788\n", - "ts": 0.064054525 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12299072, - "xTicksToWait": 0 - }, - "ts": 0.064068125 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 6, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.06408135 + "ts": 0.064017 }, { "core_id": 1, @@ -7553,7 +8839,97 @@ "params": { "irq_num": 31 }, - "ts": 0.06409765 + "ts": 0.0640355 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12281672, + "xTicksToWait": 0 + }, + "ts": 0.064046775 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.064057575 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.064075725 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (359) example: Task[0x3ffba1a4]: allocated 18 bytes @ 0x3ffbaf60\n", + "ts": 0.0641035 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (359) example: Task[0x3ffba1a4]: allocated 18 bytes @ 0x3ffbaf60\n", + "ts": 0.0641035 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12296968, + "xTicksToWait": 0 + }, + "ts": 0.0641211 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.06413435 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.06413435 + }, + { + "core_id": 1, + "ctx_name": "FROM_CPU1", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 31 + }, + "ts": 0.0641507 }, { "core_id": 0, @@ -7563,7 +8939,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.0641085 + "ts": 0.06416155 }, { "core_id": 1, @@ -7571,7 +8947,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.064119275 + "ts": 0.064172375 }, { "core_id": 0, @@ -7581,7 +8957,7 @@ "params": { "irq_num": 30 }, - "ts": 0.064133 + "ts": 0.0641862 }, { "core_id": 1, @@ -7589,9 +8965,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.064143875 + "ts": 0.06419695 }, { "core_id": 0, @@ -7599,7 +8975,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0641547 + "ts": 0.0642077 }, { "core_id": 1, @@ -7609,10 +8985,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 4294967295 }, - "ts": 0.064166575 + "ts": 0.0642198 }, { "core_id": 0, @@ -7620,7 +8996,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.06417785 + "ts": 0.064231025 }, { "core_id": 1, @@ -7630,10 +9006,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.0641895 + "ts": 0.06424335 }, { "core_id": 1, @@ -7643,10 +9019,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.06420995 + "ts": 0.0642596 }, { "core_id": 1, @@ -7654,8 +9030,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (372) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb788\n", - "ts": 0.0642735 + "msg": "I (359) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf60\n", + "ts": 0.064307475 }, { "core_id": 1, @@ -7663,15 +9039,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (372) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb788\n", - "ts": 0.0642735 + "msg": "I (359) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf60\n", + "ts": 0.064307475 }, { - "addr": "0x3ffbb788", + "addr": "0x3ffbaf60", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -7685,7 +9061,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.0642947 + "ts": 0.064328875 }, { "core_id": 1, @@ -7695,7 +9071,7 @@ "params": { "irq_num": 31 }, - "ts": 0.064321575 + "ts": 0.06435975 }, { "core_id": 1, @@ -7703,7 +9079,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.064333 + "ts": 0.064371325 }, { "core_id": 1, @@ -7711,7 +9087,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.064349575 + "ts": 0.064388025 }, { "core_id": 1, @@ -7721,7 +9097,7 @@ "params": { "irq_num": 5 }, - "ts": 0.064666425 + "ts": 0.0644482 }, { "core_id": 1, @@ -7729,7 +9105,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.06467985 + "ts": 0.064461625 }, { "core_id": 1, @@ -7737,7 +9113,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.06469555 + "ts": 0.0644772 }, { "core_id": 0, @@ -7747,7 +9123,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0648338 + "ts": 0.06454665 }, { "core_id": 0, @@ -7755,7 +9131,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.064849175 + "ts": 0.06456205 }, { "core_id": 0, @@ -7763,7 +9139,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.06486425 + "ts": 0.064577275 }, { "core_id": 1, @@ -7773,7 +9149,7 @@ "params": { "irq_num": 5 }, - "ts": 0.065666425 + "ts": 0.0654482 }, { "core_id": 1, @@ -7781,7 +9157,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.065680075 + "ts": 0.065461725 }, { "core_id": 1, @@ -7789,7 +9165,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.06569535 + "ts": 0.06547685 }, { "core_id": 0, @@ -7799,7 +9175,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0658338 + "ts": 0.06554665 }, { "core_id": 0, @@ -7807,7 +9183,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.065849175 + "ts": 0.065562 }, { "core_id": 0, @@ -7815,7 +9191,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.06586425 + "ts": 0.065577075 }, { "core_id": 1, @@ -7825,7 +9201,7 @@ "params": { "irq_num": 5 }, - "ts": 0.066666425 + "ts": 0.0664482 }, { "core_id": 1, @@ -7833,7 +9209,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.06668 + "ts": 0.066461725 }, { "core_id": 1, @@ -7841,7 +9217,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.066695125 + "ts": 0.066476975 }, { "core_id": 0, @@ -7851,7 +9227,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0668338 + "ts": 0.06654665 }, { "core_id": 0, @@ -7859,7 +9235,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.066849175 + "ts": 0.066562025 }, { "core_id": 0, @@ -7867,7 +9243,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.06686425 + "ts": 0.066577225 }, { "core_id": 1, @@ -7877,7 +9253,7 @@ "params": { "irq_num": 5 }, - "ts": 0.067666425 + "ts": 0.0674482 }, { "core_id": 1, @@ -7885,7 +9261,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.067680075 + "ts": 0.067461775 }, { "core_id": 1, @@ -7893,7 +9269,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.067695225 + "ts": 0.0674769 }, { "core_id": 0, @@ -7903,7 +9279,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0678338 + "ts": 0.06754665 }, { "core_id": 0, @@ -7911,7 +9287,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0678492 + "ts": 0.067562 }, { "core_id": 0, @@ -7919,7 +9295,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.067864425 + "ts": 0.067577075 }, { "core_id": 1, @@ -7929,7 +9305,7 @@ "params": { "irq_num": 5 }, - "ts": 0.068666425 + "ts": 0.0684482 }, { "core_id": 1, @@ -7937,7 +9313,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.06867995 + "ts": 0.068461725 }, { "core_id": 1, @@ -7945,7 +9321,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0686951 + "ts": 0.06847685 }, { "core_id": 0, @@ -7955,7 +9331,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0688338 + "ts": 0.06854665 }, { "core_id": 0, @@ -7963,7 +9339,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.068849175 + "ts": 0.06856205 }, { "core_id": 0, @@ -7971,7 +9347,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.06886425 + "ts": 0.068577275 }, { "core_id": 1, @@ -7981,7 +9357,7 @@ "params": { "irq_num": 5 }, - "ts": 0.069666425 + "ts": 0.0694482 }, { "core_id": 1, @@ -7989,7 +9365,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.069680075 + "ts": 0.069461725 }, { "core_id": 1, @@ -7997,7 +9373,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.06969535 + "ts": 0.06947685 }, { "core_id": 0, @@ -8007,7 +9383,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0698338 + "ts": 0.06954665 }, { "core_id": 0, @@ -8015,7 +9391,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.069849175 + "ts": 0.069562 }, { "core_id": 0, @@ -8023,7 +9399,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.069868575 + "ts": 0.069577075 }, { "core_id": 1, @@ -8033,7 +9409,7 @@ "params": { "irq_num": 5 }, - "ts": 0.070666425 + "ts": 0.0704482 }, { "core_id": 1, @@ -8041,7 +9417,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.07067995 + "ts": 0.070461725 }, { "core_id": 1, @@ -8049,7 +9425,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0706951 + "ts": 0.070476975 }, { "core_id": 0, @@ -8059,7 +9435,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0708338 + "ts": 0.07054665 }, { "core_id": 0, @@ -8067,7 +9443,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.070849175 + "ts": 0.070562025 }, { "core_id": 0, @@ -8075,7 +9451,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.07086425 + "ts": 0.070577225 }, { "core_id": 1, @@ -8085,7 +9461,7 @@ "params": { "irq_num": 5 }, - "ts": 0.071666425 + "ts": 0.0714482 }, { "core_id": 1, @@ -8093,7 +9469,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.071680075 + "ts": 0.071461775 }, { "core_id": 1, @@ -8101,7 +9477,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.07169535 + "ts": 0.0714769 }, { "core_id": 0, @@ -8111,7 +9487,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0718338 + "ts": 0.07154665 }, { "core_id": 0, @@ -8119,7 +9495,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.071849175 + "ts": 0.071562 }, { "core_id": 0, @@ -8127,7 +9503,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.07186425 + "ts": 0.071577075 }, { "core_id": 1, @@ -8137,7 +9513,7 @@ "params": { "irq_num": 5 }, - "ts": 0.072666425 + "ts": 0.0724482 }, { "core_id": 1, @@ -8145,7 +9521,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.07268 + "ts": 0.072461725 }, { "core_id": 1, @@ -8153,7 +9529,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.072695125 + "ts": 0.07247685 }, { "core_id": 0, @@ -8163,7 +9539,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0728338 + "ts": 0.07254665 }, { "core_id": 0, @@ -8171,7 +9547,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.072849175 + "ts": 0.07256205 }, { "core_id": 0, @@ -8179,7 +9555,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.07286425 + "ts": 0.072577275 }, { "core_id": 1, @@ -8189,7 +9565,7 @@ "params": { "irq_num": 5 }, - "ts": 0.073666425 + "ts": 0.0734482 }, { "core_id": 1, @@ -8197,7 +9573,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.073680075 + "ts": 0.073461725 }, { "core_id": 1, @@ -8205,7 +9581,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.073695225 + "ts": 0.07347685 }, { "core_id": 0, @@ -8215,7 +9591,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0738338 + "ts": 0.07354665 }, { "core_id": 0, @@ -8223,7 +9599,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0738492 + "ts": 0.073562 }, { "core_id": 0, @@ -8231,7 +9607,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.073864425 + "ts": 0.073577075 }, { "core_id": 1, @@ -8241,7 +9617,7 @@ "params": { "irq_num": 5 }, - "ts": 0.074666425 + "ts": 0.0744482 }, { "core_id": 1, @@ -8249,7 +9625,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.07467995 + "ts": 0.074465975 }, { "core_id": 1, @@ -8257,7 +9633,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0746951 + "ts": 0.074481225 }, { "core_id": 0, @@ -8267,7 +9643,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0748338 + "ts": 0.07454665 }, { "core_id": 0, @@ -8275,7 +9651,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.074849175 + "ts": 0.074562 }, { "core_id": 0, @@ -8283,7 +9659,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.07486425 + "ts": 0.074577075 }, { "core_id": 1, @@ -8293,7 +9669,7 @@ "params": { "irq_num": 5 }, - "ts": 0.075666425 + "ts": 0.0754482 }, { "core_id": 1, @@ -8301,7 +9677,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.075680075 + "ts": 0.075461725 }, { "core_id": 1, @@ -8309,7 +9685,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.07569535 + "ts": 0.07547685 }, { "core_id": 0, @@ -8319,7 +9695,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0758338 + "ts": 0.07554665 }, { "core_id": 0, @@ -8327,7 +9703,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.075849175 + "ts": 0.07556205 }, { "core_id": 0, @@ -8335,7 +9711,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.07586425 + "ts": 0.075577275 }, { "core_id": 1, @@ -8345,7 +9721,7 @@ "params": { "irq_num": 5 }, - "ts": 0.076666425 + "ts": 0.0764482 }, { "core_id": 1, @@ -8353,7 +9729,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.07668 + "ts": 0.076461725 }, { "core_id": 1, @@ -8361,7 +9737,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.076695125 + "ts": 0.07647685 }, { "core_id": 0, @@ -8371,7 +9747,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0768338 + "ts": 0.07654665 }, { "core_id": 0, @@ -8379,7 +9755,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.076849175 + "ts": 0.076562 }, { "core_id": 0, @@ -8387,7 +9763,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.07686425 + "ts": 0.076577075 }, { "core_id": 1, @@ -8397,7 +9773,7 @@ "params": { "irq_num": 5 }, - "ts": 0.077666425 + "ts": 0.0774482 }, { "core_id": 1, @@ -8405,7 +9781,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.077680075 + "ts": 0.077461725 }, { "core_id": 1, @@ -8413,7 +9789,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.077695225 + "ts": 0.077476975 }, { "core_id": 0, @@ -8423,7 +9799,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0778338 + "ts": 0.07754665 }, { "core_id": 0, @@ -8431,7 +9807,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0778492 + "ts": 0.077562025 }, { "core_id": 0, @@ -8439,7 +9815,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.077864425 + "ts": 0.077577225 }, { "core_id": 1, @@ -8449,7 +9825,7 @@ "params": { "irq_num": 5 }, - "ts": 0.078666425 + "ts": 0.0784482 }, { "core_id": 1, @@ -8457,7 +9833,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.07867995 + "ts": 0.078461775 }, { "core_id": 1, @@ -8465,7 +9841,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0786951 + "ts": 0.0784769 }, { "core_id": 0, @@ -8475,7 +9851,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0788338 + "ts": 0.07854665 }, { "core_id": 0, @@ -8483,7 +9859,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.078849175 + "ts": 0.078562 }, { "core_id": 0, @@ -8491,7 +9867,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.07886425 + "ts": 0.078577075 }, { "core_id": 1, @@ -8501,7 +9877,7 @@ "params": { "irq_num": 5 }, - "ts": 0.079666425 + "ts": 0.0794482 }, { "core_id": 1, @@ -8509,7 +9885,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.079680075 + "ts": 0.079461725 }, { "core_id": 1, @@ -8517,7 +9893,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.07969535 + "ts": 0.07947685 }, { "core_id": 0, @@ -8527,7 +9903,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0798338 + "ts": 0.07954665 }, { "core_id": 0, @@ -8535,7 +9911,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.079849175 + "ts": 0.07956205 }, { "core_id": 0, @@ -8543,7 +9919,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.07986425 + "ts": 0.079577275 }, { "core_id": 1, @@ -8553,7 +9929,7 @@ "params": { "irq_num": 5 }, - "ts": 0.080666425 + "ts": 0.0804482 }, { "core_id": 1, @@ -8561,7 +9937,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.08068 + "ts": 0.080461725 }, { "core_id": 1, @@ -8569,7 +9945,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.080695125 + "ts": 0.08047685 }, { "core_id": 0, @@ -8579,7 +9955,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0808338 + "ts": 0.08054665 }, { "core_id": 0, @@ -8587,7 +9963,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.080849175 + "ts": 0.080562 }, { "core_id": 0, @@ -8595,7 +9971,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.08086425 + "ts": 0.080577075 }, { "core_id": 1, @@ -8605,7 +9981,7 @@ "params": { "irq_num": 5 }, - "ts": 0.081666425 + "ts": 0.0814482 }, { "core_id": 1, @@ -8613,7 +9989,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.081680075 + "ts": 0.081461725 }, { "core_id": 1, @@ -8621,7 +9997,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.081695225 + "ts": 0.081476975 }, { "core_id": 0, @@ -8631,7 +10007,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0818338 + "ts": 0.08154665 }, { "core_id": 0, @@ -8639,7 +10015,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0818492 + "ts": 0.081562025 }, { "core_id": 0, @@ -8647,7 +10023,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.081864425 + "ts": 0.081577225 }, { "core_id": 1, @@ -8657,7 +10033,7 @@ "params": { "irq_num": 5 }, - "ts": 0.082666425 + "ts": 0.0824482 }, { "core_id": 1, @@ -8665,7 +10041,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.082680075 + "ts": 0.082461775 }, { "core_id": 1, @@ -8673,7 +10049,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.08269535 + "ts": 0.0824769 }, { "core_id": 0, @@ -8683,7 +10059,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0828338 + "ts": 0.08254665 }, { "core_id": 0, @@ -8691,7 +10067,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.082849175 + "ts": 0.082562 }, { "core_id": 0, @@ -8699,7 +10075,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.08286425 + "ts": 0.082577075 }, { "core_id": 1, @@ -8709,7 +10085,7 @@ "params": { "irq_num": 5 }, - "ts": 0.083666425 + "ts": 0.0834482 }, { "core_id": 1, @@ -8717,7 +10093,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.08368 + "ts": 0.083461725 }, { "core_id": 1, @@ -8725,7 +10101,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.083695125 + "ts": 0.08347685 }, { "core_id": 0, @@ -8735,7 +10111,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0838338 + "ts": 0.08354665 }, { "core_id": 0, @@ -8743,7 +10119,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.083849175 + "ts": 0.08356205 }, { "core_id": 0, @@ -8751,7 +10127,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.08386425 + "ts": 0.083577275 }, { "core_id": 1, @@ -8761,7 +10137,7 @@ "params": { "irq_num": 5 }, - "ts": 0.084666425 + "ts": 0.0844482 }, { "core_id": 1, @@ -8769,7 +10145,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.084680075 + "ts": 0.084461725 }, { "core_id": 1, @@ -8777,7 +10153,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.084695225 + "ts": 0.08447685 }, { "core_id": 0, @@ -8787,7 +10163,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0848338 + "ts": 0.08454665 }, { "core_id": 0, @@ -8795,7 +10171,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0848492 + "ts": 0.084562 }, { "core_id": 0, @@ -8803,7 +10179,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.084864425 + "ts": 0.084577075 }, { "core_id": 1, @@ -8813,7 +10189,7 @@ "params": { "irq_num": 5 }, - "ts": 0.085666425 + "ts": 0.0854482 }, { "core_id": 1, @@ -8821,7 +10197,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.08567995 + "ts": 0.085461725 }, { "core_id": 1, @@ -8829,7 +10205,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0856951 + "ts": 0.085476975 }, { "core_id": 0, @@ -8839,7 +10215,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0858338 + "ts": 0.08554665 }, { "core_id": 0, @@ -8847,7 +10223,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.085849175 + "ts": 0.085562025 }, { "core_id": 0, @@ -8855,7 +10231,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.08586425 + "ts": 0.085577225 }, { "core_id": 1, @@ -8865,7 +10241,7 @@ "params": { "irq_num": 5 }, - "ts": 0.086666425 + "ts": 0.0864482 }, { "core_id": 1, @@ -8873,7 +10249,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.086680075 + "ts": 0.0864653 }, { "core_id": 1, @@ -8881,7 +10257,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.08669535 + "ts": 0.08648045 }, { "core_id": 0, @@ -8891,7 +10267,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0868338 + "ts": 0.08654665 }, { "core_id": 0, @@ -8899,7 +10275,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.086849175 + "ts": 0.086562 }, { "core_id": 0, @@ -8907,7 +10283,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.08686425 + "ts": 0.086577075 }, { "core_id": 1, @@ -8917,7 +10293,7 @@ "params": { "irq_num": 5 }, - "ts": 0.087666425 + "ts": 0.0874482 }, { "core_id": 1, @@ -8925,7 +10301,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.08768 + "ts": 0.087461725 }, { "core_id": 1, @@ -8933,7 +10309,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.087695125 + "ts": 0.08747685 }, { "core_id": 0, @@ -8943,7 +10319,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0878338 + "ts": 0.08754665 }, { "core_id": 0, @@ -8951,7 +10327,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.087849175 + "ts": 0.08756205 }, { "core_id": 0, @@ -8959,7 +10335,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.08786425 + "ts": 0.087577275 }, { "core_id": 1, @@ -8969,7 +10345,7 @@ "params": { "irq_num": 5 }, - "ts": 0.088666425 + "ts": 0.0884482 }, { "core_id": 1, @@ -8977,7 +10353,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.088680075 + "ts": 0.088461725 }, { "core_id": 1, @@ -8985,7 +10361,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.088695225 + "ts": 0.08847685 }, { "core_id": 0, @@ -8995,7 +10371,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0888338 + "ts": 0.08854665 }, { "core_id": 0, @@ -9003,7 +10379,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0888492 + "ts": 0.088562 }, { "core_id": 0, @@ -9011,7 +10387,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.088864425 + "ts": 0.088577075 }, { "core_id": 1, @@ -9021,7 +10397,7 @@ "params": { "irq_num": 5 }, - "ts": 0.089666425 + "ts": 0.0894482 }, { "core_id": 1, @@ -9029,7 +10405,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.08967995 + "ts": 0.089461725 }, { "core_id": 1, @@ -9037,7 +10413,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0896951 + "ts": 0.089476975 }, { "core_id": 0, @@ -9047,7 +10423,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0898338 + "ts": 0.08954665 }, { "core_id": 0, @@ -9055,7 +10431,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.089849175 + "ts": 0.089562025 }, { "core_id": 0, @@ -9063,7 +10439,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.08986425 + "ts": 0.089577225 }, { "core_id": 1, @@ -9073,7 +10449,7 @@ "params": { "irq_num": 5 }, - "ts": 0.090666425 + "ts": 0.0904482 }, { "core_id": 1, @@ -9081,7 +10457,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.090680075 + "ts": 0.090461775 }, { "core_id": 1, @@ -9089,7 +10465,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.09069535 + "ts": 0.0904769 }, { "core_id": 0, @@ -9099,7 +10475,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0908338 + "ts": 0.09054665 }, { "core_id": 0, @@ -9107,7 +10483,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.090849175 + "ts": 0.090562 }, { "core_id": 0, @@ -9115,7 +10491,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.09086425 + "ts": 0.090577075 }, { "core_id": 1, @@ -9125,7 +10501,7 @@ "params": { "irq_num": 5 }, - "ts": 0.091666425 + "ts": 0.0914482 }, { "core_id": 1, @@ -9133,7 +10509,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.09168 + "ts": 0.091461725 }, { "core_id": 1, @@ -9141,7 +10517,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.091695125 + "ts": 0.09147685 }, { "core_id": 0, @@ -9151,7 +10527,59 @@ "params": { "irq_num": 5 }, - "ts": 0.0918338 + "ts": 0.09154665 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.09156205 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.091577275 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.0924482 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.092461725 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.09247685 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.09254665 }, { "core_id": 0, @@ -9159,9 +10587,19 @@ "id": 6, "in_irq": true, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.0918488 + "ts": 0.092561625 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12284596 + }, + "ts": 0.092561625 }, { "core_id": 0, @@ -9169,7 +10607,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.091861575 + "ts": 0.092574275 }, { "core_id": 0, @@ -9177,18 +10615,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.09187725 + "ts": 0.092590075 }, { - "addr": "0x3ffbb788", + "addr": "0x3ffbaf40", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -9200,16 +10638,16 @@ "id": 512, "in_irq": false, "size": 4, - "ts": 0.091912475 + "ts": 0.092625125 }, { - "addr": "0x3ffbb798", + "addr": "0x3ffbaf60", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -9221,7 +10659,7 @@ "id": 512, "in_irq": false, "size": 8, - "ts": 0.0919503 + "ts": 0.0926607 }, { "core_id": 0, @@ -9231,10 +10669,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.0919672 + "ts": 0.092677675 }, { "core_id": 0, @@ -9244,10 +10682,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.0919832 + "ts": 0.092693775 }, { "core_id": 0, @@ -9255,8 +10693,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (400) example: Task[0x3ffb7aec]: allocated 8 bytes @ 0x3ffbb798\n", - "ts": 0.09204735 + "msg": "I (388) example: Task[0x3ffb72b4]: allocated 8 bytes @ 0x3ffbaf60\n", + "ts": 0.09275055 }, { "core_id": 0, @@ -9264,8 +10702,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (400) example: Task[0x3ffb7aec]: allocated 8 bytes @ 0x3ffbb798\n", - "ts": 0.09204735 + "msg": "I (388) example: Task[0x3ffb72b4]: allocated 8 bytes @ 0x3ffbaf60\n", + "ts": 0.09275055 }, { "core_id": 0, @@ -9275,10 +10713,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 0 }, - "ts": 0.092060925 + "ts": 0.092764 }, { "core_id": 0, @@ -9286,9 +10724,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.092074075 + "ts": 0.092777225 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12287644 + }, + "ts": 0.092777225 }, { "core_id": 1, @@ -9298,7 +10746,7 @@ "params": { "irq_num": 31 }, - "ts": 0.092090275 + "ts": 0.092793475 }, { "core_id": 0, @@ -9308,7 +10756,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.092101125 + "ts": 0.092804425 }, { "core_id": 1, @@ -9316,7 +10764,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.092111925 + "ts": 0.092815175 }, { "core_id": 0, @@ -9326,7 +10774,7 @@ "params": { "irq_num": 30 }, - "ts": 0.0921258 + "ts": 0.092828925 }, { "core_id": 1, @@ -9334,9 +10782,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.092136625 + "ts": 0.09283965 }, { "core_id": 0, @@ -9344,7 +10792,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.092147475 + "ts": 0.09285045 }, { "core_id": 1, @@ -9354,10 +10802,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 4294967295 }, - "ts": 0.09215935 + "ts": 0.09286245 }, { "core_id": 0, @@ -9365,7 +10813,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.092169575 + "ts": 0.092872675 }, { "core_id": 1, @@ -9375,10 +10823,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.09218105 + "ts": 0.092884425 }, { "core_id": 1, @@ -9388,10 +10836,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.0922013 + "ts": 0.0929007 }, { "core_id": 1, @@ -9399,8 +10847,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (400) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb798\n", - "ts": 0.09226485 + "msg": "I (388) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf60\n", + "ts": 0.092948475 }, { "core_id": 1, @@ -9408,15 +10856,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (400) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb798\n", - "ts": 0.09226485 + "msg": "I (388) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf60\n", + "ts": 0.092948475 }, { - "addr": "0x3ffbb798", + "addr": "0x3ffbaf60", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -9430,7 +10878,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.09228605 + "ts": 0.09296985 }, { "core_id": 1, @@ -9440,7 +10888,7 @@ "params": { "irq_num": 31 }, - "ts": 0.09231295 + "ts": 0.0930013 }, { "core_id": 1, @@ -9448,7 +10896,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0923245 + "ts": 0.09301275 }, { "core_id": 1, @@ -9456,7 +10904,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.092341075 + "ts": 0.09302945 }, { "core_id": 1, @@ -9466,7 +10914,7 @@ "params": { "irq_num": 5 }, - "ts": 0.092666425 + "ts": 0.0934482 }, { "core_id": 1, @@ -9474,7 +10922,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.09267985 + "ts": 0.093461725 }, { "core_id": 1, @@ -9482,7 +10930,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.09269555 + "ts": 0.0934773 }, { "core_id": 0, @@ -9492,7 +10940,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0928338 + "ts": 0.09354665 }, { "core_id": 0, @@ -9500,9 +10948,39 @@ "id": 6, "in_irq": true, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.0928488 + "ts": 0.093561625 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12290612 + }, + "ts": 0.093561625 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 6, + "in_irq": true, + "params": { + "tid": 12296612 + }, + "ts": 0.0935735 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.0935735 }, { "core_id": 0, @@ -9510,7 +10988,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.092861575 + "ts": 0.093585975 }, { "core_id": 0, @@ -9518,18 +10996,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.092877375 + "ts": 0.093601625 }, { - "addr": "0x3ffbb798", + "addr": "0x3ffbaf60", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -9541,16 +11019,16 @@ "id": 512, "in_irq": false, "size": 8, - "ts": 0.092912775 + "ts": 0.093638 }, { - "addr": "0x3ffbb7a8", + "addr": "0x3ffbaf70", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -9562,7 +11040,7 @@ "id": 512, "in_irq": false, "size": 16, - "ts": 0.0929473 + "ts": 0.09367345 }, { "core_id": 0, @@ -9572,10 +11050,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.09296425 + "ts": 0.0936905 }, { "core_id": 0, @@ -9585,10 +11063,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.092984425 + "ts": 0.093706525 }, { "core_id": 0, @@ -9596,8 +11074,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (401) example: Task[0x3ffb926c]: allocated 16 bytes @ 0x3ffbb7a8\n", - "ts": 0.0930509 + "msg": "I (389) example: Task[0x3ffb8a34]: allocated 16 bytes @ 0x3ffbaf70\n", + "ts": 0.09376135 }, { "core_id": 0, @@ -9605,8 +11083,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (401) example: Task[0x3ffb926c]: allocated 16 bytes @ 0x3ffbb7a8\n", - "ts": 0.0930509 + "msg": "I (389) example: Task[0x3ffb8a34]: allocated 16 bytes @ 0x3ffbaf70\n", + "ts": 0.09376135 }, { "core_id": 0, @@ -9616,10 +11094,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 0 }, - "ts": 0.09306455 + "ts": 0.093778125 }, { "core_id": 0, @@ -9627,9 +11105,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.09307785 + "ts": 0.0937915 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12293660 + }, + "ts": 0.0937915 }, { "core_id": 1, @@ -9639,7 +11127,7 @@ "params": { "irq_num": 31 }, - "ts": 0.093094175 + "ts": 0.09380785 }, { "core_id": 0, @@ -9649,7 +11137,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.093105025 + "ts": 0.0938187 }, { "core_id": 1, @@ -9657,7 +11145,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.093115775 + "ts": 0.093829525 }, { "core_id": 0, @@ -9667,7 +11155,7 @@ "params": { "irq_num": 30 }, - "ts": 0.0931295 + "ts": 0.0938433 }, { "core_id": 1, @@ -9675,9 +11163,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.09314035 + "ts": 0.09385525 }, { "core_id": 0, @@ -9685,7 +11173,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.093151175 + "ts": 0.0938664 }, { "core_id": 1, @@ -9695,18 +11183,20 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 4294967295 }, - "ts": 0.093163025 + "ts": 0.09387835 }, { "core_id": 0, - "ctx_name": "alloc1", - "id": 17, + "ctx_name": "alloc2", + "id": 4, "in_irq": false, - "params": {}, - "ts": 0.0931733 + "params": { + "tid": 12296612 + }, + "ts": 0.09389 }, { "core_id": 1, @@ -9716,10 +11206,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.093184775 + "ts": 0.0939017 }, { "core_id": 1, @@ -9729,148 +11219,19 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.093201075 + "ts": 0.0939203 }, { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (401) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb7a8\n", - "ts": 0.093264525 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (401) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb7a8\n", - "ts": 0.093264525 - }, - { - "addr": "0x3ffbb7a8", + "addr": "0x3ffbaf84", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0" - ], - "core_id": 1, - "ctx_name": "free1", - "id": 513, - "in_irq": false, - "size": 0, - "ts": 0.09328955 - }, - { - "core_id": 1, - "ctx_name": "FROM_CPU1", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 31 - }, - "ts": 0.09331655 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.093327975 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.09334455 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.093666425 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.09367985 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.09369555 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.0938338 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 6, - "in_irq": true, - "params": { - "tid": 12298716 - }, - "ts": 0.0938488 - }, - { - "core_id": 0, - "ctx_name": "alloc1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.093861575 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 4, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.09387725 - }, - { - "addr": "0x3ffbb7a8", - "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -9882,16 +11243,34 @@ "id": 512, "in_irq": false, "size": 12, - "ts": 0.09391265 + "ts": 0.0939334 }, { - "addr": "0x3ffbb7b8", + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (389) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf70\n", + "ts": 0.09397395 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (389) example: Task[0x3ffb961c]: free memory @ 0x3ffbaf70\n", + "ts": 0.09397395 + }, + { + "addr": "0x3ffbaf94", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -9903,7 +11282,28 @@ "id": 512, "in_irq": false, "size": 24, - "ts": 0.09394705 + "ts": 0.093989825 + }, + { + "addr": "0x3ffbaf70", + "callers": [ + "0x4008da24", + "0x400d3c72", + "0x400880dc", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0" + ], + "core_id": 1, + "ctx_name": "free1", + "id": 513, + "in_irq": false, + "size": 0, + "ts": 0.094004125 }, { "core_id": 0, @@ -9913,10 +11313,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.09396395 + "ts": 0.09401655 }, { "core_id": 0, @@ -9926,51 +11326,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.09398005 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (402) example: Task[0x3ffba9dc]: allocated 24 bytes @ 0x3ffbb7b8\n", - "ts": 0.094050525 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (402) example: Task[0x3ffba9dc]: allocated 24 bytes @ 0x3ffbb7b8\n", - "ts": 0.094050525 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12299072, - "xTicksToWait": 0 - }, - "ts": 0.09406835 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 6, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.094081575 + "ts": 0.0940366 }, { "core_id": 1, @@ -9980,7 +11339,84 @@ "params": { "irq_num": 31 }, - "ts": 0.094097875 + "ts": 0.094047525 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.09405905 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.094077025 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (389) example: Task[0x3ffba1a4]: allocated 24 bytes @ 0x3ffbaf94\n", + "ts": 0.094095025 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (389) example: Task[0x3ffba1a4]: allocated 24 bytes @ 0x3ffbaf94\n", + "ts": 0.094095025 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12296968, + "xTicksToWait": 0 + }, + "ts": 0.09410845 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.094125225 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.094125225 + }, + { + "core_id": 1, + "ctx_name": "FROM_CPU1", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 31 + }, + "ts": 0.094141575 }, { "core_id": 0, @@ -9990,7 +11426,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.094108725 + "ts": 0.094152425 }, { "core_id": 1, @@ -9998,7 +11434,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0941195 + "ts": 0.09416325 }, { "core_id": 0, @@ -10008,7 +11444,7 @@ "params": { "irq_num": 30 }, - "ts": 0.094133225 + "ts": 0.09417705 }, { "core_id": 1, @@ -10016,9 +11452,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.0941441 + "ts": 0.0941878 }, { "core_id": 0, @@ -10026,7 +11462,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.094154925 + "ts": 0.0941986 }, { "core_id": 1, @@ -10036,10 +11472,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 4294967295 }, - "ts": 0.0941668 + "ts": 0.09421055 }, { "core_id": 0, @@ -10047,7 +11483,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.094178075 + "ts": 0.094221775 }, { "core_id": 1, @@ -10057,10 +11493,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.094189725 + "ts": 0.0942336 }, { "core_id": 1, @@ -10070,10 +11506,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.0942061 + "ts": 0.09424985 }, { "core_id": 1, @@ -10081,8 +11517,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (402) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb7b8\n", - "ts": 0.09426965 + "msg": "I (389) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf94\n", + "ts": 0.094297625 }, { "core_id": 1, @@ -10090,15 +11526,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (402) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb7b8\n", - "ts": 0.09426965 + "msg": "I (389) example: Task[0x3ffbad8c]: free memory @ 0x3ffbaf94\n", + "ts": 0.094297625 }, { - "addr": "0x3ffbb7b8", + "addr": "0x3ffbaf94", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -10112,7 +11548,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.09429085 + "ts": 0.094319 }, { "core_id": 1, @@ -10122,7 +11558,7 @@ "params": { "irq_num": 31 }, - "ts": 0.094321875 + "ts": 0.094346425 }, { "core_id": 1, @@ -10130,7 +11566,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.09433335 + "ts": 0.094357825 }, { "core_id": 1, @@ -10138,7 +11574,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.09435005 + "ts": 0.0943744 }, { "core_id": 1, @@ -10148,7 +11584,7 @@ "params": { "irq_num": 5 }, - "ts": 0.094666425 + "ts": 0.0944482 }, { "core_id": 1, @@ -10156,7 +11592,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.094679875 + "ts": 0.094461625 }, { "core_id": 1, @@ -10164,7 +11600,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.09469545 + "ts": 0.0944772 }, { "core_id": 0, @@ -10174,7 +11610,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0948338 + "ts": 0.09454665 }, { "core_id": 0, @@ -10182,7 +11618,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0948492 + "ts": 0.094562 }, { "core_id": 0, @@ -10190,7 +11626,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.094864425 + "ts": 0.094577075 }, { "core_id": 1, @@ -10200,7 +11636,7 @@ "params": { "irq_num": 5 }, - "ts": 0.095666425 + "ts": 0.0954482 }, { "core_id": 1, @@ -10208,7 +11644,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.09567995 + "ts": 0.095461725 }, { "core_id": 1, @@ -10216,7 +11652,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0956951 + "ts": 0.09547685 }, { "core_id": 0, @@ -10226,7 +11662,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0958338 + "ts": 0.09554665 }, { "core_id": 0, @@ -10234,7 +11670,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.095849175 + "ts": 0.09556205 }, { "core_id": 0, @@ -10242,7 +11678,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.09586425 + "ts": 0.095577275 }, { "core_id": 1, @@ -10252,7 +11688,7 @@ "params": { "irq_num": 5 }, - "ts": 0.096666425 + "ts": 0.0964482 }, { "core_id": 1, @@ -10260,7 +11696,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.096680075 + "ts": 0.096461725 }, { "core_id": 1, @@ -10268,7 +11704,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.09669535 + "ts": 0.09647685 }, { "core_id": 0, @@ -10278,7 +11714,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0968338 + "ts": 0.09654665 }, { "core_id": 0, @@ -10286,7 +11722,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.096849175 + "ts": 0.096565625 }, { "core_id": 0, @@ -10294,7 +11730,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.09686425 + "ts": 0.09658085 }, { "core_id": 1, @@ -10304,7 +11740,7 @@ "params": { "irq_num": 5 }, - "ts": 0.097666425 + "ts": 0.0974482 }, { "core_id": 1, @@ -10312,7 +11748,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.09768 + "ts": 0.097461725 }, { "core_id": 1, @@ -10320,7 +11756,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.097695125 + "ts": 0.09747685 }, { "core_id": 0, @@ -10330,7 +11766,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0978338 + "ts": 0.09754665 }, { "core_id": 0, @@ -10338,7 +11774,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.097849175 + "ts": 0.097562 }, { "core_id": 0, @@ -10346,7 +11782,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.09786425 + "ts": 0.097577075 }, { "core_id": 1, @@ -10356,7 +11792,7 @@ "params": { "irq_num": 5 }, - "ts": 0.098666425 + "ts": 0.0984482 }, { "core_id": 1, @@ -10364,7 +11800,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.098680075 + "ts": 0.098461725 }, { "core_id": 1, @@ -10372,7 +11808,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.098695225 + "ts": 0.098476975 }, { "core_id": 0, @@ -10382,7 +11818,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0988338 + "ts": 0.09854665 }, { "core_id": 0, @@ -10390,7 +11826,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.0988492 + "ts": 0.098562025 }, { "core_id": 0, @@ -10398,7 +11834,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.098864425 + "ts": 0.098577225 }, { "core_id": 1, @@ -10408,7 +11844,7 @@ "params": { "irq_num": 5 }, - "ts": 0.099666425 + "ts": 0.0994482 }, { "core_id": 1, @@ -10416,7 +11852,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.09967995 + "ts": 0.099461775 }, { "core_id": 1, @@ -10424,7 +11860,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.0996951 + "ts": 0.0994769 }, { "core_id": 0, @@ -10434,7 +11870,7 @@ "params": { "irq_num": 5 }, - "ts": 0.0998338 + "ts": 0.09954665 }, { "core_id": 0, @@ -10442,7 +11878,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.099849175 + "ts": 0.099562 }, { "core_id": 0, @@ -10450,7 +11886,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.09986425 + "ts": 0.099577075 }, { "core_id": 1, @@ -10460,7 +11896,7 @@ "params": { "irq_num": 5 }, - "ts": 0.100666425 + "ts": 0.1004482 }, { "core_id": 1, @@ -10468,7 +11904,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.100680075 + "ts": 0.100461725 }, { "core_id": 1, @@ -10476,7 +11912,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.10069535 + "ts": 0.10047685 }, { "core_id": 0, @@ -10486,7 +11922,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1008338 + "ts": 0.10054665 }, { "core_id": 0, @@ -10494,7 +11930,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.100849175 + "ts": 0.10056205 }, { "core_id": 0, @@ -10502,7 +11938,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.10086425 + "ts": 0.100577275 }, { "core_id": 1, @@ -10512,7 +11948,7 @@ "params": { "irq_num": 5 }, - "ts": 0.101666425 + "ts": 0.1014482 }, { "core_id": 1, @@ -10520,7 +11956,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.10168 + "ts": 0.101461725 }, { "core_id": 1, @@ -10528,7 +11964,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.101695125 + "ts": 0.10147685 }, { "core_id": 0, @@ -10538,7 +11974,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1018338 + "ts": 0.10154665 }, { "core_id": 0, @@ -10546,7 +11982,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.101849175 + "ts": 0.101562 }, { "core_id": 0, @@ -10554,7 +11990,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.10186425 + "ts": 0.101577075 }, { "core_id": 1, @@ -10564,7 +12000,7 @@ "params": { "irq_num": 5 }, - "ts": 0.102666425 + "ts": 0.1024482 }, { "core_id": 1, @@ -10572,7 +12008,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.102680075 + "ts": 0.102461725 }, { "core_id": 1, @@ -10580,7 +12016,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.102695225 + "ts": 0.102476975 }, { "core_id": 0, @@ -10590,7 +12026,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1028338 + "ts": 0.10254665 }, { "core_id": 0, @@ -10598,7 +12034,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1028492 + "ts": 0.102562025 }, { "core_id": 0, @@ -10606,7 +12042,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.102864425 + "ts": 0.102577225 }, { "core_id": 1, @@ -10616,7 +12052,7 @@ "params": { "irq_num": 5 }, - "ts": 0.103666425 + "ts": 0.1034482 }, { "core_id": 1, @@ -10624,7 +12060,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.10367995 + "ts": 0.103461775 }, { "core_id": 1, @@ -10632,7 +12068,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1036951 + "ts": 0.1034769 }, { "core_id": 0, @@ -10642,7 +12078,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1038338 + "ts": 0.10354665 }, { "core_id": 0, @@ -10650,7 +12086,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.103849175 + "ts": 0.103562 }, { "core_id": 0, @@ -10658,7 +12094,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.10386425 + "ts": 0.103577075 }, { "core_id": 1, @@ -10668,7 +12104,7 @@ "params": { "irq_num": 5 }, - "ts": 0.104666425 + "ts": 0.1044482 }, { "core_id": 1, @@ -10676,7 +12112,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.104683575 + "ts": 0.104461725 }, { "core_id": 1, @@ -10684,7 +12120,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.104698725 + "ts": 0.10447685 }, { "core_id": 0, @@ -10694,7 +12130,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1048338 + "ts": 0.10454665 }, { "core_id": 0, @@ -10702,7 +12138,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.104849175 + "ts": 0.10456205 }, { "core_id": 0, @@ -10710,7 +12146,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.10486425 + "ts": 0.104577275 }, { "core_id": 1, @@ -10720,7 +12156,7 @@ "params": { "irq_num": 5 }, - "ts": 0.105666425 + "ts": 0.1054482 }, { "core_id": 1, @@ -10728,7 +12164,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.105680075 + "ts": 0.105461725 }, { "core_id": 1, @@ -10736,7 +12172,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.105695225 + "ts": 0.10547685 }, { "core_id": 0, @@ -10746,7 +12182,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1058338 + "ts": 0.10554665 }, { "core_id": 0, @@ -10754,7 +12190,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1058492 + "ts": 0.105562 }, { "core_id": 0, @@ -10762,7 +12198,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.105864425 + "ts": 0.105577075 }, { "core_id": 1, @@ -10772,7 +12208,7 @@ "params": { "irq_num": 5 }, - "ts": 0.106666425 + "ts": 0.1064482 }, { "core_id": 1, @@ -10780,7 +12216,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.10667995 + "ts": 0.106461725 }, { "core_id": 1, @@ -10788,7 +12224,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1066951 + "ts": 0.106476975 }, { "core_id": 0, @@ -10798,7 +12234,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1068338 + "ts": 0.10654665 }, { "core_id": 0, @@ -10806,7 +12242,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.106849175 + "ts": 0.106562025 }, { "core_id": 0, @@ -10814,7 +12250,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.10686425 + "ts": 0.106577225 }, { "core_id": 1, @@ -10824,7 +12260,7 @@ "params": { "irq_num": 5 }, - "ts": 0.107666425 + "ts": 0.1074482 }, { "core_id": 1, @@ -10832,7 +12268,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.107680075 + "ts": 0.107461775 }, { "core_id": 1, @@ -10840,7 +12276,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.10769535 + "ts": 0.1074769 }, { "core_id": 0, @@ -10850,7 +12286,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1078338 + "ts": 0.10754665 }, { "core_id": 0, @@ -10858,7 +12294,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.107849175 + "ts": 0.107562 }, { "core_id": 0, @@ -10866,7 +12302,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.10786425 + "ts": 0.107577075 }, { "core_id": 1, @@ -10876,7 +12312,7 @@ "params": { "irq_num": 5 }, - "ts": 0.108666425 + "ts": 0.1084482 }, { "core_id": 1, @@ -10884,7 +12320,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.10868 + "ts": 0.108461725 }, { "core_id": 1, @@ -10892,7 +12328,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.108695125 + "ts": 0.10847685 }, { "core_id": 0, @@ -10902,7 +12338,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1088338 + "ts": 0.10854665 }, { "core_id": 0, @@ -10910,7 +12346,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.108849175 + "ts": 0.1085663 }, { "core_id": 0, @@ -10918,7 +12354,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.10886425 + "ts": 0.1085815 }, { "core_id": 1, @@ -10928,7 +12364,7 @@ "params": { "irq_num": 5 }, - "ts": 0.109666425 + "ts": 0.1094482 }, { "core_id": 1, @@ -10936,7 +12372,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.109680075 + "ts": 0.109461725 }, { "core_id": 1, @@ -10944,7 +12380,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.109695225 + "ts": 0.10947685 }, { "core_id": 0, @@ -10954,7 +12390,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1098338 + "ts": 0.10954665 }, { "core_id": 0, @@ -10962,7 +12398,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1098492 + "ts": 0.109562 }, { "core_id": 0, @@ -10970,7 +12406,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.109864425 + "ts": 0.109577075 }, { "core_id": 1, @@ -10980,7 +12416,7 @@ "params": { "irq_num": 5 }, - "ts": 0.110666425 + "ts": 0.1104482 }, { "core_id": 1, @@ -10988,7 +12424,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.11067995 + "ts": 0.110461725 }, { "core_id": 1, @@ -10996,7 +12432,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1106951 + "ts": 0.110476975 }, { "core_id": 0, @@ -11006,7 +12442,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1108338 + "ts": 0.11054665 }, { "core_id": 0, @@ -11014,7 +12450,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.110849175 + "ts": 0.110562025 }, { "core_id": 0, @@ -11022,7 +12458,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.11086425 + "ts": 0.110577225 }, { "core_id": 1, @@ -11032,7 +12468,7 @@ "params": { "irq_num": 5 }, - "ts": 0.111666425 + "ts": 0.1114482 }, { "core_id": 1, @@ -11040,7 +12476,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.111680075 + "ts": 0.111461775 }, { "core_id": 1, @@ -11048,7 +12484,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.11169535 + "ts": 0.1114769 }, { "core_id": 0, @@ -11058,7 +12494,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1118338 + "ts": 0.11154665 }, { "core_id": 0, @@ -11066,7 +12502,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.111849175 + "ts": 0.111562 }, { "core_id": 0, @@ -11074,7 +12510,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.11186425 + "ts": 0.111577075 }, { "core_id": 1, @@ -11084,7 +12520,7 @@ "params": { "irq_num": 5 }, - "ts": 0.112666425 + "ts": 0.1124482 }, { "core_id": 1, @@ -11092,7 +12528,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.11268 + "ts": 0.112461725 }, { "core_id": 1, @@ -11100,7 +12536,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.112695125 + "ts": 0.11247685 }, { "core_id": 0, @@ -11110,7 +12546,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1128338 + "ts": 0.11254665 }, { "core_id": 0, @@ -11118,7 +12554,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.112849175 + "ts": 0.11256205 }, { "core_id": 0, @@ -11126,7 +12562,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.11286425 + "ts": 0.112577275 }, { "core_id": 1, @@ -11136,7 +12572,7 @@ "params": { "irq_num": 5 }, - "ts": 0.113666425 + "ts": 0.1134482 }, { "core_id": 1, @@ -11144,7 +12580,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.113680075 + "ts": 0.113461725 }, { "core_id": 1, @@ -11152,7 +12588,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.113695225 + "ts": 0.11347685 }, { "core_id": 0, @@ -11162,7 +12598,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1138338 + "ts": 0.11354665 }, { "core_id": 0, @@ -11170,7 +12606,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1138492 + "ts": 0.113562 }, { "core_id": 0, @@ -11178,7 +12614,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.113864425 + "ts": 0.113577075 }, { "core_id": 1, @@ -11188,7 +12624,7 @@ "params": { "irq_num": 5 }, - "ts": 0.114666425 + "ts": 0.1144482 }, { "core_id": 1, @@ -11196,7 +12632,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.11467995 + "ts": 0.114461725 }, { "core_id": 1, @@ -11204,7 +12640,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1146951 + "ts": 0.114476975 }, { "core_id": 0, @@ -11214,7 +12650,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1148338 + "ts": 0.11454665 }, { "core_id": 0, @@ -11222,7 +12658,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.114849175 + "ts": 0.114562025 }, { "core_id": 0, @@ -11230,7 +12666,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.11486425 + "ts": 0.114577225 }, { "core_id": 1, @@ -11240,7 +12676,7 @@ "params": { "irq_num": 5 }, - "ts": 0.115666425 + "ts": 0.1154482 }, { "core_id": 1, @@ -11248,7 +12684,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.115680075 + "ts": 0.115461775 }, { "core_id": 1, @@ -11256,7 +12692,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.11569535 + "ts": 0.1154769 }, { "core_id": 0, @@ -11266,7 +12702,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1158338 + "ts": 0.11554665 }, { "core_id": 0, @@ -11274,7 +12710,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.115849175 + "ts": 0.115562 }, { "core_id": 0, @@ -11282,7 +12718,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.11586425 + "ts": 0.115577075 }, { "core_id": 1, @@ -11292,7 +12728,7 @@ "params": { "irq_num": 5 }, - "ts": 0.116666425 + "ts": 0.1164482 }, { "core_id": 1, @@ -11300,7 +12736,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.116684225 + "ts": 0.116461725 }, { "core_id": 1, @@ -11308,7 +12744,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.116699375 + "ts": 0.11647685 }, { "core_id": 0, @@ -11318,7 +12754,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1168338 + "ts": 0.11654665 }, { "core_id": 0, @@ -11326,7 +12762,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.116849175 + "ts": 0.11656205 }, { "core_id": 0, @@ -11334,7 +12770,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.11686425 + "ts": 0.116577275 }, { "core_id": 1, @@ -11344,7 +12780,7 @@ "params": { "irq_num": 5 }, - "ts": 0.117666425 + "ts": 0.1174482 }, { "core_id": 1, @@ -11352,7 +12788,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.117680075 + "ts": 0.117461725 }, { "core_id": 1, @@ -11360,7 +12796,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.117695225 + "ts": 0.11747685 }, { "core_id": 0, @@ -11370,7 +12806,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1178338 + "ts": 0.11754665 }, { "core_id": 0, @@ -11378,7 +12814,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1178492 + "ts": 0.117562 }, { "core_id": 0, @@ -11386,7 +12822,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.117864425 + "ts": 0.117577075 }, { "core_id": 1, @@ -11396,7 +12832,7 @@ "params": { "irq_num": 5 }, - "ts": 0.118666425 + "ts": 0.1184482 }, { "core_id": 1, @@ -11404,7 +12840,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.11867995 + "ts": 0.118461725 }, { "core_id": 1, @@ -11412,7 +12848,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1186951 + "ts": 0.118476975 }, { "core_id": 0, @@ -11422,7 +12858,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1188338 + "ts": 0.11854665 }, { "core_id": 0, @@ -11430,7 +12866,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.118849175 + "ts": 0.118562025 }, { "core_id": 0, @@ -11438,7 +12874,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.11886425 + "ts": 0.118577225 }, { "core_id": 1, @@ -11448,7 +12884,7 @@ "params": { "irq_num": 5 }, - "ts": 0.119666425 + "ts": 0.1194482 }, { "core_id": 1, @@ -11456,7 +12892,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.119680075 + "ts": 0.119461775 }, { "core_id": 1, @@ -11464,7 +12900,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.11969535 + "ts": 0.1194769 }, { "core_id": 0, @@ -11474,7 +12910,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1198338 + "ts": 0.11954665 }, { "core_id": 0, @@ -11482,7 +12918,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.119849175 + "ts": 0.119562 }, { "core_id": 0, @@ -11490,7 +12926,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.11986425 + "ts": 0.119577075 }, { "core_id": 1, @@ -11500,7 +12936,7 @@ "params": { "irq_num": 5 }, - "ts": 0.120666425 + "ts": 0.1204482 }, { "core_id": 1, @@ -11508,7 +12944,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.12068 + "ts": 0.120461725 }, { "core_id": 1, @@ -11516,7 +12952,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.120695125 + "ts": 0.12047685 }, { "core_id": 0, @@ -11526,7 +12962,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1208338 + "ts": 0.12054665 }, { "core_id": 0, @@ -11534,7 +12970,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.120849175 + "ts": 0.1205663 }, { "core_id": 0, @@ -11542,7 +12978,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.12086425 + "ts": 0.1205815 }, { "core_id": 1, @@ -11552,7 +12988,7 @@ "params": { "irq_num": 5 }, - "ts": 0.121666425 + "ts": 0.1214482 }, { "core_id": 1, @@ -11560,7 +12996,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.121680075 + "ts": 0.121461725 }, { "core_id": 1, @@ -11568,7 +13004,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.121695225 + "ts": 0.12147685 }, { "core_id": 0, @@ -11578,7 +13014,59 @@ "params": { "irq_num": 5 }, - "ts": 0.1218338 + "ts": 0.12154665 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.121562 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.121577075 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.1224482 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.122461725 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.122476975 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.12254665 }, { "core_id": 0, @@ -11586,9 +13074,19 @@ "id": 6, "in_irq": true, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.121848825 + "ts": 0.122561625 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12284596 + }, + "ts": 0.122561625 }, { "core_id": 0, @@ -11596,7 +13094,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.121861575 + "ts": 0.122574225 }, { "core_id": 0, @@ -11604,18 +13102,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.12187725 + "ts": 0.122589875 }, { - "addr": "0x3ffbb7b8", + "addr": "0x3ffbaf70", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -11627,16 +13125,16 @@ "id": 512, "in_irq": false, "size": 5, - "ts": 0.121912575 + "ts": 0.1226249 }, { - "addr": "0x3ffbb7c8", + "addr": "0x3ffbaf94", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -11648,7 +13146,7 @@ "id": 512, "in_irq": false, "size": 10, - "ts": 0.121947 + "ts": 0.122660375 }, { "core_id": 0, @@ -11658,10 +13156,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.121964025 + "ts": 0.1226773 }, { "core_id": 0, @@ -11671,10 +13169,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.121980025 + "ts": 0.12269325 }, { "core_id": 0, @@ -11682,8 +13180,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (430) example: Task[0x3ffb7aec]: allocated 10 bytes @ 0x3ffbb7c8\n", - "ts": 0.12205045 + "msg": "I (418) example: Task[0x3ffb72b4]: allocated 10 bytes @ 0x3ffbaf94\n", + "ts": 0.122748025 }, { "core_id": 0, @@ -11691,8 +13189,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (430) example: Task[0x3ffb7aec]: allocated 10 bytes @ 0x3ffbb7c8\n", - "ts": 0.12205045 + "msg": "I (418) example: Task[0x3ffb72b4]: allocated 10 bytes @ 0x3ffbaf94\n", + "ts": 0.122748025 }, { "core_id": 0, @@ -11702,10 +13200,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 0 }, - "ts": 0.122068175 + "ts": 0.1227615 }, { "core_id": 0, @@ -11713,9 +13211,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.1220814 + "ts": 0.12277885 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12287644 + }, + "ts": 0.12277885 }, { "core_id": 1, @@ -11725,7 +13233,7 @@ "params": { "irq_num": 31 }, - "ts": 0.12209765 + "ts": 0.1227951 }, { "core_id": 0, @@ -11735,7 +13243,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.1221085 + "ts": 0.12280605 }, { "core_id": 1, @@ -11743,7 +13251,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.122119275 + "ts": 0.122816825 }, { "core_id": 0, @@ -11753,7 +13261,7 @@ "params": { "irq_num": 30 }, - "ts": 0.1221331 + "ts": 0.12283055 }, { "core_id": 1, @@ -11761,9 +13269,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.122144 + "ts": 0.1228413 }, { "core_id": 0, @@ -11771,7 +13279,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.122154825 + "ts": 0.1228521 }, { "core_id": 1, @@ -11781,10 +13289,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 4294967295 }, - "ts": 0.122166775 + "ts": 0.122864075 }, { "core_id": 0, @@ -11792,7 +13300,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.122177025 + "ts": 0.122874325 }, { "core_id": 1, @@ -11802,10 +13310,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.12218845 + "ts": 0.122886075 }, { "core_id": 1, @@ -11815,10 +13323,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.1222048 + "ts": 0.12290235 }, { "core_id": 1, @@ -11826,8 +13334,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (430) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb7c8\n", - "ts": 0.12226835 + "msg": "I (418) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf94\n", + "ts": 0.122950125 }, { "core_id": 1, @@ -11835,15 +13343,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (430) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb7c8\n", - "ts": 0.12226835 + "msg": "I (418) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbaf94\n", + "ts": 0.122950125 }, { - "addr": "0x3ffbb7c8", + "addr": "0x3ffbaf94", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -11857,7 +13365,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.12228955 + "ts": 0.1229715 }, { "core_id": 1, @@ -11867,7 +13375,7 @@ "params": { "irq_num": 31 }, - "ts": 0.122320575 + "ts": 0.1229989 }, { "core_id": 1, @@ -11875,7 +13383,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.122332175 + "ts": 0.123010325 }, { "core_id": 1, @@ -11883,7 +13391,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.122348875 + "ts": 0.123026875 }, { "core_id": 1, @@ -11893,7 +13401,7 @@ "params": { "irq_num": 5 }, - "ts": 0.122666425 + "ts": 0.1234482 }, { "core_id": 1, @@ -11901,7 +13409,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.122679875 + "ts": 0.123461725 }, { "core_id": 1, @@ -11909,7 +13417,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.12269545 + "ts": 0.1234773 }, { "core_id": 0, @@ -11919,7 +13427,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1228338 + "ts": 0.12354665 }, { "core_id": 0, @@ -11927,9 +13435,39 @@ "id": 6, "in_irq": true, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.122848825 + "ts": 0.123561675 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12290612 + }, + "ts": 0.123561675 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 6, + "in_irq": true, + "params": { + "tid": 12296612 + }, + "ts": 0.1235735 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.1235735 }, { "core_id": 0, @@ -11937,7 +13475,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.122861575 + "ts": 0.123586 }, { "core_id": 0, @@ -11945,18 +13483,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.12287725 + "ts": 0.123601675 }, { - "addr": "0x3ffbb7c8", + "addr": "0x3ffbaf94", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -11968,16 +13506,16 @@ "id": 512, "in_irq": false, "size": 10, - "ts": 0.122912575 + "ts": 0.123638125 }, { - "addr": "0x3ffbb7d8", + "addr": "0x3ffbafa4", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -11989,7 +13527,7 @@ "id": 512, "in_irq": false, "size": 20, - "ts": 0.122947 + "ts": 0.1236777 }, { "core_id": 0, @@ -11999,10 +13537,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.122964025 + "ts": 0.12369465 }, { "core_id": 0, @@ -12012,10 +13550,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.122980025 + "ts": 0.123710775 }, { "core_id": 0, @@ -12023,8 +13561,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (431) example: Task[0x3ffb926c]: allocated 20 bytes @ 0x3ffbb7d8\n", - "ts": 0.12305045 + "msg": "I (419) example: Task[0x3ffb8a34]: allocated 20 bytes @ 0x3ffbafa4\n", + "ts": 0.1237655 }, { "core_id": 0, @@ -12032,8 +13570,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (431) example: Task[0x3ffb926c]: allocated 20 bytes @ 0x3ffbb7d8\n", - "ts": 0.12305045 + "msg": "I (419) example: Task[0x3ffb8a34]: allocated 20 bytes @ 0x3ffbafa4\n", + "ts": 0.1237655 }, { "core_id": 0, @@ -12043,10 +13581,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 0 }, - "ts": 0.123064 + "ts": 0.12377895 }, { "core_id": 0, @@ -12054,9 +13592,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.123081425 + "ts": 0.123792325 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12293660 + }, + "ts": 0.123792325 }, { "core_id": 1, @@ -12066,7 +13614,7 @@ "params": { "irq_num": 31 }, - "ts": 0.123097725 + "ts": 0.123808675 }, { "core_id": 0, @@ -12076,7 +13624,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.123108575 + "ts": 0.123819525 }, { "core_id": 1, @@ -12084,7 +13632,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.123119325 + "ts": 0.12383035 }, { "core_id": 0, @@ -12094,7 +13642,7 @@ "params": { "irq_num": 30 }, - "ts": 0.12313305 + "ts": 0.123844125 }, { "core_id": 1, @@ -12102,9 +13650,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.1231439 + "ts": 0.123856075 }, { "core_id": 0, @@ -12112,7 +13660,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.123154725 + "ts": 0.123867225 }, { "core_id": 1, @@ -12122,18 +13670,20 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 4294967295 }, - "ts": 0.1231666 + "ts": 0.123879175 }, { "core_id": 0, - "ctx_name": "alloc1", - "id": 17, + "ctx_name": "alloc2", + "id": 4, "in_irq": false, - "params": {}, - "ts": 0.12317685 + "params": { + "tid": 12296612 + }, + "ts": 0.123890825 }, { "core_id": 1, @@ -12143,10 +13693,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.123188325 + "ts": 0.123902525 }, { "core_id": 1, @@ -12156,148 +13706,19 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.123204625 + "ts": 0.12392435 }, { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (431) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb7d8\n", - "ts": 0.123268075 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (431) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb7d8\n", - "ts": 0.123268075 - }, - { - "addr": "0x3ffbb7d8", + "addr": "0x3ffbafbc", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0" - ], - "core_id": 1, - "ctx_name": "free1", - "id": 513, - "in_irq": false, - "size": 0, - "ts": 0.12328925 - }, - { - "core_id": 1, - "ctx_name": "FROM_CPU1", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 31 - }, - "ts": 0.12331625 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.123327675 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.12334425 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.123666425 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.12367985 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.12369555 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.1238338 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 6, - "in_irq": true, - "params": { - "tid": 12298716 - }, - "ts": 0.1238488 - }, - { - "core_id": 0, - "ctx_name": "alloc1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.123861575 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 4, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.12387725 - }, - { - "addr": "0x3ffbb7d8", - "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -12309,16 +13730,34 @@ "id": 512, "in_irq": false, "size": 15, - "ts": 0.12391265 + "ts": 0.123936825 }, { - "addr": "0x3ffbb7ec", + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (419) example: Task[0x3ffb961c]: free memory @ 0x3ffbafa4\n", + "ts": 0.1239779 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (419) example: Task[0x3ffb961c]: free memory @ 0x3ffbafa4\n", + "ts": 0.1239779 + }, + { + "addr": "0x3ffbafd0", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -12330,7 +13769,28 @@ "id": 512, "in_irq": false, "size": 30, - "ts": 0.123951325 + "ts": 0.12398945 + }, + { + "addr": "0x3ffbafa4", + "callers": [ + "0x4008da24", + "0x400d3c72", + "0x400880dc", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0" + ], + "core_id": 1, + "ctx_name": "free1", + "id": 513, + "in_irq": false, + "size": 0, + "ts": 0.1240037 }, { "core_id": 0, @@ -12340,64 +13800,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.123968225 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12283904, - "xTicksToWait": 0 - }, - "ts": 0.1239842 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (432) example: Task[0x3ffba9dc]: allocated 30 bytes @ 0x3ffbb7ec\n", - "ts": 0.12405455 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (432) example: Task[0x3ffba9dc]: allocated 30 bytes @ 0x3ffbb7ec\n", - "ts": 0.12405455 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12299072, - "xTicksToWait": 0 - }, - "ts": 0.12406815 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 6, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.124081375 + "ts": 0.124016225 }, { "core_id": 1, @@ -12407,7 +13813,97 @@ "params": { "irq_num": 31 }, - "ts": 0.124097675 + "ts": 0.124035575 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12281672, + "xTicksToWait": 0 + }, + "ts": 0.124046775 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.12405755 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.1240757 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (419) example: Task[0x3ffba1a4]: allocated 30 bytes @ 0x3ffbafd0\n", + "ts": 0.124103475 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (419) example: Task[0x3ffba1a4]: allocated 30 bytes @ 0x3ffbafd0\n", + "ts": 0.124103475 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12296968, + "xTicksToWait": 0 + }, + "ts": 0.124121075 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.124134325 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.124134325 + }, + { + "core_id": 1, + "ctx_name": "FROM_CPU1", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 31 + }, + "ts": 0.124150675 }, { "core_id": 0, @@ -12417,7 +13913,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.124108525 + "ts": 0.124161525 }, { "core_id": 1, @@ -12425,7 +13921,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1241193 + "ts": 0.12417235 }, { "core_id": 0, @@ -12435,7 +13931,7 @@ "params": { "irq_num": 30 }, - "ts": 0.124133175 + "ts": 0.124186175 }, { "core_id": 1, @@ -12443,9 +13939,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.12414405 + "ts": 0.124196925 }, { "core_id": 0, @@ -12453,7 +13949,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.124154875 + "ts": 0.124207675 }, { "core_id": 1, @@ -12463,10 +13959,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 4294967295 }, - "ts": 0.12416675 + "ts": 0.124219775 }, { "core_id": 0, @@ -12474,7 +13970,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.124178025 + "ts": 0.124231 }, { "core_id": 1, @@ -12484,10 +13980,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.124189675 + "ts": 0.124243325 }, { "core_id": 1, @@ -12497,10 +13993,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.124209375 + "ts": 0.124259575 }, { "core_id": 1, @@ -12508,8 +14004,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (432) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb7ec\n", - "ts": 0.124272925 + "msg": "I (419) example: Task[0x3ffbad8c]: free memory @ 0x3ffbafd0\n", + "ts": 0.12430745 }, { "core_id": 1, @@ -12517,15 +14013,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (432) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb7ec\n", - "ts": 0.124272925 + "msg": "I (419) example: Task[0x3ffbad8c]: free memory @ 0x3ffbafd0\n", + "ts": 0.12430745 }, { - "addr": "0x3ffbb7ec", + "addr": "0x3ffbafd0", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -12539,7 +14035,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.124294125 + "ts": 0.12432885 }, { "core_id": 1, @@ -12549,7 +14045,7 @@ "params": { "irq_num": 31 }, - "ts": 0.124321025 + "ts": 0.1243602 }, { "core_id": 1, @@ -12557,7 +14053,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.124332575 + "ts": 0.12437165 }, { "core_id": 1, @@ -12565,7 +14061,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.12434915 + "ts": 0.12438835 }, { "core_id": 1, @@ -12575,7 +14071,7 @@ "params": { "irq_num": 5 }, - "ts": 0.124666425 + "ts": 0.1244482 }, { "core_id": 1, @@ -12583,7 +14079,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.12467985 + "ts": 0.124461625 }, { "core_id": 1, @@ -12591,7 +14087,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.12469555 + "ts": 0.1244772 }, { "core_id": 0, @@ -12601,7 +14097,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1248338 + "ts": 0.12454665 }, { "core_id": 0, @@ -12609,7 +14105,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.124849175 + "ts": 0.12456205 }, { "core_id": 0, @@ -12617,7 +14113,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.12486425 + "ts": 0.124577275 }, { "core_id": 1, @@ -12627,7 +14123,7 @@ "params": { "irq_num": 5 }, - "ts": 0.125666425 + "ts": 0.1254482 }, { "core_id": 1, @@ -12635,7 +14131,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.125680075 + "ts": 0.125461725 }, { "core_id": 1, @@ -12643,7 +14139,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.12569535 + "ts": 0.12547685 }, { "core_id": 0, @@ -12653,7 +14149,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1258338 + "ts": 0.12554665 }, { "core_id": 0, @@ -12661,7 +14157,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.125849175 + "ts": 0.125562 }, { "core_id": 0, @@ -12669,7 +14165,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.12586425 + "ts": 0.125577075 }, { "core_id": 1, @@ -12679,7 +14175,7 @@ "params": { "irq_num": 5 }, - "ts": 0.126666425 + "ts": 0.1264482 }, { "core_id": 1, @@ -12687,7 +14183,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.12668 + "ts": 0.126461725 }, { "core_id": 1, @@ -12695,7 +14191,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.126695125 + "ts": 0.126476975 }, { "core_id": 0, @@ -12705,7 +14201,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1268338 + "ts": 0.12654665 }, { "core_id": 0, @@ -12713,7 +14209,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.126849175 + "ts": 0.126562025 }, { "core_id": 0, @@ -12721,7 +14217,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.12686425 + "ts": 0.126577225 }, { "core_id": 1, @@ -12731,7 +14227,7 @@ "params": { "irq_num": 5 }, - "ts": 0.127666425 + "ts": 0.1274482 }, { "core_id": 1, @@ -12739,7 +14235,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.127680075 + "ts": 0.127461775 }, { "core_id": 1, @@ -12747,7 +14243,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.127695225 + "ts": 0.1274769 }, { "core_id": 0, @@ -12757,7 +14253,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1278338 + "ts": 0.12754665 }, { "core_id": 0, @@ -12765,7 +14261,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1278492 + "ts": 0.127562 }, { "core_id": 0, @@ -12773,7 +14269,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.127864425 + "ts": 0.127577075 }, { "core_id": 1, @@ -12783,7 +14279,7 @@ "params": { "irq_num": 5 }, - "ts": 0.128666425 + "ts": 0.1284482 }, { "core_id": 1, @@ -12791,7 +14287,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.12867995 + "ts": 0.128461725 }, { "core_id": 1, @@ -12799,7 +14295,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1286951 + "ts": 0.12847685 }, { "core_id": 0, @@ -12809,7 +14305,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1288338 + "ts": 0.12854665 }, { "core_id": 0, @@ -12817,7 +14313,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.128849175 + "ts": 0.12856205 }, { "core_id": 0, @@ -12825,7 +14321,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.12886425 + "ts": 0.128577275 }, { "core_id": 1, @@ -12835,7 +14331,7 @@ "params": { "irq_num": 5 }, - "ts": 0.129666425 + "ts": 0.1294482 }, { "core_id": 1, @@ -12843,7 +14339,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.129680075 + "ts": 0.129461725 }, { "core_id": 1, @@ -12851,7 +14347,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.12969535 + "ts": 0.12947685 }, { "core_id": 0, @@ -12861,7 +14357,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1298338 + "ts": 0.12954665 }, { "core_id": 0, @@ -12869,7 +14365,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.129849175 + "ts": 0.129562 }, { "core_id": 0, @@ -12877,7 +14373,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.129868575 + "ts": 0.129577075 }, { "core_id": 1, @@ -12887,7 +14383,7 @@ "params": { "irq_num": 5 }, - "ts": 0.130666425 + "ts": 0.1304482 }, { "core_id": 1, @@ -12895,7 +14391,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.13067995 + "ts": 0.130461725 }, { "core_id": 1, @@ -12903,7 +14399,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1306951 + "ts": 0.130476975 }, { "core_id": 0, @@ -12913,7 +14409,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1308338 + "ts": 0.13054665 }, { "core_id": 0, @@ -12921,7 +14417,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.130849175 + "ts": 0.130562025 }, { "core_id": 0, @@ -12929,7 +14425,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.13086425 + "ts": 0.130577225 }, { "core_id": 1, @@ -12939,7 +14435,7 @@ "params": { "irq_num": 5 }, - "ts": 0.131666425 + "ts": 0.1314482 }, { "core_id": 1, @@ -12947,7 +14443,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.131680075 + "ts": 0.131461775 }, { "core_id": 1, @@ -12955,7 +14451,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.13169535 + "ts": 0.1314769 }, { "core_id": 0, @@ -12965,7 +14461,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1318338 + "ts": 0.13154665 }, { "core_id": 0, @@ -12973,7 +14469,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.131849175 + "ts": 0.131562 }, { "core_id": 0, @@ -12981,7 +14477,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.13186425 + "ts": 0.131577075 }, { "core_id": 1, @@ -12991,7 +14487,7 @@ "params": { "irq_num": 5 }, - "ts": 0.132666425 + "ts": 0.1324482 }, { "core_id": 1, @@ -12999,7 +14495,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.13268 + "ts": 0.132461725 }, { "core_id": 1, @@ -13007,7 +14503,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.132695125 + "ts": 0.13247685 }, { "core_id": 0, @@ -13017,7 +14513,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1328338 + "ts": 0.13254665 }, { "core_id": 0, @@ -13025,7 +14521,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.132849175 + "ts": 0.13256205 }, { "core_id": 0, @@ -13033,7 +14529,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.13286425 + "ts": 0.132577275 }, { "core_id": 1, @@ -13043,7 +14539,7 @@ "params": { "irq_num": 5 }, - "ts": 0.133666425 + "ts": 0.1334482 }, { "core_id": 1, @@ -13051,7 +14547,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.133680075 + "ts": 0.133461725 }, { "core_id": 1, @@ -13059,7 +14555,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.133695225 + "ts": 0.13347685 }, { "core_id": 0, @@ -13069,7 +14565,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1338338 + "ts": 0.13354665 }, { "core_id": 0, @@ -13077,7 +14573,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1338492 + "ts": 0.133562 }, { "core_id": 0, @@ -13085,7 +14581,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.133864425 + "ts": 0.133577075 }, { "core_id": 1, @@ -13095,7 +14591,7 @@ "params": { "irq_num": 5 }, - "ts": 0.134666425 + "ts": 0.1344482 }, { "core_id": 1, @@ -13103,7 +14599,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.13467995 + "ts": 0.13446595 }, { "core_id": 1, @@ -13111,7 +14607,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1346951 + "ts": 0.1344811 }, { "core_id": 0, @@ -13121,7 +14617,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1348338 + "ts": 0.13454665 }, { "core_id": 0, @@ -13129,7 +14625,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.134849175 + "ts": 0.134562 }, { "core_id": 0, @@ -13137,7 +14633,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.13486425 + "ts": 0.134577075 }, { "core_id": 1, @@ -13147,7 +14643,7 @@ "params": { "irq_num": 5 }, - "ts": 0.135666425 + "ts": 0.1354482 }, { "core_id": 1, @@ -13155,7 +14651,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.135680075 + "ts": 0.135461725 }, { "core_id": 1, @@ -13163,7 +14659,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.13569535 + "ts": 0.13547685 }, { "core_id": 0, @@ -13173,7 +14669,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1358338 + "ts": 0.13554665 }, { "core_id": 0, @@ -13181,7 +14677,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.135849175 + "ts": 0.13556205 }, { "core_id": 0, @@ -13189,7 +14685,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.13586425 + "ts": 0.135577275 }, { "core_id": 1, @@ -13199,7 +14695,7 @@ "params": { "irq_num": 5 }, - "ts": 0.136666425 + "ts": 0.1364482 }, { "core_id": 1, @@ -13207,7 +14703,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.13668 + "ts": 0.136461725 }, { "core_id": 1, @@ -13215,7 +14711,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.136695125 + "ts": 0.13647685 }, { "core_id": 0, @@ -13225,7 +14721,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1368338 + "ts": 0.13654665 }, { "core_id": 0, @@ -13233,7 +14729,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.136849175 + "ts": 0.136562 }, { "core_id": 0, @@ -13241,7 +14737,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.13686425 + "ts": 0.136577075 }, { "core_id": 1, @@ -13251,7 +14747,7 @@ "params": { "irq_num": 5 }, - "ts": 0.137666425 + "ts": 0.1374482 }, { "core_id": 1, @@ -13259,7 +14755,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.137680075 + "ts": 0.137461725 }, { "core_id": 1, @@ -13267,7 +14763,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.137695225 + "ts": 0.137476975 }, { "core_id": 0, @@ -13277,7 +14773,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1378338 + "ts": 0.13754665 }, { "core_id": 0, @@ -13285,7 +14781,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1378492 + "ts": 0.137562025 }, { "core_id": 0, @@ -13293,7 +14789,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.137864425 + "ts": 0.137577225 }, { "core_id": 1, @@ -13303,7 +14799,7 @@ "params": { "irq_num": 5 }, - "ts": 0.138666425 + "ts": 0.1384482 }, { "core_id": 1, @@ -13311,7 +14807,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.13867995 + "ts": 0.138461775 }, { "core_id": 1, @@ -13319,7 +14815,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1386951 + "ts": 0.1384769 }, { "core_id": 0, @@ -13329,7 +14825,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1388338 + "ts": 0.13854665 }, { "core_id": 0, @@ -13337,7 +14833,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.138849175 + "ts": 0.138562 }, { "core_id": 0, @@ -13345,7 +14841,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.13886425 + "ts": 0.138577075 }, { "core_id": 1, @@ -13355,7 +14851,7 @@ "params": { "irq_num": 5 }, - "ts": 0.139666425 + "ts": 0.1394482 }, { "core_id": 1, @@ -13363,7 +14859,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.139680075 + "ts": 0.139461725 }, { "core_id": 1, @@ -13371,7 +14867,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.13969535 + "ts": 0.13947685 }, { "core_id": 0, @@ -13381,7 +14877,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1398338 + "ts": 0.13954665 }, { "core_id": 0, @@ -13389,7 +14885,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.139849175 + "ts": 0.13956205 }, { "core_id": 0, @@ -13397,7 +14893,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.13986425 + "ts": 0.139577275 }, { "core_id": 1, @@ -13407,7 +14903,7 @@ "params": { "irq_num": 5 }, - "ts": 0.140666425 + "ts": 0.1404482 }, { "core_id": 1, @@ -13415,7 +14911,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.14068 + "ts": 0.140461725 }, { "core_id": 1, @@ -13423,7 +14919,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.140695125 + "ts": 0.14047685 }, { "core_id": 0, @@ -13433,7 +14929,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1408338 + "ts": 0.14054665 }, { "core_id": 0, @@ -13441,7 +14937,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.140849175 + "ts": 0.140562 }, { "core_id": 0, @@ -13449,7 +14945,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.14086425 + "ts": 0.140577075 }, { "core_id": 1, @@ -13459,7 +14955,7 @@ "params": { "irq_num": 5 }, - "ts": 0.141666425 + "ts": 0.1414482 }, { "core_id": 1, @@ -13467,7 +14963,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.141680075 + "ts": 0.141461725 }, { "core_id": 1, @@ -13475,7 +14971,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.141695225 + "ts": 0.141476975 }, { "core_id": 0, @@ -13485,7 +14981,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1418338 + "ts": 0.14154665 }, { "core_id": 0, @@ -13493,7 +14989,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1418492 + "ts": 0.141562025 }, { "core_id": 0, @@ -13501,7 +14997,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.141864425 + "ts": 0.141577225 }, { "core_id": 1, @@ -13511,7 +15007,7 @@ "params": { "irq_num": 5 }, - "ts": 0.142666425 + "ts": 0.1424482 }, { "core_id": 1, @@ -13519,7 +15015,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.142680075 + "ts": 0.142461775 }, { "core_id": 1, @@ -13527,7 +15023,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.14269535 + "ts": 0.1424769 }, { "core_id": 0, @@ -13537,7 +15033,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1428338 + "ts": 0.14254665 }, { "core_id": 0, @@ -13545,7 +15041,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.142849175 + "ts": 0.142562 }, { "core_id": 0, @@ -13553,7 +15049,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.14286425 + "ts": 0.142577075 }, { "core_id": 1, @@ -13563,7 +15059,7 @@ "params": { "irq_num": 5 }, - "ts": 0.143666425 + "ts": 0.1434482 }, { "core_id": 1, @@ -13571,7 +15067,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.14368 + "ts": 0.143461725 }, { "core_id": 1, @@ -13579,7 +15075,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.143695125 + "ts": 0.14347685 }, { "core_id": 0, @@ -13589,7 +15085,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1438338 + "ts": 0.14354665 }, { "core_id": 0, @@ -13597,7 +15093,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.143849175 + "ts": 0.14356205 }, { "core_id": 0, @@ -13605,7 +15101,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.14386425 + "ts": 0.143577275 }, { "core_id": 1, @@ -13615,7 +15111,7 @@ "params": { "irq_num": 5 }, - "ts": 0.144666425 + "ts": 0.1444482 }, { "core_id": 1, @@ -13623,7 +15119,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.144680075 + "ts": 0.144461725 }, { "core_id": 1, @@ -13631,7 +15127,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.144695225 + "ts": 0.14447685 }, { "core_id": 0, @@ -13641,7 +15137,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1448338 + "ts": 0.14454665 }, { "core_id": 0, @@ -13649,7 +15145,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1448492 + "ts": 0.144562 }, { "core_id": 0, @@ -13657,7 +15153,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.144864425 + "ts": 0.144577075 }, { "core_id": 1, @@ -13667,7 +15163,7 @@ "params": { "irq_num": 5 }, - "ts": 0.145666425 + "ts": 0.1454482 }, { "core_id": 1, @@ -13675,7 +15171,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.14567995 + "ts": 0.145461725 }, { "core_id": 1, @@ -13683,7 +15179,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1456951 + "ts": 0.145476975 }, { "core_id": 0, @@ -13693,7 +15189,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1458338 + "ts": 0.14554665 }, { "core_id": 0, @@ -13701,7 +15197,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.145849175 + "ts": 0.145562025 }, { "core_id": 0, @@ -13709,7 +15205,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.14586425 + "ts": 0.145577225 }, { "core_id": 1, @@ -13719,7 +15215,7 @@ "params": { "irq_num": 5 }, - "ts": 0.146666425 + "ts": 0.1464482 }, { "core_id": 1, @@ -13727,7 +15223,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.146680075 + "ts": 0.146466 }, { "core_id": 1, @@ -13735,7 +15231,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.14669535 + "ts": 0.146481125 }, { "core_id": 0, @@ -13745,7 +15241,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1468338 + "ts": 0.14654665 }, { "core_id": 0, @@ -13753,7 +15249,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.146849175 + "ts": 0.146562 }, { "core_id": 0, @@ -13761,7 +15257,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.14686425 + "ts": 0.146577075 }, { "core_id": 1, @@ -13771,7 +15267,7 @@ "params": { "irq_num": 5 }, - "ts": 0.147666425 + "ts": 0.1474482 }, { "core_id": 1, @@ -13779,7 +15275,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.14768 + "ts": 0.147461725 }, { "core_id": 1, @@ -13787,7 +15283,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.147695125 + "ts": 0.14747685 }, { "core_id": 0, @@ -13797,7 +15293,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1478338 + "ts": 0.14754665 }, { "core_id": 0, @@ -13805,7 +15301,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.147849175 + "ts": 0.14756205 }, { "core_id": 0, @@ -13813,7 +15309,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.14786425 + "ts": 0.147577275 }, { "core_id": 1, @@ -13823,7 +15319,7 @@ "params": { "irq_num": 5 }, - "ts": 0.148666425 + "ts": 0.1484482 }, { "core_id": 1, @@ -13831,7 +15327,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.148680075 + "ts": 0.148461725 }, { "core_id": 1, @@ -13839,7 +15335,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.148695225 + "ts": 0.14847685 }, { "core_id": 0, @@ -13849,7 +15345,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1488338 + "ts": 0.14854665 }, { "core_id": 0, @@ -13857,7 +15353,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1488492 + "ts": 0.148562 }, { "core_id": 0, @@ -13865,7 +15361,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.148864425 + "ts": 0.148577075 }, { "core_id": 1, @@ -13875,7 +15371,7 @@ "params": { "irq_num": 5 }, - "ts": 0.149666425 + "ts": 0.1494482 }, { "core_id": 1, @@ -13883,7 +15379,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.14967995 + "ts": 0.149461725 }, { "core_id": 1, @@ -13891,7 +15387,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1496951 + "ts": 0.149476975 }, { "core_id": 0, @@ -13901,7 +15397,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1498338 + "ts": 0.14954665 }, { "core_id": 0, @@ -13909,7 +15405,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.149849175 + "ts": 0.149562025 }, { "core_id": 0, @@ -13917,7 +15413,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.14986425 + "ts": 0.149577225 }, { "core_id": 1, @@ -13927,7 +15423,7 @@ "params": { "irq_num": 5 }, - "ts": 0.150666425 + "ts": 0.1504482 }, { "core_id": 1, @@ -13935,7 +15431,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.150680075 + "ts": 0.150461775 }, { "core_id": 1, @@ -13943,7 +15439,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.15069535 + "ts": 0.1504769 }, { "core_id": 0, @@ -13953,7 +15449,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1508338 + "ts": 0.15054665 }, { "core_id": 0, @@ -13961,7 +15457,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.150849175 + "ts": 0.150562 }, { "core_id": 0, @@ -13969,7 +15465,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.15086425 + "ts": 0.150577075 }, { "core_id": 1, @@ -13979,7 +15475,7 @@ "params": { "irq_num": 5 }, - "ts": 0.151666425 + "ts": 0.1514482 }, { "core_id": 1, @@ -13987,7 +15483,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.15168 + "ts": 0.151461725 }, { "core_id": 1, @@ -13995,7 +15491,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.151695125 + "ts": 0.15147685 }, { "core_id": 0, @@ -14005,7 +15501,59 @@ "params": { "irq_num": 5 }, - "ts": 0.1518338 + "ts": 0.15154665 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.15156205 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.151577275 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.1524482 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.152461725 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.15247685 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.15254665 }, { "core_id": 0, @@ -14013,9 +15561,19 @@ "id": 6, "in_irq": true, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.1518488 + "ts": 0.152561625 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12284596 + }, + "ts": 0.152561625 }, { "core_id": 0, @@ -14023,7 +15581,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.151861575 + "ts": 0.152574275 }, { "core_id": 0, @@ -14031,18 +15589,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.15187725 + "ts": 0.152590075 }, { - "addr": "0x3ffbb7ec", + "addr": "0x3ffbafa4", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -14054,16 +15612,16 @@ "id": 512, "in_irq": false, "size": 6, - "ts": 0.15191265 + "ts": 0.152625125 }, { - "addr": "0x3ffbb7fc", + "addr": "0x3ffbafd0", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -14075,7 +15633,7 @@ "id": 512, "in_irq": false, "size": 12, - "ts": 0.15195125 + "ts": 0.1526607 }, { "core_id": 0, @@ -14085,10 +15643,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.15196815 + "ts": 0.152677675 }, { "core_id": 0, @@ -14098,10 +15656,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.15198415 + "ts": 0.152693775 }, { "core_id": 0, @@ -14109,8 +15667,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (460) example: Task[0x3ffb7aec]: allocated 12 bytes @ 0x3ffbb7fc\n", - "ts": 0.152054475 + "msg": "I (448) example: Task[0x3ffb72b4]: allocated 12 bytes @ 0x3ffbafd0\n", + "ts": 0.1527528 }, { "core_id": 0, @@ -14118,8 +15676,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (460) example: Task[0x3ffb7aec]: allocated 12 bytes @ 0x3ffbb7fc\n", - "ts": 0.152054475 + "msg": "I (448) example: Task[0x3ffb72b4]: allocated 12 bytes @ 0x3ffbafd0\n", + "ts": 0.1527528 }, { "core_id": 0, @@ -14129,10 +15687,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 0 }, - "ts": 0.152068075 + "ts": 0.152766275 }, { "core_id": 0, @@ -14140,9 +15698,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.1520813 + "ts": 0.15277945 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12287644 + }, + "ts": 0.15277945 }, { "core_id": 1, @@ -14152,7 +15720,7 @@ "params": { "irq_num": 31 }, - "ts": 0.152097675 + "ts": 0.15279565 }, { "core_id": 0, @@ -14162,7 +15730,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.152108525 + "ts": 0.1528066 }, { "core_id": 1, @@ -14170,7 +15738,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1521193 + "ts": 0.152817375 }, { "core_id": 0, @@ -14180,7 +15748,7 @@ "params": { "irq_num": 30 }, - "ts": 0.152133125 + "ts": 0.152831275 }, { "core_id": 1, @@ -14188,9 +15756,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.152144025 + "ts": 0.152842075 }, { "core_id": 0, @@ -14198,7 +15766,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.15215485 + "ts": 0.1528528 }, { "core_id": 1, @@ -14208,10 +15776,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 4294967295 }, - "ts": 0.1521668 + "ts": 0.152864925 }, { "core_id": 0, @@ -14219,7 +15787,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.15217705 + "ts": 0.1528751 }, { "core_id": 1, @@ -14229,10 +15797,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.152188475 + "ts": 0.152886875 }, { "core_id": 1, @@ -14242,10 +15810,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.15220885 + "ts": 0.1529032 }, { "core_id": 1, @@ -14253,8 +15821,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (460) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb7fc\n", - "ts": 0.1522724 + "msg": "I (448) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbafd0\n", + "ts": 0.152951075 }, { "core_id": 1, @@ -14262,15 +15830,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (460) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb7fc\n", - "ts": 0.1522724 + "msg": "I (448) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbafd0\n", + "ts": 0.152951075 }, { - "addr": "0x3ffbb7fc", + "addr": "0x3ffbafd0", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -14284,7 +15852,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.1522936 + "ts": 0.1529723 }, { "core_id": 1, @@ -14294,7 +15862,7 @@ "params": { "irq_num": 31 }, - "ts": 0.152320475 + "ts": 0.15300375 }, { "core_id": 1, @@ -14302,7 +15870,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1523319 + "ts": 0.153015325 }, { "core_id": 1, @@ -14310,7 +15878,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.152348475 + "ts": 0.153032025 }, { "core_id": 1, @@ -14320,7 +15888,7 @@ "params": { "irq_num": 5 }, - "ts": 0.152666425 + "ts": 0.1534482 }, { "core_id": 1, @@ -14328,7 +15896,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.15267985 + "ts": 0.153461725 }, { "core_id": 1, @@ -14336,7 +15904,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.15269555 + "ts": 0.1534773 }, { "core_id": 0, @@ -14346,7 +15914,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1528338 + "ts": 0.15354665 }, { "core_id": 0, @@ -14354,9 +15922,39 @@ "id": 6, "in_irq": true, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.1528488 + "ts": 0.153561625 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12290612 + }, + "ts": 0.153561625 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 6, + "in_irq": true, + "params": { + "tid": 12296612 + }, + "ts": 0.1535735 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.1535735 }, { "core_id": 0, @@ -14364,7 +15962,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.152861575 + "ts": 0.153585975 }, { "core_id": 0, @@ -14372,18 +15970,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.152877375 + "ts": 0.153601625 }, { - "addr": "0x3ffbb7fc", + "addr": "0x3ffbafd0", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -14395,16 +15993,16 @@ "id": 512, "in_irq": false, "size": 12, - "ts": 0.152912775 + "ts": 0.153638 }, { - "addr": "0x3ffbb80c", + "addr": "0x3ffbafe0", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -14416,7 +16014,7 @@ "id": 512, "in_irq": false, "size": 24, - "ts": 0.1529473 + "ts": 0.15367345 }, { "core_id": 0, @@ -14426,10 +16024,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.15296425 + "ts": 0.1536905 }, { "core_id": 0, @@ -14439,10 +16037,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.152984425 + "ts": 0.153706525 }, { "core_id": 0, @@ -14450,8 +16048,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (461) example: Task[0x3ffb926c]: allocated 24 bytes @ 0x3ffbb80c\n", - "ts": 0.15305485 + "msg": "I (449) example: Task[0x3ffb8a34]: allocated 24 bytes @ 0x3ffbafe0\n", + "ts": 0.15376135 }, { "core_id": 0, @@ -14459,8 +16057,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (461) example: Task[0x3ffb926c]: allocated 24 bytes @ 0x3ffbb80c\n", - "ts": 0.15305485 + "msg": "I (449) example: Task[0x3ffb8a34]: allocated 24 bytes @ 0x3ffbafe0\n", + "ts": 0.15376135 }, { "core_id": 0, @@ -14470,10 +16068,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 0 }, - "ts": 0.1530685 + "ts": 0.153778125 }, { "core_id": 0, @@ -14481,9 +16079,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.153081675 + "ts": 0.1537915 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12293660 + }, + "ts": 0.1537915 }, { "core_id": 1, @@ -14493,7 +16101,7 @@ "params": { "irq_num": 31 }, - "ts": 0.153097875 + "ts": 0.15380785 }, { "core_id": 0, @@ -14503,7 +16111,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.153108925 + "ts": 0.1538187 }, { "core_id": 1, @@ -14511,7 +16119,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.153119675 + "ts": 0.153829525 }, { "core_id": 0, @@ -14521,7 +16129,7 @@ "params": { "irq_num": 30 }, - "ts": 0.1531334 + "ts": 0.1538433 }, { "core_id": 1, @@ -14529,9 +16137,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.15314435 + "ts": 0.15385525 }, { "core_id": 0, @@ -14539,7 +16147,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.15315515 + "ts": 0.1538664 }, { "core_id": 1, @@ -14549,18 +16157,20 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 4294967295 }, - "ts": 0.153167 + "ts": 0.15387835 }, { "core_id": 0, - "ctx_name": "alloc1", - "id": 17, + "ctx_name": "alloc2", + "id": 4, "in_irq": false, - "params": {}, - "ts": 0.153177275 + "params": { + "tid": 12296612 + }, + "ts": 0.15389 }, { "core_id": 1, @@ -14570,10 +16180,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.15318875 + "ts": 0.1539017 }, { "core_id": 1, @@ -14583,148 +16193,19 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.15320505 + "ts": 0.1539203 }, { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (461) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb80c\n", - "ts": 0.1532685 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (461) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb80c\n", - "ts": 0.1532685 - }, - { - "addr": "0x3ffbb80c", + "addr": "0x3ffbaffc", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0" - ], - "core_id": 1, - "ctx_name": "free1", - "id": 513, - "in_irq": false, - "size": 0, - "ts": 0.153293525 - }, - { - "core_id": 1, - "ctx_name": "FROM_CPU1", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 31 - }, - "ts": 0.153320525 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.15333195 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.153348525 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.153666425 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.15367985 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.15369555 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.1538338 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 6, - "in_irq": true, - "params": { - "tid": 12298716 - }, - "ts": 0.1538488 - }, - { - "core_id": 0, - "ctx_name": "alloc1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.153861575 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 4, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.15387725 - }, - { - "addr": "0x3ffbb80c", - "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -14736,16 +16217,34 @@ "id": 512, "in_irq": false, "size": 18, - "ts": 0.15391265 + "ts": 0.1539334 }, { - "addr": "0x3ffbb824", + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (449) example: Task[0x3ffb961c]: free memory @ 0x3ffbafe0\n", + "ts": 0.153973975 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (449) example: Task[0x3ffb961c]: free memory @ 0x3ffbafe0\n", + "ts": 0.153973975 + }, + { + "addr": "0x3ffbb014", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -14757,7 +16256,28 @@ "id": 512, "in_irq": false, "size": 36, - "ts": 0.1539472 + "ts": 0.15398995 + }, + { + "addr": "0x3ffbafe0", + "callers": [ + "0x4008da24", + "0x400d3c72", + "0x400880dc", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0" + ], + "core_id": 1, + "ctx_name": "free1", + "id": 513, + "in_irq": false, + "size": 0, + "ts": 0.154004325 }, { "core_id": 0, @@ -14767,64 +16287,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.15396435 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12283904, - "xTicksToWait": 0 - }, - "ts": 0.15398035 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (462) example: Task[0x3ffba9dc]: allocated 36 bytes @ 0x3ffbb824\n", - "ts": 0.154050675 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (462) example: Task[0x3ffba9dc]: allocated 36 bytes @ 0x3ffbb824\n", - "ts": 0.154050675 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12299072, - "xTicksToWait": 0 - }, - "ts": 0.1540685 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 6, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.15408185 + "ts": 0.154016775 }, { "core_id": 1, @@ -14834,7 +16300,97 @@ "params": { "irq_num": 31 }, - "ts": 0.154098175 + "ts": 0.15403615 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12281672, + "xTicksToWait": 0 + }, + "ts": 0.1540474 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.1540582 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.1540764 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (449) example: Task[0x3ffba1a4]: allocated 36 bytes @ 0x3ffbb014\n", + "ts": 0.154104125 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (449) example: Task[0x3ffba1a4]: allocated 36 bytes @ 0x3ffbb014\n", + "ts": 0.154104125 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12296968, + "xTicksToWait": 0 + }, + "ts": 0.154117575 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.154134325 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.154134325 + }, + { + "core_id": 1, + "ctx_name": "FROM_CPU1", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 31 + }, + "ts": 0.154150675 }, { "core_id": 0, @@ -14844,7 +16400,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.154109025 + "ts": 0.15416155 }, { "core_id": 1, @@ -14852,7 +16408,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.154119775 + "ts": 0.1541724 }, { "core_id": 0, @@ -14862,7 +16418,7 @@ "params": { "irq_num": 30 }, - "ts": 0.1541335 + "ts": 0.154186075 }, { "core_id": 1, @@ -14870,9 +16426,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.1541444 + "ts": 0.154196825 }, { "core_id": 0, @@ -14880,7 +16436,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.154155225 + "ts": 0.154207625 }, { "core_id": 1, @@ -14890,10 +16446,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 4294967295 }, - "ts": 0.154167075 + "ts": 0.154219575 }, { "core_id": 0, @@ -14901,7 +16457,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.154178375 + "ts": 0.1542308 }, { "core_id": 1, @@ -14911,10 +16467,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.15419 + "ts": 0.154242625 }, { "core_id": 1, @@ -14924,10 +16480,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.1542064 + "ts": 0.154258875 }, { "core_id": 1, @@ -14935,8 +16491,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (462) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb824\n", - "ts": 0.15426995 + "msg": "I (449) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb014\n", + "ts": 0.15430665 }, { "core_id": 1, @@ -14944,15 +16500,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (462) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb824\n", - "ts": 0.15426995 + "msg": "I (449) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb014\n", + "ts": 0.15430665 }, { - "addr": "0x3ffbb824", + "addr": "0x3ffbb014", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -14966,7 +16522,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.15429115 + "ts": 0.154328025 }, { "core_id": 1, @@ -14976,7 +16532,7 @@ "params": { "irq_num": 31 }, - "ts": 0.15432215 + "ts": 0.15435545 }, { "core_id": 1, @@ -14984,7 +16540,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.154333625 + "ts": 0.15436685 }, { "core_id": 1, @@ -14992,7 +16548,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.154350325 + "ts": 0.154383425 }, { "core_id": 1, @@ -15002,7 +16558,7 @@ "params": { "irq_num": 5 }, - "ts": 0.154666425 + "ts": 0.1544482 }, { "core_id": 1, @@ -15010,7 +16566,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.154679875 + "ts": 0.154461625 }, { "core_id": 1, @@ -15018,7 +16574,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.15469545 + "ts": 0.1544772 }, { "core_id": 0, @@ -15028,7 +16584,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1548338 + "ts": 0.15454665 }, { "core_id": 0, @@ -15036,7 +16592,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1548492 + "ts": 0.154562 }, { "core_id": 0, @@ -15044,7 +16600,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.154864425 + "ts": 0.154577075 }, { "core_id": 1, @@ -15054,7 +16610,7 @@ "params": { "irq_num": 5 }, - "ts": 0.155666425 + "ts": 0.1554482 }, { "core_id": 1, @@ -15062,7 +16618,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.15567995 + "ts": 0.155461725 }, { "core_id": 1, @@ -15070,7 +16626,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1556951 + "ts": 0.15547685 }, { "core_id": 0, @@ -15080,7 +16636,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1558338 + "ts": 0.15554665 }, { "core_id": 0, @@ -15088,7 +16644,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.155849175 + "ts": 0.15556205 }, { "core_id": 0, @@ -15096,7 +16652,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.15586425 + "ts": 0.155577275 }, { "core_id": 1, @@ -15106,7 +16662,7 @@ "params": { "irq_num": 5 }, - "ts": 0.156666425 + "ts": 0.1564482 }, { "core_id": 1, @@ -15114,7 +16670,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.156680075 + "ts": 0.156461725 }, { "core_id": 1, @@ -15122,7 +16678,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.15669535 + "ts": 0.15647685 }, { "core_id": 0, @@ -15132,7 +16688,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1568338 + "ts": 0.15654665 }, { "core_id": 0, @@ -15140,7 +16696,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.156849175 + "ts": 0.156565625 }, { "core_id": 0, @@ -15148,7 +16704,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.15686425 + "ts": 0.15658085 }, { "core_id": 1, @@ -15158,7 +16714,7 @@ "params": { "irq_num": 5 }, - "ts": 0.157666425 + "ts": 0.1574482 }, { "core_id": 1, @@ -15166,7 +16722,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.15768 + "ts": 0.157461725 }, { "core_id": 1, @@ -15174,7 +16730,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.157695125 + "ts": 0.15747685 }, { "core_id": 0, @@ -15184,7 +16740,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1578338 + "ts": 0.15754665 }, { "core_id": 0, @@ -15192,7 +16748,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.157849175 + "ts": 0.157562 }, { "core_id": 0, @@ -15200,7 +16756,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.15786425 + "ts": 0.157577075 }, { "core_id": 1, @@ -15210,7 +16766,7 @@ "params": { "irq_num": 5 }, - "ts": 0.158666425 + "ts": 0.1584482 }, { "core_id": 1, @@ -15218,7 +16774,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.158680075 + "ts": 0.158461725 }, { "core_id": 1, @@ -15226,7 +16782,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.158695225 + "ts": 0.158476975 }, { "core_id": 0, @@ -15236,7 +16792,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1588338 + "ts": 0.15854665 }, { "core_id": 0, @@ -15244,7 +16800,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1588492 + "ts": 0.158562025 }, { "core_id": 0, @@ -15252,7 +16808,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.158864425 + "ts": 0.158577225 }, { "core_id": 1, @@ -15262,7 +16818,7 @@ "params": { "irq_num": 5 }, - "ts": 0.159666425 + "ts": 0.1594482 }, { "core_id": 1, @@ -15270,7 +16826,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.15967995 + "ts": 0.159461775 }, { "core_id": 1, @@ -15278,7 +16834,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1596951 + "ts": 0.1594769 }, { "core_id": 0, @@ -15288,7 +16844,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1598338 + "ts": 0.15954665 }, { "core_id": 0, @@ -15296,7 +16852,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.159849175 + "ts": 0.159562 }, { "core_id": 0, @@ -15304,7 +16860,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.15986425 + "ts": 0.159577075 }, { "core_id": 1, @@ -15314,7 +16870,7 @@ "params": { "irq_num": 5 }, - "ts": 0.160666425 + "ts": 0.1604482 }, { "core_id": 1, @@ -15322,7 +16878,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.160680075 + "ts": 0.160461725 }, { "core_id": 1, @@ -15330,7 +16886,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.16069535 + "ts": 0.16047685 }, { "core_id": 0, @@ -15340,7 +16896,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1608338 + "ts": 0.16054665 }, { "core_id": 0, @@ -15348,7 +16904,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.160849175 + "ts": 0.16056205 }, { "core_id": 0, @@ -15356,7 +16912,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.16086425 + "ts": 0.160577275 }, { "core_id": 1, @@ -15366,7 +16922,7 @@ "params": { "irq_num": 5 }, - "ts": 0.161666425 + "ts": 0.1614482 }, { "core_id": 1, @@ -15374,7 +16930,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.16168 + "ts": 0.161461725 }, { "core_id": 1, @@ -15382,7 +16938,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.161695125 + "ts": 0.16147685 }, { "core_id": 0, @@ -15392,7 +16948,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1618338 + "ts": 0.16154665 }, { "core_id": 0, @@ -15400,7 +16956,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.161849175 + "ts": 0.161562 }, { "core_id": 0, @@ -15408,7 +16964,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.16186425 + "ts": 0.161577075 }, { "core_id": 1, @@ -15418,7 +16974,7 @@ "params": { "irq_num": 5 }, - "ts": 0.162666425 + "ts": 0.1624482 }, { "core_id": 1, @@ -15426,7 +16982,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.162680075 + "ts": 0.162461725 }, { "core_id": 1, @@ -15434,7 +16990,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.162695225 + "ts": 0.162476975 }, { "core_id": 0, @@ -15444,7 +17000,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1628338 + "ts": 0.16254665 }, { "core_id": 0, @@ -15452,7 +17008,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1628492 + "ts": 0.162562025 }, { "core_id": 0, @@ -15460,7 +17016,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.162864425 + "ts": 0.162577225 }, { "core_id": 1, @@ -15470,7 +17026,7 @@ "params": { "irq_num": 5 }, - "ts": 0.163666425 + "ts": 0.1634482 }, { "core_id": 1, @@ -15478,7 +17034,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.16367995 + "ts": 0.163461775 }, { "core_id": 1, @@ -15486,7 +17042,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1636951 + "ts": 0.1634769 }, { "core_id": 0, @@ -15496,7 +17052,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1638338 + "ts": 0.16354665 }, { "core_id": 0, @@ -15504,7 +17060,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.163849175 + "ts": 0.163562 }, { "core_id": 0, @@ -15512,7 +17068,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.16386425 + "ts": 0.163577075 }, { "core_id": 1, @@ -15522,7 +17078,7 @@ "params": { "irq_num": 5 }, - "ts": 0.164666425 + "ts": 0.1644482 }, { "core_id": 1, @@ -15530,7 +17086,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.164683575 + "ts": 0.164461725 }, { "core_id": 1, @@ -15538,7 +17094,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.164698725 + "ts": 0.16447685 }, { "core_id": 0, @@ -15548,7 +17104,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1648338 + "ts": 0.16454665 }, { "core_id": 0, @@ -15556,7 +17112,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.164849175 + "ts": 0.16456205 }, { "core_id": 0, @@ -15564,7 +17120,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.16486425 + "ts": 0.164577275 }, { "core_id": 1, @@ -15574,7 +17130,7 @@ "params": { "irq_num": 5 }, - "ts": 0.165666425 + "ts": 0.1654482 }, { "core_id": 1, @@ -15582,7 +17138,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.165680075 + "ts": 0.165461725 }, { "core_id": 1, @@ -15590,7 +17146,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.165695225 + "ts": 0.16547685 }, { "core_id": 0, @@ -15600,7 +17156,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1658338 + "ts": 0.16554665 }, { "core_id": 0, @@ -15608,7 +17164,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1658492 + "ts": 0.165562 }, { "core_id": 0, @@ -15616,7 +17172,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.165864425 + "ts": 0.165577075 }, { "core_id": 1, @@ -15626,7 +17182,7 @@ "params": { "irq_num": 5 }, - "ts": 0.166666425 + "ts": 0.1664482 }, { "core_id": 1, @@ -15634,7 +17190,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.16667995 + "ts": 0.166461725 }, { "core_id": 1, @@ -15642,7 +17198,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1666951 + "ts": 0.166476975 }, { "core_id": 0, @@ -15652,7 +17208,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1668338 + "ts": 0.16654665 }, { "core_id": 0, @@ -15660,7 +17216,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.166849175 + "ts": 0.166562025 }, { "core_id": 0, @@ -15668,7 +17224,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.16686425 + "ts": 0.166577225 }, { "core_id": 1, @@ -15678,7 +17234,7 @@ "params": { "irq_num": 5 }, - "ts": 0.167666425 + "ts": 0.1674482 }, { "core_id": 1, @@ -15686,7 +17242,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.167680075 + "ts": 0.167461775 }, { "core_id": 1, @@ -15694,7 +17250,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.16769535 + "ts": 0.1674769 }, { "core_id": 0, @@ -15704,7 +17260,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1678338 + "ts": 0.16754665 }, { "core_id": 0, @@ -15712,7 +17268,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.167849175 + "ts": 0.167562 }, { "core_id": 0, @@ -15720,7 +17276,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.16786425 + "ts": 0.167577075 }, { "core_id": 1, @@ -15730,7 +17286,7 @@ "params": { "irq_num": 5 }, - "ts": 0.168666425 + "ts": 0.1684482 }, { "core_id": 1, @@ -15738,7 +17294,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.16868 + "ts": 0.168461725 }, { "core_id": 1, @@ -15746,7 +17302,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.168695125 + "ts": 0.16847685 }, { "core_id": 0, @@ -15756,7 +17312,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1688338 + "ts": 0.16854665 }, { "core_id": 0, @@ -15764,7 +17320,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.168849175 + "ts": 0.1685663 }, { "core_id": 0, @@ -15772,7 +17328,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.16886425 + "ts": 0.1685815 }, { "core_id": 1, @@ -15782,7 +17338,7 @@ "params": { "irq_num": 5 }, - "ts": 0.169666425 + "ts": 0.1694482 }, { "core_id": 1, @@ -15790,7 +17346,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.169680075 + "ts": 0.169461725 }, { "core_id": 1, @@ -15798,7 +17354,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.169695225 + "ts": 0.16947685 }, { "core_id": 0, @@ -15808,7 +17364,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1698338 + "ts": 0.16954665 }, { "core_id": 0, @@ -15816,7 +17372,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1698492 + "ts": 0.169562 }, { "core_id": 0, @@ -15824,7 +17380,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.169864425 + "ts": 0.169577075 }, { "core_id": 1, @@ -15834,7 +17390,7 @@ "params": { "irq_num": 5 }, - "ts": 0.170666425 + "ts": 0.1704482 }, { "core_id": 1, @@ -15842,7 +17398,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.17067995 + "ts": 0.170461725 }, { "core_id": 1, @@ -15850,7 +17406,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1706951 + "ts": 0.170476975 }, { "core_id": 0, @@ -15860,7 +17416,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1708338 + "ts": 0.17054665 }, { "core_id": 0, @@ -15868,7 +17424,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.170849175 + "ts": 0.170562025 }, { "core_id": 0, @@ -15876,7 +17432,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.17086425 + "ts": 0.170577225 }, { "core_id": 1, @@ -15886,7 +17442,7 @@ "params": { "irq_num": 5 }, - "ts": 0.171666425 + "ts": 0.1714482 }, { "core_id": 1, @@ -15894,7 +17450,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.171680075 + "ts": 0.171461775 }, { "core_id": 1, @@ -15902,7 +17458,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.17169535 + "ts": 0.1714769 }, { "core_id": 0, @@ -15912,7 +17468,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1718338 + "ts": 0.17154665 }, { "core_id": 0, @@ -15920,7 +17476,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.171849175 + "ts": 0.171562 }, { "core_id": 0, @@ -15928,7 +17484,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.17186425 + "ts": 0.171577075 }, { "core_id": 1, @@ -15938,7 +17494,7 @@ "params": { "irq_num": 5 }, - "ts": 0.172666425 + "ts": 0.1724482 }, { "core_id": 1, @@ -15946,7 +17502,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.17268 + "ts": 0.172461725 }, { "core_id": 1, @@ -15954,7 +17510,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.172695125 + "ts": 0.17247685 }, { "core_id": 0, @@ -15964,7 +17520,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1728338 + "ts": 0.17254665 }, { "core_id": 0, @@ -15972,7 +17528,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.172849175 + "ts": 0.17256205 }, { "core_id": 0, @@ -15980,7 +17536,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.17286425 + "ts": 0.172577275 }, { "core_id": 1, @@ -15990,7 +17546,7 @@ "params": { "irq_num": 5 }, - "ts": 0.173666425 + "ts": 0.1734482 }, { "core_id": 1, @@ -15998,7 +17554,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.173680075 + "ts": 0.173461725 }, { "core_id": 1, @@ -16006,7 +17562,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.173695225 + "ts": 0.17347685 }, { "core_id": 0, @@ -16016,7 +17572,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1738338 + "ts": 0.17354665 }, { "core_id": 0, @@ -16024,7 +17580,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1738492 + "ts": 0.173562 }, { "core_id": 0, @@ -16032,7 +17588,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.173864425 + "ts": 0.173577075 }, { "core_id": 1, @@ -16042,7 +17598,7 @@ "params": { "irq_num": 5 }, - "ts": 0.174666425 + "ts": 0.1744482 }, { "core_id": 1, @@ -16050,7 +17606,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.17467995 + "ts": 0.174461725 }, { "core_id": 1, @@ -16058,7 +17614,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1746951 + "ts": 0.174476975 }, { "core_id": 0, @@ -16068,7 +17624,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1748338 + "ts": 0.17454665 }, { "core_id": 0, @@ -16076,7 +17632,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.174849175 + "ts": 0.174562025 }, { "core_id": 0, @@ -16084,7 +17640,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.17486425 + "ts": 0.174577225 }, { "core_id": 1, @@ -16094,7 +17650,7 @@ "params": { "irq_num": 5 }, - "ts": 0.175666425 + "ts": 0.1754482 }, { "core_id": 1, @@ -16102,7 +17658,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.175680075 + "ts": 0.175461775 }, { "core_id": 1, @@ -16110,7 +17666,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.17569535 + "ts": 0.1754769 }, { "core_id": 0, @@ -16120,7 +17676,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1758338 + "ts": 0.17554665 }, { "core_id": 0, @@ -16128,7 +17684,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.175849175 + "ts": 0.175562 }, { "core_id": 0, @@ -16136,7 +17692,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.17586425 + "ts": 0.175577075 }, { "core_id": 1, @@ -16146,7 +17702,7 @@ "params": { "irq_num": 5 }, - "ts": 0.176666425 + "ts": 0.1764482 }, { "core_id": 1, @@ -16154,7 +17710,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.176684225 + "ts": 0.176461725 }, { "core_id": 1, @@ -16162,7 +17718,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.176699375 + "ts": 0.17647685 }, { "core_id": 0, @@ -16172,7 +17728,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1768338 + "ts": 0.17654665 }, { "core_id": 0, @@ -16180,7 +17736,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.176849175 + "ts": 0.17656205 }, { "core_id": 0, @@ -16188,7 +17744,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.17686425 + "ts": 0.176577275 }, { "core_id": 1, @@ -16198,7 +17754,7 @@ "params": { "irq_num": 5 }, - "ts": 0.177666425 + "ts": 0.1774482 }, { "core_id": 1, @@ -16206,7 +17762,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.177680075 + "ts": 0.177461725 }, { "core_id": 1, @@ -16214,7 +17770,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.177695225 + "ts": 0.17747685 }, { "core_id": 0, @@ -16224,7 +17780,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1778338 + "ts": 0.17754665 }, { "core_id": 0, @@ -16232,7 +17788,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1778492 + "ts": 0.177562 }, { "core_id": 0, @@ -16240,7 +17796,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.177864425 + "ts": 0.177577075 }, { "core_id": 1, @@ -16250,7 +17806,7 @@ "params": { "irq_num": 5 }, - "ts": 0.178666425 + "ts": 0.1784482 }, { "core_id": 1, @@ -16258,7 +17814,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.17867995 + "ts": 0.178461725 }, { "core_id": 1, @@ -16266,7 +17822,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1786951 + "ts": 0.178476975 }, { "core_id": 0, @@ -16276,7 +17832,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1788338 + "ts": 0.17854665 }, { "core_id": 0, @@ -16284,7 +17840,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.178849175 + "ts": 0.178562025 }, { "core_id": 0, @@ -16292,7 +17848,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.17886425 + "ts": 0.178577225 }, { "core_id": 1, @@ -16302,7 +17858,7 @@ "params": { "irq_num": 5 }, - "ts": 0.179666425 + "ts": 0.1794482 }, { "core_id": 1, @@ -16310,7 +17866,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.179680075 + "ts": 0.179461775 }, { "core_id": 1, @@ -16318,7 +17874,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.17969535 + "ts": 0.1794769 }, { "core_id": 0, @@ -16328,7 +17884,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1798338 + "ts": 0.17954665 }, { "core_id": 0, @@ -16336,7 +17892,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.179849175 + "ts": 0.179562 }, { "core_id": 0, @@ -16344,7 +17900,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.17986425 + "ts": 0.179577075 }, { "core_id": 1, @@ -16354,7 +17910,7 @@ "params": { "irq_num": 5 }, - "ts": 0.180666425 + "ts": 0.1804482 }, { "core_id": 1, @@ -16362,7 +17918,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.18068 + "ts": 0.180461725 }, { "core_id": 1, @@ -16370,7 +17926,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.180695125 + "ts": 0.18047685 }, { "core_id": 0, @@ -16380,7 +17936,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1808338 + "ts": 0.18054665 }, { "core_id": 0, @@ -16388,7 +17944,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.180849175 + "ts": 0.1805663 }, { "core_id": 0, @@ -16396,7 +17952,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.18086425 + "ts": 0.1805815 }, { "core_id": 1, @@ -16406,7 +17962,7 @@ "params": { "irq_num": 5 }, - "ts": 0.181666425 + "ts": 0.1814482 }, { "core_id": 1, @@ -16414,7 +17970,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.181680075 + "ts": 0.181461725 }, { "core_id": 1, @@ -16422,7 +17978,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.181695225 + "ts": 0.18147685 }, { "core_id": 0, @@ -16432,7 +17988,59 @@ "params": { "irq_num": 5 }, - "ts": 0.1818338 + "ts": 0.18154665 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.181562 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.181577075 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.1824482 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.182461725 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.182476975 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.18254665 }, { "core_id": 0, @@ -16440,9 +18048,19 @@ "id": 6, "in_irq": true, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.181848825 + "ts": 0.182561625 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12284596 + }, + "ts": 0.182561625 }, { "core_id": 0, @@ -16450,7 +18068,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.181861575 + "ts": 0.182574225 }, { "core_id": 0, @@ -16458,18 +18076,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.18187725 + "ts": 0.182589875 }, { - "addr": "0x3ffbb824", + "addr": "0x3ffbafe0", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -16481,16 +18099,16 @@ "id": 512, "in_irq": false, "size": 7, - "ts": 0.181912575 + "ts": 0.1826249 }, { - "addr": "0x3ffbb834", + "addr": "0x3ffbb014", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -16502,7 +18120,7 @@ "id": 512, "in_irq": false, "size": 14, - "ts": 0.181947 + "ts": 0.182660375 }, { "core_id": 0, @@ -16512,10 +18130,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.181964025 + "ts": 0.1826773 }, { "core_id": 0, @@ -16525,10 +18143,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.181980025 + "ts": 0.18269325 }, { "core_id": 0, @@ -16536,8 +18154,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (490) example: Task[0x3ffb7aec]: allocated 14 bytes @ 0x3ffbb834\n", - "ts": 0.18205045 + "msg": "I (478) example: Task[0x3ffb72b4]: allocated 14 bytes @ 0x3ffbb014\n", + "ts": 0.182748025 }, { "core_id": 0, @@ -16545,8 +18163,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (490) example: Task[0x3ffb7aec]: allocated 14 bytes @ 0x3ffbb834\n", - "ts": 0.18205045 + "msg": "I (478) example: Task[0x3ffb72b4]: allocated 14 bytes @ 0x3ffbb014\n", + "ts": 0.182748025 }, { "core_id": 0, @@ -16556,10 +18174,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 0 }, - "ts": 0.1820682 + "ts": 0.1827615 }, { "core_id": 0, @@ -16567,9 +18185,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.182081425 + "ts": 0.18277885 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12287644 + }, + "ts": 0.18277885 }, { "core_id": 1, @@ -16579,7 +18207,7 @@ "params": { "irq_num": 31 }, - "ts": 0.18209765 + "ts": 0.1827951 }, { "core_id": 0, @@ -16589,7 +18217,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.182108525 + "ts": 0.18280605 }, { "core_id": 1, @@ -16597,7 +18225,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.182119275 + "ts": 0.182816825 }, { "core_id": 0, @@ -16607,7 +18235,7 @@ "params": { "irq_num": 30 }, - "ts": 0.182133125 + "ts": 0.18283055 }, { "core_id": 1, @@ -16615,9 +18243,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.182144 + "ts": 0.1828413 }, { "core_id": 0, @@ -16625,7 +18253,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.182154825 + "ts": 0.1828521 }, { "core_id": 1, @@ -16635,10 +18263,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 4294967295 }, - "ts": 0.1821668 + "ts": 0.182864075 }, { "core_id": 0, @@ -16646,7 +18274,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.18217705 + "ts": 0.182874325 }, { "core_id": 1, @@ -16656,10 +18284,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.18218845 + "ts": 0.182886075 }, { "core_id": 1, @@ -16669,10 +18297,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.182204825 + "ts": 0.18290235 }, { "core_id": 1, @@ -16680,8 +18308,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (490) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb834\n", - "ts": 0.182268375 + "msg": "I (478) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb014\n", + "ts": 0.182950125 }, { "core_id": 1, @@ -16689,15 +18317,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (490) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb834\n", - "ts": 0.182268375 + "msg": "I (478) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb014\n", + "ts": 0.182950125 }, { - "addr": "0x3ffbb834", + "addr": "0x3ffbb014", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -16711,7 +18339,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.182289575 + "ts": 0.1829715 }, { "core_id": 1, @@ -16721,7 +18349,7 @@ "params": { "irq_num": 31 }, - "ts": 0.182320575 + "ts": 0.1829989 }, { "core_id": 1, @@ -16729,7 +18357,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.18233205 + "ts": 0.183010325 }, { "core_id": 1, @@ -16737,7 +18365,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.18234875 + "ts": 0.183026875 }, { "core_id": 1, @@ -16747,7 +18375,7 @@ "params": { "irq_num": 5 }, - "ts": 0.182666425 + "ts": 0.1834482 }, { "core_id": 1, @@ -16755,7 +18383,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.182679875 + "ts": 0.183461725 }, { "core_id": 1, @@ -16763,7 +18391,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.18269545 + "ts": 0.1834773 }, { "core_id": 0, @@ -16773,7 +18401,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1828338 + "ts": 0.18354665 }, { "core_id": 0, @@ -16781,9 +18409,39 @@ "id": 6, "in_irq": true, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.182848825 + "ts": 0.183561675 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12290612 + }, + "ts": 0.183561675 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 6, + "in_irq": true, + "params": { + "tid": 12296612 + }, + "ts": 0.1835735 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.1835735 }, { "core_id": 0, @@ -16791,7 +18449,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.182861575 + "ts": 0.183586 }, { "core_id": 0, @@ -16799,18 +18457,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.18287725 + "ts": 0.183601675 }, { - "addr": "0x3ffbb834", + "addr": "0x3ffbb014", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -16822,16 +18480,16 @@ "id": 512, "in_irq": false, "size": 14, - "ts": 0.182912575 + "ts": 0.183638125 }, { - "addr": "0x3ffbb848", + "addr": "0x3ffbb028", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -16843,7 +18501,7 @@ "id": 512, "in_irq": false, "size": 28, - "ts": 0.182947 + "ts": 0.1836777 }, { "core_id": 0, @@ -16853,10 +18511,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.182964025 + "ts": 0.18369465 }, { "core_id": 0, @@ -16866,10 +18524,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.182980025 + "ts": 0.183710775 }, { "core_id": 0, @@ -16877,8 +18535,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (491) example: Task[0x3ffb926c]: allocated 28 bytes @ 0x3ffbb848\n", - "ts": 0.18305045 + "msg": "I (479) example: Task[0x3ffb8a34]: allocated 28 bytes @ 0x3ffbb028\n", + "ts": 0.1837655 }, { "core_id": 0, @@ -16886,8 +18544,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (491) example: Task[0x3ffb926c]: allocated 28 bytes @ 0x3ffbb848\n", - "ts": 0.18305045 + "msg": "I (479) example: Task[0x3ffb8a34]: allocated 28 bytes @ 0x3ffbb028\n", + "ts": 0.1837655 }, { "core_id": 0, @@ -16897,10 +18555,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 0 }, - "ts": 0.183064 + "ts": 0.18377895 }, { "core_id": 0, @@ -16908,9 +18566,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.183081425 + "ts": 0.183792325 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12293660 + }, + "ts": 0.183792325 }, { "core_id": 1, @@ -16920,7 +18588,7 @@ "params": { "irq_num": 31 }, - "ts": 0.183097725 + "ts": 0.183808675 }, { "core_id": 0, @@ -16930,7 +18598,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.183108575 + "ts": 0.183819525 }, { "core_id": 1, @@ -16938,7 +18606,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.183119325 + "ts": 0.18383035 }, { "core_id": 0, @@ -16948,7 +18616,7 @@ "params": { "irq_num": 30 }, - "ts": 0.18313305 + "ts": 0.183844125 }, { "core_id": 1, @@ -16956,9 +18624,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.1831439 + "ts": 0.183856075 }, { "core_id": 0, @@ -16966,7 +18634,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.183154725 + "ts": 0.183867225 }, { "core_id": 1, @@ -16976,18 +18644,20 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 4294967295 }, - "ts": 0.1831666 + "ts": 0.183879175 }, { "core_id": 0, - "ctx_name": "alloc1", - "id": 17, + "ctx_name": "alloc2", + "id": 4, "in_irq": false, - "params": {}, - "ts": 0.18317685 + "params": { + "tid": 12296612 + }, + "ts": 0.183890825 }, { "core_id": 1, @@ -16997,10 +18667,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.183188325 + "ts": 0.1839025 }, { "core_id": 1, @@ -17010,148 +18680,19 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.183204625 + "ts": 0.183924575 }, { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (491) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb848\n", - "ts": 0.183268075 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (491) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb848\n", - "ts": 0.183268075 - }, - { - "addr": "0x3ffbb848", + "addr": "0x3ffbb048", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0" - ], - "core_id": 1, - "ctx_name": "free1", - "id": 513, - "in_irq": false, - "size": 0, - "ts": 0.18328925 - }, - { - "core_id": 1, - "ctx_name": "FROM_CPU1", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 31 - }, - "ts": 0.18331625 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.183327675 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.18334425 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.183666425 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.18367985 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.18369555 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.1838338 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 6, - "in_irq": true, - "params": { - "tid": 12298716 - }, - "ts": 0.1838488 - }, - { - "core_id": 0, - "ctx_name": "alloc1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.183861575 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 4, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.18387725 - }, - { - "addr": "0x3ffbb848", - "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -17163,16 +18704,34 @@ "id": 512, "in_irq": false, "size": 21, - "ts": 0.18391265 + "ts": 0.18393615 }, { - "addr": "0x3ffbb864", + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (479) example: Task[0x3ffb961c]: free memory @ 0x3ffbb028\n", + "ts": 0.1839775 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (479) example: Task[0x3ffb961c]: free memory @ 0x3ffbb028\n", + "ts": 0.1839775 + }, + { + "addr": "0x3ffbb064", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -17184,7 +18743,28 @@ "id": 512, "in_irq": false, "size": 42, - "ts": 0.183951325 + "ts": 0.1839886 + }, + { + "addr": "0x3ffbb028", + "callers": [ + "0x4008da24", + "0x400d3c72", + "0x400880dc", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0" + ], + "core_id": 1, + "ctx_name": "free1", + "id": 513, + "in_irq": false, + "size": 0, + "ts": 0.184003025 }, { "core_id": 0, @@ -17194,64 +18774,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.183968225 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12283904, - "xTicksToWait": 0 - }, - "ts": 0.1839842 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (492) example: Task[0x3ffba9dc]: allocated 42 bytes @ 0x3ffbb864\n", - "ts": 0.18405455 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (492) example: Task[0x3ffba9dc]: allocated 42 bytes @ 0x3ffbb864\n", - "ts": 0.18405455 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12299072, - "xTicksToWait": 0 - }, - "ts": 0.18406815 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 6, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.184081375 + "ts": 0.1840156 }, { "core_id": 1, @@ -17261,7 +18787,97 @@ "params": { "irq_num": 31 }, - "ts": 0.184097675 + "ts": 0.184034475 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12281672, + "xTicksToWait": 0 + }, + "ts": 0.1840457 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.184056475 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.184074625 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (479) example: Task[0x3ffba1a4]: allocated 42 bytes @ 0x3ffbb064\n", + "ts": 0.184102425 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (479) example: Task[0x3ffba1a4]: allocated 42 bytes @ 0x3ffbb064\n", + "ts": 0.184102425 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12296968, + "xTicksToWait": 0 + }, + "ts": 0.18412015 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.1841334 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.1841334 + }, + { + "core_id": 1, + "ctx_name": "FROM_CPU1", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 31 + }, + "ts": 0.18414975 }, { "core_id": 0, @@ -17271,7 +18887,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.184108525 + "ts": 0.1841606 }, { "core_id": 1, @@ -17279,7 +18895,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1841193 + "ts": 0.184171425 }, { "core_id": 0, @@ -17289,7 +18905,7 @@ "params": { "irq_num": 30 }, - "ts": 0.184133175 + "ts": 0.184185225 }, { "core_id": 1, @@ -17297,9 +18913,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.18414405 + "ts": 0.184195975 }, { "core_id": 0, @@ -17307,7 +18923,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.184154875 + "ts": 0.18420675 }, { "core_id": 1, @@ -17317,10 +18933,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 4294967295 }, - "ts": 0.18416675 + "ts": 0.18421885 }, { "core_id": 0, @@ -17328,7 +18944,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.184178025 + "ts": 0.18423005 }, { "core_id": 1, @@ -17338,10 +18954,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.184189675 + "ts": 0.1842424 }, { "core_id": 1, @@ -17351,10 +18967,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.184209375 + "ts": 0.184258625 }, { "core_id": 1, @@ -17362,8 +18978,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (492) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb864\n", - "ts": 0.184272925 + "msg": "I (479) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb064\n", + "ts": 0.1843065 }, { "core_id": 1, @@ -17371,15 +18987,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (492) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb864\n", - "ts": 0.184272925 + "msg": "I (479) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb064\n", + "ts": 0.1843065 }, { - "addr": "0x3ffbb864", + "addr": "0x3ffbb064", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -17393,7 +19009,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.184294125 + "ts": 0.184327925 }, { "core_id": 1, @@ -17403,7 +19019,7 @@ "params": { "irq_num": 31 }, - "ts": 0.184321025 + "ts": 0.18435925 }, { "core_id": 1, @@ -17411,7 +19027,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.184332575 + "ts": 0.184370825 }, { "core_id": 1, @@ -17419,7 +19035,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.18434915 + "ts": 0.184387525 }, { "core_id": 1, @@ -17429,7 +19045,7 @@ "params": { "irq_num": 5 }, - "ts": 0.184666425 + "ts": 0.1844482 }, { "core_id": 1, @@ -17437,7 +19053,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.18467985 + "ts": 0.184461625 }, { "core_id": 1, @@ -17445,7 +19061,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.18469555 + "ts": 0.1844772 }, { "core_id": 0, @@ -17455,7 +19071,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1848338 + "ts": 0.18454665 }, { "core_id": 0, @@ -17463,7 +19079,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.184849175 + "ts": 0.18456205 }, { "core_id": 0, @@ -17471,7 +19087,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.18486425 + "ts": 0.184577275 }, { "core_id": 1, @@ -17481,7 +19097,7 @@ "params": { "irq_num": 5 }, - "ts": 0.185666425 + "ts": 0.1854482 }, { "core_id": 1, @@ -17489,7 +19105,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.185680075 + "ts": 0.185461725 }, { "core_id": 1, @@ -17497,7 +19113,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.18569535 + "ts": 0.18547685 }, { "core_id": 0, @@ -17507,7 +19123,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1858338 + "ts": 0.18554665 }, { "core_id": 0, @@ -17515,7 +19131,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.185849175 + "ts": 0.185562 }, { "core_id": 0, @@ -17523,7 +19139,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.18586425 + "ts": 0.185577075 }, { "core_id": 1, @@ -17533,7 +19149,7 @@ "params": { "irq_num": 5 }, - "ts": 0.186666425 + "ts": 0.1864482 }, { "core_id": 1, @@ -17541,7 +19157,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.18668 + "ts": 0.186461725 }, { "core_id": 1, @@ -17549,7 +19165,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.186695125 + "ts": 0.186476975 }, { "core_id": 0, @@ -17559,7 +19175,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1868338 + "ts": 0.18654665 }, { "core_id": 0, @@ -17567,7 +19183,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.186849175 + "ts": 0.186562025 }, { "core_id": 0, @@ -17575,7 +19191,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.18686425 + "ts": 0.186577225 }, { "core_id": 1, @@ -17585,7 +19201,7 @@ "params": { "irq_num": 5 }, - "ts": 0.187666425 + "ts": 0.1874482 }, { "core_id": 1, @@ -17593,7 +19209,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.187680075 + "ts": 0.187461775 }, { "core_id": 1, @@ -17601,7 +19217,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.187695225 + "ts": 0.1874769 }, { "core_id": 0, @@ -17611,7 +19227,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1878338 + "ts": 0.18754665 }, { "core_id": 0, @@ -17619,7 +19235,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1878492 + "ts": 0.187562 }, { "core_id": 0, @@ -17627,7 +19243,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.187864425 + "ts": 0.187577075 }, { "core_id": 1, @@ -17637,7 +19253,7 @@ "params": { "irq_num": 5 }, - "ts": 0.188666425 + "ts": 0.1884482 }, { "core_id": 1, @@ -17645,7 +19261,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.18867995 + "ts": 0.188461725 }, { "core_id": 1, @@ -17653,7 +19269,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1886951 + "ts": 0.18847685 }, { "core_id": 0, @@ -17663,7 +19279,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1888338 + "ts": 0.18854665 }, { "core_id": 0, @@ -17671,7 +19287,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.188849175 + "ts": 0.18856205 }, { "core_id": 0, @@ -17679,7 +19295,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.18886425 + "ts": 0.188577275 }, { "core_id": 1, @@ -17689,7 +19305,7 @@ "params": { "irq_num": 5 }, - "ts": 0.189666425 + "ts": 0.1894482 }, { "core_id": 1, @@ -17697,7 +19313,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.189680075 + "ts": 0.189461725 }, { "core_id": 1, @@ -17705,7 +19321,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.18969535 + "ts": 0.18947685 }, { "core_id": 0, @@ -17715,7 +19331,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1898338 + "ts": 0.18954665 }, { "core_id": 0, @@ -17723,7 +19339,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.189849175 + "ts": 0.189562 }, { "core_id": 0, @@ -17731,7 +19347,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.189868575 + "ts": 0.189577075 }, { "core_id": 1, @@ -17741,7 +19357,7 @@ "params": { "irq_num": 5 }, - "ts": 0.190666425 + "ts": 0.1904482 }, { "core_id": 1, @@ -17749,7 +19365,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.19067995 + "ts": 0.190461725 }, { "core_id": 1, @@ -17757,7 +19373,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1906951 + "ts": 0.190476975 }, { "core_id": 0, @@ -17767,7 +19383,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1908338 + "ts": 0.19054665 }, { "core_id": 0, @@ -17775,7 +19391,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.190849175 + "ts": 0.190562025 }, { "core_id": 0, @@ -17783,7 +19399,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.19086425 + "ts": 0.190577225 }, { "core_id": 1, @@ -17793,7 +19409,7 @@ "params": { "irq_num": 5 }, - "ts": 0.191666425 + "ts": 0.1914482 }, { "core_id": 1, @@ -17801,7 +19417,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.191680075 + "ts": 0.191461775 }, { "core_id": 1, @@ -17809,7 +19425,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.19169535 + "ts": 0.1914769 }, { "core_id": 0, @@ -17819,7 +19435,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1918338 + "ts": 0.19154665 }, { "core_id": 0, @@ -17827,7 +19443,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.191849175 + "ts": 0.191562 }, { "core_id": 0, @@ -17835,7 +19451,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.19186425 + "ts": 0.191577075 }, { "core_id": 1, @@ -17845,7 +19461,7 @@ "params": { "irq_num": 5 }, - "ts": 0.192666425 + "ts": 0.1924482 }, { "core_id": 1, @@ -17853,7 +19469,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.19268 + "ts": 0.192461725 }, { "core_id": 1, @@ -17861,7 +19477,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.192695125 + "ts": 0.19247685 }, { "core_id": 0, @@ -17871,7 +19487,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1928338 + "ts": 0.19254665 }, { "core_id": 0, @@ -17879,7 +19495,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.192849175 + "ts": 0.19256205 }, { "core_id": 0, @@ -17887,7 +19503,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.19286425 + "ts": 0.192577275 }, { "core_id": 1, @@ -17897,7 +19513,7 @@ "params": { "irq_num": 5 }, - "ts": 0.193666425 + "ts": 0.1934482 }, { "core_id": 1, @@ -17905,7 +19521,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.193680075 + "ts": 0.193461725 }, { "core_id": 1, @@ -17913,7 +19529,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.193695225 + "ts": 0.19347685 }, { "core_id": 0, @@ -17923,7 +19539,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1938338 + "ts": 0.19354665 }, { "core_id": 0, @@ -17931,7 +19547,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1938492 + "ts": 0.193562 }, { "core_id": 0, @@ -17939,7 +19555,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.193864425 + "ts": 0.193577075 }, { "core_id": 1, @@ -17949,7 +19565,7 @@ "params": { "irq_num": 5 }, - "ts": 0.194666425 + "ts": 0.1944482 }, { "core_id": 1, @@ -17957,7 +19573,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.19467995 + "ts": 0.19446595 }, { "core_id": 1, @@ -17965,7 +19581,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1946951 + "ts": 0.1944811 }, { "core_id": 0, @@ -17975,7 +19591,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1948338 + "ts": 0.19454665 }, { "core_id": 0, @@ -17983,7 +19599,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.194849175 + "ts": 0.194562 }, { "core_id": 0, @@ -17991,7 +19607,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.19486425 + "ts": 0.194577075 }, { "core_id": 1, @@ -18001,7 +19617,7 @@ "params": { "irq_num": 5 }, - "ts": 0.195666425 + "ts": 0.1954482 }, { "core_id": 1, @@ -18009,7 +19625,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.195680075 + "ts": 0.195461725 }, { "core_id": 1, @@ -18017,7 +19633,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.19569535 + "ts": 0.19547685 }, { "core_id": 0, @@ -18027,7 +19643,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1958338 + "ts": 0.19554665 }, { "core_id": 0, @@ -18035,7 +19651,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.195849175 + "ts": 0.19556205 }, { "core_id": 0, @@ -18043,7 +19659,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.19586425 + "ts": 0.195577275 }, { "core_id": 1, @@ -18053,7 +19669,7 @@ "params": { "irq_num": 5 }, - "ts": 0.196666425 + "ts": 0.1964482 }, { "core_id": 1, @@ -18061,7 +19677,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.19668 + "ts": 0.196461725 }, { "core_id": 1, @@ -18069,7 +19685,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.196695125 + "ts": 0.19647685 }, { "core_id": 0, @@ -18079,7 +19695,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1968338 + "ts": 0.19654665 }, { "core_id": 0, @@ -18087,7 +19703,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.196849175 + "ts": 0.196562 }, { "core_id": 0, @@ -18095,7 +19711,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.19686425 + "ts": 0.196577075 }, { "core_id": 1, @@ -18105,7 +19721,7 @@ "params": { "irq_num": 5 }, - "ts": 0.197666425 + "ts": 0.1974482 }, { "core_id": 1, @@ -18113,7 +19729,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.197680075 + "ts": 0.197461725 }, { "core_id": 1, @@ -18121,7 +19737,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.197695225 + "ts": 0.197476975 }, { "core_id": 0, @@ -18131,7 +19747,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1978338 + "ts": 0.19754665 }, { "core_id": 0, @@ -18139,7 +19755,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.1978492 + "ts": 0.197562025 }, { "core_id": 0, @@ -18147,7 +19763,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.197864425 + "ts": 0.197577225 }, { "core_id": 1, @@ -18157,7 +19773,7 @@ "params": { "irq_num": 5 }, - "ts": 0.198666425 + "ts": 0.1984482 }, { "core_id": 1, @@ -18165,7 +19781,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.19867995 + "ts": 0.198461775 }, { "core_id": 1, @@ -18173,7 +19789,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.1986951 + "ts": 0.1984769 }, { "core_id": 0, @@ -18183,7 +19799,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1988338 + "ts": 0.19854665 }, { "core_id": 0, @@ -18191,7 +19807,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.198849175 + "ts": 0.198562 }, { "core_id": 0, @@ -18199,7 +19815,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.19886425 + "ts": 0.198577075 }, { "core_id": 1, @@ -18209,7 +19825,7 @@ "params": { "irq_num": 5 }, - "ts": 0.199666425 + "ts": 0.1994482 }, { "core_id": 1, @@ -18217,7 +19833,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.199680075 + "ts": 0.199461725 }, { "core_id": 1, @@ -18225,7 +19841,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.19969535 + "ts": 0.19947685 }, { "core_id": 0, @@ -18235,7 +19851,7 @@ "params": { "irq_num": 5 }, - "ts": 0.1998338 + "ts": 0.19954665 }, { "core_id": 0, @@ -18243,7 +19859,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.199849175 + "ts": 0.19956205 }, { "core_id": 0, @@ -18251,7 +19867,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.19986425 + "ts": 0.199577275 }, { "core_id": 1, @@ -18261,7 +19877,7 @@ "params": { "irq_num": 5 }, - "ts": 0.200666425 + "ts": 0.2004482 }, { "core_id": 1, @@ -18269,7 +19885,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.20068 + "ts": 0.200461725 }, { "core_id": 1, @@ -18277,7 +19893,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.200695125 + "ts": 0.20047685 }, { "core_id": 0, @@ -18287,7 +19903,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2008338 + "ts": 0.20054665 }, { "core_id": 0, @@ -18295,7 +19911,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.200849175 + "ts": 0.200562 }, { "core_id": 0, @@ -18303,7 +19919,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.20086425 + "ts": 0.200577075 }, { "core_id": 1, @@ -18313,7 +19929,7 @@ "params": { "irq_num": 5 }, - "ts": 0.201666425 + "ts": 0.2014482 }, { "core_id": 1, @@ -18321,7 +19937,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.201680075 + "ts": 0.201461725 }, { "core_id": 1, @@ -18329,7 +19945,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.201695225 + "ts": 0.201476975 }, { "core_id": 0, @@ -18339,7 +19955,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2018338 + "ts": 0.20154665 }, { "core_id": 0, @@ -18347,7 +19963,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2018492 + "ts": 0.201562025 }, { "core_id": 0, @@ -18355,7 +19971,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.201864425 + "ts": 0.201577225 }, { "core_id": 1, @@ -18365,7 +19981,7 @@ "params": { "irq_num": 5 }, - "ts": 0.202666425 + "ts": 0.2024482 }, { "core_id": 1, @@ -18373,7 +19989,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.202680075 + "ts": 0.202461775 }, { "core_id": 1, @@ -18381,7 +19997,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.20269535 + "ts": 0.2024769 }, { "core_id": 0, @@ -18391,7 +20007,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2028338 + "ts": 0.20254665 }, { "core_id": 0, @@ -18399,7 +20015,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.202849175 + "ts": 0.202562 }, { "core_id": 0, @@ -18407,7 +20023,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.20286425 + "ts": 0.202577075 }, { "core_id": 1, @@ -18417,7 +20033,7 @@ "params": { "irq_num": 5 }, - "ts": 0.203666425 + "ts": 0.2034482 }, { "core_id": 1, @@ -18425,7 +20041,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.20368 + "ts": 0.203461725 }, { "core_id": 1, @@ -18433,7 +20049,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.203695125 + "ts": 0.20347685 }, { "core_id": 0, @@ -18443,7 +20059,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2038338 + "ts": 0.20354665 }, { "core_id": 0, @@ -18451,7 +20067,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.203849175 + "ts": 0.20356205 }, { "core_id": 0, @@ -18459,7 +20075,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.20386425 + "ts": 0.203577275 }, { "core_id": 1, @@ -18469,7 +20085,7 @@ "params": { "irq_num": 5 }, - "ts": 0.204666425 + "ts": 0.2044482 }, { "core_id": 1, @@ -18477,7 +20093,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.204680075 + "ts": 0.204461725 }, { "core_id": 1, @@ -18485,7 +20101,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.204695225 + "ts": 0.20447685 }, { "core_id": 0, @@ -18495,7 +20111,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2048338 + "ts": 0.20454665 }, { "core_id": 0, @@ -18503,7 +20119,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2048492 + "ts": 0.204562 }, { "core_id": 0, @@ -18511,7 +20127,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.204864425 + "ts": 0.204577075 }, { "core_id": 1, @@ -18521,7 +20137,7 @@ "params": { "irq_num": 5 }, - "ts": 0.205666425 + "ts": 0.2054482 }, { "core_id": 1, @@ -18529,7 +20145,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.20567995 + "ts": 0.205461725 }, { "core_id": 1, @@ -18537,7 +20153,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2056951 + "ts": 0.205476975 }, { "core_id": 0, @@ -18547,7 +20163,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2058338 + "ts": 0.20554665 }, { "core_id": 0, @@ -18555,7 +20171,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.205849175 + "ts": 0.205562025 }, { "core_id": 0, @@ -18563,7 +20179,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.20586425 + "ts": 0.205577225 }, { "core_id": 1, @@ -18573,7 +20189,7 @@ "params": { "irq_num": 5 }, - "ts": 0.206666425 + "ts": 0.2064482 }, { "core_id": 1, @@ -18581,7 +20197,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.206680075 + "ts": 0.206466 }, { "core_id": 1, @@ -18589,7 +20205,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.20669535 + "ts": 0.206481125 }, { "core_id": 0, @@ -18599,7 +20215,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2068338 + "ts": 0.20654665 }, { "core_id": 0, @@ -18607,7 +20223,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.206849175 + "ts": 0.206562 }, { "core_id": 0, @@ -18615,7 +20231,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.20686425 + "ts": 0.206577075 }, { "core_id": 1, @@ -18625,7 +20241,7 @@ "params": { "irq_num": 5 }, - "ts": 0.207666425 + "ts": 0.2074482 }, { "core_id": 1, @@ -18633,7 +20249,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.20768 + "ts": 0.207461725 }, { "core_id": 1, @@ -18641,7 +20257,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.207695125 + "ts": 0.20747685 }, { "core_id": 0, @@ -18651,7 +20267,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2078338 + "ts": 0.20754665 }, { "core_id": 0, @@ -18659,7 +20275,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.207849175 + "ts": 0.20756205 }, { "core_id": 0, @@ -18667,7 +20283,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.20786425 + "ts": 0.207577275 }, { "core_id": 1, @@ -18677,7 +20293,7 @@ "params": { "irq_num": 5 }, - "ts": 0.208666425 + "ts": 0.2084482 }, { "core_id": 1, @@ -18685,7 +20301,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.208680075 + "ts": 0.208461725 }, { "core_id": 1, @@ -18693,7 +20309,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.208695225 + "ts": 0.20847685 }, { "core_id": 0, @@ -18703,7 +20319,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2088338 + "ts": 0.20854665 }, { "core_id": 0, @@ -18711,7 +20327,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2088492 + "ts": 0.208562 }, { "core_id": 0, @@ -18719,7 +20335,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.208864425 + "ts": 0.208577075 }, { "core_id": 1, @@ -18729,7 +20345,7 @@ "params": { "irq_num": 5 }, - "ts": 0.209666425 + "ts": 0.2094482 }, { "core_id": 1, @@ -18737,7 +20353,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.20967995 + "ts": 0.209461725 }, { "core_id": 1, @@ -18745,7 +20361,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2096951 + "ts": 0.209476975 }, { "core_id": 0, @@ -18755,7 +20371,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2098338 + "ts": 0.20954665 }, { "core_id": 0, @@ -18763,7 +20379,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.209849175 + "ts": 0.209562025 }, { "core_id": 0, @@ -18771,7 +20387,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.20986425 + "ts": 0.209577225 }, { "core_id": 1, @@ -18781,7 +20397,7 @@ "params": { "irq_num": 5 }, - "ts": 0.210666425 + "ts": 0.2104482 }, { "core_id": 1, @@ -18789,7 +20405,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.210680075 + "ts": 0.210461775 }, { "core_id": 1, @@ -18797,7 +20413,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.21069535 + "ts": 0.2104769 }, { "core_id": 0, @@ -18807,7 +20423,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2108338 + "ts": 0.21054665 }, { "core_id": 0, @@ -18815,7 +20431,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.210849175 + "ts": 0.210562 }, { "core_id": 0, @@ -18823,7 +20439,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.21086425 + "ts": 0.210577075 }, { "core_id": 1, @@ -18833,7 +20449,7 @@ "params": { "irq_num": 5 }, - "ts": 0.211666425 + "ts": 0.2114482 }, { "core_id": 1, @@ -18841,7 +20457,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.21168 + "ts": 0.211461725 }, { "core_id": 1, @@ -18849,7 +20465,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.211695125 + "ts": 0.21147685 }, { "core_id": 0, @@ -18859,7 +20475,59 @@ "params": { "irq_num": 5 }, - "ts": 0.2118338 + "ts": 0.21154665 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.21156205 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.211577275 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.2124482 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.212461725 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.21247685 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.21254665 }, { "core_id": 0, @@ -18867,9 +20535,19 @@ "id": 6, "in_irq": true, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.2118488 + "ts": 0.212561625 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12284596 + }, + "ts": 0.212561625 }, { "core_id": 0, @@ -18877,7 +20555,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.211861575 + "ts": 0.212574275 }, { "core_id": 0, @@ -18885,18 +20563,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.21187725 + "ts": 0.212590075 }, { - "addr": "0x3ffbb864", + "addr": "0x3ffbb028", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -18908,16 +20586,16 @@ "id": 512, "in_irq": false, "size": 8, - "ts": 0.21191265 + "ts": 0.21262615 }, { - "addr": "0x3ffbb874", + "addr": "0x3ffbb064", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -18929,7 +20607,7 @@ "id": 512, "in_irq": false, "size": 16, - "ts": 0.21195125 + "ts": 0.212661725 }, { "core_id": 0, @@ -18939,10 +20617,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.21196815 + "ts": 0.2126787 }, { "core_id": 0, @@ -18952,10 +20630,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.21198415 + "ts": 0.212694675 }, { "core_id": 0, @@ -18963,8 +20641,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (520) example: Task[0x3ffb7aec]: allocated 16 bytes @ 0x3ffbb874\n", - "ts": 0.212054475 + "msg": "I (508) example: Task[0x3ffb72b4]: allocated 16 bytes @ 0x3ffbb064\n", + "ts": 0.2127537 }, { "core_id": 0, @@ -18972,8 +20650,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (520) example: Task[0x3ffb7aec]: allocated 16 bytes @ 0x3ffbb874\n", - "ts": 0.212054475 + "msg": "I (508) example: Task[0x3ffb72b4]: allocated 16 bytes @ 0x3ffbb064\n", + "ts": 0.2127537 }, { "core_id": 0, @@ -18983,10 +20661,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 0 }, - "ts": 0.212068075 + "ts": 0.212767175 }, { "core_id": 0, @@ -18994,9 +20672,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.2120813 + "ts": 0.21278035 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12287644 + }, + "ts": 0.21278035 }, { "core_id": 1, @@ -19006,7 +20694,7 @@ "params": { "irq_num": 31 }, - "ts": 0.212097675 + "ts": 0.21279655 }, { "core_id": 0, @@ -19016,7 +20704,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.212108525 + "ts": 0.2128075 }, { "core_id": 1, @@ -19024,7 +20712,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2121193 + "ts": 0.212818275 }, { "core_id": 0, @@ -19034,7 +20722,7 @@ "params": { "irq_num": 30 }, - "ts": 0.212133125 + "ts": 0.212832325 }, { "core_id": 1, @@ -19042,9 +20730,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.212144025 + "ts": 0.212844475 }, { "core_id": 0, @@ -19052,7 +20740,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.21215485 + "ts": 0.212855425 }, { "core_id": 1, @@ -19062,10 +20750,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 4294967295 }, - "ts": 0.2121668 + "ts": 0.212867375 }, { "core_id": 0, @@ -19073,7 +20761,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.21217705 + "ts": 0.212877575 }, { "core_id": 1, @@ -19083,10 +20771,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.212188475 + "ts": 0.2128893 }, { "core_id": 1, @@ -19096,10 +20784,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.21220885 + "ts": 0.21290565 }, { "core_id": 1, @@ -19107,8 +20795,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (520) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb874\n", - "ts": 0.2122724 + "msg": "I (508) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb064\n", + "ts": 0.212953525 }, { "core_id": 1, @@ -19116,15 +20804,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (520) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb874\n", - "ts": 0.2122724 + "msg": "I (508) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb064\n", + "ts": 0.212953525 }, { - "addr": "0x3ffbb874", + "addr": "0x3ffbb064", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -19138,7 +20826,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.2122936 + "ts": 0.212974725 }, { "core_id": 1, @@ -19148,7 +20836,7 @@ "params": { "irq_num": 31 }, - "ts": 0.212320475 + "ts": 0.2130062 }, { "core_id": 1, @@ -19156,7 +20844,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2123319 + "ts": 0.21301765 }, { "core_id": 1, @@ -19164,7 +20852,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.212348475 + "ts": 0.21303435 }, { "core_id": 1, @@ -19174,7 +20862,7 @@ "params": { "irq_num": 5 }, - "ts": 0.212666425 + "ts": 0.2134482 }, { "core_id": 1, @@ -19182,7 +20870,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.21267985 + "ts": 0.213461725 }, { "core_id": 1, @@ -19190,7 +20878,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.21269555 + "ts": 0.2134773 }, { "core_id": 0, @@ -19200,7 +20888,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2128338 + "ts": 0.21354665 }, { "core_id": 0, @@ -19208,9 +20896,39 @@ "id": 6, "in_irq": true, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.2128488 + "ts": 0.213561625 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12290612 + }, + "ts": 0.213561625 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 6, + "in_irq": true, + "params": { + "tid": 12296612 + }, + "ts": 0.2135735 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.2135735 }, { "core_id": 0, @@ -19218,7 +20936,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.212861575 + "ts": 0.213585975 }, { "core_id": 0, @@ -19226,18 +20944,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.212877375 + "ts": 0.213601625 }, { - "addr": "0x3ffbb874", + "addr": "0x3ffbb064", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -19249,16 +20967,16 @@ "id": 512, "in_irq": false, "size": 16, - "ts": 0.212912775 + "ts": 0.213638 }, { - "addr": "0x3ffbb888", + "addr": "0x3ffbb078", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -19270,7 +20988,7 @@ "id": 512, "in_irq": false, "size": 32, - "ts": 0.212947475 + "ts": 0.213673625 }, { "core_id": 0, @@ -19280,10 +20998,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.2129644 + "ts": 0.2136907 }, { "core_id": 0, @@ -19293,10 +21011,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.212984575 + "ts": 0.213706725 }, { "core_id": 0, @@ -19304,8 +21022,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (521) example: Task[0x3ffb926c]: allocated 32 bytes @ 0x3ffbb888\n", - "ts": 0.213055025 + "msg": "I (509) example: Task[0x3ffb8a34]: allocated 32 bytes @ 0x3ffbb078\n", + "ts": 0.213761525 }, { "core_id": 0, @@ -19313,8 +21031,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (521) example: Task[0x3ffb926c]: allocated 32 bytes @ 0x3ffbb888\n", - "ts": 0.213055025 + "msg": "I (509) example: Task[0x3ffb8a34]: allocated 32 bytes @ 0x3ffbb078\n", + "ts": 0.213761525 }, { "core_id": 0, @@ -19324,10 +21042,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 0 }, - "ts": 0.21306865 + "ts": 0.2137783 }, { "core_id": 0, @@ -19335,9 +21053,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.21308185 + "ts": 0.21379155 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12293660 + }, + "ts": 0.21379155 }, { "core_id": 1, @@ -19347,7 +21075,7 @@ "params": { "irq_num": 31 }, - "ts": 0.21309815 + "ts": 0.2138079 }, { "core_id": 0, @@ -19357,7 +21085,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.213109 + "ts": 0.21381875 }, { "core_id": 1, @@ -19365,7 +21093,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.21311975 + "ts": 0.213829575 }, { "core_id": 0, @@ -19375,7 +21103,7 @@ "params": { "irq_num": 30 }, - "ts": 0.213133475 + "ts": 0.213843375 }, { "core_id": 1, @@ -19383,9 +21111,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.213144325 + "ts": 0.2138553 }, { "core_id": 0, @@ -19393,7 +21121,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.21315515 + "ts": 0.213866475 }, { "core_id": 1, @@ -19403,18 +21131,20 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 4294967295 }, - "ts": 0.213167025 + "ts": 0.2138784 }, { "core_id": 0, - "ctx_name": "alloc1", - "id": 17, + "ctx_name": "alloc2", + "id": 4, "in_irq": false, - "params": {}, - "ts": 0.213177275 + "params": { + "tid": 12296612 + }, + "ts": 0.21389005 }, { "core_id": 1, @@ -19424,10 +21154,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.21318875 + "ts": 0.213901775 }, { "core_id": 1, @@ -19437,148 +21167,19 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.21320505 + "ts": 0.21392035 }, { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (521) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb888\n", - "ts": 0.2132685 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (521) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb888\n", - "ts": 0.2132685 - }, - { - "addr": "0x3ffbb888", + "addr": "0x3ffbb09c", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0", - "0x0" - ], - "core_id": 1, - "ctx_name": "free1", - "id": 513, - "in_irq": false, - "size": 0, - "ts": 0.21329355 - }, - { - "core_id": 1, - "ctx_name": "FROM_CPU1", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 31 - }, - "ts": 0.21332055 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.213331975 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.21334855 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.213666425 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.21367985 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.21369555 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.2138338 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 6, - "in_irq": true, - "params": { - "tid": 12298716 - }, - "ts": 0.2138488 - }, - { - "core_id": 0, - "ctx_name": "alloc1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.213861575 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 4, - "in_irq": false, - "params": { - "tid": 12298716 - }, - "ts": 0.21387725 - }, - { - "addr": "0x3ffbb888", - "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -19590,16 +21191,34 @@ "id": 512, "in_irq": false, "size": 24, - "ts": 0.21391265 + "ts": 0.213933475 }, { - "addr": "0x3ffbb8a4", + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (509) example: Task[0x3ffb961c]: free memory @ 0x3ffbb078\n", + "ts": 0.21397405 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (509) example: Task[0x3ffb961c]: free memory @ 0x3ffbb078\n", + "ts": 0.21397405 + }, + { + "addr": "0x3ffbb0b8", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -19611,7 +21230,28 @@ "id": 512, "in_irq": false, "size": 48, - "ts": 0.2139472 + "ts": 0.213990025 + }, + { + "addr": "0x3ffbb078", + "callers": [ + "0x4008da24", + "0x400d3c72", + "0x400880dc", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0" + ], + "core_id": 1, + "ctx_name": "free1", + "id": 513, + "in_irq": false, + "size": 0, + "ts": 0.214004375 }, { "core_id": 0, @@ -19621,64 +21261,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.21396435 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12283904, - "xTicksToWait": 0 - }, - "ts": 0.21398035 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (522) example: Task[0x3ffba9dc]: allocated 48 bytes @ 0x3ffbb8a4\n", - "ts": 0.214050675 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 26, - "in_irq": false, - "lvl": 0, - "msg": "I (522) example: Task[0x3ffba9dc]: allocated 48 bytes @ 0x3ffbb8a4\n", - "ts": 0.214050675 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 53, - "in_irq": false, - "params": { - "pvItemToQueue": 0, - "xCopyPosition": 0, - "xQueue": 12299072, - "xTicksToWait": 0 - }, - "ts": 0.214071175 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 6, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.2140844 + "ts": 0.214016825 }, { "core_id": 1, @@ -19688,7 +21274,197 @@ "params": { "irq_num": 31 }, - "ts": 0.214100725 + "ts": 0.214035975 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12281672, + "xTicksToWait": 0 + }, + "ts": 0.214047225 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.214058075 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.21407635 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (509) example: Task[0x3ffba1a4]: allocated 48 bytes @ 0x3ffbb0b8\n", + "ts": 0.2141042 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 26, + "in_irq": false, + "lvl": 0, + "msg": "I (509) example: Task[0x3ffba1a4]: allocated 48 bytes @ 0x3ffbb0b8\n", + "ts": 0.2141042 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 53, + "in_irq": false, + "params": { + "pvItemToQueue": 0, + "xCopyPosition": 0, + "xQueue": 12296968, + "xTicksToWait": 0 + }, + "ts": 0.21411765 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.215663675 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.215675325 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 6, + "in_irq": true, + "params": { + "tid": 12299660 + }, + "ts": 0.215675325 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.215693125 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.21570425 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.215715175 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.215726825 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.215737325 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.215748175 + }, + { + "core_id": 1, + "ctx_name": "FROM_CPU1", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 31 + }, + "ts": 0.215759125 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.21577085 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.215781625 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 4, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.215793125 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 4, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.215810975 }, { "core_id": 0, @@ -19698,43 +21474,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.214111575 - }, - { - "core_id": 1, - "ctx_name": "free1", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.214122325 - }, - { - "core_id": 0, - "ctx_name": "FROM_CPU0", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 30 - }, - "ts": 0.21413605 - }, - { - "core_id": 1, - "ctx_name": "free2", - "id": 4, - "in_irq": false, - "params": { - "tid": 12301764 - }, - "ts": 0.21414695 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.214157775 + "ts": 0.2158248 }, { "core_id": 1, @@ -19744,18 +21484,20 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 4294967295 }, - "ts": 0.214169625 + "ts": 0.215837075 }, { "core_id": 0, - "ctx_name": "alloc2", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.214180925 + "ctx_name": "FROM_CPU0", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 30 + }, + "ts": 0.215848525 }, { "core_id": 1, @@ -19765,10 +21507,18 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.21419255 + "ts": 0.2158606 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.21587165 }, { "core_id": 1, @@ -19778,10 +21528,18 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.21420895 + "ts": 0.215883675 + }, + { + "core_id": 0, + "ctx_name": "alloc2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.215894125 }, { "core_id": 1, @@ -19789,8 +21547,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (522) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb8a4\n", - "ts": 0.2142725 + "msg": "I (511) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb0b8\n", + "ts": 0.215944175 }, { "core_id": 1, @@ -19798,15 +21556,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (522) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb8a4\n", - "ts": 0.2142725 + "msg": "I (511) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb0b8\n", + "ts": 0.215944175 }, { - "addr": "0x3ffbb8a4", + "addr": "0x3ffbb0b8", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -19820,7 +21578,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.2142937 + "ts": 0.21596555 }, { "core_id": 1, @@ -19830,7 +21588,7 @@ "params": { "irq_num": 31 }, - "ts": 0.214324025 + "ts": 0.215992975 }, { "core_id": 1, @@ -19838,7 +21596,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2143355 + "ts": 0.216004375 }, { "core_id": 1, @@ -19846,7 +21604,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2143522 + "ts": 0.21602095 }, { "core_id": 1, @@ -19856,7 +21614,7 @@ "params": { "irq_num": 5 }, - "ts": 0.214666425 + "ts": 0.2164482 }, { "core_id": 1, @@ -19864,7 +21622,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.214679875 + "ts": 0.216461725 }, { "core_id": 1, @@ -19872,7 +21630,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.21469545 + "ts": 0.2164773 }, { "core_id": 0, @@ -19882,7 +21640,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2148338 + "ts": 0.21654665 }, { "core_id": 0, @@ -19890,7 +21648,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2148492 + "ts": 0.21656205 }, { "core_id": 0, @@ -19898,7 +21656,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.214864425 + "ts": 0.216577275 }, { "core_id": 1, @@ -19908,7 +21666,7 @@ "params": { "irq_num": 5 }, - "ts": 0.215666425 + "ts": 0.2174482 }, { "core_id": 1, @@ -19916,7 +21674,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.21567995 + "ts": 0.217461725 }, { "core_id": 1, @@ -19924,7 +21682,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2156951 + "ts": 0.217476975 }, { "core_id": 0, @@ -19934,7 +21692,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2158338 + "ts": 0.21754665 }, { "core_id": 0, @@ -19942,7 +21700,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.215849175 + "ts": 0.217562025 }, { "core_id": 0, @@ -19950,7 +21708,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.21586425 + "ts": 0.217577225 }, { "core_id": 1, @@ -19960,7 +21718,7 @@ "params": { "irq_num": 5 }, - "ts": 0.216666425 + "ts": 0.2184482 }, { "core_id": 1, @@ -19968,7 +21726,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.216680075 + "ts": 0.218461775 }, { "core_id": 1, @@ -19976,7 +21734,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.21669535 + "ts": 0.2184769 }, { "core_id": 0, @@ -19986,7 +21744,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2168338 + "ts": 0.21854665 }, { "core_id": 0, @@ -19994,7 +21752,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.216849175 + "ts": 0.218562 }, { "core_id": 0, @@ -20002,7 +21760,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.21686425 + "ts": 0.218577075 }, { "core_id": 1, @@ -20012,7 +21770,7 @@ "params": { "irq_num": 5 }, - "ts": 0.217666425 + "ts": 0.2194482 }, { "core_id": 1, @@ -20020,7 +21778,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.21768 + "ts": 0.219461725 }, { "core_id": 1, @@ -20028,7 +21786,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.217695125 + "ts": 0.21947685 }, { "core_id": 0, @@ -20038,7 +21796,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2178338 + "ts": 0.21954665 }, { "core_id": 0, @@ -20046,7 +21804,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.217849175 + "ts": 0.21956205 }, { "core_id": 0, @@ -20054,7 +21812,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.21786425 + "ts": 0.219577275 }, { "core_id": 1, @@ -20064,7 +21822,7 @@ "params": { "irq_num": 5 }, - "ts": 0.218666425 + "ts": 0.2204482 }, { "core_id": 1, @@ -20072,7 +21830,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.218680075 + "ts": 0.220461725 }, { "core_id": 1, @@ -20080,7 +21838,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.218695225 + "ts": 0.22047685 }, { "core_id": 0, @@ -20090,7 +21848,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2188338 + "ts": 0.22054665 }, { "core_id": 0, @@ -20098,7 +21856,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2188492 + "ts": 0.220562 }, { "core_id": 0, @@ -20106,7 +21864,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.218864425 + "ts": 0.220577075 }, { "core_id": 1, @@ -20116,7 +21874,7 @@ "params": { "irq_num": 5 }, - "ts": 0.219666425 + "ts": 0.2214482 }, { "core_id": 1, @@ -20124,7 +21882,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.21967995 + "ts": 0.221461725 }, { "core_id": 1, @@ -20132,7 +21890,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2196951 + "ts": 0.221476975 }, { "core_id": 0, @@ -20142,7 +21900,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2198338 + "ts": 0.22154665 }, { "core_id": 0, @@ -20150,7 +21908,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.219849175 + "ts": 0.221562025 }, { "core_id": 0, @@ -20158,7 +21916,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.21986425 + "ts": 0.221577225 }, { "core_id": 1, @@ -20168,7 +21926,7 @@ "params": { "irq_num": 5 }, - "ts": 0.220666425 + "ts": 0.2224482 }, { "core_id": 1, @@ -20176,7 +21934,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.220680075 + "ts": 0.222461775 }, { "core_id": 1, @@ -20184,7 +21942,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.22069535 + "ts": 0.2224769 }, { "core_id": 0, @@ -20194,7 +21952,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2208338 + "ts": 0.22254665 }, { "core_id": 0, @@ -20202,7 +21960,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.220849175 + "ts": 0.222562 }, { "core_id": 0, @@ -20210,7 +21968,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.22086425 + "ts": 0.222577075 }, { "core_id": 1, @@ -20220,7 +21978,7 @@ "params": { "irq_num": 5 }, - "ts": 0.221666425 + "ts": 0.2234482 }, { "core_id": 1, @@ -20228,7 +21986,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.22168 + "ts": 0.223461725 }, { "core_id": 1, @@ -20236,7 +21994,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.221695125 + "ts": 0.22347685 }, { "core_id": 0, @@ -20246,7 +22004,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2218338 + "ts": 0.22354665 }, { "core_id": 0, @@ -20254,7 +22012,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.221849175 + "ts": 0.22356205 }, { "core_id": 0, @@ -20262,7 +22020,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.22186425 + "ts": 0.223577275 }, { "core_id": 1, @@ -20272,7 +22030,7 @@ "params": { "irq_num": 5 }, - "ts": 0.222666425 + "ts": 0.2244482 }, { "core_id": 1, @@ -20280,7 +22038,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.222680075 + "ts": 0.224461725 }, { "core_id": 1, @@ -20288,7 +22046,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.222695225 + "ts": 0.22447685 }, { "core_id": 0, @@ -20298,7 +22056,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2228338 + "ts": 0.22454665 }, { "core_id": 0, @@ -20306,7 +22064,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2228492 + "ts": 0.224562 }, { "core_id": 0, @@ -20314,7 +22072,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.222864425 + "ts": 0.224577075 }, { "core_id": 1, @@ -20324,7 +22082,7 @@ "params": { "irq_num": 5 }, - "ts": 0.223666425 + "ts": 0.2254482 }, { "core_id": 1, @@ -20332,7 +22090,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.22367995 + "ts": 0.225461725 }, { "core_id": 1, @@ -20340,7 +22098,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2236951 + "ts": 0.225476975 }, { "core_id": 0, @@ -20350,7 +22108,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2238338 + "ts": 0.22554665 }, { "core_id": 0, @@ -20358,7 +22116,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.223849175 + "ts": 0.225562025 }, { "core_id": 0, @@ -20366,7 +22124,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.22386425 + "ts": 0.225577225 }, { "core_id": 1, @@ -20376,7 +22134,7 @@ "params": { "irq_num": 5 }, - "ts": 0.224666425 + "ts": 0.2264482 }, { "core_id": 1, @@ -20384,7 +22142,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2246842 + "ts": 0.226461775 }, { "core_id": 1, @@ -20392,7 +22150,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.22469935 + "ts": 0.2264769 }, { "core_id": 0, @@ -20402,7 +22160,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2248338 + "ts": 0.22654665 }, { "core_id": 0, @@ -20410,7 +22168,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.224849175 + "ts": 0.226562 }, { "core_id": 0, @@ -20418,7 +22176,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.22486425 + "ts": 0.226577075 }, { "core_id": 1, @@ -20428,7 +22186,7 @@ "params": { "irq_num": 5 }, - "ts": 0.225666425 + "ts": 0.2274482 }, { "core_id": 1, @@ -20436,7 +22194,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.225680075 + "ts": 0.227461725 }, { "core_id": 1, @@ -20444,7 +22202,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.225695225 + "ts": 0.22747685 }, { "core_id": 0, @@ -20454,7 +22212,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2258338 + "ts": 0.22754665 }, { "core_id": 0, @@ -20462,7 +22220,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2258492 + "ts": 0.22756205 }, { "core_id": 0, @@ -20470,7 +22228,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.225864425 + "ts": 0.227577275 }, { "core_id": 1, @@ -20480,7 +22238,7 @@ "params": { "irq_num": 5 }, - "ts": 0.226666425 + "ts": 0.2284482 }, { "core_id": 1, @@ -20488,7 +22246,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.22667995 + "ts": 0.228461725 }, { "core_id": 1, @@ -20496,7 +22254,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2266951 + "ts": 0.22847685 }, { "core_id": 0, @@ -20506,7 +22264,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2268338 + "ts": 0.22854665 }, { "core_id": 0, @@ -20514,7 +22272,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.226849175 + "ts": 0.228562 }, { "core_id": 0, @@ -20522,7 +22280,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.22686425 + "ts": 0.228577075 }, { "core_id": 1, @@ -20532,7 +22290,7 @@ "params": { "irq_num": 5 }, - "ts": 0.227666425 + "ts": 0.2294482 }, { "core_id": 1, @@ -20540,7 +22298,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.227680075 + "ts": 0.229466 }, { "core_id": 1, @@ -20548,7 +22306,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.22769535 + "ts": 0.229481125 }, { "core_id": 0, @@ -20558,7 +22316,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2278338 + "ts": 0.22954665 }, { "core_id": 0, @@ -20566,7 +22324,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.227849175 + "ts": 0.229562 }, { "core_id": 0, @@ -20574,7 +22332,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.22786425 + "ts": 0.229577075 }, { "core_id": 1, @@ -20584,7 +22342,7 @@ "params": { "irq_num": 5 }, - "ts": 0.228666425 + "ts": 0.2304482 }, { "core_id": 1, @@ -20592,7 +22350,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.22868 + "ts": 0.230461725 }, { "core_id": 1, @@ -20600,7 +22358,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.228695125 + "ts": 0.23047685 }, { "core_id": 0, @@ -20610,7 +22368,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2288338 + "ts": 0.23054665 }, { "core_id": 0, @@ -20618,7 +22376,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.228849175 + "ts": 0.23056205 }, { "core_id": 0, @@ -20626,7 +22384,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.22886425 + "ts": 0.230577275 }, { "core_id": 1, @@ -20636,7 +22394,7 @@ "params": { "irq_num": 5 }, - "ts": 0.229666425 + "ts": 0.2314482 }, { "core_id": 1, @@ -20644,7 +22402,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.229680075 + "ts": 0.231461725 }, { "core_id": 1, @@ -20652,7 +22410,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.229695225 + "ts": 0.23147685 }, { "core_id": 0, @@ -20662,7 +22420,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2298338 + "ts": 0.23154665 }, { "core_id": 0, @@ -20670,7 +22428,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2298492 + "ts": 0.231562 }, { "core_id": 0, @@ -20678,7 +22436,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.229864425 + "ts": 0.231577075 }, { "core_id": 1, @@ -20688,7 +22446,7 @@ "params": { "irq_num": 5 }, - "ts": 0.230666425 + "ts": 0.2324482 }, { "core_id": 1, @@ -20696,7 +22454,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.23067995 + "ts": 0.232461725 }, { "core_id": 1, @@ -20704,7 +22462,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2306951 + "ts": 0.232476975 }, { "core_id": 0, @@ -20714,7 +22472,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2308338 + "ts": 0.23254665 }, { "core_id": 0, @@ -20722,7 +22480,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.230849175 + "ts": 0.232562025 }, { "core_id": 0, @@ -20730,7 +22488,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.23086425 + "ts": 0.232577225 }, { "core_id": 1, @@ -20740,7 +22498,7 @@ "params": { "irq_num": 5 }, - "ts": 0.231666425 + "ts": 0.2334482 }, { "core_id": 1, @@ -20748,7 +22506,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.231680075 + "ts": 0.233461775 }, { "core_id": 1, @@ -20756,7 +22514,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.23169535 + "ts": 0.2334769 }, { "core_id": 0, @@ -20766,7 +22524,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2318338 + "ts": 0.23354665 }, { "core_id": 0, @@ -20774,7 +22532,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.231849175 + "ts": 0.233562 }, { "core_id": 0, @@ -20782,7 +22540,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.23186425 + "ts": 0.233577075 }, { "core_id": 1, @@ -20792,7 +22550,7 @@ "params": { "irq_num": 5 }, - "ts": 0.232666425 + "ts": 0.2344482 }, { "core_id": 1, @@ -20800,7 +22558,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.23268 + "ts": 0.234461725 }, { "core_id": 1, @@ -20808,7 +22566,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.232695125 + "ts": 0.23447685 }, { "core_id": 0, @@ -20818,7 +22576,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2328338 + "ts": 0.23454665 }, { "core_id": 0, @@ -20826,7 +22584,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.232849175 + "ts": 0.23456205 }, { "core_id": 0, @@ -20834,7 +22592,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.23286425 + "ts": 0.234577275 }, { "core_id": 1, @@ -20844,7 +22602,7 @@ "params": { "irq_num": 5 }, - "ts": 0.233666425 + "ts": 0.2354482 }, { "core_id": 1, @@ -20852,7 +22610,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.233680075 + "ts": 0.235461725 }, { "core_id": 1, @@ -20860,7 +22618,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.233695225 + "ts": 0.23547685 }, { "core_id": 0, @@ -20870,7 +22628,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2338338 + "ts": 0.23554665 }, { "core_id": 0, @@ -20878,7 +22636,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2338492 + "ts": 0.235562 }, { "core_id": 0, @@ -20886,7 +22644,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.233864425 + "ts": 0.235577075 }, { "core_id": 1, @@ -20896,7 +22654,7 @@ "params": { "irq_num": 5 }, - "ts": 0.234666425 + "ts": 0.2364482 }, { "core_id": 1, @@ -20904,7 +22662,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.23467995 + "ts": 0.236461725 }, { "core_id": 1, @@ -20912,7 +22670,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2346951 + "ts": 0.236476975 }, { "core_id": 0, @@ -20922,7 +22680,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2348338 + "ts": 0.23654665 }, { "core_id": 0, @@ -20930,7 +22688,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.234849175 + "ts": 0.236562025 }, { "core_id": 0, @@ -20938,7 +22696,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.23486425 + "ts": 0.236577225 }, { "core_id": 1, @@ -20948,7 +22706,7 @@ "params": { "irq_num": 5 }, - "ts": 0.235666425 + "ts": 0.2374482 }, { "core_id": 1, @@ -20956,7 +22714,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.235680075 + "ts": 0.237461775 }, { "core_id": 1, @@ -20964,7 +22722,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.23569535 + "ts": 0.2374769 }, { "core_id": 0, @@ -20974,7 +22732,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2358338 + "ts": 0.23754665 }, { "core_id": 0, @@ -20982,7 +22740,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.235849175 + "ts": 0.237562 }, { "core_id": 0, @@ -20990,7 +22748,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.23586425 + "ts": 0.237577075 }, { "core_id": 1, @@ -21000,7 +22758,7 @@ "params": { "irq_num": 5 }, - "ts": 0.236666425 + "ts": 0.2384482 }, { "core_id": 1, @@ -21008,7 +22766,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.23668355 + "ts": 0.238461725 }, { "core_id": 1, @@ -21016,7 +22774,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.236698675 + "ts": 0.23847685 }, { "core_id": 0, @@ -21026,7 +22784,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2368338 + "ts": 0.23854665 }, { "core_id": 0, @@ -21034,7 +22792,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.236849175 + "ts": 0.23856205 }, { "core_id": 0, @@ -21042,7 +22800,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.23686425 + "ts": 0.238577275 }, { "core_id": 1, @@ -21052,7 +22810,7 @@ "params": { "irq_num": 5 }, - "ts": 0.237666425 + "ts": 0.2394482 }, { "core_id": 1, @@ -21060,7 +22818,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.237680075 + "ts": 0.239461725 }, { "core_id": 1, @@ -21068,7 +22826,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.237695225 + "ts": 0.23947685 }, { "core_id": 0, @@ -21078,7 +22836,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2378338 + "ts": 0.23954665 }, { "core_id": 0, @@ -21086,7 +22844,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2378492 + "ts": 0.239562 }, { "core_id": 0, @@ -21094,7 +22852,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.237864425 + "ts": 0.239577075 }, { "core_id": 1, @@ -21104,7 +22862,7 @@ "params": { "irq_num": 5 }, - "ts": 0.238666425 + "ts": 0.2404482 }, { "core_id": 1, @@ -21112,7 +22870,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.23867995 + "ts": 0.240461725 }, { "core_id": 1, @@ -21120,7 +22878,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2386951 + "ts": 0.240476975 }, { "core_id": 0, @@ -21130,7 +22888,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2388338 + "ts": 0.24054665 }, { "core_id": 0, @@ -21138,7 +22896,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.238849175 + "ts": 0.240562025 }, { "core_id": 0, @@ -21146,7 +22904,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.23886425 + "ts": 0.240577225 }, { "core_id": 1, @@ -21156,7 +22914,7 @@ "params": { "irq_num": 5 }, - "ts": 0.239666425 + "ts": 0.2414482 }, { "core_id": 1, @@ -21164,7 +22922,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.239680075 + "ts": 0.2414653 }, { "core_id": 1, @@ -21172,7 +22930,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.23969535 + "ts": 0.24148045 }, { "core_id": 0, @@ -21182,7 +22940,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2398338 + "ts": 0.24154665 }, { "core_id": 0, @@ -21190,7 +22948,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.239849175 + "ts": 0.241562 }, { "core_id": 0, @@ -21198,7 +22956,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.23986425 + "ts": 0.241577075 }, { "core_id": 1, @@ -21208,7 +22966,7 @@ "params": { "irq_num": 5 }, - "ts": 0.240666425 + "ts": 0.2424482 }, { "core_id": 1, @@ -21216,7 +22974,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.24068 + "ts": 0.242461725 }, { "core_id": 1, @@ -21224,7 +22982,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.240695125 + "ts": 0.24247685 }, { "core_id": 0, @@ -21234,59 +22992,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2408338 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.240849175 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.24086425 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.241666425 - }, - { - "core_id": 1, - "ctx_name": "free2", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.241680075 - }, - { - "core_id": 1, - "ctx_name": "free2", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.241695225 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.2418338 + "ts": 0.24254665 }, { "core_id": 0, @@ -21294,9 +23000,19 @@ "id": 6, "in_irq": true, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.241848825 + "ts": 0.242561675 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12284596 + }, + "ts": 0.242561675 }, { "core_id": 0, @@ -21304,7 +23020,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.241861575 + "ts": 0.242574275 }, { "core_id": 0, @@ -21312,18 +23028,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.24187725 + "ts": 0.242589925 }, { - "addr": "0x3ffbb8a4", + "addr": "0x3ffbb038", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -21335,16 +23051,16 @@ "id": 512, "in_irq": false, "size": 9, - "ts": 0.241912575 + "ts": 0.2426249 }, { - "addr": "0x3ffbb8b4", + "addr": "0x3ffbb078", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -21356,7 +23072,7 @@ "id": 512, "in_irq": false, "size": 18, - "ts": 0.241947 + "ts": 0.24265915 }, { "core_id": 0, @@ -21366,10 +23082,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.241964025 + "ts": 0.2426762 }, { "core_id": 0, @@ -21379,10 +23095,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.241980025 + "ts": 0.242692225 }, { "core_id": 0, @@ -21390,8 +23106,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (550) example: Task[0x3ffb7aec]: allocated 18 bytes @ 0x3ffbb8b4\n", - "ts": 0.24205045 + "msg": "I (538) example: Task[0x3ffb72b4]: allocated 18 bytes @ 0x3ffbb078\n", + "ts": 0.24274705 }, { "core_id": 0, @@ -21399,8 +23115,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (550) example: Task[0x3ffb7aec]: allocated 18 bytes @ 0x3ffbb8b4\n", - "ts": 0.24205045 + "msg": "I (538) example: Task[0x3ffb72b4]: allocated 18 bytes @ 0x3ffbb078\n", + "ts": 0.24274705 }, { "core_id": 0, @@ -21410,10 +23126,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 0 }, - "ts": 0.242068275 + "ts": 0.242760425 }, { "core_id": 0, @@ -21421,9 +23137,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.2420815 + "ts": 0.242773825 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12287644 + }, + "ts": 0.242773825 }, { "core_id": 1, @@ -21433,7 +23159,7 @@ "params": { "irq_num": 31 }, - "ts": 0.242097725 + "ts": 0.24279 }, { "core_id": 0, @@ -21443,7 +23169,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.2421086 + "ts": 0.2428059 }, { "core_id": 1, @@ -21451,7 +23177,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.24211935 + "ts": 0.2428166 }, { "core_id": 0, @@ -21461,7 +23187,7 @@ "params": { "irq_num": 30 }, - "ts": 0.2421332 + "ts": 0.242830325 }, { "core_id": 1, @@ -21469,9 +23195,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12289748 + "tid": 12287644 }, - "ts": 0.242144075 + "ts": 0.2428411 }, { "core_id": 0, @@ -21479,7 +23205,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2421549 + "ts": 0.24285185 }, { "core_id": 1, @@ -21489,10 +23215,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12287056, + "xQueue": 12284952, "xTicksToWait": 4294967295 }, - "ts": 0.242166875 + "ts": 0.2428641 }, { "core_id": 0, @@ -21500,7 +23226,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.242177125 + "ts": 0.24287535 }, { "core_id": 1, @@ -21510,10 +23236,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.242188525 + "ts": 0.2428926 }, { "core_id": 1, @@ -21523,10 +23249,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.2422049 + "ts": 0.24290885 }, { "core_id": 1, @@ -21534,8 +23260,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (550) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb8b4\n", - "ts": 0.24226845 + "msg": "I (538) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb078\n", + "ts": 0.242956725 }, { "core_id": 1, @@ -21543,15 +23269,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (550) example: Task[0x3ffb86d4]: free memory @ 0x3ffbb8b4\n", - "ts": 0.24226845 + "msg": "I (538) example: Task[0x3ffb7e9c]: free memory @ 0x3ffbb078\n", + "ts": 0.242956725 }, { - "addr": "0x3ffbb8b4", + "addr": "0x3ffbb078", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -21565,7 +23291,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.24228965 + "ts": 0.242978125 }, { "core_id": 1, @@ -21575,7 +23301,7 @@ "params": { "irq_num": 31 }, - "ts": 0.24232065 + "ts": 0.2430046 }, { "core_id": 1, @@ -21583,7 +23309,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.242332125 + "ts": 0.243016 }, { "core_id": 1, @@ -21591,7 +23317,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.242348825 + "ts": 0.243032575 }, { "core_id": 1, @@ -21601,7 +23327,7 @@ "params": { "irq_num": 5 }, - "ts": 0.242666425 + "ts": 0.2434482 }, { "core_id": 1, @@ -21609,7 +23335,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.242679875 + "ts": 0.243461725 }, { "core_id": 1, @@ -21617,7 +23343,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.24269545 + "ts": 0.243477425 }, { "core_id": 0, @@ -21627,7 +23353,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2428338 + "ts": 0.24354665 }, { "core_id": 0, @@ -21635,9 +23361,19 @@ "id": 6, "in_irq": true, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.242848825 + "ts": 0.243561625 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12290612 + }, + "ts": 0.243561625 }, { "core_id": 0, @@ -21645,7 +23381,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.242861575 + "ts": 0.243574225 }, { "core_id": 0, @@ -21653,18 +23389,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.24287725 + "ts": 0.243589875 }, { - "addr": "0x3ffbb8b4", + "addr": "0x3ffbb078", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -21676,16 +23412,16 @@ "id": 512, "in_irq": false, "size": 18, - "ts": 0.242912575 + "ts": 0.24362505 }, { - "addr": "0x3ffbb8cc", + "addr": "0x3ffbb0b8", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -21697,7 +23433,7 @@ "id": 512, "in_irq": false, "size": 36, - "ts": 0.24294715 + "ts": 0.24366465 }, { "core_id": 0, @@ -21707,10 +23443,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.242964175 + "ts": 0.2436816 }, { "core_id": 0, @@ -21720,10 +23456,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.242980175 + "ts": 0.243697725 }, { "core_id": 0, @@ -21731,8 +23467,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (551) example: Task[0x3ffb926c]: allocated 36 bytes @ 0x3ffbb8cc\n", - "ts": 0.2430506 + "msg": "I (539) example: Task[0x3ffb8a34]: allocated 36 bytes @ 0x3ffbb0b8\n", + "ts": 0.24375245 }, { "core_id": 0, @@ -21740,8 +23476,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (551) example: Task[0x3ffb926c]: allocated 36 bytes @ 0x3ffbb8cc\n", - "ts": 0.2430506 + "msg": "I (539) example: Task[0x3ffb8a34]: allocated 36 bytes @ 0x3ffbb0b8\n", + "ts": 0.24375245 }, { "core_id": 0, @@ -21751,10 +23487,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 0 }, - "ts": 0.24306415 + "ts": 0.2437659 }, { "core_id": 0, @@ -21762,9 +23498,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.243080975 + "ts": 0.24377915 + }, + { + "core_id": 1, + "ctx_name": "free0", + "id": 6, + "in_irq": false, + "params": { + "tid": 12293660 + }, + "ts": 0.24377915 }, { "core_id": 1, @@ -21774,7 +23520,7 @@ "params": { "irq_num": 31 }, - "ts": 0.243097275 + "ts": 0.2437955 }, { "core_id": 0, @@ -21784,7 +23530,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.243108125 + "ts": 0.24380635 }, { "core_id": 1, @@ -21792,7 +23538,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.243118875 + "ts": 0.243817175 }, { "core_id": 0, @@ -21802,7 +23548,7 @@ "params": { "irq_num": 30 }, - "ts": 0.2431326 + "ts": 0.243830875 }, { "core_id": 1, @@ -21810,9 +23556,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12295764 + "tid": 12293660 }, - "ts": 0.24314345 + "ts": 0.24384175 }, { "core_id": 0, @@ -21820,7 +23566,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.243154275 + "ts": 0.243852625 }, { "core_id": 1, @@ -21830,10 +23576,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12293072, + "xQueue": 12290968, "xTicksToWait": 4294967295 }, - "ts": 0.24316615 + "ts": 0.243864575 }, { "core_id": 0, @@ -21841,7 +23587,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2431764 + "ts": 0.2438758 }, { "core_id": 1, @@ -21851,10 +23597,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.243187875 + "ts": 0.2438876 }, { "core_id": 1, @@ -21864,10 +23610,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.243204375 + "ts": 0.243908225 }, { "core_id": 1, @@ -21875,8 +23621,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (551) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb8cc\n", - "ts": 0.243267825 + "msg": "I (539) example: Task[0x3ffb961c]: free memory @ 0x3ffbb0b8\n", + "ts": 0.2439561 }, { "core_id": 1, @@ -21884,15 +23630,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (551) example: Task[0x3ffb9e54]: free memory @ 0x3ffbb8cc\n", - "ts": 0.243267825 + "msg": "I (539) example: Task[0x3ffb961c]: free memory @ 0x3ffbb0b8\n", + "ts": 0.2439561 }, { - "addr": "0x3ffbb8cc", + "addr": "0x3ffbb0b8", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -21906,7 +23652,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.243288975 + "ts": 0.243977525 }, { "core_id": 1, @@ -21916,7 +23662,7 @@ "params": { "irq_num": 31 }, - "ts": 0.243315975 + "ts": 0.244004825 }, { "core_id": 1, @@ -21924,7 +23670,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2433274 + "ts": 0.244016225 }, { "core_id": 1, @@ -21932,7 +23678,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.243343975 + "ts": 0.2440328 }, { "core_id": 1, @@ -21942,7 +23688,7 @@ "params": { "irq_num": 5 }, - "ts": 0.243666425 + "ts": 0.2444482 }, { "core_id": 1, @@ -21950,7 +23696,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.24367985 + "ts": 0.244461725 }, { "core_id": 1, @@ -21958,7 +23704,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.24369555 + "ts": 0.244477425 }, { "core_id": 0, @@ -21968,17 +23714,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2438338 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 6, - "in_irq": true, - "params": { - "tid": 12298716 - }, - "ts": 0.2438488 + "ts": 0.24454665 }, { "core_id": 0, @@ -21986,7 +23722,79 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.243861575 + "ts": 0.244562025 + }, + { + "core_id": 0, + "ctx_name": "alloc1", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.244577225 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.2454482 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.245461775 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.2454769 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.24554665 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 6, + "in_irq": true, + "params": { + "tid": 12296612 + }, + "ts": 0.245561625 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.245561625 + }, + { + "core_id": 0, + "ctx_name": "alloc1", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.245574275 }, { "core_id": 0, @@ -21994,18 +23802,18 @@ "id": 4, "in_irq": false, "params": { - "tid": 12298716 + "tid": 12296612 }, - "ts": 0.24387725 + "ts": 0.24558995 }, { - "addr": "0x3ffbb8cc", + "addr": "0x3ffbb0b8", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6af3", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bb4", + "0x400880dc", "0x0", "0x0", "0x0", @@ -22017,16 +23825,16 @@ "id": 512, "in_irq": false, "size": 27, - "ts": 0.24391265 + "ts": 0.245626225 }, { - "addr": "0x3ffbb8ec", + "addr": "0x3ffbb0d8", "callers": [ - "0x40081fef", - "0x40082024", - "0x4008e668", - "0x400d6afa", - "0x40088d94", + "0x40081eff", + "0x40081f34", + "0x4008da18", + "0x400d3bbb", + "0x400880dc", "0x0", "0x0", "0x0", @@ -22038,7 +23846,7 @@ "id": 512, "in_irq": false, "size": 54, - "ts": 0.243951325 + "ts": 0.245661825 }, { "core_id": 0, @@ -22048,10 +23856,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.24396835 + "ts": 0.24568225 }, { "core_id": 0, @@ -22061,10 +23869,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.24398435 + "ts": 0.245698175 }, { "core_id": 0, @@ -22072,8 +23880,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (552) example: Task[0x3ffba9dc]: allocated 54 bytes @ 0x3ffbb8ec\n", - "ts": 0.244054675 + "msg": "I (541) example: Task[0x3ffba1a4]: allocated 54 bytes @ 0x3ffbb0d8\n", + "ts": 0.24575295 }, { "core_id": 0, @@ -22081,8 +23889,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (552) example: Task[0x3ffba9dc]: allocated 54 bytes @ 0x3ffbb8ec\n", - "ts": 0.244054675 + "msg": "I (541) example: Task[0x3ffba1a4]: allocated 54 bytes @ 0x3ffbb0d8\n", + "ts": 0.24575295 }, { "core_id": 0, @@ -22092,10 +23900,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 0 }, - "ts": 0.2440684 + "ts": 0.24576645 }, { "core_id": 0, @@ -22103,9 +23911,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.244081625 + "ts": 0.2457796 + }, + { + "core_id": 1, + "ctx_name": "free1", + "id": 6, + "in_irq": false, + "params": { + "tid": 12299660 + }, + "ts": 0.2457796 }, { "core_id": 1, @@ -22115,7 +23933,7 @@ "params": { "irq_num": 31 }, - "ts": 0.24409795 + "ts": 0.245795925 }, { "core_id": 0, @@ -22125,7 +23943,7 @@ "params": { "xTicksToDelay": 30 }, - "ts": 0.2441088 + "ts": 0.245806775 }, { "core_id": 1, @@ -22133,7 +23951,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.24411955 + "ts": 0.245817575 }, { "core_id": 0, @@ -22143,7 +23961,7 @@ "params": { "irq_num": 30 }, - "ts": 0.244133275 + "ts": 0.245831475 }, { "core_id": 1, @@ -22151,9 +23969,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12301764 + "tid": 12299660 }, - "ts": 0.244144175 + "ts": 0.245842275 }, { "core_id": 0, @@ -22161,7 +23979,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.244155 + "ts": 0.245853025 }, { "core_id": 1, @@ -22171,10 +23989,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 1, - "xQueue": 12299072, + "xQueue": 12296968, "xTicksToWait": 4294967295 }, - "ts": 0.24416685 + "ts": 0.245865475 }, { "core_id": 0, @@ -22182,7 +24000,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.24417815 + "ts": 0.24587655 }, { "core_id": 1, @@ -22192,10 +24010,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.244189775 + "ts": 0.245888475 }, { "core_id": 1, @@ -22205,10 +24023,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.244210225 + "ts": 0.245904775 }, { "core_id": 1, @@ -22216,8 +24034,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (552) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb8ec\n", - "ts": 0.2442739 + "msg": "I (541) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb0d8\n", + "ts": 0.24595265 }, { "core_id": 1, @@ -22225,15 +24043,15 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (552) example: Task[0x3ffbb5c4]: free memory @ 0x3ffbb8ec\n", - "ts": 0.2442739 + "msg": "I (541) example: Task[0x3ffbad8c]: free memory @ 0x3ffbb0d8\n", + "ts": 0.24595265 }, { - "addr": "0x3ffbb8ec", + "addr": "0x3ffbb0d8", "callers": [ - "0x4008e674", - "0x400d6bb2", - "0x40088d94", + "0x4008da24", + "0x400d3c72", + "0x400880dc", "0x0", "0x0", "0x0", @@ -22247,7 +24065,7 @@ "id": 513, "in_irq": false, "size": 0, - "ts": 0.2442951 + "ts": 0.245978075 }, { "core_id": 1, @@ -22257,7 +24075,7 @@ "params": { "irq_num": 31 }, - "ts": 0.244322 + "ts": 0.246005475 }, { "core_id": 1, @@ -22265,7 +24083,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.244333425 + "ts": 0.2460169 }, { "core_id": 1, @@ -22273,7 +24091,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.24435 + "ts": 0.24603345 }, { "core_id": 1, @@ -22283,7 +24101,7 @@ "params": { "irq_num": 5 }, - "ts": 0.244666425 + "ts": 0.2464482 }, { "core_id": 1, @@ -22291,7 +24109,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.24467985 + "ts": 0.246461725 }, { "core_id": 1, @@ -22299,7 +24117,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.24469555 + "ts": 0.2464773 }, { "core_id": 0, @@ -22309,7 +24127,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2448338 + "ts": 0.24654665 }, { "core_id": 0, @@ -22317,7 +24135,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.244849175 + "ts": 0.24656205 }, { "core_id": 0, @@ -22325,7 +24143,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.24486425 + "ts": 0.246577275 }, { "core_id": 1, @@ -22335,7 +24153,7 @@ "params": { "irq_num": 5 }, - "ts": 0.245666425 + "ts": 0.2474482 }, { "core_id": 1, @@ -22343,7 +24161,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.245680075 + "ts": 0.247461725 }, { "core_id": 1, @@ -22351,7 +24169,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.24569535 + "ts": 0.24747685 }, { "core_id": 0, @@ -22361,7 +24179,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2458338 + "ts": 0.24754665 }, { "core_id": 0, @@ -22369,7 +24187,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.245849175 + "ts": 0.247562 }, { "core_id": 0, @@ -22377,7 +24195,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.24586425 + "ts": 0.247577075 }, { "core_id": 1, @@ -22387,7 +24205,7 @@ "params": { "irq_num": 5 }, - "ts": 0.246666425 + "ts": 0.2484482 }, { "core_id": 1, @@ -22395,7 +24213,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.24668 + "ts": 0.248461725 }, { "core_id": 1, @@ -22403,7 +24221,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.246695125 + "ts": 0.248476975 }, { "core_id": 0, @@ -22413,7 +24231,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2468338 + "ts": 0.24854665 }, { "core_id": 0, @@ -22421,7 +24239,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.246849175 + "ts": 0.248562025 }, { "core_id": 0, @@ -22429,7 +24247,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.24686425 + "ts": 0.248577225 }, { "core_id": 1, @@ -22439,7 +24257,7 @@ "params": { "irq_num": 5 }, - "ts": 0.247666425 + "ts": 0.2494482 }, { "core_id": 1, @@ -22447,7 +24265,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.247680075 + "ts": 0.249461775 }, { "core_id": 1, @@ -22455,7 +24273,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.247695225 + "ts": 0.2494769 }, { "core_id": 0, @@ -22465,7 +24283,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2478338 + "ts": 0.24954665 }, { "core_id": 0, @@ -22473,7 +24291,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2478492 + "ts": 0.249562 }, { "core_id": 0, @@ -22481,7 +24299,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.247864425 + "ts": 0.249577075 }, { "core_id": 1, @@ -22491,7 +24309,7 @@ "params": { "irq_num": 5 }, - "ts": 0.248666425 + "ts": 0.2504482 }, { "core_id": 1, @@ -22499,7 +24317,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.24867995 + "ts": 0.250461725 }, { "core_id": 1, @@ -22507,7 +24325,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2486951 + "ts": 0.25047685 }, { "core_id": 0, @@ -22517,7 +24335,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2488338 + "ts": 0.25054665 }, { "core_id": 0, @@ -22525,7 +24343,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.248849175 + "ts": 0.25056205 }, { "core_id": 0, @@ -22533,7 +24351,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.24886425 + "ts": 0.250577275 }, { "core_id": 1, @@ -22543,7 +24361,7 @@ "params": { "irq_num": 5 }, - "ts": 0.249666425 + "ts": 0.2514482 }, { "core_id": 1, @@ -22551,7 +24369,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.249680075 + "ts": 0.251461725 }, { "core_id": 1, @@ -22559,7 +24377,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.24969535 + "ts": 0.25147685 }, { "core_id": 0, @@ -22569,7 +24387,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2498338 + "ts": 0.25154665 }, { "core_id": 0, @@ -22577,7 +24395,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.249849175 + "ts": 0.251562 }, { "core_id": 0, @@ -22585,7 +24403,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.249868675 + "ts": 0.251577075 }, { "core_id": 1, @@ -22595,7 +24413,7 @@ "params": { "irq_num": 5 }, - "ts": 0.250666425 + "ts": 0.2524482 }, { "core_id": 1, @@ -22603,7 +24421,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.25067995 + "ts": 0.252461725 }, { "core_id": 1, @@ -22611,7 +24429,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2506951 + "ts": 0.252476975 }, { "core_id": 0, @@ -22621,7 +24439,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2508338 + "ts": 0.25254665 }, { "core_id": 0, @@ -22629,7 +24447,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.250849175 + "ts": 0.252562025 }, { "core_id": 0, @@ -22637,7 +24455,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.25086425 + "ts": 0.252577225 }, { "core_id": 1, @@ -22647,7 +24465,7 @@ "params": { "irq_num": 5 }, - "ts": 0.251666425 + "ts": 0.2534482 }, { "core_id": 1, @@ -22655,7 +24473,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.251680075 + "ts": 0.253461725 }, { "core_id": 1, @@ -22663,7 +24481,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.25169535 + "ts": 0.253476975 }, { "core_id": 0, @@ -22673,7 +24491,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2518338 + "ts": 0.25354665 }, { "core_id": 0, @@ -22681,7 +24499,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.251849175 + "ts": 0.253562025 }, { "core_id": 0, @@ -22689,7 +24507,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.25186425 + "ts": 0.253577225 }, { "core_id": 1, @@ -22699,7 +24517,7 @@ "params": { "irq_num": 5 }, - "ts": 0.252666425 + "ts": 0.2544482 }, { "core_id": 1, @@ -22707,7 +24525,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.25268 + "ts": 0.254461775 }, { "core_id": 1, @@ -22715,7 +24533,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.252695125 + "ts": 0.2544769 }, { "core_id": 0, @@ -22725,7 +24543,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2528338 + "ts": 0.25454665 }, { "core_id": 0, @@ -22733,7 +24551,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.252849175 + "ts": 0.254562 }, { "core_id": 0, @@ -22741,7 +24559,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.25286425 + "ts": 0.254577075 }, { "core_id": 1, @@ -22751,7 +24569,7 @@ "params": { "irq_num": 5 }, - "ts": 0.253666425 + "ts": 0.2554482 }, { "core_id": 1, @@ -22759,7 +24577,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.253680075 + "ts": 0.255461725 }, { "core_id": 1, @@ -22767,7 +24585,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.253695225 + "ts": 0.25547685 }, { "core_id": 0, @@ -22777,7 +24595,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2538338 + "ts": 0.25554665 }, { "core_id": 0, @@ -22785,7 +24603,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2538492 + "ts": 0.25556205 }, { "core_id": 0, @@ -22793,7 +24611,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.253864425 + "ts": 0.255577275 }, { "core_id": 1, @@ -22803,7 +24621,7 @@ "params": { "irq_num": 5 }, - "ts": 0.254666425 + "ts": 0.2564482 }, { "core_id": 1, @@ -22811,7 +24629,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.25467995 + "ts": 0.256461725 }, { "core_id": 1, @@ -22819,7 +24637,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2546951 + "ts": 0.25647685 }, { "core_id": 0, @@ -22829,7 +24647,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2548338 + "ts": 0.25654665 }, { "core_id": 0, @@ -22837,7 +24655,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.254849175 + "ts": 0.256562 }, { "core_id": 0, @@ -22845,7 +24663,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.25486425 + "ts": 0.256577075 }, { "core_id": 1, @@ -22855,7 +24673,7 @@ "params": { "irq_num": 5 }, - "ts": 0.255666425 + "ts": 0.2574482 }, { "core_id": 1, @@ -22863,7 +24681,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.255680075 + "ts": 0.257461725 }, { "core_id": 1, @@ -22871,7 +24689,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.25569535 + "ts": 0.257476975 }, { "core_id": 0, @@ -22881,7 +24699,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2558338 + "ts": 0.25754665 }, { "core_id": 0, @@ -22889,7 +24707,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.255849175 + "ts": 0.257562025 }, { "core_id": 0, @@ -22897,7 +24715,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.25586425 + "ts": 0.257577225 }, { "core_id": 1, @@ -22907,7 +24725,7 @@ "params": { "irq_num": 5 }, - "ts": 0.256666425 + "ts": 0.2584482 }, { "core_id": 1, @@ -22915,7 +24733,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.25668 + "ts": 0.258461775 }, { "core_id": 1, @@ -22923,7 +24741,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.256695125 + "ts": 0.2584769 }, { "core_id": 0, @@ -22933,7 +24751,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2568338 + "ts": 0.25854665 }, { "core_id": 0, @@ -22941,7 +24759,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.256849175 + "ts": 0.258562 }, { "core_id": 0, @@ -22949,7 +24767,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.25686425 + "ts": 0.258577075 }, { "core_id": 1, @@ -22959,7 +24777,7 @@ "params": { "irq_num": 5 }, - "ts": 0.257666425 + "ts": 0.2594482 }, { "core_id": 1, @@ -22967,7 +24785,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.257680075 + "ts": 0.259461725 }, { "core_id": 1, @@ -22975,7 +24793,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.257695225 + "ts": 0.25947685 }, { "core_id": 0, @@ -22985,7 +24803,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2578338 + "ts": 0.25954665 }, { "core_id": 0, @@ -22993,7 +24811,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2578492 + "ts": 0.25956205 }, { "core_id": 0, @@ -23001,7 +24819,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.257864425 + "ts": 0.259577275 }, { "core_id": 1, @@ -23011,7 +24829,7 @@ "params": { "irq_num": 5 }, - "ts": 0.258666425 + "ts": 0.2604482 }, { "core_id": 1, @@ -23019,7 +24837,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.25867995 + "ts": 0.260461725 }, { "core_id": 1, @@ -23027,7 +24845,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2586951 + "ts": 0.26047685 }, { "core_id": 0, @@ -23037,7 +24855,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2588338 + "ts": 0.26054665 }, { "core_id": 0, @@ -23045,7 +24863,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.258849175 + "ts": 0.260562 }, { "core_id": 0, @@ -23053,7 +24871,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.25886425 + "ts": 0.260577075 }, { "core_id": 1, @@ -23063,7 +24881,7 @@ "params": { "irq_num": 5 }, - "ts": 0.259666425 + "ts": 0.2614482 }, { "core_id": 1, @@ -23071,7 +24889,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.259680075 + "ts": 0.261461725 }, { "core_id": 1, @@ -23079,7 +24897,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.25969535 + "ts": 0.261476975 }, { "core_id": 0, @@ -23089,7 +24907,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2598338 + "ts": 0.26154665 }, { "core_id": 0, @@ -23097,7 +24915,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.259849175 + "ts": 0.261562025 }, { "core_id": 0, @@ -23105,7 +24923,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.25986425 + "ts": 0.261577225 }, { "core_id": 1, @@ -23115,7 +24933,7 @@ "params": { "irq_num": 5 }, - "ts": 0.260666425 + "ts": 0.2624482 }, { "core_id": 1, @@ -23123,7 +24941,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.26068 + "ts": 0.262461775 }, { "core_id": 1, @@ -23131,7 +24949,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.260695125 + "ts": 0.2624769 }, { "core_id": 0, @@ -23141,7 +24959,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2608338 + "ts": 0.26254665 }, { "core_id": 0, @@ -23149,7 +24967,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.260849175 + "ts": 0.262562 }, { "core_id": 0, @@ -23157,7 +24975,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.26086425 + "ts": 0.262577075 }, { "core_id": 1, @@ -23167,7 +24985,7 @@ "params": { "irq_num": 5 }, - "ts": 0.261666425 + "ts": 0.2634482 }, { "core_id": 1, @@ -23175,7 +24993,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.261680075 + "ts": 0.263461725 }, { "core_id": 1, @@ -23183,7 +25001,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.261695225 + "ts": 0.26347685 }, { "core_id": 0, @@ -23193,7 +25011,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2618338 + "ts": 0.26354665 }, { "core_id": 0, @@ -23201,7 +25019,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2618492 + "ts": 0.26356205 }, { "core_id": 0, @@ -23209,7 +25027,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.261864425 + "ts": 0.263577275 }, { "core_id": 1, @@ -23219,7 +25037,7 @@ "params": { "irq_num": 5 }, - "ts": 0.262666425 + "ts": 0.2644482 }, { "core_id": 1, @@ -23227,7 +25045,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.262680075 + "ts": 0.264461725 }, { "core_id": 1, @@ -23235,7 +25053,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.26269535 + "ts": 0.26447685 }, { "core_id": 0, @@ -23245,7 +25063,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2628338 + "ts": 0.26454665 }, { "core_id": 0, @@ -23253,7 +25071,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.262849175 + "ts": 0.264562 }, { "core_id": 0, @@ -23261,7 +25079,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.26286425 + "ts": 0.264577075 }, { "core_id": 1, @@ -23271,7 +25089,7 @@ "params": { "irq_num": 5 }, - "ts": 0.263666425 + "ts": 0.2654482 }, { "core_id": 1, @@ -23279,7 +25097,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.26368 + "ts": 0.265466 }, { "core_id": 1, @@ -23287,7 +25105,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.263695125 + "ts": 0.265481125 }, { "core_id": 0, @@ -23297,7 +25115,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2638338 + "ts": 0.26554665 }, { "core_id": 0, @@ -23305,7 +25123,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.263849175 + "ts": 0.265562 }, { "core_id": 0, @@ -23313,7 +25131,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.26386425 + "ts": 0.265577075 }, { "core_id": 1, @@ -23323,7 +25141,7 @@ "params": { "irq_num": 5 }, - "ts": 0.264666425 + "ts": 0.2664482 }, { "core_id": 1, @@ -23331,7 +25149,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.264680075 + "ts": 0.266461725 }, { "core_id": 1, @@ -23339,7 +25157,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.264695225 + "ts": 0.26647685 }, { "core_id": 0, @@ -23349,7 +25167,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2648338 + "ts": 0.26654665 }, { "core_id": 0, @@ -23357,7 +25175,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2648492 + "ts": 0.26656205 }, { "core_id": 0, @@ -23365,7 +25183,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.264864425 + "ts": 0.266577275 }, { "core_id": 1, @@ -23375,7 +25193,7 @@ "params": { "irq_num": 5 }, - "ts": 0.265666425 + "ts": 0.2674482 }, { "core_id": 1, @@ -23383,7 +25201,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.26567995 + "ts": 0.267461725 }, { "core_id": 1, @@ -23391,7 +25209,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2656951 + "ts": 0.26747685 }, { "core_id": 0, @@ -23401,7 +25219,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2658338 + "ts": 0.26754665 }, { "core_id": 0, @@ -23409,7 +25227,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.265849175 + "ts": 0.267562 }, { "core_id": 0, @@ -23417,7 +25235,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.26586425 + "ts": 0.267577075 }, { "core_id": 1, @@ -23427,7 +25245,7 @@ "params": { "irq_num": 5 }, - "ts": 0.266666425 + "ts": 0.2684482 }, { "core_id": 1, @@ -23435,7 +25253,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.266680075 + "ts": 0.268461725 }, { "core_id": 1, @@ -23443,7 +25261,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.26669535 + "ts": 0.268476975 }, { "core_id": 0, @@ -23453,7 +25271,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2668338 + "ts": 0.26854665 }, { "core_id": 0, @@ -23461,7 +25279,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.266849175 + "ts": 0.268562025 }, { "core_id": 0, @@ -23469,7 +25287,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.26686425 + "ts": 0.268577225 }, { "core_id": 1, @@ -23479,7 +25297,7 @@ "params": { "irq_num": 5 }, - "ts": 0.267666425 + "ts": 0.2694482 }, { "core_id": 1, @@ -23487,7 +25305,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.26768 + "ts": 0.269461775 }, { "core_id": 1, @@ -23495,7 +25313,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.267695125 + "ts": 0.2694769 }, { "core_id": 0, @@ -23505,7 +25323,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2678338 + "ts": 0.26954665 }, { "core_id": 0, @@ -23513,7 +25331,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.267849175 + "ts": 0.269562 }, { "core_id": 0, @@ -23521,7 +25339,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.26786425 + "ts": 0.269577075 }, { "core_id": 1, @@ -23531,7 +25349,7 @@ "params": { "irq_num": 5 }, - "ts": 0.268666425 + "ts": 0.2704482 }, { "core_id": 1, @@ -23539,7 +25357,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.268680075 + "ts": 0.270461725 }, { "core_id": 1, @@ -23547,7 +25365,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.268695225 + "ts": 0.27047685 }, { "core_id": 0, @@ -23557,7 +25375,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2688338 + "ts": 0.27054665 }, { "core_id": 0, @@ -23565,7 +25383,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.2688492 + "ts": 0.27056205 }, { "core_id": 0, @@ -23573,7 +25391,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.268864425 + "ts": 0.270577275 }, { "core_id": 1, @@ -23583,7 +25401,7 @@ "params": { "irq_num": 5 }, - "ts": 0.269666425 + "ts": 0.2714482 }, { "core_id": 1, @@ -23591,7 +25409,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.26967995 + "ts": 0.271461725 }, { "core_id": 1, @@ -23599,7 +25417,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2696951 + "ts": 0.27147685 }, { "core_id": 0, @@ -23609,7 +25427,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2698338 + "ts": 0.27154665 }, { "core_id": 0, @@ -23617,7 +25435,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.269849175 + "ts": 0.271562 }, { "core_id": 0, @@ -23625,7 +25443,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.26986425 + "ts": 0.271577075 }, { "core_id": 1, @@ -23635,7 +25453,7 @@ "params": { "irq_num": 5 }, - "ts": 0.270666425 + "ts": 0.2724482 }, { "core_id": 1, @@ -23643,7 +25461,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.270680075 + "ts": 0.272461725 }, { "core_id": 1, @@ -23651,7 +25469,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.27069535 + "ts": 0.272476975 }, { "core_id": 0, @@ -23661,59 +25479,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2708338 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.270849175 - }, - { - "core_id": 0, - "ctx_name": "alloc2", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.27086425 - }, - { - "core_id": 1, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.271666425 - }, - { - "core_id": 1, - "ctx_name": "free2", - "id": 18, - "in_irq": false, - "params": {}, - "ts": 0.27168 - }, - { - "core_id": 1, - "ctx_name": "free2", - "id": 17, - "in_irq": false, - "params": {}, - "ts": 0.271695125 - }, - { - "core_id": 0, - "ctx_name": "SysTick", - "id": 2, - "in_irq": true, - "params": { - "irq_num": 5 - }, - "ts": 0.2718338 + "ts": 0.27254665 }, { "core_id": 0, @@ -23721,9 +25487,19 @@ "id": 6, "in_irq": true, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.2718488 + "ts": 0.272561625 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12284596 + }, + "ts": 0.272561625 }, { "core_id": 0, @@ -23731,7 +25507,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.271861575 + "ts": 0.272574225 }, { "core_id": 0, @@ -23739,9 +25515,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12286700 + "tid": 12284596 }, - "ts": 0.27187725 + "ts": 0.272589875 }, { "core_id": 0, @@ -23752,9 +25528,9 @@ "eAction": 2, "pulPreviousNotificationValue": 0, "ulValue": 0, - "xTaskToNotify": 12254080 + "xTaskToNotify": 12274964 }, - "ts": 0.271895625 + "ts": 0.27260805 }, { "core_id": 0, @@ -23762,9 +25538,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.271906575 + "ts": 0.2726191 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12274964 + }, + "ts": 0.2726191 }, { "core_id": 0, @@ -23774,7 +25560,7 @@ "params": { "xTicksToDelay": 100 }, - "ts": 0.271919725 + "ts": 0.2726322 }, { "core_id": 0, @@ -23784,7 +25570,7 @@ "params": { "irq_num": 30 }, - "ts": 0.271936275 + "ts": 0.27264875 }, { "core_id": 0, @@ -23792,7 +25578,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.27194765 + "ts": 0.272660225 }, { "core_id": 0, @@ -23800,9 +25586,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.2719646 + "ts": 0.272677175 }, { "core_id": 0, @@ -23813,7 +25599,7 @@ "xClearCountOnExit": 0, "xTicksToWait": 4294967295 }, - "ts": 0.271982475 + "ts": 0.27269095 }, { "core_id": 0, @@ -23823,10 +25609,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.271998425 + "ts": 0.272706875 }, { "core_id": 0, @@ -23836,10 +25622,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.272014325 + "ts": 0.272722875 }, { "core_id": 0, @@ -23847,8 +25633,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (580) example: Got notify val 1\n", - "ts": 0.272063675 + "msg": "I (568) example: Got notify val 1\n", + "ts": 0.272764325 }, { "core_id": 0, @@ -23856,8 +25642,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (580) example: Got notify val 1\n", - "ts": 0.272063675 + "msg": "I (568) example: Got notify val 1\n", + "ts": 0.272764325 }, { "core_id": 0, @@ -23867,10 +25653,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.272079975 + "ts": 0.272784675 }, { "core_id": 0, @@ -23880,10 +25666,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.272095925 + "ts": 0.272800725 }, { "core_id": 0, @@ -23891,8 +25677,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (580) example: Wait notify 1\n", - "ts": 0.272140275 + "msg": "I (568) example: Wait notify 1\n", + "ts": 0.272837275 }, { "core_id": 0, @@ -23900,8 +25686,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (580) example: Wait notify 1\n", - "ts": 0.272140275 + "msg": "I (568) example: Wait notify 1\n", + "ts": 0.272837275 }, { "core_id": 0, @@ -23911,7 +25697,7 @@ "params": { "irq_num": 30 }, - "ts": 0.27215865 + "ts": 0.2728555 }, { "core_id": 0, @@ -23919,7 +25705,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.27217005 + "ts": 0.27286685 }, { "core_id": 0, @@ -23927,7 +25713,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2721861 + "ts": 0.272882775 }, { "core_id": 1, @@ -23937,7 +25723,7 @@ "params": { "irq_num": 5 }, - "ts": 0.272666425 + "ts": 0.2734482 }, { "core_id": 1, @@ -23945,7 +25731,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.27267995 + "ts": 0.273461725 }, { "core_id": 1, @@ -23953,7 +25739,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2726951 + "ts": 0.273476975 }, { "core_id": 0, @@ -23963,7 +25749,7 @@ "params": { "irq_num": 5 }, - "ts": 0.2728338 + "ts": 0.27354665 }, { "core_id": 0, @@ -23971,9 +25757,19 @@ "id": 6, "in_irq": true, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.2728488 + "ts": 0.273561625 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12290612 + }, + "ts": 0.273561625 }, { "core_id": 0, @@ -23981,7 +25777,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.272861575 + "ts": 0.273574225 }, { "core_id": 0, @@ -23989,9 +25785,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12292716 + "tid": 12290612 }, - "ts": 0.272877375 + "ts": 0.273589875 }, { "core_id": 0, @@ -24002,9 +25798,9 @@ "eAction": 2, "pulPreviousNotificationValue": 0, "ulValue": 0, - "xTaskToNotify": 12254080 + "xTaskToNotify": 12274964 }, - "ts": 0.2728918 + "ts": 0.27360425 }, { "core_id": 0, @@ -24012,9 +25808,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.272902925 + "ts": 0.2736153 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12274964 + }, + "ts": 0.2736153 }, { "core_id": 0, @@ -24024,7 +25830,7 @@ "params": { "xTicksToDelay": 100 }, - "ts": 0.27291605 + "ts": 0.2736284 }, { "core_id": 0, @@ -24034,7 +25840,7 @@ "params": { "irq_num": 30 }, - "ts": 0.27293265 + "ts": 0.27364495 }, { "core_id": 0, @@ -24042,7 +25848,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.272944025 + "ts": 0.2736563 }, { "core_id": 0, @@ -24050,9 +25856,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.272960975 + "ts": 0.27367325 }, { "core_id": 0, @@ -24063,7 +25869,7 @@ "xClearCountOnExit": 0, "xTicksToWait": 4294967295 }, - "ts": 0.272974675 + "ts": 0.273687025 }, { "core_id": 0, @@ -24073,10 +25879,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.2729906 + "ts": 0.27370295 }, { "core_id": 0, @@ -24086,10 +25892,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.273006525 + "ts": 0.27371895 }, { "core_id": 0, @@ -24097,8 +25903,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (581) example: Got notify val 1\n", - "ts": 0.273056 + "msg": "I (569) example: Got notify val 1\n", + "ts": 0.27375645 }, { "core_id": 0, @@ -24106,8 +25912,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (581) example: Got notify val 1\n", - "ts": 0.273056 + "msg": "I (569) example: Got notify val 1\n", + "ts": 0.27375645 }, { "core_id": 0, @@ -24117,10 +25923,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.2730723 + "ts": 0.2737761 }, { "core_id": 0, @@ -24130,10 +25936,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.27308825 + "ts": 0.27379205 }, { "core_id": 0, @@ -24141,8 +25947,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (581) example: Wait notify 2\n", - "ts": 0.2731326 + "msg": "I (569) example: Wait notify 2\n", + "ts": 0.2738286 }, { "core_id": 0, @@ -24150,8 +25956,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (581) example: Wait notify 2\n", - "ts": 0.2731326 + "msg": "I (569) example: Wait notify 2\n", + "ts": 0.2738286 }, { "core_id": 0, @@ -24161,7 +25967,7 @@ "params": { "irq_num": 30 }, - "ts": 0.273150975 + "ts": 0.273846825 }, { "core_id": 0, @@ -24169,7 +25975,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.273162375 + "ts": 0.273858175 }, { "core_id": 0, @@ -24177,7 +25983,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.27317855 + "ts": 0.2738742 }, { "core_id": 1, @@ -24187,7 +25993,7 @@ "params": { "irq_num": 5 }, - "ts": 0.273666425 + "ts": 0.2744482 }, { "core_id": 1, @@ -24195,7 +26001,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.27367995 + "ts": 0.274461725 }, { "core_id": 1, @@ -24203,7 +26009,7 @@ "id": 17, "in_irq": false, "params": {}, - "ts": 0.2736951 + "ts": 0.274476975 }, { "core_id": 0, @@ -24213,7 +26019,59 @@ "params": { "irq_num": 5 }, - "ts": 0.2738338 + "ts": 0.27454665 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.274562025 + }, + { + "core_id": 0, + "ctx_name": "main", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.274577225 + }, + { + "core_id": 1, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.2754482 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 18, + "in_irq": false, + "params": {}, + "ts": 0.275461775 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 17, + "in_irq": false, + "params": {}, + "ts": 0.2754769 + }, + { + "core_id": 0, + "ctx_name": "SysTick", + "id": 2, + "in_irq": true, + "params": { + "irq_num": 5 + }, + "ts": 0.27554665 }, { "core_id": 0, @@ -24221,9 +26079,19 @@ "id": 6, "in_irq": true, "params": { - "tid": 12298716 + "tid": 12296612 }, - "ts": 0.2738488 + "ts": 0.275561625 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12296612 + }, + "ts": 0.275561625 }, { "core_id": 0, @@ -24231,7 +26099,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.273861575 + "ts": 0.275574275 }, { "core_id": 0, @@ -24239,9 +26107,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12298716 + "tid": 12296612 }, - "ts": 0.273877375 + "ts": 0.27558995 }, { "core_id": 0, @@ -24252,9 +26120,9 @@ "eAction": 2, "pulPreviousNotificationValue": 0, "ulValue": 0, - "xTaskToNotify": 12254080 + "xTaskToNotify": 12274964 }, - "ts": 0.2738918 + "ts": 0.275604375 }, { "core_id": 0, @@ -24262,9 +26130,19 @@ "id": 6, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.273902925 + "ts": 0.27561535 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 6, + "in_irq": false, + "params": { + "tid": 12274964 + }, + "ts": 0.27561535 }, { "core_id": 0, @@ -24274,7 +26152,7 @@ "params": { "xTicksToDelay": 100 }, - "ts": 0.27391605 + "ts": 0.275628525 }, { "core_id": 0, @@ -24284,7 +26162,7 @@ "params": { "irq_num": 30 }, - "ts": 0.27393265 + "ts": 0.275645075 }, { "core_id": 0, @@ -24292,7 +26170,7 @@ "id": 18, "in_irq": false, "params": {}, - "ts": 0.273944025 + "ts": 0.275656425 }, { "core_id": 0, @@ -24300,9 +26178,9 @@ "id": 4, "in_irq": false, "params": { - "tid": 12254080 + "tid": 12274964 }, - "ts": 0.273960975 + "ts": 0.275673375 }, { "core_id": 0, @@ -24313,7 +26191,7 @@ "xClearCountOnExit": 0, "xTicksToWait": 4294967295 }, - "ts": 0.273974675 + "ts": 0.275687075 }, { "core_id": 0, @@ -24323,10 +26201,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.2739906 + "ts": 0.275703075 }, { "core_id": 0, @@ -24336,10 +26214,10 @@ "params": { "pvItemToQueue": 0, "xCopyPosition": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 0 }, - "ts": 0.274006525 + "ts": 0.275719225 }, { "core_id": 0, @@ -24347,8 +26225,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (582) example: Got notify val 1\n", - "ts": 0.274051775 + "msg": "I (571) example: Got notify val 1\n", + "ts": 0.2757568 }, { "core_id": 0, @@ -24356,8 +26234,8 @@ "id": 26, "in_irq": false, "lvl": 0, - "msg": "I (582) example: Got notify val 1\n", - "ts": 0.274051775 + "msg": "I (571) example: Got notify val 1\n", + "ts": 0.2757568 }, { "core_id": 0, @@ -24367,10 +26245,10 @@ "params": { "pvBuffer": 3233808384, "xJustPeek": 0, - "xQueue": 12283904, + "xQueue": 12281672, "xTicksToWait": 10 }, - "ts": 0.330505425 + "ts": 0.32703545 }, { "core_id": 0, @@ -24378,7 +26256,15 @@ "id": 11, "in_irq": false, "params": {}, - "ts": 0.330514125 + "ts": 0.327044075 + }, + { + "core_id": 1, + "ctx_name": "free2", + "id": 11, + "in_irq": false, + "params": {}, + "ts": 0.327044075 } ], "streams": { diff --git a/tools/esp_app_trace/test/sysview/heap_log0.svdat b/tools/esp_app_trace/test/sysview/heap_log0.svdat index 30f3c9e764b772b99605444598d990500d98eea5..fbcfd142d2961bf6a1b04f0445c11f9d23fe78d7 100644 GIT binary patch literal 12335 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 KEXx~r#Qq<^q$F(s diff --git a/tools/esp_app_trace/test/sysview/heap_log1.svdat b/tools/esp_app_trace/test/sysview/heap_log1.svdat index 5133eb868359d72bc594d43e33b34fa97e165457..59265b8893b1fad766a0e175adc5a00958bf6aa2 100644 GIT binary patch literal 9731 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 BXQcoD diff --git a/tools/esp_app_trace/test/sysview/heap_log_mcore.svdat b/tools/esp_app_trace/test/sysview/heap_log_mcore.svdat index 6a5b07cda831afe128c177e58ad7240cc23cd315..f8ec7c43f3ac3a2c5d14330b68c41e5d06059c6b 100644 GIT binary patch literal 22043 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 lqZfDIFbu;B0K9OblOQi2uU#;_mrP;I# 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 k_O|)K%)P1aug*wazPHRArn9%d+f?fL(MDUu8( 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�v@mP8sp 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

E1;+~Vd9DtqX4i$HO>{bA= zG{?lz%}Oml~d`=tP5)7+urekZ_$GE26E?BF!Bt?#enov-Qz{vO~pPWmVz1>U(sqnRuw?4GD(gUnDrr zBOULNs`&)ULuj&*;9QS>kx%CnC~wLAQ~=#+d5`V2M9}(zsAei8z6%JEfYw(Ob}&$$ z@hGecMR^^1f$}L3-B~9J%S9u?&f^&bsfuY?Rhcx%SxL$Wq-VV;3gu9_MG-C5u1rY7 zuufIN8~ubj&B08=XI7}BK?$dO8CkKNOJK>>?4U@v!Ar<`?vxPZ$2{_OpUfvvUPAsz z@M8ehdpDRyc1sziYUr==y3iz4fBGSeg7Ny~13((-M{fksAb^?X&xG-w0tC|h4KdzJ z0EFObjCYTI#oSxYz`LTRh;6_qSU7Jk4v$Lg4?6_YAAW!gwNdI|cgscESo)i5fNCnS z0VL9AZUoSrrh1qcqD#elt8p(qg_M?JcJJc!cE}v>CzQ(ctZI}tKzP=q|A4L=A1DK7 zeR>tOXw70RHW*gjO@Ibj)UP}@J|sG_(o=M(8cvj=!vqK_-G&QbE3J1Ewy|_{910wv zBsQ#{ZwA}lt)Hn(ZhUO?5})lJ@=dDkr+>3nY}F6en(c%(b0u?A9rI>=$aVF<5NY;-1L)p@x}KPV-%#h-8#Nk@iXWP z#p$~+zQm_>;j6Mt)x+MBtTJ7N_hWn?VNjD!vZUz(^hnp??GT?KKyCV7vYsh*Q?HD^ zuP|s#Ur7n}6QGZ(f&Il){ZtJcAPo8&R(GbGWl^m#6|mk0|3p<8pTnz(_z+Dk(Y>6l zNWY!~x!JFR@}F*O4HR3KB3pSdc}#SFG!WU?nmo2EdHEY#lits{`0a%oTa(_;x%h#L z8(Wj!&$;-4>v_W7&$)VIYts8U7eABmjg{0t=VD4|)C7}DLnol*9^BZPTl6!Dt zYw`qnuTi!o(X)}F8wG^&+}N62Z81~rBACj|ZTtdFH)I{2k2U^xAj$n8$xJM4gm1=k zooofzJBRp?wH09@>Nkb)wbvv3BQVwXAWQWK-sFilqhTc83^@bC>=ZfOLF!F9Z$?93 zOrdk@L(IXWNhMcLqZe0|=T&FD1$1KwFN}D(>2O$^#56NGu*#^?H1rA3x|rcP9v*9X ziHe)yr9P^89$r)NufnJKn1=7k^AllttB1{u#YzDg@EWF(-4>DLaWAFOxCdUA@rWrZ zedwX9Iied4?~(Uy!rQ6w#O*W+H_TQooe|DxxP%G*A_dIy z6UjTKxrn5T!^ik&TF_`NqY~$a*LFgG$kc1Xmw9NTVIdQqD6DxPsWSEP98??jpu|gr z^qfaB8rG1-k%Il4Sh;YvY`?4rK9Q>r!s93X zS*Q17_2fOc`pkNrsYg=wZvcOUYnQ|490}Y$#Em--2jk-ED@$HKnR^lPnp6AAqS#MX zGKINk%MgfbekNn-kw|+uu9kVIHS=$RTLpL}u6~C=0rMY%YcqQPh0wDi=P8hrZPaW( z4B{#|pB+FsFF?NYa49*T9mNu#1iTrSlJnW=#MS%>>#uPsIiEdL$=OHbeD(yU7!B$O zTuR#KM2e#U&nHf#eO_?q0X~PgeA@9{!QBA(TH-{5_XYP8;J@QCdf&i=k4U|s9QiZb z-}e=Hq>YNC)?+;}uKrjcWZ6H_2 z50niTt)vpW0C%Wcn}N4)mIjG-#M7Q!<^h#>iy0Mw2V2W zudGMDbCy6;Db?M-k?LUZ{dc4q^cAJLK1_M}XSR>1$492Lz3cl@B6E_G<$AptMagpg z-dYw}n0@_WN|s%(#%JoDU=V_(F(N{=n|2WGrD}{`phL8XBS( zz(Oft|2OTn7Ac^ymsh~TK~&?9V15=0*p3fVbKzKi>6nvi-=O-7W#ECWsOb`|>F_q$ zWwR{KclJHVc^9q$i%86GXVyMo+lu z^453>te?i!pHX9`kGhDRd2;Q;cO&b}j93T#tDda@J zdk`m!`;QR!$Rfb=a1HqdrN0STg1m(&&>_)xq0i7b6f*{F1ePiqNcI~Qhdm5xzNYwU z4*wWf&V2@dj|a|=kTGQStN3ZKG*V8nV2f)pZ#9RBE&8D<$B8W-^KCJ#Kc6pyh!^1M zKl`AAk$U>mz?qX(WlWaJ_!QKSsmKc;4F)5VH@t`qbGNKb!0q-CZoeYM&$vc>4Zs+D z43hAjud0VH^>gu3j|A7^zWbYxVIG-h=JM@f(L5vP5pLpSX4C@1$~R>$Zj4@=z$@kO zQcj00+GvbEubK#B?B*ffNz}#yjF~}WEFAGVIM2O!Z*!l-gh5D&zX@|P`y|w+2rC$x zd*mWxr<)>n+z6pJKVX~1(cq-FSp>Q70YP>6zSp}RLVv(>ICvuN!SSFX4$cBTPs0u2 zgPAfi+eXZo-NN?KcnwAN3Eu;p_5($~hsdD;?rA{1f-9>XH|%W3Y}c+2G4q$il8o&M zSaM>RJ;SFg_GU(>nfQEIFdN7kW;7>dKkWtp^-)0Q-n4( zyI!C}1==%y6L@xk=~jSag6-;Nw5tSq{{nzBFcKuN(OC^BQKGxN8gT;^%&7nvK|vUO4egmN6C6DRg&e9Ke>ri1pb9oM(zeq-wNF} zNVhxEo9%m}p}0pZL{l&9D_kduXob6pXp@!E3a1KbiZWW^ej?gbWwgTiN*HCd!jlEs zD_h3V!uGW&B(ToNV=)JyP?I;{46`hBJ0#CP7=+vl@IyB)BR&CC*7Yl%Qd2sa8lTKa z@*tA@O(lW(jX0SyTM#_N7W0tJh##fVl^%Mj;uczmc=^RfaslW!BU{diI-%rUt&3!h za*q{jcQNk!Vz7m|PlE*mqXWg%%qloeK?4aPE_oC(7*DVBd)+&zd-l3{y4Q`wiSYqb zb^~?lQmPMj+*TAGpPmAqelH8nBBb^-1$AFl8=Yj=P^2+;Boc%uWWWv{gi^!a_M^x; zAno9K+{Kk{=eTnPa~tl_`*F)U3paer{spj`xQWlN$MBq}d>PMn@J-yEA6+;+BEflh zjwiEELkX_zK5}LEkt@58T-kl(%I+gqb|1O2`^c5uN3QHXg7=-p$nGOob|1O2`^c5u zN3QHXa%K0CE4z^^d3_mL~Rk6hV(^^d3_mL~Rk6hV(dM$UjQHuO=B#=F;D_Hh7C$vKSnH6?bHNWg94%=^6&s1gGjT)rG>}VT6%b$IA;~s? z(fMsWr=~oGF{LE$c|3=#vEiQvr)FZ{H%kkdGGt9@`Dt(t{Toh?@BsA0EW8PfEV5Ql z1dUt+2|_Q#wjj$?CXyQ=G(K|9>t2uYUNYUh0eFawGQ;@?vfS}`%b9#LQ|7+798GeO zb2*;zy{if_a`T6C)e+FVHau&)gtq^m!HsoyME8?WY zGk(tbe$JBy>YT6tCTAbyT*;g(6JRcXX8T4z=gK}hCn-CY*$+97qqO{OTm6~sANVaK;#_2Y>%PVRnEhkRnCH= zCCzX)RC97MKNE}DG_0j_+6H&!DuUI>ZSrO_$-K}8lwL9ygj&2pYH+33fXJ2xBdZ1p zI|rh_V%EF_$*yF6-oV;07lj^W{?#B1N8X{hj8bw>F*c6 z9GC+jz+SjIXucL@mEVmVXrac{;8GFlimY=(On(*9UWO~Z6$#krAtZc?kP31J?71Q& zITV`vhO8}=)(|ruhV&+HV#XPvkHA>W_z1W?M2-tV9MDlI-;5j*NDc6YeE3X=RYH+& zn=~Ql5dy1|l^hk{2E#XTp>Sqi!_2%%<^!S!c$tX{dIT@?cgXmSWG*F%hF*#c8Dp1T z0W|yfwF+&Hgs4`Q5tO=0pmM|v9Eo5C1SUw+oXh|o=BS+{j>xdp4GfsvC@N!bsqI2m zs^yM_7F7oxmg$Dmv~$imlD^rfT>FXcg0nH0GOa*8B<_+ zZx9=fXElhW4+8lJEgFgzd*uLU@h0|a3avwOF*b1_kKoy>4@zmqh0Nyh(#^ z3T;B>l8ZqYgEYG{oivDMCgTlc!|W6Kk;&Mv4nvZ;xY7ea9H1oY)UPHX*?3S*-bBWM z(MsT|CjmYXS*oYvVLC-B9g8Pc;Xu$cRhZrvXb$B-1?&Sk%&tP}?i*>qsuHW_dWaL+ zCD7YqAMSC)(Mt(Uk&(CdV$@EstiYnSbsTVmWrOD;w^6&9lw^Ut#1thtNGSCcHF({v zXdqxUyk3iYaWkvV>WPnFt5T}bFkS>EXskKMpV9pchMduD(la`Dfj^_OcEt*mKwSYw zSG-6&?i|6D0jVml~^vI0fKtOiL@2ID2j>jzaNG9;U6-8$~eGM%GMfSr-3Ucr{W_T0XS2|?pJ-j#IZWYj{u8Yi zK+k`o4b}&sV0KHB<7l;eP{;o}yZxU!yEOyPVz#1d%PGii#=zmeyBJmHb~^^m-<^zZ z5pZ7u#&Unfg6^Q}9*5TBJ`HNvJr?(fdo=L2TaA=acO&ju?t{QPuDukj-887Kdjjy; zZaeUC!#WCp)5CfYO~a~MfdZyioq{4Q&Xxl+s-!g!<@3xcwxZCUkV;0Lz&#CYgw{ID zPh&HyR|6kfh+8Ch8t&Q0104zOipO}#N|s%kcpQLJ0=!!ulUD6yp+L7H=PVF{&W0MS z`RFEqZCEpzuFB%uUz^0r&5pxBuEZ5~C9be5afMxpE9^>KVOQb`yB*>RTgBFkV3HNg zJ|=oD@+TNqIQ!VH75j1+BRs7-UXkb#%7v&;F&pq{A* z*;^+v-`F&E85{8!)iL+54`AXsENWbW3K`By0^=J<2s$*JIYA6(J0^jNswk(C$tDTl z8u7;f&E-T> zDrpK)jt=TcT1NVj3hdojE46nnQ&KCVkY9qitzn)}A~}pgepTj<3g78t()`NJTO>t4 zox#$wffvL$pAsuKVHye2w#6G!9f@0uyS}{w!^HI=`&yJ2w~?0D+_tT|YX~-hMa{ekt zj?SmK3Bueoefo+^O(TDw2pQeNR2)g=W)w1rUYF`Hk2#hhAY;xFqwtsG(2RPy?~o`` z6w&8U&?6j(0z;esrV0+I!YDdkOxBf&Xox7EAj{);E*-xDrrN{FCZX^RblG%Mcqmiy zePg8QiY}~|Sm$E6xEm1l)!EJjANV9zaCLb5GJ5n3<4}qY%@VX$1A1X)G z1B2^f z^>?7z3%JCZt3XvU{Z^$S&~~EIydl4@()U`W9ZWNO=Y0N|X?_SO<5yHF5%4K5I#XQH zxd3xOJeU88I)B_*=Rx?4Q!VIY)q=)dgx?Zz?X(4LQ!VHW&`-zpTSHWW-A)Yg&lLEy zL)}UZdYS+zzm84xnLshyt@mfP(^IZ0>Y2cJR@AK!W`ig6C{Q~#`{$L=(=Ud{3zus4 zF9&vP_OAqFv^xa}mf@;wWWlehMBf1MH(Y(hfA(%bx`N*^(CgHn`C=fHj_Zz5atVBE zxPHH5$S}g3c-yEy^R+;zKN#p?gvcFQ$4bz4V%&e$%Ko~uR`%G=`TVm=dM=>)T^zmd zJ(WGv?{;hk9Po-!1=0zrL&tGgcWT5D%z90Wb_!VjZqH?1N-OSSgjnn4@AGZ8Ni~Q? z->uCw2eZI-~At(7X!~0(A>Yld9nQ4VXmW>LpW` zn^oQ6od%6Nb)rWg)J_cf&pOc!JL^Q*5M(EOep?}wKvl?%dZ^x9t+F=4xN_(fyg_IK zGHg>nv00uGs>O5pQV!b}DVuHI!)+T5c4m84t~YF76zIVh|L#zJFfK7tA*gV|`@LX; zGSW$)ul9{}WyVOcak{lt;(@Jg+rO(E%TUT)0wXmdJ6l^*D;_*8@tRj!ihdML^h+2a zDp7tQ^;^-oO$^Axd{WNrIzh>PA>=;a(=RizQQdOA9+EjR<6mY(JuMJA9i{x(L^mS2j7r}k$=A4=NZaYCBt`S{N|JQy z(dAF_lVL_@Y4*(bDr#RPP41Arw4?LCgtE={b!o3U0)YXnj;XNFZn&g6 zE(JAYZTCm1u(JHUpx=h8`lwll8fGMrq<`igKzxr&_4k^9c{tuVJ#IirV$p~2K#N`u z=ia|%QI@L4tspG%vd8C3&1c)r`Kxb471JX5rVKHXE7cq z=a>!&ybm6X6w&%%XfgOOJka^H4m28o zO?w1z^dmIwg9i@UAcU+dBWpBYSCU4+om~WV&AnYSue>X@p3|G@f zpzd^F6?u~=Ey$Zp_h5rcFwpXTg`D(#)taEsfk2w@Khf`|$NihzO$2&jN;0-~bebpZht z6%`d16gNb0R}>ZZeFYW0?xLdNcJ+Eu|M#u#o)E70`~EM_b0(*%yQ{0JtEBk&JaB9+$|aAmf|z?bUqATVYj9s;48S8-W7IFl9~kVABU^*Uv%qh z?Bo*UxeJIpa8->0okM}>jrW7fX%kqZoy#0gB6S-sX`YG572%JV(+zgcQ{YNB&rG02 z!HaQ21^vgcqDjj2ApF40mb|dF#fh-{#N9Q@JE>6V&^OdNyWSf_YTwfBk2#>IqS0N z)mwlT;kM(3!o8~4al(Hq+{?&C;Xc(&L%8Zs42hpLiAG8SCp_nG^wZ(r$i=y6>W2NR z=X)4}js()?kFdDLF6|jd6GfNVv0Fj4H}dqvB|6@MsvP-YeP_Tylr?Ar3$jJ{BmI8`_HL?ArvlCz4J)ld5|+r-r+;TEB{F1E zvXv4MF<4XS6jV4_RoaRQXouE_m#g-@WT^3Ac2BE%D^kVQUcwD+?I4xS3Gd$jUDImy z2GVPgK1ik8U99T2fs$9*_i+vXz9((A%*3VtMXeS+o?gkH4rUuiIsnYB6ymBW3L+mIs;Is z@))r9rFle9E_`KB2w|@WVJ?tN(mCHwR7GDVkS~g!Bu?{a`eGVWQX~<;fE_& zfrF(CY=W`jXf2uqLkFvpC)8bR603@t@$g_>nWfuJ(Om_aD{!@1j2!$rHVru-JV;{L z;FtqH(&3W7t*hGsb=80gINzg?`D{?SLs1d}l#5mb$_*^2tFj=)F8F><*i}zbRGKt! z!g8qdE@3uB+QyWt`m@(^LQ^$G+HS$7xD}$@giAF=u4;@H*}I($$Su#PtC8hWTvF%XKBNAPJYPG{qP&vlZ<6;0Uu2WBLW$fIsub-f zf<^wfU|%ak;=E+7%KkTM%2J$ZDE{}nBn1{#?N#c{&ZuyHQV8&|`6@#|o^}Pz7o)qf zRV(!zF!9m%6B^t`G0!=N;UNVkWUrkIo|SoSY)bRo2Iby~>ku)|jWsk+d-x&wH0_Ot zF}FQJndv4m(~~!ZtrKx6+uI_xcRSz>xWsgqp$HzX;UNcJO(Hw&@o@Uea-T4kTlE|m z;)~K3EsT{uRlu*dkAuusT+(cBAX9`t4w>2>T#L-wN?!$*>c0mlx>4HaF5tvI_u?jN zpBNPAyUp7wAN-Z~4*A<*pZ`MMP9Q(GrD5b5=`L@9i8l-*AxIG6k1+CVz~%Isk-t!$ z-K7pFc9;73={WKWJLR~^vNQ94v-7O(468uW=1)Mew>tNMv~-5Az|WVsI$VXs|J@nZ zAvMAum*pRK-m2$zF|d5m-=nydPnkAe^zQ^-9xArshP+lnxBsITWYzb$Roxq+@nyYw z7;eO7kHHNM@o+;x+3aMEp4b50;bfrAJ3gPNy$Fp!9zbYEGCl>Ca|Z7FF62Y+>K4pU z2rj!)xU~UP-%mb{te(iB-nlJo*|-i7Pq}&))9vB?r(B1!SBSAzBefZ>{^jf*SBga* z19&)b;!v-WeDeX%!v&t$Px}5!V?IOP06#*wXcwuTBKNzUgw8mOjIBh0Ww=!JXB?-i zznMACl&ZEM^)6hh`m+T0G2jn~lj;{s^`YBQHLpP}IAb`qbSPwomxj!A;415M$y$JH z`M9dbAqxY4tV6jDGJHxIM$hLu$nfkEBCNrcC*yJa)KKYQkPjcmz~K-Bhxy(z zgn`3=Mo2Kr;S2(fEN;tJ*YKgcK*%ZS$OnNiAC(Ib2<%kKRHSu;SzC!0%+GpqCcDYi z*~r;qjD}Z0hY$8fQT$D~`M)D)WzCm_%!XSR9)e5=Xx+$v|1)wn{C|j?m7v*3VQzO& zkf7N}P2L1jQ$e%!=T6-Wq!+mZzrG4>b><~<;V1*y(=Cua-2&OuEs#Ck0@>3okUiZ3 z+0!kMJ>3G?(=Cua-2&OuEs#Ck0=1``ChjH^ok@IOXH*!>=!Vt|7T`Bzg zP3FSHNz6PEuiVItUprWc-%xNKez5`EGng-Sn}qB3D^itM$0F@(SmehZEb)oy{Tb_-;+TOh050$J@A zH077MKvug2vf3?>)o#Jlfn~K1K8wP82eR5NkkxL1tab}zwOb&o-2z$d7RYM1Kvuiq z7;DSw7PN<4-2++e7JLFs&p=kY1+v;LkkxL1tab|~psv1wtab}zwOb&o-2%1REgJC~ zIoKW*fr?MSzH%F_L^DTlY*cK!2e?SVcD@zsPPmDN^Q_n>8Nf|7oNL9-F92Mn;8Ym9 z6M`$hTBnDs*zIsUetQk$pxEOF0Pdt=R2q-?>459La%eCK?(Xj&lps4+cvBJbb_tWu zB(s3)p3Vev-H5gHQ&h?ol^(&Fq%sIUib{V?r9bly2(w(0SwQ75X9I3xjFIw(HJ~y$ zcnT>wEAXSJ4A)e?MzoDTBFu70W&xGa&Y!qZ8XTjjltIGbXnlWN0|}1}itwP2^H!GX z2}VL{cS4wSlFS0CQ=I;|i5*8Or!?U0q+lGWw8D?#ZMvrNE%h`b%yLO)0hPJVMYxF# zA=hU#pfV>|kCYr9P_3w(si|-e4F9Y!%O#lwRF*og;U@MZJ|g(b8&Fvie1nvn`|+cw ztk6_i1LLm@vs{u{K;?2L1Jbc;VY~jd4XCURIv^!yUzW=Cn#we`%(^hkC7A_OZgIwv z3K!t{cQ&B1J~*9J`r$|MvQbl+fPu`vJIr!PW&xE4oPJQbYO@Cwl|&;emd~7zD%eh2 zu~%9DlM2S3xUo`N`EweMS+V=c#Vb006njWA{Vfd#R;-5U?I8~qP8>{zjP z@GaB-RKw^sFB9IaVc5`Z;MU)xV7OuSlKX?>zbsxaAHI3U`n}9!;0$9!4^`TjvuAFKQ-0y?B{=lNhirHsfh2`&PTXQKZr*MKd==Y z_P$0DKVk=eAT5XPL$*{#ptGWscMEMWZiiVm$xI;C$aY$TnRF9c3r@Na_oGRr?O+hn za`?4Fkt#H#KBXZR*eXZgJv zlB%_XYNX}t&62{l#jMN9D`)mPJIu04W&){0Z08t~T1J}~(vZ{ud@Ld5lUO>%h~7?O^y_- z0EGN08j(bx{>oe+a8`q8jYbQzINA>KAX3ghkXi9J-SEfdkNylhOoo!o1pemQ&T!l* z{^n^?UXhjVj;~(+LXCj8BkehMFq5>K<44h6WN5$5?sujgCb1+lfi?~x7zCjd?eq4d z9it!@8omo587sr-1WJ$sD?OXN^Adx|Sm_(d`{f3aZ>8t5|Kr2}RRjwCorr4<0t)TG z{)CPHB?kt|^bB^3^(F_l%R4Rs#BBxvh0bRi++`3-=p}YA3Fw@2vqIl(guan2w8;)r z$|N&E==*KwX51;EAJC+5G+(-u8hS({ATJeqpB+3w+Na}3DRir$eG=RDF*{6RNoE4= z?Y8qh?$VoRm(OWZ<%-l(b`Xbr*v-|Ddclx-oc;7gJIu04W&)|#ZKpf#(wnIHw;Pgr z%?^$ssZ#tXu67tw6&&|=+F_PWG80IBXglZOE}aH>|C5HKKCpuuk(M(RKZ+E#pJszt zdB0J>&+RbFCYcGO@MZHg+@%L_DE_`7sjuzeTcqXOiyuYm2Se&cK5zVJhgmksOd$1} z?J%-7-5#L7uOX>l?VuKEIe%qI{b@+OOMU!hhgmksOd#cioXI5hI`tTYltF2=M?wL= zN9PR2kK!s8(gMzTd8$=T;{cIA5-UfjUOEwVEMf_~1!S$4)4c4~m~$A-eJKgmpBXF|xijqE%P2jEXOw875(wBTt50d_uNznpFm zU}rwP)+~cC?9A2(&CUs-;2E;RBdwKo<{EZ>pg8kFVb-5yCa|+80Byfv7rri zt|os=4Fc@kK;2$o5MXB!`^j>HFzj5c5t^MdLcvIo&e@q|XQg51OFT6Dt3qMcpJXPm zvnJ%M#$7s}ma*25idgBN=?<>d2o$6tTp0@PA?=g!qeQ*l(0+;TdtE3@Vo7EK?F}Jk zFYc5ty-kzC1AltOC&;`}BlN&`YbeNpd^t~LX>T&L$FWo26AF`9l9}=={Vk#37TjeR z@#WtesyLV|7MwD}^6v|kUI-vkFlDOc-ybS{l~QMR?z1ibflx&i9zEh2Qt}@RH9Hwl zDsw3{|4^veJ%I8uqbbS5p$bg0TZNhTsq;rd6}?~^C7ID*fy$$y@+E-Et-KIAp}#d0 zE<>gy*(u}!wU+Ha9!d>`b!AQ<Uus{97f*h~(~JsWD;1)Xht=2sf* zbD^qp08PvcV(rg|Dx2c}l+04f{6eVeOhBh(CKGxwR5=UHJTr4Y4fUl^(^mk^$^1aE zUJjKP!8Og#e2;qkS3>0z0WHcDvMpW>Ro)F~ab^#xycVkZ9njLu3fA{}sA>SpUywPP zdVC{PxeCzo%ns`D%~0k0fL3MlpeFyVP(^d}*VUQPbOUdPTHXg}O{N!U`R{~U_J;wl z%{cE_d->VA?>$J5uMNbq4LJ4 zcb`?X1^?Ixa(+DaLS^d|twf{DHOO2mkB#T=3WXm;=HlN-{KHT#GZb6Y&p#EQ=azz; z#1eGSpahIrfsbE1h(hF0&>dBWgF#?566}UZPOuF$+~66A?gfvLRPa8O8U#~ODjIY` zsaUWD_wnEa+~)*bsFDb#gF-SW1%*^F9NeUX!MJY}T!H)CAOWT21s8(V{2&H=CRmKd z%LFImz94uXsfB?Jfr^6HU=)pmOF_9fn1>;vBv=7Vli)6}UmDm@S6L7SKjlGFP;MG* zLY@jMd=^?0tI*bh_h=-V4ie)hfYGKJ#%pb? zJKzcp=U6dry&7$%;kXt1lI1HkjMv`n?EqJ47_YrM2shU-UV9hS0B)gS-->-h{#$Ao zufb*Hw_3xl6)Pk^tu&0+;@>D=YYj)N*w9+QZ8VJ6QdUI! zWr-dVOkuAY)&)ccszT(HCoo0_X;={%;4C2#Qc^?)XNeph^g>rqoE@PG;fS@^g03KP zq~-)|d@9>usD{zT#e|1x7;U_U@KG8@8$Z<^@Nf;Ijjy83j8JeGZTLIWN9uI6;ScO1 zM{5|GdDwy`j?pkQ^Z6>IkJ7LbYKSumoaaz7CDiDwP{#$EDHOMWjUKNHm07WFRQEUq zJLstQ)3C=Y7^il|u4TtRLBSZKVrS71C+Kul=~#!8)H$qKRXQ3W^an9n&G20&InE+(I?o2W@;jE8H?D(PE)XlHuu;C zX6baOyA!+oY@Mz+pYEK`N?4PsWNw!8`N8X~q?~QCpuUnnSjocrO1iNNoKauNXY5yt z8dP$+vxk+iCRNE<*-Fj{x?ot1^`N1gs|w*Plvs?;Zi$8=$x%#ST3?Av_`C*{EOv&0 zQVwfUm7JfgMub^djMv8iogI zPtB~-Fsyd~t@RQO!+LpkYxGhL!+JB+%w-ye^?pKnt2L~e<3cBcshAu}qJ+32E5ud7 zOeDpYc1NMBRUy2b$KIt|yGFwp2KuwowVEh~foEu~*J>En%#*dF*D1J>s&tLBjFqxx zRq48Hr8fm{v(i=HqtMN&Pz+b>nYdNKcqE`3ywTaqN?4Ps zOX=(zHH-nbmezc?hMQmjJRR^R4PyX)nEm)34PyZQm|bkM zhM}oxgturI1MpU=|6UEl=I){)-=|^pCZ1*(yk7^=Dh^-nnLOiBnBgEqxHbQLEuo2=34I3ez)UXlaDGeJTwrki3@w9@q5Dz;G z!D$X9Q9?YMZHX6x%2Ff5i<*cL;w23mAzs$75#kjM8zElRFoZabntV;eMu^unY=n42 z!$ycVHEe`4KXA>PRf@ow-{R*3gB5hKL=8a6`g(y$TY0}UG?KGd)g z;-4BeLVToQBgDrVHbQ)&VI#z+3f4mGlxW!;N}`1LJS)VWpm!NsLR{9jst_LyPGraX zP7{R-=}#N}Uc<^pzj2O5$sESvDxyDRiT)g1mL>X2J<+4+xBgX6bUwb+Mt^NU^e1&> z6)7vC|IQNK7ZjHpPXADaaCUNRWmgdSQxkzRy`G%^rD4}f?_h7WY>jZN^w;#hIR1Mj z#E9T{`t*M|y5ab5LGT?H9q>O+S5%g>5q!v7IJRF=jHDt_&kp7yF)cdtb-5;(Jx#Id zz)x<2B?f`H=g;Yvn-~P}QAG4J2(Sdp#fPXXz)}vGR{Zv_=XanTjIA{M4$=krz2y#abEu&N zyS$l|57vk@b69WThw4$cAWyk2Z2R_8x9>paq^MQJkPIt%z5H^tsf^ks4t` z#Mg)zY7h|dvED!oGYE+IPa=*o2qhvukS%}|Ih0e0h!fOJli&pP->V?vX14YyQxFrB zBS`63gTMskj`l!|HV8~mUP^V2F$nbM6Ug3JgD6H{WPd)+Ake{=(S(jS2q-d_4=Cdd z0*bWgr^XuuI`|km)e{T?9lSq#JkDDeH6a8eJ&lMH4FVl}CK;P(5cs%s4iS?K0*&$3 zzk!%+5O4twIX%fB-~u`mF~uO@0#4Zn#8iVwSm`6k*ffL4K@K8LHi)>Do<~_uF$nZi zp3WUTRUK0yH%7zA|Ri$<}~AfWqWS>z0ZfbL(Ul`Jv{ z=zb3oXBq@_KZY`&Wf0K)(QK}>4Fb9^WZzkA5YYWV_MLMK0=oZ@UFBSZfbM--+7g3+ z?k{BDS!xi_eUjFCoN)oX|Ox_CkYz6FQapxX2*T zL#NQ5ml*_l=oge_xj~?Z9!*X!HVE|4oy@VqAe0T9hRnxHyQ-mZxInU83g?29ki004FY3aZyNY|gFp+%*nYPd1X}nx(zw+i(86umej5w| zE&LDCxXmEY!sFOnw;Kdncrp$A4ue1o?_tlo(;(2od#Iqh3_`W=rMB}28Zn2>tXlZ) z`WD`d1JqlY7T%%@vV}KMv-cWGXyI)ufVj^f(8B49fxsE@s>#v9MVQ)+K41`N;WzP! z7JX17!f3yW0w5kT2(->ZA|5tH&^mt+@rXg7bvmbjc+?bu?*GIaZgi_bK(p`V1M!$a zKyR-T@wh?QRtb&@i*D1f`Un)g2WPNDc{$XKQp%I{N_pN6`XEs~?7W~0@^jL_>7e{# zLrTxt&R9|+IYsH^dP+FW{pu_woaQdN;zROY4#_ypT`3PuIh~FDmPUkB%i&n{2S}Rq z73p{CNxzGh%aVRi7sRY#dOYpueT~3ggXxRduXY)PBE1vx!-#W8Uy=T>p7fV?Fdl}K z-bj1ftqbxqZw))sR|bKBd1QMazBUL94&&;8_{JbGIILt>*<%nG9R5wG{H;M?aCn0J z;#_#83YcCK^839(!1VsZYWErhOz%{7*&hr7rq_f1^GAb#=@qbd{bUeuF0Yg5&j!K4 zfsFlP5HQXKeDeO6LBP3eWf%C>AmCh1r#^l&2$=6w7Wub9zsC!jmS}?|FoT*Bu)B?bVPmY zBxx@cI8aOa7Ani%kF+ouXoP0c4LKFaoI`SoQmmd*A{5+5O7g0gGzFouH>shNMj$vZ zeHiT_Z4gk|95!wvjflb+TcCnyuE_zncNjfooPN*pz@GY0xRJ9P>L#{6?g-6RGy__{G96y^MbTU^%fpUiuePRIqER z)S;k<8*GD(iu#-(&MyiP3dNOk{diuUv@4Xf&Lx6-Q%=kZRrM75Pitw^k2`? zUG$^Rd7MV8D}9chdWXm9sQ#rHy4){3PU{RRtzZ*>DUuE;ZA)Oc07FY_34A5Mh|+@z zd@aDJ(mm`JKYE-}8C%+eCh@z+sgUuR^;Du`d&TAaY`mN@m{y(A;v4h zTL8)NKsmWNi;%3pr6=+dO`-Te_L2@{FX><(M%z$ue3;+TWiRPq2V8>_JO_-cjuA@c zq}rmG7wLrGX1(!Kc_WBga;{J^RXJD^dCFDQZ#kf*c5~MU&@|vr&Z|+XWI6i6#$Lt1l59klQ0zg8PNUGMvF``7Sh- z+ta%~kR`u(RP}4wF(<{s>HMRV16<8YLengCj z(~7ZMd3~c)^S_7{<+r>7e8s1^K02t%*K*V>U`D&u22;uPJd(R|9qp^-rRXy86Wtyr zgVi!M7npwTSc9pgA*v#5NUPOgL_g$q6S-$Glaf15YxTm-Ma0ykv7w3XBl}dj=2_^r-{aNW9sNyDE zO8!Sh{+|Ho1$V|##kL%z7w|}E_knXbz6qn=b!uT(Z zyBF|AT(ytmy;I}5J=9ZC;=`T%*>|POL9F|eNcbmme}Jp|EBgUG-UILpus`7vX6ZfH z!gE1DY>G~+8;AgD*Fuc!_6GEEg4|Cb*OPTo$YxPU^e!BqgG&@bU->^2via{6B6;cG zw8dFPcYrB2gT$AWST0+y4flPwmmko@F2Y-rGO^{|*{)S!q6w~^6*Hl)*ml$2-?y&VIfDSLBm@&F}DBkUQ z@V)~`hd+3bwd}d+M@jHbBpifdop4$09k?0}EN>$zYn!LT!VX6Qhb3*B?H>l23jyb% zIB|8lnRwtQn*%L&yeFDy=3DJcP@2PBt;#KV#@J{#Y^qYXRyS@_WTO8WlFekbZwDM3 zd|DQ_zd7{OsTVXzHRjM4sm2^;Lt-yNo2_ewz8&h57iPci>;Ht~D*JR;gk-DVkQh=b z^1=#R(TUi;linnFKyzri;6H)Yd-OQH2Kvk_|t7<;DxuNPPY?G5JxrLPY}lEW+i z{+P^&a}o=v(}bMJQUdB^AeZ+}WEp&psWUsmw?7iAC->dOjVUsmw?>+$qg=*tRTUsmw?vVzy|1bm4vD|mfb!RyNkUSC%5 z`m%!8zXkkM__Bi6mleEzIo?mJd|AQk%L-m!R`B|=g4dT7yuPg9^<@RGFDrO`S;6be z3SM7U@cOcX*OwK%eoZmDk1s2DeObZl%L-m!R`B|=g4dT7yuPg9^<@RGFDrO`S;6be z3SM7U@cN$?zzls^!RyNkUcWLI+d^2LUY(woIG4>N?;5_mYxwf6;mf;*FYg+@yleRC zUBes}?As#(><5hbz|Ansk;yAy2Z)d2!L~=I@q`OAjWmXF+Q)=1L^hXs;}7BI6=rkT!KlE}Tv+xNybkxZ-qNaXPLz z9ao%=D^AB1r{jv#amDGl;&fbbI<7b!SDcP3PRA9ebX;*dt~ec6oQ^9_ z#}%jJiqmn$>A2!_TyZ+CI2~7b6{q8h({aV=xZ-qNaXPLz9ao%=D^AB1r{jv# zamDGl;&fbbI<7b!SDcP3PRA9ebX;*dt~ec6oQ^9_#}%jJiqmn$>A2!_ zTyZ+CI2~7b6{q8h({aV=xZ-qNaXPMYI*w{4Y>9C>n@P6BaDUCikmAag7_MxI z;mVd6u55|n%9a@JS$IMA-8u}Gfh${LxUwaND_df?YD)}F+|9^#JMN#YVTUdcva#Jf z{D$1?fx(N(v#8p?h*labW5+BFc=)w?x{u1%EWx$Jm+gm-9lIKIj!m=o#NKA=ShHe?4vN8;Smn`a@9*T8X|jd$?5Buj=mw=$;X2hJ9&-nz125Nu-fn>4mJ>G(@MK)^ z$!CH_T8^u{3h*Vka`@hP7BV^EpQqOKNt}mT*P_-Wx6j)!1v|zzP2!znP?Fn5F-MZ` zmAg;k{(E{nO;Ie8kkf0+EN43It+oX+j^3DUgDtuZM(H-#{BV66sI$rc{xR;qPdmqM zHxp39-#3NQyV>aGXy(($LGITE`U#?Og6}{6ZFs!2%Kf1`@vqMB%zul6e*9a^iXH8Bm1O(ZHOSUJ zyl=m3ofEy8t=+r)y@~B+#jd*-26J4LgYgKUk1X;Bf$bx8P+G zSMG}drr~A^uDl%p&d1G}1U?1u6K=l2l{Kxz47@Jb%S0Yv<wh}y=MwmrLuEMQ%E=%^75fbkN^(lF=x@3Wlx2Z&m!^62cj|;S+5d%vpOE7RT)8ncssBLOa&hGq z04T#vF@a_P`r)QGf%X6<;pPNfjW>WG-GemKa}~Oown#IT6cI!-Z37-{ay0VNaomfV z>(xJ->bE-}BPNXs$sp-{s`BjD^k)c7sz+$ftYp*wgzV?zo$QYWBrzxz{)rSC0JpJW zW%KY$11R+G@$0r=^sd=Ifsgi$(@429yBg+c0sF z7N0h?l4fHcrCNQeyuVxkIdPqp39}i324FBa*veUTv0nAWloE1KU}%q@}ddwa!op``O|tLWs>Jwzx*zP*-H9 zd9U7|4&FwQS9}cZyYV1RQ>4hcwNo3?i_^B1AEIH1AIh^FT3nOwIpPmMyp|?rPN3@?hczqXgX4-F~^}& z+XC@f$0+L^E@pToQZL6P)_W;f!0ZFsKw0mxlI2b$-;PUJ?`Xk23;1#3WKV4z)|QJ+>FGfMxoM;Aiy6!pxehM z`$R#2qtGeHGL2<83Y~+Svk7n%x&k+=amgsO5jVHvQXQ-lsqsgg<_URElNvkNtH|;) zF6m&O;pP)u(!u_Nn_mgAgOxsl{)9_9SYO=qB4Q2*9%!B+|8JdUK_^u90P=_UQ%9L5 z1gFKo1vNAQ)W+k=9RlDC+{`5~3cv>3+)Q91fah@Y46d@70Lqu)hs4q#So5KU*l zp2YTN_TB%LePqMz4@$@T3fbB5a$ttpYW1*Aw=VTt`)b0YgYP8|*2p7&_F5KJPZGUau?K#H z=GuiTU9*k3dq^K0-gGs4cAtE{G{6$9Of}&;=|-_f@qUi0!aP5+9xL$zYpa&p3NgOH zg<$OBQI4v%YN@R~%C*LomcggGL2a!MsI86EHX6B)-oG~1V>S7l?+zt2A^Ee{9*#$? zf}7y}`G*|p&#rK0V^$*f9waORm4&#PJ*IOpOCEPBx&qi$xGFiwH24d(vI7}mo<#CC zTr$G!!p%Fl@;JhHTd`3+E*WV|;VQ-oaHJ_gN@HAV#4*YJnamNV1CrV^SsoV;H2?oG z>VQg>k(3neN~bvm{BOYqfpmXd{|CXQAbBz_5$s&tEW#y%-G!Swa5WI@Pb1iqNZE#~ zp7lFaLK>?1v)8u3V|g_n zl91GgNukGZz6Kbm<|_=4Ly3F?$nCgV@ih;~$?{$_qBUPtLf6`2aNQpdTQ#^^)8s?f zDda^!EXF0HP*>EY-VOeTaL=pppWKPFQC>?rDa%SHZGtyw+_&7tT28ZbXEL|`v)A(J zP>FMz-JhJljmlrf)r#X8@{c6a9^Q)Yd;m`_fXUk<+MGQNlFzf9Hb`x&sacy*Pn-7- zs!yp;szN>Ordpx-b|W%SwhhnWxZ0bdtt;`S9>Qu0R@Vn9y>Mj-$52`kUS#L9O4ZtY z#fN{2&aygIHe0-S`(H2vtA^7kt95ltRCOaj?5O{)4l5v7-BhHUw10IAv(=sdf2}Sn zf#UCCr4s1-Eb4ExGM^22tM7}N?6rJOSNa~U%x5twUWBWan9pcsKKAha+J7k?%36!Q z$0_1>Ap5Pjl+MO0!+8;i=W(@t26a&n15s0JX$)QL6Qq8K%WC@uve53QWwV^1C`X<^ zGOt2Xp_kyMSTb7ZH=!^VD9La^uEgfl^C?N1=9s--bF@63W;fU_q1}u}ra_{HS$M-y zY8Y(yVjHwVtrfVG8V1`(D6x%YdfQu>9c%lrQ9%YjCNi?Wvk}GZ33_we5qt*t8WWteRFAdlsor zZn{b(yZXw#__|#qx_wLvmn#Z~;n7=BxLi@-d`#$ap-{_7lh7I|RVx&(Quh)1 z)T`xQ*dGHTPMDJz%CHGb{Aj_g zlK9u=_5YqQ*ZaatOoWM+=!?968z15HhQQcTz7sR3z2u#na3Ahg)SW05FyUN+j)y7s z)q?Wo;-4GQbLf$40eO*|@$1xq7`Bz4fcwbZM6BmsWgZJSmw^WMnZE${{!91?e5YB! zQ#YdT495I-l}9G6*sMvXT26BTA{I^qlNt06kP=~DFH(r#xC!_5BPT-}Icn}6+pP1e zd*Va%Tq_~pOB3?FG$G$h6Y{+@A>T_A^1U=6-%Atny)+@;OB3?FG$G$h6Y{+@A>T_A z^1U=6-%Atny)+@;OB3?FG$G$h6Y{+@A>T_A^1U=6-%Atny)+@;OB3?FG$G$h6Y{+@ zA>T_A^1U=6-%Atny)+@;OB3?FG$G$h6Y{+@A>T_A^1U=6-%Atny)+@;OB3?FG$G$h z6Y{+@A>T_A^1U=6-%Atny)+@;OB3?FG$G$h6Y{+@A>T_A^1U=6-%Atny)+@;OB3?F zG$G$h6Y{+@A>T_A^1U=6-%Atny)+@;OB3?FG@-ti>Tg5Ih?@?+hcTqMxW#Rhp)o|T zgH!7Kvk(B0t6)26r7j_yr(rD6nLB%y<>qTR$4aeUiS&$y<5udj^8puVIA*2VUj(>N z!%-_$dm-Q=4F^{0#tQ&9*067-E?f?{Si_!`I$;su5)HdnYS%)*O*HJFe$p$|aKuV| zd=B6;4dc7Xt^WXAuHlfC`jK!`4cjPxCg2JULkW!{Zpw*bZaepF*l`|re|IYzQ9Txv z)-uS&oT^eT4oM)xprciA(oNJ|8o(H(Ch8tO_#$>vk zhSOH6croDi8b+gVTP?Rn!4W9A{R*Ua(CJvIdHPJt?WjTM_?B~#+)2aG@i5BVS;Nrr zxTSy((lB&qzC@CwV{jx*{1Y1dTb7ydJNIlV3lysnieMojG z6+KA9ifDglCyA1>B04xr^zdL79${1K-bbM$G$$oi>N^rWQp1HXX`0+nO%#$eB0NmN zp@fw>g87e9a2O{464Qt4bg2Jms&j-+hkEZ~`beD)O?-L=;G-3+H8I4w7@XyjbH((i zEYo9xFUjdhXW7P~Q zWzDM63E4^~1-mdulEU(C%blzXm7%i^M01>^;4n3JG18~#^kOUJQnOPv3?@ILrlx7Q z$VzRe^Eg?<(DbZVK<^XnQI+4Z~btXZ|xZjE;CW`@|v*!%{NzD`#pL9dQ<&-B}uj z<>WB^Yz@QN^&-EEH4JB$WPRso7>#}g%b%-Z)#wwQU(vF;YIJHhZyM=B1!L+XRZFE^q+pm1E$JW55YAAOvLd=XOLS$xo!3(tN{$6*$S=c=c(_Xx zOz$v@Eqkegb)Q(_+(4qFtcb4861_5bkwgz;p*5-y_Bcs-V_{BLDHyDfvn!l0NQ9IW zk!!L%4IvpLSiZ0|%1&0f)6n71C@6!3vF-|1?jXE8M z&;8fjyA_;-VVurUbd!Q@7{*xAzemF`jH^c?|7HyNL7(!N22@h)+LY8ybc|^nT7FV*l9@Q{}evQ_;Rl^YaNHY1DhT$zn zP>9Dh3_~19c$s1IDy{dNd<@CEou-b@CkIID+1H9@C#yFt(0LrRa^G(=e3$1k<0_FqHff`F}yfQ1Tz-=S2-GCExGN zg(h>UX{F?svr2v~D8m$D>SI>&x-JAITU62;8ita$vXVD73?;up7x< zLMeyPCBCC!^JuX{!2w(lgS6b8x;%RKr|hWjY8Xmb!TR1)Fh(c#saKuu;53(#C?R%b zh4^Q%ltNrj&3vQ^(S>ZJAN^RvVB!>7(kB{5$8APG_^F0fB_BH1vl7;%D)~HH$?o7Q zR&pcN`&E4~%Xz-a^F(h zYcoM`fCT9Z+u2Uiq_0S~tS61rVnUdb&Tm7rX>%ayw)>G@!+z1OA?a4OQ-;#Hq_0Th zFdCz>PEZ+1AHjm1bwPBFd>MZa(g+T~V6r3RCnb_ol(1Wwp>#O5TO+0S*z!jhp7N}G zaoyOLONk4G#OclJyP9c-c^&wdY-upgFC$}?tz z{jdb#qgSu}8lmLuI2=>ELh>(?k>O$nW$RJ>8^5nM6AQU$^SmdMtFw3)h35w?{b4M>|sAF#jjxx z`(Y`BVsEAGoB|GV$)jQq=M)+C*4n}CWbe`8s2p2dse%|{cub#*Ev^*87&NxH5`;GB zYi#FPk|upc8V4L1(l_HUa7>QoH=$)=*QzY(3u(XDwJJ;cJX!^Itx^bB__Z`7>{_J| z9KC3+*tJR_VBr(_h;zF^z{2~H#vKL$3!g*;cCAuHVBwS4DX?pmLcqf1seYqIV7i)? zb(8H}1*UT;mXc^wy+m8=;0WYX65VSkL0KZveFgz#iA317O4Vf~!md>cVI;z?RSIDw zddMJ*L=PK;k?0YFFcLj#5Jn>GS|voaM4N5rWZdRbEG5z7^%6a42jvJ;RT4dAC>e>i z8-$VQX@f8lJ!23?qGt`lNc5aR7>S-Y2qV!824N(6(IAXOFKL99=n325jyAazOG)%f zy+qgx>&L7_Zx~8OqBjk~Nc5IL7>V9C2qV!u24N)HVGu^5od#hfdeH;Aodx`=RQL&cCeDx)(<6nZ0A@~A~{9r z2TiH*T68-r;wFoRU|@@#c0t0dZy&x{v)oZ2XlUd&CM7UO>E}W>6Uw+$M^is(dK+odBx-V zaBXxp+4;cZdt1-wLIPiSeE+G7o;RNEdO7snRYa=h(edwjwhU%Z*)GjPXdJR#nk$o;?J0~mxAUOcO}og6||_h zfVJa@z+q^(#l>GzZ*?kdTk$Vnfl6NmZ7<&ZC7^x^dan32LI*48rQ$CM^;ghq#Xk`m zprE&klWg-t6tuIrj?h2_?J6EaXpn+FD!ye8phFe(S@BbZ1}kWH@mH`*QtvAA7wGR^27+vC8KvP(Mfp>&(=(QD_~B`Jch+8$kA zpq?dB?r^&v40Z5TD#;Ovhjrid)g&GP@*ptSZ9}fLCU)o*xxRh zO{@G$frIRl@A;zlwE~BL4fd38?8FJMjG=akxQHKZkN#pGHiV!nXu?{VUfKpXNd=!~ z;M=XTqd5cjlO3j8D34H(f7y+gp*)vv;a3f;#CKTtHwAbRrt5Ez{=9^b=YfPQ2299e zz=SLYOvqxuge(S3$YQ`m9KF~}$YQ{RECx)-V!(tf2299ez=T>1sEG&piS{J^*A_Uh zMB952|CRUxzoEntn{5lxbtm0#~5{0l3JFylv7D|kSS%woI0Ut>WL)A{=J9L3mVj+Ihi2?XUc<6Cd#35mF zkc`9*bKb#CYA3}WB9C?v&M5r~2OB$F!=medRP21erYTD7VcpBqvvH42b6*6oDt#G%NEC-< zTCvsXEdc!J(N6+c6WCXe$93KRrGWsG@w#H5a&@y`8cW9v})0YEi6CLvsQl67+HPN-? z?M=znIhwz|d$uI&AFsbfab%r>sb%9O{k476(HhQuL8mz}-2mc~2{&0-YDo zu(2iKgK%Hj1EzK=ZmRf$3`gOg7dhS}U2Kx7c!!id$d3)tO!{5fblxF_&c%yd1)w=K zZ^%AG1hp@SD&|7A7l05BsC|{fj)attObVMqr7*4mDZeA7Iom{G8`-!cIYToKNtMjY zrmD|_lAW2-7g^bEDkWR6N(9kt9l?xL4BJ#?yvEdEsyUr`n4b+Qc~HYOrXU;kz#3R{ z6+0p_ZZa9!&Ie>f^1CKEjwV&fyhF-gDDOpnL%Q?nUFgDH%Xb2wjKo_z6Obdi{Z8A8 zw@EAK_UuLgZ3VES{1zB*CqO954~6me0)(xgCf*{jD^Xf@wrg2T8?a)tXHK=^)v5Jx z?2+gfpQAvlfHL?Mm8dBm{b>VG9ZCxUq@pYC0MN0B;^E;BT`Jy5`M2l@rgSY~H!g|p z1JChVNvVuZXbv*ng=Wj>S?Id)9^xR|M3+#Co>8`9Tgz#EH=tf&$`|Ct`v#-PstDRo zxs9j@dawWyC0l<1d?ob&AsdedN1(z(6vvkH$0m>+7|sE;WL|toaCesM;qnBH-4>}o z{b5>>RbQnw*`fJVvnD&NxhTSFkrzMAc>$zyC*r5&^>D=T;VsCr74(b`4wh6Q_K#Je zYi>r`NRcux`ZC6__|c+_!ssPKLHC%F-(Z3z(TCw*;-d;U>XoZ@I99S%MyoK?#YYQ) zmeDk88Y4h;v^7S7_*em2MYodland$zl+uqE0yWX~*=i&qTa6@StC57-YQ(v7IJVg<39m-6 zAd*-R42KP*-dY193!9Ku1e0#5)5CzxXIXqhsUmDX%i=@T`Gn19S$wE^i?I1Diw{*? zB$_avWidE$@JTFIuSIyYvsy$F^PRbYH+x#)%?!!4vg)=Li!N(w zxgT7O)%9~EPpQT$mrkCIaL7t1?ALl2E|>n%i>!p9bocNSZ1>4!D~Fk>N1-5O(CNW` zZ1?HH#2)8UF?|N}zUMyP_e~Ds{S@9GtnOFyzQ1(Ao@01FSnjP}0||6X(?Z6ALp->{ z8pvmF(QUVbsoUEi=}ovg-pJfN#OZwi_u>8;)(?~ z67X>1dK1@FWSR+h3a&maP7S@lx8cBUQFl>aVx8Ulx z6)FJoC?fv^;%8h3v%x|SsQ0#!Plv5xxUBw9z*Zi>g*W6QYT*s7`!Fmpcp5cs+jH%DhFqXArDg zleZH0{<}mR2|DiKc{k!dkO)`zU$~9NB3?Qufy8ls@AMjFn3>TkaRy0xxe7**WSl{g zUY>>%Rt|$Cy?hPlSaAkPdKnGJtvG`uy#fu#@Fa8*;6e>Y@q}_A;35qNR-8eSUSkbo zYcd8&dc_*{tT=-ty%G&$7a;~odQCL!pnlRT)o{d$Gf2`a(=aw5VUVO(uHldsXON`V zRKpm086@ddXc$UJM7)&K6`Dzg&}~xuOzc%QqIxVStz}RL4J)Npt3n8pj5A2mYo&?g zTX69x^tt`%pHq}Nu%jjT9>B)xVTPFryXNqX%yj7H%%Qm;nA2$GC5 zNYd+|(_>Z+f+W3;8ibA+BqJ!T8o2XQZT8r(lff z)P7Hg8%!j}<3~~Mm(~6NiR+CsQqnu5o+u+Fy@3iwq-30tlHMQ7i>x>!CB2h13{5jq z(mO@Lh?I;oQqntBr=xQ*Qqr5QVF<}cNpFUR(YY8Y>CMzIIu|1)z0)*|&c#ScZi86C@CwV%N0@C`w=c;Ww4c$87}FqQYGmk#MfP-V7dr~ zOL~_oSa*yS&Q4NZlBK*_Qzk)BzB2H9P-e`ew?>sj%to9s8{Sn4Mml-C!l}Sr@`Eg; zYqEl07Yrd0#!PzGA3$VX10vTtCy@v#DM4?{61hdm_ z?3cG`xQP{KXoPpWf)O(rXUwE`hfYTqV$7s>r-BhP8Ryqk?=GDmU4$`{-bS5{F2I;c z?`{PnW-`v0NpF*a5i=QQ%%pdZhG8Q7^6qWcu+r3eiF-{_QYGZQSs@dq%;CnT#`L(tB3Hh?$HtX3~33!%#9~CcWo13?(yW(tAO}P%>jCy%#mClzhK) z4>Xx%9I#UI%ULDA7K}k8Wt=gS-s`#$l+2h(?+pz@$&8uw-qbLZ%$P~eLED4n8`R}CcT}yJo-6fCcSqx3?(pT(tA(A`qAK3XC63BQW7P^ zuB;IM47O1S#!Px2sX}xnjG6R4)-af0%%t~;hS6~uGwFS*VWp`L9WFmgvL;o@=h;ej z2UT%Y!k9_#tNKb9GwFR@UkPI-y>IF(Va%krr$HrOI(49wWKF7)@3NKr5KLnwjG6R) zRE4rG=BEZk_B!X02q`HdzhsI07TldB^6vwP{N8}bug(i3LQ0CrzATZyf@*wvO*3ZF zvusrgJ|@kWNlcz-1dm)~Qz2$j4Ji7}HNVkQ*=Cp$4_60hS5!I(*S$UmI{AfIIQ zjpSh%F_SESC{PbEld%NqzM&0zQq&Ma-He&^5HqPLqi)7bdWf0K*3Fnn4>6P3x*0R+ zB@6VfQXEl z^bj*Cbs=Ul&6r6KF_WrtNW_>)4>6O1C{~ptW^z3%CkLu>#7vsX5i|KI@M*?OdWe~n zf*2#yGDae1QV6MsNh4-5 zOPVp0Ub}{*5i>c4q)A_qM$DukjhM*`NSZN|UT0kpog*#d??D=YafD1FW^z3#k({E0 zm`OtkF_TUTlo&JV9btIF(O=@a5i==FMxYSJOnQi!R0tfI#+XSDF_VIb;gcIpr0fMs&d3kn#vI~c`hqw%%q2yNuh+8NmV&wCRJUid_5oVMjM2we2hl0 za>h)0h?$fkx^l!!UeC(OfvOxalcsXSOuh(wK4K<4#7s&#Oy8#E!2mIng22}UN-^Gc zc9RgPDME;uG=vZ{nU5KdG-D<`#7s&-#7ru4ou(0(cqApnOm;-(B*`gCh?z8$5Hoo^ z=1o;+N6ciF5@RMk#7qhTF_US=OnS2n0zH8-lOAFwRSxt7#!Py13<7O(={25~=J;Y2Z1R9$$lOAFw6#^&5F=ooXN<$-HY4YTTm`PPcaf6u20Q)i|$&%s*F_VTH#7r(jqT&WIlTwh}FlN%b)KJoA zo_dIxlpKheRP3!bIShN38-!sGF_VfL!yaNL6+*Fxn8^)fk31^&5HraPR2E_;zaV>z zne-4dsS092dp7gGzW083KfL?nG<8CqsycP5y1M6d zm5rE5MSzFPs(zhEVDuV13o(;#vPEo`Y7t^4nS;hc%;foq%~36S$kzm8NsAu#34V(Z zGpWk*TZEWNMetjMm`O$OTZEWNMetj+(I@yVdfX@YEkews%Hp>OF_S{@T7;O%J5cEi zHcPb#F_RQvix4w83GX{qix4xZH2Ez;%%mdtEkewsBKR$O&L{XSLd>L+@LPnKNk#Bm zgqTT1@LTkPPw-oWm`Nq!w+JzlLhxFIm`R=~n89YL79nPm0&EdtCfh+ywdmizCcj09 znN+I%7VYo}ev97p34V(ZGpVxpEkewsBKR#r%%mdtEkewsBKR%Z?GyYKz2gzQ79nPG z7?K%mmTD1VCaHogLd@hcwuk{y_SarU|7=DZF_Ti3wc|SNaY`!#0r5H15pJnr9R(^^xllDd6X<9*wF_ZR{HeVwYrWiA6m)m@m zP?TcKr2Q|OuLRnp7&B?#D%B~@Va%lcumoLpN-<{Ae#PeVaJLj=Cha{opWAw+7&B>q zV)OZ@G{u-n`x~3jDP<|fOxi!$e4ZGbV$7udr_JYr;kk^Nv=KAO1^$R!#!T9XndFjt zOfF+4ZNyA+bvhxJF_Si8Cb?Xkl*^b&8!?ky;Z4nD%%qK&NiND}<}zl|M$9B_IX9Ov zlQv=|i7m)w%%qK&Nn(p~8_ofSm`P%ba~U&fBW9A=vRuYY+K8DXwmg?HlQv=|FG9zy z$Yso=U8;DSa~U&fBW9A4TXPvRX(MKm*tT58OxlQmOxlQ@*H&+28@}s5i`kY!6u{O-yA+a>h%N(uxW^*6ogTfHlip6VHBl}C`ux3 zfY(MU=r5ENE5PGzfdo1hNT6eZ1UeR|Ku0-d(#eeS*SE&`Zaw!|NT(R;;ATdj08vXZ zxY11tqNf<#=w=CGq!`@jW(#7b7~JUQh&8aY3@qoSl2qoT7~JUQ#$E&xNinL&%@eVB ziouO;qu9$RCYfSzqgx=_vQrFhbQ_CU3N6|O2{*v{m<(=oo0x5&&1<9EGu8wT2n7pJITbdr#yoAO$G~D7p_s zz5`O2Vt}IiWH_&Yw*>|$x=$zi0BMtAfTFui#EMf4P;}oAu}&!lD7tUOM?e_Wc+6gV8oZlFJq=Cr)8b~*{Pz7U#G3SuXKAjQ!7io?MG&UrqE zU7UtxuqdqwSJ}`Ti+)w zxGpW|$rON9$TT}tl%a$&5}A=5TfGF9+>GN9f=Bp*?B{BNV4vx;A5OEG0_SGr#}$a_ z1t@+DdN>enZG{`7yBW6^Zj*QdL@mVtyKq}U^b~)B3%3)*Nb&c%aC<>at#NUKRlV6W)FV9Wj(diwU@h{x1ke|mYO3Bt)F z&})0gZ1k@_s`WT9sYGk}E~TFe4o*w=NJ~Fe;z=LoOSiEw_Vm-k?B}wLPN@wIdN~7D z+lv0v2QbG{1e}}zXjQn0(sS5<`e?1q1QsZjPB3I41}6~fX;|e&_^H2PQ?M0(z3DAvSYwp0Fa9Bg&v(3F8cMc z*&A6SR(vHS&H!i~)^^pj4=KS5e280ye@(FsU|a){s{kd>0J#^5yP2m;9F^~?4(-7K zv#j>e;3{MvB~{LC<~zsGZmPRmWgVc*P);xU=(fCv>q959*S136W_7&K*_BGgF@ogQ74b=v;Ag))b*?Z-g(e1Nh*FR{SYz^?>| z1v*2K&WrSDuj~s^y!7ZjkXQ>)7U)U|Uc>^ut<4mp1-3xsDS%jDClWg(4=peQ;&KrS z^s#Z81pcfrVpSdwwHT~>gbHb(&m zY|G$|4NmEi%u(L8g>R0Qp0g-(v>Zfpw1tM20A-HWVvcdZ#{k3}yP!ztMaLJn!~0!coB27wM^7h%yBnF?qVLA zV>1$)B+ut)bp+xDFF9;nJF6A*`~=3E5P5@QUD|+~HpeIQj{3p%s2OHFnB#@CIqG*& z-l3Y_K$`vqG<*h-raz2KIxo`n2H97!EH?dbNc_pNI+%Eqx`7hBNDno%o}^eDjO2Dx zs|V1!yaujcr8Xa7J~nsDEOgT&PH9wUwZ^vcW+8KTXI85%^0ff8<-j&~_v0O82JoXu zmoQr@g2d61H7Xx_))GdJC*8xE^Y@h4EeFQ52x)Nu@ zi42j&oVXM@u=-n6ooy~zp_6|+xLwA8i;R`xezi6yV6reD5LdkOA*b|5am8pm-xVL| zOIO^DD(nQby&Fq1^MMInK(k&lH65T_>>+WncEH;J+Vh#ud{`D&1AzAg*^cmZgS%2Mi5;Hv@Rp7)}9Ixpg$4`nxLjSk^hyaN)q0kjVE zyVoHh7n;|6+B%J5^t~q_vJoJ@_XZNL5~1(?hQ#*(@x4!wKka+nU&bl`0NsnBBJ?n- zz{?=&e%5`Hy3Yh-8f1 zkdaFn)o!y~WGLAJ#CwiFtVG!93fo`Qv z>)9FqKLGA}K%Xt(`rdeH8NKm%_@wWRGF-nPfG3&|U`aBdo3y|Tu4~g9X zHC&rwbO(5m;rgnTXp1}?uI*oi4+1)IxT;|~kkbJ#W2pb%?q`(cFfD^ze}D|rBaj$R zgv0b0Bo+WWSFi5=L~=h)7jvPVK_{$1NAC$I7}CS(-iq+m_82bV*qcM zmi0LwT;DKD)G&p4e8cpaTAgh!t{A3$UxEkzjp|^inwO3VcGV|KxO;D8@<>=${lr_y zNEx^B2c6O@W!%0~?2p?~`5d?ZMx9;(w3V?pT2|ZoYo_)qX+!Xq%N!%LVW15Hw0-Y! z(8kKGVIlB&q{&zwCu8|i;1>YYn4chH{%PQw0i_IeH;<6K?N{NAmN`*$zXjf#fcB?j z1!m5aaeV;zcYuENQS~fXu~~a`?rWS}&Xo68iPv!!5TN6)7~jPZ(s_ZPW}fYq*yxhx z;1&W(l0bSQ(H#Jv;G;w)Gw>oa#f0qP&@MB@NXQ&cxeklqfn6xZ%V_Go!M&1Vr-3mW zA~OLc7XUd0iIa$21LP7UE(Y|z4Ty2+1f}Ra7RAdERCJU3p0DV3h~CP)RP;C!j}f7w z*N}Jx;3*oTmQWv35ij&P^A@Wf`csxrpFngU^Kwo7I}*PF)SQ&Z`HmNvlWw)oV1F`V!o5}CrIyM28fv0`BKvpxmS|!CG zHUhf=prkjDE=*7!FKO0dVbO9Cmdj@I-~<$u0jgfk5v97Jd3SchR7g(&h$$yR%#aHU zC~Cfem7*z^K;i`I?brYoo6NfN!gan`6fJ27;`v~oOA)Pq28VwAJifUxIphcMy@Xl6 zH_Ow?hGDU5JdaZa*rb8%X<&UQe8@?dXn+joqE{>Xk=Qj5q`j2jHF|duT!Rw8k|!Rm z?0pJe20`A{mEdK1XA!(hu?8rODXgiD3n9p-6(x9~-bDn%6ueL`qu`*yBXcn!ASi&? z;Cb~F!cbyVt3Jy<14=$jD>*~&CQA4lAz1QUs+Bdt+f!p91o?oiN?WM+st{bL52gM? z7{CX)F^2#dH29Ybfi3oakkrab;Pu8-DB)sVDVgdi;mRK@QKAhgq*=%4nbcx(LR7+I z^qwqHE8Bn@gfRe$xJFUD0baFvKLKkX-`X7_S_kOkrRn@J(l|sMU@4Me8KfJSOW;QOA9veI;0=l(*SQaz=1b!DbTc` zQz-sR@&}wLwGmXkoFlfgxX>>>*i3y?t7AoGG~Wd3qlfW_TI07AKNP{*y7i3@c(2@s zKTokQlO|s;9V!~W>`D!X^0!pu%Tk(A>mOw$_9Xev$b2R(xu+M?sMJPe7=8*3`+Cyk zs|}^;b5UCr{gCfB0^lY#5yT=uD|Zxx@`N6Dk1u~pvr+>DX52GEvo zd5o>{=I15g+W;Mz^%*GAdBM=bn6YHF_#?On0J2&Py@_A90J2(aghT^?tQI?w3Xs*} zHt2vOtJUH#PzRC2)#A(G;L*xoEsl`Y;sS8z1N!U(*IyLzsl|VvvlKb-H~bg;lwzz) zntb|FW?3h`KY$Ow#=1j)g3thI-MT6CwbF+8CC9j5&F_cd9FhlOG9XG%!Fx{QLHPxz zv@eI07xj%YI^jjHabD8o8#z_Rd6mjIZxA1{2k=4KIBx>W7*zTle)KUekyXhc7IJA8 z+dfDszAV8KRe_gF$N*4n`28I4%aSJF-l$TR$#iunUML#N221}AUqzvXNt5q1l+Z$% z6SUz6$eErr`D#INrb~xw!`~riLek`%syGwGbF}`2_?gZ)O!*yeUW$8IAMv}xJ279s zq^YR=N@Rd*%>w)hYc}4wdtVfG-lM)Kyt9R%N8FOHtBeCD*Z6vb3K1AH|| z!N66x${FBR%iz;UJJ<8FD4imzxf^4U?H8h!x5;7x-|6!Wb_Z-;gkRG!@*#uaLo6(> zMLV>k*h={1>41p57VS_kAI6F?eylsmq3YAPdVIGOPq{MuY!b-3QaG<2EI2kV}9@+ z&Yu@P3s{V+=pCl4*?LM+TNcBS(%CHWd_7De+mF<;YUFEkBz9axVYk{k^5 zX`t+KYH6~K8tW$u(qhRr)kHJ{E5U$v%lh<0QSzReD6Z)T4fw0~dyR=g9Y^n-wNvZo z#sPkA9B7@I4h2;|H}*a;4qS?61P;$#Nr8a91pft|Prx7}$nfR;-I&vaDOn~DnSTA-1yK3s+K%C=n)txhOHJp*( zV^YxqS?^=xu^f~A>Gdw={I{3|CtBf}cPz79w2)Z_;tpau&z=CM&;t3#gL{a%wo=C7 zu@L;m*)AC`0AF{0gRtSmaYb2AL6avjuLHQvIkE|wBb%T(vI&}_HbDz1 z6FIM8(=%#EU*=c&W6O^oxmT<;yv0dmSj+%}!>C*UTc1#So8b}Z9)s?P^B8hP zov)FOIb$K8;j9?LqP>=e=Eu5P$S?2vopaDe-8mjg45xfHi+lP|D*tr^vN*R*!4&T7 zK?O>kOk7t)cEAF-4fdIi|BOhxvG^~L)_iVkJ~f|*3Sh#SO3kmMl7{mGDj#t6525DO zs8ZZtO?Y(*Cu3`wQ})wwWIr88_S11>KOIN*({W@!9fvgWGb>k;h6il{nRpR6iSYBKb^=K;YUz%ocrlS&aB5$S+}L`bVwvvK~#hL=|onU z%v5hY+)7Hrzv6RcJ&6iwDUd)lAdg- zgFZ2<+36tu4(@jVXuLKEjYCA^DoAw~jkB=wXfDfHB=BX*{L;QH?nb_IsO*j>+ z4ptG<&7K6OKbE3>WMSI$P6%<3p>dY^2X@neSq*0l?5Z@Ok(RltDf_SG8Wgt#idyle zUmpu)q#NGFo-dOsZ5HTi)+SQ&+pzgY(Rvsba*ehxfU?3I zt}w1d_SJwkgQ4`LFqq=1EoGK_9*ix3MxF60M{gyx?}2{{Xu++A1FYIqR;^Y3YGf{A zy4mmGM0R5|0Gfs%^0H^ZNH6VMI(nf2B4>rd;Ye`8YdRST&X2IO-T^kY%%UMQHq2Zs z32cExif5B|&>+2t1s4|l$by*`oAgGZodLMP^?->|&};Eh#OAk%w@3S%4F}@{$Q;KC zHUzU;1>3q1I1O~UWH4t*pTcDz(0p3MA)Ha-V%bHg$Xp7P2hi%gB|DIe_n>8Ofbz2e z;(AFi(Gt4eHPC%Is~>0ev*XW0Wf9ZO)`Bzh9ds$6>9r84RxPdY0uW^o-Hikd*z{Q> zs{5yYsInVMtL~nxhqxyW;AVx}U5m-e+-4-r3BcO(Q)6Hy^u*$w-(jt?%_tS*Uc93P zayXF=987Z|uUwuf(V4{lv`Cly27?%fm|ZDrUIj|W@8*Cq#FPOoxo=PBW=eAB;z5YH zTfPa|J;p#TW6d4RUEUj%_l=6&`_j3YlH522nX)BC=o;e^LzT^L?07AvZR2v48$XZz z8`#+%pXby|bvh%V8pD(*%*NrRNS9o+3mIm688{r3!nwY}M(={(-6&<3n=8qe>h`Qu z-OE8$+L;pV*oBs|CF@{*<2qecmp25Z9fz^gcv`0fn{!`B^Cz%6^X6sTH%8LDX&Lv; zk~D8t#(hg9&6|{Q-&suKnUYGnY+9&k1nuVnj9Bg02h&f%XFxkQ;Q9>S$G`QCiv?T| ziy=+6(!vq4-H@*KY^xrOEAOI(Lu98?PCeqLpOtMqK4AA&wO?1jJ{g$oqlLp{+c3=s zT$~*{25Bo`CET-6mEeB7Q?}}5uVz+!F&lgmw*@QH!}D=G2eMj8h3oZkEMf=XSstFJ z1q(X?&-U@U z;hdhKw3GECl~S`(+9R#Bx7!|`7QC4)?V~c`ZCmgeTB5I~6g7SO4?Jj=dbm>B%NmND z4mB&K{nJVhaTinR$SzPaNM&M8xkrFC*u#~Qf!1m&p(dqdXj;jk?hq{cRm~1lneY*C z@T9I#a=2F$^zlOW!3YmWAJ->7(!VVR8@EHU20VVRFF0e^yrt40mCW}@Z}Tc#RyWV%t4-A!!NFEsZQFH<9& z7(jC$rEm)a^$|MuRE1+-iQpOz{Amggp%JIi5vO~6Rp=yZ7Yk*{s?eF~Lg&aiy2_Gs zRi+G#zO__3PvI_<&S&?`ucCCe96ak#vr@Vst@K!T8J_!sTR4Okc}g&4EawnAPT@BC z+~yEC-s8jE9XaGr@c63c$5@v`lf#2(RUu2#g)DRTu#f`w$w?K3{K-O2t|+8ChrlTn zh3wYZhT9*Dt6)z$%9$z?J|zlQV)msa(5ByG7pFMX45j4dpNxJL+ZQ2!&P^jXEi}h9kxU@ z;;M8bu638Q5v%B(*Qrd{<1M(0)7teOj@v*P3oZAQ;x_Ocy>*R;!<)JHlXZi_>#0Jo zv94yJELjzLQ@YT9xqRsvyyP2Xx>aQg-gg@NigaKJf=V95>)6Y5s>i96on19r9ZEZnK9kxU@ z;?Z;?9(RvMOI0JD@RazCc+$iDMr`tMzY$M)xZjA)9_}|{i--G-c-q7LMm*!;ej~Pe zxZj9p749`+qs2pD9JWL?;`wwVUT}-?sHPh6qNl`f#7iFTH{xXv_Z#twhx?6q)x*(< z<7mm(Jlt=@>mKem;@=+bH{uNs_ZzW8;a(%QTfW!*qLs`E;*Q1HDb4?#Banq z9_}~dT@UvgvB$&xM!e_Yek0!ZaK90IJ=|}^2OjP>;zJMj8}X6Cy+*t(2hTceiE6~h z=|=2#hvMl`O<7;5Ok5hw;K2LZQ;I31j6VF0hbtfb(wc>w4i8#YO211h{lUF4t@OtV zrK31+{ZyfJ86In_pQ|W6U~QyQYF0{rO)LGwZ4vQn`lrf--FPUs^4D7#? zR*gNUq)OQ#E!2UkvFDT!(2dj-!v;LmM0HA2W`(9~-A%^)O6GVO1NmC$Jx-Y^zfO5t zXeE0k*CXh;T4*;V@_a%{3l*^Q>-&TpEp!DfhCQd03A44($DEh3=aeF3X`#NXFZP^L zgrpXFp$!O)Jc60fLaTUZE$}7cT4)Ft4UK(5h8EgH_h{k~99s+BDNh2v1p0O}3D}@Y zm4d##hFP#dl@JVc$#v}g=Dq~FVaPVR`)1mZ*q};O zXN9#;iHS8LHmFjCqmL$!gX;D^!PP>qj{%|BCpcPYJq_8xC!j@F&~7Cj!9WA1lhDy8 zpaB{eD4l!)j*0o;T@X6^I#dH%>(=*d09&CNfZeQEFAeV6LwC>0@I9fYmk}c;^dOfB zy?oU$=bNlvZ(lWPym8obmez`kuuLFnfbP~TA`^!Ev<5!c{gh_#McDByp@Fy^#~@s?kzgmFrQFQ3(cgH z4fhB*-Zo_M-g~GofgadSrP$+()(YU!AjH613wwMCK}Qo`BLRDSDFT|fiR*)rJ^@X9 zpM+69K{fFZ-8u`caM(`OMC|cJ73>o1@fF0HDD(h(dxD>_kro<5O-J~IhGYZaNdgplE4JCaC#P(s*MEvL$x~MfYE%sHz_VBy8oils_Z2umI%9%a^ws+`hD}4fNe;&uqDxUz` zXV6>E@(I4}&-Mr==A6gaJLmWk7=K5TaIR0lByuK4Cd`;-#%@>34uunh_CoTfv5ubn_&c!2+wZSK#hu^>w&3e=$nCQPI zD9U=wC!lvuCSjwW1-^CNpC>P1!mOvBs8&fw9bmcMZ>>VD#TO?!SuV<*5`jzUP6{>fk z=Td$pcY7J})-W`ce)Nt<2*T6O=eT;;C#d$njrJqAL;Xtidljlb)!hZTP`!@+_L-Ma z$Bns|gXwdhfE)8zPIX`S1l$~sDh1(7pMaagY7UkCJ^?p}UpXm%4emxbHk>`PC=DeKj`jH;)igrv5~?&Vw~2 zNJ^Rdj|x-&t-H_D)K4*^W~esTgQj9uPxlBq211w;hDV4h)qm;MKB}gEr8;1wmshso zCi0;Ab{fm6q*^NJdIYbMLBnbXVTbCJrf`L(nBi`rCVAA$@H4_>Z_q+rn z%Sx;IrYh>&*l@%3QD1I&Wi|0KVo$sf&k?qodIUb>Vi8neSVa(as7`5W=4r~_(39=F)g zVK#p*NX8Sq3r)27+CLTVO0iisUzg{{v)Nq>HvIi8fz97shWVa=Oje#6|H2 z6g$`E>)bZ+W68PN=4;pD_ye3tZnpXQvQvBv?+|NkzEzKt{WTQ*-umBq6;<$faP5D$(wVHbZYO&A_;OXM>_M#Q@j`CO1O@c~4>5M)Ap zKZnKlHeabsiua^T{ATl2$kfDbG@_;3e1|bJaUt6f)os2iE}un)?>4{EKNH%@eoURMz?wYyD+ht*j8Oya7p4NV$UkSO0iG9SL zS6F$%q~%`GZQd|$O7O#F>s7_OHE}BY^)21zE#S^Xy>`IfM|tRldlK!rP}!>_*C&3Z z#jt-I9qOTk#`a3 zvkaT_%S#EF1tNycDdDxm7S=P@usN)EBwDcaJVUg+otR9lzQW#3tR|MPu)T@vi8WBz zzQi5G8Y=9w#8zUB6t-XXqqLeEHV5LjS|*2B^2_#+XknNfPg!r!I7LRzG9cM@U^!ZV z0NHzi<;=nF(OS;KA0WCyGhYP~%rY+n!~4D>W!Wh=+z7+4bR1q&d$=;7dNq?5f1;%v{xkkjU0hTo$V!XhKH9b>Kq-}5;7!N>X9iYMeK;A&&bs|p!`4WlG0b2fP zzy?wQFH%m@`jh2c0EYf9c4DDe!dH5%d#3A2VxFHvH*zv2{c5$f;F&|aZ=K3 z{5lhJljcxJHJSAWI$~}Ynptbyn4B?5lS-Ss@F_TBdandSYy2p>%@~?AS*s>n1u0f} zZ05n|1#EB=_MlPPMdj&FPN$?vi#3@jND1>anI-8%R%=KvlJq<}iq?2Jk!DGgU7>2$ ztcR4+^b;0YAD>!Eed{Z#b|~iPfYt%WOL|`leGLT+eHar-hddlC%%RrM2LIat71|K6 z1CvlSBM}QhuO)H$mc->-5|?jDT)ri7`If}xTN0OVNnE}qaru_S-5|?jDT)ri7`If}xTN0OVNnE}qaru_SBV4?X zGMrXOhXy|l!o)m^hr8f{x5}0|0&!K^Q@{e+h6;yj`Jr;C-zpqRVrY!ksbac??yTc~ zhIJuw8Z~2RjKgy$P~bm|p)pgLg%Gz+!9@aT%;My55-y|?Cor3(sP9XHc3?3%iP$I* zZE;Ln9McxZw8b%PaZFnr(-z0H#W8JhOj{h&7RR*3F>P^7TO89C$F#*UZE;MVVS>Hk z#W8JhOj{fihZSMAv&AuOaZFnr(-z0H#W8JhOj{h&7RR*3F>P^7TO89C$F#*UWs%d= z7RR*3F>P^7*O)R5z>(tUxi5LT+%IbZ}#tf!~DQR zpYCPSrXp`Z8@C}nC!XcG@CUK~Xik)Gzu>lXyMwu{HBAYejQ@OBEhVYCmo5YmUfLP8 z{Qtf5|EpfwEl}Y8fF5#>pEXAdG>*|(HFx2XWm=$#Ac4>eH^H%*3gWo)W@&*!Nk>Ba zUIL?;Ao0+=SAaAZBpJGnoECzlLI;Qx36dYmffol_3Q`c-5(UyqkirmGy@A$(6ovY2 z1JXv2HldzG+6qz}I+;j2mrmG8Ghd+Y_9lJIVl%?{CQ8c!MCg49ES!;!c6u37-SbHg z&jr1UFMwg$oB|zLtN!&!kM+bw4}~pr%(10?V|m27WLf6Sqj8&9iUn;z%ftZ^-nt{_ zBXyhjr61Jd@1^*EG}dYzU*7s7Fd2Fv!0~1Az*J*r&ODN;k1rC<%-H?-&z_HZX!bW4 z@w)vCu7YxC3dIg}BU$7tSXkS17mw>&W)N_41>jEBqRD z#WR@3&QOs{z{MPjU9n-Vd06`<76EIIb!KZo>}If^1R;Y57h@4m@na!66p(@M7cMOY z$1;C_Ni*;bLzx!4H=P3!;>^|o{WTLRn5`b$219eR($N45k2fF(w1$tRO~1u6z0)7E z_`9nfOz%jLs%Jg#sldB$9_&-`^wQ6o15H(XM?Ud1yiYt;9|ZXQrr9fb5`?Wj`(UVO z?uAU7Q-iA68X8K(dA@+PRief)Q@Z*C!FN5O1|0UTe(x{=xHM<^H+MK`)O zb=QwjemP`M2H-hW)38p_!u*7R<%MB9JcQw=ILZa@r z+O|~HHig=PcVcr|Jww#2M_1ut7oNd#m6{A`#8#--Of^qKf~{LfV5GBMoLtE?&jz*+O_i=HIK;WgG{EGA!V6F*sgGeB&FFZ+v6&jc-i8@r}thzA^d6 zHzwcs#^f8{n0(_KQ{VUoe#H^;v7&-aQYOv{*AiDfpyO17C!J$3pygy?{gnm-@k&#R z-18Zxkyo4WJIX-h)=z-E*5oTx(}`F_UKhlz$Ng*c9l7Hn7KwaF&YQU#p{y{{p9*#g zQWWV)WEJ|V(**3LnLz!)*7)N^`eu3c)c1(#%3Z@OuoX6$yc~B`3g5CU*X2&E8LiTg&V8% z6>cEkY>jN;K*mY#7f2-e6>i4K4XBG>;U<@&y&0!ui|64h+$6uk%~%`H;wA1yL=2g`2U;WTpVSNWZ=*yUQvffljBdX+#IatR4THGbTTx|DqJ_y%XdY0Y!>Okx{IHjz-5b;u$qt>J+z zL#sC>xSaxW7i-EdmNQ!hzwk>6v0N!rE?T4auZP!dv?+}*0<=&MCgj4ZXoWvWPSLTT z7K7ae&~mvaLVl}LflLH-JfPM2Kvp4fCIEkh^Eearu3n>An3kKJ|EaJJqqE%z@v8yN zrJ8-sELQV#5I!bRs#&V48Gg^i!!U>$Y->M7>;OVbKCrDUxltGLH>u&DwUZ-jD(;CY5PBn?qUW7m)8cK-;q^-^CnD34OF` zLU&c$1K@uLNY^&qTY7gh$3+IIt@A!&`2jU++W^%10I6*W62$;~yU5x;)&LI`viVPY zZ2NNpD0YC;bm4yXM7!z@Sk4AKf4{JXvL}W>)j&Y=)s!zbL-eKNL0ANk67I_NOMupA zIn!sFSzL?xf7p;a;%m(`hp_ZD$b1%{?amKjj!bhZhZoEu-JPYnd)i*?)d(n#q6xd9 zLCqH(CiK^|GA!jvW*vXLrZ+ZoSXK-Ec*MVSx!^P?$^`Xf=vWLWDgd$`iF*L8+5-7E z60ZQH8GSLz+ROe((9-&V=Mku@`qOhvYbHwV7$~frpE9jg6@1_ED!MY?ba#L+UHLr< z{T5KOEA0>PhzXFcY=}f20QKovqj?QYHw>c`4FRVQgn9ugH-t}(wRlt`GdhvkIDSVX z%Sb@YYRm<7HbAOzIufS``Bh!40B=5&<3`QFbljU!<23*&G1gd0G>%6# z3WFSqPIb?}m%(VvFh0^!F1YOsE9$lM(L2-7e?25T_GAFQ>EqXUL@4^*mgl=h3XLwyY1 z|K%G84AraCaMxC5_k4u~i?5^*umVMeN8l+~f1`SnzKQ!ydc!DVlgd!@ZU8kMy1xCxo37L?XPKjQ3*9S?J+Xzn49((xiU9B4Go(B zGB@o*VlP1Err4_}e0X1io5uhGME>{G#%_Q$Z z$N$ywZ+aciqnoO9JUdA`J`Vv>NXyJY(+CmYz6X#NB8?-&IDY3xx^N?1WUCRcx<VJ;r9^i4(v7k~brUOpHrQB}cBMn6{YG1TLJK#Ov4 zs{HAjjl80Dpqd}!w{D8?#YB}q{UIY#^a`kLAkqqezn-)4-bmkIV0@@QtQ;ZHR_4eJ zMmIhPV~0|Cw%lMG$_G8nj`DQ5!I&fHn9kFVM_|APot!2dp-WU-2Oc>Le?c>x^DBgg&azyqS2l zX2?@wKQyKm-)ZiTl!Wc5BlYf(-q z5#u?&V&F58V+G(K2EH2XD*@gR;0D4n#Q9v{yR;o(X@wu-sa0QYgsa}@dS;>Hr4N=H zJ=q7FplvOnZIeZ)*K%VLCD0Ska20o|Q7S9WF=CT5l}+Yglc8yV=3@JElrLWa!X<#T zO_nBon_O(Tw8=x@KEP~Z6A)R;7eUw#sK|F;I^UJbmLGuqemWnB%=ZfjKQUkHL?KZ8 zRhaYwBgI!MMNPqperjrAfEbC-R4|fWjD;F6lk|@5^~q)^fF~NcgY-kw@nNWMNulxa zsg*@dL<QWL{OqgYK0#dq+z0CY=orLB?$5^Flyh*9xzPqbpc z9R4aCd!%8#jSNL?!HIv4UwHs6dw60LZPgPPeXhYKs^;VQERDBLHGdBx=#~Yrm`9H4fki%uV^?p^}aB*IH0y?ohC-k zAXHCQCM_V-3{Z1r(hJlc0D0CKi^SmoJW)R3l`Dly1zH)=q8C720fEy1MQ;JQ5{b(J z;*gtQ0QSsc%J=%5{qUDA7Bl&n+*{`Dzx2U0l-92it^KLuGXwvyCmY@`s5|?oy1Wco z5AAmX)Fb%ky4dVD5Pl+2RDPk$Dm?E?Q%eDwzt56!!0m(3*d2tnB+5$lYejqxgsp%U zAA7Adq;yu`YdxpvXHee(dl#T6&{WgDN8)Qh_XLm@*W$uIIGg&@+v?dxcY~U>-_$Yz zMUMh$!vp|-hy2VM?bKU&8PHCy-qoD3Qy)fy=%boR6?f`Kvfd++^H4zZ;dH#WRlS#k zu#ChZ)VEs^Zw6rvp!IWJy(&iBUfpVsa*Eyt=Q)UM1r&V@*ZPpoRCx3c5-?FGa+pNoQX#>e3fa;#7RribqVKiXy9L_e+ z=(2{y9`veb5IM_c&xgQV=4?;z*rs~>bP!Gjv_7=P&GI=M>z+_(jwi&WpxzJmeSo4>Kwd;*JD~feK;&7BFGl6AnL=U;^kTA66FA-4{ad*?nbjE> zfxa*Kg=+fqdd@ypj{fu^3fjw(=}*5R@gqyF;!hP_;QLel*LVd2kS^$mM0)^=>fkl7 zqNlg(R$uf&QD1PzL1+x1YLocJxHUx5HCK%xxq?*NeDjj-&Y^0~H;bV57}lYddFeIX zUG2-A1(}tU6Km2x?o&l$PiC6(L|iAK?^PX7gl4VZ+jNU^U9URB^5|eS!uwBT&=}7*uN6c{7nv?894vlTTkrbO)p*9;bxd%x~A*av`$= z+*bhVrVe69)cw-$a3B?+V%=QPt@w6K9!%~B|31o8TGL3;_vx}g*#_QLK)UEIXum3Y zz21RE*ZbboA^=r1h%EYA5UvK)R`h*(o)o|jX zD7PJ%wgA*5ut-e;3G9HI0Z@Z}v9fn_5DEdcjPDb4>xcqxeD{P%cfdi$_gJt;17v(3 zi^M`e9pk$X^rk)kKN#Qs^h!&}pT1bnxwrt8(U03!M*StRjSJ$RdXfWuSVWWHFk1B?|Y`;A(9q6FSc)VqP6`UqLJ z%6r$I`s|^sXRpPa!dmG~9t2`?rLC&dN-tw|djG)Zq*nT9vb!$C3Cvib$n8}tyO~84 zqKNV7T!m@@(xa=q0%)#VWObFtTp;3`s38CEHJ#-)^2+5pNR``2mD@u-xir=zqCuWq zfG7>UK4hixyu2JtDsP@HKNYDu=jlhV&RVZ>7L=tXck@76I7=VH1`aua>-H>th6oS6 z1n;~83mWm4XOqvy*T=pNAVA zO|CA6FjNuPc=_qH>|3lxjiKOiNuhW{jS0dVJ`IH!eU0vXb}$vMuQ7|f-ix0^$Xs7z z30d-tVf6E!F|^NGaN&6IrgYp{D;#FQ_@og7*leHN!v zu1bu!x51*no8mYK;MA>(KqnP}W(9&*NfC17fE~CGNbpu%9G6Ki(kSEvTe*9IhZ#&1 zY+bMvX)VlPqF@_A0-DKSqF`I|32-9b?(K=#l!1Vkm6C@R53Q3)oBN-$AWf{CIMOca%1qNoHDMJ1RhD#1ii2_}k4 zFi}*3iJ}rr6qR72s00&5C738G!9-CBCW=ZhQB;D7q7qCLm0+T%1QSIim?$d2L{SMQ zib^n1RDy}35=<18V4|o56GbJMC@R53Q3)oBN-$AWf{CIMOca%1qNoHDMJ1RhD#1ii z2_}kG2_`bVI3m19LocdOp}k1QZvO&fF+1ya^r21gyZXF1F|D2#qd+9H z^h;D|evnS(|LNrnq)5uqG4p$|l>0EF-vP*4v=~2>&L1g(7NfI|l)RHzHGNEW3&9o$ zHa7c8Hgx_;G=M%X`()v*7HoWuJh3kbvCKcA^+!PJT8w4>rR$+DwB`ixZsiUzy8MWP zJOOzRds1MiKR%7*J_G6qunz;|z6NAI5_19d_W;3DgE9eD&A?y_ZvWnpPb2JrhU#eq zYdpoQ&cJ(~Q@v6vRtJl%Ev(xGV4Q(+P6t#ihFx`UE$XeU#U)4Q4`Q`b6owvFU!Qu*FO(0}7>|u7@421*H24 z%~gNtetH<}2LaMguOjg>ppJg}LACn7=%?A%Jl2i<^a;w@2dLRkVnsq7Xm-R++xSz&p6x$ zkhUX+X*D|*fZY%vcI<&fH$WYB+zq||6FZJX8HWRE+OaFlkuIVRJ1$o4)y!`T{@2Uz z!rH8|9T!6VJU~)zeadL7fnPwH+yE8rao`&Om5uu`@Q(ns8g~>5665|2i9Z1cF>dZJ zPz(^`c0{5Bpbq28n(IHm)z$5!Ls7gAKF*>)AwuK?6C0m$6T zpE}VNgf%tPIu7{a_2$R?!`}ERckw=HX}@{ zrq=q+)O0{yMyRRw+1e%r9v)EHZ;PR_%|X;Yga_ZMwSB!dBV-^Lr?T3KP&xh|sXe4N zwX>_KJsT>|Jc!zJvFNN?+aGGP?UU8i-Vc@c{v);PYO`%JUeyTiLgm{BQ9G%idTpE4 zruOJ+YVF_g6AYj(PpGN(kJ@bebTzdlP}%MvYKxmzukCfU*_P2nl|5lHR37n9)HZIf z)K<&~SZZT$Hy8ke*R1FR3(WlNt4XNZbcV&!{z*R4;YpkXQHQCw*EW%ym|fM>JD~nGKxI?^1pIqI-KH-13yXO`WmES6-VIQz zsT-kKG4&Woi~=0Q)W?9m03fD57m2e0b(lH;z5f$a--t5S0BV|=p;_r7>M(VO+HM70 zJ5=`S$Dw`$pq6R2ZcD#|47&i8E&U_#1AtmBeI7~`OK1FTYEi&JEZq|9767sI03`YW z>ag@NYJv6NPsB%}j0u36mVU8v5p`JlsM_x3LlOQ`+0rLM{qcZ*Wa+Dr;R--yORopM z4p6J543v{-2oOvEg~T6#IxPJ*^rju|znQ7C@KZ=8pr)le!(izm z>ag^8wON`A*UFae0QGGF|H#rKk>PMaWlJ9od>)`yOHW3rV(GIWu@Z0)OWz3g8h}{( zF(fts>acWwwG997efl+&@d}`(rEjcUL>-pqxAorQqI|bgItFVkyl{uE%9h>_^`8O$ zk)_;fb(rrYdW8U~b~IjS=}OOsvk7S*%#At<8^ zP}8SRs9Z!HKFzHoYAl$)N5oELOHYUTDS&@u=`)dG1)#E}%Yk19sMXTfqg1iEj@AEZ`uPz5wj=0AlIekoXs%4oiOl zvsO3g|0_#BfigA%YFc^_s-7;Q4ohRt<(fYIT;r;iejDm{0REAse?f+y0F^CWFA&h; zfLbkmEJ_tiw}C_}z(Fj12-sx+vGi0VrU2@&^cd((o8iBiJ(i-3C4icizQ1x2by&Jr zZEFv{DycksTn_cC0sqL-40^*#0id#_&jo%q zpjJx{K&j%>w?N`1z(Fki1lSt^V(Fbo>;TkZ=_2S&o8iCl>90`6mw=jgBfMx+yAjMeyD&Cn#SNW+!{YIBuqB@T1#v{XMK=Lh!xgYGi0JV0;Yj{H=o$&=EJ_8)2GqCw8wlMQLqahOcfI2$kVd(vz zbVg^C(UE1LVG_=QMTv^0s0W*-i>RYBGHY81a?x3Nf*A?*hXVeQ+aHGv#{z1#YIBqz zR=ofc=K&64)!V@S7eHM6DI}f*)M3>y^roBq-?;crl(7R))2eeT7g4)a3)8WF4Bctw z$NFVsIiwY)WBnMgqj-q*6JB#a){o&wrs5&ikGvLstRGoL{CSVDeiE~!eb9@sem`zb z$ND|?t%~(49!OWfcK{Qr$NEWZUZBb*WL^ZHbqF%lx*?e#ALs=J24vGY*?!YHJojAY zQW1e_ry#ZST*cmEYan0;ZpBq%1cSxNeo7UD>dJ! zRM73Q@hoT#cAN{i`;XxsZ)PU`bM7*GfnlBnhMU!#LSEh6g4p@YqCrY?yMm8s&$Se5 zYT~My&2bGS>)(R39k>(M&?%sd2#<13LLY`_e5GsQ(b-A7=PDh;Unw6 z0;ElNB(+Tx)y3hjE<&D3nT4==r|_ibflRKq6iB!5RV-&pY8|Rp8org)IVyZT3M~tt zv;$&O^Jk!(!C`Ls6rOAEhU(#3G#<)zxwC6{-8X1!o>WW=KTo8-AdY6HQ0Gv-$u?V* zHF3Cx7HS^fh_oHpjB9KcE`*G$P)5dHrdTvWQDuL0J8&0B(LkhuRe+%oe+Mm!G^|Ja z1oTEY4uN% zy7pQ$6}ipD2OpaBZsc~)i0t>s9m66EFj=?D6Gp10|@L_i(SQ zd~+o@(Lnqpw?BUNh;xsx_{j~Zi+g;v_pb-OLg5^LnSuB+i(%YJ+9!TSnA1{{dwj*ul%8VUmb!}}k;Mw4 zE!^WPzRF~#>_DQPh0{flaSJ*iQ}t~qTZ?bCf#-UCou$Ql5O3h&NiF^%Ua2R1Pt8O- zFsu^I6hDqnF8{`leulYfp_$9)G8;CNVv^Vlhg{-E0>36COV5# zYvy{q>P&PoS7hIH_fT+B{K!t#?HEtXSG3cy zCiCS{1X`9@%aDiKT z6)h{>UEri{#YJhk*wezD?-Hv`=F6i9v|MTNJN)>X3~<&|(Q<{`2%OXxX)QN;TIRE7 zZZerKk0Q`=yET+rmeZf^siNgJcNVo2!p)c#=UG*WZ5|%h;*YQvuXyqyEq)03J3QR|f7pBP@H&d~ z?|b)@J!f@_&e^k)RgPpy$hK^`7a2)v)~%pO@X<@bBv_j#`C`Qy=b&1mj2_uNx=XJ+sF zIE9g-zhL25$|-zCp~aUYIO!Dr$hm0o^$2FxJSO<<2xbgjufBNK!aQI!OK$aNA*AjI zG_|#SKdR*$lKuC%>eV0?YWcDG31wT$e_1Jof>YQ+wfrK2t<;bFD1Fi06qGmIRar$Rg=Kj}c3})T9 z@-~PGQGuJRr-{o=8ZEVbMHOAY3tHWOdPLP#M7^$oSntM_w?RyZ>hC7^lBlh?RxNJS zS5z}UxhqjKiL6!wDx%)eXdLLqmA64mh#Kl9ZzNS-Ny){LeMNP;{-e<9&Ly&^KhzU{rROx4=%KEjN;wF7Xb-R8)zOt)(8JZO}xgttFIf_%?kj4V>o1n5!9-TnHWg7Rj_r$c+_>^KhzU_UxXCw3mCd5RV&`MO7+l9Zd|o&5EGTY)lHs5%2xWeNR-#$l$+H;cSQ*5 zs|Nj*>)!}--QGmDv+l0Q-dBBlj~kb;1~DP~0XO*)sq#%4mk&pxTCAx1UH>y^b@DrJ zMg6WK>erg5zjx!x+aM-HJ%wRCwJ+bKmVdUdD2%74L95FWSy9hbM78O;_q-cd-Ucxt z>SZ^17^!kmjrUq#Q7^gv+0g2CAhM$PT`0RqeX0t+>Bg0}K}?8x$4%Ztsyt1P;=lJ5 z^*7gl5nA1qL{`*4Dx$8``^JZETzMPBgs4yXNlB(yd4xKhU$ax8iKwkUas7eN>fY-S z^<_oW3u=$A+_>^KhzU{2SaJcW@>6O@Kh{T7BIX|=QQbsVt4u7a;NfbkY%H$44Pru6 z5KCT0s{A=67i;^9D#rYE(CSVivZCrLqIOit^|83}Hi!vP{bR|$kt(lK1vly|syXJT z7;bfs_lO!$5%r8p9vF)&Z-bZ+H9VF)id6Y(E%u`$QEZyZH;TEdf@pTi7pr3?R1i&0 z`L~EEZdyTRhimzhebaQD>(J5vemH<_|!A-E}?c>|9Z2q$<29 z7FYQVVnUt8vE+qP=RrLw_NmB5om(}6_pcyO=QYjCgDMEr(VJcI&!y;T3iMq3RqFi>v$wF`>?}_>Q9&$|W_%%8G2%xmfz0TtT4D6>8g4D+ts% z774{ODu{|YKa3EOI>*HPEs$ULP>(uiRn&Ql4NvjxSX|{dhzWHriX~5!IyFSaH5E~u ziG8Hy;L->|Mh%1uWBz6E)on*)t9n^Q_M=+9FOS6~tU*l3zK&l|BxTpq>myOT@R!eg z4d$Om2)(T#``VcQIm~sxAhNP=s>t3=llm92xP&!`sinR6%b0&2{nsj2UBz2sZKLQr zr)}xMPVrZ<<`n>mwk7*H#am;|cLStbpZ~&jinqnuN_1(q^#e8j?Xit^0xGngqn5uT zw$WukVe3NGzn?QA~FRIP&inVp}CRlD=$gy^DU99C0pcbcpjK#QkcPySmlLo1? z(T=>?@Cy{bjukfL5!kwiB;Olr-3GvEeGS!%_r=up9!>MYrUX{V(l*gEo#jv-*02B?R3}ft)HNC@!{Bj zgMs#H)k|FQkyv{*OU#nilU3*6#RePzw6t{}LBEf+?@kq#wce_M`e>|m9nkXDf2dlI z#aiTA^T<{i;S?W_wQLJ?Y-^qR;)z)Mr9dlN-<6anV*}m>I=NN)6`zU?7{eNJYU}oD z$3Mi{j|V!V^*OcU)3NqPfX;3W^#b@ztWBRgpVzuj%fPd-j;nw!YTZN&;vZujqsg(R z^|vbFx!9olfG%%+Pc!uSSjSvyy|#59y=A-*%g^Wkb**Lu|0y=$256tQ)@$*3G1ii% zwZ3rLui&3L!8o#aod)$z`;BzUo)u)t>95W!{y7%E2IlCnBgo}Kd9`%lvK z4gNVuZuF1fK~VP31k>dIj8&xBcWK7{K0gfZwD_$^ZuM`1r_G5UPoD*&_f)kq*Ya6wsa(1PAnUYW4_)ha)U@qe1B(>FNzron z==7f@k!j<|tJIWInjTofzc&dHZ~Q=&*&J8vC50b&H^*S5mJThX@xf#bYsz`5h>b6e zolA!ezD`54^3fkQHpEEVbJnnIp5h#A9id!J@eop6XS10t8q7KE^GFUe(+b~%kV*d& z!gO;O$kFLI5Sug4%-;6>L}#8lMa=9I!JK(E4?~xI zBbYPKRN@ly4|<9LUo*qaptds#In_G(bq0OGz^Ykb(K2nf=#D`{QR6w>RZJjJyQS+5 zK7AdG>rD1D#W$VYHo8$M6ZIT8R*Qv_RmR|-QKfK`DxF*ZL^%~fQ)-HsyjF`bt~&r+GL3$8QiUA-cb|6sfARYYcKnO1KX*+R-$YF?-FBTjST`qw zd_FQDjCfm3eT!StI&&3>O9?%lu}c}pFveTdO`HuO<5{SWDVuSm0#ezERs7x&VST>y zmCv}aWNWK@8$%wUVBBSbRKCMN9NZ`0W6Eb-zT9c^T?qMHs!W~GkVFyN3&L#_i^yk)1Bf87=$1DN!b7(gZ`qoY(vYlSC zwX^d`xCqu7sdgW~@<7JQ>2_>=IwU{kPm;gpoR-SiI^7+jvGo)M+()ou>wG)5w$3J; z8HABvlCheMcTk`mTdQqfp8$0Q!HzAErmsQVMsP-!I`dO_({cWxd}eH2VDtS2@(apm z#uiBBYvO*ZUUyt0FCw27xxsw=X2;f#ZNAMQZ$hwR3#9Vx4PsB_Gh?fRypAHe-*JEB z`u8HljICqfIf`J$mN;S+ww|$dHsmu2W^7$e;wpk2Tb*PuV{0r4jjijD+jneDi70)r z(a4wq%~7)ig+R77iL_4sw8N1 z*5?yW4Z)1gNhG=jXmsvEVrPOKTUV3Wbu_jvi^kSr&<-JVUkAz5?iVC9j#eVPGPdrD za6Myd{L?%L-NQCqv1-~Xqv|kss7BQVi2godQ~mnH0H~1{M6-acu!F3vny*6$JquV} zD^C+MSdQcrl9A)?Xom@)x_c*>cOb0KaVj}RBq_o@&h_;wbTH%t31-SP&{rm*=c}3j zuiAOyj^c5XjMvScGI?C(M;FGqyH+r}S!Kt?4sqgD$5EReA!d1zkS8gaM%hr%pN+(C z7Ie6~Ue5nlWsXFd_O;YgO={jptDU48fBYeu?Tc)`EMwB13X{9$XB$=eWs%#demRG> zIgw!c6g*&IQ7fv zw9WB^32n>hx6$rGaeM&cZNlUyr@}FSH`_YRzA3KxuHqY>r`&Vg(jKjO-Nl5{Mfi^A z>DG{E5zLymn8facZ+V{TXA$ix5WT5=>+|%bue}b)w$R5Uq2jZo)-y^nj@dGymN=uHVX7HxHOvq=tm=XzWhNg9)aw zr;yl`@GXt)BlmyS*p-ShgzTTYt?M5lwe$k914V2{_Pu z>rw>nPxy|yu7Z35!PNBv66X=VrLG@GnjA)r%@&}~!0N%$1&@4fSZwbm=SZzTLb;J5 zeyTG6qG3VeaRKiEd`#jWgl~FL%&?;p)l5q6biAPyy>j4Qp*@{A9hhS z1)M|JY|q7qiGOc#xbufM{Fr}L?y^ge=q|83yR6;Wy$}1_1hd-z2KMMFtdkG7+BHWX zEg?@~!U%n-<`yh+8xUI&dLGSB4`x9>IYkNmUGp8^K~R_W=6JCK4zv4cvTtmsL0v_# zZ-^lEsCWd#gM{^x&y-~I2;ay)D*g-dTZGYFUt37v7y$d2nNYrjgGkO$7*P25x%~9WM~4b zPT%%kp^{UHyNEacN-r3nY|yqh_q6RNW7M`cAbu@js-v~$lc}P+^UbpGFiE>C{Ex=> zx4+@W(*KrHI<7LKK!VLEsCAOJlivKggDCqQqv^Yg(^GbV(Oo0g#C8A`y}(vK!|cUFXt zC85Rt z_sVSLjJ%zh)&pGs=f0VIiH0?;_dJ>YNcfH^^d97Q2&VO7Iu<5;%M^MLxqaHH&r-Jj zpwG6RRB}&M>%Em6MvYAC)g!$h;p-Ek3`^8nUwcP02%Yp+T5t0^wd~xtLAwnbRcW{T zhHJoeQ_xU?nGBmiw3A_mIU#+}9FSfH`BK6ReK74lWWF-~74R>GGtbiBnn&rQz`qmD zJW3xnxYvRILYS%VxZOt@bXxuu@F#?xr)v$V8RpsffZ6wMRiAJ+C(JMhcMq6N)*9f8 z2uFqp>Zwd|W#deyelhD-h#U)$lRd(1O5{Zua* zJ&%rOZ2=p~`K~qM{%?2!m1%YK+)&K7KT2ci2ke5luGeHSi;gc(vWZt zBg`-ltdq@Qy5EQ;6QS40naTEahQ3;N&oGDZ!y$JNwlqJsd8fM<+e?pd>jF_{5&lJv#qKgdf8sN2rk==vyQ+UyGP8eP3`}0lT-v#jwLia=%j$-0;Z$ZMm ztSln&Egk;k)*J4xRRP=K=QGj{B`Yhp^GQ!>SDDhDq@>3QT}Q#7`;uS6!0Wp^%IRKN zDfgmpFZYY@DEBJL{V`ctMx15bm)H@$)|C4uWxlR*uY*BXI74C32tR@f-&iU5;cqW^ z=+{R0`UM!RBcDW-}o_qtH(YGt9~M&1OOt%L%@3XF^W9h==^2DAYu3 zXE@SNzJ-J_S3?*K%K*Zdn*g>VF;l=gfIUd;LU5+(#w0<}Ch{fVr^x}#RP#!BGAt_z zV{>ps7bfx5bG>N0N~-jLi!x%EnTH94;$m{-C(N!%_#uY^yKc#Pmo z)0N9m2~gxoz|WEwOMq@%-h}0K<kjbaktF=D>&bl*`C^Gqb>;BOYw{T*UXb-LfIi1{KCbL%&YS^6Df z&UCs8jD>q?l0Wv!9ZS#UsL}jxT6e!_q;`#rMrsr5%{R2&b>C6UxlWg6r!FHmwz*@= zk+CRtIDPU*D0&jk>Y+GY-Sq7gaJyTaMvyc1Adq@eM01E24jE*m5_&Lh^|9U+4-B;Y zJwGTvWw{2%ng=(oJU$N`rW?g#6W2)uvk2OQ-ZE>*$k)lie#{vSzn#L%%mM8vct;Sr z-iAR-$NQ#ue$K$@{yQkMWTm6#|AsbM_O%mM6=#<$7W9!tvT6!m-c#<8rrhb2IhD{I zN;Z#;?nV-(w6Wh_+S>0Z?MNDW3R%@6w-D5ZE7;~w2d7K#2zF-8(rd^Lxtpk+Ssd1A zeYWqsJ9McHcR{b62=>XalX)_HANXY9%u`^Yc?w(t{3C){FYZK~qsXimJ0}+))T|db z!SQp#*!v+y>jevBWx42j0<;Fg5;8>nKK2=Kb>J#GZ}kJ+H+Pu6&qBM>^nEKUfYrNW zW9j__rQA=jdJi#rcQ;cq!Rp;<^xh442Z9+RqY#pe52e#4FPrK(FOBE3D1OgwXns0n z{0Oe|2_v_mP>%JTdXe{c+);tZ>mc1uuq`kR9!HUBfsy|9@R}BQ36>WLV` zC~&>oxckhg$gyjqBGF~T;%0wGahpXOEw!k5=iw)w)kU*YbY6U}+q@k>T+!A`RtPa; z5ou=k&ivaZmC#pEbGq4E#Jk-vu3K!w*X>Re-(3B2D3qDn&^fc;Vi3oNx^;r$dg2(~ zq3$L|=A188WFum9`fEsy?zr`08r{v6aqGPg64%z|!-;u&s_1`)aUJ(=D-HiSK{@7c z%S%}NpEHzUel=@Q{GU7DMcSEnrwDI`aqYcLhBwEr&+z7SlR+km@i!Nm3=1xk($Cik zi0hiyWO{z``b^KyRwifOEo`FWcZP92$qmz;-Rqg|oF=AirTd-RS=A3xb#DmcI+8T} zH<)&?s^74c(L`39@f!}76{jkGJi%bo%*-^mtmj1*cK#s~9e zVE9*dt><64MGybV`IdjR_?Lxo?MUZqOA=o;TrinlcVXo+Y&KU#7CvoNmr7E9L;mq4FeF=iHdyNWTh0B8Ff_zo>LPCt`k zN*fnjU?e)<<8~?GZ2M4;k#om~*2wwxX=LN?>{B*0a*hm^<4?4pL|eTonn=thPJW57 z1&O-!z5t$#0TV60(hPgnW=A1ClqhukL~_4_mOE8K#c#pnA^b5YErZ&UhV+641xwpDx?_8h;45t(e; zpHs;ssG|6)Y8gI>gia3QI|8RmIVl|dFp7Ufel?Vwv7*iyE9#uFqRtsB>YTBn&KWD} zoUx+L9iK-=&R9|Bj1_gxSW)MU6?Lwc6}5j#d@Q0X1znTBT?H8{>Rc}?YX5qE2d9Uv zs+7m;fRkI7P~7naFATXgAJaa$6TVbE;~#!VmFnUTKsI)(nL<0Jm{iaw&dY8!vJ5t6 z+1Z+bDmBs}+mfFISI(Ga=X#lCW3}4~!I)*|!o~$g;6mc0G0V@Ou+sIerF?kq$jiN{G!q)RAa2CZw&Lh1P8Oj==Nk)oZq!>cT}6= z$t*j+TPB2Us;5(i{O)BwmUCu$GRw{{Nxh5c*-oL5tM})qGBV4~H5kPlPitPT(EyQI zcCH*(ovXxa%(8O>3rk5S5{D8O^N9WdiC`v)z@$_(y^O^$>p@u%{pEsqSo1 z`#7F{tfzXY0U`_H>S6JVV2iq`P|T}>|M$mw{tx}J9%I~HTsKTT8+BO_=5JA#jng`v zGsfLHW89rH#@#t%+?{(4YBJZ$xH~Avk0DzjQ98<>;PK(|GZzsZ-6UBu?k;IBQ97np z<0j#jozeio$3}3YQ<8Ca>9`1PAiv<_Be>ov9U%CG2(II2dsxp)D=o}?aKc3C$mAkQ zt{I7LrB#`GDY-_*-K7%)Gg{GYg})SzS}Dj}ka2hEd_B)fQ7MHE6KP!930V6M#kOYhzO>98FzQtSSb_zJtbv0 zk(Dwvk|N{oa9UjX8pVQ?SxJ2=UXpQlIIoYCt^Dhu)GsHpQszfe{+5MzL0tJ7#e$TD z$u~&Y7TnoN!PcWB`J~iCQ{|Zh%hOJ25qf$dK;o`XDG>QeOOOiu)St!Z4J6zgF zw|)I-Q0farR=0y9DKhR34~{Eeqgaq~cybwul8n2%P*B^h^zH}sKmwZDs`bP!oxejZ7Yad&uQ zT=^Qsf|T2m9f-DlcDt2=ad%0^-QhY5yG5rYY`7RI={B;)Sz;Rwz+B^h^zk4OAf zPD#ey;WH8JJ0%%+hc8%|;aie%cldGyC!LavyTjKbm{}v^?(pphW(>)=JABu|dN?sl zZuPf7srrL@YWaRtOBr{Ee~+tPjbfpeA17tyU~Bm=D+S~3l8n2eK$7Pnq=G^V%*(Z6vo{TK&$@& zkrjn;w-qJh?hxZ{3MkW^EgN`x49_ZEe5w+xi(|JWl6<8CWT#@!*t-OAf2 zCPZP}EeoNhA81Tq+}&FgA3ZIUs8%AY6~^6Gl#IJWjJuV$QA~*9i;tH`HJL>p<8C7g z4!?;@vShQ*B!?;@tHHr!SFzy~tIaWW6yNxJ}yPIU(9b(*V5PFGa$YI>Q zJSe_8Fz;mcUuGvD&y`D<8F(vmBzSx7JT(fdMb@^w-}rj8Fz;mcdM3-VxrO*cb`tm zRvP1OBMRg0CK-2!7Ek$gDV%%+I%eXtlxLd*+#e{5(yPqZ1B;)Q7 z<8C9W#frkX`$K5;cMw@oSW#F}GVTsB?pEGLF(C@$?iNO1(@ko5jJtb_!nk`AX!Qvq zD+=RoD@w-QA;#Ux+bAYPVcdNHsU|HEA;#UkMZM(ur$VcrLu5r^+-*h4xI4tSTX`GB zgeZ)=Zza_v?tU6t{l!F96vo|Fl#IJWjJuV$QA~)!xZ9=0n?|V9G4Ady z3gd3|M*W*TqA>2ZqGa41V%)8~jbcI+#@(|eO2*wG#@)R|Vcfl+MCtKkwZgdDijr}6 zh;g^_Hi`*R7FP5vU_Wz!2kZi>RoBakoK4 z>R{a6g#7x;d(^?WTMSN%jJrdOyH$Rpm{14f?z5zhjJrdOyRB^0k#Tp3akoXFj*PoQ zjJquYb!6NfV%%*J6?HJ~Hi$?ajJst|T0erwwhqSKVsKhylNe&$t@0biggO{^H&bwv zjJv~?71^jG+k7N2jgxr zI4v^n4l(Xl`Hf;i9gMs6BehL3jSVsGwxSYFlZ?AVjJpj&TRql0jJq$C?5&AxRWa_i zvSr*IULK1}SfiMbjdAxMN!hg&<8C907yc$0cZV2v8-(80kd1NoKVh!Fp2*6^xZBE> zad(Juw}dr{skJ@Cxcdy+r%m_rA;#T<=_+Ra(d542;OjJrdOyPpDD)F$KZ5aaGL%gF9+ zGVTsB?%o$@uQnNXhZuLKP;*I}jJrdOyY~cI+9u=f5aaG0nK8@SWZWHM+bwx+?jOTE;8O{IIaU(G0EZ}i#RAbWNKG!kA2rMwv+rD*25@u6 z>^o=7zH`RxJ7>(kbH?mDXUx8H#_T(1%)WER>^o=7zH`RxJGX~K=8V~Q&X|4Yn(2f> z&X|4YjM;b2n0@Dr*>}#EedmnXcg~o7=Zx8R&X|4YjM;b2n0@Dr*>}#Eedn|%Z^{|7 z@0^~L{d30bJ7>(kbNak3GW)I>9Y2w(SE;6ju(m$=QxcxczH1w5l;&r-F)FQX?63E^ zv?sIg+H&dl09hy1#?-z`_@OXzXnj2YM2g@l(Fz^4b^couNZ;s~QCxnRC zn0?na$DagMCA=~Fu5IavqikGe-~DRJEu<3(^b-fm5 zg-G8-Vta{|sQi}k#iXNQlb@B>!Eer(edmnXcg~o7=X#la=jX=nfT@tk@0HXEbV;r* z^Lt0@Wq+q6v+w*q5!}pfdlrA^ns=Sga)@0uB*U*NJ8z3wR}+Em0|J56KwKR%0I)EGCiV;iH7;M2cQHKa&N zmq`+AhC}F7Eh9Z_xir1Zbe;;(pSvdH4a91C*;r{hy+4=ugb`O8?yW?RG#x_nf03qF zNK@UI7)>SEXxa}yw4{g0RNvjnX!`C>xhYzL+%+}L6-{>)G*EFoC0k2T+0EHcZ(i!i@H7;8Fa7lZo%_1u2=J#u5Waz)WH+v_Q9R(?MSq}gp(nRJwxqUXWDff@G#-bchmLen)Ptt0}12qLDYq0T!kRp zxMNJ?-U#uh%48bX;+_V6j9?qr;x-Ow*xw=~p=f&~xn0Gr5H`L)gfHR#g5Y$Csy^5g zl5Icr!6>I|1eMpizrqkq>yO$RoSqO)*TG~{v!5SjI|AHFaMy#o#p29L>rSP;%_n@L ze+5~MOes+VJCm}sM(oV+iye@QSa;3$m{6N6SpjmAk~Q3;6$!)jflKVnEw%nk0iGn> zxIYQEi*N@3?@KU4)GjfLG(-nb=6L8kA#3bBdMI{YQv5%J_cX$w{g~h2v~kk4!Y?V++Ihe|j=39KAln!fDDdSr^)|h5Kp^Hg(F;Maj5U5xc|-HlwiKsgj^gb&C_5 z9LCj`R*lJ{B-Pn$Hd`b-NIgs&j{$bqn1^Pp&5TQT+u?gZE&AqC?iQNl2Ey2#c$0{= z+Xa53g!37=(N7^j?-1(0?7hwhG=XzELx|PycRe4Xlxctqko4&^mCY;Og3LzXh{^U2i=F(>wH_GK^|aRpy6ks!v7*ou)`rHK`y6MTfP zq^i}fw~bJ5Y21|dVD_ZAY1>7pHU5tBU5|ich07Ny!YvfVo{XQ&W~JX!7ALoq)nc(H8TKI59S(T~ zvSW%^SsXV=V$9^!pFngZ97hluP7o0_8_kMNGc-mXiOOd~QN1R>Zm23r)bz?m-g9`E zmalre=)t{ZvVYJNlt#^Ji4&auJ)gz3R6dJSb8`?BYBd`1XwPai=3jO- zYMCxF&QC7ca5XY3NvzLrf5aDDtEOt$mJHE)^Nl|NVm^0^ch(&ZU*FX%eif+r_tnb?UFjgwDHducel<~|Jv>!u zeI1t=8D66FRHP-kOFt)_PLvp>UYf`^pTH$cIn}1B>;?WEU^DtG#4F__(8)|V+I76p z0B+{U9{|)CAeI?@B0#MH;+e&N2I!anfGmj&&O`V{FO;x!X7(z8`uwi}>`z2^4Ti0d zDc=pHfBp^fgqgpt186bQYBT5l6rk0x)uHe!aHJEaf`2+0N?W`|((EsvcoXxr%%R+L zbmJ!?PGJP+*6@*NEVtbc`D`=yD)>Zh9{G~F_fNpddG2W9Vs097;KX-PEvCnxB6B|B z%}OpsR`v7Jd3IoGldf~BKlvW;))8EAs@v2k+eC2MsWvS(CxTJ7D(!9QpN6E&qEq4A z%G88oR4^?0B^5a@u98w>iWZdO<22ij-YMzF=(xnP3Xw{>V3w%@uYb&Ru2nPKYNZL3HFr*B6k39M#q)~$NzNO3EIFdA73B*gt7e8m8TXJ5RlAC2Pm_*Uok6X)<*kdRd;>%}aUWxZ2}`=) zPCtQokXw`Ioh6<4J%s2HlJ1`$0WRl$#Hh~I6Ent+`i$SSYKw;u;y>iQC_Tu`gi4mt z`Q^$oPv>g6@x*R!r_c4&xgOql?!}K?=PM_^)xXI&K0X81O2%pVANXYX5C$h#`a&5$ zA$u%$wZY7xSU2|%L^-*Wz!Y*9LM`O(Mp7|%8|fhT9C0c45|}V|FWT1Rs>xNGoAoJ& z{J9aN>v9K>uFu^I$1q|3Q~5jW-fA-_4-P24}X38l2;&IjL;I{@WJ=J;`8 z;uhjjxt-B)RIb_RmPd}8yC2E1+~wqr=XL|1$i0dV$=naXd%4}nwK8`k?^dgFPr!3x z?h(=_<+gzbpK$QgERCSj$HZ5vZLfup{@%!|Xq0r~dg7X&K&={@KGPq@ZCU1|pF%$? zP^USW4~j7-eRhMIK9PA(QdT#qIn(9^Bz=yVepxe%)8`tXkoh6c%k+5$2s0Q0IO+4N zB)KlL{YoeoRB0U@oOuoP(-#_G2)`geX`8@QZ{Dx5+o2iK7sY>0St;S8-t^n^`vK)f z^OE7@CY(w8IPqh6Qu%}8+dzolLlOQ^GjbXZp{BV8w@#OU>BN@AjTfp4Pc*O(cJ!57 zNeQR%KeS=`0mFCidhAT8@Ds!Ps<3K=k}6+%j7)smwTxzKPH6>p*l(81L&HR>gVWeb z1v8hJZ{i1tzW%Xb7H#uPDt~Y+`Y!c07Q^9`;xrz}l=7#VY8}Q9i$=VNQ`mv;Kt8V*f6FLFw|kFm2o%sCKS`fQ)n722-FqgexPvKb zH$wX`EhYEtDx5oi@Y5^{?!D$BH@^Dv6FQW60sFPz+p>kDaCanS$I??ALm!Lizec(p ziiSIjYdy(d)}>=mCaMCTP@#XSQl=Vr%+XA8=bQ305eK=u= z_rrb5#uJ$!?zSeAW~Wp?6uy@CS&`j~H_+e}E=Q~e7mt$$!v`juWx6Q|L1DtT{1z>J9oSGK_h_HbZQd2+qb_g+M0Qi?(Wd31O1Ol+FPih zS6&10x~#+`2JwDH7W2R^9z+WJZ6&G@CLLxkI-(~@YtcIz2@82J9eUNJ<}#vlhG>GQwe=I zvSB5T|F%jTXezPD+)x;OCD7dcnc@p@~B4d&KuNZqo7igoyV)?=b-Txg!b3Py=bs)`C)q<#saozqSon3 z9Tu69?bBsY9)klBO+}YV=Irpbn{0r4Ez3REI~= z{}zJnjVS|Fhl_{cc!XekW6Gwzdt=I0y?Ub`!ZxVMAHSg{n}0)1%n(#>d|)#4>JhV) z=-ErI4f{z2nmU%8lxos)la{824eF>B*p9dcv&wu*UEUzrergAmY zL$m#~ehnGE`0#xkcSKPQ!ExhYv-FK@)x?dhUeIQIx{Nl<#HF1H=MqBC40{tT`}VB6 z^|v*LI`%8W->W%{BrUijsTGn~UDf$|JVeWg9xuD1)*w9HtzKY@)=P(s0F*&v-ME9; zh`x375O7A^x0&PIMgW-C#=?jVf6w{i{a@Pi#fPVhpLZf&Ze!`xGLqa|9L+y-z8LRw zzWCpsDJDAW4w3{n{d4`ZmbB(fG4b^?#l)O?9sfnwB<4&pv2WehDthZnQTMOL)Hga` zG}gb#w))2)r_5fB<=WG1^pcjz#&}tAE2G$yrw$&7JpYi zU=!f~lG_`9xBMoCUwaLI_q^1L`Pysvdl(>Iz3kw_9Di}Wib(j{QTTi2l|Spty42sx zl)(vrvg*vwv{AJaKb;Zb?;XDrv^m14sxMD~oHj=onO)OQO9vfcWOgfS%jozz!pQ92 zq-mV+b%c>wJm6e_w67zKOmu|d>j)#Wcl|<-(*je^%sxhk(AN=0W?uu;6?BA=Sz=p& zBaDKMFf#i^aC5n!BaF=c7S<6)(VnnY_0P+OF)-WXpx5@esx2;+&GxuzP@rb6WEq_w z!xKF)+vC7&j{~zk4$SsA=(Rnr8Xxyytz?{*--<2|%=S1i+vC7&j{~zk4$SsAFx%t6 zY>xx8Jr2zFI56Aez-*5Lvpo*X_Bb%x1G7C2%=S1i+vC7&j{~zk4$SsAFx%t6 zY>xx8Jr2zFI56Aez-*5Lvpo*X_Bb%x1G7C2%=S1i+vC7&j{~zk4$SsAFx%t6 zY>xx8Jr2zFIOw%Kt~w?@nPxHDFex9gX)XoDaIQgMfXZl^7h4|WNSDh6oZRJ*- zZR945+^W?^ZrayLf7Ll=kYvqRt2);J1z#KOs`CsGnrTsWe$^zT)%n_JS6xsw8(^@n zjdszW46jx2N^C9QU*}(q~39}ewOF7Lj$JZT2 zHZ*|i>y9E@V}O{iJBn7!WVbRk;q!km(H%v0UR)(*#gsOe6WLSJ zRjfp!JME0-6N1;shbvcoJ$53Yax}3;syLu0b=f~P}CKcq8SS184&%{ zCl;&cuMt;~`Mz?BS6#K9hn#s3HPaEIezO$mVRM^`L~6{HA<@rYj? zYIrE&@JdE??1m+%rJ%e({#4=*0OoQcQ)-nxX7)o6 zb-J9$cVs$zos9T8_swNQhc5JXU6AT zp78}==l+>VS^Xey=_1*w2zRvwKbF)VPwA&_B z`L$|2)RtbRT~)L}*6K~&M3Aqqkfn?zM;-F8C=&8{55;5@NJgboiPr%7Nn4vWDl-Mb zlquEM3$2ZYYg2`+%2;wlnIy_~bg*h>D3q~1>3*tRWwaeY+MN4mwvDGzAbTu`RN_ne zBb7LnbiK~~Go1VD$rdfhxnh26&W?hYdAE0hf0NA(e$1937VOBGL_BzmPhJzjzZl5L zU>;j?FPH~46>NjlbWlT9KUl|(t18$Np_$+za%F>918<^%eu*d_oRg>1gFDy+7XrQ+ zcZ$J{{U|Cp6A7h258^O5o$LFWK=wej!PCV30$IA$1)u6bAZTEqH3Vv&#$XKia*&3< zDbOKEbC9jUC?Qyl3i8yeJ!qk<0l|2r4GeTaGbpG-pN^mv z&d%Tvv>h58N_trEA~J^u55hkpc!RP=2Hog0D$t@aI%uNYF~MYNIyM;Dh>x#e0dl&6 zv1qt)uqBx8U>KP3!3gR#AvgzV6NA^lObYHMy-Dy8oSOze;6!P1FqU{qu$Zzo3tp#9 zHV+;Evqf+!I!_JSDR)|>oAT{>8Knm1cs=NKyq+HvSO1yg_54utP>XuDI?UgpEXMan zp!ZfcFupee<9j3EV>NpAIpSo{%lAfgIlhu?`9$F;e==QHknfGc(M^&i-x~$_-Y6Vn z2AzCw6b1-BHi8?Sf_!fjj*H+1@(Vsbg6o}vd~Xy^h+rPq+D#Q!TA1#08WM#glY3Bd zqi*>Nt1=H#a-)226izhtlWr^gL*NLdAeEQzjl#)sWlFF9f^P?k+Z28QP_1otaZX-o z$G@M?1dDU?_W=~D_dCcb&dWVTy3VQ6)E3&jbj2+!l7V?g)62|XD)3~=`-&^5ZR5v* z$|u~3Nm0z#D1H*s-AQq!QwhGAB391$jlxfjn^)h)6=%(@>UKn!qX@3 z2_+d%cYi*)ytOjUC}@+Kj3>Y}E!b>^<8B%1mAF}lu~iqj-hE`K{fuGa^w&X8)c`l6 z2l87&n`jKATJwxk3axfStNuEct>VX^#M{IK>&0s_XyDZv!bVWZB?+m73TnB6Wj%kQ zY5vK|sv++5*CA!qL001KUzg~#bUe%5-}1D?uN1usiM6VWUAfxMX`RY`vZli`Pio!!Moi1K5QCvDe&_bio4ACXhYSs2AL#Vje z+f!&G+>~h^LoK@L3G7YJNuukfr}oJ8Vs%%QpK3bgXQG>~Fp=8W_J;_lsYNnV{X8E){YN++xPMeHgys@6v z+FC`FsiD{=d!5p*-gx276S7TaF5XCQRuAWZ2^zW|*s(w!^XIPFg(ZLBk2Q}zaK~wE zKFXbx9Da94__JdB@LAq+Gp!ymZks*RR_ zSWM^`qS9kAbA*2xh}A;g!qjuqF|$iZ52uv~9T_2gi<}K&x{#}Rg>kE6)tVZ|f;d{p zJtecoa;^q(mXNzDd#y!Y17fX^12mEQ+0yR*rNaFC`2)LaH>y252tER!%ju4SFBu;>cgkdh+Y?|!S1|g)4V(GrNHJ%rJNV?3zJ1ohRz1gb}(Cec3gqAg2MZ5^ni{+=aek zkq?5no6s|e-bdq(zf3~ZU)`J@G+#meoM0=iIh;fVl(bJ6Tj@cdO$D?#tfx5x#%jD@ zuwfq84qqU3>m9Xq6vpL*LFOjv0(X{XCl`ulvR>dW6gUI=WWqolKe`vXHCpIb zgZQD4=2YlHY%Ex?)`7T5NF8CqIY-As&7=83moVr$4gQPVRw)r%?Tj#I@YmXQ+X9A7 z2px;3z;uIcqh%nL5=>*>XK@z+pDD%Vu{4ed%r9e@%JNJJ*gL?0|N;%)$k*S2n+JIZtb|<)X0xEy*nlE{qvt#lEJ0=H>;Yy!iOf_Va z99{L8o;%SsCv-EQPa~LCJ;`m>mxQ|lFC_Gg#+#8mg3)@4+oB?mhjuK%RHlU7A3~@0 znm-120k|vHxfi8ku5wyj#__F9rEm$0TU_3N!hmgHAt zRh1cks+@Uw44tf+VZeWMb#|0(p^ja1^5CocbN&tdy&CT*cMH|@d}^_pU|MK3)MWfg zj9G?nLKf*qA$@c^#_A>>me^#xFi$2oMg`?IDik?$Aw6o8$~nyS7VVOo!p4T;9|Jwe z6n~hzsfx$UWiP1e_)2vKG-|5uyJ6p|_3Y%@*PX7(^#EG0BMdT=Yl+*c$>q);WcqfA z+of5_Z%Aq3+28hRc5K3_B8)h6Z+>;^Ah)cpYz5JuV7g81D?2Kyi$<)*t+_Am>FOgR z`ic#@0@xX#kBZ#sZiDK!go>SLs(l<{M@y0E?sQSQDQ_&nH2M!ACgX3=po1?W#}IOS zN)Z}ubKM4=6z>S@_Jra0Lf8AJ6qBud=kXxaOGA*cVNcDpJte`Wr;d!#Q=O-gLxX2i zn?ujY&U3(NJ>AaYqV=@%51=(sm-ayqe<_lnHd38U->VX)@7ZvxwgdFVlsm#U#Jl8} zWEx@+Ymx255$@*d#Dl5U0R-ELBl~vZ$UdDo$#&w!a9=8BmVXtrCRzb)zU|)Hg}-1{~7K-5r$7i zs&)YA;ZD_i=MMDWm|vcQ7ohvlyUa1hKiZ}IR0x|BhP?t&1B@Z|W7PO1f(9aof~2R@c>_r8 zUAMDHzAB(}PLK#^POSGAkNIPGe~HboniBBILjvWo@GwwTDY}qzcwmG z`xaiQq`*y(w9S90H_5gx)gSh&N`VhV1^(xo3tZZ#z+r!b`);H<sgQfR7T+JWFRCtVih`z`rDP9jZ|~-y9$P z1Nc3{u&IdGafUPQBg%|5gpyqObJt96qs%SeW1KaH2Qmjs-Tb}`VbcZ3iZyl$$8WY> z{RSLm!{IL2bSKfumbRT)Q|2J1*P5cmLDtiBX!On6P@2}=hVH9u;3{uReHRlcwvpkT z^9{WA38u2lQqteaN_}Uu7{`y!6MyLWsN@ye@B)x$&#)C;&6#cAk4j?JS~hOov45j+ zTHlXHA|tfKYWe`XT0KrHcD2^xEO9OrEXfXllC+-$Bun|*fxP`+rxCrszeeYH_Y=pw zSBc|J;y4J&=J;xuQvVS-@a`R$j~+T)UO4If_5#^H0ftTKlnDg?m^oq`C&~1+`F=Lc ze-CJ1sCyGKomBmPLTOiKQ9jYRG39 zmX|=i2}^8uu?)-|E0(_zT?2WoVd3LO=L4}EDVD*x%f!NV%ef2k9b(C=CSQm}5i6+U z4$Wns1o2DX04Pq6`k>D#%g>kFu2IqO^x`Rm4)- z$5_hgqVx~rY6(l}KiW`=mx)rW6A%w*-B@vqIjO@QM}sK$OwSF{jCnkl*Lr%y`QL?7|E7D2xYmA=t7UtnCOeWwdc?BB+~Z(&_oyoIIYEzHAP*eakiQt}q&;VtY@ptDml)bj8a){m0T zOUYZ9hqth6fG$eOTbPHpuyKsfH7R)u^Y9k-0MO+rc?vVzxYrcH>?7qHoI_N@@0OhGDQblQ z7RKdiR=&Z#!4aM7dHDwSMno`|^70Mtjfr6N$|by_-+?CilhCVLZiT&ZMq?*&liIB- zErsK*^s#WTniHr2I|2wji#21+gGyVN!OBwgq>#Qu23CoA9J-qJq0?d#8#6n>^H((Rx~ihP562gjAKAQq$?o;-#` zR=&Z#WBN#0?q2{UzXy@6;c<}^`3Conk1Jn6EJ!&yc^`?ae1m&u^pSFs|7R%qYl*Cs zGb1VT4ep&4SH6N+kaB)91u}anocS9d3SNlsOWekzk<>!$U`3CoHj4NM3EJ(R6IfiQ5KD*sY!8dqTzQMh97REPt zR=&Z#-&h#m;929Lk!H!Q{x%@hi;u~Cf3t~bPZWGE3{Xo9KJ$!@r7KLx{ z@zC-Pkrjn+a4Sl_!99F~D{nzeh{8AczNCV!I3M@$4c=Q6zQIq1mY+prMd2IVih4(* z5#Qj-TM!eX@C|-5sbHmA6yM;zMd2I#326BXh^#1lgIiHYsuK7HSKfk{5QT5>|BwpU zNjM(9!F!9sH+Ta*k=LgIRusO$t*92UPjTbQTM!eX@C`nbR3P8r9=^eQi^4bf-V&v6 zl&mOxgIiJZ4esF^TzLy(LKMEi_4QC-7JYn!8&UWM59Ax%!#B7=u&f8NAoF&Q5V4{Y zoUcyDH@M{}FbdR2_y#wKYOWXM8{ES;xaF|J0^i_C`0^`y^usr}7@V4Rs_5YxTnZJ$ zgnsx2pGwN=hi`Br3g6&?e1m)V1~&*+I}JH}gYO~P{fKPc@eOWeKdb47Z*U1KhzZ&F z1|LuBTG{vp?~$E>?%^BUAn*+y+^)j#4Q>(roIt+8J$!>(M6DBCDc$i6ZV@$3AYYOm zzQHYm2K`J3e1lsA4JzN@9=^d1f(Km^UnLdj{m#QTxDnN2Md2I#KhW|I5Lr?92DhT* z8{ES;xbhangeZK2cT(9vzQH|wgZCDNZ}6GW^3_CE6u!Z&DES8W@C~lK1u-EC-{ATh zDUfe)58vRuMd2GN_QTPVGk5nMv;2yrgdyB$1_{-4p zR})!L_y)IHU0H-3-{8ty5EG*C4W6aH1NjE`@D1Ku6u!X+gU)}@BMRT(R+M~$d-w)d z-h!AAg>Ud3NCol@?%^A}w8{ES;xJ96je1m)V2Db>*k#BGh-{2NeQ3v1P1`(-)Z}1M}=YQIx4!*&~ z;MB-BxQB0Wm0u7O>fjsvVp4&8gM0V}x3W=3zQH|wgIfgZ$Tzr$Z*Yr19r*_L@C|Me z6?O0pZV-_=_y)fX`S}S%wsr6gE(WJYzQH|wgRA_4m{14b;Dc%7K)%5}e1lurs3YIt z9=^dX0(GuX+u|GCB2Y)Z!99F~TSP@2e1jWAqz=Bprz1cANRK-B1{Z@<^A>N79=^d< zenCvAgKzNfNgcCS!Z)}TmB4=!lgq<5xIvIn0|DRQS4#GdM7FB<2Dh^18{ES;xP%qN zglv3+|Amx&fZ!Y4h~kAmIP*1_@eOVedRs#_zQMnQIe!b0m5pz3D_g$7J$!>pSV2s+ z?H<0tD}ln)Le&J{;BN!frQ{pj!#DVFURla1`3Cp!4Za+x#i@~Ra1Y<$ zyec{csZ+O>NLzbjo5sg&*9)myJYGSToEjYoc=({c3w(ooP)Lh^}+ok;!e8rwHLXSgui?GQiy= z?h?=e@COo45}c-=AnraDs)#Oh+)>FBCE#`l@5Ayp<#_<0h=;G7ynOXnp?^>wMMlvv zNmJlx$Ri1+z!@Z_2~dHHNGv4KV#le)^f|2kbJwh8?XfM^Fx0kK(@A9M^XE1t2f)^R zHiRRQvs{8N0l0+3g#xYxSV!Vc0)B|UCZIXFj|BV{!ZWZusXTuG_=Lni1-uMUHxV~# z1gHPsz9yi5viYANheIApX#Nsl3lf_N;PAuQk;L`{>iFin)G_Ogq@wE6rfi4 z1BoXIwiOnV*HMIqoW~}YN`PA7Z?ODTdDIG-Nu1dJKkU5+oL0rvKR&nLr`>&?-DP{< zWm)vBchDOH}M6CTb!^qsCyO#zZuBO^o{g ze$U){_hDU)$@~Aj@9+0}1D|YX`rX66i>)IuFSaJm+jk^z5O$e>8q!f*t) zk&Lyl3p`T@uohOrvm6fJ)?k#-%;4GEUn9+Cn)=Kb+tc4i3}$AG9a&s_N&LiH&LFj6 zl<}Le*u^Ap?n8EJ0N=Vb zU(~!gI!L4!$8<${QL0|`%`q2G6kF_pLiB{BuQ@*vCeH_PO+1KuXGC;=dl#qsCo=hd zv;%toEK;CUasjF@pSd;h%q{zt@V;_XSF|gq#L=$YOQH?rGq)z5xfR+q!@FqLjE`y8 z%n({d?U1dE7h<*Wttbfh7N$M}b+GYI4RJ=B1imw$Io3B@!)*t97E$_^tEp{pM!Mg{ z2yyI{_;o#d9?5b+3sUvuEWRga@jW?<@5xzwPtM|dau(l{v-qBz#rNbaz9(n#Jvoc- z$yt2wi8SXZIg9VfS$t2<;(KxyAG#5YOP-v?_v9=-EGBW@lC$`poW=L#EWRga@jW?< z@5xzwPtM|dau(l{v-qBz#rNbaz9(n#Jvoc-$yt0)&fsF zjZ06?;(Kxy-{ThIC{NDfdvX@vle74qoW=L#EWRga@jW?<@5xzwPoKpPo5{)q1?Vwe z6{<^l@|uH}#AI)J@|uGuuQ_<~nu8~=Ie7A#gD0;!c=DQqC$Bkp@|uGuuQ_=0z#-!u zheip!!!W`Zc=DQqHv=6$=gDghp1kJZ$!iXtyyoD^YYyHT$XF$wyyoD^YYv{g=HSU| z4xYT`;K^$ap1kJZ$!iXtfsv!ulh+))dZbeC>DL^5K5u6Ywb&PJmNZdpmpjwpN%A!Z zyP_BUD#_Oz?8@3o0Dkg1d~bGD(cu8nDs?o%=h4esfxUDxs>_=8*UV$4>|hR}+Yg01fE z`j9^jKje**$QmYGp8eYX&OiUWt+hzxTkY(I+k(3zg{{AF=X9W4nveR*Wrmq(WU@8gSb{3(=LeR*Wrmq(U;${Gn@9$EI~k!4>VS@!cD zS$4l~UEh_ER}{1}A$dL7m)Dbhc|F(fR{}n1BMVt9w$?wg3pw0ZF_d)me zKiCuUq_VCB;19QOUNTBLQ5@h(g7T?VSH4_a@#W%*FBeyQxwzuLfKbQJySS35vK~UT zgq=Jxu^L@B$%`w=qpHb^7gv(JxRN}&WEHsb;!3hN;bTG=hTwT|C3$QJS0Fy&)gcT6 z(!98mJT8QBYlIh9l4~@K6*JVo$s?RAk#d^nVw1=7=o<{!;o?g2ghHmuysb*y25g2I zM3wU5O7bL&k-~b1&Ex$M+m|`OmpQ%mKd40lv%uzRUr> z%mKd40lv%uzRUr>%mKd40lv%uzRUr>%mKd40lv%uzRUr>%mKd40lv%uzRUr>%mKd4 z0lv%uzRUr>%mKd40lv%uzRUr>%mKd40lv%uzRUr>%mKd40lv%uzRUr>%mKd40lv%u zzRUr>%mKd40lv%uzMcbu_YBz3vIn5`a)rU!Y^u3m0q_sUui>A7U(=ud0opcdQCukg zf@D9#*P#5JcOcn%42YKhHog_xzk5e^{V{1?WotQ=m`z z_u*4X`}ZMM#(x+7z@G*B0)Nd+eo0{mN`Eid1M5P+V>c%EeSETpzZ6VNzw-bl_sA|} z{alk;gD=loaalJl>S zNz?xbnYaBdQ^@%oWC@q9<%UtV_yUmT_;5;QY?7bAO<;!VyS+H5mo*@U^&cahYf^CkmMdQJtpk1&< zKl(lV{j`4z{f*);=Jl7tX7@nG;ul-UlE@F9ZRYitY_kxS{1MZWF(uWB;86?x4rqF? zWT9rZl*Z|eDQz6$&xTNcI$Rm8$Qx6}G2ECD3AZJD-^M5u9-s9OI(YxW=;ZUfnn&Tb zY4DcW_u{f`fscc z(;rVMgRNY@7C-C&4IH7Wlw-o*cndx?^AckODXgZ8U%)qenIXMGsZWOU6My!%kg1Gc zAv`@F(-s#$*G~q7f16+Yy3C|a?r70T41AmY%Z7nA-wKbpZTVb5eeKNxb87if4AE~E zh%p}Xz_PQ5(o3l5{Q|DLt+JxA2yrgOj~K_Xnu;;rY2!FnYw=+Wyq5@C$g$dsj;CKy z2GsV1oaccE#WL6S-XWxqb2%Tu59`PBE3yy1tS(#N>wp*QG;VoSKLjKr1G_xy6dBn4 z5Mx_xV3)^iV*|Tm0K^7%nQClc*Uez~hz#s9>#>1d0%hsYz%BtA*iDB9b~Rj6l@1N; z3QX%XnNXap4baXi5bHESo^=|S31^nYI*r?>kny4@LxV;%bs*Mh00Al7LDu}%|+b(%n|(*$CjCJ^g1fmo*r z#5zqN)@cHfZI!z$fX#%lM6Nq)1K&;aQVx1-s>okE_ zrwQ_`)3`@lgHeNGoyI-6bvIOsZ|{lU0$QiZ4sg#-yaGs!x4P#P(yxuTy60A~>b3D! zcWpJRQyXt}&yypC+IXvbz5v>ItGiABZM@a}LGllXqm8$^7bHIbppCb>7Yfi1IjKRD z<=D*`TF5aWwkhKfC5C0(i>%r3J73}_>=^#|U?M)JpdXAos^BjUrjcM7{AS=JO=ShU zVvw+l`U3wI{weIh!mZDt15c`r$f=TLmGTh7pB6B{PAvi}f4YQ}74N@v zf93Bc04y!>JHG-%lG!3 zYY}r#3G`E~J0oPD3=>O;Y4F6pMJ!%AwQvuhW(!%6dS({@`%6_9q;@|5zybks@~%Q+ zVdio$C`#Ric_wjy#3|LyPrNig?(4G@w?wdoR}xY3#KBb?Sz>=touP$;v328#2iQ)sU5Dxx~nG5vZ>UQ=%&fq5~gCOeueIqtg9ha zRq8F6xk=WiX|KC8H4U9T*&uOVNj*ZKF-6nfn@a~Rz~s=Rxf!MBRs!lR5Twr>GbjeX zbq~ogO-7Rf7U%+=6T!90a+rZ;>o15Fev8SL;BF8Eiy_RZpcQ$-!Q!>dz+mfA1cYQ* zIWEFvAIQovkd(F3}odP$jUL0m17_)$6yNDusx8KV<0QXKvs@{tQ-SbIR>(F3}odP$jUL0 zm17_)$3Rw&fvg+@y>cwU9z{i>UlKiTMHN1l%CNt(_oS=B@9c6UoURT?<)^k_S(UCy zjs%cR&0?Hd0a{bv9}J)_xg$cRrGEA{fO-Murby-K<+Gb3FWU7Pa?vmkJ-hDjQA zZFcqVMQ~18J1{$aE%wsvv`l&8WrU@sVJgT}Na9KchD>FK0Y-`ylc|yrOX?z19o7;H znb8&Fr`F?x$Y-pjg}kVTN{0qi zSUc21rKyL40Tm5b;$Sb~V?($C@d>XE;c}G@4X9{(T(t@fs0dsJre!ps!fp3*>Y-pj zWl#D;11h9q-c}`Se8CmWAPOHEP+_EORjx4cBZNs~kt@n_Mpe^y@dd zlCYU*6E9a9HWMw&<;sf5Ouv4UD-Ui3peNB>g^=mjZ*sNL7xn8mxjNydU%$!K3mIR( zxei(N?MstQggv~xQ-`+`@RmgRCgOP`=+xil@y<#q{S9P6ZIx!kTH3}qTyA~!XJkTNbm@)z;v@DmKZZRc?L`ktMm;1g?y+}jeOpS{VwCxCwTCik%b`q`V@-*Xos z&P?T;jta}#xiyJjv$B5jG%Ei1{`9kpumZ)hT<%2cC-7GlLJa0gty-3AzWpNnzWsU> zRD>c*P&IuB`7yh!%{R>@>aaMRK7{Zq^6gpxHLUrFEsgcmu=X`G`PO`U8W6&UwXZ|? z6@bA3Q3#tthfpX-$QmGO*d`jwb!j!($q&LWVNBApsk&$oaz8`3bY;8gkT_zs6eP^n zCK9q@*ruBBohXGUnJ-8~dN!!gAccDPB_bQPdkRdsnjazvhew2L=Wc`uo)ZP17YEaa zkdqPLw^sv*p1rvhe&=%h6wtC7s5>3V-yX%w24W79f0^H%xrH4gT8bMH#Md!vVQ)WpFEk z0@>XPWOpl&-K{`&w*uMS3S@UHkln37cDLjtO(Kxptw46S0@>XP^zK&pqGUF0^mG0M z_NfCg{Tu!3=vS$?zk+IXfB<&tEv!_HfdRh~ANk}hkF0OBIk_TG4!;;8Mw@dQ{8$c< zvd!T+YFpJ!hJ@W_8!cG|rsNiKUp;cC#KOuT?`|Y!r=DS~!LroOrar{-)@T*7;?z2Z z43SB!EcFZ|bz`WImDis{U|22X6T2!kS~5|``&t8#LuSmknQFuJRNQW35o0GeLQJuZ z5&i?rkI6VAe95?Kd;&qni1w=x;&9|pjfZl5Fj8bSjcF29{HS8A8dUGULqA+R)omVy zHBZs)4!_o3#b{{xsiZF)fNn%>`8I)OKLy(HF8w1STGfY!(p}3)aRix7G+RLTbaqPJ z-Fxqk{PmjXHq#P=`%J|S;BhpG=}|2-N#Xw1JuAjE(@uu_SQ&X;-G!z30`~@q{V1_i zoQT4tnuSu$1F)PcInU=8@>_;;xKzzopeBlTl6?P_Se6lHVp#I+lKkeJUNN>Wny=^@ zsgFux`GfLP;m}MA81DU&r?Cv{mU>?rP;+5GZ6*VGaZ)wEj$-?ZrEZoJD?hBj>Z3H{ zz0d)CdmU)|(14l?18S_u+eqA1k$CF(1T%5`G3 z`2L`2H%l{eec6Ymv|QH|VqS#Q>98L1d`wZb&@xxA{oLN9k`bm~Xyj`LVp!+Z%)0jJ zCU|%(#?1NzsSk*vX(D0S=Q1`dOvQ_<``Pddu7UAY;c`g4b-vRPWWnI_hH?JbJme~@?pnes>Vp{Y3+rskNd z>QcC^>s~d#e=nYjS}Eb}4CnY({Ws~nv#BWB4+WMaDma#%)t!_STamV6K5iiCY`c&-kNz2*hnC}f%sP%8 zv+Zrz-(J98&O>lRcPDa=T}28$`ZDZJjvRCCDwg=tF}AuGZrB)(VhimATlX#?ZXxow zP@xzHXyofaY$oz54si!-q}zeVHsFSRMdT8VYyqN)$ZAGkrW4v3h{;4A%ZELV(8$Ap z_#TnJW0p?R(a#3rOt>~NwQ#asz=B>4#1G-NiAubs43;>BVzpgFihB`yH=NWLTN_o2 zEB%9UF&(uwobhHNwt-qeh&+@dNDc)hdB_o@9NrQ};qbAY4#lS5Hce|)gFm-Qv*XE` z89K~p9V|}*N#tu9!d8oNu>u@(SD@1#3+ix1I`H>wmhHN?_>8F+}E??d;KPpx>iN zPrPyWhafi6NuZ1e1%QDvn}(|FMxOg zZrf9#i<=A9ZHtt#iyg2Vdq)r4A2F72wKumT@O zB`*hGw#HISBjm%{m1t~`s4+0GQSUs^V>#<>`Ibn`e?}+O5xUHcd1ao>8LvebZ!Ge% zJ)G{e{WNlaAm+ery9CAC89a0m2IwN3jF96QrHp9~wncjQ5fInFN#|e_4@Wd)GHPPU z_{(ikiP*pJ0muDoo~G{VU(ET+JY-x0s`Y5LPKljnbw>Y;&T^R! z=1I7rQrvPIPbNT%yms2KHS9uFx}+b0;DadJeL?VNohBbi<$+ z;HW#X%5nT4eb`r9_h3C2*csxZe@5p)px6!uoC@r5%x39$oEL!0?+{E~4cwLGbh~%; z8xg&2=|b2R@%1-;86sZ_CpE-S@w|gPs(~l7g^cbjegh&&&VXdZiCYu@HbZ1Q2GvL0^!3wb)6 z9!g)aWGKBFh%4aG(e=Mukqqh!3>h5j0p>x>Jueah4?C*qc(nL9oP8qmi9}{_-Mh*jFFp)B3-=RCg zUO-HTiyQ2QS`0kL@r!=QlCkqVgq{s270xl{5>QD0)nB00tsY~x9$g;Nbk^E)kJD8Y zPgM2z0)Lkms#yd1L4>^RIGr9p`a;wR(j%X)FMmi^eg^Asj(M0qd(PCrCVtkdx_@Z* zAgZ3hR#_7`gKa=T?|^InIlflV&mn~|L-*k0Et%f??*P+da8htCHIO-s9n70whvad# z0-pgc_Tq!_ZEBVW-Xda9_tej=N9vEUg=Sk5nfi2aodVZ>BcyQ; zYwc~v>FgY=vvVmTTnHzX_%43OA(GVBZLBY;5z`-_n}Fh~5K_23WGg}`0_-sj*s5Sm zu3O1We;Nx$4fVitIi?J>x=n!RLZ}#0&Ke(RO=rO#M*i-D8}^kc3xPWy zPTGeZHtekXn5*FBV~F7=OW8-hT?)rS&7}mWJuAH%3@cWl;8t?Dg-Frp6PXH9xzE9c z`IBjZuN=Epl{#|EetD!s&EJMny z5RUVDq{XKk*PB#zG{t{wok2k3+qp?WZNUKZB+GrS zOs8fOL$91-t4_E$fA@s>W8yOEB72f6y|n6D+Htbntcmr!5tV~EP_3U+COppUCg`yh zhlr)MYE55nm#eth>Xeu8ctzRs0~(_Q@grfBui}`~6Npj3@F$ z7V=DuJQau&i2RBJ{aL1H4(|ry4!HOWd9F{?|IaaHTj@oFZi18Izkr-`7+Q|seZpC0 z1qvz^#~%9@qHpyb#66ZGm#d?9_2@2?T6$9u^kN2=>|9=00!=9xXr3zDy`=A5NjJ?iP9 zi@as%s#Oki(fUi7KuuAEMtL+kS+XI2VlN$Nj->8u95Of(Zb()mrxCdth?Q{dvYZ}h z9>7u>Gr20>L$}n!2z>x<*dLc-s@YQ`{{X~hIMq6Ui3i<#TB;usmo;5rj--b13lM({ zH+tDZoQ(}kN!*yxE{c%AoUM~>7gbGQ9>b5rn59=sC8mf>6QKng4<{AM_4iA9?I2SV zi_K5u-4KVqA=O9)9sA7+wks&Pw(#rFsMk@5cvY*z7@7Z!&i$}?GDOtiuNp0U!{#6) zxF?*%i|YqHi@3)PXND@a^jsN#rdwR=ZHk00hJL zI%m`g?xMNSa;2_bDpy%9ekZ>D0|?r!pKu<1#OOBitVJaZna_Urh|$hUT!y+j5KdR( zW4aPI1MwoHKbuAM9m&5aWlPzLt3 zlhN8F#kFkB2yFIX#-1^HQ$dZT|IiP~_F1DhwaefVr+E;vI`m6^^UoPF5tETr4Yl60 z5X!L`1GG*-nrJLSVvnwxH9$p!I4Ug7Mn>lN*yv!sAut&k8@La9;oaSPA$yGOg?AhM z*b8fR#eHKq>4o>|UU(4T1#prx#`v@3tV`*{wtvt{0B37QyL;>!%y84Tu&Z z*>L@J!<__p4cs;?7yrF77_;e1>}I2k3U-N`5PB8duwU{s-CiS;yTQUBoK!c5``Dwl z&EkVP0L!vr@AD~=eT*{ZauSHg!wqK|T&@;_f)WI)cwcj6-f%onLipBi-f+AFqUV21K4&UDUzTSm4{d>_;Xw-k&O(Zq;+~KSl zcELds?Z4Rh24*vW*hAsDUL^*EQD*9U2NOfL+1M#?Xr(;8~alUNg)J1 z#??J$!3>zcfZO)7NtlPgZ&*2#Dlufael$W>!AWVj68}V30_PFeyod9?ZoHVRnUQv(lWKxWbExhy&asi zLp|8Of%2hkq;jIwvUKdNhTkgCM^upxE}qJ_+6th|wu7dYHD)9Mi`X_(#I|WYj3+04 zhXfcI-9@s_Y2&gm8E)8$0sA=Qo+zX)43QFzMb^~BF&y*8cH5SszIGB+mt(hK8!tcw zO@mXDc~0RTIBdY|g~+Cwfb$i$abz~B_Wi)`IR8VxW7VR=7A#)1Y{{ZS4w*A=*`b4G zsKK+AEnK>6@S+2kE0ocf$R1R)ZHEw*22ucRJF=MNdh01x|+;qww=GfE%)VCifgiErTHsQ?^nE>w@Mbo7;gO?9g z{HUaSDpGz0saAaSovQJ_nDThm0jBL2khbwIl2$kP9S5yLrEP&5b|?mkHRhgp+HN8P zYRnb%*1_9ho=NXqczsK)$Z9rUfldE6@V;Gj3%=pUz&!fbQj)~AX>SQ&%p^zQ&j4+) zKEq3l=5I==k@mGMdsv&EPe>b*sXZZ!8(9Y$nnK^k^bNV2>6^}(CK);hYQ8J*Cvyqz z3|oVO)%5@4AuJr1i+`YPU1Kpzbu)efl}vhHdhHFk0$L;)O)+nq;L^;Br3U%dRf*5& zJ&jD(dl-T7cL7E|>qpLd__0a0egmKzEJhn_XVyFdWJ&qSfHKe2p-LLcYfukPBYx_? zYyfs8=Ly%J8!0*VjrSE|V#)nFp60L8aQCm2&%S3L?~ zi~zRvB=g@PfNu?Fmc|N@wmxQ@aROwmI+BeSpxAnnWD^7^vwlTjq5xIag=D>h0ClSM z0&wsRd#b-b^KcHsrX}genM>G*u%{;otZ66(^BK&(G8ztse|P$E#V7@*mVrcyRErb; zNb5{{@4JA~)wfR}{kU7yiU|9YSs``SUGD<8zWOeNG+D1k~G{&6%$N46vpT zL7KND%3LT0l5nHlag}| znXm4b*psbeM}X}E5@niIato*)OrD8y&9uI10PuL4mFu*qx6df zD%T$k^xi6iB{QBx-#yw8ZWx~tu*OJTi8Qfv*g&9|fN$&oZflGh0%>Cos_6uS;*rW4 zt!UtrjKtMoR&1&Df00U0@UyBTl>VJgVwKBU=t&l(7+U zF4ANj#xaOy6T3VDOgl8Ms}eS#MDeJ6<8{fJHZ1nI^l3DWH7m&hT?S` z4lB|j*P_!#qO(>Qy@<)RBGIxT#)t45?}61&qmX_m9MFKnG~gQdUx>{pqi_-e(#A@V zjWC*;0c2H*I17CyELCn9S|_`YF##y!;wgsO&(OoUaUU4YiSl*@nr*HQ@r@10=scsC zQPRrc;Gb(oub;Nic!ON_-he?xH!=2p!G4h;pO9_riky5;18JiHWCv@Y*eFF}hZsKN zR~a{Als#0Z++^H{5Ln0NH`rnvh&YQi&}u9I*%A%38-2j~a1C@ApQ7@YYGATTvDbXe zymEr{RQ)=HIz%|Ehem!g()MU}c%3^?oen3VMt1qIrwn394S%K}PLW@QCb6s%_TQpb z4uvbN0*=R-ymT$T;j#38oCxE8V8<)DEnZ2TJTCj6T2sra?r&G@z3CQQYp8TS=P zCaya-FqP-t2EXsFfLgS0C8a46(3-!LdKZ1eXJptMka6bA57OA*~9sLJ;Q zJnV!RuK3wtTn%r=`7(rFPPBZ`+ksRSUx#dacNOphy)O_m&t01%M z^Da&!kKS!{j8B8}T_3pFHC7aV#6)fsqL!_Rx(1<&`J-@n_;SM`s|hg`eac}KRP;hp z_EA=v1mBAZ#3x_6vlvJjYEFzpuS7Mg;)loLMs$6G#k!h7GX9Z`DV0#Z2^H4=PKNLY z&%uMRf2TtuqDt;Y!Taa&7zL~Z z{|KIdbY%8Tj8yMEk%tC@Io%%-N|!8O3b2OFS9-t_c!x>#^j;0JG9hEKLRMx}MPy~h z5Fsmh4Y|qX<%XG%+{{Pws*;J|lFAF-7zMLyso|~Lq5plH7hacEs&bk7xSRS>VA!RiQd>OOUc2P%SZssoO=|;E2|j zhy&FfGNp_LFbZzu{x>1Rk4bT>5E|~8$m+J{iE zpQBGfjs6ECoTjJc0ifu$K%FK%v)5tjv_|&qF$XH+j0%P+rygajxeKh1nM7K4gJX)M z{c09sG&+P26$ti_5PLRg4_Fpq4=5Dcj%CZyz@xkRVdrL0NT(W|CWWzEpC3Zd9>e7E zL@UQxD)gXlifiIXo=OQj~Dq(P;kDuC5vh=idI@t!#%mmu8@@LUfkT}M7U)xt3&`e$@rN&Y(lbvJN#!1dij^Uo&} z@&-fbo(1qUT!M5j!NW`ofBEXw*r?|MjnA)|RV-e97FRp(GQ9(VdmZ2(;3SwejvCN& z8G8z@i^&P3acnpKGxZ;^T<^5uD@#mAz^6dI50}rwllidmAaZFZ7wG865BVCGYn;S( zKvttsOX2c4_?pAB*kRbm7)KUEnfP8P0QDE6|A-qbqImcUnR*N%8*t|9M)-%mS&6O6(2PKM<>uoTgreOAW-21(S8qKYRtR8R{Pv!mrFw z|8OJxIB2$h14wVM7%dTMANHXCnL5-oy%~AE-1iL+u0o zFdIYd1Jkn2Q2Ri@H$&|MfwUQF9|&Z9(LVeDk)eIq7JrhQV6cOsO9Jvx`_Ko?VTRfV z##CmgeIQ_)q4t4*Z-&|j0%V4MXo zg@NT3v=1y6mAj{wBl2a?6w2d>Ow?E`yktbJgIjI|F_ zQMy?Bz@o<5hX4#>?E_gu`@oJ@z^oCrSeX{Phb18K%DEXxjJWr}-$cJdBbyS3%Bs9L z0xpy|)M+^nlI{w?>`8faL|K~dO_I>d{?$dIoCIJQR@rsr8^gklU(C1&#@HQcAGkjh zgbIce5gsWR=#Lc)OeIz@NPkcc>&hX=Ak-;5&Dfz%f&N&hKp@sBOhG_5okEg0vGv3$ z0G3)pokA^|Gtw!@ARXxxbaq0W0z+b*0;52uKwJ>&6gH4cs8e9e#5x6j7_m-)K&(?B z5bG2eKh`NQ=I-V*OodOXK>!F-qg0!e| zeoy3CKsuaS%Gr^__D{g;{Efj)_(>eU0ku3X%NB8{c_^;MPw(_okS%?$Y&rn*P58a? zfC0+!*OyUe(DYyP6@@Ir^1(CV?7Ps@!~-K&`}qim4w6viAe!S0|1G z?G1n}GM5Zm(EbhRJtApK^-uo4t_?>V(1D3@0beMHn=X#R@;sVz?IM z=e%BCh!ZF((bw=v-?UYjPC3i_#(u3Z=8I+4@nqb@By`TGI!HiuKn8PT1`?LNkOgf@ zGt)=ML6Ye{zeSMIYA`4gwv0}`|5QPdzO{zs+XYPpU6`uC(rZX5<1GNRH(bk#MT?a& zw2l#snVCcI8bVtU)4Uyl=fh=|sBOwP8Vtd}gq;tSS+sa1ZYZ)fZUJ}$QLEGl+KN-} z0l1%tWokqpB511Uez?qGhp6@hyF2a&E2^1teu1gBm3d|_fH?A`a=%7Vw#_o$i2#p- z>nq0vT*KIRUZ$hpwg_<{T4$D_WG57JzPcPl=P~Y`htk2P^+ktW3D9SUU}G8uFEM<=u-Qw%hNcpgj?U6NWQg<-LS3w)aO-*fdvFz6B(E zNXQ2)K7z2zma9h|^SEOXT~rO?>G^1$^RbQDy;iEij-8qsR;ZF<{v8N0v7|_Oz2{~+ zo&xhjBo5D|#hIBN2Az^0Bt`fhLfGkln4b_2YeVUZpnLPtJZGi62Y@~uF<#I?;6lNE zB+`=L*TbYf2$N!PSS6o?X;JCWt*mLZRZ~7%&UtxtK(k0=B#4zBF{_+_AZC1PM#|wR zp;n?sxwts*4MSDP;$jXO{xO6cf@u5U@A5uL<>B^ zj$Va0dKH3K*Um)ub@cKBytw@E!j%N7QF-A?g8nM5B<_VLr&khOUF7TyTuBhC`~~>g z2$#?+iE6GSwg8S+5?ltWXeDtG{J71!egnpX8!Sevv1?!b0cHVP_2zfD1^&-~R+%-S z&(5rZk6e7^aoORNlphJmW!cg8BX~t@c7_+x z4^3>m=P9cWC*1RtRfiMqdCIE83HLl*S#{ik$oL$wfv9|D_CYu)HIkB5$EYzTlH#Jn z3Aa3D(cy$!p0en0!Yxl(bU5Lbrz|?0aLZE`9ZtCADT@v~B+2sYMTZk^dCH>0iMBlJ z^rFL=>aSrQxae@ECF$3T4rh9Tz?vdibTIeID3V17{aAGPto3t2A| z|IG&a$JNnUT8Y5IE2vc+V6C`_B&<8;dCYrMm)XZa4r)d zaP^AgJ*2Hy98S33DJu@=s=`Y!ZtE3?b8V8fp;sKv_0=>ytydh*4b`6m&?^q-=1dLd zeZAsvZb^&)(CX?H2a{=opDPY#cNF~bey6NBoV#KmoF1u46F;TWA zR%{P?*~z*{l+_4W#$fgz`OF~L@vGT4g3)$db~xDd|; z=@iOhg<0g73YQ&kF?P7@pg&%A5Qvu@qA=KcE7K?LGZ2M&O@+%2zJMGpJ7koOmK{1f z;j)7v@v?(a(l{RjTq<04aAg}UJJ>w&vV&hoyzC$lFFOdt%MQkmmmN$wUUrZyUUm?O zmmLJ+We0(H*+F2k^4TG{wvZBgs*uYLOBNffhhF>~q(zm*b%k{ukQV2bUhK_b`!~XC zQF6CNgT|YODbZ`G{5ulx4uanwR5lQS-timYAD3lIHLb_)uamHf*!g-lKuYw#(0gGg zk*##e)9CvI;WlF{Ya)J&8QeU&5R9Idt+R_De+)&a(V2jZQgXnd%T;R~BcCQI3;fRFg*PDNe)Vh@CA4AA55aIXuTiCa|ol3ELBS>jDu8R1Zf2}Aw=j1<-oOJNkSBPopjSPCPsrk6-z%)K&ti4;aZr7+fY zCrG43u@v?SxrI^~{XI)zuOTFs!afB6DU7`Q_whp)GPOQ|ztLhfg;H1pI(#IB(cfJP zWA6&3u(>vyj#8KqdR##8Mc6o~1Am9{%~MGpw0ZT~j25Ie=m*tQUaqAcZlZ zSPH8^oLCB@&MB6{NESgQ9VH~n!DU7Tkg|Xvh zI42OcS(&yBOacmB<7HiES z$4C_W8)Ju}82zy*Mj#f&CLy4k2G}Pq0dXSCYb1*82vj7B$xz*+D8`Uj6k`;KV#GzF z*xTe1YJk}$u_(q*Bo@U8#G)91SQKOYo<%W|#iAI2SQH}=i(&*~QH%gYF?NX0!B|S{ zsbUeuh_F}>rTiwOMRD{9Uh7`epv4KMlwCS(|2Bp+@nozB?lE`3SGP0G`G0q~$Vp8b?MDBMnJvInwPn zh?3hMb$%&3aS?8GmXTp~H5uLl$G=%-zowkoH)cr2YbE0|CF6BELQ`; zf01gf{y(atG z<@jrKz5_bZaSf~@)yr@^?;cQ+8x*RzDEti0a&ZLfE~RfEE;VQca)LQhXZ5~$CWOY{ z2zQD%O~PHYc2yWEqM0Gv%SYDGoIgDjLB`}`Eqk4FNfzlc-PDmryt zC{dk;C(6r3qFND3R9hGaNgh0~yF^u?C8~d_GW%CIF26}-RvD?x!i~#)k*l1&;Tu(E zRsW*OtlF;m|4C&g8<+oERc5uZboK2jGre)CRc3nQ^1oeWR`(y3StwoYg5lx+X_Z-h zBwhVquQCfb&3wDctT<0)))1@AB;vQL%!*@`S#S|j`F53=@cVaEX7TRje^h4w-Aq!nKkBV$@mVq){=>@o0crz=cHn(_ihxf3bb%VS!8$gOQW+5 z@`?yoZ8fCgo_Qr)nrf(RLN!z=^=HGi8Y)exYecAqN<&a;&r(-ru2s!qjB%vsq(*{8 zJ6xXwl(Ai?hI(&x*?|4EvMeKVS%zw;_ppc8GLPE4LaiN}0Ghs%wG!r`QI42Q0Iv=> z$w`ye3-KDdAzU$B{_S*Hacd(KaQFW3V>j>nXf|9A8g)3P5~4r^%SnK zqQhcLCORy}>_&&h7J_d_bUlSTp7HgRDge=8F~;usdddliA74+w<@c`ZDg2DOT~CP) zi?L+UHYGCb+-ryri!r3<>nRUmBc-m2GMA0RVvhle zw<$LPh_@-pAwDcdAU-U{gyL<=-y%-DP5CN-c$<=B@iyhV2#L2TuVF1l+ms6d#M_kH zqIB^#C5swwQ+@^p@irw{W1Es4PfoBCwpp1ryN4~{Lim(*A&}t?Wi|cQa{Ne~C*aA8 zBj7@b!>t&(;*vfaFndxS9Z|NXdln(Wiv6pLL|I(+%ZSRZBVQQK+Vg`M5W!FhaC4Hz zF?jwk+MMJDR&(@G&ba@hVKGUSi^3GfqLPhpD`Erw`xj~pqJUP+&_z5rDXFMIg7?6DnC zd3~mc7xeGmDMG4Rs6qj)kO0aVPn{p-M&E;fb`zz@>Nr?gsGhP~6cCFXw8JrYzJ<`ObWVhqrADA`zyU zxE^oucDueS*M3vs0WNNRrosbU^p{6_eOWE+uy<$e4b(<4Qz|hVKO5naOwUpk-(jyW zwSEIg^)dQNJH=C3FbKvobg5_RPz?>`vAC0?xRc_kEL_Q@xTCM+w(*5_dwT zBJNa+xTEjmF8fAtNBAp?T}EHWy@<1pK9wcn&bOS(f-SHGj2GR;B@ms;dK?9c#T_OR z-^S$^8sEm{S&Dy4+zC%*F`4L8mWVrFJCy}nU|$z^!c$p{9g926WPBTU4S=4-9UjDu z#T~|3pfcgvc$O>@cNp@oiaU(cv$(^MSll5H-^LYjr{II|TmE6n8|k(;!xZXR$bx_Nwl~lV=BcR z`NDAMh93;4!f;?J$QO4q;j#E{6nB`hZxnYj;j#GdChl-O8;d(f0?6tENu1`xyk^2< z@!u%!=JayN z9`5uIS3ns^r{J#(agBMnABMOQdAOTG+)jD8yF=WZJlw+}Zdn(u`RBkzC4y-MEr8WP z+f^(A7&q-HfW6d~#AOEuws>*%P>iGWcw}C5M+Qu=_C}nZHBsGEP$GDVmdP9x?2lMt z3B_D4{u0}~#<~s2P|GxyUV8%tFJhH93qJsHr4K)rD)r5)60gH6S|)S7R|CHiEtB~p z=Un(hEt7eJwE<9>EqW%ar2Kn;#1@L(P@Y7qTLt*((lc3&m0yA))HAI_n8*&+@FMy{ zJrfhtdM0Z`ihwqSVvQ&!pam~$L?wZ&)-&PxX6l*h@W=ZA=riDvq97?Pc%?C6%5ivW zbb=AJ;AM>wKnq@0hX7jevc?La1utuy09x>}#tWbYFKdDTTJW+a3ZMlqYX<@9RJj(s ztf~Gk%mejI*0d!3TF+!nPY?+8Ow4_xXQH2aruXo7Hb|sIv7YHNa-*Kf+NY3yt!Kjh zBozU})dM2wg!7XSlcv+VT5M4@q0EuY9%eq23oEE&S zs|pXq$D;)=>)Ir1LknKk_0^XmMC+NX8>)FUQtO$ln=@|$(0V58mIUo+MtUYD6X}_l z-AK>GOm>K#$+|m7(-&ILWZjc11`z3)7+VWo)&r7BEqGZECXYaTEqGavr;E`6^>KLX z$$%e{7QC#D(kT|GNYBKQMS>SI5DQ+XAkA3ML?G5P5s39nj1vo9r-NCnXJSY!coB#N zujjDZt*fNqWkJvMBA{5$^cH|v&%{Wv;6)%7yqHj|XL<*5Vm;Fb0Af88$znZ|i6Jr8 zGhN17jPy*i0mOPHZmPz5CKff;Go`^G)-#bc^i1q{X=aVE&C0adJ!}DqSJpW|hI*zd z`mICoBXMZwBrlGDI?e^8yOMM#fdzX~9vxA(rrSsodfC6aNR;(9U>Q@{b>s_!o{1k! zQv`>4CJTC|w@`kM0b`>;Q)Os`6*gFh02S$=j)y+M;3W&mTL^`NyGXBOMeG7VDvqUx~D~vVKS889-W`athhW!@l9cYkkV#2K;0wltCtA7tPQF zD=e_G^A=Tu%&|^|fy<(tcu%6O%h%{tu!HcCp^8L)C`B5NA$Pxkm{Eqm{kQ49UsW7R z6+PKO$V7S^3f3$tT6Y(j!j7!FyXz6(*0=FWZMPq7UH_&)QqD7a5M8(HhbqVG zqY!2CuiMoCq2&vw?Lzovj)c_%`k@~9SFIjs%}ysGL%`_3AM9S@%siZw3u%df;fxxD z&-j1l!d+Q>dT2585Sl%pKR%mHU`I$NiwN-nB5oQ)ckUSbJKVX$((XImxns#9AwyP-k>!JPkY+4o5Qv2g0^ctX8$ao(>EMzcJEMyRfg$yPX3mKmvPAp{b+(j&8 zkSrE5QW!U5A!7q;F%mM^A!8w9ca$y`GFa4D$lyVaSjZr22pQ~nVs(J9&C1kw?gV6( zm30@8p^#BYzqJ-W66cR3?}{U!j`I`J@kUSjBCudj%A+GH)b6|!v10$~B2iWruoyXD z*O6}wr#==S;*+jUJ@Y2_r$`bc9EO1pTof!HmU%g!Bj8!2*Frj*%eoJY$D~ z1pTofK_C_+xTzKk63qazN{k-70irOkks#5G=8Oah8KfgYLT4uwBp4D45{v>tg1AVK zc#>Q~L4qw43lg8f9}5x$VnKpHEJ!eZEJ!frSdbuDEJzTD1qlMNAVDA&BnaT99s9xy zU@Rr}RDo!Bh_F}>IerP!qRM)c$aO$koLX}1$YJ|u;k9^$)#?u#cfbg&2z!^xO}jsD z1Ao85HApOZVS$Nlh~ayI&@3U%h-5ST%KSNr+5_HN^;OjZ1o>A>*E|v!-JisVc>rk) z1+qFism*>{(+(T{iQB^aY@zgFbk<&g^bEh2Q6E9JAB3wrleh$|C8PFd)ISg6)d+6b z3=i{FC`WS&Ba;L7v}hq`*(Zh?Awo_&3P{=Ebwp@rRcbSYoSZiHl+((Rb}i)OKVeg} z04C4ODMr~$#LQ{wC#QF@a{4GvQNHw()4NzXZ3QZ)tw80pG9|MXUx_uf{Bm;A7NIg< zH3Ril1qCO0=LV9{8T4~o3z881+fowxGd%sYB(#WLdjlmQVpZ~3{QM10x`CxeQWB!c zUD2*|mxO)>!tk9NNJ5OZojpnpSvzWXL~5p80-VxD}Q)^sAC?f|8qW9?H!(59NmDp-RLs z!Dd7*R_;molVon+gOg$-EfJL5QA;rti=gD@+lO-V?L)cw_MzN-`%rGaeJD5IK9rkp zAIiUl7HL>prqvPE)aTlk`?|0 z$fQ)Ys!U8oxqFK!Ls`k)r%;PBv`g#e+lX>!CpZjiS;^h6j+gOIRW6w&tKg>#xw`f6 zk9JvAWnv@BUA8MQA}hJebMz~bmE6ckl*>+5CPt#%i_XH7RU!%*p)BdLPf*g$K7rer zI0+H8LdLyJfS^R%C+LGzw5;UjTZwY7D&+ZCEi1X#N`+{JjC*}`8smVLmE0SuIWcKj z$-OzVF90noxwj-%0B9}I_6e9w8~n6S!0e8Ke{1^$?%g?F_|~$Ldryv&)}#_`pMbHo ztmNifiE-(d2K@H4LdK1(MAd~mVJw-G|0<3XzKXLMY1&Tv z2J{c3n1Jtuui_9$J9E%WqE~U8@KqdMgDG~_Jlypvj&mk}=v5pid=-b9^SUvVm0T!f z?gZ52gsNU_f~h1=JC_yETBYOXCC8 z4Mv27{gnAf^+Piz$#hOgepi0$ORdgFvr6GMC_eD#J=(#j>SF5D9ILzIsC-?KFT4uig+ScEVS07{AKNfAz)*U%eq&i*q32;ME%f ztoRmbs&Jv=KBQhPpt#+y7@^Kz)zFx0dJWVg#aE%v4C65Duz5*_-EMne6RLZ#@Ud% z7;##R+7S$TIQ1hy{fyc^gdP!SM{b!Rb(ak>kRPRVDdpZvBxO056Wu_5Q(*`E14Dkz zpJNawLjwtkmdgI1%FsYUa!}b81ZIv$1trI2*;U+L3DiZ#=mVj4w_evE=b38|n%=#b z^^z$?!81FFl#`iE|I`u@N=y_kGozF;i^~!=8SKqLiBWnL_<8btk0;Ofc=CLYC(rkI z@_bLdJm2HV^F5wC-{Z;iJ)VBPr|2%E6Vw~l9^h0?b|Lddqcn&5^W;q*Pu}$L z-t_V0O&?F*^zr0PA5Y%&@#IY(?}ylBNOXc=}DBqPa|Nh+*Bu~ie|{n%&C&yc@@0SWoo%;6v^7$|^kP61WHAOU>yTBK4iSb(&7G|5^8 z$eJIK!4Lt8&7lk#DnOYzkqm|jP-T8d25kb=nR}tK3bqlT$t)l+9D@}4yjetGgaCcb zx5%JffPUr{vffsJ{$?A=MhY;%+(_0qlm-R^%_tq!DcIg(E_xZ zk1@^|0fv}YFr-6(q2}vMbgTfw%(s~6I04$sGO`{oz&3hRn1C9T#&G4gRuA#>fz?Ai zYt^2F?r#$Z!>DLymyu*DI47nPpG+-Wr-sCg=N;N$b+)QFgAf|F&Q|B>S7O*YTce*d6vNipT8V?AG8rse z4n{}M+4e8CGt}7QQFVT9tv3mA2Q5(NC(G$sq}Bz*sN{M0*#o{Xw?z)B%@|@9E&$Hm z2Z2SqqP~rxW&x+-qL;zW7-kl-u8NkS@{KmL@LbYzEmQO;X}2*8uOf!SXVGLv7;YBc zMGS?-ac?t6#u(E(HGuMU3p(UjQ!axPOhEgMGZQ0G8wGv9X}sx^Yr&WBPcV}^5dR0z zPc##CU{|mboOUp!L>McQuo&g@S7lcdD6grhhg3)6C=|_*KorW3e`^he2rRWOz!u5MzIV-91F!jDC%7#i_Ci=h&ScjFk!SkV)vvMG= zMThyw%dlb!&sk;QwYySb@=M@93Gu7I|5LAk^;)t2LF#Xw^tJ2{QHH-q{!{2LV54Q< z2Knb9{xIbFAEEzl_`mQ1PGi|aeN%nur8viAX9NGGS1A5hahLlmFU?7!V##8hS@(5X zKC+{HDM|Kmw5*}=6HdGe6Oug;$r_gL*H77XCg6{e0mC~FQB3b4{94|5z}Vhd_;tLq zksNB&y$?lpKZ6V~_(rtbJW1z3R7vHMRzO*)sD(!?fxnE!D$Ie?Jg=VqiY01)FGq@s z3JQ@Yv@(3K{_;nA(N8Z#?}h;Y3Q z1x6mt+ZWkA9iLpU{g$R)8 zz?8;pFNf9#&L4@YyHMjk0el2pDf{|G8fUHj>FUxO!0BSm$y$5w>Qa7QmzY`B5ia8$ zS;|lBQqz4@!$q*CGVYuY_zdDG6J2Kp zY@_D@|Cl&RP&eqfd)8oy59facx*K)eLjf-$?pMIwq|-bB@M^dzzHzf@o>Pn`4i@Pn zlS9xmn%LQuzZd9lHv26@=(V6-2Uq$MaJPnKS$o%N|5lXaHVxO;Vv2?<-4$iI-INc{ zT6^7Ue<^70&@@LQ{6IK=BWQlCac=^Cg1C!8cdy2sR)=L0oS#G8-KTL@J?tBn8dfcp_%(J8kgB@INjs;Je-XDeLy<>VWK0<9YJ+8lK zM9trfI{BqeW-3TVz?GhXEIw}*TYa!PwQgG0F{bnZ6y${n(+Nz&+EWenSJ!xU9Tdj{ z))?v?*SHJ*p+7+uZnK8YM1R}$W^8tdbmUA*4ln#zUu%z+2q+zdpi+}N=!@AYVS{M>t z@hwDEKMIMyiHmA1KR46yEV8n5nPg>yE0fp^WMvYZH5sncdY@E%kT#sO8<=k&c#o7`Q{rDS*Rv^Dst>?B4Ac5XHf@};SFXr(V2VJwDxJi66?ob5G+@&|z|RvX*4=RF z9|CA>flLdRz8S!3cvcd)55RTs{E)!o0DcY6F9`e!z^CxMPv8{*<$WRO!=>K>FbIt&t32^y0u_c zrh}sUYE)5Ijn2WlBZhf6GJMx+{I!{J{PnH1S0WSlBaX0p1s-z2l;)$XqmN*nUk|XK zQ{Z9}OqT*XpdVnkbOV6#@QffZ2*6T!mcVVpD8Wcz&IEJ}TrdH^8}PgU*LPO{OgY#a zo<@i(^>9Ev4C#e(b_J3`-f8~Z`W0{#%UdlyDY-q%fzOIw0A~WBnAVahh#c@^t!hN%eQKzQJ-CH z7_%vK7{-2-EevB0{v53<|6U9@(+}108X*i|#QV`>Pa%0Trc)C`CmF+YDGyW3OWw z8;YaoM8!IeqGB5xICfESMrU+v-|x5fJ|`zJWZ=%c|L^_3&zI-fH+!wU*6wGYz0X>E zt(>?|nWMSi%89$z@tV6FTNV!Mj@5jV;XWuQ?$sygvM4KgQMXa?LG!GUd3Z=^DMBQ=S_PcL}!YJ3b4RpRUW^KPT>i*u!##z91*= zt%m!BoVcGoLzkV0{qK&qd)b+qd#{|hdtoEbcAt|AcVguVY#_Kay@f~y(}4#eS(@|~ z-Cc#3qU_SI#>+ABBdG4;+E#>90wc~5XY2RxmmXhR+wR{QqGFt$B=fe2zA{9^+9Miy zjxO$q_K40hL}#=|w9ydV(jHOjTwUDr?GYVhh`wr%=o&**hQr{tx*)L;M6$1oou|v) zqit&a!l+Tsp@#0bw&|P&JZW5Lh%Vd)5qIy-mxgFv+eCheV{lC4fnsypbh^aFhA7;% z?Z!%p>kLuP_J|gmQ^&;ih<3n zfzxrtCX+>r+LB$x`O%gi%#8R+=7=V!c48W0y?1`|~w*aikNf%$*ZvlKG2{Hg4L}V?2 z3INX{@)Utu0Pi63IzpNbVgm6Tmb?4kz#n02d;%kib*`gZnD= zPXfmQ=ui)VCPMmT06h@tMBrBd_C#b1!r%)4q_4uy@qms*NZ$(J4n%%SU@d?b5P2LS z`6`<86Cyt#IPV{wYM@A|AG!dY@2nc_e;%=;%Tz^dhE8uIO=VLr;@d7l_BDJ%V#v;U z4JR{%>{~BDaD$Ky<9iB2_8$B&WJiIJA$v4_7_u3Nk{Gg8fEcp#--a3qLiXWfpy-Go zBf+r@GjuS#`0G+vKY*CKjW$ z-y+0&eshV#nFcak;&>V~EmaqHbw>nL7kl`si#>eR#U9(Ky4cX3 z>Y^ixcRyEMbn+j@cSobT=p2c`^i&s}!yaNv`9M@T^E1`Ogr~YF&BlZes4hBmZRx2l zI@dl1z^E=dPd*C3s4hB#(LtW-qVqL*jOwCOO){gp=sZa>qq^w4K)|RjI+rkOPj#_x zP<7D>sxCV5N%(fTJ*tZdO8Z3Hkb~J$by4@AQC)O`s*BDY>rfA)y6Eh~4sD^jnDA5= zrLU@#s4kBDnd+kRF1|>6s*4WQR{ssvMdxZrPCV5`=eZQdwGGup=KyxJQC)Q65DR&# zi%xHjzENFt)_e}Ys4hC2;~+Dti_YIU9!7Q1*%!8UcSLp3p`BPybVJ*uVn;3q{G8t`me;n-iHGnC zZ|{00|4emJ7)7B(bOZRHiQL>MgYmUr&ty?u?1<6(7pjYrUt6k+vLI7+QJywi2~6!V zvr_#}Qe8|;Mmwo7XX^UDUv)9T8A3%tX>mmL4XQ3WLDfYksJiF`RTrJ0>Y@`=U3C6! z)y00>R9)=%@2f8E_HU~$cK`2GT{M~hf2F!;iu+HiE+#zHMVVnnb+Im>x|r}(7lj}p zzeaVjE}*)Y@KhIDl2LWBZX2qLPEd6b7CWF1WKsxCS~)kP<$y66N|7oDK$q7zhIbb_jjPEd8x392qSLDfYksJiF`RTrJ0 z>Y@`=U36NgF3PGvEkx<-u>4jjS>m@tby4WHS9MW}qUxd)Vkv=nC^dx!RTrHPsFP?^ z7o9H%w57V}1XUNEb4g}Y7oA54w4=H>I;gtX-&0-e@2f5*&c_RaI(w$J|NW|qWBzxk zE>`?^s4iA)TXnJXs(M@|?3;??)b8^Bn5z8|b0B_=RyyoPv}}MF)B1*;H)7iy>6zMv zY5Y-PGVbmvK_2Y$aMPqJ0!omJnAA!MvLc`ac^T7ND?tV|8}IY;9)_${?MQ0IuGMwr zhll36x&)QzMs{Ar3J*_xP6BCT1+9E$YDD`lmI<<{&IgisK&qT*A?{3jq3QebdV7Sb zBA`&Y8?oF7stTh}c@QuR0fox3ynh*niBWdt0Igj~DL+F{yRy>PuB;4bS5|86${R`C zhIXZ7^8XL*%5nb*?aBeo+LiGFD1tX@S61erUCAt3XjjSt+W}Zv!oq5N3+>8xkRT)W zAJDF>Y+Jjs^1ng5au2$8iW^7iPhAT4kiGb2aw9%m_6%rOR^dBW3Bo|=&_TJ9&-{S^ z_eSU$P_DcT@JfU(n3w_G%4|Tlvc5kYcY`F`tXoNq{XY!=%Ga%YYY?P62w7jZ^1UJG zUW9D3Zl${`tjz5K)v17PDLEXyUW1#_r5Y(-_5bzR&_H--1NBUpM z7tpP&9|s*$grIKaBESa|7tpPYjYnG$g1VJG0CyoSpj$Z>@NNiuif&~+6b=U&-O52f z)2+-Rbrxt3LTFF7@-w8rMH-`9$;Ym>ZsqQKDAgY!s9Sj#;8ny0bSo$AiBIVWLEXwf z0lt^GfNtg96ObQ5cVD;i2h_G5-O4wS?Cgcl>0k=#R*nL$KSEHq@?5~n1&6ns(XD(5 z@EybjbSqEa8(+;4YFg=5))?K&ue!4%TIyCV+()SmH@I-O5?};R`i_ zr(0PAmXPz&{AS%sjd=~2u12?V&Eu(tu12?V1>%FXZslODTiMm2&&s2cWYhD4?vOibul|nQmPuE{6Hix!m1^uw9v(bI0)?b z{~^_IsH4;uP+kk_V)g=a9fA-%g@Vq9svj0Aql>vak_IE#UxA-{kUf#?wFLT0qUtGn zQ_#h<`!#8zIqeXY&o@Nd%0+ei7!(^(l}gkVRWZ7l*Pt2~u`2x@(WShyjZ!GjvyV4K z-?c+jey<^Ft18SzbsO|(s^J|}pLOhHy_rh9i>4$U%sdGBO7d zvfI@+YhBEJ&_&HX+O95UYyo&AyVZy=7wA{snh&WXKudK-)1iy`Dl$wy0PG?(Zy|!{ zw5~$r3grQ_fzXi;n0X>6|{t&=`UqI%G(ECdOqKo+hBF6)B90Kb8KK44? zqHFa=(Z#gC29BF~ORE8DUCdY=7AT$t?A;OJQK8mL_H;U^&K)}zsc#}Rc8!VH>ky$* z?h$R!i-HN(A!X0GT+i$?+NKgMZu@f(v9^~7h?M<3u&nQ09+v8ycC=B`KIvhp&S^ga zY-0~dUY(&53(Hwsc(m z?$F#?ozrdtmh0SSIpuloJ({~GI3-|D~n)}F{xIZ%7SLMPToACQo!*DK5mm+d7mZs-)Hr|b^mg=0b2S7E3YugJZ zVplw<-@l<6X}Y(hwcNQ+H$-*q5v?&q`?N>ouG7WMYmaDxA-c3ZqKgdC!|f4mFhqZ8 zkErq?T_+mBZQjSVI=oCbM7`S~ime8bYz_Zps1I+OTE8%Al-=oJUG(W~(}{AWeUKr# zc^gDL0ND2%q77{m`6Z^zN$u;l>2!%>3{i(}ZTEmGf%jZ{ya)4tab{c{^cbJ?S59Q}EEtHPIvwx)%2!gxb8 zx;>)f4bjYP5K*1eUJjyBDDGFSiKvfh-)^$Ft#v9k-)z>2tnqr2#WSsmm__Veq`rv) zRD!yl{9tE9Wr=}6@_UO1Q;f!MD*{KfXf5l(Q&oaW9{g+~>Co+D+TKGUa)@sf{~OUK zuyI13RwMWS{Ajw=F6f4$&%oj1RD^x_(bQU|ucX6E7`~UDs_&x1(|z=^@s>JWo7uPu z#8)81N|EK^c-xhCMT8%lxfzG=F=JwJVs8pO9<$_@d@qo!lH$+B8=>bJ5K}y6Rq(6J zt;p&ogf6JkdaHz0Lh1ZG`?w|7KI3O@_oCU98)}CkTJwqey6Qu>bD|IM6x7v+Jr?Ba? zR_QACAX2F3t2JQwl9PU4s`j0Q4xt*RR;T6JHhCsc&!Cd)5t1tb{1uTm5%y~Y0Cn1% z@Nd|GICUZQKR)M<-6b=o3NowmqVryYXr3Ds%WzyQiXQKvmI ziowF*Her;1z(aHN=W*CgkIVror7eLD((1Gc^(synuaxvgN;+r>G^H(prnDu{l(q!g z!X)5 zLQAZQEymAh2;$MuQA4Ogn{Q!!f-1D09rTAl=&Ho^P55_-vVPuc_1 z);}2wTK^RPcd-6>J_yAB9jt#+EEzr;KRZ)}R{Y<=`X@D9i;VTp=Mnd;e=@ELcG&u7 zfmr|C2xeISq_M>qYx^F8G#h0Z722b0loeE=wSy|Oc2I@Z4yw@FK^0oN`cbrL2d#hh z@>FPVVHJ!DE#toRPXf!zOPKehIP0&ha%26I5UhWS+17x2-XdfD^E+l~tba1DEv2`% z{s{%@X6v8D09L3lGmB*qXOO;v3T+YM!@}&UB4hn?6fmCkPsU;60g{B4Dzrt$`sb-G zN09DVgtDO7`e(uRSpO{0)<4TpO54^ypTs-ExBkf)=v)7!`kQb4vo`?W`sYLdzV*+U z0O||0^-mTv5OG@nWOaul{xj>J$AZDP{)rD)YHWeF{z>k(t$*HtKJu-9&PFAD>z{n~ zT3P?BFxEfWvNo-MZbX^B^-lu6^-ltATmSq7nQe#l&ug*NRS)-6Xm0}KTmM`OU^}dT zvY>&XO-*9`a~*hm>z|JR@U4H6tiiMX`2tdW>z|ylzV%N|NZ5p%I*R$=Tv~0C`S|bCkdmRY0V@mygy)BkU5FuX@e<3F3`XBV7x|_HlY+){~U|S zRbi}uK96+I`X}S6P3xaBGgO$p7G{nW^~kEUpVc7(24nq`ao_qUf%dF_#wLTf4n(G| z6~_AKEM{n|f69v8ru9#z_|`wk0_&f|RT%4^bgAQ6|KynX)<5}(_|`uO_|`uO_|`wk z-?sHnlKIv@3Ha7O3Ha7O3Ha7O3BV&BCj{NYNsA+@m#0F@=ft!A*%@1LZ0xo5&qDxg z@~nTZ0MNGePd3oE{`poM)<4UQ_0RLbQ)`tQ>z`KusdoWhUS&OnHJobHI}@)<3I2l`z&nHz6@`Y7@4tqcWT-;aCjzxf90v z=cQ<0;s&I``X~D(5wQN57zfo$WBoH>tbg)-A7%@it$$vO{MxtvS=qkz&$MU#lkV_} znO(E>&k*|WKWzOo?OFf4nZ>byX6v7avbfx=f2KX_pC!nnm>I>cLjg+=ks0=rDn1r* z&-y3vu>$lt$*?<^R0gp@U4Fm@U4Fm@U4Fm z@U4Fm@U4Fm@U4Fm@U4FmsQ0XY67a2m67a2m67a2m67a2m5*Vacg`wy{8H}*}R_P`F z0ATeJ&jvbU@gz9Jscz`44Rq(8TGOpUQ{>fr+RH60Hl(znv_N;l*40;`E0@ zJ*;{1)tdIKd9v+k&zk3C(w>8|(w;TXqln=PG3{CNTu97vV0QIYVkh7@oeWs>Od4yR zebBmOz?x^$So5Tn&!n;DNh4oLW6d+gc)*%x@(-vnta%NoeN`13^aB$Dy(-gjXx?(#s;de7Ql|@b3PA;M3qv7HNRJsL-IM3zTmv9 z#Tu_`P)Zfn{7R`|8s9b?`DD^u!&2&t=4%6-HB9GJRi#E>bZ1}~%qxg5vW`Y$bzh>T zNu>de)!81gBQ5G^G**}R#2t;s>PnALjr0^y*%76$Q~R}xXum$>kw{(+K^5kMFp65L z*4Bvi9X>$FPn9tP$}BqgimDxqqAL5Q1HLK245-4#j4Gq3%4u3<%z!edDx;_>cw+{X zHe_p|Cuq!o=27v;m;ueB(w{K{nintwnintwnrF;_@_m+P%z*M`lV{9;O5B(M<=dh* zU$uvz7@`Ure=`Y)h-mCLh_#3xLILSN-_<`ku-BNS?tOXhR~z@-TBfXd~5Q?YGA zh#Pa3q`MpN9E3t&-b>%H>snFCvcjWMIycL-YpVCy9FsbIO>896b{wix3Z}CEf>k zHA1t=$1#P_@)DDem16R-Qk#5?8rwz zZ>6-*rn*iA_0yovqv9bm8tbeY z7gp{XL;8LT(&^8o8U|Hk?iRD|hsd{nD50%fDz@X6;~#9tZCE6><2Ib4ZO1KJs@yA{ z*L?f$AYbMM&3A$Dc}h2wFl>72N~d0CeoDb1zb*S?~;$K=F4?p4iwdQRNm8}3JP;(qEiUG`5oai8+K=H5kX zsTu{T?VYK$f7aY5=fu6qaQ{9h?%UqbW&a~5?gO#taq&oW@Mep08-e30G2X}R$XYSu zEzSL_oVY9A*4&Th#Qm({cFMih>`2X5;B~}ykIadC+9u7tG$-!T&6@k6oVeE;?(cHp z&X)cq)ll0RueJjb;Yq4nMWFlmK9Tjh0k5|Opy&tE?0F{Qo`?4~UtEW2o))h|ve5vQ z`??`Itv#Zy@9Ugy+6Ixl0_Pi|XWJus#1MVC4I-&i>H}R|aiui2?TYVZh=y&0Nb1yR zh>mEF=mSG^Mtej)3-m(oMYIeAD4AJxL5j7g3ueL!X6@S7I`9?qkTN#cWbvLpf zf`~gBe5A*gl6!me=_fW2NNzhln4eC##S}QAzuHXo;HfG``2qKklAfoEnbvm#j$EVU z$QAv_Q_kRaiN`A_XYhD+33g`}AnfibXK?dwP2$N4${9RaK_Ma@P|mmu#CITMOOYkd z)LptF62d8$%R#ep#@H6h86a7O7Fmsd#t8H<${E~&K7_1(k5H|ZGgu{*Zj>{mE|Xao zC})_u$ic=aXFLbSXAwN*jBij~Drd-^9LgCijLI4A5|n=xvc4Dyssm6t!#&T``#z0q zt(@UDBAuU6Hnd7t*$0urk1txb!bv6FzEq8qE4aVW8YvdnyAE^aouGbWRmgV&v~i`C zW*a;3q_N7X<|l^Q=_j0^F0jPq!uaFn!+XW=EKBu&6iL(%(0U#xcfx0%O+dYg_P&CU z{|Ny17<_{PQ1^EL*5rH(9~JfjZahMM3c%rr9891Lz;TGoBG47UX^5PHkm(0t3nG^h z7!Kg6<6spYAu|pDbrLLu%wzyV5Gf~c1c28Oxq`rK01q7x6Kx2Yg#eyKWIci906s_L zBZNJumy)4AN)`tU7a?;qfc+4eKwu33bd{QckiQYlxfYSD5!^?f#yuTLM3C@IXBqd zZti`vJTY_eE6PB4{^!4~EwK&oRYx93ATwpTySldOAgUwJV~(#^m>QUaf5ZRHb-1Ie zRY$^FbtJ46Kf+q^Bdira!dhP>to1(}dV;n0DZ}Rq1+Mx0r!`5O8wW$-ehtAQKsHZr;9SV2$9n%v@J&*CuI(`}BeRO;r<3saC zk!Bg=!%N3AK8^7aI(`Q%M!9?H_>+tuoc#r9E+x%Tna3D6?rB+8B^6Y7xXsrJDpvxR z?>13Eg;?#E88*bUQ9?&`q=L$cfGwk-!saQ<*m&!L1Xy*v9{f;HA)9k1>+rI!&$34` z9>vmc&hypiwa#TXk%L~13#fnMEC6SyOZnwMBt-utG!Uz>c1Rr>T*x^5yw6fYA}rUn zXu>TtMC=?zEt+r(4aqVkY0-pRXh=DMOhoig%D|je?nB5s`WyW8037R$bd)9fC!yiD zvMlPKgmx9dud=9r5*i_ZYf=9s)F43AqW(!}qyR~a`X`}L0%WXelILWSd7XQQH%E5 zLWfr$2w;VBnOSr{#2HMk?k^CpcG*t}Q9cRHT@H*z`)#3l`HU-z$|s@ux&ZB-Dscx! zV@7E8V=jk}$|ph@5#!!A-xg|&jRKIgXumCVg#hV@Rz5ilrDUuF9z|uZ zl6g>S(SBR#+JYEfzZDkkw}ozuvqP#a+HVWpT)7KUYAo7s3*AyV9YC!``)#4yQ!4=U zvS`08^t;$K0O})J`Gmy`M4ZYetnP5cseHmpHdwUZ7P>G0Mlg)FXumDAHvc{VV*FQTZeU*RzKMsmkU@Wsb>uWCfLz z{m5-pP8e6VaX3pLY#WEOe77X+1(=&dteS2BGO!DPe^WqY>Y6kvC)Y7UqjDmPv~3*D z>gpJWvrLKF#^EeklFB76X;e-|W900Eo3K<^F^&v$?=YlrILimawT;7B0!h0w$l!36 zK-M-6XUSh-8;7$jxyCjQXGvCT9}ONjoF!0iPs4LKM*~A`<8YQK4YqMOOJJOeaxP3p z#?s=5Dxk`VON7gQ$nr^$5moL~BJ+WC`D)2>BAf9)k131!Lq}oGsi;R}RE8tsT#om0 zWI}!dg*hJ&!a818fc>6Iyoh)v*7sd7S;a#jX|9jmfw;1+Lqe=ygfH)?a&85C{K)LB zfSd)4A63K|?A!&G_*n(q<2ZW|e^tTrjGxB%bp>xQeiY+36@19})1-f};3vjcFy2&n zI;xboAMpbda*Q#Plbz(4psMU`^ zr+5K?xV3>~o#Pz=B&{_}=_0wMtq;}$sEJ>P+%nb*rqmTa2%yxOO`xX$wbnHRdI>Pp zI+?lk&i@=_56@A8A2MTnZ2V-wI&rG1I~ToUlW*IJRiWs$Uh0}-}OA^IVrWA1w^~e#p&j-Jl0Tz zT%Vy7HZ0C>*7z8%+)L1Wm$h+O`R>QTc!Jf<>h*D|;a7mI#x!fvO)6sT$0~F$(N(C0 zYr7r=Y}IsB?!ORvP+(`($s1uA;8PGvExg%###w;9YH}%S+Diy<$}QU+rLarR$EG_j zf{-|lv~yWI5XY^)m??z3Gkx_S<<>{C37$;vCuA$m{L8*^1`{H{xyY|MkY-Z1!VjPks)n z5Hove#>=^vegTn8v$A)_ZQ@>dDn=Ed2(5n>fo7EjKiu1chD@& z-$4`bchCg<9W;SVRCdr;fH|w2k@y!W#Lw*r(iW6ucF=vX@_9RGa{4=H0{#w~fWLz# z;P0RbWGu6TCgAU&3HUo`0{#w~K()&EcF=QK1+#%>+}}VGSeE1lIy5QH`YS8REp+Gr zfv|~=P@V2{kV&hmRNQQ$*8}Bkq8ax$(Jb1v%qIG2r1+cYcL1zV4l|3qjvoe-tMfME zRSvrgyxP4@G~@mzS_)7OALqE)MDKyUOjI_}LK$t=;EpzHaC@6*t{na*nm{_L zH_`8*bbk}gQv6NyN_<%IH__}6e-phPDgGvU3jlu;ork5(-$YZJr9P@R(JW>l;@m{D zy2BCoHMqS^G?l^qO*D7vW21T#O>Tb^%}V;4=t}|kn`pcdn>W#Xp!`iVd8Vn9*+jEt z-X@wU%G*R=fHM6}Gy#7TO~BtolgHmg--FEjO*B(Vy-hR$e-nKqmgMScZxekKAb%6R z0D!-VCX>I3Cg5+PS&+YpJ{dgzCVCkFe-lkIe-phDDgGv!GuGckb3*!?=!4NZe-q87 z`kUy>kb%F6X4YGYant;EFCg5+P3HY060^?MKbKwnSEG>?xe66=_-^-`NqUmFMZDK3l?#iOx zwtau12X+FRESf&HA4nVk;600`kL`8hRpTRzrjPB15;8L_D$&{x7u<@>wkD~!Z8s$j z0Z*-!q~5muNMaVCIx9)NZTnGypttR?Mh*v}fRCa~Ddo&U)L9Lr!`E8@pCmH@FJj6W z{OJqE*bPmXb_ZnH!nmmMM(fxFi)PZIy<*b$7L|XZy#;VBYWPI^2oSYs2{+nTfTTrB zxY2q6G8Qf2M*9hnwP*=9+FyWDitt;yad1L16V0FKf+MOcb{UIOSZ$;UJUHac8ONBqoatPt%5&d`=(G$b96SkV5d@ zXIGu5Q@PI?T*YPcD(t^6N02H!#wzfKMGPAU zQmFzlj)!hp1!5!oktz%eR-wxyXsi{sSiZ&Gd(91ksNuuel{4Fl<}*>1UV(&v5M6p3 zVxKbBZ3ANV%NFC#dT@7tkBC<*iBPp{2Dj^Ew;Fq}z4k4Z|N`imi~focbJ9u zLFr6ZLvQA7e#PIX>}0{nM|}8gpF_x!k3g2zu|}q|@XCx|f|Nwmsj{3W5OZeFJyCU{ zXb16Q5brE;S0$rPg%$f4X!j_*f;w8l=vEcks*4r6j`XQ-&_Pa(&M2LS6r38bL;^bu ze-n4hqmf z4eN)|)gutoqZ`v*p9$RJEe+n{jp@LHeZJ%9SGr9+-w~_g%klFSLPDSK zYI(jZMQ?bQc@H6#cbS)McU9*4Cj7g_AzKf(V-2V?=8(r4Wy~RuvY6;N{M7M~mstQN z9P;qZLlu}q-kpfcUIt%nl8j71YEhM3o!|Ss9e*9n1n!5uIWNdLLej8bRi}o zkhP7Ngg~in#3TeNY$GNi5D=4`!z!3V9^=^MXekMSW!aKP(Ls}>{>sXlLmpd$LtdPn zd^yOZRaL6M9P-`-O84L)1&r%!x{#ExXxBD}yv<07+D20H4*)Avl$pi9#1DhXHTrkN zdq&w+1?G^~1v5>q=|WP%xRPtSkd#OPD$40oU=DdxT#g_mB|@2&L!Qv3<&ei{)Hafm za{wf5BPk(}PU}M+znJT5x{#ERrPMZ(lAG}!(ARV!DPf1`Yr2q>yonTjO&5|97yBT6 zO&5}q?f~>PT}VnA0Mw`TA&{tDY+G8 z`qy*`L_Q%=~M*OeqZ+NeO|9kdc&}gr&Q>mv_ip0?5Cn`)dIH zHC;0G3K>ZWf%=e8??zc3eb$m7WPmvi}G_?L4D z_?L4D_?L6Z?_bVk$u%J(DIuAEIhTNcIhTNcIhTNcIhVjV73W;|8#0y_M^u$QN8ak~9n<^44g*oO%neOQJ0Q!37s%N!R>zjf70y_%m<)+r z;f(bbKwsgE^${Ry^XwPvD}cVj3F!`b^cBunKLPX=&RBl|^cBw700HzB&e%W!^cBw7 zAOZ9h&e&jiM)eiW*bo8q70%dD0rVBl*iHiIE1a>N1<+SGW5Wc{S2$zC1<+SGW4j2T zuW-h86+mC%jExXLU*U{32%xWU#zqRDuW-gj381fV#ke)k((1S8}!t#q_7^lG` zVD&=49@1AhiBr+%I7(y^x@A6{#ANLm1~Nwzk0r-pppj|HsUn47JHTmsiw9S!KH`@o zJ|^-EaGj>9vGT>C(@ZrkO^k~3)8n5#dP|jZ0~T+vN@d6NH0tzMB=%JuKE%Jyzr!y1 z0*jc=T`^}blxW^~U{A6Vy>S3y(9M$=e^iv&cR38_heTD3tM7g!>V}9z3l93GU|u2e zJ5FbEV#`d}ZF)NA%|c0wEZJf3Xy-H+lJ_E#PSpH&|D0dtJ&g2umb{UlVmh}^DsKp| zCupvZT5?I%^G-neT%8_Gf=k{8QYveu@;*iS@jAVWpRSW`MA9)jY1dXs-yms$PMYc` z@kw+9)l$!h#<2~IearL8Sv`%ah#p*TYEe@#>Oi}LB4fSyGt>wTJ~ zelOiW2}g@v5Xxf6@&Q4u1$aAA-{GUkgAumkJ%Dc$H3eT#)(OgibnFM9iceTDT|E?I z*`0x^Kp5~NT5D~VF>+v8H8Q2Y+MH%T?1|K22$3m+)aC+WE(Ww5Vc?YMU@0bw+MbbV zGmloAI}rQ=sed8QOtra+h-oKcZA3`EfnqjyChFGGKRTr0Vpq|~cKT}G-t zL_Gx5g9yp1i5f)Is{o%wi2PD*9!|ulMaUc>^2>f|^9W)-2J{j!v()C@h?sja)OZmh zv+C96-HE9`1$W62l9ed_-4Icu01hSUER^-GH2ze8vk)T3^jGhek?0FR?+9j)dbg68 z5qP@#B1GnbrV}xj09q;-(9kHCN-aUp1C!jBS@$67AfWa|NcLw11`>5Tz>^Wmr>SDD zBjwZjt1^j9pEFlgG8UPj-iz}Hc{k{;CHru&e<0)bBfzZ)k%j8R1fQ{?kmL?Vh)hu* zCpmeK1<)Xfe(K{4F@2U{ABm7W45E*Zi-;Nua4xjAs z;CVz%QXkh7G5%D{N`%O?x#|;H>COUlA~AE-r}9pjbQ)gkf~Z%YreqPuzU#Zw@$F$T z`lZqit@|?7kbel`Z`+}9UnBk$;(xa70gUg4mLBL>>;8dwU*LDMojd=ED+Rn_X-#yj z3z@J92^}40)!z|!!7$PZ{Sx@WR1Z8ggUaCi^M$M>gHd)jgo<16G@@(O@hy_iN770J zRk9lCeA=NiYBhlVh|g0El}LCN^ff7zafemThy6xSHzI^*fS?N)?gs&w+*Mm)2c~2( zuv|-k2|4vM8%7|jC1_U%WX0RblGPWsoS|MsHX9I1R)Bz6`Pr!ObEwV?po+ocquo(k zpjKas!cRbii{5U5WV!RUX^GrfFUINYEKYu;jb;xc=1W8*pUf8qGYS#GOz|Qs5RnXT z@i5OIB00b8VKyNmH4JYxmCqtFnnesmMA)YwB848~(VU8i)cI^gB*WES(i%jB>j@9@ zf`|DS5vk$#UL=DVDwxiQNQQNYNQT1^k z1X5M_8(>+fPXky}spMC>QhC`H^|j|?;^S878r(*8_XQ1i9pS4H;m%}uOJXUTy4`a@ zbDyC(q9u)&;Ywr}ei}5~2A$&3pk=&Mffr}^Bc$zzwClYzJlRO|%CL6EB~z36rwzi^@=2?SGUiF}2eUe3{69V;FfHbzbkC&$FV@7QrYJ3YQ`h#Me zrmzpfS2YEj0)dr(oSfVb|Sj{0h9LYR%sZ@ zk|#`B>*`<^%@_QTQFtFi*^Ap7exDzT_oUVMK9;BADXK>yHx6&(J@;pX;z_DUH4%RW z@CicXSk+TDHkD_fAcW)v$gG!ae?|iAix4?U^(x?g=zIXbCe3uv^p@?M<(WcFdE$`N6+knjJaefj&wy&mGliP+?53uczJZM?Ldr9sn)2+Xs&yUl z=|@@aU67~@60yqLsLy)TrSzLrLwD?t&X}BNWgOMm5E`t-CiwyBO1URp;kX+cso7zS zYuSo1lv*B?t+Zz-HQ&fqZebQ$wvumTE0+M3Z)7Ws520*@Ql_q2w!-f0>NZifBC@B% zSwMV?kkqo3p_HxAqK+q9VKtQ}TX`CBSLI*dgnzd z*JUw*n!f-{kgW^{qS(k*C=&5xD~zi=k*%;uU$#QPm#q-+Wh(?Sc_LeR0L(CfdN}?i z>hbdof;0$a8QIDN8)c;*L>+dGk<*v05b$Ly1bo>F0bjO4z?ZEM@MS9meAx;CU$#P^ zT6Omn=vJ}{Mz+GZFIyq7tklR>Sbt@e8rcdV7h1RMiO+?TDe zXkWJS0aAR~3dI62fy&Ghf5#7l$u&%yl*7X8s$wHs;TK;|w!*mbWGhmD3Um4t8`;Xy zE=Q2E6`{-%*^1ERiEM>YU$(LmfG=Aikj~Sx6$_>KvK6xUvK4*~_hl>W5MQ>!58%FR zg`c{8*$O{z`?8fW0P6F!Y=y-PM4Yk}R(Ck!l&!GD22ZxK2N-bgUl2xR5E zs%vB`1d^_~g+iW;Yh)|@?v{1UEfl7dx<6-ra8#RMvEq42|Pjcab9P)<_o znp-Gj>g5{Q3W0jp$W~a;KzCD<+(Mx^WvFXzq3}EJaM#>IAz6cKZlUlq@MzcELg9=Z z=bBq6oRAY-a|`7}wC*+6+(Kbf-*Xo|ijAgK!f(bOx#kuMvxW&&PP`IUjc|ya8RGN^ z2}ryOzYL_Yewt-Gd^diChoZOukARwo61(sRqncIl5UGzC<)@i_&jgwS~eGb4%rI7*t_Ny zimcPFxrL&uV`M8#iMr+%3R$qLCa%oLRz6}b2cwF(g~E|huDON62g7yEEffMtw=>9a z3xz<|HMda6U*VctC@i_gHL?|w)w)N62e(iN)Vt;u3W1@nxrIWY!8Nx~2#iw+&V_GS zSHAuts=Fs!;nU&CRzxGpldbSmw=Y{c8-OocVU>K@ip)$;w(<@#+gfU5E3{}?Yn2+= z%2j~stWqOeAq3eAZqz2%9K)J-g^n(%OT|Jt(H%cnShixhOgz%1TxYDYBzq+ z-o@B6%nn4=@^3)@K(@k$7aQ3MTjt4DWJo;O3ISiXLco`;5b$Ly1bo>F0bjO4z?ZEM z@MS9ms>M7eWGe)G*$T(Pm#q-+Wh(@H*$M$)wnD&{tq|~KD+GMm3ISiXLco`;5b$Ly z1bo>F0bjO4z?ZEM7^LUU&gemzJ7M{)(hC6vaC#wN14DbG`$NR3@Jk#eGRcBL*_@`6 zn5;dcnu*C5o&p+~rkos72(|;P!5to4rFQjXE6)Sh!;`J_plpR0mADc=?|AeUoH#zL zWh=5{qP*uHNF1TETkx-XFMPy1-y)`3i&-S9#Vm{_$iSnC)TUHrD-rKhfS=zxA_xgN zt6?%s$goS+WUwnSnq(3DJnE#04>@x{*6Dj>`M8G}2TYxj&~OdEf^^*ehbS=&v2#?z zyuKD}V_H!XJWK*vmZjr_U?hbSsUG2XnC36&Iz~{{Q7Dm|9bpDvlStUov(WJGuOY+lg4Ts2+gm^RP~ONWzOqBzXkzk$W6MEn*qH+%oMfRNw8_*6<7-p zoT<~*UvwSI0G1H75SR=z>JF%rU`Ql+j|DgaL8Vur7B7e`<{7BRAgKo}h=?fU1*eeR zwFHz4nZW|}k|W>68v$L6P;nucZpXPxr4L6&De zQ^o4P4`?$&!L%dQ1x_&^j)G}Z5beOIGfQ3Q$lfl39qSLE>oDs`pyI3(u2FTEH3d*w zLldJNQS7bI$SXymJcQDK$RQwu%CSl5Z&GL|0Vxwz#gRz4PpVI$+COYo>QI$#SS!`P z5xGSu+4_fF%-OmJs8Oo_vA3{{?R6>FQfMLVD|f-5x_$);|sSi-KwD z2V0uvOi@4DNft2;nM^@&rcGBr+0w)l0L~_ACNK%M=>kCK5HkxHY2`XVcN4P^A<3cr z1kgta9Zmu!kJF0%0V=%;^7$W^|I!UNu5&LZc8jzlc)Wy=KWk}MG^owj0j=PKP z6dU^*^4rKf7s6_ep6^E@RwmPZf?8%5^8Eh~P<)A?(v*$&kXhOABV;0|r`32xfti&( z>=Mq((sS@WM?lxr>FKo>ps~bE0j7+dITO%S1ZOHQ8BjUrhEaW?_JN^nzw>P*xJ0AC|&5jFx+iJrg4TNI&a zZ}b#CLaJTRPcrF;*m4pdgv0>|vHd~7N#8u->%q1NSRmDz9@`jOo|Tbc*##kbs$n|; z1e#UFE(Wf}V}k7W0FGls8okoY<4{uhAYt>tc0sT+{#%VSP>Nwo=oxMUx-h46W+j8kq9DElFFo&roQX{||kyFPFA zW&8F<%4h_X_ktx;YZ;(Zh?&(7C@Js)fWIN?SYTvk-3aJf!H_7QIXw!n387$0KlP#| z^A>C0OO`zQuOQ(W(l6`>l)UK*@l7Ix;NZjOOI8sl%Dw>iBx(^b^6Z}kXf8q*D%qcf zmdPY}TklNHN5V>kXg4&Tlf;Nw@HSDg-GOT{+OjCVZM9w$V-`mEgK|9uw4*LaZd97; zAU8|bPX0dCa4S$&;~Y#?>DrsEa(3;NDEu-6OoE%OI(F?^K(`Y!3z&ZFmcIac1HnPJ z+@iZBybALQ!I?7%sC@F30!(WZ$%=^^19%tWW~y8D(98lf6`{kN`a$Y8E4vK!2{}Wt zqbpj1O7=l<&q9ph;JeU0mctre4(dx0impX^9O)}trr&_H>kw4*Y!GlecO3}uG*}HP zMxLK{;XQ#aEYt6m1t44ox$=*i*I0TK6GwUT)PN5CD*D$*H9JFkMS)fHesJuM^|%Zz z;Ik*jVV(H#xIyt2lFk5nr(lw75DtYzL`6S9I>&2Li*$@x?C*xt&(O%Fz@-vX@WcL+ zEw!z(9LqFyf+olyZ~AAd;dps|SS=ak36?C`ccFW3N5Hc`!Rp3=c^S~t#7qHZ05O^K zQ85H8*?a3T?gywZF|*V@dhmt=+L;(E+570{YIlI61vLdId9d~cxR0Qw0#(2nbSS`s z5eg}4m}trO*9Cy5k?bU3Wc%!OVqylDclR- z7>$|^oIHlJ0sm5PQ-CVxleqxkJdGk*HF2i_ULv@uKy@SPVu0ssR6TG#iMt8#4a6<# zuO{i*-vjUtgfXG-;Ab68l&5-%C2ROINO%;XB8o&l)v-!Mem)PU1m>aM->BWGqh*b> zWJE3Qbb4|jl>K1OnW~DtSujQIriZB4Snjf{F}m2;qnH6L-!%O|p1vM5c@{Y*fM7QM zTaDaFKoXQ^6|#X}qOu<&V5nhKtDa2r zAl3xnZX%AIR!Fd}BE zKgs*yA^_(QF-!eP-VT2P@H7z%)pPQ8-wfa_B2H4zrMSZ=xETF`P;?F|jvA|d@zaOB z|B?)O9nv}@L{}o6W6%TXe2P!N=-&Wb>(RHPFSTCBqmP4*-SJDGmn1u@*jAIEGt@{` zNhQS9?95G&H{qOy&g7~how-_GoO_~1V-Ye_)TPoDM*ujOh-1`c(s7FbEFj`Yb-5re z25>$CI_nDQteXJbK*WhqQ@TRB>pp;Y617lWso#wNo+IKUb)_5&z6J0Pp_r+zmd8DW zUbGP6i`3OZQU;)i2)tFUmC6kQG=SJ@G?%BOd(j%{;|F3qg^xhmE(p;cNM|3Phjezy ziRj~9f%|zMKk&0Y-Vbz(@sfDn@XizI{@kRB9gGzApU#m-wz;UoI4U(-=OG^y*q8J4 zJXurwE>P#mQrfE?@2cPMO*Ot6Bt8TkXABG9M+1OHrhFeg4%E+U2^)RhF-O0SR3-H> zkK));mWYoD7~2`pppvmYs+6VegPs_R(0i6Ts?#u1Ou~4~kTE+N_~{7o6BekM(znL} zItHQ3W9Z19$SICm&ypAH5}+3#6g8kIzF@bazRk%OBk4i}bh~Mf19sCMvi!U~vs$+& zdNAntnPv~ost?Q7K+xIIPAYbuNoLn;BkTQ;@ZMwTn^w}U^gMCy_ww;$WDF=m?xHe$#DzPKS8Ksjz1yt1Hu62+n@Q7iSz@QU+gtN zt-IfekNNp)MGf@C-vd2~wmQEWTQ6m~BcKzjoqG_1B#6o?>=B!-v>_`b05SzZ@~+JNY#0niMgFmL~J07 zQEhqnJQ~zt`Z#Ri;qwq63Prpf9>@!uBAg8mE@V7s51+4t8RG55_!nnwKSq$Yqbw0` zhllent%$e7yUNETE#3}~5I~E!!wmvx@pgEm09w2q9wmSlZ||sw&pIvM4)1dZt3dH~ zcw(G!C07T-`^E??E2DTD9zI!rWtCC99X>!H7k35N^?v}FvhG}vP*zbK+UL-Qbjl%$4}{9 z;N_eO5EEq_EDj+F`8d;>NmQ8fZCRB$iR5X+Wf88@V&kPZBG3$>pgRmf_XKoH2P5d- z2zu`lA>*n|51%qKRG7UMW{w@|krf2pRS_^4K{w<6B|-xK@)9A9jhMQ2nENPZ*dZ4E zMtYYBWySU`5wg*4$OyWb5)BzaH(4O)Ca!}KbmwCXy-S1~6aNySSoH}RK{o;a5+MQq z5+V8hON1=hzeGqf{}Leq{}Leq{}Leq{}LeqTq5Lz=!A@=#SvAf1>Mnm`J8wjK6_!0 zpga$s(|P#tJba!HpluJIY@qMqlUK90mQm0hZAx4Mo?5HSc=)^tP@Pp~JbV(Opqn)c zb0B)k1uV{O6~2qew>j8+(e>mrWhNl~--iFlpZVbNJbc!G%JcB~J`z0-pPVY;!Wbs_ zzwhRg&8!w1gy~|dhb^Zuo^*Ybi>N}#usc<#MIZP&@ z6Tf2eVv?A=UxtCq(ZplP@k*y)5GM{nPo|{h=gF_26``f5-{ljcb$J{I;Wf}GVVH)IPEjY)Ky`=m5Oeq|IcbsZSKb;o;Y-_oTzHV$iCXI z=y;D$C{(Ws;Coo4p3x%3)Pt%j`BjoF#n!N6gr77kE7|sAaJ( zG;=E#5Z1>(25WaozbVG&uYv-tv8Zhi%5$A|p>m(+$7H#~-V4X(iT20fiC;R>ZB%gqgLPxH&#Vtzj z%WxFG6e!&}IZkW3(?rp{64+xg6C4ZvR`!~(86kGuj`U=d=*btmZ_ z0lX9;<-6`Y=qjatdnKp>t~-aLD<8cEDt#QX)wV1|&Z^~0i*Lb8_fk8`oM^?kn3Lo( zJF~o!@P) z#06Y;j=B;1WrS)yz1G>0E``wd5Z9gM;<~e3yY7q`*PS+!otyAU8%(i)>&{WY^+$*W zTz8%cc)8&4&H4|zvsVNDHE}ah*(TlL8v#FokTR}2`9AybW~>wl-HrRs>!st@EQuNS zoqT~EbqC(g2;GhQ&NX^)7I)X~JGrB#`_56G`%ZSCDn17z`Ldne2;z`)E>_>-hcFjj z^)ROZQ@Lt|rM?JTD{ImXmBxMNY{Xl-@2up~P#Cs8tOS*D-}ye`{pr3_gxS@E+xx{V(GbyxARXhc*H7D-bY0Z5~PTUoFn)`vAxHlN?Z*t;p z%;>TQm*moGhvsYUc{y=s3N-iKIdL}`?yWg-FDuk#_bJV#-4n8!dv;FTsz`I+k`woB zhWn$OxTh8Cvb#Y@%~fH?o|1a3IDDq3<;49axVd;NG~DyBN>!KY9Pi61$1R5YtDLy6 zF4JZAHzMX8>x+q4-Psp&a^g;wYwq9W#Ql-s-jWmd>Iz+UU3o5ZU^HHEZ1;>@xN9%$ zm~J?|8Uz0VB3ENFTwt=17Z~3sd;`HboT}XdigQ6)>*C$Xh?}X_FRsTlPm329-dHB} z(>79(X?RuR(r}j=<$i1E3M-`fEpiFc&FG{{8`3tNJr{YsXlN)9$K%vGFK5+6ydQ^l z))}3;4I+8pUTcVa-<~i}5O^uO;yl|`U36B@wwKiuLqyqi8x7{lI15OZe9#y!#HXk=c+nu{U4_=Gy z9CvsENA$;#^&UJ`#rbWXn>tC)Q(30xak za~5_}XCUy@6SvYl^;`k)QiOW$NE22yS**#a+0&23wYY*|$ZZW$Z$n6(2qA);Z#DyZ zi5Tu!^I#er?J0vepa=omw~ST7jrj;bJrMfSVdSCK7SyU!0-L;Ql#rT>N_DXcDS^5P zG?yd9?!ieMmY>*!*8p!ME`wI}(zs6ne~94DL{8lBy$umNdYW^OJ0K|CxC@cQ0Q`W+BLwyY&~+`Y_S^^H z7Xaq}9yLJ7p95#swcQhu@d)n7 zP`Y6m7PX_$1=4q;IRvsTx1-Bc$LS`$jkLD>M&5(YrB(usG?l-PtM!%V0<#`H>;09% zwPZwVB}BAVLWQwHye-c&5v`RF(OL=`AdTMOUw486$gsOOnw;PE}r&6xTcsa+IwR7Ly(~CmF`2rE^3KJOaMA&bRc&SY0th(^Bj1hadi_I)#+*Vfo%y@0#-Xo9 zBrxA1M@Q<(AC> zerSdDrIX>*J{nv2sR)JiJM&j3&8k?Fx|8|^)US+@zk-SWBu~Jv7zI=XFC+8h$dEi7 zB*CB6NV?kJV7D%y{s;V!Ah?&#oijP23V&2vA~t?GV7}3T@}H<&{!fmCCVYBu>ISw%m^o0mJeC zz6V=7%nW+U%+UN7J!S3%QsXJJOdo5)`q*L|X14HL|8F?V?BF@fENDKq6u3?Pu_eM+ z>1KqGKDLy%c9_Z6nev>^rdFq14h>M)bLNZ(;5caFZpOzM;T zD~FjZvB7hgN!@DSVJ7{Lx9KpGEIaBjlRRxZ%w&r49A?S}#q&B(z;~EQz;~EQp0*uk zGR1e8Nx*lQ$+fJy>R%sQ$mBcBB+$0Q%>V4M<-gE6-(e=3>O0JA-y=HPc1&D6|zpIJ=4&nr(oMg=;$|(aZ z3oPf4EU-|RdSg(7si$6 zdR`Q1J+GO31GV;=N!;h)Fm?63W^yy!rq@heowmGYlBJc`%ni)t;3hHpC7S@x^*q0l zZHL!P^7~#hS@M6%Yvv|oEG>?}TN^eXvn~5xJ|dpi%x#}tcn-gWE>a$+ zf|O@mXNpxY?$KcJlSc@v$YKRHV%u4b|5hWdY2}}wimJH?K7eU_A42||6Q`=;Qf9po z;ByG+xvHd8@1)bms!~zfwe~NeI$s&9ZXM9+ncFO7l_wgIFYFn0hWxTZJWKx#>|Y|N z;+?TQkIj*99o+ar8iyKS=gS%-%2|USK=&<+V-1pBc*?gXq3l$bEl9N{qwI9B>^xm| z7iRJxvb6YvY?YNCzZke0T39E}@e**h==w5{IO=QwK2H>Z^5i~m9u6?`Ag4MEN&tD* z;kaxHZJ*#4zc#qV@6lq5Z{=HE(}f8qU7p^*1lQ!DgJIXGL}FKxM>D)OnEU{B! zJha7JlY(atAI%d9onj#+oKjBIBOHoqMu6}+iHH`d?q$p*mWS*a!BMZ7#D)??qK_I; z=ApWm4aWf{*%CFrkjPX^WWH4pZYaHE6jIWCtY-f4g? z*pyU|5Uoz3BvL|n={0|R;RxwKoQInS1`{?&!9Fi&*_XP53tRTja49q!lJ*pVNfo!` z;-HkYENgrrc{_JPJ>j)i zbuklJGSO4L#$+Rl6|?CYoE%s;ThIOOL4?kuw&hIoW^s>}Xg#&-d?YHtwN0aYwx02v z6TLVAd;1KiV)wFNS$IO(s6Ia4WaLk9ruGfC)J*Yu;>H&aM9%#xG1K?6?jMyP*MW(H zLcfq9=^s*j0tU2^%-fwvG@GT~1 zm*&T~CRjz5*L54u71mh&Ty<|=PHMeXgZ_ z>eHf*ny7EEc`dT6_ZFdkt-Hl1gJxHdoln5OGr#pj4tv{&$j|3q^#8E;Udwu2SGw2+ zK>!;$=eR)-AQ%AV96&G!QB)umTHS1lge1Btk_MqZKCZHTd+xi+zIBzaUG@W<8$XH5 z4 zAId46J^ExwaSzuyC~n<3$QB}mh2pfhD*9G2=eAdhBYo`fsqgfu?;;d0Rb@L7@2g!V z5$~T6F;v;yGsMOmKo3#hRxR+b!rBqS`qAm~z|gKVe7rtEq&N{^69h(L8LSM)&{LiA zlpIe-7ebDz$DJX}p6!p5`p@-;L+@LQb{U6u0z@|3)CSiG`hhCmji3q6Byv0t>7c;( zpi?j>cCpYfaoLO`=(_%1BVN98Ir+lrPrJtyAF<_?2B^06Py761$xEr+%1R9kD$1=h z){~ex|*yYxAtFSMA|BYFJQqTjzNHh1iX8^y`a) zbe7!T-6&hkpfpuSd2-d6aXT4n$5cA(bm_3GGgfm3BxCKFFjfP7K)y3pGbPFFV3rXnbIC3YzHKl^{bv8y~P=-_mzmN>{VBxEa$uKl4WBKg$hnzw$Cufkc_*~^% z=s^yCMaXfW)PYizVLiJ7q@>+-AUt%{N6RiAAD1(r1!iR5o%n_C4Qf#P?J4&8^6_u> z&|SEmTq+#l)V@WXWm`LkELD!2`gS<=?QHvnSr1-A(<{<#h!t1&BK(Eb5r_wMa{uFX zG0gYorZzvCZR-Bq%LBcm0p$+1z0<8a

b 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

  • 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

    pxzDW*dO9186M@C*wx6{AKC+*JZ6M3&*_@%@0 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

      6r`(|$cbz9y{P<8t>g5@ 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

      yZPw?oUUC7 zvj8-x?-Um8qU76}Cjw`7>hlfhq+P2TXkB{KZqT(FFYI_XM69+5vcf}cd=n&VcIHXj zt$Xhp?XnHMPEeostT*SjXK!SsYpTarT$!bUnns%y4K`(bt7y5ZXNA5xpPs&W9NXR& z2EQ$>t}YFJIQFawHJ*NWu>37c$DelMxPP1ZsmnQ}UT?2yebK$3wGBgP3vR(S^m^~W zo#2C%O~w)9o_2e(y9L96{~cpl?ZepUjv;JL5@D)i*HACa3hxGXEHw}J++vgM{K=zh z87hZQQAZAZm)ADvQsyaC;|jy8LAVZpn5aEBbR($(Veg_T>E*XD8;Y=+Ab zYR4AZrQ>{n(!=hc5PpC*AO?nG^I@9Dq8|NG_(*@;aYNvhb?$lMq_SS}owZ<19%^}z zTsezI-$$;NE@#dXHZ^6t8Cu9VX&v8ElsluJyjP985prT%1q%q$er#z})aY!wlGQ}_ zwod`CziIGN+m&n7PK}>KO8jk8!`wxAdE>l^46uy$63INq$2&F%4e!|CzdYx~e+_De zoDyf`C~_99p(G1fn|x_IF^@KQ#{}CVC9+LMm-}sI-H0YX26aesuZv%#l|jYqiIjLD zX*Uq#_i#zCp9VGt2opBrF~Lq3HSl@7!^Qx$#!^MAI<(-I zUh6#?1ZMzcgtadGGH66H-KrwjYcAJ zOHV7ATjs{A$c_JcFE>d2?nuTcx|6wa-QR#4|EdXU>ct|3HhcQ2qZg?WckkuKxYQWy z=pL5u*{{md3L+w@H1Z6vG0U_f)coYeWH4t3BPaAxpeI_mHq z_{4b~>S)z4OHQDU>|N2+Js2iil*?SX(eVW85-Lf;_}~D)NgI z*WNj_Cdt=(=#&0*=g~5D7?DTtuTB>XAy*oUxluhwM&6{x-K2v4!oWdXqAgW0@)1Fw zd6Xr6_&g@@B}%tA2K3I1-;}aPMh)Kk#8P}PX4dye@W>1EPd&@v9GeBymK$ooSQ#@_ZfSyL=FtCw9t?zh(?GN z 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%0D^)h8gOue@YYUzrkaCuJVnIJMUr9|cqm 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

      8Kyd0j`0a)E}Gq(f9snt= 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⪪%pwDY#9>RTt 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 Dwmkkm diff --git a/tools/esp_app_trace/test/sysview/test.sh b/tools/esp_app_trace/test/sysview/test.sh index 4906c8f3171..52351967f97 100755 --- a/tools/esp_app_trace/test/sysview/test.sh +++ b/tools/esp_app_trace/test/sysview/test.sh @@ -1,29 +1,29 @@ #!/usr/bin/env bash -{ python -m coverage debug sys \ - && python -m coverage erase &> output \ - && python -m coverage run -a $IDF_PATH/tools/esp_app_trace/sysviewtrace_proc.py -d -p -b sysview_tracing_heap_log.elf heap_log0.svdat heap_log1.svdat &>> output \ - && diff output expected_output \ - && python -m coverage report \ -; } || { echo 'The test for sysviewtrace_proc has failed. Please examine the artifacts.' ; exit 1; } +{ python -m coverage debug sys && \ + python -m coverage erase > output && \ + python -m coverage run -a $IDF_PATH/tools/esp_app_trace/sysviewtrace_proc.py -d -p -b sysview_tracing_heap_log.elf heap_log0.svdat heap_log1.svdat >> output && \ + diff output expected_output && \ + python -m coverage report; \ +} || { echo 'The test for sysviewtrace_proc has failed. Please examine the artifacts.' ; exit 1; } -{ python -m coverage debug sys \ - && python -m coverage erase &> output.json \ - && python -m coverage run -a $IDF_PATH/tools/esp_app_trace/sysviewtrace_proc.py -j -b sysview_tracing_heap_log.elf heap_log0.svdat heap_log1.svdat &>> output.json \ - && diff output.json expected_output.json \ - && python -m coverage report \ -; } || { echo 'The test for sysviewtrace_proc JSON functionality has failed. Please examine the artifacts.' ; exit 1; } +{ python -m coverage debug sys && \ + python -m coverage erase > output.json && \ + python -m coverage run -a $IDF_PATH/tools/esp_app_trace/sysviewtrace_proc.py -j -b sysview_tracing_heap_log.elf heap_log0.svdat heap_log1.svdat >> output.json && \ + diff output.json expected_output.json && \ + python -m coverage report; \ +} || { echo 'The test for sysviewtrace_proc JSON functionality has failed. Please examine the artifacts.' ; exit 1; } -{ python -m coverage debug sys \ - && python -m coverage erase &> output \ - && python -m coverage run -a $IDF_PATH/tools/esp_app_trace/sysviewtrace_proc.py -d -p -b sysview_tracing_heap_log.elf heap_log_mcore.svdat &>> output \ - && diff output expected_output_mcore \ - && python -m coverage report \ -; } || { echo 'The test for mcore sysviewtrace_proc functionality has failed. Please examine the artifacts.' ; exit 1; } +{ python -m coverage debug sys && \ + python -m coverage erase > output && \ + python -m coverage run -a $IDF_PATH/tools/esp_app_trace/sysviewtrace_proc.py -d -p -b sysview_tracing_heap_log.elf heap_log_mcore.svdat >> output && \ + diff output expected_output_mcore && \ + python -m coverage report; \ +} || { echo 'The test for mcore sysviewtrace_proc functionality has failed. Please examine the artifacts.' ; exit 1; } -{ python -m coverage debug sys \ - && python -m coverage erase &> output.json \ - && python -m coverage run -a $IDF_PATH/tools/esp_app_trace/sysviewtrace_proc.py -j -b sysview_tracing_heap_log.elf heap_log_mcore.svdat &>> output.json \ - && diff output.json expected_output_mcore.json \ - && python -m coverage report \ -; } || { echo 'The test for mcore sysviewtrace_proc JSON functionality has failed. Please examine the artifacts.' ; exit 1; } +{ python -m coverage debug sys && \ + python -m coverage erase > output.json && \ + python -m coverage run -a $IDF_PATH/tools/esp_app_trace/sysviewtrace_proc.py -j -b sysview_tracing_heap_log.elf heap_log_mcore.svdat >> output.json && \ + diff output.json expected_output_mcore.json && \ + python -m coverage report; \ +} || { echo 'The test for mcore sysviewtrace_proc JSON functionality has failed. Please examine the artifacts.' ; exit 1; } From 39ee584f82177d0b6236376ee5f39c3213617910 Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Wed, 18 Jun 2025 23:29:05 +0200 Subject: [PATCH 181/213] change(sysview): drop ESP mcore extension --- tools/esp_app_trace/espytrace/sysview.py | 1011 ++++++++++++---------- tools/esp_app_trace/sysviewtrace_proc.py | 21 +- 2 files changed, 558 insertions(+), 474 deletions(-) diff --git a/tools/esp_app_trace/espytrace/sysview.py b/tools/esp_app_trace/espytrace/sysview.py index e7f7cd6053b..234bc90cd29 100644 --- a/tools/esp_app_trace/espytrace/sysview.py +++ b/tools/esp_app_trace/espytrace/sysview.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 import copy import json @@ -7,42 +7,42 @@ import struct import espytrace.apptrace as apptrace -SYSVIEW_EVTID_NOP = 0 # Dummy packet. -SYSVIEW_EVTID_OVERFLOW = 1 -SYSVIEW_EVTID_ISR_ENTER = 2 -SYSVIEW_EVTID_ISR_EXIT = 3 -SYSVIEW_EVTID_TASK_START_EXEC = 4 -SYSVIEW_EVTID_TASK_STOP_EXEC = 5 -SYSVIEW_EVTID_TASK_START_READY = 6 -SYSVIEW_EVTID_TASK_STOP_READY = 7 -SYSVIEW_EVTID_TASK_CREATE = 8 -SYSVIEW_EVTID_TASK_INFO = 9 -SYSVIEW_EVTID_TRACE_START = 10 -SYSVIEW_EVTID_TRACE_STOP = 11 -SYSVIEW_EVTID_SYSTIME_CYCLES = 12 -SYSVIEW_EVTID_SYSTIME_US = 13 -SYSVIEW_EVTID_SYSDESC = 14 -SYSVIEW_EVTID_MARK_START = 15 -SYSVIEW_EVTID_MARK_STOP = 16 -SYSVIEW_EVTID_IDLE = 17 -SYSVIEW_EVTID_ISR_TO_SCHEDULER = 18 -SYSVIEW_EVTID_TIMER_ENTER = 19 -SYSVIEW_EVTID_TIMER_EXIT = 20 -SYSVIEW_EVTID_STACK_INFO = 21 -SYSVIEW_EVTID_MODULEDESC = 22 -SYSVIEW_EVTID_DATA_SAMPLE = 23 -SYSVIEW_EVTID_INIT = 24 -SYSVIEW_EVENT_ID_PREDEF_LEN_MAX = SYSVIEW_EVTID_INIT -SYSVIEW_EVTID_NAME_RESOURCE = 25 -SYSVIEW_EVTID_PRINT_FORMATTED = 26 -SYSVIEW_EVTID_NUMMODULES = 27 -SYSVIEW_EVENT_ID_PREDEF_MAX = SYSVIEW_EVTID_NUMMODULES +SYSVIEW_EVTID_NOP = 0 # Dummy packet. +SYSVIEW_EVTID_OVERFLOW = 1 +SYSVIEW_EVTID_ISR_ENTER = 2 +SYSVIEW_EVTID_ISR_EXIT = 3 +SYSVIEW_EVTID_TASK_START_EXEC = 4 +SYSVIEW_EVTID_TASK_STOP_EXEC = 5 +SYSVIEW_EVTID_TASK_START_READY = 6 +SYSVIEW_EVTID_TASK_STOP_READY = 7 +SYSVIEW_EVTID_TASK_CREATE = 8 +SYSVIEW_EVTID_TASK_INFO = 9 +SYSVIEW_EVTID_TRACE_START = 10 +SYSVIEW_EVTID_TRACE_STOP = 11 +SYSVIEW_EVTID_SYSTIME_CYCLES = 12 +SYSVIEW_EVTID_SYSTIME_US = 13 +SYSVIEW_EVTID_SYSDESC = 14 +SYSVIEW_EVTID_MARK_START = 15 +SYSVIEW_EVTID_MARK_STOP = 16 +SYSVIEW_EVTID_IDLE = 17 +SYSVIEW_EVTID_ISR_TO_SCHEDULER = 18 +SYSVIEW_EVTID_TIMER_ENTER = 19 +SYSVIEW_EVTID_TIMER_EXIT = 20 +SYSVIEW_EVTID_STACK_INFO = 21 +SYSVIEW_EVTID_MODULEDESC = 22 +SYSVIEW_EVTID_DATA_SAMPLE = 23 +SYSVIEW_EVTID_INIT = 24 +SYSVIEW_EVENT_ID_PREDEF_LEN_MAX = SYSVIEW_EVTID_INIT +SYSVIEW_EVTID_NAME_RESOURCE = 25 +SYSVIEW_EVTID_PRINT_FORMATTED = 26 +SYSVIEW_EVTID_NUMMODULES = 27 +SYSVIEW_EVENT_ID_PREDEF_MAX = SYSVIEW_EVTID_NUMMODULES -SYSVIEW_EVENT_ID_MAX = 200 +SYSVIEW_EVENT_ID_MAX = 200 -SYSVIEW_MODULE_EVENT_OFFSET = 512 +SYSVIEW_MODULE_EVENT_OFFSET = 512 -SYSVIEW_SYNC_LEN = 10 +SYSVIEW_SYNC_LEN = 10 _sysview_events_map = { 'SYS_NOP': SYSVIEW_EVTID_NOP, @@ -72,7 +72,7 @@ _sysview_events_map = { 'SYS_INIT': SYSVIEW_EVTID_INIT, 'SYS_NAME_RESOURCE': SYSVIEW_EVTID_NAME_RESOURCE, 'SYS_PRINT_FORMATTED': SYSVIEW_EVTID_PRINT_FORMATTED, - 'SYS_NUMMODULES': SYSVIEW_EVTID_NUMMODULES + 'SYS_NUMMODULES': SYSVIEW_EVTID_NUMMODULES, } _os_events_map = {} @@ -94,7 +94,7 @@ def parse_trace(reader, parser, os_evt_map_file=''): global _os_events_map # parse OS events formats file _os_events_map = _read_events_map(os_evt_map_file) - parser.esp_ext = ('; ESP_Extension\n' in _read_file_header(reader)) + _read_file_header(reader) _read_init_seq(reader) while True: event = parser.read_event(reader, _os_events_map) @@ -199,14 +199,14 @@ def _decode_u32(reader): sz = 0 val = 0 while True: - b, = struct.unpack('= SYSVIEW_EVENT_ID_PREDEF_LEN_MAX and self.plen != params_len: - raise SysViewTraceParseError('Invalid event {}({:d}) payload len {:d}! Must be {:d}.'.format(self.name, self.id, self.plen, params_len)) + raise SysViewTraceParseError( + 'Invalid event {}({:d}) payload len {:d}! Must be {:d}.'.format( + self.name, self.id, self.plen, params_len + ) + ) def __str__(self): params = '' @@ -375,23 +385,26 @@ class SysViewEvent(apptrace.TraceEvent): params += '{}, '.format(param) if len(params): params = params[:-2] # remove trailing ', ' - return '{:.9f} - core[{:d}].{}({:d}), plen {:d}: [{}]'.format(self.ts, self.core_id, self.name, self.id, self.plen, params) + return '{:.9f} - core[{:d}].{}({:d}), plen {:d}: [{}]'.format( + self.ts, self.core_id, self.name, self.id, self.plen, params + ) class SysViewEventParam: """ - Abstract base SystemView event's parameter class. This is a base class for all event's parameters. + Abstract base SystemView event's parameter class. This is a base class for all event's parameters. """ + def __init__(self, name, decode_func): """ - Constructor. + Constructor. - Parameters - ---------- - name : string - Event parameter name. - decode_func : callable object - Parameter decoding function. + Parameters + ---------- + name : string + Event parameter name. + decode_func : callable object + Parameter decoding function. """ self.name = name self.decode_func = decode_func @@ -401,19 +414,19 @@ class SysViewEventParam: def decode(self, reader, max_sz): """ - Reads and decodes events parameter. + Reads and decodes events parameter. - Parameters - ---------- - reader : apptrace.Reader - Trace reader object. - max_sz : int - Maximum number of bytes to read. + Parameters + ---------- + reader : apptrace.Reader + Trace reader object. + max_sz : int + Maximum number of bytes to read. - Returns - ------- - tuple - a tuple containing number of read bytes and decoded value. + Returns + ------- + tuple + a tuple containing number of read bytes and decoded value. """ pass @@ -426,104 +439,136 @@ class SysViewEventParam: class SysViewEventParamSimple(SysViewEventParam): """ - Simple SystemView event's parameter class. + Simple SystemView event's parameter class. """ + def decode(self, reader, max_sz): """ - see SysViewEventParam.decode() + see SysViewEventParam.decode() """ return self.decode_func(reader) class SysViewEventParamArray(SysViewEventParamSimple): """ - Array SystemView event's parameter class. + Array SystemView event's parameter class. """ + def __init__(self, name, decode_func, size=-1): """ - Constructor. + Constructor. - Parameters - ---------- - name : string - see SysViewEventParam.__init__() - decode_func : callable object - see SysViewEventParam.__init__() - size : int - Array's size. If -1 decode() will try to read all bytes from reader. + Parameters + ---------- + name : string + see SysViewEventParam.__init__() + decode_func : callable object + see SysViewEventParam.__init__() + size : int + Array's size. If -1 decode() will try to read all bytes from reader. """ SysViewEventParamSimple.__init__(self, name, decode_func) self.arr_size = size def decode(self, reader, max_sz): """ - see SysViewEventParam.decode() + see SysViewEventParam.decode() """ tottal_sz = 0 vals = [] i = 0 while tottal_sz < max_sz: - sz,val = self.decode_func(reader) + sz, val = self.decode_func(reader) vals.append(val) tottal_sz += sz i += 1 if self.arr_size != -1 and i == self.arr_size: break - return tottal_sz,vals + return tottal_sz, vals class SysViewPredefinedEvent(SysViewEvent): """ - Pre-defined SystemView events class. + Pre-defined SystemView events class. """ + _predef_events_fmt = { - SYSVIEW_EVTID_NOP: ('svNop', []), - SYSVIEW_EVTID_OVERFLOW: ('svOverflow', [SysViewEventParamSimple('drop_cnt', _decode_u32)]), - SYSVIEW_EVTID_ISR_ENTER: ('svIsrEnter', [SysViewEventParamSimple('irq_num', _decode_u32)]), - SYSVIEW_EVTID_ISR_EXIT: ('svIsrExit', []), - SYSVIEW_EVTID_TASK_START_EXEC: ('svTaskStartExec', [SysViewEventParamSimple('tid', _decode_id)]), - SYSVIEW_EVTID_TASK_STOP_EXEC: ('svTaskStopExec', []), + SYSVIEW_EVTID_NOP: ('svNop', []), + SYSVIEW_EVTID_OVERFLOW: ('svOverflow', [SysViewEventParamSimple('drop_cnt', _decode_u32)]), + SYSVIEW_EVTID_ISR_ENTER: ('svIsrEnter', [SysViewEventParamSimple('irq_num', _decode_u32)]), + SYSVIEW_EVTID_ISR_EXIT: ('svIsrExit', []), + SYSVIEW_EVTID_TASK_START_EXEC: ('svTaskStartExec', [SysViewEventParamSimple('tid', _decode_id)]), + SYSVIEW_EVTID_TASK_STOP_EXEC: ('svTaskStopExec', []), SYSVIEW_EVTID_TASK_START_READY: ('svTaskStartReady', [SysViewEventParamSimple('tid', _decode_id)]), - SYSVIEW_EVTID_TASK_STOP_READY: ('svTaskStopReady', [SysViewEventParamSimple('tid', _decode_id), - SysViewEventParamSimple('cause', _decode_u32)]), - SYSVIEW_EVTID_TASK_CREATE: ('svTaskCreate', [SysViewEventParamSimple('tid', _decode_id)]), - SYSVIEW_EVTID_TASK_INFO: ('svTaskInfo', [SysViewEventParamSimple('tid', _decode_id), - SysViewEventParamSimple('prio', _decode_u32), - SysViewEventParamSimple('name', _decode_str)]), - SYSVIEW_EVTID_TRACE_START: ('svTraceStart', []), - SYSVIEW_EVTID_TRACE_STOP: ('svTraceStop', []), - SYSVIEW_EVTID_SYSTIME_CYCLES: ('svSysTimeCycles', [SysViewEventParamSimple('cycles', _decode_u32)]), - SYSVIEW_EVTID_SYSTIME_US: ('svSysTimeUs', [SysViewEventParamSimple('time', _decode_u64)]), - SYSVIEW_EVTID_SYSDESC: ('svSysDesc', [SysViewEventParamSimple('desc', _decode_str)]), - SYSVIEW_EVTID_MARK_START: ('svUserStart', [SysViewEventParamSimple('user_id', _decode_u32)]), - SYSVIEW_EVTID_MARK_STOP: ('svUserStop', [SysViewEventParamSimple('user_id', _decode_u32)]), - SYSVIEW_EVTID_IDLE: ('svIdle', []), + SYSVIEW_EVTID_TASK_STOP_READY: ( + 'svTaskStopReady', + [SysViewEventParamSimple('tid', _decode_id), SysViewEventParamSimple('cause', _decode_u32)], + ), + SYSVIEW_EVTID_TASK_CREATE: ('svTaskCreate', [SysViewEventParamSimple('tid', _decode_id)]), + SYSVIEW_EVTID_TASK_INFO: ( + 'svTaskInfo', + [ + SysViewEventParamSimple('tid', _decode_id), + SysViewEventParamSimple('prio', _decode_u32), + SysViewEventParamSimple('name', _decode_str), + ], + ), + SYSVIEW_EVTID_TRACE_START: ('svTraceStart', []), + SYSVIEW_EVTID_TRACE_STOP: ('svTraceStop', []), + SYSVIEW_EVTID_SYSTIME_CYCLES: ('svSysTimeCycles', [SysViewEventParamSimple('cycles', _decode_u32)]), + SYSVIEW_EVTID_SYSTIME_US: ('svSysTimeUs', [SysViewEventParamSimple('time', _decode_u64)]), + SYSVIEW_EVTID_SYSDESC: ('svSysDesc', [SysViewEventParamSimple('desc', _decode_str)]), + SYSVIEW_EVTID_MARK_START: ('svUserStart', [SysViewEventParamSimple('user_id', _decode_u32)]), + SYSVIEW_EVTID_MARK_STOP: ('svUserStop', [SysViewEventParamSimple('user_id', _decode_u32)]), + SYSVIEW_EVTID_IDLE: ('svIdle', []), SYSVIEW_EVTID_ISR_TO_SCHEDULER: ('svExitIsrToScheduler', []), - SYSVIEW_EVTID_TIMER_ENTER: ('svTimerEnter', [SysViewEventParamSimple('tim_id', _decode_u32)]), - SYSVIEW_EVTID_TIMER_EXIT: ('svTimerExit', []), - SYSVIEW_EVTID_STACK_INFO: ('svStackInfo', [SysViewEventParamSimple('tid', _decode_id), - SysViewEventParamSimple('base', _decode_u32), - SysViewEventParamSimple('sz', _decode_u32), - SysViewEventParamSimple('unused', _decode_u32)]), - SYSVIEW_EVTID_MODULEDESC: ('svModuleDesc', [SysViewEventParamSimple('mod_id', _decode_u32), - SysViewEventParamSimple('evt_off', _decode_u32), - SysViewEventParamSimple('desc', _decode_str)]), - SYSVIEW_EVTID_INIT: ('svInit', [SysViewEventParamSimple('sys_freq', _decode_u32), - SysViewEventParamSimple('cpu_freq', _decode_u32), - SysViewEventParamSimple('ram_base', _decode_u32), - SysViewEventParamSimple('id_shift', _decode_u32)]), - SYSVIEW_EVTID_DATA_SAMPLE: ('svDataSample', []), - SYSVIEW_EVTID_NAME_RESOURCE: ('svNameResource', [SysViewEventParamSimple('res_id', _decode_u32), - SysViewEventParamSimple('name', _decode_str)]), - SYSVIEW_EVTID_PRINT_FORMATTED: ('svPrint', [SysViewEventParamSimple('msg', _decode_str), - SysViewEventParamSimple('lvl', _decode_u32), - SysViewEventParamSimple('unused', _decode_u32)]), - SYSVIEW_EVTID_NUMMODULES: ('svNumModules', [SysViewEventParamSimple('mod_cnt', _decode_u32)]), + SYSVIEW_EVTID_TIMER_ENTER: ('svTimerEnter', [SysViewEventParamSimple('tim_id', _decode_u32)]), + SYSVIEW_EVTID_TIMER_EXIT: ('svTimerExit', []), + SYSVIEW_EVTID_STACK_INFO: ( + 'svStackInfo', + [ + SysViewEventParamSimple('tid', _decode_id), + SysViewEventParamSimple('base', _decode_u32), + SysViewEventParamSimple('sz', _decode_u32), + SysViewEventParamSimple('unused', _decode_u32), + ], + ), + SYSVIEW_EVTID_MODULEDESC: ( + 'svModuleDesc', + [ + SysViewEventParamSimple('mod_id', _decode_u32), + SysViewEventParamSimple('evt_off', _decode_u32), + SysViewEventParamSimple('desc', _decode_str), + ], + ), + SYSVIEW_EVTID_INIT: ( + 'svInit', + [ + SysViewEventParamSimple('sys_freq', _decode_u32), + SysViewEventParamSimple('cpu_freq', _decode_u32), + SysViewEventParamSimple('ram_base', _decode_u32), + SysViewEventParamSimple('id_shift', _decode_u32), + ], + ), + SYSVIEW_EVTID_DATA_SAMPLE: ('svDataSample', []), + SYSVIEW_EVTID_NAME_RESOURCE: ( + 'svNameResource', + [SysViewEventParamSimple('res_id', _decode_u32), SysViewEventParamSimple('name', _decode_str)], + ), + SYSVIEW_EVTID_PRINT_FORMATTED: ( + 'svPrint', + [ + SysViewEventParamSimple('msg', _decode_str), + SysViewEventParamSimple('lvl', _decode_u32), + SysViewEventParamSimple('unused', _decode_u32), + ], + ), + SYSVIEW_EVTID_NUMMODULES: ('svNumModules', [SysViewEventParamSimple('mod_cnt', _decode_u32)]), } def __init__(self, evt_id, core_id, reader): """ - see SysViewEvent.__init__() + see SysViewEvent.__init__() """ SysViewEvent.__init__(self, evt_id, core_id, reader, self._predef_events_fmt) # self.name = 'SysViewPredefinedEvent' @@ -531,11 +576,12 @@ class SysViewPredefinedEvent(SysViewEvent): class SysViewOSEvent(SysViewEvent): """ - OS related SystemView events class. + OS related SystemView events class. """ + def __init__(self, evt_id, core_id, reader, events_fmt_map): """ - see SysViewEvent.__init__() + see SysViewEvent.__init__() """ SysViewEvent.__init__(self, evt_id, core_id, reader, events_fmt_map) # self.name = 'SysViewOSEvent' @@ -543,70 +589,79 @@ class SysViewOSEvent(SysViewEvent): class SysViewHeapEvent(SysViewEvent): """ - Heap related SystemView events class. + Heap related SystemView events class. - Attributes - ---------- - events_fmt : dict - see return value of _read_events_map() + Attributes + ---------- + events_fmt : dict + see return value of _read_events_map() """ + events_fmt = { - 0: ('esp_sysview_heap_trace_alloc', [SysViewEventParamSimple('addr', _decode_u32), - SysViewEventParamSimple('size', _decode_u32), - SysViewEventParamArray('callers', _decode_u32)]), - 1: ('esp_sysview_heap_trace_free', [SysViewEventParamSimple('addr', _decode_u32), - SysViewEventParamArray('callers', _decode_u32)]), + 0: ( + 'esp_sysview_heap_trace_alloc', + [ + SysViewEventParamSimple('addr', _decode_u32), + SysViewEventParamSimple('size', _decode_u32), + SysViewEventParamArray('callers', _decode_u32), + ], + ), + 1: ( + 'esp_sysview_heap_trace_free', + [SysViewEventParamSimple('addr', _decode_u32), SysViewEventParamArray('callers', _decode_u32)], + ), } def __init__(self, evt_id, core_id, events_off, reader): """ - Constructor. Reads and optionally decodes event. + Constructor. Reads and optionally decodes event. - Parameters - ---------- - evt_id : int - see SysViewEvent.__init__() - events_off : int - Offset for heap events IDs. Greater or equal to SYSVIEW_MODULE_EVENT_OFFSET. - reader : apptrace.Reader - see SysViewEvent.__init__() - core_id : int - see SysViewEvent.__init__() + Parameters + ---------- + evt_id : int + see SysViewEvent.__init__() + events_off : int + Offset for heap events IDs. Greater or equal to SYSVIEW_MODULE_EVENT_OFFSET. + reader : apptrace.Reader + see SysViewEvent.__init__() + core_id : int + see SysViewEvent.__init__() """ cur_events_map = {} - for id in self.events_fmt: - cur_events_map[events_off + id] = self.events_fmt[id] + for _id in self.events_fmt: + cur_events_map[events_off + _id] = self.events_fmt[_id] SysViewEvent.__init__(self, evt_id, core_id, reader, cur_events_map) # self.name = 'SysViewHeapEvent' class SysViewTraceDataParser(apptrace.TraceDataProcessor): """ - Base SystemView trace data parser class. + Base SystemView trace data parser class. - Attributes - ---------- - STREAMID_SYS : int - system events stream ID. Reserved for internal uses. - STREAMID_LOG : int - log events stream ID. - STREAMID_HEAP : int - heap events stream ID. + Attributes + ---------- + STREAMID_SYS : int + system events stream ID. Reserved for internal uses. + STREAMID_LOG : int + log events stream ID. + STREAMID_HEAP : int + heap events stream ID. """ + STREAMID_SYS = -1 STREAMID_LOG = 0 STREAMID_HEAP = 1 def __init__(self, print_events=False, core_id=0): """ - Constructor. + Constructor. - Parameters - ---------- - print_events : bool - see apptrace.TraceDataProcessor.__init__() - core_id : int - id of the core this parser object relates to. + Parameters + ---------- + print_events : bool + see apptrace.TraceDataProcessor.__init__() + core_id : int + id of the core this parser object relates to. """ apptrace.TraceDataProcessor.__init__(self, print_events=print_events, keep_all_events=True) self.sys_info = None @@ -614,62 +669,61 @@ class SysViewTraceDataParser(apptrace.TraceDataProcessor): self.irqs_info = {} self.tasks_info = {} self.core_id = core_id - self.esp_ext = False def _parse_irq_desc(self, desc): """ - Parses IRQ description. + Parses IRQ description. - Parameters - ---------- - desc : string - IRQ description string. + Parameters + ---------- + desc : string + IRQ description string. - Returns - ------- - tuple - a tuple with IRQ number and name or None on error. + Returns + ------- + tuple + a tuple with IRQ number and name or None on error. """ m = re.match('I#([0-9]+)=(.+)', desc) if m: - return m.group(2),m.group(1) + return m.group(2), m.group(1) return None def _update_ts(self, ts): """ - Calculates real event timestamp. + Calculates real event timestamp. - Parameters - ---------- - ts : int - Event timestamp offset. + Parameters + ---------- + ts : int + Event timestamp offset. - Returns - ------- - float - real event timestamp. + Returns + ------- + float + real event timestamp. """ self._last_ts += ts return float(self._last_ts) / self.sys_info.params['sys_freq'].value def read_extension_event(self, evt_id, core_id, reader): """ - Reads extension event. - Default implementation which just reads out event. + Reads extension event. + Default implementation which just reads out event. - Parameters - ---------- - evt_id : int - Event ID. - reader : apptrace.Reader - Trace reader object. + Parameters + ---------- + evt_id : int + Event ID. + reader : apptrace.Reader + Trace reader object. - Returns - ------- - SysViewEvent - if this is top level parser returns object for generic event, - otherwise returns None indicating to the calling top level parser - that extension event are not supported. + Returns + ------- + SysViewEvent + if this is top level parser returns object for generic event, + otherwise returns None indicating to the calling top level parser + that extension event are not supported. """ if self.root_proc == self: # by default just read out and skip unknown event @@ -683,44 +737,38 @@ class SysViewTraceDataParser(apptrace.TraceDataProcessor): high_b &= ~(1 << 6) else: core_id = 0 - return high_b,core_id + return high_b, core_id def read_event(self, reader, os_evt_map): """ - Reads pre-defined or OS-related event. + Reads pre-defined or OS-related event. - Parameters - ---------- - reader : apptrace.Reader - Trace reader object. - os_evt_map : dict - see return value of _read_events_map() + Parameters + ---------- + reader : apptrace.Reader + Trace reader object. + os_evt_map : dict + see return value of _read_events_map() - Returns - ------- - SysViewEvent - pre-defined, OS-related or extension event object. + Returns + ------- + SysViewEvent + pre-defined, OS-related or extension event object. """ - evt_hdr, = struct.unpack('= (self.events_off + self.events_num)) else True + return ( + False + if ( + self.events_off < SYSVIEW_MODULE_EVENT_OFFSET + or event.id < self.events_off + or event.id >= (self.events_off + self.events_num) + ) + else True + ) class SysViewMultiTraceDataParser(SysViewTraceDataParser): """ - SystemView trace data parser supporting multiple event streams. + SystemView trace data parser supporting multiple event streams. """ + def __init__(self, print_events=False, core_id=0): """ - see SysViewTraceDataParser.__init__() + see SysViewTraceDataParser.__init__() """ SysViewTraceDataParser.__init__(self, print_events, core_id) self.stream_parsers = {} def add_stream_parser(self, stream_id, parser): """ - Assigns parser for events stream. + Assigns parser for events stream. - Parameters - ---------- - stream_id : int - stream ID. See SysViewTraceDataParser.STREAMID_xxx. - Parsers for SysViewTraceDataParser.STREAMID_SYS are ignored. - Top level parser is the default for SysViewTraceDataParser.STREAMID_SYS. - parser : SysViewTraceDataParser - parser object. + Parameters + ---------- + stream_id : int + stream ID. See SysViewTraceDataParser.STREAMID_xxx. + Parsers for SysViewTraceDataParser.STREAMID_SYS are ignored. + Top level parser is the default for SysViewTraceDataParser.STREAMID_SYS. + parser : SysViewTraceDataParser + parser object. """ if stream_id == SysViewTraceDataParser.STREAMID_SYS: return @@ -814,20 +870,20 @@ class SysViewMultiTraceDataParser(SysViewTraceDataParser): def read_extension_event(self, evt_id, core_id, reader): """ - Reads extension event. - Iterates over registered stream parsers trying to find one which supports that type of event. + Reads extension event. + Iterates over registered stream parsers trying to find one which supports that type of event. - Parameters - ---------- - evt_id : int - see SysViewTraceDataParser.read_extension_event() - reader : apptrace.Reader - see SysViewTraceDataParser.read_extension_event() + Parameters + ---------- + evt_id : int + see SysViewTraceDataParser.read_extension_event() + reader : apptrace.Reader + see SysViewTraceDataParser.read_extension_event() - Returns - ------- - SysViewEvent - object for extension event, if extension event is not supported return SysViewEvent instance. + Returns + ------- + SysViewEvent + object for extension event, if extension event is not supported return SysViewEvent instance. """ for stream_id in self.stream_parsers: evt = self.stream_parsers[stream_id].read_extension_event(evt_id, core_id, reader) @@ -837,36 +893,37 @@ class SysViewMultiTraceDataParser(SysViewTraceDataParser): def on_new_event(self, event): """ - Iterates over registered stream parsers allowing them to do - essential processing of event. Must be called for every read event. + Iterates over registered stream parsers allowing them to do + essential processing of event. Must be called for every read event. - Parameters - ---------- - event : SysViewEvent - Event object. + Parameters + ---------- + event : SysViewEvent + Event object. """ SysViewTraceDataParser.on_new_event(self, event) for stream_id in self.stream_parsers: self.stream_parsers[stream_id].on_new_event(event) -class SysViewEventContext(): +class SysViewEventContext: """ - SystemView event context. + SystemView event context. """ + def __init__(self, handle, irq, name=''): """ - Constructor. + Constructor. - Parameters - ---------- - handle : int - handle of the context: task ID or IRQ number. - irq : bool - flag indicating whether this is IRQ or task context. - name : string - name of the context: task or IRQ name. Empty if context is unknown. - """ + Parameters + ---------- + handle : int + handle of the context: task ID or IRQ number. + irq : bool + flag indicating whether this is IRQ or task context. + name : string + name of the context: task or IRQ name. Empty if context is unknown. + """ self.handle = handle self.irq = irq self.name = name @@ -874,20 +931,21 @@ class SysViewEventContext(): class SysViewTraceDataProcessor(apptrace.TraceDataProcessor): """ - Base SystemView trace data processor class. + Base SystemView trace data processor class. """ + def __init__(self, traces, root_proc=None, print_events=False, keep_all_events=False): """ - Constructor. + Constructor. - Parameters - ---------- - traces : list - list of parsers to process data from. - print_events : bool - see apptrace.TraceDataProcessor.__init__() - keep_all_events : bool - see apptrace.TraceDataProcessor.__init__() + Parameters + ---------- + traces : list + list of parsers to process data from. + print_events : bool + see apptrace.TraceDataProcessor.__init__() + keep_all_events : bool + see apptrace.TraceDataProcessor.__init__() """ apptrace.TraceDataProcessor.__init__(self, print_events, keep_all_events) self.event_ids = {} @@ -903,24 +961,25 @@ class SysViewTraceDataProcessor(apptrace.TraceDataProcessor): # empty list means IDLE context or self.start_ctx self.ctx_stack[t.core_id] = [] # context is undefined, we do not know have we started the tracing in task/IDLE or IRQ context - # in general there are three scenarios when we can start tracing: when core is in task, IDLE task or IRQ context + # in general there are three scenarios when we can start tracing: + # when core is in task, IDLE task or IRQ context self.prev_ctx[t.core_id] = None def _get_curr_context(self, core_id): """ - Returns current context. + Returns current context. - Parameters - ---------- - core_id : int - core ID for requested context. + Parameters + ---------- + core_id : int + core ID for requested context. - Returns - ------- - SysViewEventContext - context object - None - if there current is undefined + Returns + ------- + SysViewEventContext + context object + None + if there current is undefined """ if len(self.root_proc.ctx_stack[core_id]): return self.root_proc.ctx_stack[core_id][-1] @@ -930,35 +989,35 @@ class SysViewTraceDataProcessor(apptrace.TraceDataProcessor): def _get_prev_context(self, core_id): """ - Returns current context. + Returns current context. - Parameters - ---------- - core_id : int - core ID for requested context. + Parameters + ---------- + core_id : int + core ID for requested context. - Returns - ------- - SysViewEventContext - context object + Returns + ------- + SysViewEventContext + context object """ return self.root_proc.prev_ctx[core_id] def get_trace_stream(self, core_id, stream_id): """ - Retrieves parser for specified stream and core. + Retrieves parser for specified stream and core. - Parameters - ---------- - core_id : int - Parser's core ID. - stream_id : int - Parser's stream ID. + Parameters + ---------- + core_id : int + Parser's core ID. + stream_id : int + Parser's stream ID. - Returns - ------- - SysViewTraceDataParser - parser object for specified stream and core + Returns + ------- + SysViewTraceDataParser + parser object for specified stream and core """ if self.root_proc == self: return self.traces[core_id] @@ -966,49 +1025,41 @@ class SysViewTraceDataProcessor(apptrace.TraceDataProcessor): def event_supported(self, e): """ - Should be overridden in child class. + Should be overridden in child class. """ return False def handle_event(self, e): """ - Should be overridden in child class. + Should be overridden in child class. """ pass def print_report(self): """ - see apptrace.TraceDataProcessor.print_report() + see apptrace.TraceDataProcessor.print_report() """ apptrace.TraceDataProcessor.print_report(self) def _process_event(self, event): """ - Processes event. - Keeps track of execution context on every core. + Processes event. + Keeps track of execution context on every core. - Parameters - ---------- - event : SysViewEvent - Event object. + Parameters + ---------- + event : SysViewEvent + Event object. - Raises - ---------- - SysViewTraceParseError - if there is no parser for event's core or - if SYSVIEW_EVTID_ISR_ENTER is received for unknown IRQ or - if SYSVIEW_EVTID_TASK_START_EXEC or SYSVIEW_EVTID_TASK_STOP_READY is received for unknown task. + Raises + ---------- + SysViewTraceParseError + if there is no parser for event's core or + if SYSVIEW_EVTID_ISR_ENTER is received for unknown IRQ or + if SYSVIEW_EVTID_TASK_START_EXEC or SYSVIEW_EVTID_TASK_STOP_READY is received for unknown task. """ if event.core_id not in self.traces: - if 0 in self.traces and self.traces[0].esp_ext: - # for Espressif extension there is one trace for all cores - trace = self.traces[0] - if event.core_id not in self.ctx_stack: - self.ctx_stack[event.core_id] = [] - if event.core_id not in self.prev_ctx: - self.prev_ctx[event.core_id] = None - else: - raise SysViewTraceParseError('Event for unknown core %d' % event.core_id) + raise SysViewTraceParseError('Event for unknown core %d' % event.core_id) else: trace = self.traces[event.core_id] if event.id == SYSVIEW_EVTID_ISR_ENTER: @@ -1017,16 +1068,20 @@ class SysViewTraceDataProcessor(apptrace.TraceDataProcessor): if len(self.ctx_stack[event.core_id]): self.prev_ctx[event.core_id] = self.ctx_stack[event.core_id][-1] else: - # the 1st context switching event after trace start is SYSVIEW_EVTID_ISR_ENTER, so we have been in IDLE context + # the 1st context switching event after trace start is SYSVIEW_EVTID_ISR_ENTER, + # so we have been in IDLE context self.prev_ctx[event.core_id] = SysViewEventContext(None, False, 'IDLE%d' % event.core_id) # put new ISR context on top of the stack (the last in the list) - self.ctx_stack[event.core_id].append(SysViewEventContext(event.params['irq_num'].value, True, trace.irqs_info[event.params['irq_num'].value])) + self.ctx_stack[event.core_id].append( + SysViewEventContext(event.params['irq_num'].value, True, trace.irqs_info[event.params['irq_num'].value]) + ) elif event.id == SYSVIEW_EVTID_ISR_EXIT or event.id == SYSVIEW_EVTID_ISR_TO_SCHEDULER: if len(self.ctx_stack[event.core_id]): # return to the previous context (the last in the list) self.prev_ctx[event.core_id] = self.ctx_stack[event.core_id].pop() else: - # the 1st context switching event after trace start is SYSVIEW_EVTID_ISR_EXIT, so we have been in ISR context, + # the 1st context switching event after trace start is SYSVIEW_EVTID_ISR_EXIT, + # so we have been in ISR context, # but we do not know which one because SYSVIEW_EVTID_ISR_EXIT do not include the IRQ number self.prev_ctx[event.core_id] = SysViewEventContext(None, True, 'IRQ_oncore%d' % event.core_id) elif event.id == SYSVIEW_EVTID_TASK_START_EXEC: @@ -1036,10 +1091,13 @@ class SysViewTraceDataProcessor(apptrace.TraceDataProcessor): # return to the previous context (the last in the list) self.prev_ctx[event.core_id] = self.ctx_stack[event.core_id][-1] else: - # the 1st context switching event after trace start is SYSVIEW_EVTID_TASK_START_EXEC, so we have been in IDLE context + # the 1st context switching event after trace start is SYSVIEW_EVTID_TASK_START_EXEC, + # so we have been in IDLE context self.prev_ctx[event.core_id] = SysViewEventContext(None, False, 'IDLE%d' % event.core_id) # only one task at a time in context stack (can be interrupted by a bunch of ISRs) - self.ctx_stack[event.core_id] = [SysViewEventContext(event.params['tid'].value, False, trace.tasks_info[event.params['tid'].value])] + self.ctx_stack[event.core_id] = [ + SysViewEventContext(event.params['tid'].value, False, trace.tasks_info[event.params['tid'].value]) + ] elif event.id == SYSVIEW_EVTID_TASK_STOP_EXEC: # delete task from context stack for ctx in self.ctx_stack[event.core_id]: @@ -1053,16 +1111,22 @@ class SysViewTraceDataProcessor(apptrace.TraceDataProcessor): if event.params['tid'].value not in trace.tasks_info: raise SysViewTraceParseError('Stop ready unknown task 0x%x' % event.params['tid'].value) if len(self.ctx_stack[event.core_id]): - if (not self.ctx_stack[event.core_id][-1].irq and event.params['tid'].value == self.ctx_stack[event.core_id][-1].handle): + if ( + not self.ctx_stack[event.core_id][-1].irq + and event.params['tid'].value == self.ctx_stack[event.core_id][-1].handle + ): # return to the previous context (the last in the list) self.prev_ctx[event.core_id] = self.ctx_stack[event.core_id].pop() else: - # the 1st context switching event after trace start is SYSVIEW_EVTID_TASK_STOP_READY, so we have been in task context - self.prev_ctx[event.core_id] = SysViewEventContext(event.params['tid'].value, False, trace.tasks_info[event.params['tid'].value]) + # the 1st context switching event after trace start is SYSVIEW_EVTID_TASK_STOP_READY, + # so we have been in task context + self.prev_ctx[event.core_id] = SysViewEventContext( + event.params['tid'].value, False, trace.tasks_info[event.params['tid'].value] + ) def on_new_event(self, event): """ - Processes heap events. + Processes heap events. """ if self.root_proc == self: SysViewTraceDataProcessor._process_event(self, event) @@ -1091,7 +1155,7 @@ class SysViewTraceDataProcessor(apptrace.TraceDataProcessor): def merge_and_process(self): """ - Merges events from all registered parsers, sorts them by timestamp and processes them. + Merges events from all registered parsers, sorts them by timestamp and processes them. """ all_events = [] for t in self.traces.values(): @@ -1103,27 +1167,28 @@ class SysViewTraceDataProcessor(apptrace.TraceDataProcessor): class SysViewMultiStreamTraceDataProcessor(SysViewTraceDataProcessor): """ - SystemView trace data processor supporting multiple event streams. + SystemView trace data processor supporting multiple event streams. """ + def __init__(self, traces, print_events=False, keep_all_events=False): """ - see SysViewTraceDataProcessor.__init__() + see SysViewTraceDataProcessor.__init__() """ SysViewTraceDataProcessor.__init__(self, traces, print_events=print_events, keep_all_events=keep_all_events) self.stream_procs = {} def add_stream_processor(self, stream_id, proc): """ - Assigns processor for events stream. + Assigns processor for events stream. - Parameters - ---------- - stream_id : int - stream ID. See SysViewTraceDataParser.STREAMID_xxx. - Parsers for SysViewTraceDataParser.STREAMID_SYS are ignored. - Top level parser is the default for SysViewTraceDataParser.STREAMID_SYS. - proc : SysViewTraceDataProcessor - processor object. + Parameters + ---------- + stream_id : int + stream ID. See SysViewTraceDataParser.STREAMID_xxx. + Parsers for SysViewTraceDataParser.STREAMID_SYS are ignored. + Top level parser is the default for SysViewTraceDataParser.STREAMID_SYS. + proc : SysViewTraceDataProcessor + processor object. """ if stream_id == SysViewTraceDataParser.STREAMID_SYS: return @@ -1132,25 +1197,21 @@ class SysViewMultiStreamTraceDataProcessor(SysViewTraceDataProcessor): def get_trace_stream(self, core_id, stream_id): """ - Retrieves parser for specified stream and core. + Retrieves parser for specified stream and core. - Parameters - ---------- - core_id : int - Parser's core ID. - stream_id : int - Parser's stream ID. + Parameters + ---------- + core_id : int + Parser's core ID. + stream_id : int + Parser's stream ID. - Returns - ------- - SysViewTraceDataParser - parser object for specified stream and core + Returns + ------- + SysViewTraceDataParser + parser object for specified stream and core """ - if core_id not in self.traces and 0 in self.traces and self.traces[0].esp_ext: - # for Espressif extension there is one trace for all cores - trace = self.traces[0] - else: - trace = self.traces[core_id] + trace = self.traces[core_id] if stream_id == SysViewTraceDataParser.STREAMID_SYS: return trace if isinstance(trace, SysViewMultiTraceDataParser): @@ -1159,7 +1220,7 @@ class SysViewMultiStreamTraceDataProcessor(SysViewTraceDataProcessor): def print_report(self): """ - Iterates over registered stream processors and prints their reports. + Iterates over registered stream processors and prints their reports. """ SysViewTraceDataProcessor.print_report(self) # need to sort stream procs by keys to print reports in the same order regardless of Python version @@ -1170,7 +1231,7 @@ class SysViewMultiStreamTraceDataProcessor(SysViewTraceDataProcessor): def cleanup(self): """ - Iterates over registered stream processors and cleans them up. + Iterates over registered stream processors and cleans them up. """ for stream_id in self.stream_procs: self.stream_procs[stream_id].cleanup() @@ -1178,13 +1239,13 @@ class SysViewMultiStreamTraceDataProcessor(SysViewTraceDataProcessor): def on_new_event(self, event): """ - Iterates over registered stream processors allowing them to do - the processing of event. + Iterates over registered stream processors allowing them to do + the processing of event. - Parameters - ---------- - event : SysViewEvent - Event object. + Parameters + ---------- + event : SysViewEvent + Event object. """ SysViewTraceDataProcessor.on_new_event(self, event) for stream_id in self.stream_procs: @@ -1222,11 +1283,26 @@ class SysViewTraceDataJsonEncoder(json.JSONEncoder): callers = [] for addr in obj.params['callers'].value: callers.append('0x{:x}'.format(addr)) - return {'ctx_name': obj.ctx_name, 'in_irq': obj.in_irq, 'id': obj.id, 'core_id': obj.core_id, - 'ts': obj.ts, 'addr': blk_addr, 'size': blk_size, 'callers': callers} + return { + 'ctx_name': obj.ctx_name, + 'in_irq': obj.in_irq, + 'id': obj.id, + 'core_id': obj.core_id, + 'ts': obj.ts, + 'addr': blk_addr, + 'size': blk_size, + 'callers': callers, + } if isinstance(obj, SysViewPredefinedEvent) and obj.id == SYSVIEW_EVTID_PRINT_FORMATTED: - return {'ctx_name': obj.ctx_name, 'in_irq': obj.in_irq, 'id': obj.id, 'core_id': obj.core_id, - 'ts': obj.ts, 'msg': obj.params['msg'].value, 'lvl': obj.params['lvl'].value} + return { + 'ctx_name': obj.ctx_name, + 'in_irq': obj.in_irq, + 'id': obj.id, + 'core_id': obj.core_id, + 'ts': obj.ts, + 'msg': obj.params['msg'].value, + 'lvl': obj.params['lvl'].value, + } if isinstance(obj, SysViewEvent): jobj = obj.to_jsonable() # remove unused fields @@ -1241,44 +1317,56 @@ class SysViewTraceDataJsonEncoder(json.JSONEncoder): class SysViewHeapTraceDataParser(SysViewTraceDataExtEventParser): """ - SystemView trace data parser supporting heap events. + SystemView trace data parser supporting heap events. """ + def __init__(self, print_events=False, core_id=0): """ - SystemView trace data parser supporting multiple event streams. - see SysViewTraceDataExtEventParser.__init__() + SystemView trace data parser supporting multiple event streams. + see SysViewTraceDataExtEventParser.__init__() """ - SysViewTraceDataExtEventParser.__init__(self, events_num=len(SysViewHeapEvent.events_fmt.keys()), core_id=core_id, print_events=print_events) + SysViewTraceDataExtEventParser.__init__( + self, events_num=len(SysViewHeapEvent.events_fmt.keys()), core_id=core_id, print_events=print_events + ) def read_extension_event(self, evt_id, core_id, reader): """ - Reads heap event. - see SysViewTraceDataParser.read_extension_event() + Reads heap event. + see SysViewTraceDataParser.read_extension_event() """ - if (self.events_off >= SYSVIEW_MODULE_EVENT_OFFSET and evt_id >= self.events_off and - evt_id < self.events_off + self.events_num): + if ( + self.events_off >= SYSVIEW_MODULE_EVENT_OFFSET + and evt_id >= self.events_off + and evt_id < self.events_off + self.events_num + ): return SysViewHeapEvent(evt_id, core_id, self.events_off, reader) return SysViewTraceDataParser.read_extension_event(self, evt_id, core_id, reader) def on_new_event(self, event): """ - Keeps track of heap module descriptions. + Keeps track of heap module descriptions. """ if self.root_proc == self: SysViewTraceDataParser.on_new_event(self, event) - if event.id == SYSVIEW_EVTID_MODULEDESC and event.params['desc'].value == 'M=ESP32 SystemView Heap Tracing Module': + if ( + event.id == SYSVIEW_EVTID_MODULEDESC + and event.params['desc'].value == 'M=ESP32 SystemView Heap Tracing Module' + ): self.events_off = event.params['evt_off'].value class SysViewHeapTraceDataProcessor(SysViewTraceDataProcessor, apptrace.BaseHeapTraceDataProcessorImpl): """ - SystemView trace data processor supporting heap events. + SystemView trace data processor supporting heap events. """ - def __init__(self, toolchain_pref, elf_path, root_proc=None, traces=[], print_events=False, print_heap_events=False): + + def __init__( + self, toolchain_pref, elf_path, root_proc=None, traces=[], print_events=False, print_heap_events=False + ): """ - Constructor. - see SysViewTraceDataProcessor.__init__() - see apptrace.BaseHeapTraceDataProcessorImpl.__init__() + Constructor. + see SysViewTraceDataProcessor.__init__() + see apptrace.BaseHeapTraceDataProcessorImpl.__init__() """ SysViewTraceDataProcessor.__init__(self, traces, root_proc=root_proc, print_events=print_events) apptrace.BaseHeapTraceDataProcessorImpl.__init__(self, print_heap_events) @@ -1296,16 +1384,14 @@ class SysViewHeapTraceDataProcessor(SysViewTraceDataProcessor, apptrace.BaseHeap def handle_event(self, event): heap_stream = self.root_proc.get_trace_stream(event.core_id, SysViewTraceDataParser.STREAMID_HEAP) if (event.id - heap_stream.events_off) == 0: - heap_event = apptrace.HeapTraceEvent(event, True, toolchain=self.toolchain, - elf_path=self.elf_path) + heap_event = apptrace.HeapTraceEvent(event, True, toolchain=self.toolchain, elf_path=self.elf_path) else: - heap_event = apptrace.HeapTraceEvent(event, False, toolchain=self.toolchain, - elf_path=self.elf_path) + heap_event = apptrace.HeapTraceEvent(event, False, toolchain=self.toolchain, elf_path=self.elf_path) apptrace.BaseHeapTraceDataProcessorImpl.on_new_event(self, heap_event) def print_report(self): """ - see apptrace.TraceDataProcessor.print_report() + see apptrace.TraceDataProcessor.print_report() """ if self.root_proc == self: SysViewTraceDataProcessor.print_report(self) @@ -1314,42 +1400,44 @@ class SysViewHeapTraceDataProcessor(SysViewTraceDataProcessor, apptrace.BaseHeap class SysViewLogTraceEvent(apptrace.LogTraceEvent): """ - SystemView log event. + SystemView log event. """ + def __init__(self, ts, msg): """ - Constructor. + Constructor. - Parameters - ---------- - msg : string - Log message string. + Parameters + ---------- + msg : string + Log message string. """ self.msg = msg self.ts = ts def get_message(self, unused): """ - Retrieves log message. + Retrieves log message. - Returns - ------- - string - formatted log message + Returns + ------- + string + formatted log message """ return '[{:.9f}] LOG: {}'.format(self.ts, self.msg) class SysViewLogTraceDataParser(SysViewTraceDataParser): """ - SystemView trace data parser supporting log events. + SystemView trace data parser supporting log events. """ + def event_supported(self, event): return event.id == SYSVIEW_EVTID_PRINT_FORMATTED def on_new_event(self, event): """ - see SysViewTraceDataParser.on_new_event() + see SysViewTraceDataParser.on_new_event() """ if self.root_proc == self: SysViewTraceDataParser.on_new_event(self, event) @@ -1357,13 +1445,14 @@ class SysViewLogTraceDataParser(SysViewTraceDataParser): class SysViewLogTraceDataProcessor(SysViewTraceDataProcessor, apptrace.BaseLogTraceDataProcessorImpl): """ - SystemView trace data processor supporting heap events. + SystemView trace data processor supporting heap events. """ + def __init__(self, traces=[], root_proc=None, print_events=False, print_log_events=False): """ - Constructor. - see SysViewTraceDataProcessor.__init__() - see apptrace.BaseLogTraceDataProcessorImpl.__init__() + Constructor. + see SysViewTraceDataProcessor.__init__() + see apptrace.BaseLogTraceDataProcessorImpl.__init__() """ SysViewTraceDataProcessor.__init__(self, traces, root_proc=root_proc, print_events=print_events) apptrace.BaseLogTraceDataProcessorImpl.__init__(self, print_log_events) @@ -1375,7 +1464,7 @@ class SysViewLogTraceDataProcessor(SysViewTraceDataProcessor, apptrace.BaseLogTr def on_new_event(self, event): """ - Processes log events. + Processes log events. """ if self.root_proc == self: SysViewTraceDataProcessor.on_new_event(self, event) @@ -1385,7 +1474,7 @@ class SysViewLogTraceDataProcessor(SysViewTraceDataProcessor, apptrace.BaseLogTr def print_report(self): """ - see apptrace.TraceDataProcessor.print_report() + see apptrace.TraceDataProcessor.print_report() """ if self.root_proc == self: SysViewTraceDataProcessor.print_report(self) diff --git a/tools/esp_app_trace/sysviewtrace_proc.py b/tools/esp_app_trace/sysviewtrace_proc.py index 474438b5d32..7a03653f87c 100755 --- a/tools/esp_app_trace/sysviewtrace_proc.py +++ b/tools/esp_app_trace/sysviewtrace_proc.py @@ -7,7 +7,6 @@ # Trace data can be provided in multiple trace files (one per CPU). After processing phase # script prints report for every type of trace data stream which was found. # - import argparse import json import logging @@ -50,16 +49,13 @@ def split_segger_multicore_file(file_path): header = f.read(200) header_str = header.decode('utf-8', errors='ignore') - core0_offset = None core1_offset = None for line in header_str.split('\n'): - if '; Offset Core0' in line: - core0_offset = int(line.strip().split()[-1]) - elif '; Offset Core1' in line: + if '; Offset Core1' in line: core1_offset = int(line.strip().split()[-1]) - if core0_offset is None or core1_offset is None: - logging.error('Failed to parse core offsets') + if core1_offset is None: + logging.error('Failed to parse core1 offset') return None, None # Read the entire file @@ -258,12 +254,11 @@ def main(): proc.print_report() proc.cleanup() - if len(temp_files) > 0: - for file in temp_files: - try: - os.remove(file) - except Exception as e: - logging.warning('Failed to remove temporary file %s: %s', file, e) + for file in temp_files: + try: + os.remove(file) + except Exception as e: + logging.warning('Failed to remove temporary file %s: %s', file, e) if __name__ == '__main__': From 89fa1559d9d81a86ff058a658e3be0470295bd67 Mon Sep 17 00:00:00 2001 From: Ashish Sharma Date: Fri, 23 May 2025 11:43:29 +0800 Subject: [PATCH 182/213] feat(mbedtls): adds support for RSA decryption with DS peripheral --- components/esp-tls/esp_tls_mbedtls.c | 36 ++- components/mbedtls/CMakeLists.txt | 8 +- .../mbedtls/port/esp_ds/esp_ds_common.c | 226 ++++++++++++++ .../mbedtls/port/esp_ds/esp_ds_common.h | 62 ++++ .../mbedtls/port/esp_ds/esp_rsa_dec_alt.c | 293 ++++++++++++++++++ .../mbedtls/port/esp_ds/esp_rsa_sign_alt.c | 231 +++++++++----- .../mbedtls/port/include/esp_ds/esp_ds_rsa.h | 104 +++++++ .../port/include/esp_ds/esp_rsa_sign_alt.h | 12 +- components/mbedtls/port/include/rsa_dec_alt.h | 21 ++ .../mbedtls/port/include/rsa_sign_alt.h | 15 +- .../mbedtls/test_apps/main/CMakeLists.txt | 4 +- .../test_apps/main/test_ds_sign_and_decrypt.c | 259 ++++++++++++++++ .../mbedtls/test_apps/pytest_mbedtls_ut.py | 13 + .../mbedtls/test_apps/sdkconfig.ci.ds_rsa | 1 + 14 files changed, 1185 insertions(+), 100 deletions(-) create mode 100644 components/mbedtls/port/esp_ds/esp_ds_common.c create mode 100644 components/mbedtls/port/esp_ds/esp_ds_common.h create mode 100644 components/mbedtls/port/esp_ds/esp_rsa_dec_alt.c create mode 100644 components/mbedtls/port/include/esp_ds/esp_ds_rsa.h create mode 100644 components/mbedtls/port/include/rsa_dec_alt.h create mode 100644 components/mbedtls/test_apps/main/test_ds_sign_and_decrypt.c create mode 100644 components/mbedtls/test_apps/sdkconfig.ci.ds_rsa diff --git a/components/esp-tls/esp_tls_mbedtls.c b/components/esp-tls/esp_tls_mbedtls.c index 9f240741e0f..3d3b9cacdb3 100644 --- a/components/esp-tls/esp_tls_mbedtls.c +++ b/components/esp-tls/esp_tls_mbedtls.c @@ -39,6 +39,7 @@ static esp_err_t esp_set_atecc608a_pki_context(esp_tls_t *tls, const void *pki); #endif /* CONFIG_ESP_TLS_USE_SECURE_ELEMENT */ #if defined(CONFIG_ESP_TLS_USE_DS_PERIPHERAL) +#include #include "rsa_sign_alt.h" static esp_err_t esp_mbedtls_init_pk_ctx_for_ds(const void *pki); #endif /* CONFIG_ESP_TLS_USE_DS_PERIPHERAL */ @@ -381,6 +382,28 @@ void esp_mbedtls_cleanup(esp_tls_t *tls) tls->cacert_ptr = NULL; mbedtls_x509_crt_free(&tls->cacert); mbedtls_x509_crt_free(&tls->clientcert); + +#ifdef CONFIG_ESP_TLS_USE_DS_PERIPHERAL + if (mbedtls_pk_get_type(&tls->clientkey) == MBEDTLS_PK_RSA_ALT) { + mbedtls_rsa_alt_context *rsa_alt = tls->clientkey.MBEDTLS_PRIVATE(pk_ctx); + if (rsa_alt && rsa_alt->key != NULL) { + mbedtls_rsa_free(rsa_alt->key); + mbedtls_free(rsa_alt->key); + rsa_alt->key = NULL; + } + } + + // Similar cleanup for server key + if (mbedtls_pk_get_type(&tls->serverkey) == MBEDTLS_PK_RSA_ALT) { + mbedtls_rsa_alt_context *rsa_alt = tls->serverkey.MBEDTLS_PRIVATE(pk_ctx); + if (rsa_alt && rsa_alt->key != NULL) { + mbedtls_rsa_free(rsa_alt->key); + mbedtls_free(rsa_alt->key); + rsa_alt->key = NULL; + } + } +#endif + mbedtls_pk_free(&tls->clientkey); mbedtls_entropy_free(&tls->entropy); mbedtls_ssl_config_free(&tls->conf); @@ -1127,12 +1150,18 @@ static esp_err_t esp_mbedtls_init_pk_ctx_for_ds(const void *pki) { int ret = -1; /* initialize the mbedtls pk context with rsa context */ - mbedtls_rsa_context rsakey; - mbedtls_rsa_init(&rsakey); - if ((ret = mbedtls_pk_setup_rsa_alt(((const esp_tls_pki_t*)pki)->pk_key, &rsakey, NULL, esp_ds_rsa_sign, + mbedtls_rsa_context *rsakey = calloc(1, sizeof(mbedtls_rsa_context)); + if (rsakey == NULL) { + ESP_LOGE(TAG, "Failed to allocate memory for mbedtls_rsa_context"); + return ESP_ERR_NO_MEM; + } + mbedtls_rsa_init(rsakey); + if ((ret = mbedtls_pk_setup_rsa_alt(((const esp_tls_pki_t*)pki)->pk_key, rsakey, NULL, esp_ds_rsa_sign, esp_ds_get_keylen )) != 0) { ESP_LOGE(TAG, "Error in mbedtls_pk_setup_rsa_alt, returned -0x%04X", -ret); mbedtls_print_error_msg(ret); + mbedtls_rsa_free(rsakey); + free(rsakey); ret = ESP_FAIL; goto exit; } @@ -1143,7 +1172,6 @@ static esp_err_t esp_mbedtls_init_pk_ctx_for_ds(const void *pki) } ESP_LOGD(TAG, "DS peripheral params initialized."); exit: - mbedtls_rsa_free(&rsakey); return ret; } #endif /* CONFIG_ESP_TLS_USE_DS_PERIPHERAL */ diff --git a/components/mbedtls/CMakeLists.txt b/components/mbedtls/CMakeLists.txt index d3f4fe40a7d..7174837f052 100644 --- a/components/mbedtls/CMakeLists.txt +++ b/components/mbedtls/CMakeLists.txt @@ -247,9 +247,11 @@ if(CONFIG_SOC_SHA_SUPPORTED) ) endif() -# CONFIG_ESP_TLS_USE_DS_PERIPHERAL can be enabled only for the supported targets. -if(CONFIG_ESP_TLS_USE_DS_PERIPHERAL) - target_sources(mbedcrypto PRIVATE "${COMPONENT_DIR}/port/esp_ds/esp_rsa_sign_alt.c") +if(CONFIG_SOC_DIG_SIGN_SUPPORTED) +target_sources(mbedcrypto PRIVATE + "${COMPONENT_DIR}/port/esp_ds/esp_rsa_sign_alt.c" + "${COMPONENT_DIR}/port/esp_ds/esp_rsa_dec_alt.c" + "${COMPONENT_DIR}/port/esp_ds/esp_ds_common.c") endif() # Note: some mbedTLS hardware acceleration can be enabled/disabled by config. diff --git a/components/mbedtls/port/esp_ds/esp_ds_common.c b/components/mbedtls/port/esp_ds/esp_ds_common.c new file mode 100644 index 00000000000..7cef54b389e --- /dev/null +++ b/components/mbedtls/port/esp_ds/esp_ds_common.c @@ -0,0 +1,226 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "sdkconfig.h" +#include "esp_ds.h" +#include "esp_log.h" +#include "esp_ds_common.h" +#include "esp_memory_utils.h" +#include "esp_ds/esp_ds_rsa.h" +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" +#include "mbedtls/rsa.h" +#include + +#ifdef SOC_DIG_SIGN_SUPPORTED +#include "rom/digital_signature.h" +#else +#error "Selected target does not support DS peripheral" +#endif + +#define FACTOR_KEYLEN_IN_BYTES 4 + +static const char *TAG = "ESP_DS_COMMON"; + +static hmac_key_id_t s_esp_ds_hmac_key_id = -1; +static esp_ds_data_t *s_ds_data = NULL; +static SemaphoreHandle_t s_ds_lock = NULL; +static int s_timeout_ms = 0; + +esp_ds_data_t *esp_ds_get_data_ctx(void) +{ + return s_ds_data; +} + +hmac_key_id_t esp_ds_get_hmac_key_id(void) +{ + return s_esp_ds_hmac_key_id; +} + +size_t esp_ds_get_keylen(void *ctx) +{ + if (s_ds_data == NULL) { + ESP_LOGE(TAG, "s_ds_data is NULL, cannot get key length"); + return 0; + } + /* calculating the rsa_length in bytes */ + return ((s_ds_data->rsa_length + 1) * FACTOR_KEYLEN_IN_BYTES); +} + +/* Lock for the DS session, other TLS connections trying to use the DS peripheral will be blocked + * till this DS session is completed (i.e. TLS handshake for this connection is completed) */ +static void __attribute__((constructor)) esp_ds_conn_lock(void) +{ + if ((s_ds_lock = xSemaphoreCreateMutex()) == NULL) { + ESP_EARLY_LOGE(TAG, "mutex for the DS session lock could not be created"); + } +} + +void esp_ds_release_ds_lock(void) +{ + if (s_ds_lock == NULL) { + ESP_LOGE(TAG, "s_ds_lock is NULL, cannot release lock"); + return; + } + if (xSemaphoreGetMutexHolder(s_ds_lock) == xTaskGetCurrentTaskHandle()) { + /* Give back the semaphore (DS lock) */ + xSemaphoreGive(s_ds_lock); + } +} + +void esp_ds_set_session_timeout(int timeout) +{ + /* add additional offset of 1000 ms to have enough time for deleting the TLS connection and free the previous ds context after exceeding timeout value (this offset also helps when timeout is set to 0) */ + if (timeout > s_timeout_ms) { + s_timeout_ms = timeout + 1000; + } +} + +esp_err_t esp_ds_init_data_ctx(esp_ds_data_ctx_t *ds_data) +{ + if (ds_data == NULL || ds_data->esp_ds_data == NULL) { + return ESP_ERR_INVALID_ARG; + } + /* mutex is given back when the DS context is freed after the TLS handshake is completed or in case of failure (at cleanup) */ + if ((xSemaphoreTake(s_ds_lock, s_timeout_ms / portTICK_PERIOD_MS) != pdTRUE)) { + ESP_LOGE(TAG, "ds_lock could not be obtained in specified time"); + return ESP_FAIL; + } + s_ds_data = ds_data->esp_ds_data; + ESP_LOGD(TAG, "Using DS with key block %u, RSA length %u", ds_data->efuse_key_id, ds_data->rsa_length_bits); + s_esp_ds_hmac_key_id = (hmac_key_id_t) ds_data->efuse_key_id; + + const unsigned rsa_length_int = (ds_data->rsa_length_bits / 32) - 1; + if (esp_ptr_byte_accessible(s_ds_data)) { + /* calculate the rsa_length in terms of esp_digital_signature_length_t which is required for the internal DS API */ + s_ds_data->rsa_length = rsa_length_int; + } else if (s_ds_data->rsa_length != rsa_length_int) { + /* + * Configuration data is most likely from DROM segment and it + * is not properly formatted for all parameters consideration. + * Moreover, we can not modify as it is read-only and hence + * the error. + */ + ESP_LOGE(TAG, "RSA length mismatch %u, %u", s_ds_data->rsa_length, rsa_length_int); + return ESP_ERR_INVALID_ARG; + } + + return ESP_OK; +} + +esp_err_t esp_ds_deinit_data_ctx(void) +{ + esp_ds_release_ds_lock(); + s_ds_data = NULL; + s_esp_ds_hmac_key_id = -1; + + return ESP_OK; +} + +int esp_ds_mgf_mask(unsigned char *dst, size_t dlen, unsigned char *src, + size_t slen, mbedtls_md_type_t md_alg) +{ + unsigned char counter[4]; + unsigned char *p; + unsigned int hlen; + size_t i, use_len; + unsigned char mask[MBEDTLS_MD_MAX_SIZE]; + int ret = 0; + const mbedtls_md_info_t *md_info; + mbedtls_md_context_t md_ctx; + + mbedtls_md_init(&md_ctx); + md_info = mbedtls_md_info_from_type(md_alg); + if (md_info == NULL) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + if ((ret = mbedtls_md_setup(&md_ctx, md_info, 0)) != 0) { + goto exit; + } + + hlen = mbedtls_md_get_size(md_info); + + memset(mask, 0, sizeof(mask)); + memset(counter, 0, 4); + + /* Generate and apply dbMask */ + p = dst; + + while (dlen > 0) { + use_len = hlen; + if (dlen < hlen) { + use_len = dlen; + } + + if ((ret = mbedtls_md_starts(&md_ctx)) != 0) { + goto exit; + } + if ((ret = mbedtls_md_update(&md_ctx, src, slen)) != 0) { + goto exit; + } + if ((ret = mbedtls_md_update(&md_ctx, counter, 4)) != 0) { + goto exit; + } + if ((ret = mbedtls_md_finish(&md_ctx, mask)) != 0) { + goto exit; + } + + for (i = 0; i < use_len; ++i) { + *p++ ^= mask[i]; + } + + counter[3]++; + + dlen -= use_len; + } + +exit: + mbedtls_platform_zeroize(mask, sizeof(mask)); + mbedtls_md_free(&md_ctx); + + return ret; +} + +int esp_ds_hash_mprime(const unsigned char *hash, size_t hlen, + const unsigned char *salt, size_t slen, + unsigned char *out, mbedtls_md_type_t md_alg) +{ + const unsigned char zeros[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + + mbedtls_md_context_t md_ctx; + int ret = MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + + const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_alg); + if (md_info == NULL) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + mbedtls_md_init(&md_ctx); + if ((ret = mbedtls_md_setup(&md_ctx, md_info, 0)) != 0) { + goto exit; + } + if ((ret = mbedtls_md_starts(&md_ctx)) != 0) { + goto exit; + } + if ((ret = mbedtls_md_update(&md_ctx, zeros, sizeof(zeros))) != 0) { + goto exit; + } + if ((ret = mbedtls_md_update(&md_ctx, hash, hlen)) != 0) { + goto exit; + } + if ((ret = mbedtls_md_update(&md_ctx, salt, slen)) != 0) { + goto exit; + } + if ((ret = mbedtls_md_finish(&md_ctx, out)) != 0) { + goto exit; + } + +exit: + mbedtls_md_free(&md_ctx); + + return ret; +} diff --git a/components/mbedtls/port/esp_ds/esp_ds_common.h b/components/mbedtls/port/esp_ds/esp_ds_common.h new file mode 100644 index 00000000000..b80f702a5d1 --- /dev/null +++ b/components/mbedtls/port/esp_ds/esp_ds_common.h @@ -0,0 +1,62 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mbedtls/md.h" + +#define FACTOR_KEYLEN_IN_BYTES 4 +#define SWAP_INT32(x) (((x) >> 24) | (((x) & 0x00FF0000) >> 8) | (((x) & 0x0000FF00) << 8) | ((x) << 24)) + +/** + * @brief Get the data context for the digital signature. + * + * @return esp_ds_data_t* esp ds data context pointer. + */ +esp_ds_data_t *esp_ds_get_data_ctx(void); + +/** + * @brief Get the HMAC key ID used for digital signature operations. + * + * @return hmac_key_id_t HMAC key ID. + */ +hmac_key_id_t esp_ds_get_hmac_key_id(void); + +/** + * @brief Mask generation function (MGF) for TLS 1.3. + * + * @param[in] dst Pointer to the destination buffer. + * @param[in] dlen Length of the destination buffer. + * @param[in] src Pointer to the source buffer. + * @param[in] slen Length of the salt value. + * @param[in] md_alg The message digest algorithm type. + * @return int Returns 0 on success, or a negative error code on failure. + */ +int esp_ds_mgf_mask(unsigned char *dst, size_t dlen, unsigned char *src, + size_t slen, mbedtls_md_type_t md_alg); + +/** + * @brief Generates a hash using the M-Prime algorithm as specified in RFC 8446. + * + * @param hash Pointer to the input hash. + * @param hlen Length of the input hash. + * @param salt Pointer to the salt value. + * @param slen Length of the salt value. + * @param out Pointer to the output buffer where the hash will be stored. + * @param md_alg The message digest algorithm type to use for hashing. + * @return int Returns 0 on success, or a negative error code on failure. + */ +int esp_ds_hash_mprime(const unsigned char *hash, size_t hlen, + const unsigned char *salt, size_t slen, + unsigned char *out, mbedtls_md_type_t md_alg); + +#ifdef __cplusplus +} +#endif diff --git a/components/mbedtls/port/esp_ds/esp_rsa_dec_alt.c b/components/mbedtls/port/esp_ds/esp_rsa_dec_alt.c new file mode 100644 index 00000000000..b415285c1cd --- /dev/null +++ b/components/mbedtls/port/esp_ds/esp_rsa_dec_alt.c @@ -0,0 +1,293 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + + +#include +#include "sdkconfig.h" +#include "esp_ds.h" +#include "rsa_dec_alt.h" +#include "mbedtls/rsa.h" +#include "esp_ds_common.h" +#include "esp_log.h" + +static const char *TAG = "ESP_RSA_DEC_ALT"; + +#define MIN_V15_PADDING_LEN 11 + +static int esp_ds_rsaes_pkcs1_v15_unpadding(unsigned char *input, + size_t ilen, + unsigned char *output, + size_t output_max_len, + size_t *olen) +{ + if (ilen < MIN_V15_PADDING_LEN) { + return MBEDTLS_ERR_RSA_INVALID_PADDING; + } + + unsigned char bad = 0; + size_t msg_len = 0; + size_t msg_max_len = 0; + unsigned char pad_done = 0; + size_t pad_count = 0; + + msg_max_len = (output_max_len > ilen - MIN_V15_PADDING_LEN) ? ilen - MIN_V15_PADDING_LEN : output_max_len; + + /* Check the first byte (0x00) */ + bad |= input[0]; + + /* Check the padding type */ + bad |= input[1] ^ MBEDTLS_RSA_CRYPT; + + /* Scan for separator (0x00) and count padding bytes in constant time */ + for (size_t i = 2; i < ilen; i++) { + unsigned char found = (input[i] == 0x00); + pad_done = pad_done | found; + pad_count += (pad_done == 0) ? 1 : 0; + } + + /* Check if we found a separator and padding is long enough */ + bad |= (pad_done == 0); /* No separator found */ + bad |= (pad_count < 8); /* Padding too short (need at least 8 non-zero bytes) */ + + /* Calculate message length */ + msg_len = ilen - pad_count - 3; + + /* Check if separator is not at the very end */ + bad |= (msg_len > output_max_len); + if (bad) { + msg_len = msg_max_len; + } + + /* Verify padding bytes are non-zero in constant time */ + for (size_t i = 2; i < ilen; i++) { + unsigned char in_padding = (i < pad_count + 2); + unsigned char is_zero = (input[i] == 0x00); + bad |= in_padding & is_zero; + } + + if (bad) { + return MBEDTLS_ERR_RSA_INVALID_PADDING; + } + + *olen = msg_len; + if (*olen > 0) { + memcpy(output, input + ilen - msg_len, msg_len); + } + return 0; +} + +static int esp_ds_compute_hash(mbedtls_md_type_t md_alg, + const unsigned char *input, size_t ilen, + unsigned char *output) +{ + const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_alg); + if (md_info == NULL) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + return mbedtls_md(md_info, input, ilen, output); +} + +static int esp_ds_rsaes_pkcs1_v21_unpadding(unsigned char *input, + size_t ilen, + unsigned char *output, + size_t output_max_len, + size_t *olen) +{ + int ret; + unsigned int hlen = mbedtls_md_get_size_from_type(MBEDTLS_MD_SHA256); + unsigned char bad = 0; + size_t pad_len = 0; + size_t msg_len = 0; + + /* Validate input length */ + bad |= (ilen < 2 * hlen + 2); + + /* Apply MGF masks */ + ret = esp_ds_mgf_mask(input + 1, hlen, input + hlen + 1, ilen - hlen - 1, MBEDTLS_MD_SHA256); + if (ret != 0) { + ESP_LOGE(TAG, "Error in MGF mask, returned %d", ret); + return ret; + } + + ret = esp_ds_mgf_mask(input + hlen + 1, ilen - hlen - 1, input + 1, hlen, MBEDTLS_MD_SHA256); + if (ret != 0) { + ESP_LOGE(TAG, "Error in MGF mask, returned %d", ret); + return ret; + } + + /* Check first byte (should be 0x00) */ + bad |= input[0]; + + /* Skip the first byte and maskSeed */ + unsigned char *db = input + 1 + hlen; + size_t db_len = ilen - hlen - 1; + + /* Compute hash, label is NULL and label_len is 0 */ + unsigned char lhash[MBEDTLS_MD_MAX_SIZE]; + ret = esp_ds_compute_hash(MBEDTLS_MD_SHA256, NULL, 0, lhash); + if (ret != 0) { + ESP_LOGE(TAG, "Error in compute_hash, returned %d", ret); + return ret; + } + + /* Verify hash portion of db against lhash */ + for (size_t i = 0; i < hlen && i < db_len; i++) { + bad |= db[i] ^ lhash[i]; + } + + /* Skip past lhash in DB */ + unsigned char *p = db + hlen; + size_t remaining = db_len - hlen; + + /* Get zero-padding len, following mbedTLS pattern + * Always read till end of buffer (minus one, for the 01 byte) */ + unsigned char in_padding = 1; + for (size_t i = 0; i < remaining - 1; i++) { + unsigned char is_zero = (p[i] == 0); + in_padding = in_padding & is_zero; + pad_len += in_padding; + } + + p += pad_len; + bad |= (*p != 0x01); + p++; + + /* Calculate message length */ + msg_len = remaining - pad_len - 1; + + /* Check output buffer size */ + bad |= (output_max_len < msg_len); + + if (bad) { + return MBEDTLS_ERR_RSA_INVALID_PADDING; + } + + /* Copy message in constant time */ + *olen = msg_len; + if (*olen > 0) { + memcpy(output, p, msg_len); + } + + return 0; +} + +int esp_ds_rsa_decrypt(void *ctx, size_t *olen, + const unsigned char *input, unsigned char *output, + size_t output_max_len) +{ + int padding = MBEDTLS_RSA_PKCS_V15; + + if (ctx != NULL) { + mbedtls_rsa_context *rsa_ctx = (mbedtls_rsa_context *)ctx; + if (rsa_ctx->MBEDTLS_PRIVATE(padding) == MBEDTLS_RSA_PKCS_V15) { + padding = MBEDTLS_RSA_PKCS_V15; + } else if (rsa_ctx->MBEDTLS_PRIVATE(padding) == MBEDTLS_RSA_PKCS_V21) { + padding = MBEDTLS_RSA_PKCS_V21; + } else { + ESP_LOGE(TAG, "Unsupported padding type %d", rsa_ctx->MBEDTLS_PRIVATE(padding)); + return -1; + } + } + + size_t ilen = esp_ds_get_keylen(ctx); + if (ilen == 0) { + ESP_LOGE(TAG, "Invalid RSA key length"); + return -1; + } + size_t data_len = ilen / 4; + + uint32_t *output_tmp = NULL; + + uint32_t *input_tmp = calloc(data_len, sizeof(uint32_t)); + if (input_tmp == NULL) { + ESP_LOGE(TAG, "Could not allocate memory for internal DS operations"); + return -1; + } + + for (unsigned int i = 0; i < (data_len); i++) { + input_tmp[i] = SWAP_INT32(((uint32_t *)input)[(data_len) - (i + 1)]); + } + + esp_ds_data_t *s_ds_data = esp_ds_get_data_ctx(); + if (s_ds_data == NULL) { + ESP_LOGE(TAG, "s_ds_data is NULL, cannot perform decryption"); + free(input_tmp); + return -1; + } + hmac_key_id_t s_esp_ds_hmac_key_id = esp_ds_get_hmac_key_id(); + + esp_ds_context_t *esp_ds_ctx = NULL; + esp_err_t ds_r = esp_ds_start_sign((const void *)input_tmp, + s_ds_data, + s_esp_ds_hmac_key_id, + &esp_ds_ctx); + + if (ds_r != ESP_OK) { + ESP_LOGE(TAG, "Error in esp_ds_start_sign, returned %d ", ds_r); + goto exit; + } + + ds_r = esp_ds_finish_sign((void *)input_tmp, esp_ds_ctx); + if (ds_r != ESP_OK) { + if (ds_r == ESP_ERR_HW_CRYPTO_DS_INVALID_DIGEST) { + ESP_LOGE(TAG, "Invalid digest in DS data reported by esp_ds_finish_sign"); + } else { + ESP_LOGE(TAG, "Error in esp_ds_finish_sign, returned %d ", ds_r); + } + goto exit; + } + + esp_ds_release_ds_lock(); + + output_tmp = calloc(data_len, sizeof(uint32_t)); + if (output_tmp == NULL) { + ESP_LOGE(TAG, "Could not allocate memory for output_tmp"); + goto exit; + } + + for (unsigned int i = 0; i < (data_len); i++) { + ((uint32_t *)output_tmp)[i] = SWAP_INT32(((uint32_t *)input_tmp)[(data_len) - (i + 1)]); + } + + // Unpad the decrypted data + if (padding == MBEDTLS_RSA_PKCS_V15) { + if (esp_ds_rsaes_pkcs1_v15_unpadding((uint8_t *)output_tmp, ilen, (uint8_t *)output_tmp, ilen, olen) != 0) { + ESP_LOGE(TAG, "Error in v15 unpadding"); + goto exit; + } + } else if (padding == MBEDTLS_RSA_PKCS_V21) { + if (esp_ds_rsaes_pkcs1_v21_unpadding((uint8_t *)output_tmp, ilen, (uint8_t *)output_tmp, ilen, olen) != 0) { + ESP_LOGE(TAG, "Error in v21 unpadding"); + goto exit; + } + } else { + ESP_LOGE(TAG, "Unsupported padding type %d", padding); + goto exit; + } + + // Copy the decrypted data to output buffer + if (output_max_len < *olen) { + ESP_LOGE(TAG, "Output buffer is too small, output_max_len: %zu, olen: %zu", output_max_len, *olen); + goto exit; + } + + memcpy(output, output_tmp, *olen); + free(output_tmp); + free(input_tmp); + return 0; +exit: + esp_ds_release_ds_lock(); + if (input_tmp) { + free(input_tmp); + } + if (output_tmp) { + free(output_tmp); + } + if (olen) { + *olen = 0; // Set olen to 0 in case of error + } + return -1; +} diff --git a/components/mbedtls/port/esp_ds/esp_rsa_sign_alt.c b/components/mbedtls/port/esp_ds/esp_rsa_sign_alt.c index 6b9f8e36b6a..635dfdc0d15 100644 --- a/components/mbedtls/port/esp_ds/esp_rsa_sign_alt.c +++ b/components/mbedtls/port/esp_ds/esp_rsa_sign_alt.c @@ -7,6 +7,7 @@ #include "esp_ds.h" #include "rsa_sign_alt.h" #include "esp_memory_utils.h" +#include "sdkconfig.h" #ifdef CONFIG_IDF_TARGET_ESP32S2 #include "esp32s2/rom/digital_signature.h" @@ -30,85 +31,14 @@ #include "esp_heap_caps.h" #include "freertos/FreeRTOS.h" #include "freertos/semphr.h" -#include -static const char *TAG = "ESP_RSA_SIGN_ALT"; -#define SWAP_INT32(x) (((x) >> 24) | (((x) & 0x00FF0000) >> 8) | (((x) & 0x0000FF00) << 8) | ((x) << 24)) - +#include "mbedtls/build_info.h" #include "mbedtls/rsa.h" #include "mbedtls/oid.h" #include "mbedtls/platform_util.h" +#include "esp_ds_common.h" #include -static hmac_key_id_t s_esp_ds_hmac_key_id; -static esp_ds_data_t *s_ds_data; -static SemaphoreHandle_t s_ds_lock; -static int s_timeout_ms = 0; - -/* key length in bytes = (esp_digital_signature_length_t key + 1 ) * FACTOR_KEYLEN_IN_BYTES */ -#define FACTOR_KEYLEN_IN_BYTES 4 - -/* Lock for the DS session, other TLS connections trying to use the DS peripheral will be blocked - * till this DS session is completed (i.e. TLS handshake for this connection is completed) */ -static void __attribute__((constructor)) esp_ds_conn_lock (void) -{ - if ((s_ds_lock = xSemaphoreCreateMutex()) == NULL) { - ESP_EARLY_LOGE(TAG, "mutex for the DS session lock could not be created"); - } -} - -void esp_ds_set_session_timeout(int timeout) -{ - /* add additional offset of 1000 ms to have enough time for deleting the TLS connection and free the previous ds context after exceeding timeout value (this offset also helps when timeout is set to 0) */ - if (timeout > s_timeout_ms) { - s_timeout_ms = timeout + 1000; - } -} - -esp_err_t esp_ds_init_data_ctx(esp_ds_data_ctx_t *ds_data) -{ - if (ds_data == NULL || ds_data->esp_ds_data == NULL) { - return ESP_ERR_INVALID_ARG; - } - /* mutex is given back when the DS context is freed after the TLS handshake is completed or in case of failure (at cleanup) */ - if ((xSemaphoreTake(s_ds_lock, s_timeout_ms / portTICK_PERIOD_MS) != pdTRUE)) { - ESP_LOGE(TAG, "ds_lock could not be obtained in specified time"); - return ESP_FAIL; - } - s_ds_data = ds_data->esp_ds_data; - ESP_LOGD(TAG, "Using DS with key block %u, RSA length %u", ds_data->efuse_key_id, ds_data->rsa_length_bits); - s_esp_ds_hmac_key_id = (hmac_key_id_t) ds_data->efuse_key_id; - - const unsigned rsa_length_int = (ds_data->rsa_length_bits / 32) - 1; - if (esp_ptr_byte_accessible(s_ds_data)) { - /* calculate the rsa_length in terms of esp_digital_signature_length_t which is required for the internal DS API */ - s_ds_data->rsa_length = rsa_length_int; - } else if (s_ds_data->rsa_length != rsa_length_int) { - /* - * Configuration data is most likely from DROM segment and it - * is not properly formatted for all parameters consideration. - * Moreover, we can not modify as it is read-only and hence - * the error. - */ - ESP_LOGE(TAG, "RSA length mismatch %u, %u", s_ds_data->rsa_length, rsa_length_int); - return ESP_ERR_INVALID_ARG; - } - - return ESP_OK; -} - -void esp_ds_release_ds_lock(void) -{ - if (xSemaphoreGetMutexHolder(s_ds_lock) == xTaskGetCurrentTaskHandle()) { - /* Give back the semaphore (DS lock) */ - xSemaphoreGive(s_ds_lock); - } -} - -size_t esp_ds_get_keylen(void *ctx) -{ - /* calculating the rsa_length in bytes */ - return ((s_ds_data->rsa_length + 1) * FACTOR_KEYLEN_IN_BYTES); -} +static const char *TAG = "ESP_RSA_SIGN_ALT"; static int rsa_rsassa_pkcs1_v15_encode( mbedtls_md_type_t md_alg, unsigned int hashlen, @@ -223,6 +153,120 @@ static int rsa_rsassa_pkcs1_v15_encode( mbedtls_md_type_t md_alg, return ( 0 ); } +#ifdef CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 +static int rsa_rsassa_pss_pkcs1_v21_encode( int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + int saltlen, + unsigned char *sig, size_t dst_len) +{ + size_t olen; + unsigned char *p = sig; + unsigned char *salt = NULL; + size_t slen, min_slen, hlen, offset = 0; + int ret = MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + size_t msb; + + if ((md_alg != MBEDTLS_MD_NONE || hashlen != 0) && hash == NULL) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + if (f_rng == NULL) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + olen = dst_len; + + if (md_alg != MBEDTLS_MD_NONE) { + /* Gather length of hash to sign */ + size_t exp_hashlen = mbedtls_md_get_size_from_type(md_alg); + if (exp_hashlen == 0) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + if (hashlen != exp_hashlen) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + } + + hlen = mbedtls_md_get_size_from_type(md_alg); + if (hlen == 0) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + if (saltlen == MBEDTLS_RSA_SALT_LEN_ANY) { + /* Calculate the largest possible salt length, up to the hash size. + * Normally this is the hash length, which is the maximum salt length + * according to FIPS 185-4 �5.5 (e) and common practice. If there is not + * enough room, use the maximum salt length that fits. The constraint is + * that the hash length plus the salt length plus 2 bytes must be at most + * the key length. This complies with FIPS 186-4 �5.5 (e) and RFC 8017 + * (PKCS#1 v2.2) �9.1.1 step 3. */ + min_slen = hlen - 2; + if (olen < hlen + min_slen + 2) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } else if (olen >= hlen + hlen + 2) { + slen = hlen; + } else { + slen = olen - hlen - 2; + } + } else if ((saltlen < 0) || (saltlen + hlen + 2 > olen)) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } else { + slen = (size_t) saltlen; + } + + memset(sig, 0, olen); + + /* Note: EMSA-PSS encoding is over the length of N - 1 bits */ + msb = dst_len * 8 - 1; + p += olen - hlen - slen - 2; + *p++ = 0x01; + + + /* Generate salt of length slen in place in the encoded message */ + salt = p; + if ((ret = f_rng(p_rng, salt, slen)) != 0) { + return MBEDTLS_ERR_RSA_RNG_FAILED; + } + p += slen; + + /* Generate H = Hash( M' ) */ + ret = esp_ds_hash_mprime(hash, hashlen, salt, slen, p, md_alg); + if (ret != 0) { + return ret; + } + + /* Compensate for boundary condition when applying mask */ + if (msb % 8 == 0) { + offset = 1; + } + + /* maskedDB: Apply dbMask to DB */ + ret = esp_ds_mgf_mask(sig + offset, olen - hlen - 1 - offset, p, hlen, md_alg); + if (ret != 0) { + return ret; + } + + msb = dst_len * 8 - 1; + sig[0] &= 0xFF >> (olen * 8 - msb); + + p += hlen; + *p++ = 0xBC; + return ret; +} + +static int rsa_rsassa_pkcs1_v21_encode(int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + size_t dst_len, + unsigned char *dst ) +{ + return rsa_rsassa_pss_pkcs1_v21_encode(f_rng, p_rng, md_alg, hashlen, hash, MBEDTLS_RSA_SALT_LEN_ANY, dst, dst_len); +} +#endif /* CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 */ int esp_ds_rsa_sign( void *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, @@ -232,7 +276,42 @@ int esp_ds_rsa_sign( void *ctx, esp_ds_context_t *esp_ds_ctx; esp_err_t ds_r; int ret = -1; - uint32_t *signature = heap_caps_malloc_prefer((s_ds_data->rsa_length + 1) * FACTOR_KEYLEN_IN_BYTES, 2, MALLOC_CAP_32BIT | MALLOC_CAP_INTERNAL, MALLOC_CAP_DEFAULT | MALLOC_CAP_INTERNAL); + + /* This check is done to keep the compatibility with the previous versions of the API + * which allows NULL ctx. If ctx is NULL, then the default padding + * MBEDTLS_RSA_PKCS_V15 is used. + */ + int padding = MBEDTLS_RSA_PKCS_V15; + if (ctx != NULL) { + mbedtls_rsa_context *rsa_ctx = (mbedtls_rsa_context *)ctx; + padding = rsa_ctx->MBEDTLS_PRIVATE(padding); + } + esp_ds_data_t *s_ds_data = esp_ds_get_data_ctx(); + if (s_ds_data == NULL) { + ESP_LOGE(TAG, "Digital signature data context is NULL"); + return -1; + } + const size_t data_len = s_ds_data->rsa_length + 1; + const size_t sig_len = data_len * FACTOR_KEYLEN_IN_BYTES; + + if (padding == MBEDTLS_RSA_PKCS_V21) { +#ifdef CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 + if ((ret = (rsa_rsassa_pkcs1_v21_encode(f_rng, p_rng ,md_alg, hashlen, hash, sig_len, sig ))) != 0) { + ESP_LOGE(TAG, "Error in pkcs1_v21 encoding, returned %d", ret); + return -1; + } +#else /* CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 */ + ESP_LOGE(TAG, "RSA PKCS#1 v2.1 padding is not supported. Please enable CONFIG_MBEDTLS_SSL_PROTO_TLS1_3"); + return -1; +#endif /* CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 */ + } else { + if ((ret = (rsa_rsassa_pkcs1_v15_encode(md_alg, hashlen, hash, sig_len, sig ))) != 0) { + ESP_LOGE(TAG, "Error in pkcs1_v15 encoding, returned %d", ret); + return -1; + } + } + + uint32_t *signature = heap_caps_malloc_prefer(sig_len, 2, MALLOC_CAP_32BIT | MALLOC_CAP_INTERNAL, MALLOC_CAP_DEFAULT | MALLOC_CAP_INTERNAL); if (signature == NULL) { ESP_LOGE(TAG, "Could not allocate memory for internal DS operations"); return -1; @@ -248,6 +327,8 @@ int esp_ds_rsa_sign( void *ctx, signature[i] = SWAP_INT32(((uint32_t *)sig)[(s_ds_data->rsa_length + 1) - (i + 1)]); } + hmac_key_id_t s_esp_ds_hmac_key_id = esp_ds_get_hmac_key_id(); + ds_r = esp_ds_start_sign((const void *)signature, s_ds_data, s_esp_ds_hmac_key_id, diff --git a/components/mbedtls/port/include/esp_ds/esp_ds_rsa.h b/components/mbedtls/port/include/esp_ds/esp_ds_rsa.h new file mode 100644 index 00000000000..7f126d546b3 --- /dev/null +++ b/components/mbedtls/port/include/esp_ds/esp_ds_rsa.h @@ -0,0 +1,104 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "esp_ds.h" +#include "mbedtls/md.h" + +/** + * @brief ESP-DS data context + * + * @note This structure includes encrypted private key parameters such as ciphertext_c, initialization vector, efuse_key_id, RSA key length, which are obtained when DS peripheral is configured. + */ + +/* Context for encrypted private key data required for DS */ +typedef struct esp_ds_data_ctx { + esp_ds_data_t *esp_ds_data; + uint8_t efuse_key_id; /* efuse block id in which DS_KEY is stored e.g. 0,1*/ + uint16_t rsa_length_bits; /* length of RSA private key in bits e.g. 2048 */ +} esp_ds_data_ctx_t; + +/** + * @brief Initializes internal DS data context + * + * This function allocates and initializes internal ds data context which is used for Digital Signature operation. + * + * @in ds_data ds_data context containing encrypted private key parameters + * @return + * - ESP_OK In case of success + * - ESP_ERR_NO_MEM In case internal context could not be allocated. + * - ESP_ERR_INVALID_ARG in case input parametrers are NULL + * + */ +esp_err_t esp_ds_init_data_ctx(esp_ds_data_ctx_t *ds_data); + +/** + * @brief Deinitializes internal DS data context + * + * This function deinitializes internal ds data context which is used for Digital Signature operation. + * + * @return esp_err_t + * - ESP_OK In case of success + * - ESP_ERR_INVALID_STATE In case internal context is not initialized + */ +esp_err_t esp_ds_deinit_data_ctx(void); + +/** + * + * @brief Release the ds lock acquired for the DS operation (then the DS peripheral can be used for other TLS connection) + * + */ +void esp_ds_release_ds_lock(void); + +/** + * + * @brief Alternate implementation for mbedtls_rsa_rsassa_pkcs1_v15_sign, Internally makes use + * of DS module to perform hardware accelerated RSA sign operation + */ +int esp_ds_rsa_sign( void *ctx, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, + mbedtls_md_type_t md_alg, unsigned int hashlen, + const unsigned char *hash, unsigned char *sig ); + +/* + * @brief Get RSA key length in bytes from internal DS context + * + * @return RSA key length in bytes + */ +size_t esp_ds_get_keylen(void *ctx); + +/* + * @brief Set timeout (equal to TLS session timeout), so that DS module usage can be synchronized in case of multiple TLS connections using DS module, + */ +void esp_ds_set_session_timeout(int timeout); + +/** + * @brief Alternate implementation for mbedtls_rsa_decrypt, Internally makes use + * of DS module to perform hardware accelerated RSA decrypt operation + * + * @param ctx Context for the RSA operation. It should be a pointer to an mbedtls_rsa_context structure. + * The RSA context should have the correct padding type set (either MBEDTLS_RSA_PKCS_V15 or MBEDTLS_RSA_PKCS_V21). + * If ctx is NULL, the default padding type (MBEDTLS_RSA_PKCS_V15) will be used. + * @param olen Pointer to the output length variable, which will be set to the length of the decrypted data. + * @param input The input data to be decrypted. It should be a pointer to an array of unsigned char. + * @param output The buffer to hold the decrypted output. It should be a pointer to an array of unsigned char. + * @param output_max_len The maximum length of the output buffer. It should be greater than or equal to the expected length of the decrypted data. + * @return int + * - 0 on success + * - -1 on failure + */ +int esp_ds_rsa_decrypt(void *ctx, size_t *olen, + const unsigned char *input, unsigned char *output, + size_t output_max_len); + +#ifdef __cplusplus +} +#endif diff --git a/components/mbedtls/port/include/esp_ds/esp_rsa_sign_alt.h b/components/mbedtls/port/include/esp_ds/esp_rsa_sign_alt.h index 7c00ced5482..529a2dc3e46 100644 --- a/components/mbedtls/port/include/esp_ds/esp_rsa_sign_alt.h +++ b/components/mbedtls/port/include/esp_ds/esp_rsa_sign_alt.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -36,7 +36,7 @@ typedef struct esp_ds_data_ctx { * * @in ds_data ds_data context containing encrypted private key parameters * @return - * - ESP_OK In case of succees + * - ESP_OK In case of success * - ESP_ERR_NO_MEM In case internal context could not be allocated. * - ESP_ERR_INVALID_ARG in case input parametrers are NULL * @@ -55,10 +55,10 @@ void esp_ds_release_ds_lock(void); * @brief Alternate implementation for mbedtls_rsa_rsassa_pkcs1_v15_sign, Internally makes use * of DS module to perform hardware accelerated RSA sign operation */ -int esp_ds_rsa_sign( void *ctx, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, - mbedtls_md_type_t md_alg, unsigned int hashlen, - const unsigned char *hash, unsigned char *sig ); +int esp_ds_rsa_sign(void *ctx, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, + mbedtls_md_type_t md_alg, unsigned int hashlen, + const unsigned char *hash, unsigned char *sig); /* * @brief Get RSA key length in bytes from internal DS context diff --git a/components/mbedtls/port/include/rsa_dec_alt.h b/components/mbedtls/port/include/rsa_dec_alt.h new file mode 100644 index 00000000000..6c6f29b0b43 --- /dev/null +++ b/components/mbedtls/port/include/rsa_dec_alt.h @@ -0,0 +1,21 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#ifdef __cpluscplus +extern "C" { +#endif + +#include "sdkconfig.h" + +#if defined(CONFIG_SOC_DIG_SIGN_SUPPORTED) +#include "esp_ds/esp_ds_rsa.h" +#endif + +#ifdef __cpluscplus +} +#endif diff --git a/components/mbedtls/port/include/rsa_sign_alt.h b/components/mbedtls/port/include/rsa_sign_alt.h index bd299cfc3e2..23911adb58b 100644 --- a/components/mbedtls/port/include/rsa_sign_alt.h +++ b/components/mbedtls/port/include/rsa_sign_alt.h @@ -1,28 +1,21 @@ /* - * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2020-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ #pragma once -#ifndef _RSA_SIGN_ALT_H_ -#define _RSA_SIGN_ALT_H_ - #ifdef __cpluscplus extern "C" { #endif -#ifdef CONFIG_ESP_TLS_USE_DS_PERIPHERAL -#include "esp_ds/esp_rsa_sign_alt.h" -#else - -#error "DS configuration flags not activated, please enable required menuconfig flags" +#include "sdkconfig.h" +#if defined(CONFIG_SOC_DIG_SIGN_SUPPORTED) +#include "esp_ds/esp_ds_rsa.h" #endif #ifdef __cpluscplus } #endif - -#endif diff --git a/components/mbedtls/test_apps/main/CMakeLists.txt b/components/mbedtls/test_apps/main/CMakeLists.txt index 931e39b1890..980ab891abd 100644 --- a/components/mbedtls/test_apps/main/CMakeLists.txt +++ b/components/mbedtls/test_apps/main/CMakeLists.txt @@ -4,7 +4,6 @@ set(TEST_CRTS "crts/server_cert_chain.pem" "crts/bad_md_crt.pem" "crts/wrong_sig_crt_esp32_com.pem" "crts/correct_sig_crt_esp32_com.pem") - idf_component_register(SRC_DIRS "." PRIV_INCLUDE_DIRS "." PRIV_REQUIRES cmock test_utils mbedtls esp_timer unity spi_flash esp_psram @@ -16,3 +15,6 @@ target_compile_definitions(${mbedtls} INTERFACE "-DMBEDTLS_DEPRECATED_WARNING") target_compile_definitions(mbedtls PUBLIC "-DMBEDTLS_DEPRECATED_WARNING") target_compile_definitions(mbedcrypto PUBLIC "-DMBEDTLS_DEPRECATED_WARNING") target_compile_definitions(mbedx509 PUBLIC "-DMBEDTLS_DEPRECATED_WARNING") + +# Add linker wrap option to override esp_ds_finish_sign +target_link_options(${COMPONENT_LIB} INTERFACE "-Wl,--wrap=esp_ds_finish_sign,--wrap=esp_ds_start_sign") diff --git a/components/mbedtls/test_apps/main/test_ds_sign_and_decrypt.c b/components/mbedtls/test_apps/main/test_ds_sign_and_decrypt.c new file mode 100644 index 00000000000..cf3f23f14e1 --- /dev/null +++ b/components/mbedtls/test_apps/main/test_ds_sign_and_decrypt.c @@ -0,0 +1,259 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include "unity.h" +#include "mbedtls/rsa.h" +#include "esp_random.h" +#include "sdkconfig.h" + +#ifdef CONFIG_HEAP_TRACING +#include +#define NUM_RECORDS 100 +static heap_trace_record_t trace_record[NUM_RECORDS]; // This buffer must be in internal RAM +#endif + +#ifdef SOC_DIG_SIGN_SUPPORTED +#include "soc/soc_caps.h" +#include "esp_ds.h" +#include "esp_ds/esp_ds_rsa.h" + +int mbedtls_esp_random(void *ctx, unsigned char *output, size_t len) +{ + if (len == 0 || output == NULL) { + return -1; + } + esp_fill_random(output, len); + return 0; +} + +TEST_CASE("ds sign test pkcs1_v15", "[ds_rsa]") +{ + mbedtls_rsa_context rsa_ctx; + rsa_ctx.MBEDTLS_PRIVATE(padding) = MBEDTLS_RSA_PKCS_V15; + unsigned char hash[32] = {0}; + mbedtls_esp_random(NULL, hash, sizeof(hash)); // Fill hash with random data + unsigned int hashlen = sizeof(hash); + unsigned char signature[256] = {0}; + + // esp_ds is not initialized, so we expect an error + int err = esp_ds_rsa_sign(&rsa_ctx, mbedtls_esp_random, NULL, MBEDTLS_MD_SHA256, hashlen, hash, signature); + TEST_ASSERT_EQUAL(-1, err); + + // Initialize the esp_ds context + esp_ds_data_ctx_t ctx; + esp_ds_data_t ds_data; + ds_data.rsa_length = ESP_DS_RSA_2048; // Example length + ctx.esp_ds_data = &ds_data; + ctx.efuse_key_id = 1; // Example efuse key ID + ctx.rsa_length_bits = 2048; // Example RSA length in bits + + err = esp_ds_init_data_ctx(&ctx); + TEST_ASSERT_EQUAL(ESP_OK, err); + + // Now we can call esp_ds_rsa_sign again + err = esp_ds_rsa_sign(&rsa_ctx, mbedtls_esp_random, NULL, MBEDTLS_MD_SHA256, hashlen, hash, signature); + TEST_ASSERT_EQUAL(0, err); + TEST_ASSERT_NOT_NULL(signature); + + err = esp_ds_deinit_data_ctx(); + TEST_ASSERT_EQUAL(ESP_OK, err); + + // Because we have wrapped around the ds_start_sign and ds_finish_sign functions, + // we are not actually performing the real signing operation. That test is done in the + // crypto test_apps, so here we just check that the surrounding code works as expected. + // In this test, we have used v15 padding, so we expect the signature to be non-null + // and the hash to be part of the signature. + TEST_ASSERT_EQUAL(0, memcmp(hash, signature + (256 - hashlen), hashlen)); + + // Let's also ensure that signature has correct encoding + // Just before the hash start, it should have size of hash + TEST_ASSERT_EQUAL(hashlen, signature[256 - hashlen - 1]); + + // One byte before should be MBEDTLS_ASN1_OCTET_STRING + TEST_ASSERT_EQUAL(0x04, signature[256 - hashlen - 2]); + + // And the first byte should be 0x00, indicating that this is a valid PKCS#1 v1.5 signature + TEST_ASSERT_EQUAL(0x00, signature[0]); +} + +#ifdef CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 +TEST_CASE("ds sign test pkcs1_v21", "[ds_rsa]") +{ + mbedtls_rsa_context rsa_ctx; + rsa_ctx.MBEDTLS_PRIVATE(padding) = MBEDTLS_RSA_PKCS_V21; + unsigned char hash[32] = {0}; + mbedtls_esp_random(NULL, hash, sizeof(hash)); // Fill hash with random data + unsigned int hashlen = sizeof(hash); + unsigned char signature[256] = {0}; + + // esp_ds is not initialized, so we expect an error + int err = esp_ds_rsa_sign(&rsa_ctx, mbedtls_esp_random, NULL, MBEDTLS_MD_SHA256, hashlen, hash, signature); + TEST_ASSERT_EQUAL(-1, err); + + // Initialize the esp_ds context + esp_ds_data_ctx_t ctx; + esp_ds_data_t ds_data; + ds_data.rsa_length = ESP_DS_RSA_2048; // Example length + ctx.esp_ds_data = &ds_data; + ctx.efuse_key_id = 1; // Example efuse key ID + ctx.rsa_length_bits = 2048; // Example RSA length in bits + + err = esp_ds_init_data_ctx(&ctx); + TEST_ASSERT_EQUAL(ESP_OK, err); + + // Now we can call esp_ds_rsa_sign again + err = esp_ds_rsa_sign(&rsa_ctx, mbedtls_esp_random, NULL, MBEDTLS_MD_SHA256, hashlen, hash, signature); + TEST_ASSERT_EQUAL(0, err); + TEST_ASSERT_NOT_NULL(signature); + + err = esp_ds_deinit_data_ctx(); + TEST_ASSERT_EQUAL(ESP_OK, err); +} +#endif // CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 + +/* Generated external data for OAEP padding */ +const unsigned char oaep_padded_v21[] = { + 0x00, 0xb6, 0xd9, 0xe6, 0x62, 0xa5, 0xa0, 0xf7, 0xc7, 0xfe, 0xb9, 0x33, 0xdd, 0xdd, 0x67, 0xd7, + 0x35, 0xa5, 0x9d, 0xf7, 0x21, 0x55, 0xf9, 0x60, 0xa8, 0x38, 0x86, 0xb2, 0x73, 0x90, 0xf5, 0x40, + 0x06, 0x85, 0x51, 0x60, 0x10, 0x01, 0x91, 0x24, 0x47, 0x2e, 0x86, 0x16, 0xa6, 0xbc, 0x35, 0x5b, + 0xe4, 0xca, 0x74, 0x9c, 0xe2, 0xe0, 0x2b, 0x2d, 0x63, 0x56, 0x0f, 0x71, 0xe0, 0x8e, 0x1c, 0xa5, + 0x58, 0x72, 0x30, 0x2f, 0x93, 0xf7, 0xd9, 0x0f, 0x16, 0xed, 0x86, 0xd3, 0xbf, 0x42, 0x12, 0x0a, + 0xaa, 0x3b, 0x16, 0x43, 0x84, 0x0d, 0x6d, 0xc8, 0xf9, 0x22, 0xc7, 0x25, 0xf6, 0x61, 0xb4, 0xb8, + 0xd7, 0x07, 0x76, 0x1a, 0xfb, 0x01, 0x01, 0xd7, 0xd2, 0x9b, 0xc1, 0xec, 0x34, 0x53, 0x14, 0x78, + 0xc4, 0x10, 0xf5, 0xf1, 0x28, 0xf6, 0x30, 0x32, 0xe7, 0x8c, 0x27, 0x62, 0x17, 0xf0, 0x47, 0x10, + 0x87, 0xfa, 0xe6, 0x02, 0x90, 0x45, 0xf9, 0x20, 0x79, 0x42, 0xf9, 0x2a, 0x42, 0x06, 0xae, 0x37, + 0xf4, 0xae, 0x12, 0x6b, 0x9c, 0x7b, 0x7e, 0xed, 0x85, 0xdf, 0xdd, 0x27, 0x27, 0xf5, 0xac, 0xb6, + 0x9c, 0x7a, 0xd9, 0x1f, 0x45, 0xd8, 0xb3, 0xed, 0x73, 0xd7, 0x9e, 0xab, 0x68, 0xb8, 0x25, 0xeb, + 0xc5, 0xcc, 0x8a, 0x04, 0x03, 0xd3, 0xd8, 0x60, 0xcc, 0xab, 0xe9, 0xd1, 0xb1, 0x18, 0x28, 0x84, + 0xf9, 0x52, 0xd6, 0xe2, 0x3c, 0x2a, 0x19, 0x5c, 0xd8, 0x73, 0xff, 0x71, 0x94, 0xd6, 0x8b, 0x5f, + 0x69, 0x09, 0x2f, 0xd2, 0xb0, 0x23, 0xda, 0x1a, 0xe4, 0x47, 0x2d, 0xb6, 0xbf, 0x08, 0xbd, 0x5d, + 0x37, 0x9c, 0x81, 0xdd, 0x54, 0x42, 0xad, 0xf7, 0x65, 0xb2, 0x8e, 0xf7, 0x70, 0x7d, 0x62, 0x0a, + 0x3a, 0x1c, 0xf5, 0xe8, 0x9f, 0x17, 0x22, 0x66, 0x3d, 0xc5, 0xab, 0xf6, 0x51, 0xe9, 0x84, 0x73, +}; + +const unsigned char message[] = { + 0x62, 0x1c, 0xaa, 0x4a, 0xae, 0xf8, 0x1f, 0x4b, 0x59, 0x70, 0xee, 0xcb, 0x0c, 0x91, 0x35, 0xc9, + 0x4a, 0xe2, 0x85, 0xf4, 0xfc, 0x21, 0x18, 0x3e, 0xa6, 0xed, 0xa6, 0x71, 0xdb, 0xfe, 0x2b, 0x95, + 0x67, 0x45, 0xb7, +}; +const size_t message_len = 35; + +TEST_CASE("ds decrypt test pkcs1_v21", "[ds_rsa]") +{ +#ifdef CONFIG_HEAP_TRACING + heap_trace_init_standalone(trace_record, NUM_RECORDS); + heap_trace_start(HEAP_TRACE_LEAKS); +#endif + mbedtls_rsa_context rsa_ctx; + rsa_ctx.MBEDTLS_PRIVATE(padding) = MBEDTLS_RSA_PKCS_V21; + // Initialize the esp_ds context + esp_ds_data_ctx_t ctx; + esp_ds_data_t ds_data; + ds_data.rsa_length = ESP_DS_RSA_2048; // Example length + ctx.esp_ds_data = &ds_data; + ctx.efuse_key_id = 1; // Example efuse key ID + ctx.rsa_length_bits = 2048; // Example RSA length in bits + + unsigned char decrypted[256] = {0}; + size_t decrypted_len = 0; + + // esp_ds is not initialized, so we expect an error + int err = esp_ds_rsa_decrypt(&rsa_ctx, &decrypted_len, oaep_padded_v21, decrypted, sizeof(decrypted)); + TEST_ASSERT_EQUAL(-1, err); + + err = esp_ds_init_data_ctx(&ctx); + TEST_ASSERT_EQUAL(ESP_OK, err); + + err = esp_ds_rsa_decrypt(&rsa_ctx, &decrypted_len, oaep_padded_v21, decrypted, sizeof(decrypted)); + TEST_ASSERT_EQUAL(0, err); + TEST_ASSERT_NOT_NULL(decrypted); + + err = esp_ds_deinit_data_ctx(); + TEST_ASSERT_EQUAL(ESP_OK, err); + + TEST_ASSERT_EQUAL(decrypted_len, message_len); + TEST_ASSERT_EQUAL_MEMORY(decrypted, message, message_len); +#ifdef CONFIG_HEAP_TRACING + heap_trace_stop(); + heap_trace_dump(); +#endif +} + +const unsigned char v15_padded[] = { + 0x00, 0x02, 0xdf, 0x36, 0xfc, 0x41, 0x57, 0x40, 0x87, 0x3f, 0x88, 0xa7, 0x7f, 0x7a, 0x33, 0xbe, + 0x2f, 0xf7, 0xdd, 0x8a, 0xb6, 0x6a, 0xb4, 0x6a, 0x96, 0xdb, 0x63, 0xbf, 0x50, 0xd8, 0x08, 0x5b, + 0x07, 0x9e, 0xdf, 0x4c, 0x1e, 0xb2, 0x6c, 0x83, 0x22, 0xff, 0x21, 0xc8, 0x99, 0xe1, 0x6c, 0x3d, + 0x31, 0x82, 0x8e, 0xb6, 0xb3, 0x3f, 0x77, 0xc6, 0x7d, 0xb1, 0x05, 0x97, 0xd0, 0x96, 0x49, 0x78, + 0x62, 0xd5, 0x7b, 0x5b, 0x49, 0x8c, 0xb0, 0x4e, 0x5f, 0xf2, 0x92, 0xc2, 0x9f, 0xd4, 0x77, 0x0a, + 0x77, 0x94, 0x9f, 0x80, 0xff, 0xde, 0x6a, 0xe7, 0x62, 0x36, 0x9f, 0x73, 0x78, 0xb3, 0xc0, 0x2f, + 0xd8, 0xf9, 0x06, 0x60, 0x78, 0xbc, 0x50, 0x06, 0x0d, 0x33, 0x6c, 0x5f, 0xcc, 0x4d, 0x40, 0x4e, + 0x12, 0x53, 0x39, 0x3b, 0x24, 0x4f, 0x9c, 0x14, 0x20, 0xbd, 0x71, 0x1d, 0xdc, 0xc5, 0xbc, 0x88, + 0xd1, 0x87, 0x4a, 0xac, 0x21, 0xb6, 0x06, 0x9d, 0x56, 0xe5, 0xb7, 0x05, 0x61, 0x32, 0x30, 0x97, + 0x7d, 0x72, 0x2f, 0x45, 0xf0, 0xc6, 0x55, 0x01, 0x87, 0x78, 0xbc, 0xa4, 0x9b, 0x4f, 0xe1, 0xc5, + 0x59, 0x8a, 0xaa, 0x3c, 0xd1, 0x0a, 0xe3, 0xbe, 0x0b, 0xde, 0x21, 0xa8, 0x3b, 0x89, 0x9f, 0x0a, + 0x30, 0x22, 0x64, 0x4e, 0x90, 0x71, 0x52, 0x27, 0x23, 0x7b, 0xe7, 0x0b, 0x07, 0xa9, 0x7e, 0x15, + 0xb1, 0xfe, 0x0e, 0x0e, 0x1b, 0x8e, 0xc3, 0xf0, 0x26, 0x66, 0xfb, 0xdf, 0x78, 0xf8, 0x03, 0xd5, + 0xf5, 0x90, 0x08, 0x04, 0x7c, 0x9f, 0x11, 0xa5, 0x5e, 0x5b, 0x2b, 0x01, 0x00, 0x62, 0x1c, 0xaa, + 0x4a, 0xae, 0xf8, 0x1f, 0x4b, 0x59, 0x70, 0xee, 0xcb, 0x0c, 0x91, 0x35, 0xc9, 0x4a, 0xe2, 0x85, + 0xf4, 0xfc, 0x21, 0x18, 0x3e, 0xa6, 0xed, 0xa6, 0x71, 0xdb, 0xfe, 0x2b, 0x95, 0x67, 0x45, 0xb7, +}; + +TEST_CASE("ds decrypt test pkcs1_v15", "[ds_rsa]") +{ + mbedtls_rsa_context rsa_ctx; + rsa_ctx.MBEDTLS_PRIVATE(padding) = MBEDTLS_RSA_PKCS_V15; + // Initialize the esp_ds context + esp_ds_data_ctx_t ctx; + esp_ds_data_t ds_data; + ds_data.rsa_length = ESP_DS_RSA_2048; // Example length + ctx.esp_ds_data = &ds_data; + ctx.efuse_key_id = 1; // Example efuse key ID + ctx.rsa_length_bits = 2048; // Example RSA length in bits + + int err = esp_ds_init_data_ctx(&ctx); + TEST_ASSERT_EQUAL(ESP_OK, err); + + unsigned char decrypted[256] = {0}; + size_t decrypted_len = 0; + err = esp_ds_rsa_decrypt(&rsa_ctx, &decrypted_len, v15_padded, decrypted, sizeof(decrypted)); + TEST_ASSERT_EQUAL(0, err); + TEST_ASSERT_NOT_NULL(decrypted); + + err = esp_ds_deinit_data_ctx(); + TEST_ASSERT_EQUAL(ESP_OK, err); + + TEST_ASSERT_EQUAL(decrypted_len, message_len); + TEST_ASSERT_EQUAL_MEMORY(decrypted, message, message_len); +} + +int __wrap_esp_ds_start_sign(const void *message, const esp_ds_data_t *data, hmac_key_id_t key_id, esp_ds_context_t **esp_ds_ctx) +{ + // This function will be called instead of the original esp_ds_start_sign + if (message == NULL || data == NULL || esp_ds_ctx == NULL) { + return ESP_ERR_INVALID_ARG; + } + + *esp_ds_ctx = malloc(sizeof(void *)); + if (*esp_ds_ctx == NULL) { + return ESP_ERR_NO_MEM; + } + + // Simulate successful start sign + return ESP_OK; +} + +// Test implementation using linker wrap +int __wrap_esp_ds_finish_sign(void *sig, esp_ds_context_t *ctx) +{ + // This function will be called instead of the original esp_ds_finish_sign + free(ctx); + return 0; + + // Or we can call the real implementation if needed: + // return __real_esp_ds_finish_sign(sig, ctx); +} +#endif /* SOC_DIG_SIGN_SUPPORTED */ diff --git a/components/mbedtls/test_apps/pytest_mbedtls_ut.py b/components/mbedtls/test_apps/pytest_mbedtls_ut.py index 3614c8dcaa2..2cfeef9c976 100644 --- a/components/mbedtls/test_apps/pytest_mbedtls_ut.py +++ b/components/mbedtls/test_apps/pytest_mbedtls_ut.py @@ -90,3 +90,16 @@ def test_mbedtls_ecdsa_sign(dut: Dut) -> None: ) def test_mbedtls_rom_impl_esp32c2(dut: Dut) -> None: dut.run_all_single_board_cases() + + +@pytest.mark.esp32s3 +@pytest.mark.generic +@pytest.mark.parametrize( + 'config', + [ + 'ds_rsa', + ], + indirect=True, +) +def test_mbedtls_ds_rsa(dut: Dut) -> None: + dut.run_all_single_board_cases(group='ds_rsa') diff --git a/components/mbedtls/test_apps/sdkconfig.ci.ds_rsa b/components/mbedtls/test_apps/sdkconfig.ci.ds_rsa new file mode 100644 index 00000000000..48159ab38dc --- /dev/null +++ b/components/mbedtls/test_apps/sdkconfig.ci.ds_rsa @@ -0,0 +1 @@ +CONFIG_MBEDTLS_SSL_PROTO_TLS1_3=y From b98df991f9061225c945d845137baa293e576219 Mon Sep 17 00:00:00 2001 From: zwl Date: Mon, 30 Jun 2025 21:43:41 +0800 Subject: [PATCH 183/213] change(ble): [AUTO_MR] Update lib_esp32h2 to d2d70d40 --- components/bt/controller/lib_esp32h2/esp32h2-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32h2/esp32h2-bt-lib b/components/bt/controller/lib_esp32h2/esp32h2-bt-lib index e90088b3563..513c3fb61e0 160000 --- a/components/bt/controller/lib_esp32h2/esp32h2-bt-lib +++ b/components/bt/controller/lib_esp32h2/esp32h2-bt-lib @@ -1 +1 @@ -Subproject commit e90088b35639ee9b41ab67fcd5b8dab5395cfacb +Subproject commit 513c3fb61e0aa30b22d920ec17408a13be4ef93a From 2cdd1c2074acd28189e27262aa64644ba24fd1bb Mon Sep 17 00:00:00 2001 From: zwl Date: Mon, 30 Jun 2025 21:43:41 +0800 Subject: [PATCH 184/213] change(ble): [AUTO_MR] Update lib_esp32c5 to d2d70d40 --- components/bt/controller/lib_esp32c5/esp32c5-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c5/esp32c5-bt-lib b/components/bt/controller/lib_esp32c5/esp32c5-bt-lib index effd35f8c8f..bfd839208ed 160000 --- a/components/bt/controller/lib_esp32c5/esp32c5-bt-lib +++ b/components/bt/controller/lib_esp32c5/esp32c5-bt-lib @@ -1 +1 @@ -Subproject commit effd35f8c8f7a0b7363dc70f13162600b512cd7d +Subproject commit bfd839208edeaf76ba3fc974031c8860e7ce9042 From 331b28d37f2e6f56e618c753345bdedf538e884a Mon Sep 17 00:00:00 2001 From: zwl Date: Mon, 30 Jun 2025 21:43:42 +0800 Subject: [PATCH 185/213] change(ble): [AUTO_MR] Update lib_esp32c6 to d2d70d40 --- components/bt/controller/lib_esp32c6/esp32c6-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c6/esp32c6-bt-lib b/components/bt/controller/lib_esp32c6/esp32c6-bt-lib index fa4b7f913d6..80f6b7e6e4b 160000 --- a/components/bt/controller/lib_esp32c6/esp32c6-bt-lib +++ b/components/bt/controller/lib_esp32c6/esp32c6-bt-lib @@ -1 +1 @@ -Subproject commit fa4b7f913d6b65ea30b8d06eb1e62dc1b86b7843 +Subproject commit 80f6b7e6e4bcfc28684a9273a2bc037097255e51 From a495def4735163ec6b859905b3ba7901f5013d86 Mon Sep 17 00:00:00 2001 From: zwl Date: Mon, 30 Jun 2025 21:43:42 +0800 Subject: [PATCH 186/213] change(ble): [AUTO_MR] Update lib_esp32c2 to 9af627ef --- components/bt/controller/lib_esp32c2/esp32c2-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c2/esp32c2-bt-lib b/components/bt/controller/lib_esp32c2/esp32c2-bt-lib index 64ba4e23f3b..7be8be96db6 160000 --- a/components/bt/controller/lib_esp32c2/esp32c2-bt-lib +++ b/components/bt/controller/lib_esp32c2/esp32c2-bt-lib @@ -1 +1 @@ -Subproject commit 64ba4e23f3bb2e8ecf26f7901b0657a950682d3d +Subproject commit 7be8be96db63928b5c4c6785f633eddbffa3287c From 20da1d9266a5f16fd08f2be74cddc99d3e8827be Mon Sep 17 00:00:00 2001 From: zwl Date: Tue, 1 Jul 2025 10:17:28 +0800 Subject: [PATCH 187/213] fix(ble): fixed occasional assert triggered during controller disable on ESP32-C2 --- components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld b/components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld index 16819fd0c22..a3373fec806 100644 --- a/components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld +++ b/components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld @@ -806,7 +806,7 @@ r_ble_lll_scan_process_rsp_in_isr = 0x400016e8; r_ble_lll_scan_restart = 0x400016f0; r_ble_lll_scan_rx_isr_on_aux = 0x400016f4; r_ble_lll_scan_rx_isr_on_legacy = 0x400016f8; -r_ble_lll_scan_rx_pkt_isr = 0x400016fc; +//r_ble_lll_scan_rx_pkt_isr = 0x400016fc; r_ble_lll_scan_sched_next_aux = 0x40001700; r_ble_lll_scan_sched_remove = 0x40001704; r_ble_lll_scan_start = 0x40001708; @@ -1156,8 +1156,8 @@ r_hal_timer_env_deinit = 0x40002f18; r_ble_ll_env_deinit = 0x40002f1c; r_ble_ll_generic_data_deinit = 0x40002f20; //r_ble_hci_trans_env_deinit = 0x40002f24; -r_ble_ll_conn_callout_env_init = 0x40002f28; -r_ble_ll_conn_callout_env_deinit = 0x40002f2c; +//r_ble_ll_conn_callout_env_init = 0x40002f28; +//r_ble_ll_conn_callout_env_deinit = 0x40002f2c; r_ble_ll_scan_callout_env_init = 0x40002f30; r_ble_ll_scan_callout_env_deinit = 0x40002f34; r_ble_ll_callout_env_init = 0x40002f38; From 87396ab0cea81546aaeb5611589bfd6c1e21c112 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Thu, 26 Jun 2025 17:17:54 +0800 Subject: [PATCH 188/213] fix(ble): ensure ble controller disable safety for ESP32-C2 --- components/bt/controller/esp32c2/bt.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/components/bt/controller/esp32c2/bt.c b/components/bt/controller/esp32c2/bt.c index a329881eeb0..2f5028e9586 100644 --- a/components/bt/controller/esp32c2/bt.c +++ b/components/bt/controller/esp32c2/bt.c @@ -141,7 +141,7 @@ extern void esp_panic_handler_feed_wdts(void); #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED extern int ble_controller_deinit(void); extern int ble_controller_enable(uint8_t mode); -extern int ble_controller_disable(void); +extern void ble_controller_disable(void); extern int esp_register_ext_funcs (struct ext_funcs_t *); extern void esp_unregister_ext_funcs (void); extern int esp_ble_ll_set_public_addr(const uint8_t *addr); @@ -1077,9 +1077,9 @@ esp_err_t esp_bt_controller_disable(void) ESP_LOGW(NIMBLE_PORT_LOG_TAG, "invalid controller state"); return ESP_FAIL; } - if (ble_controller_disable() != 0) { - return ESP_FAIL; - } + ble_controller_status = ESP_BT_CONTROLLER_STATUS_INITED; + + ble_controller_disable(); ble_stack_disable(); if (s_ble_active) { esp_phy_disable(PHY_MODEM_BT); @@ -1091,7 +1091,6 @@ esp_err_t esp_bt_controller_disable(void) #if CONFIG_SW_COEXIST_ENABLE coex_disable(); #endif - ble_controller_status = ESP_BT_CONTROLLER_STATUS_INITED; return ESP_OK; } From db928ed77d259ca8581b1a1935bb7470834b3287 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Wed, 9 Jul 2025 11:17:37 +0800 Subject: [PATCH 189/213] change(ble): [AUTO_MR] Update lib_esp32h2 to ca6c20bc --- components/bt/controller/lib_esp32h2/esp32h2-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32h2/esp32h2-bt-lib b/components/bt/controller/lib_esp32h2/esp32h2-bt-lib index 513c3fb61e0..b83a28f7978 160000 --- a/components/bt/controller/lib_esp32h2/esp32h2-bt-lib +++ b/components/bt/controller/lib_esp32h2/esp32h2-bt-lib @@ -1 +1 @@ -Subproject commit 513c3fb61e0aa30b22d920ec17408a13be4ef93a +Subproject commit b83a28f7978625d20147f8999aac53a08420bf7a From c3806feb9ebe7214d647c9f921a324f478290897 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Wed, 9 Jul 2025 11:17:37 +0800 Subject: [PATCH 190/213] change(ble): [AUTO_MR] Update lib_esp32c6 to ca6c20bc --- components/bt/controller/lib_esp32c6/esp32c6-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c6/esp32c6-bt-lib b/components/bt/controller/lib_esp32c6/esp32c6-bt-lib index 80f6b7e6e4b..f68cbf2768b 160000 --- a/components/bt/controller/lib_esp32c6/esp32c6-bt-lib +++ b/components/bt/controller/lib_esp32c6/esp32c6-bt-lib @@ -1 +1 @@ -Subproject commit 80f6b7e6e4bcfc28684a9273a2bc037097255e51 +Subproject commit f68cbf2768b4177794e9938e51221b2744c336b3 From e17f857cb027ac556e892a95141706b016150b0c Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Wed, 9 Jul 2025 11:17:37 +0800 Subject: [PATCH 191/213] change(ble): [AUTO_MR] Update lib_esp32c2 to c7732d48 --- components/bt/controller/lib_esp32c2/esp32c2-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c2/esp32c2-bt-lib b/components/bt/controller/lib_esp32c2/esp32c2-bt-lib index 7be8be96db6..68d2b55c99c 160000 --- a/components/bt/controller/lib_esp32c2/esp32c2-bt-lib +++ b/components/bt/controller/lib_esp32c2/esp32c2-bt-lib @@ -1 +1 @@ -Subproject commit 7be8be96db63928b5c4c6785f633eddbffa3287c +Subproject commit 68d2b55c99c5fad51dcc6c269464a6adb59d0206 From 456a4682c8fd05f33136094b09f0ae8156e93140 Mon Sep 17 00:00:00 2001 From: cjin Date: Fri, 4 Jul 2025 18:05:21 +0800 Subject: [PATCH 192/213] feat(ble): support memory allocation check debug feature on ESP32-C2 --- components/bt/controller/esp32c2/Kconfig.in | 163 +++++++++--------- components/bt/controller/esp32c2/bt.c | 7 + .../bt/include/esp32c2/include/esp_bt.h | 4 + components/bt/porting/include/bt_osi_mem.h | 4 + components/bt/porting/mem/bt_osi_mem.c | 30 +++- 5 files changed, 130 insertions(+), 78 deletions(-) diff --git a/components/bt/controller/esp32c2/Kconfig.in b/components/bt/controller/esp32c2/Kconfig.in index 1076cf24ba6..2faa9c2077e 100644 --- a/components/bt/controller/esp32c2/Kconfig.in +++ b/components/bt/controller/esp32c2/Kconfig.in @@ -281,94 +281,103 @@ config BT_LE_CONTROLLER_TASK_STACK_SIZE help This configures stack size of NimBLE controller task -menuconfig BT_LE_CONTROLLER_LOG_ENABLED - bool "Controller log enable" - default n - help - Enable controller log +menu "Controller debug features" + menuconfig BT_LE_CONTROLLER_LOG_ENABLED + bool "Controller log enable" + default n + help + Enable controller log -config BT_LE_CONTROLLER_LOG_CTRL_ENABLED - bool "enable controller log module" - depends on BT_LE_CONTROLLER_LOG_ENABLED - default y - help - Enable controller log module + config BT_LE_CONTROLLER_LOG_CTRL_ENABLED + bool "enable controller log module" + depends on BT_LE_CONTROLLER_LOG_ENABLED + default y + help + Enable controller log module -config BT_LE_CONTROLLER_LOG_HCI_ENABLED - bool "enable HCI log module" - depends on BT_LE_CONTROLLER_LOG_ENABLED - default y - help - Enable hci log module + config BT_LE_CONTROLLER_LOG_HCI_ENABLED + bool "enable HCI log module" + depends on BT_LE_CONTROLLER_LOG_ENABLED + default y + help + Enable hci log module -config BT_LE_CONTROLLER_LOG_DUMP_ONLY - bool "Controller log dump mode only" - depends on BT_LE_CONTROLLER_LOG_ENABLED - default y - help - Only operate in dump mode + config BT_LE_CONTROLLER_LOG_DUMP_ONLY + bool "Controller log dump mode only" + depends on BT_LE_CONTROLLER_LOG_ENABLED + default y + help + Only operate in dump mode -config BT_LE_CONTROLLER_LOG_SPI_OUT_ENABLED - bool "Output ble controller logs to SPI bus (Experimental)" - depends on BT_LE_CONTROLLER_LOG_ENABLED - depends on !BT_LE_CONTROLLER_LOG_DUMP_ONLY - select BT_BLE_LOG_SPI_OUT_ENABLED - default n - help - Output ble controller logs to SPI bus + config BT_LE_CONTROLLER_LOG_SPI_OUT_ENABLED + bool "Output ble controller logs to SPI bus (Experimental)" + depends on BT_LE_CONTROLLER_LOG_ENABLED + depends on !BT_LE_CONTROLLER_LOG_DUMP_ONLY + select BT_BLE_LOG_SPI_OUT_ENABLED + default n + help + Output ble controller logs to SPI bus -config BT_LE_CONTROLLER_LOG_STORAGE_ENABLE - bool "Store ble controller logs to flash(Experimental)" - depends on !BT_LE_CONTROLLER_LOG_DUMP_ONLY - depends on BT_LE_CONTROLLER_LOG_ENABLED - default n - help - Store ble controller logs to flash memory. + config BT_LE_CONTROLLER_LOG_STORAGE_ENABLE + bool "Store ble controller logs to flash(Experimental)" + depends on !BT_LE_CONTROLLER_LOG_DUMP_ONLY + depends on BT_LE_CONTROLLER_LOG_ENABLED + default n + help + Store ble controller logs to flash memory. -config BT_LE_CONTROLLER_LOG_PARTITION_SIZE - int "size of ble controller log partition(Multiples of 4K)" - depends on BT_LE_CONTROLLER_LOG_STORAGE_ENABLE - default 65536 - help - The size of ble controller log partition shall be a multiples of 4K. - The name of log partition shall be "bt_ctrl_log". - The partition type shall be ESP_PARTITION_TYPE_DATA. - The partition sub_type shall be ESP_PARTITION_SUBTYPE_ANY. + config BT_LE_CONTROLLER_LOG_PARTITION_SIZE + int "size of ble controller log partition(Multiples of 4K)" + depends on BT_LE_CONTROLLER_LOG_STORAGE_ENABLE + default 65536 + help + The size of ble controller log partition shall be a multiples of 4K. + The name of log partition shall be "bt_ctrl_log". + The partition type shall be ESP_PARTITION_TYPE_DATA. + The partition sub_type shall be ESP_PARTITION_SUBTYPE_ANY. -config BT_LE_LOG_CTRL_BUF1_SIZE - int "size of the first BLE controller LOG buffer" - depends on BT_LE_CONTROLLER_LOG_ENABLED - default 4096 - help - Configure the size of the first BLE controller LOG buffer. + config BT_LE_LOG_CTRL_BUF1_SIZE + int "size of the first BLE controller LOG buffer" + depends on BT_LE_CONTROLLER_LOG_ENABLED + default 4096 + help + Configure the size of the first BLE controller LOG buffer. -config BT_LE_LOG_CTRL_BUF2_SIZE - int "size of the second BLE controller LOG buffer" - depends on BT_LE_CONTROLLER_LOG_ENABLED - default 1024 - help - Configure the size of the second BLE controller LOG buffer. + config BT_LE_LOG_CTRL_BUF2_SIZE + int "size of the second BLE controller LOG buffer" + depends on BT_LE_CONTROLLER_LOG_ENABLED + default 1024 + help + Configure the size of the second BLE controller LOG buffer. -config BT_LE_LOG_HCI_BUF_SIZE - int "size of the BLE HCI LOG buffer" - depends on BT_LE_CONTROLLER_LOG_ENABLED - default 4096 - help - Configure the size of the BLE HCI LOG buffer. + config BT_LE_LOG_HCI_BUF_SIZE + int "size of the BLE HCI LOG buffer" + depends on BT_LE_CONTROLLER_LOG_ENABLED + default 4096 + help + Configure the size of the BLE HCI LOG buffer. -config BT_LE_CONTROLLER_LOG_WRAP_PANIC_HANDLER_ENABLE - bool "Enable wrap panic handler" - depends on BT_LE_CONTROLLER_LOG_ENABLED - default n - help - Wrap esp_panic_handler to get controller logs when PC pointer exception crashes. + config BT_LE_CONTROLLER_LOG_WRAP_PANIC_HANDLER_ENABLE + bool "Enable wrap panic handler" + depends on BT_LE_CONTROLLER_LOG_ENABLED + default n + help + Wrap esp_panic_handler to get controller logs when PC pointer exception crashes. + + config BT_LE_CONTROLLER_LOG_TASK_WDT_USER_HANDLER_ENABLE + bool "Enable esp_task_wdt_isr_user_handler implementation" + depends on BT_LE_CONTROLLER_LOG_ENABLED + default n + help + Implement esp_task_wdt_isr_user_handler to get controller logs when task wdt issue is triggered. + + config BT_LE_MEM_CHECK_ENABLED + bool "Enable memory allocation check" + default n + help + Used in internal tests only. Enable the memory allocation check. +endmenu -config BT_LE_CONTROLLER_LOG_TASK_WDT_USER_HANDLER_ENABLE - bool "Enable esp_task_wdt_isr_user_handler implementation" - depends on BT_LE_CONTROLLER_LOG_ENABLED - default n - help - Implement esp_task_wdt_isr_user_handler to get controller logs when task wdt issue is triggered. config BT_LE_LL_RESOLV_LIST_SIZE int "BLE LL Resolving list size" range 1 5 diff --git a/components/bt/controller/esp32c2/bt.c b/components/bt/controller/esp32c2/bt.c index 2f5028e9586..ffa15d3c9a9 100644 --- a/components/bt/controller/esp32c2/bt.c +++ b/components/bt/controller/esp32c2/bt.c @@ -1573,3 +1573,10 @@ int ble_sm_alg_gen_key_pair(uint8_t *pub, uint8_t *priv) #endif // CONFIG_BT_LE_SM_LEGACY || CONFIG_BT_LE_SM_SC #endif // (!CONFIG_BT_NIMBLE_ENABLED) && (CONFIG_BT_CONTROLLER_ENABLED) + +#if CONFIG_BT_LE_MEM_CHECK_ENABLED +void ble_memory_count_limit_set(uint16_t count_limit) +{ + bt_osi_mem_count_limit_set(count_limit); +} +#endif // CONFIG_BT_LE_MEM_CHECK_ENABLED diff --git a/components/bt/include/esp32c2/include/esp_bt.h b/components/bt/include/esp32c2/include/esp_bt.h index de161b08f6b..ce464b54d43 100644 --- a/components/bt/include/esp32c2/include/esp_bt.h +++ b/components/bt/include/esp32c2/include/esp_bt.h @@ -446,6 +446,10 @@ uint32_t esp_bt_get_lpclk_freq(void); void esp_bt_set_lpclk_freq(uint32_t clk_freq); +#if CONFIG_BT_LE_MEM_CHECK_ENABLED +void ble_memory_count_limit_set(uint16_t count_limit); +#endif // CONFIG_BT_LE_MEM_CHECK_ENABLED + #ifdef __cplusplus } #endif diff --git a/components/bt/porting/include/bt_osi_mem.h b/components/bt/porting/include/bt_osi_mem.h index 9ab06d0ab4d..cf5f60956e1 100644 --- a/components/bt/porting/include/bt_osi_mem.h +++ b/components/bt/porting/include/bt_osi_mem.h @@ -19,3 +19,7 @@ void *bt_osi_mem_malloc_internal(size_t size); void *bt_osi_mem_calloc_internal(size_t n, size_t size); void bt_osi_mem_free(void *ptr); + +#if CONFIG_BT_LE_MEM_CHECK_ENABLED +void bt_osi_mem_count_limit_set(uint16_t count_limit); +#endif // CONFIG_BT_LE_MEM_CHECK_ENABLED diff --git a/components/bt/porting/mem/bt_osi_mem.c b/components/bt/porting/mem/bt_osi_mem.c index 612099d2776..cbedf8c96d2 100644 --- a/components/bt/porting/mem/bt_osi_mem.c +++ b/components/bt/porting/mem/bt_osi_mem.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -11,6 +11,10 @@ #include static uint8_t log_count; +#if CONFIG_BT_LE_MEM_CHECK_ENABLED +static uint16_t mem_count_limit = 0; +static uint16_t curr_mem_count; +#endif // CONFIG_BT_LE_MEM_CHECK_ENABLED IRAM_ATTR void *bt_osi_mem_malloc(size_t size) { void *mem = NULL; @@ -49,11 +53,27 @@ IRAM_ATTR void *bt_osi_mem_calloc(size_t n, size_t size) IRAM_ATTR void *bt_osi_mem_malloc_internal(size_t size) { +#if CONFIG_BT_LE_MEM_CHECK_ENABLED + if (mem_count_limit) { + if (curr_mem_count > mem_count_limit) { + return NULL; + } + curr_mem_count ++; + } +#endif // CONFIG_BT_LE_MEM_CHECK_ENABLED return heap_caps_malloc(size, MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT|MALLOC_CAP_DMA); } IRAM_ATTR void *bt_osi_mem_calloc_internal(size_t n, size_t size) { +#if CONFIG_BT_LE_MEM_CHECK_ENABLED + if (mem_count_limit) { + if (curr_mem_count > mem_count_limit) { + return NULL; + } + curr_mem_count ++; + } +#endif // CONFIG_BT_LE_MEM_CHECK_ENABLED return heap_caps_calloc(n, size, MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT|MALLOC_CAP_DMA); } @@ -61,3 +81,11 @@ IRAM_ATTR void bt_osi_mem_free(void *ptr) { heap_caps_free(ptr); } + +#if CONFIG_BT_LE_MEM_CHECK_ENABLED +void bt_osi_mem_count_limit_set(uint16_t count_limit) +{ + mem_count_limit = count_limit; + curr_mem_count = 0; +} +#endif // CONFIG_BT_LE_MEM_CHECK_ENABLED From 0b904ff5de20a2c90b5285b5e585b730dc0c0ccf Mon Sep 17 00:00:00 2001 From: cjin Date: Fri, 4 Jul 2025 18:06:13 +0800 Subject: [PATCH 193/213] feat(ble): support memory allocation check debug feature on ESP32-C6 --- components/bt/controller/esp32c6/Kconfig.in | 6 ++++++ components/bt/controller/esp32c6/bt.c | 7 +++++++ components/bt/include/esp32c6/include/esp_bt.h | 4 ++++ 3 files changed, 17 insertions(+) diff --git a/components/bt/controller/esp32c6/Kconfig.in b/components/bt/controller/esp32c6/Kconfig.in index 8f3c33630bd..f7b2a7db923 100644 --- a/components/bt/controller/esp32c6/Kconfig.in +++ b/components/bt/controller/esp32c6/Kconfig.in @@ -447,6 +447,12 @@ menu "Controller debug features" config BT_LE_PTR_CHECK_ENABLED bool "Enable boundary check for internal memory" default n + + config BT_LE_MEM_CHECK_ENABLED + bool "Enable memory allocation check" + default n + help + Used in internal tests only. Enable the memory allocation check. endmenu config BT_LE_LL_RESOLV_LIST_SIZE diff --git a/components/bt/controller/esp32c6/bt.c b/components/bt/controller/esp32c6/bt.c index dd57e8b3720..123acde38c4 100644 --- a/components/bt/controller/esp32c6/bt.c +++ b/components/bt/controller/esp32c6/bt.c @@ -1771,3 +1771,10 @@ ble_capture_info_user_handler(uint8_t type, uint32_t reason, uint32_t param1, ui } return 0; } + +#if CONFIG_BT_LE_MEM_CHECK_ENABLED +void ble_memory_count_limit_set(uint16_t count_limit) +{ + bt_osi_mem_count_limit_set(count_limit); +} +#endif // CONFIG_BT_LE_MEM_CHECK_ENABLED diff --git a/components/bt/include/esp32c6/include/esp_bt.h b/components/bt/include/esp32c6/include/esp_bt.h index f0c0c556445..d3c67ad01a5 100644 --- a/components/bt/include/esp32c6/include/esp_bt.h +++ b/components/bt/include/esp32c6/include/esp_bt.h @@ -524,6 +524,10 @@ uint32_t esp_bt_get_lpclk_freq(void); void esp_bt_set_lpclk_freq(uint32_t clk_freq); +#if CONFIG_BT_LE_MEM_CHECK_ENABLED +void ble_memory_count_limit_set(uint16_t count_limit); +#endif // CONFIG_BT_LE_MEM_CHECK_ENABLED + #ifdef __cplusplus } #endif From 061466c9f139c90f5642a7428b9b58ea16e5212a Mon Sep 17 00:00:00 2001 From: cjin Date: Fri, 4 Jul 2025 18:06:23 +0800 Subject: [PATCH 194/213] feat(ble): support memory allocation check debug feature on ESP32-H2 --- components/bt/controller/esp32h2/Kconfig.in | 6 ++++++ components/bt/controller/esp32h2/bt.c | 7 +++++++ components/bt/include/esp32h2/include/esp_bt.h | 4 ++++ 3 files changed, 17 insertions(+) diff --git a/components/bt/controller/esp32h2/Kconfig.in b/components/bt/controller/esp32h2/Kconfig.in index 2f914a10752..5ff989a8b4a 100644 --- a/components/bt/controller/esp32h2/Kconfig.in +++ b/components/bt/controller/esp32h2/Kconfig.in @@ -441,6 +441,12 @@ menu "Controller debug features" config BT_LE_PTR_CHECK_ENABLED bool "Enable boundary check for internal memory" default n + + config BT_LE_MEM_CHECK_ENABLED + bool "Enable memory allocation check" + default n + help + Used in internal tests only. Enable the memory allocation check. endmenu config BT_LE_LL_RESOLV_LIST_SIZE diff --git a/components/bt/controller/esp32h2/bt.c b/components/bt/controller/esp32h2/bt.c index 2c564b911b2..28672c244a2 100644 --- a/components/bt/controller/esp32h2/bt.c +++ b/components/bt/controller/esp32h2/bt.c @@ -1693,3 +1693,10 @@ ble_capture_info_user_handler(uint8_t type, uint32_t reason, uint32_t param1, ui } return 0; } + +#if CONFIG_BT_LE_MEM_CHECK_ENABLED +void ble_memory_count_limit_set(uint16_t count_limit) +{ + bt_osi_mem_count_limit_set(count_limit); +} +#endif // CONFIG_BT_LE_MEM_CHECK_ENABLED diff --git a/components/bt/include/esp32h2/include/esp_bt.h b/components/bt/include/esp32h2/include/esp_bt.h index b33f8b7359d..601f5816a37 100644 --- a/components/bt/include/esp32h2/include/esp_bt.h +++ b/components/bt/include/esp32h2/include/esp_bt.h @@ -462,6 +462,10 @@ uint32_t esp_bt_get_lpclk_freq(void); void esp_bt_set_lpclk_freq(uint32_t clk_freq); +#if CONFIG_BT_LE_MEM_CHECK_ENABLED +void ble_memory_count_limit_set(uint16_t count_limit); +#endif // CONFIG_BT_LE_MEM_CHECK_ENABLED + #ifdef __cplusplus } #endif From 899967833950fc1cd4d5356a439b2344cf25da46 Mon Sep 17 00:00:00 2001 From: cjin Date: Fri, 4 Jul 2025 16:43:25 +0800 Subject: [PATCH 195/213] feat(ble): enable broker initialization on ESP32-H2 --- components/bt/controller/esp32h2/ble.c | 54 +++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/components/bt/controller/esp32h2/ble.c b/components/bt/controller/esp32h2/ble.c index 8aef45a9a89..a0faf1c4e59 100644 --- a/components/bt/controller/esp32h2/ble.c +++ b/components/bt/controller/esp32h2/ble.c @@ -22,6 +22,21 @@ void conn_stack_deinitEnv(void); int conn_stack_enable(void); void conn_stack_disable(void); +int adv_stack_initEnv(void); +void adv_stack_deinitEnv(void); +int adv_stack_enable(void); +void adv_stack_disable(void); + +int extAdv_stack_initEnv(void); +void extAdv_stack_deinitEnv(void); +int extAdv_stack_enable(void); +void extAdv_stack_disable(void); + +int sync_stack_initEnv(void); +void sync_stack_deinitEnv(void); +int sync_stack_enable(void); +void sync_stack_disable(void); + #if CONFIG_BT_LE_ERROR_SIM_ENABLED int conn_errorSim_initEnv(void); void conn_errorSim_deinitEnv(void); @@ -85,6 +100,22 @@ int ble_stack_initEnv(void) return rc; } + rc = adv_stack_initEnv(); + if (rc) { + return rc; + } + + rc = extAdv_stack_initEnv(); + if (rc) { + return rc; + } + + rc = sync_stack_initEnv(); + if (rc) { + return rc; + } + + #if DEFAULT_BT_LE_MAX_CONNECTIONS rc = conn_stack_initEnv(); if (rc) { @@ -109,7 +140,9 @@ void ble_stack_deinitEnv(void) #endif // CONFIG_BT_LE_ERROR_SIM_ENABLED conn_stack_deinitEnv(); #endif // DEFAULT_BT_LE_MAX_CONNECTIONS - + sync_stack_deinitEnv(); + extAdv_stack_deinitEnv(); + adv_stack_deinitEnv(); base_stack_deinitEnv(); } @@ -122,6 +155,21 @@ int ble_stack_enable(void) return rc; } + rc = adv_stack_enable(); + if (rc) { + return rc; + } + + rc = extAdv_stack_enable(); + if (rc) { + return rc; + } + + rc = sync_stack_enable(); + if (rc) { + return rc; + } + #if DEFAULT_BT_LE_MAX_CONNECTIONS rc = conn_stack_enable(); if (rc) { @@ -160,6 +208,8 @@ void ble_stack_disable(void) #endif // CONFIG_BT_LE_ERROR_SIM_ENABLED conn_stack_disable(); #endif // DEFAULT_BT_LE_MAX_CONNECTIONS - + sync_stack_disable(); + extAdv_stack_disable(); + adv_stack_disable(); base_stack_disable(); } From 25f219c6df5c244004d3b938bd31a042797ac9fb Mon Sep 17 00:00:00 2001 From: cjin Date: Fri, 4 Jul 2025 16:43:51 +0800 Subject: [PATCH 196/213] feat(ble): enable broker initialization on ESP32-C6 --- components/bt/controller/esp32c6/ble.c | 53 +++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/components/bt/controller/esp32c6/ble.c b/components/bt/controller/esp32c6/ble.c index a1eb137489c..14374c11a4f 100644 --- a/components/bt/controller/esp32c6/ble.c +++ b/components/bt/controller/esp32c6/ble.c @@ -22,6 +22,21 @@ void conn_stack_deinitEnv(void); int conn_stack_enable(void); void conn_stack_disable(void); +int adv_stack_initEnv(void); +void adv_stack_deinitEnv(void); +int adv_stack_enable(void); +void adv_stack_disable(void); + +int extAdv_stack_initEnv(void); +void extAdv_stack_deinitEnv(void); +int extAdv_stack_enable(void); +void extAdv_stack_disable(void); + +int sync_stack_initEnv(void); +void sync_stack_deinitEnv(void); +int sync_stack_enable(void); +void sync_stack_disable(void); + #if CONFIG_BT_LE_ERROR_SIM_ENABLED int conn_errorSim_initEnv(void); void conn_errorSim_deinitEnv(void); @@ -104,6 +119,21 @@ int ble_stack_initEnv(void) #endif // CONFIG_BT_LE_ERROR_SIM_ENABLED #endif // DEFAULT_BT_LE_MAX_CONNECTIONS + rc = adv_stack_initEnv(); + if (rc) { + return rc; + } + + rc = extAdv_stack_initEnv(); + if (rc) { + return rc; + } + + rc = sync_stack_initEnv(); + if (rc) { + return rc; + } + return 0; } @@ -116,6 +146,10 @@ void ble_stack_deinitEnv(void) conn_stack_deinitEnv(); #endif // DEFAULT_BT_LE_MAX_CONNECTIONS + + sync_stack_deinitEnv(); + extAdv_stack_deinitEnv(); + adv_stack_deinitEnv(); base_stack_deinitEnv(); } @@ -128,6 +162,21 @@ int ble_stack_enable(void) return rc; } + rc = adv_stack_enable(); + if (rc) { + return rc; + } + + rc = extAdv_stack_enable(); + if (rc) { + return rc; + } + + rc = sync_stack_enable(); + if (rc) { + return rc; + } + #if DEFAULT_BT_LE_MAX_CONNECTIONS rc = conn_stack_enable(); if (rc) { @@ -166,6 +215,8 @@ void ble_stack_disable(void) #endif // CONFIG_BT_LE_ERROR_SIM_ENABLED conn_stack_disable(); #endif // DEFAULT_BT_LE_MAX_CONNECTIONS - + sync_stack_disable(); + extAdv_stack_disable(); + adv_stack_disable(); base_stack_disable(); } From 815232ce12f943518a0be8231e7578a24a37d407 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Wed, 9 Jul 2025 11:30:13 +0800 Subject: [PATCH 197/213] fix(ble): updated rom linker script for ESP32-C2 --- .../esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld | 8 ++++---- components/esp_rom/esp32c2/ld/esp32c2.rom.ble.ld | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld b/components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld index a3373fec806..52b67bf7a44 100644 --- a/components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld +++ b/components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld @@ -41,7 +41,7 @@ r_ble_hci_trans_cfg_hs = 0x40000aec; r_ble_hci_trans_cfg_ll = 0x40000af0; r_ble_hci_trans_deinit = 0x40000af4; //r_ble_hci_trans_env_init = 0x40000af8; -r_ble_hci_trans_init = 0x40000afc; +//r_ble_hci_trans_init = 0x40000afc; r_ble_hci_uart_acl_tx = 0x40000b00; r_ble_hci_uart_cmdevt_tx = 0x40000b04; r_ble_hci_uart_config = 0x40000b08; @@ -767,7 +767,7 @@ r_ble_lll_rfmgmt_deinit = 0x4000164c; //r_ble_lll_rfmgmt_enable = 0x40001654; //r_ble_lll_rfmgmt_enable_now = 0x40001658; r_ble_lll_rfmgmt_init = 0x4000165c; -r_ble_lll_rfmgmt_is_enabled = 0x40001660; +//r_ble_lll_rfmgmt_is_enabled = 0x40001660; r_ble_lll_rfmgmt_release = 0x40001664; r_ble_lll_rfmgmt_release_ev = 0x40001668; r_ble_lll_rfmgmt_reset = 0x4000166c; @@ -785,7 +785,7 @@ r_ble_lll_scan_aux_data_free = 0x40001698; r_ble_lll_scan_chk_resume = 0x4000169c; r_ble_lll_scan_clean_cur_aux_data = 0x400016a0; //r_ble_lll_scan_coex_event_cb = 0x400016a4; -r_ble_lll_scan_common_init = 0x400016a8; +//r_ble_lll_scan_common_init = 0x400016a8; r_ble_lll_scan_deinit = 0x400016ac; r_ble_lll_scan_duration_period_timers_restart = 0x400016b0; r_ble_lll_scan_duration_period_timers_stop = 0x400016b4; @@ -1184,7 +1184,7 @@ r_ble_ll_conn_is_lru_compare_with_sync = 0x40002f88; r_ble_ll_conn_rollback_last_unmapped_chan = 0x40002f8c; //r_ble_ll_hci_vs_csa_set = 0x40002f90; r_ble_ll_hci_reset = 0x40002f94; -r_ble_ll_adv_status_check = 0x40002f98; +//r_ble_ll_adv_status_check = 0x40002f98; r_ble_ll_conn_status_check = 0x40002f9c; r_ble_ll_scan_status_check = 0x40002fa0; r_ble_ll_sync_status_check = 0x40002fa4; diff --git a/components/esp_rom/esp32c2/ld/esp32c2.rom.ble.ld b/components/esp_rom/esp32c2/ld/esp32c2.rom.ble.ld index 4f89f0b6384..9673a3aa298 100644 --- a/components/esp_rom/esp32c2/ld/esp32c2.rom.ble.ld +++ b/components/esp_rom/esp32c2/ld/esp32c2.rom.ble.ld @@ -34,7 +34,7 @@ r_ble_hci_trans_buf_alloc = 0x40000ae4; r_ble_hci_trans_buf_free = 0x40000ae8; r_ble_hci_trans_cfg_hs = 0x40000aec; r_ble_hci_trans_cfg_ll = 0x40000af0; -r_ble_hci_trans_init = 0x40000afc; +//r_ble_hci_trans_init = 0x40000afc; r_ble_hci_uart_acl_tx = 0x40000b00; r_ble_hci_uart_cmdevt_tx = 0x40000b04; r_ble_hci_uart_config = 0x40000b08; @@ -362,7 +362,7 @@ r_ble_ll_resolv_get_list = 0x40001160; r_ble_ll_resolv_get_priv_addr = 0x40001164; r_ble_ll_resolv_get_rpa_tmo = 0x40001168; r_ble_ll_resolv_irk_nonzero = 0x40001170; -r_ble_ll_resolv_list_add = 0x40001174; +//r_ble_ll_resolv_list_add = 0x40001174; r_ble_ll_resolv_list_chg_allowed = 0x40001178; r_ble_ll_resolv_list_clr = 0x4000117c; r_ble_ll_resolv_list_find = 0x40001180; @@ -510,7 +510,7 @@ r_ble_lll_adv_make_done = 0x40001438; r_ble_lll_adv_periodic_done = 0x4000143c; r_ble_lll_adv_periodic_event_done = 0x40001440; r_ble_lll_adv_periodic_rmvd_from_sched = 0x40001444; -r_ble_lll_adv_periodic_schedule_first = 0x40001448; +//r_ble_lll_adv_periodic_schedule_first = 0x40001448; r_ble_lll_adv_pri_schedule_tx_pdu = 0x40001458; r_ble_lll_adv_reschedule_event = 0x4000145c; r_ble_lll_adv_reschedule_periodic_event = 0x40001460; @@ -521,7 +521,7 @@ r_ble_lll_adv_sm_deinit = 0x40001478; r_ble_lll_adv_sm_event_init = 0x4000147c; r_ble_lll_adv_sm_event_restore = 0x40001480; r_ble_lll_adv_sm_event_store = 0x40001484; -r_ble_lll_adv_sm_init = 0x40001488; +//r_ble_lll_adv_sm_init = 0x40001488; r_ble_lll_adv_sm_reset = 0x4000148c; r_ble_lll_adv_start = 0x40001490; r_ble_lll_adv_stop = 0x40001494; @@ -609,7 +609,7 @@ r_ble_lll_per_adv_coex_dpc_update = 0x40001634; r_ble_lll_per_adv_coex_dpc_update_on_data_updated = 0x40001638; r_ble_lll_per_adv_coex_dpc_update_on_scheduled = 0x4000163c; r_ble_lll_per_adv_coex_dpc_update_on_start = 0x40001640; -r_ble_lll_rfmgmt_is_enabled = 0x40001660; +//r_ble_lll_rfmgmt_is_enabled = 0x40001660; //r_ble_lll_rfmgmt_release = 0x40001664; r_ble_lll_rfmgmt_scan_changed = 0x40001670; r_ble_lll_rfmgmt_sched_changed = 0x40001674; @@ -622,7 +622,7 @@ r_ble_lll_scan_abort_aux_sched = 0x40001694; r_ble_lll_scan_chk_resume = 0x4000169c; r_ble_lll_scan_clean_cur_aux_data = 0x400016a0; //r_ble_lll_scan_coex_event_cb = 0x400016a4; -r_ble_lll_scan_common_init = 0x400016a8; +//r_ble_lll_scan_common_init = 0x400016a8; r_ble_lll_scan_deinit = 0x400016ac; r_ble_lll_scan_duration_period_timers_restart = 0x400016b0; r_ble_lll_scan_duration_period_timers_stop = 0x400016b4; From b55b7188047fe457d9f35fd69b9629b4f1c61658 Mon Sep 17 00:00:00 2001 From: "C.S.M" Date: Mon, 30 Jun 2025 14:38:27 +0800 Subject: [PATCH 198/213] fix(i2c): Make i2c nack log as debug level --- components/esp_driver_i2c/i2c_master.c | 50 ++++++++++++++++---------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/components/esp_driver_i2c/i2c_master.c b/components/esp_driver_i2c/i2c_master.c index 8beb6555029..4cfb10fb284 100644 --- a/components/esp_driver_i2c/i2c_master.c +++ b/components/esp_driver_i2c/i2c_master.c @@ -14,7 +14,7 @@ #if CONFIG_I2C_ENABLE_DEBUG_LOG // The local log level must be defined before including esp_log.h // Set the maximum log level for this source file -#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG +#define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE #endif #include "esp_log.h" #include "esp_intr_alloc.h" @@ -157,7 +157,7 @@ static void s_i2c_err_log_print(i2c_master_event_t event, bool bypass_nack_log) } if (bypass_nack_log != true) { if (event == I2C_EVENT_NACK) { - ESP_LOGE(TAG, "I2C transaction unexpected nack detected"); + ESP_LOGD(TAG, "I2C transaction unexpected nack detected"); } } } @@ -507,7 +507,7 @@ static void s_i2c_send_commands(i2c_master_bus_handle_t i2c_master, TickType_t t } if (atomic_load(&i2c_master->status) == I2C_STATUS_ACK_ERROR) { - ESP_LOGE(TAG, "I2C hardware NACK detected"); + ESP_LOGD(TAG, "I2C hardware NACK detected"); const i2c_ll_hw_cmd_t hw_stop_cmd = { .op_code = I2C_LL_CMD_STOP, }; @@ -942,7 +942,10 @@ static esp_err_t s_i2c_synchronous_transaction(i2c_master_dev_handle_t i2c_dev, i2c_dev->master_bus->trans_finish = false; i2c_dev->master_bus->queue_trans = false; i2c_dev->master_bus->ack_check_disable = i2c_dev->ack_check_disable; - ESP_GOTO_ON_ERROR(s_i2c_transaction_start(i2c_dev, timeout_ms), err, TAG, "I2C transaction failed"); + ret = s_i2c_transaction_start(i2c_dev, timeout_ms); + if (ret != ESP_OK) { + goto err; + } xSemaphoreGive(i2c_dev->master_bus->bus_lock_mux); return ret; @@ -955,9 +958,6 @@ err: esp_err_t i2c_new_master_bus(const i2c_master_bus_config_t *bus_config, i2c_master_bus_handle_t *ret_bus_handle) { -#if CONFIG_I2C_ENABLE_DEBUG_LOG - esp_log_level_set(TAG, ESP_LOG_DEBUG); -#endif esp_err_t ret = ESP_OK; i2c_master_bus_t *i2c_master = NULL; i2c_port_num_t i2c_port_num = bus_config->i2c_port; @@ -1187,6 +1187,7 @@ esp_err_t i2c_master_multi_buffer_transmit(i2c_master_dev_handle_t i2c_dev, i2c_ ESP_RETURN_ON_FALSE(array_size <= (SOC_I2C_CMD_REG_NUM - 2), ESP_ERR_INVALID_ARG, TAG, "i2c command list cannot contain so many commands"); ESP_RETURN_ON_FALSE(buffer_info_array != NULL, ESP_ERR_INVALID_ARG, TAG, "buffer info array is empty"); + esp_err_t ret = ESP_OK; size_t op_index = 0; i2c_operation_t i2c_ops[SOC_I2C_CMD_REG_NUM] = {}; i2c_ops[op_index++].hw_cmd.op_code = I2C_LL_CMD_RESTART; @@ -1204,11 +1205,11 @@ esp_err_t i2c_master_multi_buffer_transmit(i2c_master_dev_handle_t i2c_dev, i2c_ i2c_ops[op_index++].hw_cmd.op_code = I2C_LL_CMD_STOP; if (i2c_dev->master_bus->async_trans == false) { - ESP_RETURN_ON_ERROR(s_i2c_synchronous_transaction(i2c_dev, i2c_ops, op_index, xfer_timeout_ms), TAG, "I2C transaction failed"); + ret = s_i2c_synchronous_transaction(i2c_dev, i2c_ops, op_index, xfer_timeout_ms); } else { - ESP_RETURN_ON_ERROR(s_i2c_asynchronous_transaction(i2c_dev, i2c_ops, op_index, xfer_timeout_ms), TAG, "I2C transaction failed"); + ret = s_i2c_asynchronous_transaction(i2c_dev, i2c_ops, op_index, xfer_timeout_ms); } - return ESP_OK; + return ret; } esp_err_t i2c_master_transmit(i2c_master_dev_handle_t i2c_dev, const uint8_t *write_buffer, size_t write_size, int xfer_timeout_ms) @@ -1228,6 +1229,7 @@ esp_err_t i2c_master_transmit_receive(i2c_master_dev_handle_t i2c_dev, const uin ESP_RETURN_ON_FALSE((write_buffer != NULL) && (write_size > 0), ESP_ERR_INVALID_ARG, TAG, "i2c transmit buffer or size invalid"); ESP_RETURN_ON_FALSE((read_buffer != NULL) && (read_size > 0), ESP_ERR_INVALID_ARG, TAG, "i2c receive buffer or size invalid"); + esp_err_t ret = ESP_OK; i2c_operation_t i2c_ops[] = { {.hw_cmd = I2C_TRANS_START_COMMAND}, {.hw_cmd = I2C_TRANS_WRITE_COMMAND(i2c_dev->ack_check_disable ? false : true), .data = (uint8_t *)write_buffer, .total_bytes = write_size}, @@ -1238,17 +1240,18 @@ esp_err_t i2c_master_transmit_receive(i2c_master_dev_handle_t i2c_dev, const uin }; if (i2c_dev->master_bus->async_trans == false) { - ESP_RETURN_ON_ERROR(s_i2c_synchronous_transaction(i2c_dev, i2c_ops, DIM(i2c_ops), xfer_timeout_ms), TAG, "I2C transaction failed"); + ret = s_i2c_synchronous_transaction(i2c_dev, i2c_ops, DIM(i2c_ops), xfer_timeout_ms); } else { - ESP_RETURN_ON_ERROR(s_i2c_asynchronous_transaction(i2c_dev, i2c_ops, DIM(i2c_ops), xfer_timeout_ms), TAG, "I2C transaction failed"); + ret = s_i2c_asynchronous_transaction(i2c_dev, i2c_ops, DIM(i2c_ops), xfer_timeout_ms); } - return ESP_OK; + return ret; } esp_err_t i2c_master_receive(i2c_master_dev_handle_t i2c_dev, uint8_t *read_buffer, size_t read_size, int xfer_timeout_ms) { ESP_RETURN_ON_FALSE(i2c_dev != NULL, ESP_ERR_INVALID_ARG, TAG, "i2c handle not initialized"); ESP_RETURN_ON_FALSE((read_buffer != NULL) && (read_size > 0), ESP_ERR_INVALID_ARG, TAG, "i2c receive buffer or size invalid"); + esp_err_t ret = ESP_OK; i2c_operation_t i2c_ops[] = { {.hw_cmd = I2C_TRANS_START_COMMAND}, @@ -1258,11 +1261,11 @@ esp_err_t i2c_master_receive(i2c_master_dev_handle_t i2c_dev, uint8_t *read_buff }; if (i2c_dev->master_bus->async_trans == false) { - ESP_RETURN_ON_ERROR(s_i2c_synchronous_transaction(i2c_dev, i2c_ops, DIM(i2c_ops), xfer_timeout_ms), TAG, "I2C transaction failed"); + ret = s_i2c_synchronous_transaction(i2c_dev, i2c_ops, DIM(i2c_ops), xfer_timeout_ms); } else { - ESP_RETURN_ON_ERROR(s_i2c_asynchronous_transaction(i2c_dev, i2c_ops, DIM(i2c_ops), xfer_timeout_ms), TAG, "I2C transaction failed"); + ret = s_i2c_asynchronous_transaction(i2c_dev, i2c_ops, DIM(i2c_ops), xfer_timeout_ms); } - return ESP_OK; + return ret; } esp_err_t i2c_master_probe(i2c_master_bus_handle_t bus_handle, uint16_t address, int xfer_timeout_ms) @@ -1327,6 +1330,7 @@ esp_err_t i2c_master_execute_defined_operations(i2c_master_dev_handle_t i2c_dev, ESP_RETURN_ON_FALSE(i2c_operation != NULL, ESP_ERR_INVALID_ARG, TAG, "i2c operation pointer is invalid"); ESP_RETURN_ON_FALSE(operation_list_num <= (SOC_I2C_CMD_REG_NUM), ESP_ERR_INVALID_ARG, TAG, "i2c command list cannot contain so many commands"); + esp_err_t ret = ESP_OK; i2c_operation_t i2c_ops[operation_list_num]; memset(i2c_ops, 0, sizeof(i2c_ops)); for (int i = 0; i < operation_list_num; i++) { @@ -1363,11 +1367,11 @@ esp_err_t i2c_master_execute_defined_operations(i2c_master_dev_handle_t i2c_dev, } if (i2c_dev->master_bus->async_trans == false) { - ESP_RETURN_ON_ERROR(s_i2c_synchronous_transaction(i2c_dev, i2c_ops, operation_list_num, xfer_timeout_ms), TAG, "I2C transaction failed"); + ret = s_i2c_synchronous_transaction(i2c_dev, i2c_ops, operation_list_num, xfer_timeout_ms); } else { - ESP_RETURN_ON_ERROR(s_i2c_asynchronous_transaction(i2c_dev, i2c_ops, operation_list_num, xfer_timeout_ms), TAG, "I2C transaction failed"); + ret = s_i2c_asynchronous_transaction(i2c_dev, i2c_ops, operation_list_num, xfer_timeout_ms); } - return ESP_OK; + return ret; } esp_err_t i2c_master_register_event_callbacks(i2c_master_dev_handle_t i2c_dev, const i2c_master_event_callbacks_t *cbs, void *user_data) @@ -1410,3 +1414,11 @@ esp_err_t i2c_master_bus_wait_all_done(i2c_master_bus_handle_t bus_handle, int t return ESP_OK; } + +#if CONFIG_I2C_ENABLE_DEBUG_LOG +__attribute__((constructor)) +static void i2c_master_override_default_log_level(void) +{ + esp_log_level_set(TAG, ESP_LOG_VERBOSE); +} +#endif From d77dc39bb22f0285a273e31a9a642c327a3e8c69 Mon Sep 17 00:00:00 2001 From: "C.S.M" Date: Wed, 21 May 2025 12:04:23 +0800 Subject: [PATCH 199/213] fix(i2c): Add gpio reserve check on i2c driver, Closes https://github.com/espressif/esp-idf/issues/15995 --- components/esp_driver_i2c/i2c_common.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/components/esp_driver_i2c/i2c_common.c b/components/esp_driver_i2c/i2c_common.c index 12a452d5504..01c506c55ec 100644 --- a/components/esp_driver_i2c/i2c_common.c +++ b/components/esp_driver_i2c/i2c_common.c @@ -27,6 +27,7 @@ #include "esp_clk_tree.h" #include "clk_ctrl_os.h" #include "esp_private/gpio.h" +#include "esp_private/esp_gpio_reserve.h" #if SOC_LP_I2C_SUPPORTED #include "hal/rtc_io_ll.h" #include "driver/rtc_io.h" @@ -318,6 +319,17 @@ static esp_err_t s_hp_i2c_pins_config(i2c_bus_handle_t handle) { int port_id = handle->port_num; + // reserve the GPIO output path, because we don't expect another peripheral to signal to the same GPIO + uint64_t old_gpio_rsv_mask = esp_gpio_reserve(BIT64(handle->sda_num) | BIT64(handle->scl_num)); + // check if the GPIO is already used by others + if (old_gpio_rsv_mask & BIT64(handle->sda_num)) { + ESP_LOGW(TAG, "GPIO %d is not usable, maybe conflict with others", handle->sda_num); + } + // check if the GPIO is already used by others + if (old_gpio_rsv_mask & BIT64(handle->scl_num)) { + ESP_LOGW(TAG, "GPIO %d is not usable, maybe conflict with others", handle->scl_num); + } + // SDA pin configurations ESP_RETURN_ON_ERROR(gpio_set_level(handle->sda_num, 1), TAG, "i2c sda pin set level failed"); gpio_input_enable(handle->sda_num); @@ -356,6 +368,17 @@ static esp_err_t s_lp_i2c_pins_config(i2c_bus_handle_t handle) ESP_RETURN_ON_ERROR(!rtc_gpio_is_valid_gpio(handle->sda_num), TAG, "LP I2C SDA GPIO invalid"); ESP_RETURN_ON_ERROR(!rtc_gpio_is_valid_gpio(handle->scl_num), TAG, "LP I2C SCL GPIO invalid"); + // reserve the GPIO output path, because we don't expect another peripheral to signal to the same GPIO + uint64_t old_gpio_rsv_mask = esp_gpio_reserve(BIT64(handle->sda_num) | BIT64(handle->scl_num)); + // check if the GPIO is already used by others + if (old_gpio_rsv_mask & BIT64(handle->sda_num)) { + ESP_LOGW(TAG, "GPIO %d is not usable, maybe conflict with others", handle->sda_num); + } + // check if the GPIO is already used by others + if (old_gpio_rsv_mask & BIT64(handle->scl_num)) { + ESP_LOGW(TAG, "GPIO %d is not usable, maybe conflict with others", handle->scl_num); + } + #if !SOC_LP_GPIO_MATRIX_SUPPORTED /* Verify that the SDA and SCL line belong to the LP IO Mux I2C function group */ ESP_RETURN_ON_FALSE((handle->sda_num == LP_I2C_SDA_IOMUX_PAD), ESP_ERR_INVALID_ARG, TAG, LP_I2C_SDA_PIN_ERR_LOG); @@ -418,6 +441,9 @@ esp_err_t i2c_common_deinit_pins(i2c_bus_handle_t handle) { int port_id = handle->port_num; + esp_gpio_revoke(BIT64(handle->sda_num)); + esp_gpio_revoke(BIT64(handle->scl_num)); + if (handle->is_lp_i2c == false) { ESP_RETURN_ON_ERROR(gpio_output_disable(handle->sda_num), TAG, "disable i2c pins failed"); esp_rom_gpio_connect_in_signal(GPIO_MATRIX_CONST_ZERO_INPUT, i2c_periph_signal[port_id].sda_in_sig, 0); From e4756b3a9faa4d10ec073d70ec6e2f76094c05cf Mon Sep 17 00:00:00 2001 From: Rahul Tank Date: Tue, 8 Jul 2025 15:33:20 +0530 Subject: [PATCH 200/213] fix(nimble): Add a way to make blufi advertising customizable Based on changes in https://github.com/espressif/esp-idf/pull/8958 --- .../common/btc/profile/esp/blufi/nimble_host/esp_blufi.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/components/bt/common/btc/profile/esp/blufi/nimble_host/esp_blufi.c b/components/bt/common/btc/profile/esp/blufi/nimble_host/esp_blufi.c index d40a4f4cf27..bf0c2b7ab0a 100644 --- a/components/bt/common/btc/profile/esp/blufi/nimble_host/esp_blufi.c +++ b/components/bt/common/btc/profile/esp/blufi/nimble_host/esp_blufi.c @@ -298,7 +298,7 @@ int esp_blufi_gatt_svr_deinit(void) return 0; } -static int +int esp_blufi_gap_event(struct ble_gap_event *event, void *arg) { struct ble_gap_conn_desc desc; @@ -331,7 +331,7 @@ esp_blufi_gap_event(struct ble_gap_event *event, void *arg) } if (event->connect.status != 0) { /* Connection failed; resume advertising. */ - esp_blufi_adv_start(); + ((void(*)(void))arg)(); } return 0; case BLE_GAP_EVENT_DISCONNECT: @@ -366,7 +366,7 @@ esp_blufi_gap_event(struct ble_gap_event *event, void *arg) case BLE_GAP_EVENT_ADV_COMPLETE: ESP_LOGI(TAG, "advertise complete; reason=%d", event->adv_complete.reason); - esp_blufi_adv_start(); + ((void(*)(void))arg)(); return 0; case BLE_GAP_EVENT_SUBSCRIBE: @@ -461,7 +461,7 @@ void esp_blufi_adv_start(void) adv_params.conn_mode = BLE_GAP_CONN_MODE_UND; adv_params.disc_mode = BLE_GAP_DISC_MODE_GEN; rc = ble_gap_adv_start(own_addr_type, NULL, BLE_HS_FOREVER, - &adv_params, esp_blufi_gap_event, NULL); + &adv_params, esp_blufi_gap_event, esp_blufi_adv_start); if (rc != 0) { ESP_LOGE(TAG, "error enabling advertisement; rc=%d", rc); return; From d8e73e94f2d13ba32afb9f996450b9385dfeeee8 Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Tue, 8 Jul 2025 16:58:31 +0800 Subject: [PATCH 201/213] fix(esp_hw_support): fix esp32 APP_CPU accessing RTCFAST memory in sleep code Closes https://github.com/espressif/esp-idf/issues/16243 --- components/esp_hw_support/sleep_modes.c | 28 ++++++++++++------- .../deep_sleep/main/deep_sleep_example_main.c | 4 +-- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index 230672967b9..7d25c4314fa 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -291,8 +291,9 @@ static bool s_light_sleep_wakeup = false; static portMUX_TYPE spinlock_rtc_deep_sleep = portMUX_INITIALIZER_UNLOCKED; static const char *TAG = "sleep"; -static RTC_FAST_ATTR int32_t s_sleep_sub_mode_ref_cnt[ESP_SLEEP_MODE_MAX] = { 0 }; -//in this mode, 2uA is saved, but RTC memory can't use at high temperature, and RTCIO can't be used as INPUT. + +/* APP core of esp32 can't access to RTC FAST MEMORY, do not define it with RTC_IRAM_ATTR */ +RTC_SLOW_ATTR static int32_t s_sleep_sub_mode_ref_cnt[ESP_SLEEP_MODE_MAX] = { 0 }; void esp_sleep_overhead_out_time_refresh(void) { @@ -385,12 +386,12 @@ esp_deep_sleep_wake_stub_fn_t esp_get_deep_sleep_wake_stub(void) } #if CONFIG_IDF_TARGET_ESP32 -/* APP core of esp32 can't access to RTC FAST MEMORY, do not define it with RTC_IRAM_ATTR */ -void +/* APP core of esp32 can't access to RTC FAST MEMORY, link to RTC SLOW MEMORY instead*/ +RTC_SLOW_ATTR #else -void RTC_IRAM_ATTR +RTC_IRAM_ATTR #endif -esp_set_deep_sleep_wake_stub(esp_deep_sleep_wake_stub_fn_t new_stub) +void esp_set_deep_sleep_wake_stub(esp_deep_sleep_wake_stub_fn_t new_stub) { #if SOC_PM_SUPPORT_DEEPSLEEP_CHECK_STUB_ONLY wake_stub_fn_handler = new_stub; @@ -399,7 +400,14 @@ esp_set_deep_sleep_wake_stub(esp_deep_sleep_wake_stub_fn_t new_stub) #endif } -void RTC_IRAM_ATTR esp_default_wake_deep_sleep(void) + +#if CONFIG_IDF_TARGET_ESP32 +/* APP core of esp32 can't access to RTC FAST MEMORY, link to RTC SLOW MEMORY instead*/ +RTC_SLOW_ATTR +#else +RTC_IRAM_ATTR +#endif +void esp_default_wake_deep_sleep(void) { /* Clear MMU for CPU 0 */ #if CONFIG_IDF_TARGET_ESP32 @@ -2565,11 +2573,11 @@ static uint32_t get_sleep_flags(uint32_t sleep_flags, bool deepsleep) #if CONFIG_IDF_TARGET_ESP32 /* APP core of esp32 can't access to RTC FAST MEMORY, do not define it with RTC_IRAM_ATTR */ -void +RTC_SLOW_ATTR #else -void RTC_IRAM_ATTR +RTC_IRAM_ATTR #endif -esp_deep_sleep_disable_rom_logging(void) +void esp_deep_sleep_disable_rom_logging(void) { rtc_suppress_rom_log(); } diff --git a/examples/system/deep_sleep/main/deep_sleep_example_main.c b/examples/system/deep_sleep/main/deep_sleep_example_main.c index d46a5c1ac29..7c1de515805 100644 --- a/examples/system/deep_sleep/main/deep_sleep_example_main.c +++ b/examples/system/deep_sleep/main/deep_sleep_example_main.c @@ -19,9 +19,7 @@ #include "deep_sleep_example.h" #if SOC_RTC_FAST_MEM_SUPPORTED -static RTC_DATA_ATTR struct timeval sleep_enter_time; -#else -static struct timeval sleep_enter_time; +RTC_SLOW_ATTR static struct timeval sleep_enter_time; #endif static void deep_sleep_task(void *args) From ea314e9dd92eda108a3d2eeb1c24c6cbbf7a4c00 Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Tue, 8 Jul 2025 21:02:08 +0800 Subject: [PATCH 202/213] feat(esp_hw_support): add core1 enter deepsleep test case --- .../rtc_8md256/main/test_rtc_8md256.c | 25 +++++++++++++++++++ .../deep_sleep/main/deep_sleep_example_main.c | 2 -- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/components/esp_hw_support/test_apps/rtc_8md256/main/test_rtc_8md256.c b/components/esp_hw_support/test_apps/rtc_8md256/main/test_rtc_8md256.c index 3831015833a..220a65a5c0b 100644 --- a/components/esp_hw_support/test_apps/rtc_8md256/main/test_rtc_8md256.c +++ b/components/esp_hw_support/test_apps/rtc_8md256/main/test_rtc_8md256.c @@ -6,6 +6,7 @@ #include #include +#include #include "esp_sleep.h" #include "unity.h" #include "unity_test_utils.h" @@ -38,6 +39,30 @@ TEST_CASE("Can use 8MD256 as RTC clock source in deepsleep", "[pm]") test_deepsleep(false); } +static void check_reset_reason_deep_sleep(void) +{ + TEST_ASSERT_EQUAL(ESP_RST_DEEPSLEEP, esp_reset_reason()); +} + +static void enter_deepsleep_by_core1(void *args) +{ + do { + test_deepsleep(false); + } while (1); +} + +static void request_core1_do_deepsleep(void) +{ + fflush(stdout); + fsync(fileno(stdout)); + xTaskCreatePinnedToCore(enter_deepsleep_by_core1, "deep_sleep_task", 4096, NULL, 6, NULL, 1); + while(1); +} + +TEST_CASE_MULTIPLE_STAGES("Can use 8MD256 as RTC clock source in deepsleep (enter sleep by core1)", "[pm]", + request_core1_do_deepsleep, + check_reset_reason_deep_sleep); + static void test_lightsleep(bool force_rtc_periph) { esp_sleep_enable_timer_wakeup(2000000); diff --git a/examples/system/deep_sleep/main/deep_sleep_example_main.c b/examples/system/deep_sleep/main/deep_sleep_example_main.c index 7c1de515805..ae3579956bb 100644 --- a/examples/system/deep_sleep/main/deep_sleep_example_main.c +++ b/examples/system/deep_sleep/main/deep_sleep_example_main.c @@ -18,9 +18,7 @@ #include "nvs.h" #include "deep_sleep_example.h" -#if SOC_RTC_FAST_MEM_SUPPORTED RTC_SLOW_ATTR static struct timeval sleep_enter_time; -#endif static void deep_sleep_task(void *args) { From 68d8b1e7ca40fb5e8d8ae4c169157e409b12dbaa Mon Sep 17 00:00:00 2001 From: "tarun.kumar" Date: Sun, 1 Dec 2024 15:54:11 +0530 Subject: [PATCH 203/213] fix(softAP): Adjusted authentication mode for wpa-eap version 1 --- components/esp_wifi/include/esp_wifi_types_generic.h | 7 ++++--- components/esp_wifi/lib | 2 +- components/wpa_supplicant/src/rsn_supp/wpa.c | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/components/esp_wifi/include/esp_wifi_types_generic.h b/components/esp_wifi/include/esp_wifi_types_generic.h index 3204661dc24..18f936540e9 100644 --- a/components/esp_wifi/include/esp_wifi_types_generic.h +++ b/components/esp_wifi/include/esp_wifi_types_generic.h @@ -76,7 +76,7 @@ typedef struct { * @brief Wi-Fi authmode type * Strength of authmodes * Personal Networks : OPEN < WEP < WPA_PSK < OWE < WPA2_PSK = WPA_WPA2_PSK < WAPI_PSK < WPA3_PSK = WPA2_WPA3_PSK = DPP - * Enterprise Networks : WIFI_AUTH_WPA2_ENTERPRISE < WIFI_AUTH_WPA3_ENTERPRISE = WIFI_AUTH_WPA2_WPA3_ENTERPRISE < WIFI_AUTH_WPA3_ENT_192 + * Enterprise Networks : WIFI_AUTH_WPA_ENTERPRISE < WIFI_AUTH_WPA2_ENTERPRISE < WIFI_AUTH_WPA3_ENTERPRISE = WIFI_AUTH_WPA2_WPA3_ENTERPRISE < WIFI_AUTH_WPA3_ENT_192 */ typedef enum { WIFI_AUTH_OPEN = 0, /**< Authenticate mode : open */ @@ -84,8 +84,8 @@ typedef enum { WIFI_AUTH_WPA_PSK, /**< Authenticate mode : WPA_PSK */ WIFI_AUTH_WPA2_PSK, /**< Authenticate mode : WPA2_PSK */ WIFI_AUTH_WPA_WPA2_PSK, /**< Authenticate mode : WPA_WPA2_PSK */ - WIFI_AUTH_ENTERPRISE, /**< Authenticate mode : Wi-Fi EAP security */ - WIFI_AUTH_WPA2_ENTERPRISE = WIFI_AUTH_ENTERPRISE, /**< Authenticate mode : Wi-Fi EAP security */ + WIFI_AUTH_ENTERPRISE, /**< Authenticate mode : Wi-Fi EAP security, treated the same as WIFI_AUTH_WPA2_ENTERPRISE */ + WIFI_AUTH_WPA2_ENTERPRISE = WIFI_AUTH_ENTERPRISE, /**< Authenticate mode : WPA2-Enterprise security */ WIFI_AUTH_WPA3_PSK, /**< Authenticate mode : WPA3_PSK */ WIFI_AUTH_WPA2_WPA3_PSK, /**< Authenticate mode : WPA2_WPA3_PSK */ WIFI_AUTH_WAPI_PSK, /**< Authenticate mode : WAPI_PSK */ @@ -96,6 +96,7 @@ typedef enum { WIFI_AUTH_DPP, /**< Authenticate mode : DPP */ WIFI_AUTH_WPA3_ENTERPRISE, /**< Authenticate mode : WPA3-Enterprise Only Mode */ WIFI_AUTH_WPA2_WPA3_ENTERPRISE, /**< Authenticate mode : WPA3-Enterprise Transition Mode */ + WIFI_AUTH_WPA_ENTERPRISE, /**< Authenticate mode : WPA-Enterprise security */ WIFI_AUTH_MAX } wifi_auth_mode_t; diff --git a/components/esp_wifi/lib b/components/esp_wifi/lib index 2b5492b9f1b..4cf46685bfe 160000 --- a/components/esp_wifi/lib +++ b/components/esp_wifi/lib @@ -1 +1 @@ -Subproject commit 2b5492b9f1b940d06f9d2636fa29279a9db4702d +Subproject commit 4cf46685bfe468a866eb38a52ad45a0aecad028b diff --git a/components/wpa_supplicant/src/rsn_supp/wpa.c b/components/wpa_supplicant/src/rsn_supp/wpa.c index 020e555cb1a..788b05e42b6 100644 --- a/components/wpa_supplicant/src/rsn_supp/wpa.c +++ b/components/wpa_supplicant/src/rsn_supp/wpa.c @@ -2261,7 +2261,7 @@ void wpa_set_profile(u32 wpa_proto, u8 auth_mode) struct wpa_sm *sm = &gWpaSm; sm->proto = wpa_proto; - if (auth_mode == WPA2_AUTH_ENT) { + if (auth_mode == WPA2_AUTH_ENT || (auth_mode == WPA_AUTH_UNSPEC)) { sm->key_mgmt = WPA_KEY_MGMT_IEEE8021X; /* for wpa2 enterprise */ } else if (auth_mode == WPA2_AUTH_ENT_SHA256) { sm->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256; /* for wpa2 enterprise sha256 */ From 5fe513cd18c27753301b1088e6868af0c1209d63 Mon Sep 17 00:00:00 2001 From: Marek Fiala Date: Mon, 7 Jul 2025 15:20:38 +0200 Subject: [PATCH 204/213] feat(tools): Added encoding when special characters used with username Closes https://github.com/espressif/esp-idf/issues/16229 --- tools/export_utils/shell_types.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tools/export_utils/shell_types.py b/tools/export_utils/shell_types.py index 82e3df61c14..112ede5755b 100644 --- a/tools/export_utils/shell_types.py +++ b/tools/export_utils/shell_types.py @@ -1,5 +1,6 @@ # SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 +import base64 import getpass import os import re @@ -33,7 +34,15 @@ class Shell(): self.new_esp_idf_env = new_esp_idf_env try: - self.tmp_dir_path = Path(gettempdir()) / ('esp_idf_activate_' + getpass.getuser()) + username = getpass.getuser() + username_safe = ( + # If username contains special characters, base64-encode it + base64.urlsafe_b64encode(username.encode('utf-8')).decode('ascii').rstrip('=') + # Find characters that are not ASCII alphanumeric, dot, or dash + if re.search(r'[^\w.-]', username, flags=re.ASCII) + else username + ) + self.tmp_dir_path = Path(gettempdir()) / f'esp_idf_activate_{username_safe}' except Exception as e: self.tmp_dir_path = Path(gettempdir()) / 'esp_idf_activate' warn(f'Failed to get username with error: {e}. Using default temporary directory {self.tmp_dir_path}.') From 99eb1ced8e990bca5f608adc33c6e7fe8a667219 Mon Sep 17 00:00:00 2001 From: zhangyanjiao Date: Mon, 14 Jul 2025 19:52:11 +0800 Subject: [PATCH 205/213] fix(wifi): fix duplicated offchan error, add coex wifi event imm --- components/esp_coex/lib | 2 +- components/esp_wifi/lib | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/esp_coex/lib b/components/esp_coex/lib index cb6667841f6..c62361f19c9 160000 --- a/components/esp_coex/lib +++ b/components/esp_coex/lib @@ -1 +1 @@ -Subproject commit cb6667841f63457246d56a9170f3409917e9d5a8 +Subproject commit c62361f19c98a448255b53f8d31d3a23597e01e3 diff --git a/components/esp_wifi/lib b/components/esp_wifi/lib index 4cf46685bfe..2b0789ab329 160000 --- a/components/esp_wifi/lib +++ b/components/esp_wifi/lib @@ -1 +1 @@ -Subproject commit 4cf46685bfe468a866eb38a52ad45a0aecad028b +Subproject commit 2b0789ab329f622eea43117459126391ac5546c5 From 7c818e81dfb5b870514398f402115f395c4bdd83 Mon Sep 17 00:00:00 2001 From: Euripedes Rocha Date: Mon, 7 Jul 2025 11:10:22 +0200 Subject: [PATCH 206/213] fix(mqtt): Adds sdkconfig to use test broker Changes the configuration to make test to use internal broker on CI runs. --- components/mqtt/test_apps/test_mqtt/sdkconfig.ci.default | 4 ++++ components/mqtt/test_apps/test_mqtt5/sdkconfig.ci.default | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 components/mqtt/test_apps/test_mqtt/sdkconfig.ci.default create mode 100644 components/mqtt/test_apps/test_mqtt5/sdkconfig.ci.default diff --git a/components/mqtt/test_apps/test_mqtt/sdkconfig.ci.default b/components/mqtt/test_apps/test_mqtt/sdkconfig.ci.default new file mode 100644 index 00000000000..1d40815a9d8 --- /dev/null +++ b/components/mqtt/test_apps/test_mqtt/sdkconfig.ci.default @@ -0,0 +1,4 @@ +CONFIG_MQTT_TEST_BROKER_URI="mqtt://${EXAMPLE_MQTT_BROKER_TCP}" +CONFIG_MQTT5_TEST_BROKER_URI="mqtt://${EXAMPLE_MQTT_BROKER_TCP}" +CONFIG_ESP_TASK_WDT_EN=n +CONFIG_UNITY_ENABLE_FIXTURE=y diff --git a/components/mqtt/test_apps/test_mqtt5/sdkconfig.ci.default b/components/mqtt/test_apps/test_mqtt5/sdkconfig.ci.default new file mode 100644 index 00000000000..1d40815a9d8 --- /dev/null +++ b/components/mqtt/test_apps/test_mqtt5/sdkconfig.ci.default @@ -0,0 +1,4 @@ +CONFIG_MQTT_TEST_BROKER_URI="mqtt://${EXAMPLE_MQTT_BROKER_TCP}" +CONFIG_MQTT5_TEST_BROKER_URI="mqtt://${EXAMPLE_MQTT_BROKER_TCP}" +CONFIG_ESP_TASK_WDT_EN=n +CONFIG_UNITY_ENABLE_FIXTURE=y From b7ab27341ec9cc6ec31922eb9ecc780c28f84b06 Mon Sep 17 00:00:00 2001 From: Vincent Hamp Date: Sat, 12 Apr 2025 13:31:57 +0200 Subject: [PATCH 207/213] fix(esp_http_server): WebSocket frame parsing errors Fixes the Websocket frame pasring error, by making sure that two bytes are read compulsary for length bytes 126. Closes https://github.com/espressif/esp-idf/pull/15767 Closes https://github.com/espressif/esp-idf/issues/15235 --- .../esp_http_server/src/esp_httpd_priv.h | 28 +++++++++--- components/esp_http_server/src/httpd_txrx.c | 43 +++++++++++-------- components/esp_http_server/src/httpd_ws.c | 14 +++--- 3 files changed, 53 insertions(+), 32 deletions(-) diff --git a/components/esp_http_server/src/esp_httpd_priv.h b/components/esp_http_server/src/esp_httpd_priv.h index e56418236ee..33af33c1525 100644 --- a/components/esp_http_server/src/esp_httpd_priv.h +++ b/components/esp_http_server/src/esp_httpd_priv.h @@ -132,6 +132,15 @@ struct httpd_data { httpd_err_handler_func_t *err_handler_fns; }; +/** + * @brief Options for receiving HTTP request data + */ +typedef enum { + HTTPD_RECV_OPT_NONE = 0, + HTTPD_RECV_OPT_HALT_AFTER_PENDING = 1, /*!< Halt immediately after receiving from pending buffer */ + HTTPD_RECV_OPT_BLOCKING = 2, /*!< Receive blocking (don't return partial length) */ +} httpd_recv_opt_t; + /******************* Group : Session Management ********************/ /** @name Session Management * Functions related to HTTP session management @@ -422,22 +431,27 @@ int httpd_send(httpd_req_t *req, const char *buf, size_t buf_len); * * @note The exposed API httpd_recv() is simply this function with last parameter * set as false. This function is used internally during reception and - * processing of a new request. The option to halt after receiving pending - * data prevents the server from requesting more data than is needed for - * completing a packet in case when all the remaining part of the packet is - * in the pending buffer. + * processing of a new request. + * + * There are 2 options available that affect the behavior of the function: + * - HTTPD_RECV_OPT_HALT_AFTER_PENDING + * The option to halt after receiving pending data prevents the server from + * requesting more data than is needed for completing a packet in case when + * all the remaining part of the packet is in the pending buffer. + * + * - HTTPD_RECV_OPT_BLOCKING + * The option to not return until the `buf_len` bytes have been read. * * @param[in] req Pointer to new HTTP request which only has the socket descriptor * @param[out] buf Pointer to the buffer which will be filled with the received data * @param[in] buf_len Length of the buffer - * @param[in] halt_after_pending When set true, halts immediately after receiving from - * pending buffer + * @param[in] opt Receive option * * @return * - Length of data : if successful * - ESP_FAIL : if failed */ -int httpd_recv_with_opt(httpd_req_t *r, char *buf, size_t buf_len, bool halt_after_pending); +int httpd_recv_with_opt(httpd_req_t *r, char *buf, size_t buf_len, httpd_recv_opt_t opt); /** * @brief For un-receiving HTTP request data diff --git a/components/esp_http_server/src/httpd_txrx.c b/components/esp_http_server/src/httpd_txrx.c index fa50378f69e..1ca2165d71c 100644 --- a/components/esp_http_server/src/httpd_txrx.c +++ b/components/esp_http_server/src/httpd_txrx.c @@ -95,7 +95,7 @@ static size_t httpd_recv_pending(httpd_req_t *r, char *buf, size_t buf_len) return buf_len; } -int httpd_recv_with_opt(httpd_req_t *r, char *buf, size_t buf_len, bool halt_after_pending) +int httpd_recv_with_opt(httpd_req_t *r, char *buf, size_t buf_len, httpd_recv_opt_t opt) { ESP_LOGD(TAG, LOG_FMT("requested length = %"NEWLIB_NANO_COMPAT_FORMAT), NEWLIB_NANO_COMPAT_CAST(buf_len)); @@ -112,34 +112,41 @@ int httpd_recv_with_opt(httpd_req_t *r, char *buf, size_t buf_len, bool halt_aft /* If buffer filled then no need to recv. * If asked to halt after receiving pending data then * return with received length */ - if (!buf_len || halt_after_pending) { + if (!buf_len || opt == HTTPD_RECV_OPT_HALT_AFTER_PENDING) { return pending_len; } } /* Receive data of remaining length */ - int ret = ra->sd->recv_fn(ra->sd->handle, ra->sd->fd, buf, buf_len, 0); - if (ret < 0) { - ESP_LOGD(TAG, LOG_FMT("error in recv_fn")); - if ((ret == HTTPD_SOCK_ERR_TIMEOUT) && (pending_len != 0)) { - /* If recv() timeout occurred, but pending data is - * present, return length of pending data. - * This behavior is similar to that of socket recv() - * function, which, in case has only partially read the - * requested length, due to timeout, returns with read - * length, rather than error */ - return pending_len; + size_t recv_len = pending_len; + do { + int ret = ra->sd->recv_fn(ra->sd->handle, ra->sd->fd, buf, buf_len, 0); + if (ret < 0) { + ESP_LOGD(TAG, LOG_FMT("error in recv_fn")); + if ((ret == HTTPD_SOCK_ERR_TIMEOUT) && (pending_len != 0)) { + /* If recv() timeout occurred, but pending data is + * present, return length of pending data. + * This behavior is similar to that of socket recv() + * function, which, in case has only partially read the + * requested length, due to timeout, returns with read + * length, rather than error */ + return pending_len; + } + return ret; } - return ret; - } - ESP_LOGD(TAG, LOG_FMT("received length = %"NEWLIB_NANO_COMPAT_FORMAT), NEWLIB_NANO_COMPAT_CAST((ret + pending_len))); - return ret + pending_len; + recv_len += ret; + buf += ret; + buf_len -= ret; + } while (buf_len > 0 && opt == HTTPD_RECV_OPT_BLOCKING); + + ESP_LOGD(TAG, LOG_FMT("received length = %"NEWLIB_NANO_COMPAT_FORMAT), NEWLIB_NANO_COMPAT_CAST(recv_len)); + return recv_len; } int httpd_recv(httpd_req_t *r, char *buf, size_t buf_len) { - return httpd_recv_with_opt(r, buf, buf_len, false); + return httpd_recv_with_opt(r, buf, buf_len, HTTPD_RECV_OPT_NONE); } size_t httpd_unrecv(struct httpd_req *r, const char *buf, size_t buf_len) diff --git a/components/esp_http_server/src/httpd_ws.c b/components/esp_http_server/src/httpd_ws.c index bcf32cf9e69..4bffe538421 100644 --- a/components/esp_http_server/src/httpd_ws.c +++ b/components/esp_http_server/src/httpd_ws.c @@ -296,7 +296,7 @@ esp_err_t httpd_ws_recv_frame(httpd_req_t *req, httpd_ws_frame_t *frame, size_t /* Grab the second byte */ uint8_t second_byte = 0; - if (httpd_recv_with_opt(req, (char *)&second_byte, sizeof(second_byte), false) <= 0) { + if (httpd_recv_with_opt(req, (char *)&second_byte, sizeof(second_byte), HTTPD_RECV_OPT_BLOCKING) < sizeof(second_byte)) { ESP_LOGW(TAG, LOG_FMT("Failed to receive the second byte")); return ESP_FAIL; } @@ -313,7 +313,7 @@ esp_err_t httpd_ws_recv_frame(httpd_req_t *req, httpd_ws_frame_t *frame, size_t } else if (init_len == 126) { /* Case 2: If length byte is 126, then this frame's length bit is 16 bits */ uint8_t length_bytes[2] = { 0 }; - if (httpd_recv_with_opt(req, (char *)length_bytes, sizeof(length_bytes), false) <= 0) { + if (httpd_recv_with_opt(req, (char *)length_bytes, sizeof(length_bytes), HTTPD_RECV_OPT_BLOCKING) < sizeof(length_bytes)) { ESP_LOGW(TAG, LOG_FMT("Failed to receive 2 bytes length")); return ESP_FAIL; } @@ -322,8 +322,8 @@ esp_err_t httpd_ws_recv_frame(httpd_req_t *req, httpd_ws_frame_t *frame, size_t } else if (init_len == 127) { /* Case 3: If length is byte 127, then this frame's length bit is 64 bits */ uint8_t length_bytes[8] = { 0 }; - if (httpd_recv_with_opt(req, (char *)length_bytes, sizeof(length_bytes), false) <= 0) { - ESP_LOGW(TAG, LOG_FMT("Failed to receive 2 bytes length")); + if (httpd_recv_with_opt(req, (char *)length_bytes, sizeof(length_bytes), HTTPD_RECV_OPT_BLOCKING) < sizeof(length_bytes)) { + ESP_LOGW(TAG, LOG_FMT("Failed to receive 8 bytes length")); return ESP_FAIL; } @@ -338,7 +338,7 @@ esp_err_t httpd_ws_recv_frame(httpd_req_t *req, httpd_ws_frame_t *frame, size_t } /* If this frame is masked, dump the mask as well */ if (masked) { - if (httpd_recv_with_opt(req, (char *)aux->mask_key, sizeof(aux->mask_key), false) <= 0) { + if (httpd_recv_with_opt(req, (char *)aux->mask_key, sizeof(aux->mask_key), HTTPD_RECV_OPT_BLOCKING) < sizeof(aux->mask_key)) { ESP_LOGW(TAG, LOG_FMT("Failed to receive mask key")); return ESP_FAIL; } @@ -375,7 +375,7 @@ esp_err_t httpd_ws_recv_frame(httpd_req_t *req, httpd_ws_frame_t *frame, size_t size_t offset = 0; while (left_len > 0) { - int read_len = httpd_recv_with_opt(req, (char *)frame->payload + offset, left_len, false); + int read_len = httpd_recv_with_opt(req, (char *)frame->payload + offset, left_len, HTTPD_RECV_OPT_NONE); if (read_len <= 0) { ESP_LOGW(TAG, LOG_FMT("Failed to receive payload")); return ESP_FAIL; @@ -483,7 +483,7 @@ esp_err_t httpd_ws_get_frame_type(httpd_req_t *req) /* Read the first byte from the frame to get the FIN flag and Opcode */ /* Please refer to RFC6455 Section 5.2 for more details */ uint8_t first_byte = 0; - if (httpd_recv_with_opt(req, (char *)&first_byte, sizeof(first_byte), false) <= 0) { + if (httpd_recv_with_opt(req, (char *)&first_byte, sizeof(first_byte), HTTPD_RECV_OPT_BLOCKING) < sizeof(first_byte)) { /* If the recv() return code is <= 0, then this socket FD is invalid (i.e. a broken connection) */ /* Here we mark it as a Close message and close it later. */ ESP_LOGW(TAG, LOG_FMT("Failed to read header byte (socket FD invalid), closing socket now")); From 33e8b1c4bd5fc2214003666b267c17c6ea279621 Mon Sep 17 00:00:00 2001 From: Ondrej Kosta Date: Fri, 11 Jul 2025 10:09:35 +0200 Subject: [PATCH 208/213] fix(esp_eth): bridge test to use SSH key when connect to endnode --- .../network/bridge/pytest_example_bridge.py | 50 +++++++++++++------ 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/examples/network/bridge/pytest_example_bridge.py b/examples/network/bridge/pytest_example_bridge.py index 419cce09ab4..09b94ce5136 100644 --- a/examples/network/bridge/pytest_example_bridge.py +++ b/examples/network/bridge/pytest_example_bridge.py @@ -1,7 +1,10 @@ # SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 +import base64 +import io import ipaddress import logging +import os import re import socket import subprocess @@ -9,6 +12,7 @@ import time from concurrent.futures import Future from concurrent.futures import ThreadPoolExecutor from typing import List +from typing import Optional from typing import Union import netifaces @@ -18,7 +22,11 @@ from common_test_methods import get_host_ip_by_interface from netmiko import ConnectHandler from pytest_embedded import Dut + # Testbed configuration + +ETHVM_ENDNODE_USER = 'ci.ethvm' + BR_PORTS_NUM = 2 IPERF_BW_LIM = 6 MIN_UDP_THROUGHPUT = 5 @@ -26,13 +34,17 @@ MIN_TCP_THROUGHPUT = 4 class EndnodeSsh: - def __init__(self, host_ip: str, usr: str, passwd: str): + def __init__(self, host_ip: str, usr: str, passwd: Optional[str] = None): + key_string = os.getenv('CI_ETHVM_KEY') + key = None + if key_string: + decoded_key_string = base64.b64decode(key_string) + key = paramiko.Ed25519Key.from_private_key(io.StringIO(decoded_key_string.decode('utf-8'))) + self.host_ip = host_ip self.ssh_client = paramiko.SSHClient() self.ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) - self.ssh_client.connect(hostname=self.host_ip, - username=usr, - password=passwd) + self.ssh_client.connect(hostname=self.host_ip, username=usr, pkey=key, password=passwd) self.executor: ThreadPoolExecutor self.async_result: Future @@ -263,18 +275,17 @@ def test_esp_eth_bridge( port_num = int(sw_info.group(2)) port_num_endnode = int(port_num) + 1 # endnode address is always + 1 to the host - endnode = EndnodeSsh(f'10.10.{sw_num}.{port_num_endnode}', - dev_user, - dev_password) - switch1 = SwitchSsh(f'10.10.{sw_num}.100', - dev_user, - dev_password, - SwitchSsh.EDGE_SWITCH_10XP) + endnode = EndnodeSsh(f'10.10.{sw_num}.{port_num_endnode}', ETHVM_ENDNODE_USER) + switch1 = SwitchSsh(f'10.10.{sw_num}.100', dev_user, dev_password, SwitchSsh.EDGE_SWITCH_10XP) # Collect all addresses in our network # ------------------------------------ # Bridge (DUT) MAC - br_mac = dut.expect(r'esp_netif_br_glue: ([0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2})') + br_mac = dut.expect( + r'esp_netif_br_glue: ' + r'([0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:' + r'[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2})' + ) br_mac = br_mac.group(1).decode('utf-8') logging.info('ESP Bridge MAC %s', br_mac) # Get unique identification of each Ethernet port @@ -369,21 +380,30 @@ def test_esp_eth_bridge( # unicast UDP bandwidth_udp = run_iperf('udp', endnode, host_ip, IPERF_BW_LIM, 5) if bandwidth_udp < MIN_UDP_THROUGHPUT: - logging.warning('Unicast UDP bandwidth was less than expected. Trying again over longer period to compensate transient drops.') + logging.warning( + 'Unicast UDP bandwidth was less than expected. ' + 'Trying again over longer period to compensate transient drops.' + ) bandwidth_udp = run_iperf('udp', endnode, host_ip, IPERF_BW_LIM, 60) logging.info('Unicast UDP average bandwidth: %s Mbits/s', bandwidth_udp) # unicast TCP bandwidth_tcp = run_iperf('tcp', endnode, host_ip, IPERF_BW_LIM, 5) if bandwidth_tcp < MIN_TCP_THROUGHPUT: - logging.warning('Unicast TCP bandwidth was less than expected. Trying again over longer period to compensate transient drops.') + logging.warning( + 'Unicast TCP bandwidth was less than expected. ' + 'Trying again over longer period to compensate transient drops.' + ) bandwidth_tcp = run_iperf('tcp', endnode, host_ip, IPERF_BW_LIM, 60) logging.info('Unicast TCP average bandwidth: %s Mbits/s', bandwidth_tcp) # multicast UDP bandwidth_mcast_udp = run_iperf('udp', endnode, '224.0.1.4', IPERF_BW_LIM, 5, host_if, endnode_if) if bandwidth_mcast_udp < MIN_UDP_THROUGHPUT: - logging.warning('Multicast UDP bandwidth was less than expected. Trying again over longer period to compensate transient drops.') + logging.warning( + 'Multicast UDP bandwidth was less than expected. ' + 'Trying again over longer period to compensate transient drops.' + ) bandwidth_mcast_udp = run_iperf('udp', endnode, '224.0.1.4', IPERF_BW_LIM, 60, host_if, endnode_if) logging.info('Multicast UDP average bandwidth: %s Mbits/s', bandwidth_mcast_udp) From 8c5e5fa3f35e78e5dc760082f4fd25de3c22dcf5 Mon Sep 17 00:00:00 2001 From: Rahul Tank Date: Wed, 9 Jul 2025 11:49:25 +0530 Subject: [PATCH 209/213] fix(nimble): Enhanced HCI logging by adding timestamp information --- components/bt/common/hci_log/bt_hci_log.c | 17 ++- tools/bt/bt_hci_to_btsnoop.py | 138 +++++++++++----------- 2 files changed, 83 insertions(+), 72 deletions(-) diff --git a/components/bt/common/hci_log/bt_hci_log.c b/components/bt/common/hci_log/bt_hci_log.c index ef0d22946f1..74c63f44489 100644 --- a/components/bt/common/hci_log/bt_hci_log.c +++ b/components/bt/common/hci_log/bt_hci_log.c @@ -10,6 +10,7 @@ #include "bt_common.h" #include "osi/mutex.h" #include "esp_attr.h" +#include "esp_timer.h" #if (BT_HCI_LOG_INCLUDED == TRUE) #define BT_HCI_LOG_PRINT_TAG (1) @@ -208,6 +209,8 @@ esp_err_t IRAM_ATTR bt_hci_log_record_data(bt_hci_log_t *p_hci_log_ctl, char *st { osi_mutex_t mutex_lock; uint8_t *g_hci_log_buffer; + int64_t ts; + uint8_t *temp_buf; if (!p_hci_log_ctl->p_hci_log_buffer) { return ESP_FAIL; @@ -219,6 +222,16 @@ esp_err_t IRAM_ATTR bt_hci_log_record_data(bt_hci_log_t *p_hci_log_ctl, char *st return ESP_FAIL; } + ts = esp_timer_get_time(); + + temp_buf = (uint8_t *)malloc(data_len + 8); + memset(temp_buf, 0x0, data_len + 8); + + memcpy(temp_buf, &ts, 8); + memcpy(temp_buf + 8, data, data_len); + + data_len += 8; + mutex_lock = p_hci_log_ctl->mutex_lock; osi_mutex_lock(&mutex_lock, OSI_MUTEX_MAX_TIMEOUT); @@ -250,7 +263,7 @@ esp_err_t IRAM_ATTR bt_hci_log_record_data(bt_hci_log_t *p_hci_log_ctl, char *st bt_hci_log_record_string(p_hci_log_ctl, str); } - bt_hci_log_record_hex(p_hci_log_ctl, data, data_len); + bt_hci_log_record_hex(p_hci_log_ctl, temp_buf, data_len); g_hci_log_buffer[p_hci_log_ctl->log_record_in] = '\n'; @@ -266,6 +279,8 @@ esp_err_t IRAM_ATTR bt_hci_log_record_data(bt_hci_log_t *p_hci_log_ctl, char *st osi_mutex_unlock(&mutex_lock); + free(temp_buf); + return ESP_OK; } diff --git a/tools/bt/bt_hci_to_btsnoop.py b/tools/bt/bt_hci_to_btsnoop.py index 4b14da558a0..1fff3f41e23 100644 --- a/tools/bt/bt_hci_to_btsnoop.py +++ b/tools/bt/bt_hci_to_btsnoop.py @@ -1,13 +1,9 @@ -# SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 import argparse import os import re import struct -import time - -parsed_num = 0 -all_line_num = 0 def create_new_bt_snoop_file(filename: str) -> None: @@ -20,30 +16,19 @@ def create_new_bt_snoop_file(filename: str) -> None: f.write(header) -def append_hci_to_bt_snoop_file(filename: str, direction: int, data: str) -> None: +def append_hci_to_bt_snoop_file(filename: str, direction: int, data: str, timestamp_us: int) -> None: if os.path.exists(filename): print(f'Appending to existing file: {filename}') else: print(f'Creating new file: {filename}') create_new_bt_snoop_file(filename) - - # Ensure data is converted to bytearray from hex string - data_bytes = bytearray.fromhex(data) # Convert hex string to bytearray - - with open(filename, 'ab') as f: # 'ab' mode for appending binary data - global parsed_num - parsed_num += 1 - data_len = len(data_bytes) - orig_len = data_len - incl_len = data_len - packet_flags = direction + (data_bytes[0] != 1 or data_bytes[0] != 3) * 2 + data_bytes = bytearray.fromhex(data) + with open(filename, 'ab') as f: + orig_len = incl_len = len(data_bytes) + packet_flags = direction + (data_bytes[0] != 1 and data_bytes[0] != 3) * 2 cumulative_drops = 0 - # Calculate the timestamp with an offset from a predefined reference time(0x00DCDDB30F2F8000). - timestamp_us = int(round(time.time() * 1000000)) + 0x00DCDDB30F2F8000 - - # Writing structured data followed by the byte array data f.write(struct.pack('>IIIIQ', orig_len, incl_len, packet_flags, cumulative_drops, timestamp_us)) - f.write(data_bytes) # Write bytearray (binary data) to file + f.write(data_bytes) def log_data_clean(data: str) -> str: @@ -51,82 +36,93 @@ def log_data_clean(data: str) -> str: return cleaned -def is_adv_report(data: str) -> bool: - is_binary = all(re.fullmatch(r'[0-9a-fA-F]{2}', part) for part in data.split()) - return is_binary - - def parse_log(input_path: str, output_tag: str) -> None: - """ - Parses the specified log file and saves the results to an output file. - - Args: - input_path (str): Path to the input log file. - output_tag (str): Name tag for the output file. - - Returns: - None - """ - global parsed_num - global all_line_num if not os.path.exists(input_path): print(f"Error: The file '{input_path}' does not exist.") return - - # Define the output directory and create it if it doesn't exist output_dir = './parsed_logs' os.makedirs(output_dir, exist_ok=True) - - # Define the output file name based on the tag output_file = os.path.join(output_dir, f'parsed_log_{output_tag}.btsnoop.log') - + parsed_num = 0 + all_line_num = 0 with open(input_path, 'r', encoding='utf-8') as infile: - # Example: Parse each line and save processed results for line in infile: try: all_line_num += 1 - line = log_data_clean(line) - line = line.replace('C:', '01 ') - line = line.replace('E:', '04 ') - line = line[3:] - if line[0] == 'H': - line = line.replace('H:', '02 ') - append_hci_to_bt_snoop_file(output_file, 0, line) + line = log_data_clean(line).strip() + if not line: continue - if line[0] == 'D': - line = line.replace('D:', '02 ') - append_hci_to_bt_snoop_file(output_file, 1, line) + parts = line.split() + if len(parts) < 10: continue - if line.startswith('01'): - append_hci_to_bt_snoop_file(output_file, 0, line) - continue - if line.startswith('04'): - append_hci_to_bt_snoop_file(output_file, 1, line) - continue - if is_adv_report(line): - line = '04 3e ' + line - append_hci_to_bt_snoop_file(output_file, 1, line) + parts_wo_ln = parts[1:] + # Check for literal in the first token + literal = None + if ':' in parts_wo_ln[0]: + literal_part, sep, ts_byte = parts_wo_ln[0].partition(':') + if sep == ':' and literal_part in ['C', 'D', 'E', 'H'] and len(ts_byte) == 2: + literal = literal_part + ':' + parts_wo_ln = [literal, ts_byte] + parts_wo_ln[1:] + else: + literal = None + if literal: + # Parse timestamp + try: + timestamp_bytes = bytes(int(b, 16) for b in parts_wo_ln[1:9]) + except Exception: + continue + timestamp_us = int.from_bytes(timestamp_bytes, byteorder='little', signed=False) + hci_data = ' '.join(parts_wo_ln[9:]) + if not hci_data: + continue + # Determine indicator and direction + if literal == 'C:': + hci_data = '01 ' + hci_data + direction = 0 + elif literal == 'E:': + hci_data = '04 ' + hci_data + direction = 1 + elif literal == 'H:': + hci_data = '02 ' + hci_data + direction = 0 + elif literal == 'D:': + hci_data = '02 ' + hci_data + direction = 1 + else: + continue + append_hci_to_bt_snoop_file(output_file, direction, hci_data, timestamp_us) + parsed_num += 1 + else: + # No literal: treat as advertising report + try: + timestamp_bytes = bytes(int(b, 16) for b in parts[1:9]) + except Exception: + continue + timestamp_us = int.from_bytes(timestamp_bytes, byteorder='little', signed=False) + adv_data = ' '.join(parts[9:]) + if not adv_data: + continue + hci_data = '04 3e ' + adv_data + direction = 1 + append_hci_to_bt_snoop_file(output_file, direction, hci_data, timestamp_us) + parsed_num += 1 except Exception as e: print(f'Exception: {e}') - if parsed_num > 0: - print(f'Log parsing completed, parsed_num {parsed_num}, all_line_num {all_line_num}.\nOutput saved to: {output_file}') + print( + f'Parsing completed, parsed_num {parsed_num}, all_line_num {all_line_num}.\nOutput saved to: {output_file}' + ) else: print('No data could be parsed.') def main() -> None: - # Define command-line arguments parser = argparse.ArgumentParser(description='Log Parsing Tool') parser.add_argument('-p', '--path', required=True, help='Path to the input log file') parser.add_argument('-o', '--output', required=True, help='Name tag for the output file') - - # Parse arguments args = parser.parse_args() input_path = args.path output_tag = args.output - - # Call the log parsing function parse_log(input_path, output_tag) From 5bbfdddf1d9dbf13d2ca969febfef5974929fc57 Mon Sep 17 00:00:00 2001 From: Sergei Silnov Date: Mon, 7 Jul 2025 17:11:13 +0200 Subject: [PATCH 210/213] ci: bump ubuntu version for release zips workflow --- .github/workflows/release_zips.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release_zips.yml b/.github/workflows/release_zips.yml index 9e9a013f682..bc2bf7b5c09 100644 --- a/.github/workflows/release_zips.yml +++ b/.github/workflows/release_zips.yml @@ -8,7 +8,7 @@ on: jobs: release_zips: name: Create release zip file - runs-on: ubuntu-20.04 + runs-on: ubuntu-24.04 steps: - name: Create a recursive clone source zip uses: espressif/release-zips-action@v1 From ce4a3fb86c63f7aaa5d2ac0bd4ca80c092e48744 Mon Sep 17 00:00:00 2001 From: Zhang Shuxian Date: Thu, 17 Jul 2025 11:56:05 +0800 Subject: [PATCH 211/213] docs: Remove incorrect description for ESP32-P4 SDMMC --- docs/en/api-reference/peripherals/sdmmc_host.rst | 2 +- docs/zh_CN/api-reference/peripherals/sdmmc_host.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/api-reference/peripherals/sdmmc_host.rst b/docs/en/api-reference/peripherals/sdmmc_host.rst index c37f1800524..8970bc6503b 100644 --- a/docs/en/api-reference/peripherals/sdmmc_host.rst +++ b/docs/en/api-reference/peripherals/sdmmc_host.rst @@ -67,7 +67,7 @@ Overview Pins used by Slot 0 (``HS1_*``) are also used to connect the SPI flash chip in ESP32-WROOM and ESP32-WROVER modules. These pins cannot be concurrently shared between an SD card and an SPI flash. If you need to use Slot 0, establish an alternative connection for the SPI flash using different pins and configure the necessary eFuses accordingly. -.. only:: SOC_SDMMC_USE_GPIO_MATRIX +.. only:: esp32s3 Both slots :c:macro:`SDMMC_HOST_SLOT_0` and :c:macro:`SDMMC_HOST_SLOT_1` support 1-, 4- and 8-line SD interfaces. The slots are connected to {IDF_TARGET_NAME} GPIOs using the GPIO matrix. This means that any GPIO may be used for each of the SD card signals. diff --git a/docs/zh_CN/api-reference/peripherals/sdmmc_host.rst b/docs/zh_CN/api-reference/peripherals/sdmmc_host.rst index 2f8061065ec..53e81d8ab72 100644 --- a/docs/zh_CN/api-reference/peripherals/sdmmc_host.rst +++ b/docs/zh_CN/api-reference/peripherals/sdmmc_host.rst @@ -67,7 +67,7 @@ SDMMC 主机驱动 卡槽 0 使用的管脚 (``HS1_*``) 既用于连接主机上的 SD 卡插槽,也用于连接 ESP32-WROOM 和 ESP32-WROVER 模组中的 SPI flash 芯片,但这些管脚不能同时用于 SD 卡与 SPI flash。如需使用卡槽 0,请将 SPI flash 连接到其他管脚,并根据需要配置 eFuse。 -.. only:: SOC_SDMMC_USE_GPIO_MATRIX +.. only:: esp32s3 卡槽 :c:macro:`SDMMC_HOST_SLOT_0` 和 :c:macro:`SDMMC_HOST_SLOT_1` 都支持 1、4、8 线的 SD 接口,这些卡槽通过 GPIO 交换矩阵连接到 {IDF_TARGET_NAME} 的 GPIO,即每个 SD 卡信号都可以使用任意 GPIO 连接。 From 6cd12fe8dd2d9a3b271451db3af7a145d80b5759 Mon Sep 17 00:00:00 2001 From: Marek Fiala Date: Wed, 2 Jul 2025 12:36:59 +0200 Subject: [PATCH 212/213] feat(tools): Enforce pip 'user' option to no, when installing python env Closes https://github.com/espressif/esp-idf/issues/16189 --- tools/idf_tools.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tools/idf_tools.py b/tools/idf_tools.py index 2683c3977a2..386877b43c4 100755 --- a/tools/idf_tools.py +++ b/tools/idf_tools.py @@ -2686,9 +2686,8 @@ def action_install_python_env(args): # type: ignore install_legacy_python_virtualenv(idf_python_env_path) env_copy = os.environ.copy() - if env_copy.get('PIP_USER') == 'yes': - warn('Found PIP_USER="yes" in the environment. Disabling PIP_USER in this shell to install packages into a virtual environment.') - env_copy['PIP_USER'] = 'no' + # Enforce disabling possible pip 'user' option to prevent installation error with virtual environment + env_copy['PIP_USER'] = 'no' constraint_file = get_constraints(idf_version) if use_constraints else None From f1b7b474c51f36732c92ca05b53a6925b146daa2 Mon Sep 17 00:00:00 2001 From: xiongweichao Date: Mon, 7 Jul 2025 19:10:02 +0800 Subject: [PATCH 213/213] feat(bt): Add record_handle in ESP_SDP_REMOVE_RECORD_COMP_EVT --- components/bt/host/bluedroid/api/include/api/esp_sdp_api.h | 1 + components/bt/host/bluedroid/btc/profile/std/sdp/btc_sdp.c | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/components/bt/host/bluedroid/api/include/api/esp_sdp_api.h b/components/bt/host/bluedroid/api/include/api/esp_sdp_api.h index 956af037301..5c74851f317 100644 --- a/components/bt/host/bluedroid/api/include/api/esp_sdp_api.h +++ b/components/bt/host/bluedroid/api/include/api/esp_sdp_api.h @@ -225,6 +225,7 @@ typedef union { */ struct sdp_remove_record_evt_param { esp_sdp_status_t status; /*!< Status */ + int record_handle; /*!< SDP record handle */ } remove_record; /*!< SDP callback param of ESP_SDP_REMOVE_RECORD_COMP_EVT */ } esp_sdp_cb_param_t; diff --git a/components/bt/host/bluedroid/btc/profile/std/sdp/btc_sdp.c b/components/bt/host/bluedroid/btc/profile/std/sdp/btc_sdp.c index 23ee72eb8d7..e343716b08d 100644 --- a/components/bt/host/bluedroid/btc/profile/std/sdp/btc_sdp.c +++ b/components/bt/host/bluedroid/btc/profile/std/sdp/btc_sdp.c @@ -1273,7 +1273,8 @@ static void btc_sdp_remove_record(btc_sdp_args_t *arg) } while(0); if (ret != ESP_SDP_SUCCESS) { - param.create_record.status = ret; + param.remove_record.status = ret; + param.remove_record.record_handle = arg->remove_record.record_handle; btc_sdp_cb_to_app(ESP_SDP_REMOVE_RECORD_COMP_EVT, ¶m); } } @@ -1422,6 +1423,7 @@ void btc_sdp_cb_handler(btc_msg_t *msg) } param.remove_record.status = p_data->sdp_remove_record.status; + param.remove_record.record_handle = p_data->sdp_remove_record.handle; btc_sdp_cb_to_app(ESP_SDP_REMOVE_RECORD_COMP_EVT, ¶m); break; default:

  • pu;j8e{C_%2bu6^;Um)4j0ujrHX?b_$t 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ð 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⁢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