当前位置: 首页 > news >正文

保姆级教程:在Ubuntu 22.04上用SCons为CanMV K230大小核交叉编译CoreMark(附完整SConstruct文件)

保姆级教程:在Ubuntu 22.04上为CanMV K230交叉编译CoreMark全流程解析

当拿到一块搭载RISC-V双核处理器的开发板时,如何快速验证其计算性能?CoreMark作为嵌入式领域的标准基准测试,能直观反映处理器核心的整数运算效能。本文将手把手带你完成从工具链配置到性能分析的全过程,特别针对CanMV K230的大小核异构架构提供完整解决方案。

1. 环境准备与工具链配置

工欲善其事,必先利其器。在开始编译前,我们需要搭建完整的开发环境。Ubuntu 22.04 LTS作为稳定的开发平台,配合SCons构建工具能显著提升编译效率。

1.1 基础环境搭建

首先确保系统已更新至最新状态:

sudo apt update && sudo apt upgrade -y

安装必要的开发工具链:

sudo apt install -y build-essential git wget python3-pip

SCons作为Python-based的构建工具,可通过pip安装最新版本:

pip install scons

1.2 获取专用工具链

CanMV K230采用大小核设计,需要分别配置不同的工具链:

核心类型工具链名称C库类型适用场景
大核riscv64-linux-musleabiMusl实时任务处理
小核Xuantie-900-gcc-linux-glibcglibc通用Linux应用

获取官方SDK包:

git clone https://github.com/kendryte/k230_sdk.git cd k230_sdk source tools/get_download_url.sh && make prepare_sourcecode

工具链路径说明:

  • 大核工具链:toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin
  • 小核工具链:toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin

提示:建议将工具链路径加入系统PATH环境变量,方便后续调用

2. CoreMark源码获取与移植

2.1 下载基准测试代码

从EEMBC官方仓库获取最新CoreMark源码:

git clone https://github.com/eembc/coremark.git cd coremark

2.2 移植适配工作

CoreMark需要针对特定平台进行移植,主要修改以下文件:

  1. 复制模板文件:
cp simple/core_portme.* .
  1. 关键修改点:
  • 实现portable_init()函数初始化硬件环境
  • 配置CLOCKS_PER_SEC匹配处理器频率
  • 调整ITERATIONS参数确保测试时长适中

注意:K230大小核时钟频率不同,大核典型值为1.6GHz,小核为800MHz

3. SCons构建系统深度配置

SCons的灵活性让我们可以针对不同核心定制编译选项。下面分别展示大小核的配置策略。

3.1 小核glibc环境配置

创建SConstruct.linux文件:

import os env = Environment(ENV={'PATH': os.environ['PATH']}) # 工具链配置 env['CC'] = 'riscv64-unknown-linux-gnu-gcc' env['LINK'] = '$CC' # 关键编译参数 env.Append(CCFLAGS=[ '-O3', '-march=rv64imafdcv', '-mabi=lp64d', '-mcmodel=medany' ]) # 源文件处理 src_files = Glob('*.c') env.Program(target='coremark_linux.elf', source=src_files)

3.2 大核musl环境配置

创建SConstruct.rt文件:

env = Environment(tools=['default', 'gcc']) # 特殊链接脚本配置 link_script = '/path/to/link.lds' env.Append(LINKFLAGS=[ '-T', link_script, '-static', '-Wl,--whole-archive', '-lrtthread', '-Wl,--no-whole-archive' ]) # 性能优化选项 env.Append(CCFLAGS=[ '-O3', '-fno-common', '-funroll-loops' ]) env.Program(target='coremark_rt.elf', source=Glob('*.c'))

编译参数深度解析:

  • -march=rv64imafdcv:启用向量指令扩展
  • -mabi=lp64d:双精度浮点ABI规范
  • -mcmodel=medany:中等代码模型限制

4. 编译执行与性能分析

4.1 交叉编译实战

分别针对大小核进行编译:

小核编译命令:

scons -f SConstruct.linux

大核编译命令:

scons -f SConstruct.rt

常见问题解决方案:

  1. 头文件缺失错误:
env.Append(CPPPATH=['/path/to/include'])
  1. 链接库找不到:
env.Append(LIBPATH=['/path/to/libs']) env.Append(LIBS=['pthread'])

4.2 测试结果解读

将生成的elf文件通过SD卡或网络传输到开发板执行:

小核执行示例:

./coremark_linux.elf

典型输出解析:

