跳到主要内容

故障排查

排查时先找“最后一个正常结果”,再检查紧邻的下一层。这样可以避免同时怀疑环境、Board、JTAG、Flash 和应用。

工作区与工具​

一期完整工程包​

在解压后的工程根目录打开 PowerShell,先确认工作区和内置工具齐全:

Test-Path .\.west\config
Test-Path .\tools\python-portable\python.exe
Test-Path .\tools\git-portable\cmd\git.exe
Test-Path .\sdk_env\tools\cmake\bin\cmake.exe
.\tools\python-portable\python.exe -m west --version

前四项应为 True,最后一项应显示 west 1.5.0。缺少文件时应重新取得完整工程包;不需要在这个目录创建 .venv。一期的 VS Code 任务和 scripts/dev.ps1 会自动使用工程内的 Python、Git、CMake、Ninja 与工具链,因此当前 PowerShell 中的 Get-Command python 或 Get-Command git 指向系统安装位置,并不能说明工程脚本选错了工具。

要检查实际构建路径,从工程根目录执行:

powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\dev.ps1 build hpm6e70_demo
Select-String .\build\hpm6e70_demo\CMakeCache.txt -Pattern '^(WEST_PYTHON|DTC|CMAKE_MAKE_PROGRAM|CMAKE_HOME_DIRECTORY):'

构建结束后,WEST_PYTHON、DTC 和 CMAKE_MAKE_PROGRAM 应指向当前工程目录下的 tools/ 或 sdk_env/;CMAKE_HOME_DIRECTORY 应指向当前工程的 apps/hpm6e70_demo/。不要把另一台电脑复制来的 build/ 当作可移植缓存;首次在新路径构建时,脚本会检测旧路径并重新配置。

二期从零搭建的手动 west 环境​

只有按二期课程从空目录建立工作区时,才激活当时创建的虚拟环境:

Set-ExecutionPolicy -Scope Process Bypass -Force
.\.venv\Scripts\Activate.ps1
$env:PYTHONUTF8 = '1'
west --version
west list zephyr sdk_env sdk_glue

如果此路线的 west 无法识别,再检查 .\.venv\Scripts\west.exe 是否存在并重新激活;不要把这个步骤套用到一期完整工程包。

CMake 报工具链无法编译 dummy C 文件​

如果配置阶段在 zephyr/cmake/modules/kernel.cmake:145 停止,并出现:

The toolchain is unable to build a dummy C file

这一步是编译器自检,还没有进入 Board、设备树或应用代码。常见原因是把另一台电脑的 build/ 或 zephyr/.cache/ToolchainCapabilityDatabase/ 一起复制过来,缓存中的工具链判断已经失效。

在一期完整工程根目录执行:

Remove-Item .\build -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item .\zephyr\.cache -Recurse -Force -ErrorAction SilentlyContinue
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\dev.ps1 rebuild hpm6e70_demo

交付工程应使用 scripts/export-portable.ps1 导出;它会排除 zephyr/.cache,而构建脚本会在当前电脑的临时目录重新建立工具链能力缓存。如果清理后仍失败,再打开 build/hpm6e70_demo/CMakeFiles/CMakeError.log,查看编译器实际报错,而不要只根据最后的 CMake 调用栈判断。

若构建在读取 board.yml、DTS 或其他 UTF-8 文件时出现下面这类错误:

UnicodeDecodeError: 'gbk' codec can't decode byte ...

说明直接执行的 Python 使用了中文 Windows 的系统默认编码。二期手动调用 west 时,在当前终端设置:

$env:PYTHONUTF8 = '1'

随后重新执行原来的 west 命令。该变量不会永久修改系统设置;每次打开新的 Windows PowerShell 后都需要重新设置。一期的 scripts/dev.ps1 已在脚本内设置 PYTHONUTF8=1,通常不需要手动设置。

若二期手动执行 west build 时,CMake 报错位置包含 FindZephyr-sdk.cmake,先检查当前命令来自哪里:

Get-Command cmake | Select-Object Source
cmake --version

路径应指向当前工程的 sdk_env\tools\cmake\bin\cmake.exe,本工作区自带版本为 3.24.0。若手动命令找到的是系统目录或 .venv,把 SDK 自带的 CMake 与 Ninja 放到 PATH 最前面:

$env:Path = "$PWD\sdk_env\tools\cmake\bin;$PWD\sdk_env\tools\ninja;$env:Path"
Get-Command cmake, ninja | Select-Object Name, Source

二期手动构建若提示找不到 Zephyr SDK 或工具链,设置当前终端使用 sdk_env 中的工具链:

