1. 创建第一个Zephyr应用

创建第一个Zephyr应用 学习卡片

任务目标

在本案例中,你将完成Zephyr RTOS的首次实战:搭建基于nRF52840 DK开发板的Zephyr开发环境,创建一个最小应用工程,编译并烧录到开发板,最终通过串口终端验证输出Hello World。整个过程覆盖从零到串口打印的完整闭环。

环境准备

本案例需要以下环境与依赖,请提前安装配置:

  • 主机系统:Ubuntu 22.04 LTS(64位)或Windows 10/11 + WSL2
  • Zephyr SDK:0.16.8(包含arm-none-eabi-gcc编译器、QEMU等工具)
  • west:Zephyr的元工具,用于多仓库管理与构建
  • Python:3.8+,需安装pyelftools等依赖
  • nRF52840 DK开发板:用于烧录与串口输出验证

安装Zephyr SDK并设置环境变量:

# 下载并解压SDK(以0.16.8为例)
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.8/zephyr-sdk-0.16.8_linux-x86_64.tar.xz
tar xf zephyr-sdk-0.16.8_linux-x86_64.tar.xz -C ~/
cd ~/zephyr-sdk-0.16.8
./setup.sh -t all
# 设置环境变量(建议写入~/.bashrc)
export ZEPHYR_SDK_INSTALL_DIR=~/zephyr-sdk-0.16.8
export ZEPHYR_TOOLCHAIN_VARIANT=zephyr
export ZEPHYR_BASE=~/zephyrproject/zephyr

创建并初始化Zephyr工作区

# 创建工作区目录
mkdir ~/zephyrproject && cd ~/zephyrproject
# 初始化west工作区(拉取Zephyr主仓库)
west init -m https://github.com/zephyrproject-rtos/zephyr --mr v3.7.0
# 拉取Zephyr及依赖模块(如hal_nordic等)
west update
# 导出Zephyr CMake包(供west build使用)
west zephyr-export
# 安装Python依赖
pip install -r ~/zephyrproject/zephyr/scripts/requirements.txt

创建最小应用工程

在~/zephyrproject下创建你的第一个应用目录hello_world,包含两个文件:

mkdir -p ~/zephyrproject/hello_world/src
cd ~/zephyrproject/hello_world

src/main.c——应用入口,通过内核启动后调用串口打印:

#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/uart.h>

/* 获取UART0设备(开发板默认串口) */
const struct device *const uart_dev = DEVICE_DT_GET(DT_NODELABEL(uart0));

int main(void)
{
    if (!device_is_ready(uart_dev)) {
        return -1;
    }

    const char msg[] = "Hello World\r\n";
    for (int i = 0; i < sizeof(msg) - 1; i++) {
        uart_poll_out(uart_dev, msg[i]);
    }

    while (1) {
        k_sleep(K_FOREVER);
    }
    return 0;
}

CMakeLists.txt——构建脚本,声明应用名与源码:

cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(hello_world)

target_sources(app PRIVATE src/main.c)

prj.conf——内核配置(本案例无需额外配置,文件可留空或仅加注释):

# 最小应用,无需额外配置

编译与烧录

# 进入应用目录
cd ~/zephyrproject/hello_world
# 编译(指定开发板为nRF52840 DK)
west build -b nrf52840dk/nrf52840
# 烧录到开发板(通过板载J-Link)
west flash

若编译过程中提示缺少hal_nordic模块,请确认已执行west update拉取全部依赖。

验证方法

烧录完成后,通过串口工具(如screen或minicom)连接开发板的USB虚拟串口,波特率115200,8N1格式。复位开发板后,串口终端应输出:

Hello World

通过条件:串口终端完整打印Hello World且无乱码,程序持续运行不崩溃(开发板LED无异常闪烁)。若输出乱码,请检查串口波特率是否匹配;若无输出,请确认west flash烧录成功且开发板处于DFU模式(nRF52840 DK需按下复位键进入烧录模式)。

常见问题排查

  • 编译报错“No board named 'nrf52840dk/nrf52840'”:执行west update后重新编译,确认Zephyr版本为v3.7.0及以上。
  • 烧录失败“No J-Link found”:检查开发板USB连接,安装J-Link驱动,或改用nrfjprog --program build/zephyr/zephyr.hex --chiperase手动烧录。
  • 串口无输出:确认prj.conf中未禁用UART,且开发板串口选择开关(SW5)拨至USB位置。