ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ESP-IDF 跟踪系统(ESP Trace)完全指南:架构、传输与 SystemView/Gcov/函数跟踪实战

ESP-IDF 跟踪系统(ESP Trace)完全指南:架构、传输与 SystemView/Gcov/函数跟踪实战 ESP-IDF 跟踪系统ESP Trace完全指南架构、传输与 SystemView/Gcov/函数跟踪实战【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idfESP-IDF 提供了一套以较小运行时开销从芯片收集程序行为数据、并通过 JTAG / UART / USB Serial JTAG 等链路发送到主机进行分析的跟踪系统Tracing System。本文以官方指南 docs/zh_CN/api-guides/tracing/index.rst 为主体结合仓库内esp_trace组件源码与配置、示例工程完整讲解其 Port Adapter 架构、跟踪格式与传输的选择方法、apptrace 传输的配置与 OpenOCD 命令以及 SystemView、Gcov、函数跟踪、自定义跟踪库四大应用场景的启用与实操步骤。读完本文你将掌握在任意 ESP-IDF 项目上快速开启 FreeRTOS 行为分析、源代码覆盖率统计与主机端日志采集的完整链路。概述ESP-IDF 跟踪系统是什么ESP-IDF 跟踪系统用于程序行为分析和调试。它以esp_trace组件为核心该组件提供公共跟踪 API负责管理活动跟踪会话并把跟踪编码器encoder与跟踪传输transport连接起来。SEGGER SystemView、Gcov 以及 apptrace 传输等跟踪功能都接入这一统一模型从而保证跟踪格式与传输可独立选择——你可以选择 SystemView 或自定义记录器作为格式选择 JTAG、UART 或 USB Serial JTAG 作为主机链路二者任意组合系统可扩展——新的跟踪格式和传输可以在不修改 ESP-IDF 的情况下以适配器adapter形式添加。从源码结构看esp_trace 组件 包含公共头文件如 esp_trace.h、esp_trace_types.h、esp_trace_freertos.h、核心实现esp_trace_core.c、esp_trace_registry.c、函数跟踪实现function_trace.c以及内置的 apptrace 与 USB Serial JTAG 两个传输适配器adapters/transport 目录下的adapter_transport_apptrace.c与adapter_transport_usb_serial_jtag.c。主要特性自动初始化跟踪在系统启动时自动配置应用通常无需手动调用初始化函数多核支持适用于单核与双核芯片可分别采集各核事件可扩展可添加自定义跟踪格式或传输参见 架构文档。核心架构Port Adapter端口与适配器设计ESP-IDF 跟踪系统采用Port Adapter分层设计。应用程序调用公共的esp_traceAPI跟踪核心负责将会话中选定的编码器与选定传输连接起来。其数据流可概括为应用程序FreeRTOS 任务、ISR、esp_trace_write()、跟踪宏 → 公共接口esp_trace API → 核心跟踪代码esp_trace 组件会话管理、多核初始化、适配器协调 → 编码器端口 / 传输端口 → 编码器适配器外部组件如 espressif/esp_sysview → 传输适配器apptrace、USB Serial JTAG → 主机链路JTAG 上的 OpenOCD、UART、USB Serial JTAG核心跟踪代码esp_trace组件包含公共 API 并维护活动跟踪会话。它在启动期间创建编码器/传输配对协调多核初始化并将 API 调用转发给所选适配器。它同时维护一个运行时注册表把配置名称映射到实际适配器。编码器端口编码器端口接口定义在 esp_trace_port_encoder.h它定义了跟踪库如何接入esp_trace。编码器接收跟踪写入或跟踪钩子事件并将其转换为记录器特定格式例如 SystemView 协议。esp_trace只定义该接口自身不提供任何编码器——编码器由外部组件提供如espressif/esp_sysview。传输端口传输端口接口定义在 esp_trace_port_transport.h负责将编码后的跟踪数据送出目标设备并处理链路相关操作刷新、主机连接检查、Panic 时输出等。esp_trace内置两种传输适配器apptrace通过 JTAG 或 UART 工作USB Serial JTAG通过芯片内置 USB 外设的 CDC 串口接口。每个跟踪会话都会将一个编码器与一个传输配对。编码器可以把编码后的数据交给当前会话选定的传输且在跟踪写入路径上不进行动态内存分配。初始化与注册表esp_trace会根据项目配置中选定的编码器和传输在系统启动期间自动初始化。适配器在链接时通过ESP_TRACE_REGISTER_ENCODER()和ESP_TRACE_REGISTER_TRANSPORT()自行注册初始化时核心按名称查找所配置的编码器和传输。因此只有实际链接进应用程序的适配器才可用添加新适配器无需改动核心代码。Panic 处理发生 Panic 时中断已禁用常规加锁机制不可用。此时核心会调用活动编码器和传输的可选 Panic 回调各适配器可在不使用常规锁的前提下刷新自己的缓冲区。由于 Panic 刷新不得阻塞、不得使用常规加锁仍可能丢弃部分数据。选择路径跟踪格式与传输官方指南提供了一张目标 → 参考文档对照表帮助开发者按需选择目标参考文档分析 FreeRTOS 任务 / 中断行为SEGGER SystemView发送 / 接收任意应用程序数据或记录日志到主机应用层跟踪传输收集源代码覆盖率Gcov自动跟踪每次函数进入和退出函数跟踪集成第三方跟踪记录器自定义跟踪库选择传输主机链路跟踪格式与传输可独立选择请根据可用硬件决定主机链路apptraceJTAG吞吐量最高并支持由主机发起的控制start、stop、dump。需要 JTAG 适配器以及主机上运行的 OpenOCD。适用于 SystemView 以及按需的 Gcov 转储apptraceUART使用空闲的 UART 而非调试探针吞吐量低于 JTAG。请选择未被控制台占用的 UARTUSB Serial JTAG使用芯片内置的 USB 外设仅需一根 USB 线、无需外部适配器。跟踪数据通过该外设的串行CDC接口传输而非其 JTAG 接口。当 USB Serial JTAG 未被控制台占用时可用。传输详解apptraceJTAG / UART与 USB Serial JTAG应用层跟踪库app_trace组件是esp_trace跟踪系统默认使用的传输方式可在程序运行开销很小的前提下通过 JTAG 或 UART 在主机与芯片之间传输任意数据两者也可同时使用。UART 接口主要用于连接 SEGGER SystemView 工具。基于 USB Serial JTAG 外设的跟踪则由独立传输提供不属于 apptrace。运行模式apptrace 库支持两种运行模式后验模式Post-mortem默认模式不需要与主机交互。跟踪模块不会检查主机是否已从HW UP BUFFER缓冲区读走所有数据而是直接用新数据覆盖旧数据。如果只关心最新跟踪数据例如分析崩溃前的行为推荐使用该模式。主机可稍后通过 OpenOCD 特殊命令按需读取流模式Streaming当主机连接到目标时自动进入。跟踪模块在新数据写入HW UP BUFFER之前检查是否有足够空间必要时等待主机读取并释放内存最大等待时间由用户传给 API 的超时参数决定。若在时效要求严格的代码如中断处理函数、OS 调度中指定无限超时将导致系统故障需特别注意。menuconfig 配置与依赖项使用 apptrace 传输需要主机端与目标端双向配置主机端应用程序跟踪通过 JTAG 完成时需在主机上安装并运行 OpenOCD详见 JTAG 调试指南目标端在 menuconfig 中开启应用跟踪。必须先通过Component configESP Trace ConfigurationTrace transport选择ESP-IDF apptrace启用应用层跟踪之后再到Component configESP Trace ConfigurationApplication Level Tracing中详细配置如数据目标、UART 端口号、波特率、TX/RX 管脚等。当选择任何跟踪库如 SEGGER SystemView时这些配置也会同步作用于该库。以下为常用 menuconfig 选项对应 Kconfig.apptrace 中的定义选项说明APPTRACE_DEST_JTAG/APPTRACE_DEST_UART/APPTRACE_DEST_ALL数据目标。All表示编译 JTAG 与 UART 两套接口IRAM 占用更高可在运行时通过回调切换CONFIG_APPTRACE_POSTMORTEM_FLUSH_THRESH后验模式下发生 Panic 时刷新数据的阈值字节范围 0–16384默认 0。JTAG 下跟踪数据以 16 KB 块暴露给主机若 Panic 时待处理数据少于阈值则不刷新避免覆盖此前完整的 16 KB 数据。仅在后验模式 JTAG 下生效CONFIG_APPTRACE_ONPANIC_HOST_FLUSH_TMO流模式下发生 Panic 时等待主机读取最新数据的最长时间毫秒范围 -1–5000默认 -1 表示无限等待。仅流模式生效CONFIG_APPTRACE_LOCK_ENABLE启用内部同步锁防止多任务并发写同一跟踪缓冲区造成数据损坏会略微降低传输速度CONFIG_APPTRACE_UART_TX_BUFF_SIZEUART TX 环形缓冲区大小必须为 2 的幂默认 4096范围 2048–32768取决于数据量、波特率与系统 tick 频率CONFIG_APPTRACE_UART_TX_MSG_SIZE单条 UART 消息的最大尺寸默认 128范围 64–32768APPTRACE_UART_NUM/APPTRACE_UART_TX_GPIO/APPTRACE_UART_RX_GPIO/APPTRACE_UART_BAUDRATEUART 端口号、TX/RX 管脚与波特率默认 1 Mbps范围 1200–8000000开启 Power Management 时受 REF_TICK 1 MHz 限制性能提示为实现更高的数据速率并降低丢包率建议将 JTAG 时钟频率优化到可稳定运行的最大值。另外esp_trace 的 Kconfig 还提供Trace libraryNone默认/External library from component registry对应CONFIG_ESP_TRACE_LIB_EXTERNAL用于选择外部跟踪库Trace transportNone/ESP-IDF apptrace对应CONFIG_ESP_TRACE_TRANSPORT_APPTRACE/USB Serial JTAG对应CONFIG_ESP_TRACE_TRANSPORT_USB_SERIAL_JTAG依赖SOC_USB_SERIAL_JTAG_SUPPORTED且不能与ESP_CONSOLE_USB_SERIAL_JTAG控制台配置同时启用/External transportTrace timestamp sourceCONFIG_ESP_TRACE_TIMESTAMP_SOURCE可选 CPU 周期计数器CCOUNT、通用定时器Timer Group、esp_timer高精度定时器默认值随单核/多核、是否启用 PM、目标芯片自动选择USB Serial JTAG TX buffer sizeCONFIG_ESP_TRACE_USJ_TX_BUFFER_SIZE默认 2048范围 256–32768需为 2 的幂。通过 API 发送 / 接收任意数据启用 apptrace 后模块会在系统启动期间按 menuconfig 配置自动初始化随后即可调用 API 发送、接收或刷新数据。核心发送 API 为esp_apptrace_write()通过 memcpy 将用户数据复制到内部缓冲区其签名与超时使用方式如下#include esp_app_trace.h ... char buf[] Hello World!; 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!); return res; }在需要自行分配缓冲区并填充数据的场景可改用esp_apptrace_buffer_get()/esp_apptrace_buffer_put()#include esp_app_trace.h ... int number 10; char *ptr (char *)esp_apptrace_buffer_get(32, 100/*超时单位微秒*/); if (ptr NULL) { ESP_LOGE(TAG, Failed to get buffer!); return ESP_FAIL; } sprintf(ptr, Here is the number %d, number); esp_err_t res esp_apptrace_buffer_put(ptr, 100/*超时单位微秒*/); if (res ! ESP_OK) { /* 若出错主机端跟踪工具如 OpenOCD会报告用户缓冲区未完整传输 */ ESP_LOGE(TAG, Failed to put buffer!); return res; }从主机接收数据下行通道时需先配置下行缓冲区再读取#include esp_app_trace.h ... char buf[32]; char down_buf[32]; size_t sz sizeof(buf); /* 配置下行缓冲区 */ esp_err_t res esp_apptrace_down_buffer_config(down_buf, sizeof(down_buf)); if (res ! ESP_OK) { ESP_LOGE(TAG, Failed to config down buffer!); return res; } /* 检查是否有传入数据若有则读取 */ res esp_apptrace_read(buf, sz, 0/*不等待*/); if (res ! ESP_OK) { ESP_LOGE(TAG, Failed to read data from host!); return res; } if (sz 0) { /* 已收到数据进行处理 */ ... }如需原地处理读取缓冲区中的数据块可使用esp_apptrace_down_buffer_get()/esp_apptrace_down_buffer_put()用法见 传输文档。运行时覆盖默认配置用户可通过实现弱回调函数esp_apptrace_get_user_params()覆盖默认配置例如自定义 UART 引脚#include esp_app_trace.h esp_apptrace_config_t *esp_apptrace_get_user_params(void) { esp_apptrace_config_t config APPTRACE_CONFIG_DEFAULT(); // 根据需要自定义配置 // 例如使用不同的 UART 引脚 config.dest_cfg.uart.tx_pin_num GPIO_NUM_17; config.dest_cfg.uart.rx_pin_num GPIO_NUM_16; return config; }注意事项该回调为可选项仅当需要覆盖 menuconfig 设置时才实现该回调仅在未选择任何跟踪库时生效apptrace 独立运行。若选择了跟踪库系统会改调esp_trace_get_user_params()若 Kconfig 中选择All (runtime selection)APPTRACE_DEST_ALL可在运行时通过回调在 JTAG 与 UART 间切换并调整参数若已选定单一目标JTAG 或 UART回调可覆盖参数但无法切换目标类型。独立模式快速启用在 menuconfig 中禁用跟踪库并启用应用层跟踪传输Component configESP Trace ConfigurationTrace library选择NoneComponent configESP Trace ConfigurationTrace transport选择ESP-IDF apptrace。也可在sdkconfig.defaults中设置以下选项强制启用独立模式CONFIG_ESP_TRACE_ENABLEy CONFIG_ESP_TRACE_LIB_NONEy CONFIG_ESP_TRACE_TRANSPORT_APPTRACEyOpenOCD 应用程序跟踪命令HW UP BUFFER在用户数据块之间共享。为避免多线程环境中主机读取到未填充完成的数据跟踪模块会在每个用户数据块前添加 4 字节数据头分配大小 2 字节 实际写入长度 2 字节。OpenOCD 命令在读取到不完整数据块时会报错但仍会将整个数据块含未填充区域写入输出文件。命令用法esp apptrace [start options] | [stop] | [status] | [dump cores_num outfile]子命令start开始跟踪连续流模式stop停止跟踪status获取跟踪状态dump转储所有后验模式的数据。start子命令语法start outfile [poll_period [trace_size [stop_tmo [wait4halt [skip_size]]]]]参数说明outfile保存两个 CPU 数据的文件路径格式为file://path/to/filepoll_period轮询周期毫秒大于 0 时以非阻塞模式运行默认 1 mstrace_size最多收集的数据量字节达到后自动停止默认 -1禁用stop_tmo空闲超时秒可设为略大于跟踪命令间最长暂停值默认 -1禁用wait4halt为 0 立即开始否则先等待目标停止复位、打断点等自动恢复后开始默认 0skip_size开始时跳过的字节数默认 0注意若poll_period为 0跟踪停止前 telnet 命令不可用必须通过复位板卡或在 OpenOCD 窗口按 CtrlC 停止也可设置trace_size让其自动停止。命令示例# 将 2048 字节跟踪数据收集到 trace.log非阻塞收集满或 5 秒无新数据则停止 esp apptrace start file://trace.log 1 2048 5 0 0 # 非阻塞无限检索 esp apptrace start file://trace.log 1 -1 -1 0 0 # 无限检索poll_period0停止前 telnet 不可用 esp apptrace start file://trace.log 0 -1 -1 0 0 # 等待目标停止后恢复并开始收集满 2048 字节停止 esp apptrace start file://trace.log 0 2048 -1 1 0若出现 Data timeout! 消息说明目标在超时前未发送足够数据清空缓冲区可增大超时时间或周期性调用esp_apptrace_flush()刷新。记录日志到主机semihosting 式日志通过esp_apptrace_vprintf可将日志发送到主机该函数不做格式串和参数的完整解析只计算参数个数将其与格式串地址一并发给主机主机端由 Python 脚本处理并打印。使用步骤在 menuconfig 中开启应用层跟踪同上安装类 vprintf 函数esp_log_set_vprintf(esp_apptrace_vprintf);恢复 UART 输出则调用esp_log_set_vprintf(vprintf);按前述步骤完成 OpenOCD 设置与数据收集运行主机脚本打印日志$IDF_PATH/tools/esp_app_trace/logtrace_proc.py /path/to/trace/file /path/to/program/elf/filelogtrace_proc.py命令用法logtrace_proc.py [-h] [--no-errors] trace_file elf_file可选参数--no-errors/-n表示不打印错误信息。当前局限JTAG 日志方式不支持ESP_EARLY_LOGx宏不支持超过 4 字节的 printf 参数如double、uint64_t仅支持 .rodata 段中的格式字符串和参数最多支持 256 个 printf 参数。快速入门SystemView 跟踪SEGGER SystemView 是一款实时记录与可视化工具用于分析任务调度、中断、系统事件。在esp_trace模型中SystemView 以编码器形式提供将 FreeRTOS 与应用程序事件格式化为 SystemView 协议数据由传输层通常为 JTAG 上的 apptrace或用于实时查看的 UART送到主机。启用步骤在项目的idf_component.yml中添加依赖dependencies: espressif/esp_sysview: ^1启用CONFIG_ESP_TRACE_LIB_EXTERNALmenuconfigTrace libraryExternal library from component registry以选择外部跟踪库启用CONFIG_ESP_TRACE_TRANSPORT_APPTRACE选择 apptrace 传输启用CONFIG_APPTRACE_DEST_JTAG将数据目标设为 JTAG构建并烧录idf.py build flash完成上述步骤后Component configSEGGER SystemView Configuration菜单会出现可配置时间戳源CONFIG_ESP_TRACE_TIMESTAMP_SOURCE、按需开关 SystemView 事件收集CONFIG_SEGGER_SYSVIEW_EVT_XXX以及 UART 目标下选择要跟踪的 CPU。若要通过 UART 实时跟踪先在Application Level Tracing中选择 UART 目标再在 SystemView 菜单选择 Pro 或 App CPU。OpenOCD SystemView 命令esp sysview [start options] | [stop] | [status]start语法start outfile1 [outfile2] [poll_period [trace_size [stop_tmo]]]其中outfile1/outfile2分别保存 PRO/APP CPU 数据格式file://path/to/file其余参数含义与 apptrace 一致。示例esp sysview start file://pro-cpu.SVDat file://app-cpu.SVDat多核跟踪SystemView 3.60 及以上版本支持多核格式使用esp sysview_mcore命令所有核数据保存在同一文件中例如esp sysview_mcore start file://heap_log_mcore.SVDat数据可视化双核芯片上较旧版 SystemView 会为 PRO/APP CPU 各生成一个文件可分别载入不同工具实例UART 跟踪时通过 menuconfig 选择跟踪 CPU也可使用 Eclipse 的Impulse插件同时加载多个跟踪文件在同一视图中查看两个核的事件不受免费版 100 万事件数量限制重要ESP-IDF 使用自己的 SystemView FreeRTOS 事件 ID 映射需要将$SYSVIEW_INSTALL_DIR/Description/SYSVIEW_FreeRTOS.txt替换为 tools/esp_app_trace/SYSVIEW_FreeRTOS.txt配置序列化程序时也应使用该文件内容。函数跟踪编译器插桩的进入 / 退出记录函数跟踪可自动记录每次函数进入和退出无需手动插入跟踪点。当源文件使用 GCC 标志-finstrument-functions编译时编译器在函数开始和结束处插入调用这些调用进入esp_trace提供的钩子钩子再把事件转发给当前活动的跟踪编码器如 SystemView。事件携带原始函数地址与调用点地址SystemView 将其记录为原始地址地址到函数名的解析单独针对 ELF 完成如使用addr2line或自定义工具。启用方式在Component configESP Trace ConfigurationFunction Tracing下启用对应 Kconfig 中CONFIG_ESP_TRACE_FUNCTION_TRACE与CONFIG_ESP_TRACE_FUNCTION_TRACE_AUTO_STARTCONFIG_ESP_TRACE_FUNCTION_TRACE构建函数跟踪钩子和运行时CONFIG_ESP_TRACE_FUNCTION_TRACE_AUTO_START默认启用记录跟随编码器状态主机启动会话后立即开始禁用时必须由应用调用esp_trace_function_trace_start()才开始产生事件esp_trace_function_trace_stop()停止。启用该选项只编译钩子与运行时不会为任何代码自动添加-finstrument-functions。要跟踪某个组件或文件需在其CMakeLists.txt中为对应源文件添加该标志if(CONFIG_ESP_TRACE_FUNCTION_TRACE) target_compile_options(${COMPONENT_LIB} PRIVATE -finstrument-functions) endif()使用-finstrument-functions-exclude-file-list与-finstrument-functions-exclude-function-list跳过特定文件或函数。请将插桩限定在自己组件内不要对在关闭 flash 缓存下运行的代码IRAM 中断服务程序、SPI flash 操作插桩。采集到 SystemView 数据后用处理脚本解码函数跟踪事件$IDF_PATH/tools/esp_app_trace/sysviewtrace_proc.py -i func -b /path/to/program.elf -t 工具链前缀- file:///path/to/trace.svdat-i func选择函数跟踪事件流脚本结合 ELF 与工具链前缀解析地址输出按函数分类的报告列出每个函数的地址、进入/退出次数及源码位置。Gcov源代码覆盖率Gcov 是源代码覆盖率分析工具。在 ESP-IDF 中目标设备上生成的覆盖率数据通过 apptraceJTAG 或 UART转储到主机主机端转换为标准.gcda文件再配合编译期生成的.gcno注释文件与原始源码生成覆盖率报告。注意事项覆盖率功能由托管组件espressif/esp_gcov提供在idf_component.yml中添加dependencies: espressif/esp_gcov: ^1Gcov 使用跟踪基础设施传输数据但尚未完全遵循编码器/传输模型——它固定使用 apptrace 传输JTAG 或 UART不支持自定义传输覆盖率数据既可在应用内硬编码位置转储也可通过 OpenOCDesp gcov命令从主机端按需转储仅限 JTAG。集成自定义跟踪库适配器作者视角esp_trace允许第三方跟踪记录器在不修改 ESP-IDF 的情况下接入框架。外部组件需要提供一个编码器适配器通过ESP_TRACE_REGISTER_ENCODER()注册将跟踪数据格式化为该记录器的协议一个esp_trace_freertos_impl.h头文件定义记录器所需的 FreeRTOS 跟踪钩子启用CONFIG_ESP_TRACE_LIB_EXTERNAL时esp_trace会包含该头文件。编码器实现esp_trace_encoder_vtable_t只有init和write是必需回调start/stop/flush由esp_trace_start()、esp_trace_stop()、esp_trace_flush()调度panic_handler在 Panic 路径被调用使适配器可在不使用常规锁的情况下刷新take_lock/give_lock提供编码器的多核序列化核心自身不加任何锁。编码器实例esp_trace_encoder保存函数表、当前活动会话绑定的传输及编码器特定状态。若需设置传输参数可在init中通过带类型的配置键配置绑定的传输如用ESP_TRACE_TRANSPORT_CFG_HEADER_SIZE设置数据头大小。注册示例ESP_TRACE_REGISTER_ENCODER(sysview, s_sysview_vt);传输则实现esp_trace_transport_vtable_t用ESP_TRACE_REGISTER_TRANSPORT(name, vtable)注册。大多数项目只需自定义编码器并使用已有传输仅当需要新的主机链路时才实现传输。加锁与重入规则write、flush/flush_nolock、read、take_lock/give_lock、panic_handler等运行时回调可能从 FreeRTOS 跟踪钩子中调用部分还会在 ISR 上下文或持有编码器锁时调用。不要在这些回调中调用会触发跟踪钩子的 FreeRTOS 或 IDF API否则可能递归进入编码器、在非递归自旋锁上死锁或在 ISR 上下文中调用仅限任务的 API。应特别避免会让出的任务 APIvTaskDelay、vTaskSuspend、xTaskNotify*、队列/信号量/互斥量 API、流缓冲区与消息缓冲区 API、可能获取内部互斥量的堆分配。回调中应使用无锁或仅自旋锁的原语esp_trace_lock_*、esp_trace_rb_*、底层寄存器访问、原子操作及esp_rom_*辅助函数较重操作FreeRTOS API、内存分配只在init()中执行。对需要复杂驱动或网络协议栈的传输运行时回调只应作为生产者将数据复制到预分配缓冲区如esp_trace_rb_*环形缓冲区后尽快返回由init()创建的工作任务取出数据并在回调路径与编码器锁之外调用 SPI master、socket、StreamBuffer 等 API缓冲区满时应丢弃数据而非把背压传导回回调。相关文档与示例深入阅读以下仓库内资料可进一步掌握各主题跟踪架构Port Adapter 高层设计应用层跟踪传输apptrace 传输与独立用法SystemView 分析OpenOCD 设置与主机端可视化函数跟踪 与 Gcov自定义跟踪库适配器作者契约API 参考ESP Trace API 与 应用层跟踪 APIJTAG 调试设置与硬件配置。仓库内 examples/system/tracing 提供了全套可运行示例app_trace_basic基础应用层跟踪JTAG 日志替代 UART 日志app_trace_to_plot通过 JTAG 发送并绘制虚拟传感器数据sysview_tracingSystemView 记录 FreeRTOS 任务与系统事件sysview_tracing_heap_logSystemView 事件同时记录堆内存分配gcov通过 JTAG 获取源代码覆盖率function_tracing编译器插桩的函数进入/退出跟踪esp_trace_custom_library外部跟踪库集成模板编码器接入、FreeRTOS 钩子包含链、多核序列化。主机端脚本集中在 tools/esp_app_trace包括sysviewtrace_proc.pySystemView 数据解析/函数跟踪解码、logtrace_proc.py日志打印与SYSVIEW_FreeRTOS.txtSystemView 事件 ID 映射文件。【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表