$env:ZEPHYR_TOOLCHAIN_VARIANT = 'cross-compile'
$env:CROSS_COMPILE = "$PWD\sdk_env\toolchains\rv32imac_zicsr_zifencei_multilib_b_ext-win\bin\riscv32-unknown-elf-"
$env:HPM_SDK_DIR = "$PWD\sdk_env\hpm_sdk"
Test-Path "${env:CROSS_COMPILE}gcc.exe"

最后一条必须输出 True。一期脚本会自行设置这三个环境变量;若一期构建报工具链文件缺失,先核对交付包内的 sdk_env/ 是否完整。

找不到 Board​

一期先用 powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\dev.ps1 build hpm6e70_demo 重现问题;二期手动 west 路线可执行:

west boards --board-root . --board dshanmcu_hpm6e70

没有输出时依次检查:

  1. boards/hpmicro/dshanmcu_hpm6e70/board.yml 是否存在;
  2. board.name 是否为 dshanmcu_hpm6e70;
  3. 应用 CMakeLists.txt 是否在 find_package(Zephyr ...) 前把工程根目录加入 BOARD_ROOT。

DTS 或 Kconfig 修改没有生效​

一期修改板级配置后,在完整工程根目录让脚本重新配置指定应用:

powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\dev.ps1 rebuild hpm6e70_demo
Select-String .\build\hpm6e70_demo\zephyr\zephyr.dts -Pattern 'uart0|flash@0'
Select-String .\build\hpm6e70_demo\zephyr\.config -Pattern 'CONFIG_SOC_HPM6E70=y|CONFIG_XIP=y|CONFIG_UART_CONSOLE=y'

二期从零搭建、手动调用 west 时,按该路线使用的应用目录和构建目录执行全新配置:

west build -p always -b dshanmcu_hpm6e70/hpm6e70 .\apps\blinky -d .\build

然后检查最终合并结果,而不是只看源文件:

Select-String .\build\zephyr\zephyr.dts -Pattern 'uart0|green LED|flash@0'
Select-String .\build\zephyr\.config -Pattern 'CONFIG_SOC_HPM6E70=y|CONFIG_XIP=y|CONFIG_UART_CONSOLE=y'

警告与失败怎样区分​

出现 warning 后仍生成 zephyr.elf,表示构建完成但存在待处理问题;出现 FATAL ERROR、CMake Error 或 Ninja 停止,才是本次构建失败。不要只根据终端颜色判断结果。

JTAG 与烧录​

JTAG 成功输出

  • CH347 not found:电脑没有发现调试器,检查 USB、WinUSB 接口和占用进程;
  • TAP ID 全为 0 或 1:检查 TCK、TMS、TDI、TDO、GND 和目标板供电;
  • 请求 500 kHz 实际显示 938 kHz:CH347F 选择了可用的相邻频率,不代表连接失败;
  • wrote ... bytes 与 verified ... bytes 先后出现,才表示写入完成且已读回校验。

接线、WinUSB 接口选择、runners.yaml 和 west debugserver 的逐层检查见连接并验证 JTAG。

串口偶尔出现残缺字符​

少量、偶发的乱码通常来自复位瞬间、连接器接触或串口接收从一帧中间开始。若随后持续输出正常,可先记录现象;若频繁发生,再检查 115200 8N1、地线、TX/RX 连接和供电稳定性。

UART0 接线、COM 端口确认和 VS Code Serial Monitor 设置见连接串口并确认 COM 端口。

SDRAM 初始化状态一直是 -1​

现象:SDRAM 测试应用在第一步打印 FAIL [pre-kernel init] status=-1。

-1 是 board_sdram.c 中 sdram_init_status 的初始值,只有一种情况会出现:_init_ext_ram() 从来没有被调用。HPM 裸机 SDK 由各 SoC 的 start.S 执行 call _init_ext_ram,而 Zephyr 的启动路径不经过它,zsg fork 也没有实现这个调用。检查 board_sdram.c 末尾是否有把初始化挂进内核启动序列的 SYS_INIT(board_sdram_sys_init, PRE_KERNEL_2, 0);补上并重新构建烧录后,状态应变为 0,测试继续执行数据线、字节通道和地址线各阶段。

接入方法见把板载 SDRAM 接入 Board。

编辑器误报与命令行构建

VS Code 的红色波浪线来自编辑器索引,west build 才使用最终设备树和生成头文件。命令行编译成功但编辑器误报时,应更新 compile_commands.json 或 C/C++ 配置,不要为消除误报修改正确代码。