zephyr与west介绍

背景简介

马上要接触一个新项目,用到zephyr,这里对我对zephyr的初步探索做个记录,方便后续查阅。

Zephyr 是一个小型的实时操作系统 (RTOS) ,主要为嵌入式设备上而设计,这些设备上通常资源较为受限.
它是Linux Foundation社区支持的开源工程, licensed under Apache 2.0. 它的设计专注于模块化,可扩展以及安全性,这使他不仅适合简单的微控制器领域也适合较复杂的嵌入式使用场景。特点如下,

  • 多架构支持:支持 ARM(Cortex‑M、Cortex‑A、Cortex‑R)、RISC‑V、x86、ARC、MIPS、Tensilica Xtensa 等多种架构。
  • 占用空间小:最小可运行在仅有 8 KB RAM 和 32 KB Flash 的设备上。
  • 实时内核:具备确定性的调度、抢占和中断处理能力。
  • 连接能力:内置支持 蓝牙、Wi‑Fi、IEEE 802.15.4、Thread、CAN、以太网等。
  • 安全性:提供内存保护、安全启动、加密库,并符合安全标准。
  • 模块化子系统:包括网络协议栈、文件系统、设备驱动、电源管理和传感器框架。
    如果你的场景是嵌入式/IOT设备, 资源受限如RAM较小, 并需要实时性能和丰富的连接特性(connectivity),那么可以考虑Zephyr

zephyr工程
zephyr项目主仓库: https://github.com/zephyrproject-rtos/zephyr , 中国大陆国内镜像https://gitee.com/zephyr-rtos
Zephyr 采用 多仓库结构,通过 west 工具统一管理。除了主仓库,还有:

  • hal_xxx:各芯片厂商的硬件抽象层(HAL)。
  • mcuboot:默认的安全 Bootloader。
  • modules/:第三方库(如 mbedTLS、LVGL、zcbor 等)。
  • sdk-ng:Zephyr 官方 SDK(交叉编译工具链)。

Zephyr 项目开发一般使用west进行项目构建和管理,类似 Yocto 的 bitbake来构建linux项目, west的作用如下,

  • 多仓库管理:Zephyr 本身依赖多个 Git 仓库(内核、驱动、HAL、测试、工具链支持等),west 负责统一拉取和同步。
  • 构建前端:封装了 CMake/Ninja 的调用,简化应用构建、烧录等操作。
  • 可扩展性:支持插件机制,可以编写自定义的 west 子命令。

使用 west 工具管理zephyr及开发

  • 首先安装west依赖项,主要是python,在 Linux (Ubuntu/Debian) 上:
    sudo apt install --yes python3-pip python3-venv git

  • 安装west之前,推荐虚拟环境安装,避免污染系统python环境,
    创建并进入一个虚拟环境
    $ python3 -m venv ~/venv
    $ source ~/venv/bin/activate

  • 安装 west
    (venv) $ pip install west

