在 WSL 上搭建小熊派 BearPi-HM Nano 开发环境(完整实操 + 踩坑记录)

Viewed 2

在 WSL 上搭建小熊派 BearPi-HM Nano 开发环境(完整实操 + 踩坑记录)

环境:Windows 10 + WSL2
目标:在 WSL 里把 代码编译出 Hi3861_wifiiot_app_allinone.bin,然后在 Windows 侧烧录到板子上。
结行:编译在 WSL,烧录在 Windows。整个链路可以跑通,实测 BUILD SUCCESS。


1. 准备 WSL

在 Windows PowerShell(管理员) 中执行:

wsl --install -d Ubuntu-22.04
wsl --set-default-version 2
wsl --list --verbose      # 确认 VERSION = 2
wsl

进入 WSL 后先换源、更新(国内网络强烈建议换源,否则 apt update 会很慢):

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo sed -i 's@http://archive.ubuntu.com/ubuntu/@https://mirrors.tuna.tsinghua.edu.cn/ubuntu/@g' /etc/apt/sources.list
sudo sed -i 's@http://security.ubuntu.com/ubuntu/@https://mirrors.tuna.tsinghua.edu.cn/ubuntu/@g' /etc/apt/sources.list
sudo apt update && sudo apt upgrade -y

以下教程可以直接复制到Claude code ,Codex ,opencode 等Agent中辅助完成

2. 安装系统依赖

sudo apt install -y \
  build-essential gcc g++ make cmake \
  git curl wget unzip tar \
  python3 python3-pip python3-setuptools python3-venv \
  python3-dev libffi-dev libssl-dev zlib1g-dev \
  dos2unix file

3. 搞一份源码

cd ~
git clone https://gitee.com/bearpi/bearpi-hm_nano.git
cd bearpi-hm_nano

如果 clone 卡住,可以在 Windows 侧下载 zip 再拷贝进 WSL。

源码目录里最关键的两个位置:

bearpi-hm_nano/
├── applications/BearPi/BearPi-HM_Nano/sample/   # 所有示例代码
└── out/BearPi-HM_Nano/                          # 编译产物(编译后出现)

4. 安装交叉编译工具链(三个组件)

需要三样东西:gcc_riscv32(编译器)、gn(工程生成)、ninja(构建执行器)。

4.1 下载

官方给的下载地址(也可以从 bearpi-hm_nano 仓库 的 README 里找最新链接):

mkdir -p ~/tools && cd ~/tools

# 1) riscv32 交叉编译器
wget -c https://repo.huaweicloud.com/harmonyos/compiler/gcc_riscv32/7.3.0/linux/gcc_riscv32-linux-7.3.0.tar.gz

# 2) gn
wget -c https://repo.huaweicloud.com/harmonyos/compiler/gn/1523/linux/gn.1523.tar

# 3) ninja
wget -c https://repo.huaweicloud.com/harmonyos/compiler/ninja/1.9.0/linux/ninja.1.9.0.tar

4.2 解压

cd ~/tools
tar -xzf gcc_riscv32-linux-7.3.0.tar.gz
tar -xf  gn.1523.tar
tar -xf  ninja.1.9.0.tar

ls ~/tools
# gcc_riscv32  gn  ninja

解压后目录结构应是这样(gn 和 ninja 是单个可执行文件,不是多层目录):

~/tools/gn/gn          ← 可执行文件
~/tools/ninja/ninja    ← 可执行文件
~/tools/gcc_riscv32/bin/riscv32-unknown-elf-gcc

验证一下:

~/tools/gn/gn --version        
~/tools/ninja/ninja --version  
~/tools/gcc_riscv32/bin/riscv32-unknown-elf-gcc --version

4.3 写进 PATH(持久化)

cat >> ~/.bashrc <<'EOF'

# ==== BearPi-HM Nano toolchain ====
export PATH=~/tools/gn:$PATH
export PATH=~/tools/ninja:$PATH
export PATH=~/tools/gcc_riscv32/bin:$PATH
EOF

source ~/.bashrc

验证:

which gn ninja riscv32-unknown-elf-gcc

5. Python 环境

build.py 会用 Python 做 gn 调用、镜像签名和打包。

5.1 装 Python 依赖

pip3 install --user pycryptodome ecdsa six kconfiglib SCons

5.2 Ubuntu 22.04 没有 python 命令

构建脚本内部(gn 的 exec_script)会直接调用 python,而 Ubuntu 22.04 默认只提供 python3,报错长这样:

.../build.py: line 1: python: command not found
# 或者 gn 报 exec_script 失败,返回码 127

最省事的修法(全局软链,构建系统就认这个名字):

sudo ln -sf /usr/bin/python3 /usr/bin/python
python --version   # Python 3.10.12

也可以用 update-alternatives 或 pyenv,但对这个老构建系统来说,直接软链最稳。
不要在项目里建 venv 然后指望 python 指向它——build.py 是 #!/usr/bin/env python,路径不可控。

