change(app_trace): breaking changes related to destination selection

- Destination selection is unified for SystemView and app_trace
- Destination param is removed from app_trace APIs
- Destinaiton and related configuration now can be override from users
  with a callback from system_init_fn
This commit is contained in:
Erhan Kurubas
2025-08-28 11:33:35 +03:00
committed by BOT
parent 68764bf80f
commit 2ef718fc29
47 changed files with 1318 additions and 936 deletions

View File

@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
@@ -17,16 +17,34 @@
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_app_trace.h"
#include "soc/uart_pins.h"
#include "esp_log.h"
static const char *TAG = "example";
#if !CONFIG_APPTRACE_DEST_JTAG
/* Override default config to use console pins as a uart channel */
esp_apptrace_config_t esp_apptrace_get_user_params(void)
{
esp_apptrace_config_t config = APPTRACE_UART_CONFIG_DEFAULT();
config.dest_cfg.uart.uart_num = 0;
config.dest_cfg.uart.tx_pin_num = U0TXD_GPIO_NUM;
config.dest_cfg.uart.rx_pin_num = U0RXD_GPIO_NUM;
return config;
}
#endif
void app_main(void)
{
ESP_LOGI(TAG, "Waiting for OpenOCD connection");
if (esp_apptrace_get_destination() == ESP_APPTRACE_DEST_JTAG) {
ESP_LOGI(TAG, "Waiting for OpenOCD connection");
while (!esp_apptrace_host_is_connected(ESP_APPTRACE_DEST_JTAG)) {
vTaskDelay(1);
while (!esp_apptrace_host_is_connected()) {
vTaskDelay(1);
}
} else { // UART
// Before sending data, wait for the UART host to be ready
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
ESP_LOGI(TAG, "Sending example data to the host...");
@@ -34,11 +52,11 @@ void app_main(void)
for (unsigned int cnt = 1; cnt < 51; ++cnt) {
char buf[32] = {0};
snprintf(buf, sizeof(buf), "Apptrace test data[%d]:%d\n", cnt, cnt * cnt);
esp_err_t res = esp_apptrace_write(ESP_APPTRACE_DEST_JTAG, buf, strlen(buf), ESP_APPTRACE_TMO_INFINITE);
esp_err_t res = esp_apptrace_write(buf, strlen(buf), ESP_APPTRACE_TMO_INFINITE);
if (res != ESP_OK) {
ESP_LOGE(TAG, "Failed to write data to host [0x%x] (%s)", res, esp_err_to_name(res));
}
esp_apptrace_flush(ESP_APPTRACE_DEST_JTAG, 1000);
esp_apptrace_flush(1000);
vTaskDelay(50 / portTICK_PERIOD_MS);
}

View File

@@ -1,9 +1,11 @@
# SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Unlicense OR CC0-1.0
import os.path
import time
import typing
import pytest
import serial
from pytest_embedded_idf import IdfDut
from pytest_embedded_idf.utils import idf_parametrize
@@ -23,7 +25,7 @@ def _test_examples_app_trace_basic(openocd_dut: 'OpenOCD', dut: IdfDut) -> None:
search_strings = ['Targets connected.', 'Disconnect targets...']
with open(openocd.log_file, encoding='utf-8') as oocd_log: # pylint: disable=protected-access
cores = 1 if dut.app.sdkconfig.get('ESP_SYSTEM_SINGLE_CORE_MODE') is True else 2
search_strings.append('App trace params: from {} cores,'.format(cores))
search_strings.append(f'App trace params: from {cores} cores,')
for search_str in search_strings:
found = False
oocd_log.seek(0)
@@ -35,26 +37,51 @@ def _test_examples_app_trace_basic(openocd_dut: 'OpenOCD', dut: IdfDut) -> None:
raise RuntimeError(f'"{search_str}" could not be found in {openocd.log_file}') # pylint: disable=protected-access
with open('apptrace.log', encoding='utf-8') as apptrace_log:
content = apptrace_log.read()
for sample_num in range(1, 51):
log_str = 'Apptrace test data[{}]:{}'.format(sample_num, sample_num * sample_num)
found = False
for line in apptrace_log:
if log_str in line:
found = True
break
if found is not True:
log_str = f'Apptrace test data[{sample_num}]:{sample_num * sample_num}'
if log_str not in content:
raise RuntimeError('"{}" could not be found in {}'.format(log_str, 'apptrace.log'))
@pytest.mark.jtag
@idf_parametrize('config', ['apptrace_jtag'], indirect=['config'])
@idf_parametrize('target', ['esp32', 'esp32c2', 'esp32s2'], indirect=['target'])
def test_examples_app_trace_basic(openocd_dut: 'OpenOCD', dut: IdfDut) -> None:
_test_examples_app_trace_basic(openocd_dut, dut)
@pytest.mark.usb_serial_jtag
@idf_parametrize('config', ['apptrace_jtag'], indirect=['config'])
@idf_parametrize(
'target', ['esp32s3', 'esp32c3', 'esp32c5', 'esp32c6', 'esp32c61', 'esp32h2', 'esp32p4'], indirect=['target']
)
def test_examples_app_trace_basic_usj(openocd_dut: 'OpenOCD', dut: IdfDut) -> None:
_test_examples_app_trace_basic(openocd_dut, dut)
@pytest.mark.generic
@idf_parametrize('config', ['apptrace_uart'], indirect=['config'])
@idf_parametrize('target', ['supported_targets'], indirect=['target'])
def test_examples_app_trace_basic_uart(dut: IdfDut) -> None:
dut.serial.close()
with serial.Serial(dut.serial.port, baudrate=1000000, timeout=10) as ser:
apptrace_log = os.path.join(dut.logdir, 'apptrace_log_uart.txt') # pylint: disable=protected-access
with open(apptrace_log, 'w+b') as f:
start_time = time.time()
while True:
try:
if ser.in_waiting:
data = ser.read(100)
f.write(data)
if time.time() - start_time > 5:
break
except serial.SerialTimeoutException:
assert False, 'Timeout reached while reading from serial port, exiting...'
f.seek(0)
content = f.read().decode('utf-8', errors='ignore')
for sample_num in range(1, 51):
log_str = f'Apptrace test data[{sample_num}]:{sample_num * sample_num}'
if log_str not in content:
raise RuntimeError('"{}" could not be found in {}'.format(log_str, 'apptrace_log_uart.txt'))

View File

@@ -0,0 +1 @@
CONFIG_APPTRACE_DEST_JTAG=y

View File

@@ -0,0 +1,3 @@
CONFIG_ESP_CONSOLE_NONE=y
# Destination selection on runtime
CONFIG_APPTRACE_DEST_NONE=y

View File

@@ -1,3 +1,2 @@
# Enable application tracing by default
CONFIG_APPTRACE_DEST_JTAG=y
CONFIG_APPTRACE_ENABLE=y