Collecting west
  Downloading west-1.5.0-py3-none-any.whl (106 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 107.0/107.0 KB 996.7 kB/s eta 0:00:00
Collecting pykwalify
  Downloading pykwalify-1.8.0-py2.py3-none-any.whl (24 kB)
Collecting colorama
  Downloading colorama-0.4.6-py2.py3-none-any.whl (25 kB)
Collecting docopt>=0.6.2
  Downloading docopt-0.6.2.tar.gz (25 kB)
  Preparing metadata (setup.py) ... done
Collecting ruamel.yaml>=0.16.0
  Downloading ruamel.yaml-0.18.15-py3-none-any.whl (119 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 119.7/119.7 KB 1.5 MB/s eta 0:00:00
Requirement already satisfied: six>=1.5 in /usr2/yma/venv/lib/python3.10/site-packages (from python-dateutil>=2.8.0->pykwalify->west) (1.17.0)
Collecting ruamel.yaml.clib>=0.2.7
  Downloading ruamel.yaml.clib-0.2.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl(721 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 721.3/721.3 KB 2.4 MB/s eta 0:00:00
Building wheels for collected packages: docopt
  Building wheel for docopt (setup.py) ... done
  Created wheel for docopt: filename=docopt-0.6.2-py2.py3-none-any.whl size=13723 sha256=178c2444c0bc4fda9848fc8f9dd18c64babe00f30f05f48521f36724c73c3fb2
  Stored in directory: /usr/xxx/.cache/pip/wheels/fc/ab/d4/5da2067ac95b36618c629a5f93f809425700506f72c9732fac
Successfully built docopt
Installing collected packages: docopt, ruamel.yaml.clib, colorama, ruamel.yaml, pykwalify, west
Successfully installed colorama-0.4.6 docopt-0.6.2 pykwalify-1.8.0 ruamel.yaml-0.18.15 ruamel.yaml.clib-0.2.14 west-1.5.0
(venv) $ west --version
West version: v1.5.0
  • 初始化 Zephyr 工程
    (venv) $ west init zephyproject
=== Initializing in /local/mnt/workspace/zephyproject
--- Cloning manifest repository from https://github.com/zephyrproject-rtos/zephyr
Cloning into '/local/mnt/workspace/zephyproject/.west/manifest-tmp'...
remote: Enumerating objects: 1357810, done.
remote: Counting objects: 100% (561/561), done.
remote: Compressing objects: 100% (316/316), done.
remote: Total 1357810 (delta 334), reused 245 (delta 245), pack-reused 1357249 (from 3)
Receiving objects: 100% (1357810/1357810), 777.64 MiB | 674.00 KiB/s, done.
Resolving deltas: 100% (1005352/1005352), done.
Updating files: 100% (52115/52115), done.
--- setting manifest.path to zephyr
=== Initialized. Now run "west update" inside /home/xxx/zephyproject.

(venv) $ cd zephyproject/zephyr/
(venv) $ ls
Screenshot 2025-10-16 112454

  • 同步 Zephyr 工程所需的依赖仓库
    背景:Zephyr 采用多仓库结构(主仓库 + 各种 HAL、第三方库、工具等),这些依赖关系都写在 west.yml 清单文件里。
    根据 west.yml 下载或更新所有模块到本地, 确保本地工程的 zephyr/、modules/、bootloader/ 等子目录与清单一致。
    (venv) $ west update
    第一次初始化 Zephyr 工程后必须执行,当切换分支或更新 Zephyr 主仓库时也需要执行以同步依赖。

  • 把 Zephyr 的 CMake 包信息导出到系统环境中
    Zephyr 使用 CMake 构建,west zephyr-export 会在本地生成一个 ZephyrConfig.cmake,并更新环境变量,让 CMake 能找到 Zephyr 的路径。
    第一次初始化 Zephyr 工程后必须执行,当切换分支,更新 Zephyr 主仓库或改变工程路径时也需要执行。
    (venv) $ west zephyr-export

Zephyr (/home/xxx/zephyproject/zephyr/share/zephyr-package/cmake)
has been added to the user package registry in:
~/.cmake/packages/Zephyr

ZephyrUnittest (/home/xxx/zephyproject/zephyr/share/zephyrunittest-package/cmake)
has been added to the user package registry in:
~/.cmake/packages/ZephyrUnittest

(venv) zephyproject/zephyr$ find . -name ZephyrConfig.cmake
./share/zephyr-package/cmake/ZephyrConfig.cmake

  • 简单示例 samples/hello_world
    zephyproject/zephyr/samples/hello_world$ tree -L 2
    .
    ├── CMakeLists.txt
    ├── prj.conf
    ├── README.rst
    ├── sample.yaml
    └── src
    └── main.c

  • 构建工程
    以我的ubuntu环境为例,

    1. 安装依赖 Python3 + pip, CMake、Ninja wget等(仅第一次需要)
      (venv) $ sudo apt install --yes git cmake ninja-build gperf python3-dev python3-pip python3-venv device-tree-compiler wget
      (venv) $ pip install jsonschema pyelftools
    1. 安装编译链(仅第一次需要)
      以版本 0.16.5为例,
      (venv) $ wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.5/zephyr-sdk-0.16.5_linux-x86_64.tar.xz
      (venv) $ tar xvf zephyr-sdk-0.16.5_linux-x86_64.tar.xz -C ~/
      (venv) $ cd ~/zephyr-sdk-0.16.5
      (venv) $ ./setup.sh
Zephyr SDK 0.16.5 Setup

** NOTE **
You only need to run this script once after extracting the Zephyr SDK
distribution bundle archive.

Install host tools [y/n]? y
Register Zephyr SDK CMake package [y/n]? y

Installing host tools ...

Registering Zephyr SDK CMake package ...
Zephyr-sdk (/home/xxx/zephyr-sdk-0.16.5/cmake)
has been added to the user package registry in:
~/.cmake/packages/Zephyr-sdk


All done.
Press any key to exit ...
    1. 配置环境变量
      (venv) $ export ZEPHYR_SDK_INSTALL_DIR=$HOME/zephyr-sdk-0.16.5
      (venv) $ export ZEPHYR_TOOLCHAIN_VARIANT=zephyr

    也可以在 ~/.bashrc 或 ~/.zshrc 中添加上一行,这样这个环境变量就永久生效,然后刷新环境变量,
    (venv) $ source ~/.bashrc

    1. 验证编译链
      (venv) $ echo $ZEPHYR_SDK_INSTALL_DIR
      (venv) $ ls $ZEPHYR_SDK_INSTALL_DIR
    1. 编译Helloworld,
      以STM32 Nucleo-F401RE为例,
      (venv) $ west build -b nucleo_f401re samples/hello_world
    [145/145] Linking C executable zephyr/zephyr.elf
    Memory region         Used Size  Region Size  %age Used
               FLASH:       17176 B       512 KB      3.28%
                 RAM:        4544 B        96 KB      4.62%
               SRAM0:          0 GB        96 KB      0.00%
            IDT_LIST:          0 GB        32 KB      0.00%
    Generating files from /home/xxx/zephyproject/zephyr/build/zephyr/zephyr.elf for board: nucleo_f401re
    

    这条命令背后做了以下几件事

    • 创建build/ 目录用来存放中间/临时文件,
    • 根据该命令指定要素 BSP(eg. nucleo_f401re_defconfig),app(prj.conf from samples/hello_world)和kernel(defconfig)生成.config,这个文件指定需要包含哪些features, drivers, libraries,
    • 根据.config 由交叉编译工具链(arm-none-eabi-gcc)编译:
      1. 编译zephyr kernel (kernel/, lib/, drivers/)
      2. 编译指定的板级支持包BSP (boards/st/nucleo_f401re/), 包括Device tree (.dts),Kconfig, pin和clock配置等
      3. 编译指定的应用程序(samples/hello_world/)
    • 根据soc/st/stm32/stm32f4x中定义的内容链接确定Flash内存布局(code, rodata),SRAM布局(stack, heap, bss, data)
    • 最后生成最终可执行文件,存放于build/zephyr/
      • zephyr.elf → main firmware image with debug info.
      • zephyr.bin / zephyr.hex → flashable images.
      • zephyr.map → memory map.
    1. 烧录到开发板
      (venv) $ west flash
  • Zephyr SDK已支持qemu
    可以尝试编译一个qemu的helloworld,
    (venv) $ west build -b qemu_cortex_m3 samples/hello_world
    (venv) $ west build -t run

  -- west build: running target run
  [0/1] To exit from QEMU enter: 'CTRL+a, x'[QEMU] CPU: cortex-m3
  qemu-system-arm: warning: nic stellaris_enet.0 has no peer
  Timer with period zero, disabling
  *** Booting Zephyr OS build v4.2.0-5916-gbcc4689cd016 ***
  Hello World! qemu_cortex_m3/ti_lm3s6965

可选的qemu类型有- zephyr/boards/qemu$ find . -name *.yaml

./cortex_a53/qemu_cortex_a53_qemu_cortex_a53_smp.yaml
./cortex_a53/qemu_cortex_a53_qemu_cortex_a53_xip.yaml
./cortex_a53/qemu_cortex_a53.yaml
./rx/qemu_rx.yaml
./malta/qemu_malta_qemu_malta_be.yaml
./malta/qemu_malta.yaml
./riscv32_xip/qemu_riscv32_xip.yaml
./riscv64/qemu_riscv64_qemu_virt_riscv64_smp.yaml
./riscv64/qemu_riscv64.yaml
./riscv32e/qemu_riscv32e.yaml
./leon3/qemu_leon3.yaml
./xtensa/qemu_xtensa_dc233c_mmu.yaml
./xtensa/qemu_xtensa_sample_controller32_mpu.yaml
./xtensa/qemu_xtensa_dc233c.yaml
./cortex_a9/qemu_cortex_a9.yaml
./kvm_arm64/qemu_kvm_arm64.yaml
./x86/qemu_x86_atom_xip.yaml
./x86/qemu_x86_atom_nokpti.yaml
./x86/qemu_x86_tiny.yaml
./x86/qemu_x86_atom_virt.yaml
./x86/qemu_x86_64.yaml
./x86/qemu_x86_atom_nommu.yaml
./x86/qemu_x86_64_atom_nokpti.yaml
./x86/qemu_x86_atom_nopae.yaml
./x86/qemu_x86_lakemont.yaml
./x86/qemu_x86.yaml
./cortex_m0/qemu_cortex_m0.yaml
./arc/qemu_arc_qemu_arc_hs_xip.yaml
./arc/qemu_arc_qemu_arc_hs6x.yaml
./arc/qemu_arc_qemu_arc_hs5x.yaml
./arc/qemu_arc_qemu_arc_hs.yaml
./arc/qemu_arc_qemu_arc_em.yaml
./riscv32/qemu_riscv32_qemu_virt_riscv32_smp.yaml
./riscv32/qemu_riscv32.yaml
./cortex_m3/qemu_cortex_m3.yaml
./cortex_r5/qemu_cortex_r5.yaml
  • 编译并运行本机程序
    (venv) $ west build -b native_sim samples/hello_world
    (venv) $ west build -t run

参考文档 > https://docs.zephyrproject.org/latest/introduction/index.html

posted @ 2025-10-16 12:22  yangbiao  阅读(239)  评论(0)    收藏  举报