通过开源鸿蒙终端工具Termony完成Coremark 命令行工具构建过程深度解读

本文记录使用命令 OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a sh ./create-hnp.sh 构建 Coremark 的完整过程,包括环境、构建链路、关键日志、常见问题与解决方案、产物验证与重建方法,便于复现与运维。

📖 Coremark 简介

Coremark 是一个简单而标准的 CPU 性能基准测试程序,由 EEMBC(Embedded Microprocessor Benchmark Consortium)开发。它通过执行一系列常见的算法操作来评估处理器的性能,包括链表操作、矩阵操作、状态机操作等,是嵌入式系统和移动设备性能评估的重要工具。

🎯 Coremark 的作用与重要性

Coremark 是 CPU 性能基准测试的标准工具,提供了:

  • 标准化测试:提供统一的性能评估标准,便于不同设备之间的性能对比
  • 简单易用:测试程序简单,易于理解和部署
  • 多线程支持:支持单线程和多线程测试,评估并行处理能力
  • 可移植性:跨平台支持,可在不同架构上运行
  • 性能指标:提供 Coremark 分数,用于量化 CPU 性能

🔧 Coremark 核心特性

1. 测试算法

Coremark 包含四种核心算法:

  • 链表操作:测试内存访问和指针操作性能
  • 矩阵操作:测试数学计算和内存访问模式
  • 状态机操作:测试分支预测和条件判断性能
  • CRC 计算:测试位操作和循环性能
2. 测试模式
  • 单线程模式:评估单核性能
  • 多线程模式:评估多核并行处理能力(支持 PThread)
3. 输出指标
  • Coremark 分数:主要性能指标,分数越高性能越好
  • 迭代次数:执行的测试迭代次数
  • 编译器信息:使用的编译器和编译选项
  • 平台信息:运行平台的相关信息

