跑通 Hello World 之后,我第一次真正用懂了 ESP32 的 menuconfig 和日志系统

跑通 Hello World 之后,我是怎么第一次真正用上 ESP32 的 menuconfig 和日志系统的

hello_world 跑通那天,我其实挺开心的。

程序能烧进去,串口能正常打印,一切看起来都很顺利。
但也正是在这一步之后,我开始意识到一个问题:

串口里的信息,好像有点多了。

一开始我以为,这是我代码写得“太啰嗦”。
但后来我才发现,这件事根本不只是代码层面的。


我最早遇到的问题,其实只是:日志太多了

刚开始学习 ESP32 的时候,串口日志对我来说是“安全感来源”。

能看到打印,就说明程序在跑。

但当工程慢慢从hello_world变成我自己的最小工程后,日志开始变得:

  • 信息很多
  • 启动阶段刷一大堆
  • 有些内容我完全看不懂

我当时的第一反应很新手:

那我少打点printf不就好了?

结果发现,没什么用

因为即使我代码里什么都不打印,启动时串口里还是会冒出一堆系统日志。


这时候我才意识到:ESP32 的日志,不完全由代码决定

真正让我意识到问题不在代码里的,是这件事:

我把自己写的日志全删了,串口还是很热闹。

后来我才知道,在 ESP-IDF 里,日志是一个完整的系统机制

  • 有统一的日志接口
  • 有日志等级
  • 有默认输出策略
  • 还有和 menuconfig 强绑定的配置项

也正是从这里开始,我第一次认真点开了:

idf.py menuconfig

第一次打开 menuconfig,我的真实心态:不是看不懂,是不敢动

menuconfig 的界面第一次打开时,给人的感觉很“底层”。

蓝色背景,一行一行配置,看起来就像是:

一不小心改错,整个系统都会出问题。

所以我当时并没有“系统性研究”,而是只盯着一个目标:

我能不能控制日志?

操作方式

看似很复杂,但是只要了解一下这个窗口的操作方式就简单了:

方向键(↑ ↓ ): ↑ 和 ↓:在菜单项之间上下移动。 如果是window环境,方向按键可能是j、k或者↑、↓ Enter(回车): 进入子菜单或打开选项的配置界面。 Space(空格): 开启或关闭某个配置,[]为未选择,[*]为选择。 Esc: 返回上一级菜单。 多次按Esc可以退出菜单。

退出时,如果你有修改了相关配置,会提示你是否保持配置,如果你不想修改,记得选N。

接着,我们可以添加一点自己的配置,我们先按Esc按键退出,如果你已经修改了配置,这里会提问你是否保存,记得点击按键N即可。


menuconfig 改的东西,最终都体现在 sdkconfig 里

这是我后来慢慢理解的一点。

当你在 menuconfig 里改完配置、保存退出后,ESP-IDF 实际做的是:

把你的选择,写进sdkconfig文件。

这个文件本质上是一堆宏定义,比如:

CONFIG_LOG_DEFAULT_LEVEL_INFO=y CONFIG_LOG_DEFAULT_LEVEL_DEBUG=n

也就是说:

  • menuconfig 是“操作界面”
  • sdkconfig 才是真正参与编译的配置来源

从这以后,我基本形成了一个习惯:

只要 menuconfig 改了东西,就去看一眼 sdkconfig。

添加自己的菜单

其实,换句话说,这里只是idf提供了一个可视化的配置,方便我们配置sdkconfig文件而已,我们修改后重新执行idf.py build编译。

我想能不能在menuconfig中添加我自己的定制的菜单,应该如何添加呢?后面通过学习我发现,也很简单,我在自己工程中添加了一个main/Kconfig.projbuild文件,注意:是main文件夹下方

Kconfig.projbuild

#puthere your custom config valuemenu"Example Configuration"config ESP_WIFI_SSID string"WiFi SSID"default"myssid"helpSSID(network name)forthe example to connect to.config ESP_WIFI_PASSWORD string"WiFi Password"default"mypassword"help WiFipassword(WPA or WPA2)forthe example to use.endmenu

解释

#puthere your custom config value--》注释menu"Example Configuration"--》菜单名 config ESP_WIFI_SSID-》参数名 string"WiFi SSID"-》参数类型 显示名称,参数类型支持boolintstringdefault"myssid"-》默认值 help-》帮助信息SSID(network name)forthe example to connect to.endmenu-》菜单结束标志

这时候,我运行了idf.py menuconfig后,可以看到窗口中多了Example Configuration的配置。

接着操作选择并修改,按Enter回车键可以进入下一层。

