ESP-IDF 中使用 esp-iot-solution GProf 组件做 GNU Profiler 性能分析

发布时间:2026/11/12 9:15:50

ESP-IDF 中使用 esp-iot-solution GProf 组件做 GNU Profiler 性能分析 ESP-IDF 中使用 esp-iot-solution GProf 组件做 GNU Profiler 性能分析【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution导读本文介绍 Espressif IoT Solutionesp-iot-solution仓库中 components/gprof 组件的完整使用方法与底层原理。GProfEspressif GNU Profiler用于统计程序运行过程中各函数及代码段消耗的时间与占比帮助开发者定位热点、指导软件优化。读完本文你将掌握如何在 ESP-IDF 工程中集成该组件、如何配置目标组件与自定义分区、如何调用esp_gprof_init/esp_gprof_save采集数据以及如何用idf.py gprof/idf.py gprof-graphic生成文本分析与 PNG 调用图。GProf 是什么面向 ESP-IDF 的 GNU Profiler根据 components/gprof/README.md 的描述Espressif GNU Profiler 用于评估运行程序中各部分的耗时与占比开发者可据此进行软件优化。它实现了 GNU Profiler 的主要功能并在标准 gprof 基础上针对嵌入式场景做了三点增强统计 OS API 调用信息可采集调用系统接口如sleep、read等的信息该能力针对 Xtensa CPU 提供。按组件粒度选择可只对用户指定的 ESP-IDF 组件进行插桩无需对全部组件生效从而显著减小侵入范围与开销。独立分区存储数据存放在一个类型为data、子类型为0x3a的分区中随固件持久化方便事后导出分析。从源码结构看组件核心实现位于 src/esp_gprof.c对外 API 定义在 include/gprof.h数据格式定义在 private_include/gprof_types.h构建期插桩逻辑位于 gprof.cmake 与 scripts/gprof.py。使用限制原文档明确列出了以下限制使用前务必评估是否符合你的场景不能作用于内核组件如 FreeRTOS、libc、硬件驱动等这类组件的代码结构或链接方式不支持插桩。不能采集 IRAM 中的函数位于 IRAM 的代码段不在 gprof 统计范围内。不支持多线程只能采集调用esp_gprof_init的那个线程的数据_mcount中会通过任务句柄比对过滤其他线程。工作原理速览结合源码可以勾勒出 GProf 的两条数据通路时间直方图time histogramesp_gprof_init内部调用 esp_register_freertos_tick_hook 注册采样回调hist_sample_cbIRAM_ATTR见 esp_gprof.c。每个 tick 回调中读取当前 PCXtensa 下还支持通过栈回溯hist_bt_pc还原调用 PC按下标(pc - low_pc) / HISTFRACTION / sizeof(histcnt_t)累加直方图计数采样率即CONFIG_FREERTOS_HZ。调用关系图call graph构建期通过-pg编译选项在函数入口插入对_mcount的调用gprof.cmake 对选中组件目标添加target_compile_options(... -pg)。_mcountesp_gprof.c用哈希表记录 callerfrom与 calleeto之间的调用弧及次数缓冲区按ARCDENSITY、MINARCS、MAXARCS等参数动态分配见 gprof_types.h。esp_gprof_save会按 gmon 格式依次写入 headermagic 为gmon、时间直方图与调用图数据最后在分区头部写回总大小esp_gprof.c并打印esp_gprof: GProf data is saved successfully。集成步骤四步走1. 添加组件依赖在组件或项目的idf_component.yml中加入依赖dependencies: espressif/gprof: 0.*组件清单 idf_component.yml 显示该组件要求idf 5.1并依赖espressif/cmake_utilities构建期重链接脚本依赖。也可以使用组件管理器命令一键添加idf.py add-dependency espressif/gprof*CMake 阶段组件会被自动下载。2. 在工程 CMakeLists.txt 中包含 gprof 模块在你的工程CMakeLists.txt中、project(XXXX)之后添加project(XXXX) include(gprof)该文件由 project_include.cmake 把gprof.cmake所在的目录加入CMAKE_MODULE_PATH从而让include(gprof)生效。gprof.cmake在CONFIG_GPROF_ENABLE开启时会给选中的组件目标追加-pg编译选项并通过gprof.py relink对链接脚本做二次处理把选中组件的代码段集中到可供 gprof 统计的地址区间详见 gprof.cmake。3. menuconfig 启用并选择目标组件执行idf.py menuconfig按下述路径配置Component config --- Espressif GNU Profiler(GProf) --- [*] Enable Espressif GNU Profiler(GProf) (component_a;component_b) Select components for GProf对应 Kconfig 定义在 components/gprof/KconfigCONFIG_GPROF_ENABLE为总开关默认nCONFIG_GPROF_COMPONENTS为待插桩组件列表。注意多个组件必须以;分隔字符串中不能包含空格等无关符号组件名需与 ESP-IDF 组件目录/管理器命名一致例如示例中用了test_func;espressif__cjson。4. 配置 gprof 数据分区在工程分区表如partitions.csv中加入以下分区类型为data子类型为0x3a# Name, Type, SubType, Offset, Size, Flags gprof, data, 0x3a, , 0x1000,Offset留空表示自动分配。若选中的组件较多或较大可相应增大Size。存储侧实现见 gprof_storage_init它通过esp_partition_find_first(ESP_PARTITION_TYPE_DATA, 0x3a, NULL)查找分区并在保存前整片擦除。构建时 gprof.cmake 会读取该分区的 offset 与 size若找不到会直接FATAL_ERROR报错。API 调用在代码中埋点在工程代码中包含头文件并调用#include gprof.h ESP_ERROR_CHECK(esp_gprof_init()); // Your Code ESP_ERROR_CHECK(esp_gprof_save()); esp_gprof_deinit();四个 API 均在 include/gprof.h 声明API功能说明esp_err_t esp_gprof_init(void)初始化并开始采样分配直方图/调用图缓冲区、擦除分区、注册 tick 钩子并记录当前任务句柄esp_gprof.cesp_err_t esp_gprof_save(void)停止采样并保存数据到分区注销 tick 钩子按 gmon 格式写入 header/直方图/调用图及总大小esp_gprof.cesp_err_t esp_gprof_dump(void)从分区读出并以日志打印使用esp_partition_mmap映射分区后逐条解析打印esp_gprof.c便于在设备端直接观察esp_err_t esp_gprof_deinit(void)反初始化释放缓冲区并复位状态esp_gprof.c内部状态机定义在 gprof_types.hNONE - START - SAVED非法状态下调用对应 API 会返回ESP_ERR_INVALID_STATE。构建、运行与日志确认正常构建并烧录运行等待终端打印esp_gprof: GProf data is saved successfully该日志来自 esp_gprof.c同时ESP_LOGD级别还会打印实际写入的字节数与分区地址。随后即可导出分析。数据分析文本与 PNG 调用图生成文本分析结果idf.py gprof该自定义 target 由 gprof.cmake 定义它读取分区 offset/size、工程 ELF 与编译器调用scripts/gprof.py dump生成build/{PROJECT_NAME}.gprof.out供 gprof 工具链解析。生成 PNG 可视化调用图PNG 输出目前仅支持 Ubuntu 与 MacOS需先安装依赖工具Ubuntusudo apt install graphviz pip3 install gprof2dotMacOSbrew install graphviz pip3 install gprof2dot然后执行idf.py gprof-graphic生成图片位于build/{PROJECT_NAME}.gprof.png。该 target 在 gprof.cmake 中定义等价于gprof.py dump ... --graphic内部借助gprof2dotgraphviz将调用图渲染为图片便于快速识别热点调用路径。示例工程gprof_simple可通过组件管理器从示例模板创建工程idf.py create-project-from-example espressif/gprof*:gprof_simple该命令会把示例gprof_simple下载到当前目录进入后即可构建烧录。示例源码同时存放在本仓库 examples/gprof/gprof_simple其主程序非常简洁#include gprof.h #include test_func.h void app_main(void) { ESP_ERROR_CHECK(esp_gprof_init()); test_func(); ESP_ERROR_CHECK(esp_gprof_save()); esp_gprof_deinit(); }对应的 CMakeLists.txt 中project(gprof_simple)之后紧跟include(gprof)partitions.csv 展示了gprof, data, 0x3a, , 0x1000,的实际写法sdkconfig.defaults 给出了最小可用的配置组合CONFIG_GPROF_ENABLEy CONFIG_GPROF_COMPONENTStest_func;espressif__cjson CONFIG_PARTITION_TABLE_CUSTOMy CONFIG_PARTITION_TABLE_CUSTOM_FILENAMEpartitions.csv CONFIG_PARTITION_TABLE_FILENAMEpartitions.csv示例把test_func组件与第三方组件espressif__cjson作为插桩对象并切换到自定义分区表以容纳 gprof 数据分区是理解整套配置如何落地的直接参考。小结快速上手idf_component.yml加依赖 →CMakeLists.txt加include(gprof)→ menuconfig 开启并填组件列表 → 分区表加data/0x3a分区 → 代码中esp_gprof_init/esp_gprof_save→idf.py gprof分析。适用范围面向用户应用组件示例中为test_func、espressif__cjson这类业务组件不适用于内核、libc、驱动等底层组件不支持 IRAM 代码与多线程采样。可选增强esp_gprof_dump可在设备端直接打印原始数据idf.py gprof-graphic可生成 PNG 调用图帮助直观定位热点路径。如需进一步深入可阅读 components/gprof 目录下的 gprof.cmake、scripts/gprof.py 与 src/esp_gprof.c 源码并结合 examples/gprof/gprof_simple 示例工程实际运行验证。【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/10 13:45:52