🚀 构建入口与环境

  • 📝 执行命令OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a sh ./create-hnp.sh
  • 🔧 入口脚本create-hnp.sh
    • 检查必需的环境变量 OHOS_ARCHOHOS_ABI
    • 导出 LC_CTYPETOOL_HOMEOHOS_SDK_HOME
    • 执行 make -C build-hnp
  • 📦 顶层构建build-hnp/Makefile
    • PKGS 变量定义需要构建的包列表(包含 coremark
    • 通过 check-pkgs 机制自动检测 PKGS 变化并触发重新构建
    • 自动合并 external-hnp 目录下的外部 HNP 包
    • base.hnp 依赖所有包的 .stamp 和外部 HNP 包
    • 总目标 all: copy,打包 base.hnp 并拷贝到 entry/hnp/$(OHOS_ABI)

⚙️ Coremark 包的构建配置

  • 📁 包目录build-hnp/coremark/Makefile
    • 继承通用规则:include ../utils/Makefrag
    • 源地址:SOURCE_URL = https://github.com/eembc/coremark/archive/refs/heads/main.zip
    • 版本:最新 main 分支
  • 🔧 构建策略
    • 绕过上游 Makefile 的 make compile 目标(避免 CC 变量扩展问题)
    • 直接调用交叉编译器编译源码
  • ⚙️ 编译参数
    • 单线程版本
      • -O3 - 最高优化级别
      • -Imacos -Iposix -I. - 包含路径
      • -DFLAGS_STR='"-O3 -static "' - 编译选项字符串(用于运行时显示)
      • -DITERATIONS=0 - 迭代次数(0 表示自动计算)
      • -static - 静态链接
    • 多线程版本(20 线程)
      • -DMULTITHREAD=20 - 线程数
      • -DUSE_PTHREAD - 使用 PThread
      • -pthread - PThread 链接选项
      • 其他参数与单线程版本相同
  • 🔨 构建流程
    1. 下载源码包(GitHub main.zip)
    2. 解包并进入源码目录
    3. 编译单线程版本 coremark.exe
    4. 复制到 sysroot/bin/coremark.exe
    5. 编译多线程版本 coremark.exe
    6. 复制到 sysroot/bin/coremark_p20c.exe
  • 🔧 通用工具链与路径build-hnp/utils/Makefrag
    • CC/CXX/LD/AR/RANLIB/... 均指向 OHOS SDK 的 LLVM 工具链
    • 下载支持多镜像回退:wgetcurl,主镜像失败时自动尝试备用镜像

📋 关键日志与过程节点

  • 📥 下载与解包
    • 从 GitHub 下载 main.zip(最新源码)
    • 完成解包并进入 temp/coremark-main 目录
    • 下载规则支持多镜像回退:wgetcurl,自动尝试备用镜像
  • ⚙️ 编译阶段
    • 使用交叉编译器直接编译源码
    • 单线程版本:编译生成 coremark.exe (825K)
    • 多线程版本:编译生成 coremark_p20c.exe (827K)
    • 两个版本都使用静态链接,便于部署
  • 📦 安装与打包
    • 复制到 sysroot/bin/
    • 合并外部 HNP 包(如果存在)
    • 最终执行 zip -r base.hnp sysroot 并拷贝到 entry/hnp/arm64-v8a/

✅ 产物验证

📦 检查打包文件

bash 复制代码
ls build-hnp/base.hnp  # 应存在
ls entry/hnp/arm64-v8a/*.hnp  # 应包含 base.hnp 与 base-public.hnp

🔍 检查二进制文件

bash 复制代码
# 检查 coremark 程序
ls -lh build-hnp/sysroot/bin/coremark*
file build-hnp/sysroot/bin/coremark.exe
file build-hnp/sysroot/bin/coremark_p20c.exe

# 验证文件是否存在
test -f build-hnp/sysroot/bin/coremark.exe && echo "coremark.exe: OK" || echo "coremark.exe: MISSING"
test -f build-hnp/sysroot/bin/coremark_p20c.exe && echo "coremark_p20c.exe: OK" || echo "coremark_p20c.exe: MISSING"

✅ 构建验证结果

  • ✅ 单线程版本已成功安装:coremark.exe (825K)
  • ✅ 多线程版本已成功安装:coremark_p20c.exe (827K)
  • ✅ 文件类型:ELF 64-bit LSB executable, ARM aarch64, statically linked
  • ✅ 静态链接,无需外部依赖

💻 终端中执行的示例命令

🔧 Coremark 基本使用

1. 运行单线程测试
bash 复制代码
# 运行单线程 Coremark 测试
./coremark.exe

输出示例

复制代码
2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 10000
Total time (secs): 10.000000
Iterations/Sec   : 1000.000000
Iterations       : 10000
Compiler version : Clang 15.0.0
Compiler flags   : -O3 -static 
Memory location  : Please put data memory location here
                    (e.g. code in flash, data on heap etc)
seedcrc          : 0xe9f5
[0]crclist       : 0xe714
[0]crcmatrix     : 0x1fd7
[0]crcstate      : 0x8e3a
[0]crcfinal      : 0x33ff
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 1000.000000 / Clang 15.0.0 -O3 -static  / Heap
2. 运行多线程测试
bash 复制代码
# 运行 20 线程 Coremark 测试
./coremark_p20c.exe

输出示例

复制代码
2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 10000
Total time (secs): 10.000000
Iterations/Sec   : 20000.000000
Iterations       : 200000
Compiler version : Clang 15.0.0
Compiler flags   : -O3 -DMULTITHREAD=20 -DUSE_PTHREAD -pthread -static 
Memory location  : Please put data memory location here
                    (e.g. code in flash, data on heap etc)
seedcrc          : 0xe9f5
[0]crclist       : 0xe714
[0]crcmatrix     : 0x1fd7
[0]crcstate      : 0x8e3a
[0]crcfinal      : 0x33ff
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 20000.000000 / Clang 15.0.0 -O3 -DMULTITHREAD=20 -DUSE_PTHREAD -pthread -static  / Heap / 20:PThreads
3. 性能对比测试
bash 复制代码
# 运行单线程测试并保存结果
./coremark.exe > single_thread_result.txt

# 运行多线程测试并保存结果
./coremark_p20c.exe > multi_thread_result.txt

# 比较结果
diff single_thread_result.txt multi_thread_result.txt
4. 批量测试脚本
bash 复制代码
#!/bin/bash
# Coremark 批量测试脚本

echo "=== Coremark 性能测试 ==="
echo ""

echo "--- 单线程测试 ---"
./coremark.exe | grep "CoreMark 1.0"

echo ""
echo "--- 多线程测试(20 线程)---"
./coremark_p20c.exe | grep "CoreMark 1.0"

echo ""
echo "=== 测试完成 ==="
5. 提取 Coremark 分数
bash 复制代码
# 提取单线程分数
./coremark.exe | grep "CoreMark 1.0" | awk '{print $3}'

# 提取多线程分数
./coremark_p20c.exe | grep "CoreMark 1.0" | awk '{print $3}'

# 保存分数到文件
echo "Single Thread: $(./coremark.exe | grep 'CoreMark 1.0' | awk '{print $3}')" > scores.txt
echo "Multi Thread (20): $(./coremark_p20c.exe | grep 'CoreMark 1.0' | awk '{print $3}')" >> scores.txt
cat scores.txt
6. 验证测试结果
bash 复制代码
# 检查 CRC 校验值
./coremark.exe | grep -E "(crclist|crcmatrix|crcstate|crcfinal)"

# 验证测试是否通过
./coremark.exe | grep "Correct operation validated"
7. 性能监控
bash 复制代码
# 使用 time 命令测量执行时间
time ./coremark.exe

# 使用 top 监控资源使用(在另一个终端)
# top -p $(pgrep coremark)

# 使用 perf 分析性能(如果可用)
# perf stat ./coremark.exe

🧪 功能验证脚本

bash 复制代码
#!/bin/bash
# Coremark 工具验证脚本

COREMARK_BIN="build-hnp/sysroot/bin"

echo "=== Coremark 工具验证 ==="

# 检查单线程版本
if [ -f "$COREMARK_BIN/coremark.exe" ]; then
    echo "✓ coremark.exe: 存在"
    file "$COREMARK_BIN/coremark.exe"
    echo "文件大小: $(ls -lh "$COREMARK_BIN/coremark.exe" | awk '{print $5}')"
else
    echo "✗ coremark.exe: 缺失"
fi

echo ""

# 检查多线程版本
if [ -f "$COREMARK_BIN/coremark_p20c.exe" ]; then
    echo "✓ coremark_p20c.exe: 存在"
    file "$COREMARK_BIN/coremark_p20c.exe"
    echo "文件大小: $(ls -lh "$COREMARK_BIN/coremark_p20c.exe" | awk '{print $5}')"
else
    echo "✗ coremark_p20c.exe: 缺失"
fi

echo ""
echo "=== 测试运行(如果可执行)==="
echo "注意:这些是交叉编译的二进制文件,需要在目标设备上运行"

🐛 常见问题与解决方案

❌ 问题 1:上游 make compile 失败

  • 🔍 症状 :使用上游 Makefile 的 make compile 目标时失败,出现 "File name too long" 错误
  • 🔎 原因 :上游 Makefile 的 CC 变量在本环境下被异常扩展为整段 PATH,导致命令行以 PATH 字符串开头
  • ✅ 解决方法
    • 绕过上游 Makefile,直接调用交叉编译器编译源码
    • build-hnp/coremark/Makefile 中直接使用 $(CC) 编译
    • 位置:build-hnp/coremark/Makefile:8-15

❌ 问题 2:静态链接失败

  • 🔍 症状:编译时出现静态链接错误,找不到静态库
  • 🔎 原因:交叉工具链可能缺少静态库或静态库路径不正确
  • ✅ 解决方法
    • 确认交叉工具链具备静态库(libc.alibpthread.a 等)
    • 如果静态链接受限,可以移除 -static 选项,改为共享链接
    • 在设备端提供所需的共享库(libc.solibpthread.so 等)
    • 位置:build-hnp/coremark/Makefile:9,13

❌ 问题 3:SDK 环境变量未设置

  • 🔍 症状 :直接调用重建目标时出现 CC 未设置的错误

  • 🔎 原因CC 变量依赖于 OHOS_SDK_HOME 环境变量

  • ✅ 解决方法

    • 使用 create-hnp.sh 脚本执行构建(自动设置环境变量)

    • 或手动设置环境变量:

      bash 复制代码
      OHOS_SDK_HOME=/path/to/sdk OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a make -C build-hnp rebuild-coremark
    • 位置:create-hnp.sh

❌ 问题 4:FLAGS_STR 字符串转义问题

  • 🔍 症状:运行时显示的编译选项不正确
  • 🔎 原因FLAGS_STR 宏定义的字符串转义不正确
  • ✅ 解决方法
    • 确保 FLAGS_STR 使用正确的引号和转义:-DFLAGS_STR='"-O3 -static "'
    • 注意单引号和双引号的嵌套使用
    • 位置:build-hnp/coremark/Makefile:9,13

❌ 问题 5:多线程版本编译失败

  • 🔍 症状:多线程版本编译时出现 PThread 相关错误
  • 🔎 原因:缺少 PThread 库或链接选项不正确
  • ✅ 解决方法
    • 确保添加 -pthread 链接选项
    • 确保定义了 -DUSE_PTHREAD-DMULTITHREAD=20
    • 检查交叉工具链是否支持 PThread
    • 位置:build-hnp/coremark/Makefile:13

🔄 重建与扩展

  • 🔧 重建单包

    bash 复制代码
    make -C build-hnp rebuild-coremark  # 触发子包重新编译并刷新 .stamp
  • 🧹 清理

    bash 复制代码
    make -C build-hnp clean  # 清理 sysroot、所有 .stamp 和 PKGS_MARKER
  • 📦 扩展:Coremark 是 CPU 性能基准测试的标准工具,可以根据需要调整线程数或编译选项

  • 🔄 自动重建机制

    • 修改 PKGS 后,check-pkgs 会自动检测变化并触发重新构建
    • 新增外部 HNP 包到 external-hnp 目录后,会自动合并到 base.hnp

💡 实践建议

  • 🔧 性能测试:使用 Coremark 进行 CPU 性能基准测试,对比不同设备的性能
  • 🛡️ 静态链接:使用静态链接可以避免依赖问题,便于在设备端部署
  • 📦 多线程测试:使用多线程版本可以评估多核处理器的并行处理能力
  • 🔗 结果记录:保存测试结果用于性能对比和分析

📝 结论与建议

  • ✅ 本次已在 aarch64 环境下完成 Coremark 的交叉编译与打包,单线程和多线程版本已安装到 sysroot/bin 并纳入 HNP 包。
  • 💡 为保证构建稳定
    • 固定可靠的上游镜像,避免下载阶段随机失败(已实现自动回退机制)
    • 绕过上游 Makefile 的问题,直接调用交叉编译器,确保稳定构建
    • 使用静态链接提升可移植性,适合在设备端快速开展性能基准测试
    • 通过绕过上游构建目标并直接使用交叉编译器,稳定产出单线程与多线程版本
    • 利用 check-pkgs 机制自动检测包列表变化,无需手动清理

📚 以上为 Coremark 构建的深度解读与实践记录。

相关推荐
坚果派·白晓明42 分钟前
通过开源鸿蒙终端工具Termony完成Ncurses 命令行工具构建过程深度解读
openharmony·开源鸿蒙·开源软件termony
A懿轩A11 小时前
【2025版 OpenHarmony】GitCode 口袋工具 v1.0.1 更新发布:Flutter + HarmonyOS 封装导航栏进行跳转
flutter·harmonyos·openharmony·gitcode·开源鸿蒙
A懿轩A18 小时前
【2025最新】Flutter 编译开发 鸿蒙HarmonyOS 6 项目教程(Windows)
windows·flutter·华为·openharmony·开源鸿蒙
坚果派·白晓明1 天前
通过开源鸿蒙终端工具Termony完成Bash命令行工具构建过程深度解读
openharmony·命令行工具·开源鸿蒙
A懿轩A3 天前
【OpenHarmony】跨平台开发鸿蒙Harmony项目框架选择建议
华为·鸿蒙·openharmony·开源鸿蒙
坚果派·白晓明3 天前
开源鸿蒙终端工具Termony HAP 包部署和安装指导手册Mac版
openharmony·开源鸿蒙·开源软件termony
白茶三许3 天前
关于Flutter版本过低导致鸿蒙虚拟机启动失败的问题解决
flutter·开源·harmonyos·openharmony
坚果派·白晓明3 天前
开源鸿蒙终端工具Termony构建HAP包指导手册Mac版
openharmony·开源鸿蒙
Industio_触觉智能11 天前
RK3588应用分享之国产化系统-开源鸿蒙OpenHarmony
嵌入式硬件·rk3588·openharmony·开源鸿蒙·触觉智能·arm主板·xts认证