2. 使用内核服务打印Hello World

任务目标

在 Zephyr RTOS 上编写一个最小应用,通过 printk 在内核启动后输出 Hello World,并理解系统启动流程中主线程(main thread)的执行时机。

环境与依赖

  • Zephyr SDK 与工具链已安装,ZEPHYR_BASE 环境变量已设置。
  • 目标板:qemu_x86(无需真实硬件,便于验证)。
  • 所需 Kconfig 配置:CONFIG_PRINTK=y(默认开启)。

项目结构

创建以下两个文件即可构成完整应用:

hello_world/
├── CMakeLists.txt
├── prj.conf
└── src/
    └── main.c

完整实现

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 — 本案例无需额外配置,文件可留空或仅包含注释:

# 默认配置已启用 printk 支持

src/main.c — 应用入口与打印逻辑:

#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>

void main(void)
{
    printk("Hello World\n");
    printk("Board: %s\n", CONFIG_BOARD);
    printk("Main thread priority: %d\n", K_PRIO_COOP(0));
}

构建与运行

cd hello_world
west build -b qemu_x86 .
west build -t run

验证方法与判定标准

运行后终端应输出以下内容(顺序一致):

Hello World
Board: qemu_x86
Main thread priority: 0

判定通过条件:

  • 第一行输出 Hello World,证明 printk 正常工作。
  • 第二行输出 Board: qemu_x86,证明内核已初始化并读取配置。
  • 第三行输出主线程优先级 0(协作式优先级),证明代码运行在系统主线程上下文中。

内核启动与主线程执行说明

Zephyr 启动流程为:复位向量 → 内核早期初始化(设备树、时钟、驱动模型)→ 调度器启动 → 自动创建主线程并调用 main()。因此 main() 是应用层第一个被执行的用户代码,此时内核服务(如 printk)已完全就绪。若在 main() 之前调用内核服务,可能导致未定义行为——这是本案例需要理解的关键点。

上述代码中 K_PRIO_COOP(0) 返回主线程的静态优先级值,用于验证当前执行上下文确为内核创建的主线程。