songbin@hao800.net    0755-29768958
返回新闻中心
技术分享

在小鸿上成功运行 HelloWorld Demo 技术实践

2026-06-11 20:07:04

一、背景与目标

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)。

image-20260309173939154

image-20260309174017510

image-20260309174317740


六、烧录

以下内容来自《小鸿AI 固件烧录与启动指导手册》固件烧录与启动说明。

6.1 烧录前准备

  • 硬件搭建:使用 Typec 线将板端与 PC 端连接。

    55c4feb3c99d6077ec23c8438c3c15da

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

    image-20260306101906440

    image-20260306101943862

    image-20260306102008305

  • 下载 BurnTool 烧录工具:下载并解压 BurnTool。

    链接:https://atomgit.com/xiaohong-ai/docs/tree/main/tools

    image-20260306110027871

6.2 BurnTool 烧录步骤

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

    image-20260306104345866

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

    image-20260306104547183

    image-20260306104720564

  • 勾选 Auto Burn 和 Auto disconnect 选项。

    image-20260306104838005

  • 点击 Connect 连接开始烧录。

    ⚠️ 重要:进入烧录方式因板子批次不同

    • 新板子:点击 Connect 后直接开始烧录
    • 旧板子:点击 Connect 后,需同时按住两个音量/亮度按键约 1.5 秒后松开,再开始烧录。

    image-20260306105001979

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

image-20260306105249383

673e3245796e6d6497f3e480b2f9bd25


七、串口输出与结果分析

7.1 串口连接(查看日志)

准备:

烧录完成后,按以下步骤通过串口查看运行日志:

  1. 打开 UartAssist,协议选择 SERIAL,端口选择小鸿对应的 COM 口;
  2. 设置串口参数:波特率 115200,数据位 8,停止位 1,无校验、无流控;
  3. 先打开串口连接;

image-20260309180344103

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

    image-20260309181530213

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

    image-20260309181634571

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.cBUILD.gnstatic_library("helloworld"))及 README。若从别处拷贝,请将 00_helloworld 整目录放到 vendor/atomgit/xiaohong/samples 下。
  • 改哪里能编译并打进镜像
    1. vendor/atomgit/xiaohong/BUILD.gngroup("xiaohong") 的 deps 中须包含 "samples:app",
    2. vendor/atomgit/xiaohong/samples/BUILD.gnfeatures 中须包含未注释的 "00_helloworld:helloworld"
    3. device/soc/hisilicon/ws63v100/sdkv106/build/config/target_config/ws63/config.py'ws63-liteos-app' 的 ram_component 中须添加 "helloworld"
    4. device/soc/hisilicon/ws63v100/sdkv106/libs_url/ws63/cmake/ohos.cmakews63-liteos-app 对应的 COMPONENT_LIST 中须添加 "helloworld"
  • 编译时先执行 清理rm -fr out/xiaohong/xiaohong/ .ccache/*),再 hb set(选择 mini + xiaohong),最后 hb build -f。烧录后,用串口工具以 115200 波特率连接,上