这个窗口中的配置,保存下来后,会影响的其实就是工程的sdkconfig文件:

然后我添加了对这几个打印行,看看他到底是怎么样的

#include<stdio.h>// 引入标准输入输出库,用于使用 printf 函数#include"freertos/FreeRTOS.h"// 引入 FreeRTOS 的核心头文件,提供 FreeRTOS 的基本功能#include"freertos/task.h"// 引入 FreeRTOS 的任务管理头文件,提供任务相关的函数(如 vTaskDelay)#include"sdkconfig.h"voidapp_main(void)// ESP-IDF 程序的入口函数,类似于 main 函数{inti=0;// 定义一个整数变量 i,并初始化为 0,用于计数while(1){// 无限循环,确保程序持续运行printf("%s %s\n",CONFIG_ESP_WIFI_SSID,CONFIG_ESP_WIFI_PASSWORD);printf("[%d] Hello world!\n",i);// 打印带计数的 "Hello world!" 消息,%d 会被变量 i 的值替换i++;// 计数器 i 自增 1vTaskDelay(5000/portTICK_PERIOD_MS);// 延时 5000 毫秒(5 秒)// portTICK_PERIOD_MS 是 FreeRTOS 的时钟节拍周期(系统计时器的"心跳间隔" 通常为 1 毫秒)}}

idf.py build进行编译,idf.py flash monitor烧录运行后,可以看到:


我第一次真正“理解”日志系统,是从日志等级开始的

在 menuconfig 里,我最早动的地方是:

Component config → Log → Log Level




这里有一个选项,叫:

Default log verbosity


当时我对它的理解非常朴素:

它决定了,系统默认“愿不愿意”把日志打出来。

ESP-IDF 里常见的日志等级有:

  • Error
  • Warn
  • Info
  • Debug
  • Verbose

我一开始保持在Info,这是一个非常适合入门阶段的选择。

后来我试过切到Debug,然后立刻体会到了什么叫:

串口被日志淹没。

这时候我才真正理解,日志等级不是“随便选的”,而是系统运行策略的一部分。


日志不是 printf,而是一套统一机制

在真正看了一点日志相关文档后,我才意识到一件事:

ESP-IDF 并不推荐你长期用printf打日志。

而是提供了一整套日志接口,比如:

ESP_LOGE(TAG,"this is esp log");//错误日志,用于记录系统中发生的严重错误,这些错误通常会导致程序无法正常运行或产生严重的异常情况。ESP_LOGW(TAG,"this is esp log");//警告日志,用于记录可能会影响程序正常运行,但不会导致程序崩溃的潜在问题或异常情况。ESP_LOGI(TAG,"this is esp log");//信息日志,用于记录程序的正常运行状态和重要事件,帮助开发者了解程序的执行流程和关键操作的结果。ESP_LOGD(TAG,"this is esp log");//调试日志,用于记录程序的详细执行过程和中间结果,主要用于开发和调试阶段,帮助开发者排查问题。ESP_LOGV(TAG,"this is esp log");//详细日志,用于记录最详细的程序执行信息,输出的日志信息最多,会带来较大的系统开销,通常只在开发和调试阶段使用。

并且当在menuconfig中配置为保存后,也可以看到在sdkconfig文件中看到内容:

再经过编译下载烧录,运行后:

这些日志宏背后,都会受到:

  • menuconfig 中日志等级配置
  • 组件级别日志开关
  • 系统默认输出策略

的共同影响。

这也是为什么:

你代码里写了日志,但它不一定会被打印出来。


更加快捷的menuconfig搜索

前面我手动一个个设置寻找然后选择,效率还是太低了,那有没有直接搜索设置名称的方式呢?
我后面发现,可以在执行idf.py menuconfig时:

按/,搜索LOG_DEFAULT_LEVEL,注意,这里没有CONFIG


就可以看到日志级别的菜单,然后点击Enter回车,就可以直接进入到最终的设置页面。
方便了不少。


我踩过一次日志相关的坑

有一次,我为了“让系统干净一点”,误关了某个日志输出相关配置。

结果是:

  • 程序能烧
  • 板子在跑
  • 串口一片安静

那一刻我真的怀疑过人生:

程序是不是没跑?
串口是不是坏了?

最后对比sdkconfig才发现,是我自己把日志系统“关死”了。

从那之后,我给自己立了两个规则:

  1. 日志相关配置,一次只改一个
  2. 改完马上验证串口输出

menuconfig + 日志系统,其实是在帮你“管理复杂度”

回头看,我现在反而挺感谢 ESP-IDF 把日志这件事做得这么“重”。

因为它提前告诉你一件事:

当系统变复杂时,日志本身就是工程的一部分。

