其他
开发 Zephyr RTOS 应用:用 west 构建烧写…
当需要用 west 构建/烧写 Zephyr 应用、配置板级 target 与 Kconfig/devicetree、接入日志子系统,或在主机上做 native_sim 仿真测试与 GDB 调试时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 35/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 39/100 ×0.15
适用场景
开发 Zephyr RTOS 应用:用 特定
解决思路
- 安装 west:`pip install west`。
- 初始化工作区:`west init ~/zephyrproject`,然后 `cd ~/zephyrproject`,再执行 `west update` 拉取 Zephyr 及所有模块。
- 安装 Python 依赖:`pip install -r ~/zephyrproject/zephyr/scripts/requirements.txt`。
- 安装 Zephyr SDK(各 target 的工具链,从 https://github.com/zephyrproject-rtos/sdk-ng/releases 下载),并设置环境变量 `export ZEPHYR_SDK_INSTALL_DIR=~/zephyr-sdk-0.17.0` 和 `export ZEPHYR_BASE=~/zephyrproject/zephyr`。
- 构建示例应用:`west build -b nrf52840dk/nrf52840 samples/hello_world`。
- 烧写到硬件用 `west flash`;打开串口监视用 `west espressif monitor` 或 `screen /dev/ttyACM0 115200`。
- 按需选用板级 target 名:nRF52840 DK 用 `nrf52840dk/nrf52840`,STM32 Nucleo-F446RE 用 `nucleo_f446re`,Raspberry Pi Pico 用 `rpi_pico/rp2040`,ESP32 用 `esp32_devkitc_wroom/esp32/procpu`,QEMU Cortex-M3 用 `qemu_cortex_m3`,原生 POSIX 用 `native_sim`。
- 按标准结构组织应用:`CMakeLists.txt`、`prj.conf`(Kconfig fragment)、`app.overlay`(可选 devicetree overlay)、`src/main.c`。
- 编写 CMakeLists.txt:`cmake_minimum_required(VERSION 3.20.0)`、`find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})`、`project(my_app)`、`target_sources(app PRIVATE src/main.c)`。
- 在 `prj.conf` 中用 `key=value` 配置 Kconfig 特性,例如 `CONFIG_GPIO=y`、`CONFIG_UART_CONSOLE=y`、`CONFIG_LOG=y`、`CONFIG_LOG_DEFAULT_LEVEL=3`(0=off 1=err 2=warn 3=info 4=debug)、`CONFIG_PRINTK=y`、`CONFIG_HEAP_MEM_POOL_SIZE=4096`、`CONFIG_MAIN_STACK_SIZE=2048`。
- 用 Kconfig 工具查看/调整配置:`west build -t menuconfig` 打开交互式菜单,`west build -t guiconfig` 打开图形化菜单,`west build -t config -- -n | grep "^CONFIG_"` 列出所有已启用选项。
- 编写 devicetree overlay(`app.overlay`):在 `/ { ... }` 下新增节点(如 `leds`,`compatible = "gpio-leds"`,`gpios = <&gpio0 13 GPIO_ACTIVE_LOW>`);用 `&uart0 { current-speed = <115200>; }` 覆盖已有节点属性;用 `&spi1 { status = "disabled"; }` 禁用节点。
- 在 C 代码中访问 devicetree:`#include <zephyr/devicetree.h>` 与 `#include <zephyr/drivers/gpio.h>`,用 `DT_ALIAS(led0)` 取节点、`GPIO_DT_SPEC_GET(LED_NODE, gpios)` 取 GPIO 描述符,再调用 `gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE)` 初始化、`gpio_pin_toggle_dt(&led)` 翻转电平。
- 使用日志子系统:`#include <zephyr/logging/log.h>`,用 `LOG_MODULE_REGISTER(my_module, LOG_LEVEL_DBG)` 注册模块,然后调用 `LOG_INF`、`LOG_WRN`、`LOG_ERR`、`LOG_DBG`,用 `LOG_HEXDUMP_DBG(buf, len, "raw buffer")` 打印缓冲区。
- 在 `prj.conf` 中配置日志后端:`CONFIG_LOG=y`、`CONFIG_LOG_BACKEND_UART=y`(UART 输出)、`CONFIG_LOG_BACKEND_RTT=y`(Segger RTT 输出)、`CONFIG_LOG_TIMESTAMP_DEFAULT=y`(加时间戳)、`CONFIG_LOG_PROCESS_THREAD_STACK_SIZE=512`。
- 用 native_sim 做主机测试:`west build -b native_sim samples/hello_world`,构建后直接运行 `./build/zephyr/zephyr.exe`(无需硬件)。
- 在 native_sim 上用 GDB 调试:`gdb ./build/zephyr/zephyr.exe`,然后 `(gdb) run`。
- 查看 native_sim 的模拟 UART:后台运行 `./build/zephyr/zephyr.exe &`,再 `screen $(ls /tmp/zephyr-uart-*)`。
- 使用 native_sim 附加选项:`./build/zephyr/zephyr.exe --help` 查看帮助,`./build/zephyr/zephyr.exe --stop-at=5` 在模拟 5 秒后停止。
- 在硬件上调试:直接 `west debug`(自动启动 OpenOCD + GDB);或手动执行 `west build -t run &`,再 `arm-zephyr-eabi-gdb build/zephyr/zephyr.elf`,依次执行 `target remote :3333`、`monitor reset halt`、`load`、`continue`。
- 使用 Zephyr 的线程感知 GDB(通过 OpenOCD RTOS 插件):`info threads` 列出 Zephyr 线程,`thread 2` 切换到指定线程。
- 需要 west manifest 细节时,查阅参考文档 `references/west-manifest.md`。
- 相关技能可按需延伸:硬件调试用 `skills/embedded/openocd-jtag`,换用其他 RTOS 用 `skills/embedded/freertos`,内存区域配置用 `skills/embedded/linker-scripts`,GDB 会话管理用 `skills/debuggers/gdb`。
适用边界 · 注意事项
- 不使用 Zephyr RTOS(如裸机、FreeRTOS、Linux 应用)时不要套用。
- native_sim 只是把 Zephyr 当作 Linux 进程运行,无法验证真实硬件外设的时序与电气行为,涉及真实硬件的验证仍需上板。
- `west flash`、`west debug`、`west espressif monitor` 等依赖具体硬件与调试探针/工具链,未连接目标板或不支持对应 target 时不可用。