zephyr笔记 5.3.1 Zephyr 版本 MCUboot 的编译和使用

本文介绍如何在Zephyr操作系统中使用MCUboot作为引导程序,包括配置分区、编译bootloader和应用程序、签名及烧录过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 前言

这一节是翻译自 MCUboot 网站上 MCUboot with Zephyr

MCUboot 最初是 Mynewt 的引导程序。此后,它也成为了 Zephyr 的引导程序。Zephyr 的应用程序在编译方式存在较大大的差异,这里将会记录这些不同之处。

有关 bootloader 的设计和操作文档,请参阅设计文档。这个功能在所有支持的 RTOS 上都是一样的。

我正在学习 Zephyr,一个很可能会用到很多物联网设备上的操作系统,如果你也感兴趣,可点此查看帖子zephyr学习笔记汇总

2 概述

第一步是确保您的主板在其设备树中具有如下定义的闪存分区。这些分区是:

  • boot_partition:用于MCUboot本身
  • slot0_partition:主镜像插槽
  • slot1_partition:辅助镜像插槽
  • scratch_partition:临时插槽

目前,这两个镜像插槽必须是连续的。如果您正使用 MCUboot 作为阶段1引导加载程序,则必须对 boot_partition 进行配置,以便您的SoC在复位状态能运行它。

闪存分区通常在Zephyr boards文件夹中定义,文件是 boards///.dts。例如 frdm_k64f 的.dts文件是 boards/arm/ frdm_k64f/frdm_k64f.dts。要确保 board 目录下的.dts文件的标签与实际使用的硬件相匹配。

3 编译 bootloader 本身

bootloader 是一个普通的 Zephyr 应用程序,至少从 Zephyr 的角度来看是这样。在编译它之前需要做一些配置,其中大部分可以按照 boot/ zephyr 中的 CMakeLists.txt 文件中的说明完成,其中有部分注释是操作指导。最重要的是选择一个签名算法,并决定是否在每次启动时验证 slot0。

要编译 MCUboot,请在 boot/zephyr中创建一个编译目录,并像往常一样编译它:

  cd boot/zephyr
  mkdir build && cd build
  cmake -GNinja -DBOARD=<board> ..
  ninja

除了在 DTS 中定义的分区之外,还需要一些关于闪存布局的附加信息来编译 MCUboot。所有需要的配置都在 boot/zephyr/include/ target.h中收集。根据电路板的不同,这些信息可能来自电路板特定的头文件,设备树,或者由每个SoC系列的 MCUboot 配置。

在编译了 bootloader 之后,二进制文件应在 build/zephyr/zephyr 中。{bin,hex,elf},其中 build 是运行cmake时选择的构建目录。 通常通过从 build 目录运行 make flash(或者ninja flash等)来烧写这些二进制文件。 根据所使用的目标和闪存工具,这可能会在编程引导加载程序映像本身之前擦除整个闪存(整体擦除)或仅擦除引导加载程序所在的扇区。

4 编译适合 bootloader 的应用程序

除了DTS中的闪存分区之外,还需要一些额外的配置来编译 MCUboot 的应用程序。

这由 Zephyr 配置系统在内部处理,并包装在 CONFIG_BOOTLOADER_MCUBOOT Kconfig 变量中,该变量必须在应用程序的 prj.conf 文件中启用。

MCUboot 树中的 samples/zephyr/hello-world 目录包含一个简单的应用程序,包含您需要的所有内容。 你可以在你的主板上尝试它,然后制作一个副本,开始使用自己的应用程序; 有关教程,请参阅 samples/zephyr/README.md。

Zephyr CONFIG_BOOTLOADER_MCUBOOT 配置选项 文档 提供了有关它对映像放置和生成所做更改的其他详细信息,以便应用程序可由 MCUboot 启动。

有了这个,就可以像平常一样编译应用程序。

4.1 应用程序签名

为了升级到镜像(或者甚至启动它,如果启用了MCUBOOT_VALIDATE_SLOT0),必须对镜像进行签名。为了使开发更容易,MCUboot 通过一些示例密钥进行分发。重要的是要强调下永远不要把这些密钥用到生产,因为私钥在这个仓库中是公开的。 请参阅下面关于如何制作自己的签名。

镜像可以使用 scripts/imgtool.py 脚本进行签名。最好查看 samples/zephyr/Makefile 的示例,以了解如何使用。

4.2 烧写应用程序