你不能指望靠几句printf,就撑起一个复杂系统的调试需求。


写在最后

如果你现在也处在这个阶段:

  • hello_world 刚跑通
  • 开始写自己的最小工程
  • 串口日志越来越多
  • 开始意识到“不太对劲”

那我想说一句很实在的话:

menuconfig 和日志系统,不是高级内容,而是入门必经之路。

你现在不需要完全掌握它们,只需要知道:

  • 日志不是随便打的
  • 行为不是只由代码决定的
  • menuconfig 是工程的一部分

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1125988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sentieon软件发布V202503.02版本

一、Sentieon最新版本V202503.02 Sentieon团队持续优化升级产品&#xff0c;现已发布V202503.02版本。本文将详细介绍此次更新中的新功能和问题修复&#xff0c;以帮助您更好地了解和使用Sentieon最新版本。 图1 Sentieon V202503.02版手册目录 二、下载链接 新版本的Sentieon…

毅硕HPC | InfiniBand网络在HPC集群中的核心应用

一、引言&#xff1a; HPC 离不开 InfiniBand网络是高性能计算集群的“神经系统”——它决定了计算资源的协同效率、应用的可扩展性&#xff0c;以及最终的科学发现速度。在众多网络技术中&#xff0c;InfiniBand&#xff08;IB&#xff09;凭借其超低延迟、高带宽和硬件级卸载…

AgentRun 实战:快速构建 AI 舆情实时分析专家

舆情分析是企业感知市场脉搏、预警公关危机的“听诊器”&#xff0c;然而传统的舆情分析系统更像是一个个“手工作坊”&#xff0c;面临数据收集效率低、分析深度不够、实时性差等问题&#xff0c;经常反馈之后&#xff0c;等企业拿到报告时&#xff0c;舆论热点早已转移&#…

“十四五”国产工业软件政策落地:ZWPD在流程工业的实践与探索

工业软件是制造业数字化转型的核心支撑&#xff0c;更是保障产业链供应链安全的关键基础。“十四五”规划明确提出“突破核心工业软件”“推进工业软件国产化替代”的发展目标&#xff0c;一系列配套扶持政策相继出台&#xff0c;为国产工业软件发展注入强劲动力。流程工业作为…

Llama 是开源的,但为什么?

原文&#xff1a;towardsdatascience.com/llama-is-open-source-but-why-3f87d290d0d5?sourcecollection_archive---------5-----------------------#2024-06-25 观点 Meta 开源大模型战略分析 https://haifeng-jin.medium.com/?sourcepost_page---byline--3f87d290d0d5---…

OLAP助力大数据:实现快速决策的秘诀

OLAP助力大数据&#xff1a;实现快速决策的秘诀关键词&#xff1a;OLAP、大数据分析、多维数据、快速决策、商业智能摘要&#xff1a;在数据爆炸的今天&#xff0c;企业如何从海量数据中快速“挖”出决策所需的关键信息&#xff1f;OLAP&#xff08;联机分析处理&#xff09;正…

SpringBoot+Vue 甘肃非物质文化网站管理平台源码【适合毕设/课设/学习】Java+MySQL

&#x1f4a1;实话实说&#xff1a; 有自己的项目库存&#xff0c;不需要找别人拿货再加价&#xff0c;所以能给到超低价格。 摘要 在全球化与数字化快速发展的背景下&#xff0c;非物质文化遗产的保护与传承显得尤为重要。甘肃作为中国西北地区文化资源丰富的省份&#xff0c…

这是一份简洁实用的 CSS 开发速成手册

好的&#xff0c;这是一份简洁实用的 CSS 开发速成手册&#xff0c;涵盖核心概念和常用技巧&#xff1a;一、 基础概念选择器作用&#xff1a;指定哪些 HTML 元素应用样式。常见类型&#xff1a;元素选择器&#xff1a;p { ... } (选择所有 <p> 元素)类选择器&#xff1a…

cat /proc/interrupts 验证nvme 中断聚合

最近做了一次实验 用cat /proc/interrupts 抓取nvme的中断次数 &#xff0c;来验证开启了中断聚合后&#xff0c;中断次数是否会减少 1 首先我们先看下盘的默认值是多少 [debian~]#nvme get-feature /dev/nvme9 -f 0x7 -H #查看支持的最大队列 get-feature:0x7 (Number of Que…

大数据分析中的文本挖掘:非结构化数据决策

大数据分析中的文本挖掘:非结构化数据决策 关键词:文本挖掘、非结构化数据、自然语言处理、情感分析、主题建模、词嵌入、决策支持 摘要:本文深入探讨大数据分析中文本挖掘技术的核心原理和应用。我们将从非结构化数据的特点出发,逐步解析文本挖掘的关键技术流程,包括文本…

