超级版主
 
- 积分
- 5201
- 金钱
- 5201
- 注册时间
- 2019-5-8
- 在线时间
- 1307 小时
|
|
第六章 初识Menuconfig
1)实验平台:正点原子DNESP32P4开发板
2)章节摘自【正点原子】ESP32-P4开发指南— V1.0
3)购买链接:https://detail.tmall.com/item.htm?id=873309579825
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/esp32/ATK-DNESP32P4.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子DNESP32S3开发板技术交流群:132780729
在嵌入式开发中,系统配置的灵活性和定制化是确保硬件与软件高效配合的关键。ESP32-P4提供了强大的配置工具——menuconfig,它是ESP-IDF(Espressif IoT Development Framework)中一个用于配置芯片和系统特性的图形化界面。通过menuconfig,开发者可以轻松调整系统参数、启用或禁用特定的硬件功能,并优化系统性能。本章节将详细介绍如何使用menuconfig进行系统配置,涵盖从基础功能到高级选项的讲解,帮助开发者充分利用ESP32-P4的硬件资源,加速开发流程。
本章将分为如下几个小节:
6.1 项目配置简介
6.2 项目配置菜单
6.1 项目配置简介
Menuconfig是ESP32开发框架ESP-IDF提供的一个基于文本的配置工具,允许开发人员为他们的项目选择硬件和软件配置选项。它是一个基于Kconfig系统的菜单界面,用于设置项目的编译选项、驱动程序、硬件外设配置等。
1,Menuconfig主要功能
1)硬件外设配置:开发者可以启用或禁用各种外设,比如 UART、I2C、Wi-Fi、蓝牙等。
2)系统设置:可以配置 ESP32 的 CPU 频率、任务调度器、内存分配、低功耗模式等。
3)库和组件管理:选择项目需要的库组件,比如 FATFS 文件系统、freeRTOS操作系统等。
4)网络配置:设置 Wi-Fi、蓝牙及其他网络相关的配置。
5)调试和日志选项:设置调试器、日志输出级别等。
2,Menuconfig使用方法
在ESP32-P4的开发过程中,menuconfig工具提供了两种主要的使用方式,用于系统配置和功能定制。我们在之前的章节中已经介绍过这两种方式,分别为命令行方式和图形化方式:
1)命令行方式:通过命令行输入idf.py menuconfig,可以打开menuconfig的文本界面。这种方式适用于所有支持终端操作的开发环境,无论是Windows、Linux还是macOS,开发者都可以直接通过命令行进行配置。
2)图形化配置方式:在VS Code集成开发环境(IDE)中,开发者可以直接通过图形界面打开menuconfig菜单进行配置。这种方式更加直观,适合对终端不熟悉的开发者,或者需要更快的配置流程。
这两种方式各有优势,具体选择哪种方式可根据开发者的习惯和项目需求。
3,Menuconfig工作原理
menuconfig基于Kconfig系统运行,它是Linux内核配置系统的一个变种。Kconfig文件定义了项目中可配置的选项,而menuconfig是其用户界面,通过它用户可以根据项目需求选择不同的配置选项。下图是ESP-IDF项目工程菜单配置流程。
图6.1.1 ESP-IDF项目工程菜单配置流程
从上图中可以看出,当输入“idf.py menuconfig”命令时,顶层的Kconfig文件会调用多个子Kconfig文件,这些文件共同构成了完整的配置选项集。通过这种层次化的配置机制,menuconfig能够将复杂的硬件和软件配置展现为一个直观的图形化配置界面,方便开发者快速浏览和修改配置选项。完成配置后,系统会自动生成一个名为sdkconfig的文件。这个文件在整个项目中起着至关重要的作用,它记录了所有的配置选项,成为构建系统的重要输入。具体来说,sdkconfig文件向构建系统提供了编译和链接项目的指令。这包括启用或禁用特定功能、选择硬件接口、设置网络参数等配置。CMake在构建过程中会读取sdkconfig文件,并根据其中的选项调整整个构建过程,确保生成的固件符合开发者在menuconfig中设定的需求。通过这种方式,menuconfig不仅简化了配置过程,还确保了构建的固件能够精准地匹配项目需求,极大提高了开发的效率和准确性。
6.2 项目配置菜单
接下来,笔者将为大家详细讲解ESP-IDF项目工程中常用的菜单配置项,并说明每个配置项的具体作用。这些配置项为开发者提供了高度的灵活性,允许根据项目需求进行定制化配置。为了帮助大家更直观地了解这些配置项的位置和分类,文中还附上了ESP-IDF项目工程的菜单目录结构图。通过合理调整这些配置,不仅能优化项目的开发流程,还能有效提升开发效率,使项目更贴合具体的应用场景。
首先,在VS Code中按下快捷键“Ctrl + Shift + P”进入所有命令行的页面。在搜索框中输入“Menuconfig”,然后选择相应选项,即可进入图形化的SDK配置编辑器界面,如下图所示。
图6.2.1 ESP32P4项目工程菜单目录
接下来,作者将详细介绍上图中标记为①、②、⑥、⑦和⑨的选项及其具体作用。对于其他分组的选项,建议读者查阅乐鑫官方ESP-IDF编程指南中的menuconfig菜单章节,以获取更全面和详细的信息。这些选项的配置将有助于优化ESP-IDF项目的性能与功能。请注意,以下的截图均来源于VS Code的菜单界面,方便大家更直观地理解各项配置。
1,编译类型(Build type)
用于选择应用程序的构建方式,如下所示。
图6.2.2 编译类型
(1)应用编译类型
在上图中的“Application build type”选项中,默认情况下,应用程序将被构建为与ESP-IDF启动加载器兼容的二进制文件格式(即“binary application + 2nd stage bootloader”)。除了应用程序本身,系统还会生成第二阶段的启动加载器。这些二进制文件可以被写入闪存,并从闪存中加载和执行。另一种适用于非常小且功能有限的应用程序选项是仅链接应用程序的.elf文件(即“Build app runs entirely in RAM (EXPERIMENTAL)”选项),这样可以通过JTAG或UART将应用程序直接加载到RAM中。由于IRAM和DRAM的容量非常有限,复杂的应用程序无法通过此方式构建。但对于一些测试和调试场景,这种方式可以加快迭代速度,因为应用程序不需要每次都写入闪存。
(2)启用可重现构建
“Enable reproducible build”选项启用后,编译过程将消除所有日期、时间和路径信息,并自动生成.gdbinit文件,或者如果已存在该文件,系统会将新信息附加到现有文件中。这确保了每次构建的结果一致性,便于调试和版本控制。
(3)无生成二进制库
“No Binary Blobs”选项启用后,应用程序构建时将禁用二进制库的链接。这意味着Wi-Fi和蓝牙功能将不可用。此选项通常适用于无需这些功能的应用场景。
2,Bootloader配置(Bootloader config)
此部分用于配置启动加载器(Bootloader)的各项设置。在嵌入式系统中,启动加载器负责引导主应用程序的执行。启动加载器的配置选项会直接影响系统启动的效率和行为。Bootloader配置子菜单内容如下所示。
图6.2.3 Bootloader配置子菜单内容
(1)启用时间/日期戳
启用此选项后,启动加载器会在构建时附加时间和日期戳。这对于追踪不同版本的构建时间非常有用,尤其是在调试和版本控制过程中,可以帮助开发人员快速识别构建的时间。
(2)项目版本
此选项允许设置项目的版本号。它可以帮助开发者在不同版本的固件之间进行区分,尤其是在需要跟踪不同版本的更新和修复时非常有用。
(3)启动加载器优化级别
启动加载器的优化级别决定了代码在编译时的优化策略:
Size (-Os):该选项启用后,编译器会尽可能优化代码的大小。它通过移除不必要的代码和数据来缩小生成的启动加载器镜像大小,适用于内存资源有限的设备或项目。
Debug (-Og):此选项针对调试进行了优化。虽然不如其他优化级别那样注重性能或代码大小,但它保留了调试信息,便于开发者调试启动加载器中的问题。这是开发调试期间的推荐选择。
Optimize for performance (-O2):启用此选项后,编译器将尽可能优化代码的执行效率。这会生成更高效的机器代码,以提高启动加载器的运行速度。适用于对启动时间和性能有较高要求的应用场景。
(4)日志
此部分配置启动加载器的日志功能:
No output:选择此选项后,启动加载器不会输出任何日志信息。适用于对日志输出完全不需要的情况。
Error:仅输出错误信息。此级别适用于正常运行时仅监控关键性错误,减少日志冗余。
Warning:输出警告信息和错误信息。用于捕获可能导致问题的非致命性事件,同时减少不必要的详细信息。
Info:输出关键信息、警告和错误信息。此选项适用于希望查看系统状态以及基本启动信息的场景。
Debug:输出调试信息、信息、警告和错误。适用于开发和调试阶段,帮助开发者更详细地跟踪启动过程中的各类事件。
Verbose:输出所有类型的日志,包括详细的调试信息。这是最详细的日志级别,适用于需要完整日志记录的调试场景。
(5)和(6)日记消息输出的颜色格式和时间戳格式
选择日志的输出格式。常见选项包括彩色(Color)输出,使得日志在终端中更容易阅读。也可以选择显示时间戳,默认选项是显示自系统启动以来的毫秒数(Milliseconds Since Boot)。这对于了解各个启动阶段的时序和性能分析非常有帮助。
3,串行Flash配置(Serial flasher config)
配置了与ESP32启动、SPI Flash、RTC看门狗等功能相关的启动行为,如下图所示。
图6.2.4 串行Flash子菜单配置项
(1)强制第二阶段启动加载器以DOUT模式加载,并通过重置Flash恢复Dummy Cycle设置。此选项有助于支持更高的SPI频率,但需要谨慎配置。
(2)启用对XMC品牌Flash芯片的支持,按照XMC推荐的启动流程操作。关闭此选项将禁止使用XMC芯片,除非非常确定,建议不要禁用此选项。
(3)允许通过特定GPIO引脚触发设备恢复出厂设置。这通常用于清除一个或多个数据分区,并从“工厂”分区启动。
(4)允许通过GPIO引脚触发设备从测试应用程序分区启动。此选项可用于调试期间快速切换到测试分区。
(5)启用对未映射内存区域的保护,以防止对这些区域的无意访问。这会触发异常,有助于提升系统安全性。
(6)启用RTC看门狗以监控启动代码的执行时间,防止由于启动代码执行过长而导致系统锁定或重启。
(7)允许用户禁用RTC看门狗。默认情况下,ESP-IDF会在调用app_main()前禁用看门狗。
(8)设置RTC看门狗的超时时间,默认值为9000毫秒。超时后看门狗将重启系统。
(9)启用应用程序回滚支持。当更新后的应用首次启动时,如果应用被确认不可用,则会回滚到之前的工作版本。
(10)在从深度睡眠模式退出时跳过固件镜像的验证。此选项可以加快唤醒速度,但需要谨慎使用,尤其是结合OTA更新时。
(11)启用此选项后,上电复位时将跳过固件镜像验证。这可以加快启动速度,但存在潜在的闪存损坏风险。
(12)始终跳过固件镜像验证,可能导致应用程序的闪存损坏后设备无法启动。此选项通常不建议启用。
(13)此选项允许保留RTC FAST内存用于自定义用途。这部分内存在重启时依然有效(但不包括断电)。
4,分区表配置(Partition Table)
ESP32上分区表的配置,它主要定义了应用程序、数据和其他资源在闪存中的存储位置,该子菜单内容如下图所示。
图6.2.5 分区表子菜单配置项
(1)分区表的类型
这些术语的理解非常准确。
①:“Single factory app, no OTA”:意味着设备上只有一个分区预装的应用程序,不支持后续的OTA(Over-The-Air)远程更新。该应用程序是唯一的,不能通过无线方式进行更新。
②:“Factory app, two OTA definitions”:意味着设备除了分区预装的应用程序外,还预留了两个分区用于OTA更新。这允许设备在运行时通过无线更新应用程序,两次OTA更新可以轮流进行,确保即使更新失败也有可用的应用程序。
③:“Two large size OTA partitions”:表示设备上有两个较大的分区,用于存放OTA更新的应用程序镜像。这允许设备在更新时将新的应用程序放入其中一个分区,而当前分区仍运行旧版本应用程序,从而实现无缝更新。
④:“Custom partition table CSV”:指的是自定义的分区表,以CSV文件格式定义分区的布局。这种表格通常用于指定设备存储资源的分配,比如哪些区域用来存放应用程序、哪些用于OTA、哪些用于用户数据等。和安卓设备的分区表类似,在嵌入式设备中,这种自定义表格能够灵活地定义存储的用途和大小。
(2)指定自定义分区表CSV文件的文件名。
(3)指定分区表的存储地址(默认0x8000)。此选项允许调整分区表的位置,通常为启动加载器腾出更多空间。注意,启动加载器和应用程序都必须使用相同的PARTITION_TABLE_OFFSET值编译。此外,分区表CSV文件中的分区偏移量可能需要调整,以适应更高的分区表偏移值。如果希望每个分区偏移量自动适应配置的分区表偏移,请在CSV文件中将分区偏移留空。
(4)启用后,将为分区表生成MD5校验和,用于保护分区表的完整性。对于不能识别分区表中MD5校验和的旧启动加载器,应关闭该选项。
5,核心组件配置(Component config)
由于核心组件的配置选项过多,难以一一理解,为了帮助读者更好地使用这个子菜单,笔者对核心组件配置做了一次小总结,方便读者理解。ESP-IDF(Espressif IoT Development Framework)中组件配置涵盖了多种硬件驱动、库以及应用层功能。通过分析它们的共性,可以总结如下:
1)ISR 和 IRAM 的优化
①:ISR(中断服务程序)相关优化:多个配置项提到将中断服务程序(ISR)放入IRAM(内部RAM),这可以提高中断处理的响应速度,避免中断代码在外部闪存中运行导致延迟。常见于驱动:MCPWM、TWAI、GPTimer、I2C、I2S、GPIO等
②:IRAM-Safe:有些驱动明确标识了“IRAM-Safe”的功能,这意味着该功能或中断处理被优化为可以安全地在IRAM中执行。
2)调试日志支持
多个驱动程序提供了调试日志选项,允许开发者在开发和调试过程中输出详细的日志信息,以便更好地定位问题。例如:MCPWM、I2C、I2S、GPIO等驱动都有启用调试日志的选项。
3)对旧驱动的支持及弃用警告
多个旧版驱动,如ADC、MCPWM、Timer Group、I2S等,仍然提供配置选项,允许开发者继续使用旧版驱动程序,同时提供了抑制弃用警告的选项(Suppress legacy driver deprecated warning),用于消除编译过程中关于旧驱动弃用的提示。
其他的配置项请参考各个配置项描述的信息。笔者建议读者在开发过程中,深入了解这些配置项,针对需要的配置进行具体研究和应用。 |
|