2K performance run parameters for coremark. CoreMark 1.0 : 3433 / GCC8.3.0 -O3 -march=rv64imafdcv

性能指标计算:

  • 小核800MHz得分3433 → 4.29 CoreMark/MHz
  • 大核1.6GHz得分8368 → 5.23 CoreMark/MHz

与同类RISC-V核心对比:

处理器型号频率CoreMark/MHz
玄铁C9061GHz3.40
玄铁C908小核800MHz4.29
玄铁C908大核1.6GHz5.23
StarFive U741.2GHz5.09

5. 高级优化技巧

5.1 编译参数调优

尝试不同优化级别的影响:

优化级别小核得分大核得分代码大小
-O01.822.15最小
-O13.454.12+15%
-O24.014.98+25%
-O34.295.23+40%
-Os3.924.85+10%

5.2 内存布局优化

通过修改链接脚本提升缓存命中率:

MEMORY { ITCM (rwx) : ORIGIN = 0x80000000, LENGTH = 64K DTCM (rw) : ORIGIN = 0x90000000, LENGTH = 128K }

5.3 多线程测试

虽然标准CoreMark是单线程测试,但我们可以扩展为多核测试:

#define USE_PTHREAD #include <pthread.h> void* benchmark_thread(void* arg) { coremark_main(); return NULL; }

在K230上启动双核测试:

taskset -c 0 ./coremark_linux.elf & \ taskset -c 1 ./coremark_linux.elf
http://www.jsqmd.com/news/896551/

相关文章:

  • 2026济宁市本地人必选的公共卫生检测专业机构TOP5推荐!美容院、足疗店、酒店宾馆卫生检测、许可证办理,正规CMA资质检测公司排名推荐 (2026年5月商铺卫生办证最新深度调研方案) - 防水补漏3
  • 3个被忽略的习惯断点,正在悄悄废掉你的ChatGPT生产力:即刻启用「Prompt-Action-Review」三阶追踪表
  • 3步搞定Nginx配置美化:新手也能快速上手的终极指南
  • STM32CubeMX实战指南:定时器中断精准控制与多场景应用
  • Windows软件测试员的效率神器:用Python uiautomation + Inspect.exe实现‘所见即所得’的控件抓取与回放
  • 基于MCP协议自建DORA指标仪表盘:从数据驱动到效能闭环
  • 【他山之石】《被讨厌的勇气》导读
  • 从问答到执行:Claude Code如何实现一键式智能安全审计
  • 使用容器提供postgresql RESTful API服务 - Fan
  • 如何用novelWriter提升小说创作效率:开源结构化写作工具终极指南
  • 毕业答辩高效通关:用百考通AI 30分钟搞定专业答辩PPT
  • 构建容错性强的AI应用时如何借助Taotoken的路由与容灾能力
  • harness与hermes-agent的区别
  • STM32F103定时器入门:从CubeMX配置到代码实战,5分钟搞懂TIM2时钟源设置
  • 别再死记硬背了!用这3个真实项目案例,帮你彻底搞懂PERT图、关键路径和浮动时间
  • 别再手动导数据了!用SeaTunnel 2.3.1把Hive数据自动同步到StarRocks(附完整配置文件)
  • 告别手动测试!用CPAL脚本的IL函数实现CAN总线自动化故障注入
  • 如何用Python轻松实现本地大语言模型推理?llama-cpp-python实战指南
  • 【他山之石】《蛤蟆先生去看心理医生》导读
  • VSCode插件---Code Runner:从零到一,打造你的多语言代码执行中心
  • 国产化浪潮下:基于华为欧拉与麒麟系统构建ARM原生Harbor镜像仓库
  • 2026·牛客网Java后端高频面试题精选(收藏这一篇就够了)
  • ECDICT:为什么说这是开发者必备的免费英汉词典数据库?
  • UML/OCL模型到Z/PVS形式化验证:提升CPS设计可靠性的工程实践
  • COMSOL多物理场耦合建模:一个‘热源加倍’的常见错误与5个耦合设置检查清单
  • Squirrel-RIFE:高性能视频补帧解决方案,让每一帧都流畅如丝
  • 嵌入式实时仿真平台:赋能智能配电网的现场级数字孪生
  • novel-downloader:如何用开源工具永久保存你的数字阅读资产?
  • Taotoken多模型广场如何帮助开发者进行成本与效果选型
  • DW02KA 高精度内置MOSFET锂电池保护电路