应用程序本身可以使用常规的闪存工具进行闪存,但是需要对该特定目标的插槽0的偏移量进行编程。 根据平台和闪存工具的不同,您可能需要手动指定对应于插槽0起始地址的闪存偏移量。这通常与使用 Intel Hex映像(.hex)而不是原始二进制映像(.bin)的闪存工具无关,因为前者包含目标地址信息。 此外,您需要确保闪存工具不会执行批量擦除(擦除整个闪存),否则您将删除 MCU Boot。 这些映像也可以标记为升级,并加载到插槽1中,此时引导加载程序应执行升级。在下一次重新引导之前,将slot-0标记为“image ok”是由映像决定的,否则 bootloader 将恢复应用程序。

5 管理签名密钥

5.1 产生新的密钥对

5.2 解压出公钥


<think>我们正在讨论的是在Windows 10上使用MSYS2环境进行Zephyr项目的本地编译。根据引用内容,Zephyr支持在Windows上进行开发,并且提供了相应的环境搭建方法。但是,引用中并没有直接提到使用MSYS2,而是提到了使用Zephyr SDKWindows下的命令行环境(如CMD或PowerShell)以及Python虚拟环境。 然而,用户明确要求使用MSYS2环境。MSYS2提供了一个类Unix的环境,包括包管理器开发工具链,可以用于编译原生Windows程序。因此,我们需要在MSYS2环境中配置Zephyr所需的工具。 根据引用[3],在Windows下搭建Zephyr开发环境需要以下工具: - west:Zephyr项目的多仓库管理工具 - CMake:构建系统生成器 - Ninja:构建工具 - Python 3(以及一些Python包) - 编译器(如GCC) 在MSYS2中,我们可以通过pacman包管理器安装这些工具。 步骤: 1. **安装MSYS2**(如果尚未安装):按照之前指南中的步骤安装MSYS2,并更新系统。 2. **启动合适的MSYS2终端**:对于Zephyr开发,我们可能需要使用UCRT64或MINGW64环境,因为它们提供原生的Windows工具链。注意,Zephyr项目通常需要交叉编译器(如针对ARM的gcc),但这里用户要求的是本机编译(native compilation)。根据引用[2],Zephyr也可以作为本地应用程序在Windows上编译运行(通过POSIX端口)。所以,我们可能需要安装针对宿主系统(x86_64-w64-mingw32)的编译器,以及Zephyr SDK中针对不同架构的交叉编译器。 3. **安装必要的工具**: - 安装west:west是Python包,可以通过pip安装。 - 安装CMake、Ninja、Python等。 4. **设置Python虚拟环境**:引用[3]中使用了Python虚拟环境,我们也建议这样做以避免包冲突。 5. **获取Zephyr源代码**:使用west获取Zephyr项目所有子模块。 6. **设置环境变量**:可能需要设置一些环境变量,例如告诉Zephyr SDK的位置(如果使用Zephyr SDK)或者使用MSYS2自带的工具链。 注意:Zephyr官方推荐使用Zephyr SDK作为工具链,但也可以使用系统自带的工具链。不过,对于交叉编译到嵌入式目标,Zephyr SDK是更方便的选择。而本机编译(native POSIX)则可以使用宿主系统的编译器。 具体步骤: ### 1. 安装更新MSYS2 按照之前指南安装MSYS2,并更新系统(运行`pacman -Syu`,然后关闭终端再打开,运行`pacman -Su`)。 ### 2. 安装基本开发工具 在MSYS2 UCRT64或MINGW64终端中,安装以下包: ```bash pacman -S mingw-w64-ucrt-x86_64-gcc # 或者使用mingw-w64-x86_64-gcc(对于MINGW64环境) pacman -S git cmake ninja pacman -S python python-pip ``` ### 3. 安装west 使用pip安装west(建议在虚拟环境中): ```bash # 创建并激活虚拟环境(可选但推荐) python -m venv .venv source .venv/Scripts/activate # 安装west pip install west ``` ### 4. 获取Zephyr源代码 ```bash # 创建一个工作目录 mkdir zephyrproject && cd zephyrproject # 使用west初始化项目(使用Zephyr的main分支,也可以指定版本) west init -m https://github.com/zephyrproject-rtos/zephyr # 拉取所有子模块 west update ``` ### 5. 导出Zephyr CMake包 ```bash # 在zephyrproject目录下 west zephyr-export ``` ### 6. 安装Python依赖 ```bash pip install -r zephyr/scripts/requirements.txt ``` ### 7. 编译示例(本地应用程序) 现在可以尝试编译一个本地应用程序(native_posix)的例子: ```bash cd zephyr west build -b native_posix samples/hello_world ``` 注意:`native_posix`是一个在POSIX系统(包括Windows上的MSYS2)上运行的Zephyr应用程序。但是,在Windows上,它需要运行在类似POSIX的环境中(如MSYS2)。 ### 8. 运行 ```bash west build -t run ``` ### 可能的问题 - **编译器问题**:如果使用MSYS2自带的GCC,那么对于`native_posix`目标,应该可以编译。但是,Zephyr的`native_posix`目标需要POSIX环境,而MSYS2提供的环境正是这样的环境。 - **路径问题**:确保在MSYS2的终端中运行命令,因为需要Unix风格的路径工具。 ### 验证安装 按照引用[3]中的方法验证: ```bash west --version cmake --version ninja --version python --version ``` ### 注意事项 - Zephyr SDK不是必须的,因为对于`native_posix`目标,我们可以使用宿主系统的GCC(即MSYS2中的GCC)。但是,如果要编译其他目标(如ARM),则需要安装Zephyr SDK或交叉编译器。 - 在MSYS2中,Python环境可能会遇到路径问题,尤其是在虚拟环境中。确保激活虚拟环境后再运行west命令。 ### 相关问题 1. 如何为Zephyr项目添加新的开发板? 2. 如何在Windows上调试Zephyr应用程序? 3. 如何配置Zephyr项目以使用自定义的工具链? 4. 在MSYS2中编译Zephyr项目时遇到路径错误怎么办?</think>以下是在 Windows 10 上使用 MSYS2 环境进行 Zephyr 项目**本机编译**的完整指南,整合了 MSYS2 配置 Zephyr 开发环境搭建的关键步骤: --- ### 一、环境准备 1. **安装 MSYS2** ```bash pacman -Syu # 更新核心组件 pacman -Su # 更新剩余包 ``` > 📌 确保选择 `UCRT64` 终端(兼容性最佳)[^2] 2. **安装基础工具链** ```bash pacman -S --needed git cmake ninja gcc vim python python-pip ``` 3. **配置 Python 虚拟环境** ```bash python -m venv .venv # 创建虚拟环境 source .venv/Scripts/activate # 激活环境 pip install west # 安装 Zephyr 管理工具 ``` --- ### 二、Zephyr 环境搭建 1. **获取 Zephyr 源码** ```bash west init zephyrproject # 初始化工作目录 cd zephyrproject west update # 拉取所有子模块 ``` 2. **安装 Python 依赖** ```bash pip install -r zephyr/scripts/requirements.txt ``` 3. **验证工具链** ```bash west --version # 应输出 v1.4.0+ cmake --version # 需 3.20.1+ ninja --version # 需 1.12.1+ gcc --version # 需 mingw-w64-ucrt-x86_64-gcc ``` --- ### 三、本机编译 Zephyr 应用 1. **编译 hello_world 示例** ```bash west build -b native_posix zephyr/samples/hello_world ``` > 💡 `native_posix` 目标允许在 Windows 本地运行 Zephyr 应用[^2] 2. **运行应用程序** ```bash west build -t run # 输出 "Hello World! Zephyr" ``` 3. **编译 GUI 应用示例** ```bash west build -b native_posix zephyr/samples/gui/lvgl ``` --- ### 四、关键配置说明 1. **环境隔离** - 始终在**激活的 Python 虚拟环境**中执行 west 命令 - 使用 `source .venv/Scripts/activate` 重新激活环境 2. **路径处理** - 在 MSYS2 中使用 Unix 风格路径:`/c/Users/name/zephyrproject` - 避免包含空格的路径(如 `Program Files`) 3. **工具链选择** ```bash # 设置工具链路径(MSYS2 UCRT64) export ZEPHYR_TOOLCHAIN_VARIANT=cross-compile export CROSS_COMPILE=/ucrt64/bin/x86_64-w64-mingw32- ``` --- ### 五、常见问题解决 1. **west 命令未找到** - 确认虚拟环境激活:`which west` 应显示 `.venv/Scripts/west` - 重新安装:`pip install --force-reinstall west` 2. **CMake 配置错误** ```bash # 清除缓存重新配置 rm -rf build west build --pristine ``` 3. **Python 包冲突** ```bash # 重建纯净虚拟环境 python -m pip install --upgrade pip pip install -r zephyr/scripts/requirements.txt --no-cache-dir ``` > ⚠️ **重要提示**:Zephyr 的 `native_posix` 目标通过 POSIX 兼容层在 Windows 运行[^2],实际嵌入式开发需交叉编译。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值