SpringBoot+Vue 教师工作量管理系统平台完整项目源码+SQL脚本+接口文档【Java Web毕设】

&#x1f4a1;实话实说&#xff1a;有自己的项目库存&#xff0c;不需要找别人拿货再加价&#xff0c;所以能给到超低价格。摘要 随着教育信息化的快速发展&#xff0c;高校教师工作量管理逐渐成为教学管理中的重要环节。传统的人工统计方式效率低下&#xff0c;容易出错&#…

ICLR 2026 Workshop 征稿开启:迈向 Lifelong Agent 终身智能新范式

人工智能正在进入一个新的转折点。以大语言模型&#xff08;LLM&#xff09;、强化学习&#xff08;RL&#xff09;和具身智能&#xff08;Embodied AI&#xff09;为核心的 AI Agent 迅速崛起&#xff0c;展现出规划、推理、工具调用、自主决策等多维能力。然而&#xff0c;当…

GEO优化服务商技术全景评估:从原理到实践的专业导航

摘要随着ChatGPT、Kimi、豆包等AI搜索引擎成为信息获取新入口&#xff0c;传统SEO规则正在失效&#xff0c;“品牌隐身”成为企业新痛点。GEO&#xff08;生成式引擎优化&#xff09;应运而生&#xff0c;旨在通过理解AI认知逻辑、构建权威知识源&#xff0c;使品牌在AI对话中被…

GEO优化服务报价与全功能解析

摘要当潜在客户越来越多地使用ChatGPT、Kimi、文心一言等AI对话引擎来替代传统搜索&#xff0c;提出诸如“制造业用什么MES系统好&#xff1f;”或“本地可靠的B2B软件供应商推荐&#xff1f;”等问题时&#xff0c;许多企业的品牌信息却在这些关键决策场景中“消失”了。这并非…

【毕业设计】SpringBoot+Vue+MySQL 在线文档管理系统平台源码+数据库+论文+部署文档

&#x1f4a1;实话实说&#xff1a;有自己的项目库存&#xff0c;不需要找别人拿货再加价&#xff0c;所以能给到超低价格。摘要 随着信息化技术的快速发展&#xff0c;传统纸质文档管理模式已难以满足现代企业和机构的高效协作需求。在线文档管理系统通过数字化手段实现文档的…

网上点餐系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

&#x1f4a1;实话实说&#xff1a;有自己的项目库存&#xff0c;不需要找别人拿货再加价&#xff0c;所以能给到超低价格。摘要 随着互联网技术的快速发展和智能手机的普及&#xff0c;线上点餐已成为餐饮行业的重要趋势。传统的线下点餐方式存在效率低、人力成本高、顾客等待…

3分钟定位OA系统GC瓶颈:DeepFlow全栈可观测平台实战解析

摘要&#xff1a;本文深入探讨了 DeepFlow全栈可观测性平台 在企业核心OA系统中的实战应用。针对某大型客户OA系统长期存在的响应迟缓、偶发故障等顽疾&#xff0c;DeepFlow通过零侵扰数据采集技术&#xff0c;构建了从网关到应用、数据库的全景拓扑与实时告警体系。在一次典型…

基于时间片划分的提醒算法设计与实现

文章目录前言理论基础时间片概念算法核心原理提醒算法详解1. 核心数据结构定义2. 时间片计算核心算法3. 核心提醒判断逻辑4.测试用例使用场景用户通知系统系统维护提醒健康管理应用企业任务管理总结前言 在现代软件系统中&#xff0c;定时提醒功能是许多业务场景的核心需求&am…

芯科科技出展CES 2026并展出如何加速互联智能的未来

专为Zephyr优化的全新Simplicity SDK助力下一代物联网简化实时操作系统部署 低功耗无线解决方案创新性领导厂商Silicon Labs&#xff08;亦称“芯科科技”&#xff0c;NASDAQ&#xff1a;SLAB&#xff09;再度出展国际消费电子展&#xff08;CES&#xff09;&#xff0c;并全面…

基于SpringBoot+Vue的网上超市设计与实现管理系统设计与实现【Java+MySQL+MyBatis完整源码】

&#x1f4a1;实话实说&#xff1a;CSDN上做毕设辅导的都是专业技术服务&#xff0c;大家都要生活&#xff0c;这个很正常。我和其他人不同的是&#xff0c;我有自己的项目库存&#xff0c;不需要找别人拿货再加价。我就是个在校研究生&#xff0c;兼职赚点饭钱贴补生活费&…