机器学习工程实践:从数据划分到模型评估的闭环路线图

简介:本资源为清华大学精品人工智能课程第5章《机器学习》独立讲义,面向高校本科生、AI初学者及转行学习者,系统讲解机器学习核心概念与工程实践路径。内容覆盖机器学习定义与分类(监督/无监督/半监督/强化学习)、数据…

2026/11/10 14:04:43

终端多路复用器 herdr 下,Codex 的 Token 从 TaoToken 出

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/12 9:14:40

北京电工证丢了官方回应全流程办理指南

北京电工证丢了官方回应全流程办理指南 你还在为北京电工证丢了而发愁?马上就要上岗找工作了,却偏偏这时候证件丢失,简直是雪上加霜。别慌,官方已经给出明确回应,今天就带你看清全流程,快速拿回你的电工证。 电工证丢了还能用吗? 北京电工证丢了…

2026/11/12 9:14:40

通州电工证培训哪家好 不知道去哪报名怕被中介坑多少钱

通州电工证培训哪家好 不知道去哪报名怕被中介坑多少钱 你是不是也这样,看到网上各种“通州电工证培训哪家好”的广告,心里直打鼓,怕被坑了钱还拿不到证?特别是像你这种新乡公路工程的从业者,想转行、想升职,或者只是想干点零活,但电工证是硬门槛,…

