ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Windows系统下Zephyr RTOS开发环境搭建全攻略:从WSL2配置到第一个程序运行

Windows系统下Zephyr RTOS开发环境搭建全攻略:从WSL2配置到第一个程序运行 1. 为什么在Windows上搭建Zephyr环境是个“技术活”如果你是一个嵌入式开发者最近想玩玩物联网操作系统Zephyr RTOS绝对是一个绕不开的名字。它由Linux基金会托管支持从8位MCU到64位应用处理器的海量硬件模块化设计也相当漂亮。但当你兴冲冲地打开官方文档准备在Windows上搭建一个开发环境时很可能瞬间就懵了——这可能是你遇到过最复杂的“Hello World”准备工作之一。我最初也是这么想的。官方文档虽然详尽但路径依赖严重默认假设你使用Linux或macOS。在Windows上你需要处理Python环境、CMake、Ninja、West工具链、交叉编译器还有各种依赖库任何一个环节的版本不匹配或路径问题都可能导致构建失败。更别提那些隐藏在文档角落里的、针对Windows的“特殊说明”。所以这篇内容不是对官方文档的简单翻译而是我踩了无数坑之后总结出的一套在Windows 10/11上从零开始、稳定搭建Zephyr工作空间的保姆级实操指南。我会告诉你每一步“为什么”要这么做以及遇到那些稀奇古怪的错误时该如何定位和解决。我们的目标很明确搭建一个纯净、隔离、可复现的Zephyr开发环境让你能顺利编译第一个示例程序并为后续的代码开发、调试和烧录打下坚实基础。整个过程我们将严格使用官方推荐的工具和方法避免引入不必要的“野路子”。2. 环境准备构建稳固的基石搭建Zephyr环境本质上是在配置一个高度定制化的命令行开发环境。在Windows上我们有两个主流选择Windows Subsystem for Linux (WSL2)和原生Windows命令行如PowerShell。我强烈推荐使用WSL2原因如下生态一致性Zephyr的核心工具链如west、CMake、Ninja和大量脚本最初是为Unix-like环境Linux/macOS设计的。在WSL2的Linux发行版中运行可以最大程度避免因平台差异导致的诡异问题。依赖管理简单在Linux中通过apt等包管理器安装编译依赖如libssl-dev,device-tree-compiler是一行命令的事。在原生Windows上你可能需要手动下载、配置各种库过程繁琐且容易出错。路径与权限Linux的文件路径和权限系统更清晰能避免Windows路径中的空格、中文以及权限问题对构建过程的干扰。当然如果你因为某些原因必须使用原生Windows我也会在关键步骤指出需要注意的差异。但为了最佳体验和最低的踩坑概率请跟随我优先配置WSL2。2.1 启用并配置WSL2首先确保你的Windows版本是Windows 10版本 2004 及更高版本内部版本 19041 及以上或 Windows 11。步骤一启用WSL和虚拟机平台以管理员身份打开PowerShell运行以下命令# 启用适用于 Linux 的 Windows 子系统 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart # 启用虚拟机平台功能 dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart执行完成后重启计算机。这个重启是必须的否则后续步骤无法进行。步骤二设置WSL2为默认版本重启后再次以管理员身份打开PowerShell运行# 将WSL2设置为默认版本 wsl --set-default-version 2如果提示需要更新WSL2内核组件请按照提示下载并安装。步骤三安装Linux发行版打开Microsoft Store搜索并安装一个你喜欢的Linux发行版例如Ubuntu 22.04 LTS。这是Zephyr官方文档中常用来举例的发行版社区支持最好。安装完成后从开始菜单启动它系统会提示你创建新的用户名和密码。这个账户将是你在WSL环境中的主要账户请务必记住密码。步骤四验证WSL2安装在Windows PowerShell中运行wsl -l -v你应该能看到安装的发行版并且VERSION列显示为2。PS C:\ wsl -l -v NAME STATE VERSION * Ubuntu-22.04 Running 2至此你的WSL2基础环境就准备好了。后续所有操作除非特别说明都将在WSL的Ubuntu终端中进行。2.2 安装必要的系统包和工具打开你的Ubuntu终端。首先更新软件包列表并升级现有软件包sudo apt update sudo apt upgrade -y接下来安装Zephyr开发所需的核心工具和依赖库。这是一条比较长的命令建议直接复制执行sudo apt install -y --no-install-recommends \ git cmake ninja-build gperf \ ccache dfu-util device-tree-compiler \ wget python3-dev python3-pip python3-setuptools python3-tk python3-wheel xz-utils file \ make gcc gcc-multilib g-multilib libsdl2-dev libmagic1逐项解释一下这些包的作用git版本控制用于克隆Zephyr源码。cmake,ninja-buildZephyr使用CMake作为构建系统Ninja作为后端构建工具速度比传统的make更快。gperf一个完美的哈希函数生成器某些Zephyr模块的构建会用到。ccache编译器缓存可以显著加速重复构建的速度。dfu-util设备固件升级工具用于通过DFU模式给开发板烧录程序。device-tree-compiler (dtc)设备树编译器Zephyr使用设备树来描述硬件。python3-dev, python3-pip等Python3开发环境。Zephyr的West工具和很多脚本都是Python写的。libsdl2-dev模拟器QEMU的图形库依赖如果你打算在PC上模拟运行Zephyr程序这个必须装。注意安装过程中如果遇到E: Unable to locate package错误通常是包名有误或软件源问题。请再次运行sudo apt update更新源列表。上述包名在Ubuntu 22.04 LTS中是确认可用的。3. 获取Zephyr源码与West工具Zephyr使用一个名为West的元工具进行项目管理。它不仅可以获取Zephyr自身的源码还能管理其所有的模块Module和样本Sample。你可以把它理解为Zephyr生态的专属包管理器构建辅助工具。3.1 安装并初始化West首先我们使用pip3安装West。强烈建议为当前用户安装避免使用sudo安装到系统目录可能引起的权限问题。pip3 install --user west安装完成后West的可执行文件通常位于~/.local/bin目录。你需要将这个目录添加到系统的PATH环境变量中这样在终端里才能直接运行west命令。echo export PATH~/.local/bin:$PATH ~/.bashrc source ~/.bashrc现在运行west --version来验证安装是否成功。接下来我们创建一个专门用于Zephyr开发的工作目录并让West初始化一个工作空间。这个工作空间将包含Zephyr源码和所有依赖。# 创建一个目录名字可以自定这里用 zephyrproject mkdir ~/zephyrproject cd ~/zephyrproject使用west init命令初始化工作空间。这里我们需要指定一个源码的“清单仓库”Manifest Repository它定义了要获取哪些项目以及它们的版本。我们使用官方的zephyr仓库。west init -m https://github.com/zephyrproject-rtos/zephyr --mr main-m: 指定清单仓库的URL。--mr main: 指定使用main分支。你也可以使用特定的版本标签如v3.6.0以获得一个稳定的发布版本。对于学习和最新特性探索main分支是可以的。初始化完成后使用west update命令拉取清单文件中定义的所有项目包括Zephyr主仓库和所有模块。west update这个过程会克隆多个Git仓库耗时取决于你的网络状况请耐心等待。3.2 导出Zephyr环境变量为了让West、CMake等工具知道Zephyr的根目录在哪里我们需要设置一个名为ZEPHYR_BASE的环境变量。echo export ZEPHYR_BASE~/zephyrproject/zephyr ~/.bashrc source ~/.bashrc验证一下echo $ZEPHYR_BASE应该输出/home/你的用户名/zephyrproject/zephyr。4. 安装Zephyr SDK交叉编译工具链Zephyr支持众多架构ARM, x86, RISC-V, ARC等我们不可能为每个架构都手动安装一套编译器。Zephyr SDKSoftware Development Kit是一个打包好的工具链集合包含了支持所有这些架构的交叉编译器、调试器以及其他必要的工具。步骤一下载SDK安装包进入一个临时目录下载最新版本的Zephyr SDK捆绑包。你可以去 Zephyr SDK Releases 页面查看最新版本。以下以0.16.5版本为例请替换为最新版本号cd /tmp wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.5/zephyr-sdk-0.16.5_linux-x86_64.tar.xz注意务必下载linux-x86_64版本因为我们的环境是WSL2Linux。如果你在原生Windows上操作需要下载windows-x86_64版本并且安装步骤会完全不同通常是一个.exe安装程序。步骤二验证文件完整性可选但推荐下载对应的.sha256校验文件并验证wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.5/zephyr-sdk-0.16.5_linux-x86_64.tar.xz.sha256 sha256sum -c zephyr-sdk-0.16.5_linux-x86_64.tar.xz.sha256如果输出OK说明文件下载完整。步骤三解压并安装到推荐位置官方推荐将SDK安装到~/zephyr-sdk-0.16.5这样的用户目录下。# 解压到用户主目录 tar xvf zephyr-sdk-0.16.5_linux-x86_64.tar.xz -C ~ cd ~/zephyr-sdk-0.16.5运行安装脚本。这个脚本会设置一些必要的链接和许可协议。./setup.sh在安装过程中脚本会询问你是否要将工具链添加到PATH以及是否注册CMake包。对于第一个问题添加PATH建议选择“是”。对于CMake包注册也选择“是”。这样后续构建时CMake就能自动找到编译器。步骤四设置SDK环境变量同样我们需要设置一个环境变量来告诉Zephyr SDK的位置。echo export ZEPHYR_SDK_INSTALL_DIR~/zephyr-sdk-0.16.5 ~/.bashrc source ~/.bashrc步骤五安装udev规则重要这一步是为了让Linux系统能够以普通用户权限访问USB转串口、J-Link、ST-Link等调试器设备否则每次烧录都需要sudo。sudo cp ~/zephyr-sdk-0.16.5/sysroots/x86_64-pokysdk-linux/usr/share/openocd/contrib/60-openocd.rules /etc/udev/rules.d/ sudo udevadm control --reload执行完成后需要重新插拔一下你的开发板或调试器以使新规则生效。5. 安装Python依赖包Zephyr的构建系统、West工具以及一些辅助脚本依赖于特定的Python包。这些依赖关系由一个requirements.txt文件定义。我们需要在虚拟环境中安装它们以避免与系统Python包发生冲突。强烈建议使用Python虚拟环境venvcd ~/zephyrproject python3 -m venv .venv这会在zephyrproject目录下创建一个名为.venv的虚拟环境目录。激活它source .venv/bin/activate激活后你的命令行提示符前通常会显示(.venv)。这意味着后续所有pip安装的包都只在这个隔离的环境内生效。现在安装Zephyr所需的Python依赖pip3 install -r ~/zephyrproject/zephyr/scripts/requirements.txt这个文件包含了构建、测试、文档生成等所需的所有Python包如pyelftools,pyyaml,packaging等。安装过程可能需要几分钟。为了方便你可以将激活虚拟环境的命令也加入到~/.bashrc中这样每次打开终端进入该目录后自动激活但要注意这可能会影响其他项目。更推荐的做法是手动激活或者在VS Code中配置自动激活。6. 第一个构建测试Blinky环境搭建完毕是时候进行“点火测试”了。我们选择一个最简单的示例——blinkyLED闪烁并针对一个常用的模拟器目标qemu_cortex_m3进行构建和运行。这不需要任何实体硬件。步骤一确保环境就绪打开一个新的WSL终端或确保你已经进入了工作目录cd ~/zephyrproject激活了虚拟环境source .venv/bin/activate(如果使用了venv)环境变量已生效echo $ZEPHYR_BASE和echo $ZEPHYR_SDK_INSTALL_DIR都有正确输出。步骤二创建构建目录并配置Zephyr推荐使用“影子构建”Out-of-source build即构建产物放在一个独立的目录不污染源码。我们为blinky示例创建一个构建目录。# 进入zephyr源码目录下的samples/basic/blinky示例 cd $ZEPHYR_BASE/samples/basic/blinky # 为qemu_cortex_m3目标创建并进入一个构建目录 mkdir -p build/qemu_cortex_m3 cd build/qemu_cortex_m3 # 使用CMake配置项目指定目标板和Zephyr根目录 cmake -GNinja -DBOARDqemu_cortex_m3 ..cmake命令会检查你的环境编译器、SDK、Python包等并生成Ninja构建文件。如果一切顺利你会看到大量配置输出最后以-- Configuring done和-- Generating done结束没有红色错误信息。步骤三编译项目配置成功后使用Ninja进行编译ninja编译过程会持续一段时间首次构建需要编译Zephyr内核本身以及相关库。如果看到类似[100%] Linking C executable zephyr/zephyr.elf和[100%] Built target zephyr_final的输出恭喜你构建成功了最终会在zephyr/目录下生成zephyr.elf,zephyr.bin,zephyr.hex等文件。步骤四在QEMU中运行使用West命令在QEMU模拟器中运行刚刚编译好的程序west build -t run或者使用Ninja命令ninja run这会启动QEMU模拟一个Cortex-M3芯片并加载你的程序。你应该会看到终端输出类似*** Booting Zephyr OS ...的信息并且程序开始运行。对于blinky示例它会在模拟的GPIO上“闪烁”LED在QEMU中可能没有直观的LED显示但程序逻辑在运行。按CtrlA然后按X可以退出QEMU。7. 常见问题排查与深度优化即使按照步骤操作你也可能遇到一些问题。这里列出几个我踩过的坑及其解决方案。7.1 West init 或 update 失败问题west init或west update速度极慢或失败提示网络错误。原因GitHub访问不稳定或DNS问题。解决设置Git代理如果你有稳定的网络代理git config --global http.proxy http://你的代理地址:端口 git config --global https.proxy https://你的代理地址:端口对于west update它本质是调用git所以代理对它也有效。完成后可以取消设置git config --global --unset http.proxy。使用国内镜像源修改west init命令使用Gitee上的镜像注意镜像可能略有延迟。west init -m https://gitee.com/mirrors/zephyr --mr main但需要注意Zephyr的模块modules可能还在GitHub上需要进一步配置。更稳妥的方法是只对zephyr主仓库使用镜像这需要修改清单文件对新手较复杂。首次搭建耐心等待或使用代理是更简单的选择。7.2 CMake配置阶段报错问题运行cmake时提示找不到编译器The compiler ... is not able to compile a simple test program或找不到Python模块。原因环境变量未生效或Python依赖未安装。解决彻底重启终端关闭所有WSL终端窗口重新打开一个。确保source ~/.bashrc已执行。检查SDK路径echo $ZEPHYR_SDK_INSTALL_DIR确认路径正确且bin目录下有arm-zephyr-eabi-gcc等编译器。检查Python环境which python3和which pip3是否指向你的虚拟环境如果用了venv在构建目录外手动尝试导入可能缺失的包例如python3 -c “import elftools”。清理构建目录有时旧的CMake缓存会引发问题。直接删除整个build目录从头开始cmake。7.3 构建时内存不足问题ninja编译过程中WSL2突然崩溃或提示gcc: fatal error: Killed signal terminated program cc1。原因WSL2默认分配的内存可能不足通常为主机内存的50%。编译Zephyr尤其是大型应用或多线程时可能耗尽内存。解决在Windows用户目录C:\Users\你的用户名\下创建或修改.wslconfig文件增加内存限制。# .wslconfig [wsl2] memory4GB # 设置为4GB或更高根据你的主机内存调整 processors2 # 分配2个CPU核心 swap2GB保存后在PowerShell中运行wsl --shutdown关闭WSL然后再重新打开Ubuntu终端。WSL会以新的配置启动。7.4 开发板连接与烧录问题当你开始使用实体开发板如STM32、nRF52系列时可能会遇到无法识别或烧录失败的问题。现象west flash失败提示没有权限或找不到设备。排查确认udev规则已安装回顾第4.5节确保已复制规则文件并重新加载了udev。检查设备是否被识别将开发板通过USB连接到电脑在WSL中运行lsusb查看是否有你的开发板或调试器如ST-Link, J-Link, CMSIS-DAP的信息。检查设备节点运行ls -l /dev/ttyACM*或ls -l /dev/ttyUSB*看看是否有对应的串口设备。如果有但属于root和dialout组你需要将当前用户加入dialout组sudo usermod -aG dialout $USER然后注销并重新登录WSL或重启WSL。使用正确的烧录命令不是所有板子都直接用west flash。有些可能需要指定runner例如west flash –runnerpyocd。具体请参考你的开发板在Zephyr中的文档$ZEPHYR_BASE/boards/架构/板子名/目录下的board.cmake和doc/index.rst。8. 集成开发环境IDE配置建议命令行固然强大但一个好的IDE能极大提升效率。这里推荐Visual Studio Code并配置WSL远程开发。步骤一在Windows上安装VS Code从官网下载安装。步骤二安装必要扩展在VS Code的扩展商店中搜索并安装WSL由Microsoft提供用于连接WSL。C/C由Microsoft提供用于代码智能感知、跳转、调试。CMake Tools由Microsoft提供用于集成CMake构建、配置、调试。可选Zephyr IDE一个社区维护的扩展提供了一些Zephyr特有的片段和工具集成但非必需。步骤三在WSL中打开项目在VS Code中按CtrlShiftP输入Remote-WSL: New WSL Window选择你安装的Ubuntu发行版。新窗口左下角会显示WSL: Ubuntu。在这个窗口里点击“打开文件夹”选择/home/你的用户名/zephyrproject。VS Code现在完全运行在WSL环境中可以无缝访问WSL的文件系统和工具链。步骤四配置C/C扩展打开Zephyr项目中的任意一个C文件如samples/basic/blinky/src/main.cVS Code可能会提示你配置IntelliSense。按CtrlShiftP输入C/C: Edit Configurations (UI)。 在配置界面中编译器路径浏览选择Zephyr SDK中的GCC编译器例如${env:ZEPHYR_SDK_INSTALL_DIR}/arm-zephyr-eabi/bin/arm-zephyr-eabi-gccIntelliSense 模式选择gcc-arm包含路径这里比较麻烦因为Zephyr的包含路径是由CMake动态生成的。一个简单的方法是先在你的构建目录如blinky/build/qemu_cortex_m3下成功执行一次cmake然后CMake Tools扩展会自动生成一个compile_commands.json文件。在C/C配置中将compileCommands项设置为这个json文件的路径如${workspaceFolder}/zephyr/samples/basic/blinky/build/qemu_cortex_m3/compile_commands.json。这样IntelliSense就能获得准确的包含路径和宏定义。步骤五使用CMake Tools扩展在VS Code活动栏点击CMake Tools图标。它会自动扫描项目中的CMakeLists.txt。在底部状态栏点击“选择工具包”它应该能自动检测到Zephyr SDK中的工具链。点击“选择目标”选择你想要构建的开发板如qemu_cortex_m3。点击底部状态栏的“构建”按钮扳手图标即可编译点击“调试”按钮播放虫子图标即可启动调试需要配合launch.json配置。通过以上步骤你就拥有了一个带代码补全、跳转、构建和调试功能的强大IDE环境在Windows上享受接近原生Linux的开发体验。整个过程虽然步骤繁多但一旦搭建成功就是一个一劳永逸的、强大的Zephyr开发工作站。记住嵌入式开发环境的搭建本身就是一项重要的技能耐心走完这个过程你对Zephyr项目结构的理解也会加深不少。
返回列表