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) 返回主线程的静态优先级值,用于验证当前执行上下文确为内核创建的主线程。