ESP-IDF 例程——custom_bootloader
4. custom_bootloader 目录
4.1 bootloader_hooks
| 字段 | 描述 |
|---|---|
| 例程名称 | 引导加载程序钩子示例 |
| 所在文件夹路径 | examples\custom_bootloader\bootloader_hooks |
| 核心功能说明 | 演示如何向第二阶段引导加载程序添加钩子函数,在引导加载程序初始化前后执行自定义代码 |
| 主要调用的内部/外部函数或模块 | - bootloader_hooks.h 中定义的钩子函数接口 |
- 自定义钩子函数实现(hooks.c)
- bootloader初始化相关函数 |
| 输入输出参数说明 | 配置参数: - 无特定输入参数,通过hooks.c实现钩子函数
输出结果:
- 引导加载程序初始化前显示:”I (24) HOOK: This hook is called BEFORE bootloader initialization”
- 引导加载程序初始化后显示:”I (60) HOOK: This hook is called AFTER bootloader initialization”
- 应用程序启动显示:”User application is loaded and running.” |
| 适用场景及典型应用案例 | - 需要在引导加载过程中执行自定义初始化操作 - 引导加载程序阶段的设备状态检查
- 自定义引导加载程序日志输出
- 硬件初始化或检测 |
4.2 bootloader_override
| 字段 | 描述 |
|---|---|
| 例程名称 | 引导加载程序覆盖示例 |
| 所在文件夹路径 | examples\custom_bootloader\bootloader_override |
| 核心功能说明 | 演示如何完全覆盖ESP-IDF的第二阶段引导加载程序,实现自定义引导加载逻辑 |
| 主要调用的内部/外部函数或模块 | - 自定义引导加载程序实现(bootloader_start.c) |
- KConfig配置系统
- 链接器脚本 |
| 输入输出参数说明 | 配置参数: - 通过KConfig定义自定义引导加载程序消息
- 可通过CMake条件控制是否覆盖引导加载程序
输出结果:
- 引导加载程序启动时显示:”[boot] Custom bootloader message defined in the KConfig file.” |
| 适用场景及典型应用案例 | - 需要完全自定义引导加载程序逻辑 - 实现特殊的引导加载顺序或安全检查
- 添加自定义引导加载程序功能
- 引导加载程序级别的设备保护 |
4.3 bootloader_multiboot
| 字段 | 描述 |
|---|---|
| 例程名称 | 多引导加载程序示例 |
| 所在文件夹路径 | examples\custom_bootloader\bootloader_multiboot |
| 核心功能说明 | 演示如何创建一个多引导加载程序,允许用户在启动时选择要运行的应用程序 |
| 主要调用的内部/外部函数或模块 | - 自定义引导加载程序实现(bootloader_start.c) |
- 分区表管理
- 应用程序选择界面
- 键盘输入处理 |
| 输入输出参数说明 | 配置参数: - 通过partitions.csv定义多个应用分区
- 可配置引导菜单样式
输出结果:
- 引导菜单显示所有可用的引导分区
- 支持键盘选择和确认操作
- 启动所选应用程序 |
| 适用场景及典型应用案例 | - 开发多应用程序设备 - 支持固件版本切换
- 调试和测试多个应用程序
- 实现恢复模式和主应用模式切换 |
4.4 bootloader_extra_dir
| 字段 | 描述 |
|---|---|
| 所在文件夹路径 | examples\custom_bootloader\bootloader_extra_dir |
| 核心功能说明 | 演示如何向引导加载程序构建添加自定义组件目录,实现引导加载程序功能扩展 |
| 主要调用的内部/外部函数或模块 | - BOOTLOADER_EXTRA_COMPONENT_DIRS CMake属性 |
- 自定义组件实现(extra_component.c)
- 引导加载程序钩子机制 |
| 输入输出参数说明 | 配置参数: - 通过CMakeLists.txt设置BOOTLOADER_EXTRA_COMPONENT_DIRS
- 自定义组件实现
输出结果:
- 引导加载程序显示:”I (60) EXTRA: This function is called from an extra component”
- 应用程序正常启动 |
| 适用场景及典型应用案例 | - 模块化扩展引导加载程序功能 - 分离引导加载程序自定义代码
- 实现可复用的引导加载程序组件
- 简化复杂引导加载程序的维护 |
4.5 技术要点
- 引导加载程序组件命名规则:
bootloader_components/main- 完全覆盖第二阶段引导加载程序bootloader_components/any_name- 添加引导加载程序组件和钩子
- 钩子函数类型:
- 初始化前钩子:在引导加载程序初始化前执行
- 初始化后钩子:在引导加载程序初始化后、加载分区前执行
- 多引导实现:
- 需要自定义分区表
- 支持factory分区和多个ota_n分区
- 应用程序名称显示为项目名而非分区名
- 额外组件添加:
- 通过BOOTLOADER_EXTRA_COMPONENT_DIRS CMake属性实现
- 支持目录路径或单个组件路径
4.6 构建与运行
所有custom_bootloader例程的构建方法基本一致:
- 配置目标芯片:
idf.py set-target esp32 - 构建项目:
idf.py build - 烧录并监控:
idf.py flash monitor
4.7 应用场景总结
- 钩子机制:适用于需要在引导过程中执行少量自定义代码的场景
- 完全覆盖:适用于需要深度定制引导加载程序的场景
- 多引导:适用于需要在设备上运行多个应用程序的场景
- 额外组件:适用于需要模块化扩展引导加载程序功能的场景
这些例程展示了ESP-IDF引导加载程序的高度可定制性,允许开发者根据需求灵活扩展或修改引导加载行为。
ESP-IDF 例程——custom_bootloader
https://blog.zhaosn.top/ESP32-examples/04.custom_bootloader/