Zephyr native_sim 板级模拟器完全指南:将 RTOS 应用编译为 Linux 原生可执行程序
Zephyr native_sim 板级模拟器完全指南将 RTOS 应用编译为 Linux 原生可执行程序【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyrnative_sim是 Zephyr 项目提供的 POSIX 架构板级目标board target。借助它你可以把 Zephyr 内核、库与应用代码一起编译成一个普通的 Linux 可执行文件在没有真实嵌入式硬件的情况下完成开发、调试、测试与 CI 验证。本文将围绕官方文档 boards/native/native_sim/doc/index.rst 的完整脉络结合仓库内 native_sim.dts、Kconfig 等源码细节系统讲解编译运行、调试手段、时间模型、可用外设、子系统后端与主机文件系统交互帮助你把它用起来、用透。Overviewnative_sim 是什么native_sim是一个基于 POSIX 架构Zephyr 对 POSIX 操作系统的移植见 arch/posix的板级目标。它构建出的产物是一个普通 Linux 可执行程序其中同时包含 Zephyr 内核、库以及你的应用代码。其核心设计理念是不模拟任何特定硬件它既不模拟某款 CPU也不模拟某个 SoC代码直接面向宿主系统典型为 x86原生编译提供少量通用外设如以太网驱动、显示、UART、RTC、闪存模拟器等使那些依赖这些外设的应用代码也能在主机上开发和测试基于 native simulatorBabbleSim 的 native_simulator与 POSIX 架构关于 native simulator 自身的内部实现可参考其上游文档与仓库 scripts/native_simulator 中的源码。与 native_posix 的关系native_sim是旧版native_posix的演进版。需要注意部分组件、代码、选项名称以及文档仍会沿用native_posix的名称所有在native_posix上可用的组件在native_sim上均可正常工作。宿主系统依赖构建与运行native_sim所需的宿主系统依赖与 POSIX 架构一致包括一套可用的 Linux 开发工具链gcc/clang、make/cmake、west 等。具体清单可查阅 POSIX 架构的依赖说明见 arch/posix 相关文档与 zephyr-env.sh 环境脚本。重要限制与不支持的特性native_sim基于 POSIX 架构因此POSIX 架构本身的限制与注意事项同样适用于它它继承了 POSIX 架构的不支持特性清单例如与硬件强相关的特性部分驱动可能只实现了驱动 API 的子集存在功能缺失或不支持完整可选功能的情况。How to use编译、运行与退出编译构建native_sim与构建其他 Zephyr 板级目标完全相同只需在west build时指定板名为native_sim$ west build -b native_sim samples/hello_world构建过程会调用 boards/native/native_sim/CMakeLists.txt将 cmdline.c、nsi_if.c、irq_handler.c、misc.c、posix_arch_if.c 等板级源文件编译进可执行程序。运行编译结果是一个名为zephyr.exe的可执行文件位于构建目录的zephyr/子目录下。直接像运行普通 Linux 控制台程序一样运行它$ ./build/zephyr/zephyr.exe # 按 CtrlC 退出该可执行文件会根据编译配置接受若干命令行选项。运行--help即可查看当前构建可用的全部选项$ ./build/zephyr/zephyr.exe --help关于退出的特别说明需要注意Zephyr 内核在应用执行完毕后并不会真正退出它会进入空闲循环idle loop永远运行下去因此必须手动终止Linux 下按 CtrlC。使用 ztest 测试框架的应用会在所有测试完成后自动退出若希望应用在到达某个点时优雅结束可以在该处加入一段条件编译的代码以CONFIG_ARCH_POSIX为条件调用nsi_exit(int status)来退出程序。Debugging原生调试与插桩由于 Zephyr 可执行文件本身就是原生应用它可以像任何其他原生程序一样被调试和插桩。程序默认带有调试信息因此可以直接在gdb中运行或用valgrind做内存检查。native_sim的执行通常是确定性的——没有异步或随机组件同样的输入会得到完全相同的结果插桩也不会影响执行结果。这为可复现的调试与测试提供了极大便利。为了更方便调试可以关闭编译优化如-O0设置 Kconfig 选项CONFIG_NO_OPTIMIZATIONS即可。此外使用 IDE 作为调试器的图形前端也是一个推荐选择。Address SanitizerASannative_sim支持使用 Address Sanitizer 构建。设置CONFIG_ASAN即可例如在应用的prj.conf中或在west build/cmake命令行中传入$ west build -b native_sim samples/hello_world -DCONFIG_ASANy前提是宿主系统已安装 ASan 运行库。Debian/Ubuntu 下对应的包是libasan1。Undefined Behavior SanitizerUBSan同样支持使用 Undefined Behavior Sanitizer 构建设置CONFIG_UBSAN即可可在应用工程文件中配置也可在west build或cmake命令行中传入。覆盖率报告基于 POSIX 架构可以生成代码覆盖率报告gcov/lcov 工作流相关工具位于 scripts 目录具体流程参见 POSIX 架构的覆盖率说明。32 位与 64 位版本native_sim提供两个目标目标ABI指针/long 宽度适用场景native_sim默认ILP32x86/x86_64 系统上的 i38632 位模拟大多数 Zephyr 嵌入式目标的 ABI由于很多 bug 与指针和 long 的宽度相关通常最适合测试和调试native_sim/native/64LP64x86 系统上的 x86-6464 位无法编译或运行 32 位二进制时使用32 位默认目标需要 64 位系统并安装 multilib 支持或一个带 32 位用户空间的系统。两个目标的定义见 board.yml64 位变体的构建配置见 native_sim_64_defconfig。C 库选择native_sim可选用多种 C 库编译默认宿主 C 库CONFIG_EXTERNAL_LIBC可选CONFIG_MINIMAL_LIBC最小 C 库或CONFIG_PICOLIBC若选择了与宿主 C 库不兼容的特性默认会改用 Picolibc。使用 minimal libc 或 Picolibc 构建时代码的编译方式更接近真实嵌入式目标可以测试代码与该 C 库的交互也不会与 POSIX OS 抽象层 shim 冲突但反过来从嵌入式代码访问宿主系统进行测试会更困难。外设与后端的 C 库兼容性大多数 native_sim 驱动和后端支持任意 C 库但以下驱动兼容性受限驱动类别驱动名称驱动 Kconfig可用 libCBluetoothUserchanCONFIG_BT_USERCHAN宿主 libC 与 picolibcUSBUSB native posixCONFIG_USB_NATIVE_POSIX仅宿主 libC交叉编译native_sim支持交叉编译例如在 x86 宿主上为 ARM 宿主目标交叉构建。方法与 POSIX 架构的交叉编译说明一致。移植理由与方案对比native_sim与 POSIX 架构的整体意图一脉相承它是一个与硬件无关的测试平台某些场景下会使用宿主 OS 的外设。它不打算建模任何特定硬件因此只能用于开发与测试与硬件解耦程度较高的应用代码。如果需要开发或测试依赖特定硬件的软件同时保留 POSIX 架构的优势应考虑其他方案如 bsim 板级目标见 boards/native。POSIX 架构与其他开发/测试方案的详细对比可查阅 POSIX 架构文档。Architecture架构与时间模型native_sim基于 Zephyr 的 POSIX 架构移植在线程与 CPU/硬件调度方面继承了其基本架构。它不模拟任何特定的嵌入式 CPU 或 SoC代码为宿主系统典型 x86原生编译。关于 native_sim 中的时间这是理解native_sim行为最关键的概念之一通常模拟时间与真实主机时间完全解耦运行速度只受宿主计算能力限制跑得越快越好。这在调试器下运行或批量测试时非常理想但在与基于真实主机时间的外部接口交互时就不合适了Zephyr 内核只感知硬件模型提供的模拟时间因此普通 Zephyr 线程也只认识模拟时间模拟时间与真实/宿主时间之间唯一的联系如果有由时钟与定时器模型建立。该模型可以配置为把 native_sim 的执行放慢到真实时间通过命令行选项--rt和--no-rt控制默认行为由CONFIG_NATIVE_SIM_SLOWDOWN_TO_REAL_TIME决定见 Kconfig 中的定义在 ztest 之外的普通应用中默认启用若开启BT_USERCHAN也默认启用而使用 libFuzzer 时默认关闭。需要注意该模型的行为方式它只是在下一次系统 tick 中断到来前等待对应的真实/宿主时间到达。如果 native_sim 因为某种原因跑得比真实时间慢例如宿主负载过高或在调试器中单步模型只能通过不再延迟后续 tick 来尽快追赶。因此高负载或调试场景下你会看到模拟时间落后于真实宿主时间。这种设计保证了正常运行仍然确定同时给观察者提供接近真实时间的观感。锁定时钟后的倍速与漂移当锁定到真实时间后模拟时间还可以设置成比真实时间更快或更慢地运行通过以下两个命令行选项控制--rt-ratioratio倍率如--rt-ratio2表示模拟时间以真实时间两倍速前进--rt-driftdrift漂移量如--rt-drift-100e-6表示模拟时间比真实时间慢 100ppm。这两个选项控制同一个底层机制drift 在定义上等于 ratio - 1。也可以运行时通过函数native_rtc_adjust_clock()动态调整时钟速度。注意这两个选项在非实时模式下没有意义。模拟时间与真实时间的关系模拟时间st与真实时间rt的换算公式为st (rt - last_rt) × ratio last_st反之rt (st - last_st) / ratio last_rt其中last_rt与last_st分别是上一次时钟倍率调整发生时的真实时间与模拟时间。所有时间单位均为微秒。Peripherals板载外设全景以下外设均已在 native_sim.dts 中定义可通过 devicetree 与 Kconfig 自由组合启用。中断控制器提供一个简单而通用的中断控制器支持中断嵌套中断优先级单个中断的屏蔽/取消屏蔽软件中断。时钟、定时器与系统 tick 模型该模型提供系统 tick 定时器。默认CONFIG_SYS_CLOCK_TICKS_PER_SEC将其配置为每 10ms 产生一次 tick板级默认CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC1000000见 native_sim_defconfig。时间行为细节见上文关于 native_sim 中的时间一节。UART / 串口有两个可选的本地 UART 驱动PTY 驱动UART_NATIVE_PTY创建 Zephyr UART 设备可连接到 Linux 进程的 stdin/stdout或新建的伪终端pseudo-tty。详见下文PTY UARTTTY 驱动UART_NATIVE_TTY与宿主连接的串口设备如 USB 转 UART 适配器交互的 UART 驱动。详见下文TTY UART。板级默认启用一个 PTY UARTuart0作为 console、shell-uart 与 mcumgr 端口另有一个默认禁用的uart1实例可自行开启。数字麦克风DMIC提供文件支撑的 DMIC 驱动从宿主文件系统的二进制文件读取 PCM 采样数据通过 Zephyr DMIC API 呈现适合测试音频采集管线。默认输入文件路径由CONFIG_AUDIO_DMIC_NATIVE_SIM_FILE_PATH指定每个 DMIC 实例有独立的命令行覆盖参数形式为--device_filepath默认 native_sim 实例即--dmic0_filepath若配置的主机输入文件不存在驱动会在 native simulator runner 侧打印警告并提供全零数据静音。集成电路音频I2S提供文件支撑的 I2S 驱动可配置为 RX、TX 或双向。它通过 Zephyr I2S API 从宿主文件系统文件读写 PCM 采样数据适合测试流处理与回环场景。默认 RX/TX 文件路径由CONFIG_I2S_NATIVE_SIM_RX_FILE_PATH与CONFIG_I2S_NATIVE_SIM_TX_FILE_PATH指定每个 I2S 实例有独立的命令行覆盖参数--device_rxpath与--device_txpath例如默认双向实例使用--i2s_rxtx_rxpath与--i2s_rxtx_txpathRX 输入文件无法打开时驱动打印警告并馈送静音TX 输出文件无法打开时打印警告并丢弃该次 TX 数据。板级 devicetree 中预置了三个实例i2s_rx0仅 RX、i2s_rxtx双向、i2s_tx0仅 TX。实时时钟RTCRTC 模型模拟一个持续供电的时钟默认在启动时初始化为宿主时间。--rtc-reset命令行选项让 RTC 从时间 0 开始--rtc-offsetoffset选项启动时对 RTC 时钟值做偏移动态调整调用native_rtc_offset函数。启动后该 RTC 随模拟时间前进因此会受模拟时间倍率影响。可通过以下函数查询时间参数为时钟源native_rtc_gettime_us与native_rtc_gettime接受三种时钟源RTC_CLOCK_BOOT自启动以来经过的模拟时间不受偏移调整影响RTC_CLOCK_REALTIMERTC 持久时间受偏移调整影响RTC_CLOCK_PSEUDOHOSTREALTIME真实宿主时间的模拟版本仿佛宿主也受到时钟倍率与偏移影响通常比模拟时间领先几百纳秒到微秒量级取决于宿主执行速度。该时钟源需谨慎使用因为根据 native_sim 实际执行速度与宿主负载它可能显著领先于模拟时间。注意该设备目前没有提供兼容 Zephyr RTC API 的驱动devicetree 中对应节点为zephyr,rtc-emul见 native_sim.dts。熵设备Entropy基于宿主randomAPI 的熵设备。特点使用相同随机种子初始化时会产生完全相同的随机数序列这对可复现测试非常有用通过命令行选项--seed{random_seed}修改随机种子值为 32 位整数支持多种进制写法97229十进制、0x17BCD十六进制、0275715八进制。板级 devicetree 中对应节点为zephyr,native-sim-rng。以太网驱动TAP提供一个基于 TAP 的简单以太网驱动要求宿主系统已存在zeth网络接口。zeth 接口可由 net-tools 仓库中的net-setup.sh脚本创建。用户可通过 zeth 接口与 Zephyr 实例通信可按需创建多个 TAP 网络接口每个网络接口实例可单独配置 IP 地址仅支持 Linux 宿主。板级 devicetree 中zeth0节点zephyr,native-taphost-interface 为zeth并带有一个 PTP 时钟子节点即对应此驱动。Offloaded sockets 驱动这是 TAP 以太网驱动的替代方案不使用 Linux 侧的虚拟网络而是利用 Linux 标准 BSD socket API。这样多个 Zephyr 应用可以通过 Linux 回环接口通信。优点无需 root 权限进程与普通 Linux 进程处于同一接口测试无需在宿主额外配置。缺点不会走 Zephyr 网络栈的 L2 层二层逻辑未被测试。蓝牙控制器可以将宿主蓝牙适配器用作 Zephyr 的蓝牙控制器。方式是把 HCI 设备作为命令行选项传给zephyr.exe使用hci0sudo zephyr.exe --bt-devhci0。使用该设备需要 root 权限准确说是 CAP_NET_ADMIN POSIX 能力因此要用sudo运行。所选 HCI 设备必须已断电powered down且支持低功耗蓝牙蓝牙规范 4.0 及以上另一种方式使用 HCI TCP 服务器作为虚拟蓝牙控制器。需要指定其 IP 地址与端口例如zephyr.exe --bt-dev127.0.0.1:1020。该方式主要面向不依赖 Linux 蓝牙栈及其 HCI 接口的虚拟蓝牙控制器测试场景。板级 devicetree 中bt_hci_userchan节点zephyr,bt-hci-userchan即对应此功能。USB 控制器可以使用基于 USB/IP 协议的虚拟 USB 控制器用于在 native_sim 上测试 USB over USB/IP。显示驱动SDL提供一个显示驱动会在宿主机器上创建一个窗口来渲染显示内容默认 32 位native_sim目标需要宿主安装32 位的 SDL2 开发库64 位 native_sim 构建则需要 64 位版本可能还需要正确设置pkg-config以找到 SDL2 安装路径Ubuntu 下包名为libsdl2-dev64 位版本通常默认已安装。Ubuntu 18.04 宿主上安装 pkg-config 与 32 位 SDL2 的示例命令$ sudo dpkg --add-architecture i386 $ sudo apt update $ sudo apt-get install pkg-config libsdl2-dev:i386 $ export PKG_CONFIG_PATH/usr/lib/i386-linux-gnu/pkgconfig板级 devicetree 中sdl_dc节点zephyr,sdl-dc默认 320x240、ARGB_8888即对应此驱动。EEPROM 模拟器EEPROM 模拟器可用于 native 目标其增强特性是可以把 EEPROM 内容保存在宿主文件系统的文件中默认保存在当前工作目录的eeprom.bin文件中可用命令行参数--eeprom指定文件位置与名称板级 devicetree 中eeprom0节点zephyr,sim-eeprom32KB即对应此设备。Flash 模拟器Flash 模拟器也可用于 native 目标可将 flash 内容保存在宿主文件系统的二进制文件中或保存在 RAM 中。行为可通过 native_sim 板级 devicetree 或CONFIG_FLASH_SIMULATOR下的 Kconfig 设置配置默认二进制数据位于当前工作目录的flash.bin可用命令行参数--flash修改文件位置flash 数据以原始格式存储文件会被截断以匹配 devicetree 中指定的大小文件不存在时驱动负责创建存在则直接使用现有文件flash 内容可从宿主系统访问见下文HostFUSE文件系统访问。板级 devicetree 中定义了一个 2MB 的zephyr,sim-flash控制器包含 mcuboot、image-0、image-1、image-scratch、storage 等标准分区布局见 native_sim.dts。输入事件提供两个可选的本地输入驱动evdev 驱动从 Linux evdev 输入设备读取事件并注入 Zephyr 输入子系统。驱动在CONFIG_INPUT启用且 devicetree 包含以下节点时自动使能evdev { compatible zephyr,native-linux-evdev; };应用运行时需用命令行选项指定使用的 evdev 设备节点例如zephyr.exe --evdev/dev/input/event0。其实现可参考 drivers/input/linux_evdev.c。Input SDL touch使用 SDL 库模拟触摸面板输入可用CONFIG_INPUT_SDL_TOUCH启用并通过 devicetree 绑定zephyr,input-sdl-touch配置。更多 SDL 与显示驱动的使用信息见上文显示驱动SDL一节。CAN 控制器可以使用宿主 CAN 控制器通过 native SocketCAN Linux 驱动实现用CONFIG_CAN_NATIVE_LINUX启用通过 devicetree 绑定zephyr,native-linux-can配置默认 native simulator 期望一个名为zcan0的 SocketCAN 网络设备用--can-if命令行选项指定应用使用的 SocketCAN 网络设备该选项会覆盖所有Linux SocketCAN 驱动实例可通过 socketcan-native-sim snippet 启用 SocketCAN 支持见 snippets/socketcan-native-sim。板级 devicetree 中can0节点默认 disabledhost-interface 为zcan0即对应此驱动此外还有一个默认启用的can_loopback0回环实例。LED 设备实现由 Linux LED 支撑的 Zephyr LED 设备通过 devicetreepath属性配置使用的 Linux LED名称与/sys/class/leds中显示的一致leds { compatible zephyr,native-linux-leds; led0: led_0 { /* /sys/class/leds/tpacpi::lid_logo_dot/brightness */ path tpacpi::lid_logo_dot; }; led1: led_1 { /* /sys/class/leds/tpacpi::power/brightness */ path tpacpi::power; }; };温度传感器提供从 Linux 宿主文件读取温度值的传感器驱动通过 Zephyr sensor API 呈现用CONFIG_NATIVE_LINUX_TEMP启用devicetree 绑定为zephyr,native-linux-tempLinux hwmon 温度文件通常以毫摄氏度为单位例如/sys/class/hwmon/hwmon0/temp1_input。temp_sensor: host_temp { compatible zephyr,native-linux-temp; path /sys/class/hwmon/hwmon0/temp1_input; };PTY UART 详解当 devicetree 包含zephyr,native-pty-uartcompatible 且状态为okay的节点且CONFIG_SERIAL已设置时该驱动自动使能。板级默认已在 DTS 中配置一个就绪的此类 UARTuart0数量可按需增减。通常这些 UART 连接到新建的伪终端PTY即/dev/pts{nbr}也可以把其中一个映射到可执行文件的stdin与stdout有两种方式命令行选项--uart_name_stdinoutuart_name为 UART 的 DTS 节点名对第一个 PTY UART 实例选择CONFIG_UART_NATIVE_PTY_0_ON_STDINOUT替代默认的CONFIG_UART_NATIVE_PTY_0_ON_OWN_PTY。与 Zephyr shell 交互使用时推荐选择 PTY 选项STDINOUT 选项适合自动化测试如通过管道将其他进程输出接入控制因为 shell 子系统期望访问原始终端raw terminal而普通 Linux 终端默认不是。UART 连接到新建 PTY 时新建的 UART 伪终端名称会显示在控制台。如需手动交互可挂接终端模拟器$ xterm -e screen /dev/ptyn # 或使用 gnome-terminal $ gnome-terminal -- screen /dev/ptyn 其中/dev/ptyn替换为实际 PTY 设备。也可以选择自动挂接终端模拟器给所有此类 UART 自动挂接传-attach_uart选项给单个 UART 自动挂接-uart_name_attach_uart设置挂接命令全局用-attach_uart_cmdcmd单个 UART 用-uart_name_attach_uart_cmd默认命令由CONFIG_UART_NATIVE_PTY_AUTOATTACH_DEFAULT_CMD给出默认命令假定系统已安装xterm与screen。uart_cmd命令本质上是任意 shell 命令包括命令列表因此可以借此调用任何其他脚本或程序且会在 PTY 创建后立即运行。例如创建指向新建 PTY 的链接并在程序结束时删除$ zephyr.exe --uart_attach_uart_cmdln -s %s /tmp/somename ; rm /tmp/somename该驱动支持轮询模式、中断模式与异步模式但不支持运行时配置与线控line control。TTY UART 详解通过该驱动应用可以使用轮询与中断型 UART API 向连接的串口设备读写字符。当 devicetree 包含zephyr,native-tty-uartcompatible 且状态为okay的节点时自动使能例如uart { status okay; compatible zephyr,native-tty-uart; serial-port /dev/ttyUSB0; current-speed 115200; };串口交互可通过多种方式配置默认串口与波特率通过 devicetree 属性serial-port与current-speed设置serial-port可选也可通过命令行选项X_port与X_baud设置X为节点名命令行选项覆盖 devicetree 值其余配置数据位、停止位、奇偶校验、波特率等可在运行时用uart_configure设置可通过启用CONFIG_UART_INTERRUPT_DRIVEN模拟中断驱动的 UART。支持多实例。uart-native-tty示例应用见 samples/drivers 目录提供了该驱动的完整工作示例。该驱动仅支持轮询模式与中断模式不支持异步模式支持运行时配置但不支持线控。Subsystems backends子系统后端除自带外设外native_sim 还为若干 Zephyr 子系统提供专用后端与宿主操作系统集成更紧密。Console 后端默认将任何printk写入重定向到宿主原生应用的stdout若没有编译任何 UART 驱动默认选择该驱动作为 console 后端否则CONFIG_UART_CONSOLE会被设置选择 UART 作为 console 后端。Logger 后端将所有 logger 输出打印到进程stdout时间戳CONFIG_LOG_BACKEND_FORMAT_TIMESTAMP启用彩色输出CONFIG_LOG_BACKEND_SHOW_COLOR启用并通过命令行选项--color、--no-color、--force-color控制native_sim 默认将 logger 配置为CONFIG_LOG_MODE_IMMEDIATE该后端通过CONFIG_LOG_BACKEND_NATIVE_POSIX选择默认启用。Tracing 后端为 Zephyr 的 CTF 通用追踪格式子系统提供后端将追踪数据写入宿主文件系统的文件中。Emulators模拟器支持所有可用的硬件模拟器HW emulators都可以与 native_sim 配合使用。板级 devicetree 中即预置了多个模拟器设备例如zephyr,i2c-emul-controller、zephyr,spi-emul-controller、zephyr,gpio-emul、zephyr,adc-emul、zephyr,dma-emul、zephyr,espi-emul-controller、zephyr,mspi-emul-controller等见 native_sim.dts。HostFUSE文件系统访问构建带文件系统的 Zephyr 时可通过启用CONFIG_FUSE_FS_ACCESS将设备分区暴露到宿主文件系统。该选项启用一个 FUSE用户空间文件系统层把模拟的嵌入式文件系统挂载到宿主文件系统将 Zephyr 文件系统调用映射为所需的 UNIX 文件系统调用从而用cd、ls、mkdir等普通操作系统命令访问其分区。要点默认分区通过当前工作目录下的flash/目录暴露可用命令行选项--flash-mount更改退出时 native_sim 应用负责卸载目录若应用崩溃可用fusermount清理残留挂载点$ fusermount -u flash可用CONFIG_FUSE_LIBRARY_VERSION选择 FUSE v2 或 v3 宿主库默认 v3。v2 需要最低 2.6 版本v3 需要 3.0 以上需要正确设置pkg-config以找到 FUSE 安装路径与编译标志使用 32 位 native_sim 变体时需要对应的 32 位 FUSE 库。例如在 Ubuntu 24.04 宿主上使用 v3 库32 位构建安装pkg-config与libfuse3-dev:i38664 位构建安装libfuse3-dev$ sudo dpkg --add-architecture i386 $ sudo apt update $ sudo apt-get install pkg-config libfuse3-dev:i386 libfuse3-dev $ export PKG_CONFIG_PATH/usr/lib/i386-linux-gnu/pkgconfig类似地libfuse-dev:i386与libfuse-dev分别提供 32 位与 64 位的 FUSE v2 库和头文件。Host 文件系统挂载启用CONFIG_FILE_SYSTEM_NATIVE_MOUNT后可以把宿主文件系统的某个路径挂载进 Zephyr 的文件系统层级让 Zephyr 像访问其他嵌入式挂载点一样访问甚至修改宿主文件与文件夹。挂载方式是在命令行向可执行文件传递-volume选项$ zephyr.exe -volume/host/dir:/zephyr/dir该选项遵循 Docker volume 挂载语法HOST-DIR:ZEPHYR-DIR[:ro]。可选的:ro后缀将卷以只读方式挂载。该选项可多次提供以挂载多个宿主目录。小结何时选择 native_sim总结一下 native_sim 的适用边界适合开发与测试与硬件解耦的应用代码需要可复现、确定性的测试与调试需要在 CI 中无硬件运行 Zephyr 应用需要借助宿主外设以太网、蓝牙、CAN、SDL 显示、真实串口做集成测试不适合需要精确建模特定硬件行为、依赖具体 SoC 外设寄存器语义、需要测试网络栈 L2 层可用 offloaded sockets 折中等场景。对于需要特定硬件、同时又要保留 POSIX 架构优势的场景可考虑 bsim 等板级方案。基于以上全部细节你现在已经可以动手尝试west build -b native_sim samples/hello_world然后运行./build/zephyr/zephyr.exe --help逐一探索这份无硬件开发的完整工具箱。【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考