5.3 别被「Crypto 缺失」骗了

如果看到类似 ModuleNotFoundError: No module named 'Cryptodome' 的提示,
这个项目用的是 Crypto(pycryptodome),不是 Cryptodome(pycryptodomex)。

验证用的是哪一个:

python3 -c "import Crypto; print(Crypto.__version__)"   # 3.23.0 ✅

如果 Crypto 报错才需要 pip3 install --user pycryptodome。
如果误装了 pycryptodomex,把 Cryptodome 目录删掉,别让它混淆。

5.4 import scons 报错是正常的

pip 装的是 SCons,导入名是大写的:

python3 -c "import scons"   # ❌ ModuleNotFoundError
python3 -c "import SCons; print(SCons.__version__)"   # ✅ 4.x

这个项目实际上主要靠 build.py + gn + ninja,基本不直接调 scons,
但装上有备无患(某些脚本会 import SCons)。

5.5 一次校验全部依赖

python3 - <<'EOF'
mods = ["Crypto", "six", "ecdsa", "kconfiglib", "SCons"]
for m in mods:
    try:
        __import__(m)
        print(f"[OK]   {m}")
    except Exception as e:
        print(f"[FAIL] {m}: {e}")
EOF

全部 [OK] 就可以编译了。


6. 编译

cd ~/bearpi-hm_nano
python build.py BearPi-HM_Nano
  • 首次编译比较慢(几分钟,取决于机器);
  • 中途看到一堆 warning 是正常的(OpenHarmony 1.x 老代码 + GCC 7.3);
  • 成功时结尾会出现(build/lite/compile_process.py 里的原文):
=== start build ===
...
ohos BearPi-HM_Nano build success!

看到 ohos BearPi-HM_Nano build success! 就是成了。

6.1 产物在哪

out/BearPi-HM_Nano/
├── Hi3861_wifiiot_app_allinone.bin    ← 烧录用这个
├── Hi3861_wifiiot_app_burn.bin
├── Hi3861_boot_signed.bin
├── Hi3861_loader_signed.bin
└── ...

只需要 Hi3861_wifiiot_app_allinone.bin,它已经把 boot / loader / 应用打包在一起了。

6.2 增量重编

# 改了代码,直接重跑即可(ninja 增量编译很快)
python build.py BearPi-HM_Nano


7. 切换要编译的示例

小熊派所有示例都在 applications/BearPi/BearPi-HM_Nano/sample/ 下,
但同一时间只会编译 BUILD.gn 里启用的那一个。

打开 sample/BUILD.gn,你会看到类似:

deps = [
    #"B1_basic_led_blink:led_example",
    #"B2_basic_button:button_example",
    ...
    "D10_iot_cloud_oc_manhole_cover:cloud_oc_manhole_cover",   # ← 当前启用
    #"D11_iot_cloud_oc_infrared:cloud_oc_infrared",
]

规则很简单:把想跑的那一行前面的 # 去掉,其余行加上 #,保证只有一行是启用的。

编译规则:一行都不能多。如果同时启用两个含 main() 的示例,链接阶段会报 multiple definition of 'main'。


8. 烧录(回 Windows 做)

8.1 烧录

在 Windows 资源管理器里直接访问:

\\wsl$\Ubuntu-22.04\root\bearpi-hm_nano\out\BearPi-HM_Nano

⚠️ 别在 WSL 里直接用 /mnt/c 下编辑源码再编译,跨文件系统 IO 极慢,而且换行/权限容易出问题。源码放 WSL 原生路径,只把产物拷出去。

8.2 装驱动 & 烧录

  1. Windows 装 CH341SER.EXE(CH340 串口驱动),插上板子后在设备管理器里确认有 USB-SERIAL CH340 (COMx);
  2. 打开 Hiburn(华为官方烧录工具,BearPi 资料包里自带);
  3. 选择 Hi3861_wifiiot_app_allinone.bin;
  4. 波特率 921600,勾选 Auto burn;
  5. 点 Connect,然后按一下板子上的 RESET 键;
  6. 看到进度条走完、提示成功即可。

烧录失败 99% 是这三件事:串口被别的软件占用(先关掉串口助手)、没按 RESET、波特率没设成 921600。

8.3 看日志

用任意串口助手(MobaXterm / XCOM / PuTTY / Arduino IDE 串口监视器):

复位后应该能看到 Hi3861 的启动日志。注意烧录用 921600,日志用 115200,两个别搞混。


9. 跑通第一个程序:LED 闪烁

  1. 改 sample/BUILD.gn,只启用 B1:

    deps = [
        "B1_basic_led_blink:led_example",
        #"B2_basic_button:button_example",
        ...
    ]
    
  2. 编译:

    cd ~/bearpi-hm_nano
    python build.py BearPi-HM_Nano
    
  3. 用 Hiburn 烧录(921600);

  4. 复位板子,板载 LED 开始闪烁 → 环境搭建完成。

0 Answers