2026/11/12 9:14:40

平度学习电工证怎么考?考前押题助你一次性通过

平度学习电工证怎么考?考前押题助你一次性通过 你缺一张特种作业证,正愁找不到工作?别急,平度学习电工证考前押题已经帮你把关好了。今天就给你讲讲,从报名到考试,怎么一步步拿下电工证,别再因为证件问题耽误你的前程。…

2026/11/12 9:14:40

电工证补贴还有没有?上岗必备证件别再白交钱了

电工证补贴还有没有?上岗必备证件别再白交钱了 怕考不过白交培训费?现在电工证补贴还有没有?不少建筑工人在报名前都纠结这事,尤其是开封的在职建筑工人,手里没个电工证,连上岗资格都拿不到,更别提享受补贴政策了。但很多人不知道,现在电工证的补贴政…

2026/11/12 9:14:40

德国公司需要电工证吗 2026河南最新政策下特种作业证如何快速上手

德国公司需要电工证吗 2026河南最新政策下特种作业证如何快速上手 你是不是正愁找不到工作?是不是刚毕业的工程类学生,手里什么证都没有,连面试机会都少?2026年河南最新政策明确规定,从事特种作业的岗位必须持证上岗,特别是像电工这样的岗位,…

2026/11/11 12:42:59

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/12 0:04:01

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘 工地太忙根本没时间复习考试?你不是一个人。作为一名在南阳卧龙区干了七八年市政公用工程的电工,我深知这个问题的现实性。电工证不仅是工作的“入场券”,更是职业发展的“通行证”,但备考过程…

2026/11/12 0:04:01

双流电工证考别怕挂科!郑州报考避坑指南全攻略

双流电工证考别怕挂科!郑州报考避坑指南全攻略 实操考试心里没底怕挂科?双流电工证考在郑州报名,很多人因为不了解流程、准备不充分,白白浪费时间和金钱。作为三门峡应届工程类毕业生,我也曾经历过这样的焦虑。今天就从零开始,手把手教你如何避开郑州报…

2026/11/12 0:04:01

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少 之前考的证在外省能不能转过来?这个问题确实让不少准备换城市工作的朋友犯了难,尤其像电工证这种实操性很强的证书,很多人担心跨省后证书能不能继续用。其实,只要符合相关流程,是可以顺利转…

2026/11/11 20:27:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