一、背景与目标
1.1 小鸿与 HelloWorld 是什么
小鸿是基于 OpenHarmony + 海思 WS63 方案的设备/工程,其代码位于 vendor/atomgit/xiaohong/xiaohong,使用 CMSIS-RTOS2(LiteOS-M 适配)做多任务调度。
HelloWorld 是小鸿 samples 内的一个最小示例(目录名为 00_helloworld),在系统启动时通过 APP_FEATURE_INIT 注册初始化函数,在串口打印一行 [HelloWorld] hello world.。将其集成到小鸿上,可以:
- 快速验证小鸿工程编译、烧录与串口输出是否正常;
- 作为“第一个可运行 demo”的参考,便于后续添加其他 sample。
1.2 本文目标
- 说明 HelloWorld demo 所在目录与构建方式(
samples/00_helloworld,通过 features 编入); - 说明 为能编译并打进镜像需要修改的文件:vendor 顶层 BUILD.gn、samples/BUILD.gn、config.py、ohos.cmake;
- 说明如何通过串口查看运行结果;
- 给出预期日志与“如何判断成功”的结论。
二、环境与前置条件
- 工程:OpenHarmony + 小鸿 vendor(
vendor/atomgit/xiaohong,含主库与 samples,HelloWorld 位于 samples/00_helloworld); - SDK:WS63 SDK(通过
ws63_sdk.gni引用); - 工具:串口调试助手(如 UartAssist、Xshell 等),波特率 115200;
- 硬件:小鸿开发板,通过 USB 转串口连接 PC,TX/RX/GND 正确连接。
三、集成步骤(文件放哪里、改哪里能编译)
HelloWorld 以 samples 形式存在,目录为 vendor/atomgit/xiaohong/samples/00_helloworld,通过 samples/BUILD.gn 的 features 与板级 config.py / ohos.cmake 参与编译并打进 ws63-liteos-app 镜像。以下步骤须全部完成,缺一不可。
3.1 目录与源码位置
HelloWorld 已放在小鸿 vendor 包内,无需再拷贝到主库目录:
- 目录:
vendor/atomgit/xiaohong/samples/00_helloworld/; - 源文件:
helloworld.c; - 构建目标:本目录下的
static_library("helloworld"),由samples/BUILD.gn以 feature"00_helloworld:helloworld"形式编入应用。
完整路径为:
vendor/atomgit/xiaohong/
├── BUILD.gn # 顶层 group,依赖 xiaohong 主库与 samples
└── samples/
├── BUILD.gn # lite_component("app"),通过 features 选择示例
└── 00_helloworld/
├── BUILD.gn # static_library("helloworld")
├── helloworld.c # 演示源码
└── README.md # 操作说明
若从别处拷贝示例,请将 00_helloworld 整个目录放到 vendor/atomgit/xiaohong/samples 下。
3.2 步骤 1:检查 vendor 顶层 BUILD.gn(编译前必查)
打开 vendor/atomgit/xiaohong/BUILD.gn,在 group("xiaohong") 的 deps 中确认包含 "samples:app",。若缺少该项,samples 下的示例不会参与整包编译。
group("xiaohong") {
deps = [
"xiaohong:xiaohong",
"samples:app",
]
}
3.3 步骤 2:在 samples/BUILD.gn 中启用 HelloWorld
修改 vendor/atomgit/xiaohong/samples/BUILD.gn,在 lite_component("app") 的 features 列表中保留或添加 "00_helloworld:helloworld"(未注释):
lite_component("app") {
features = [
"00_helloworld:helloworld",
# 其他示例按需取消注释
]
}
说明:以 # 开头的行为注释,不会参与编译;需要编进固件的示例须为未注释的一行。
3.4 步骤 3:在 config.py 中登记组件
在 device/soc/hisilicon/ws63v100/sdkv106/build/config/target_config/ws63/config.py 中,找到 'ws63-liteos-app' 配置,在其 'ram_component' 列表中添加 "helloworld":
"helloworld"
说明:ram_component 声明参与 ws63-liteos-app 镜像链接的组件;未在此列出的 static_library 不会被打进最终 app 镜像。
3.5 步骤 4:在 ohos.cmake 中登记组件
在 device/soc/hisilicon/ws63v100/sdkv106/libs_url/ws63/cmake/ohos.cmake 中,找到 elseif(${TARGET_COMMAND} MATCHES "ws63-liteos-app") 对应的 set(COMPONENT_LIST ...),在列表中添加 "helloworld":
"helloworld"
说明:COMPONENT_LIST 决定参与构建与安装的组件(静态库),需与 步骤 3 的 ram_component 及 samples 内 BUILD.gn 的 target 名称一致。
3.6 代码说明(无需再改)
当前 helloworld.c 逻辑非常简单:使用 ohos_init.h 的 APP_FEATURE_INIT 注册一个初始化函数,在系统启动时执行一次 printf:
#include <stdio.h>
#include "ohos_init.h"
static void HelloWorldEntry(void)
{
printf("[HelloWorld] hello world.\r\n");
}
APP_FEATURE_INIT(HelloWorldEntry);
无需额外适配,与 00_thread 使用同一套启动与打印方式。
四、运行逻辑简述
- 系统启动后,通过 APP_FEATURE_INIT(HelloWorldEntry) 调用 HelloWorldEntry;
- HelloWorldEntry 内执行一次 printf("[HelloWorld] hello world.\r\n");
- 串口上会看到一条带
[HelloWorld]前缀的日志,便于确认 demo 已执行。
五、编译
在 OpenHarmony 工程根目录下依次执行以下命令(建议分步执行,便于排查问题)。
1. 清理上次编译产物(避免旧 out 与缓存干扰)
rm -fr out/xiaohong/xiaohong/ .ccache/*
2. 选择产品与系统类型
hb set
按提示依次选择,最终应显示为:
OHOS Which os_level do you need? mini
OHOS Which product do you need? xiaohong
3. 全量编译并生成固件
hb build -f
编译成功后,固件生成路径为:out/xiaohong/xiaohong/ws63-liteos-app(Windows 下如 Z:\A_OH60T\out\xiaohong\xiaohong\ws63-liteos-app)。



六、烧录
以下内容来自《小鸿AI 固件烧录与启动指导手册》固件烧录与启动说明。
6.1 烧录前准备
硬件搭建:使用 Typec 线将板端与 PC 端连接。

安装驱动:安装「CH341SER 驱动」(CH341SER 驱动下载地址,若该链接失效或无法下载,可自行搜索下载)。安装前请将单板与 PC 连接,点击安装即可;显示驱动安装成功代表成功,若显示驱动预安装成功则代表安装失败。



下载 BurnTool 烧录工具:下载并解压 BurnTool。
链接:https://atomgit.com/xiaohong-ai/docs/tree/main/tools

6.2 BurnTool 烧录步骤
打开烧录工具,选择对应的串口;点开 Option 选项,选择对应目标(WS63E 与 WS63 属于同一系列,选 WS63 即可)。

点击 Select file 选择烧录文件(选择 ws63-liteos-app-all.fwpkg,该文件位于固件路径
Z:\A_OH60T\out\xiaohong\xiaohong\ws63-liteos-app下)。

勾选 Auto Burn 和 Auto disconnect 选项。

点击 Connect 连接开始烧录。
⚠️ 重要:进入烧录方式因板子批次不同
- 新板子:点击 Connect 后直接开始烧录。
- 旧板子:点击 Connect 后,需同时按住两个音量/亮度按键约 1.5 秒后松开,再开始烧录。

待全部烧录成功后,显示 All images burn successfully。


七、串口输出与结果分析
7.1 串口连接(查看日志)
准备:
CH341 USB 转串口驱动:若在运行 demo 前环境搭建时已安装过 CH341_USB 转串口 Windows/Linux 驱动程序,此处可跳过;未安装则需先安装,否则无法识别串口。
串口工具:从仓库下载 UartAssist 并解压使用。

烧录完成后,按以下步骤通过串口查看运行日志:
- 打开 UartAssist,协议选择 SERIAL,端口选择小鸿对应的 COM 口;
- 设置串口参数:波特率 115200,数据位 8,停止位 1,无校验、无流控;
- 先打开串口连接;

再给板子上电或复位,即可抓取完整启动与 HelloWorld 日志。

在串口工具页面查看打印日志

7.2 预期出现的日志
| 阶段 | 日志特征 |
|---|---|
| 系统启动 | 若干行 APP/SDK 等启动日志 |
| HelloWorld | 出现一行:[HelloWorld] hello world. |
7.3 实际运行日志(节选)
APP|dbg uart init ok.
APP|SDK Version: 1.10.106
...
[HelloWorld] hello world.
...
7.4 如何判断“运行成功”
- 串口波特率 115200 下,在启动日志中能看到
[HelloWorld] hello world.即表示:- 小鸿工程已正确编译并烧录;
- HelloWorld demo 已通过 samples/BUILD.gn 的 features 及 config.py / ohos.cmake 纳入编译并打进 ws63-liteos-app 镜像;
- 系统启动时已执行 HelloWorld 初始化并完成一次日志打印。
八、常见问题与排查
| 现象 | 建议排查 |
|---|---|
| 串口无任何打印 | 确认 COM 口是否正确(部分板子有烧录口与日志口之分);TX/RX 是否交叉接好;是否先打开串口再上电/复位。 |
有启动日志但无 [HelloWorld] | 确认:(1) vendor/atomgit/xiaohong/BUILD.gn 的 deps 含 "samples:app",;(2) samples/BUILD.gn 的 features 中含未注释的 "00_helloworld:helloworld";(3) config.py 的 ram_component 与 ohos.cmake 的 COMPONENT_LIST 中已添加 "helloworld"。然后执行清理后重新全量编译并烧录。 |
| 乱码 | 确认波特率为 115200,与系统串口输出配置一致。 |
九、小结
- 文件放哪里:HelloWorld demo 位于
vendor/atomgit/xiaohong/samples/00_helloworld/,内含 helloworld.c、BUILD.gn(static_library("helloworld"))及 README。若从别处拷贝,请将 00_helloworld 整目录放到vendor/atomgit/xiaohong/samples下。 - 改哪里能编译并打进镜像:
- vendor/atomgit/xiaohong/BUILD.gn:
group("xiaohong")的 deps 中须包含"samples:app",; - vendor/atomgit/xiaohong/samples/BUILD.gn:features 中须包含未注释的
"00_helloworld:helloworld"; - device/soc/hisilicon/ws63v100/sdkv106/build/config/target_config/ws63/config.py:
'ws63-liteos-app'的ram_component中须添加"helloworld"; - device/soc/hisilicon/ws63v100/sdkv106/libs_url/ws63/cmake/ohos.cmake:ws63-liteos-app 对应的 COMPONENT_LIST 中须添加
"helloworld"。
- vendor/atomgit/xiaohong/BUILD.gn:
- 编译时先执行 清理(
rm -fr out/xiaohong/xiaohong/ .ccache/*),再 hb set(选择 mini + xiaohong),最后 hb build -f。烧录后,用串口工具以 115200 波特率连接,上
