在Ubuntu下使用SCons进行交叉编译玄铁C908(或其他任何目标平台)的C程序需要几个步骤。这里假设你已经有了针对C908的交叉编译工具链(如交叉编译器、链接器、库等)。
以下是一般步骤的概述:
安装SCons:
如果尚未安装SCons,可以使用apt
包管理器进行安装:
sudo apt update
sudo apt install scons
准备交叉编译工具链:
你需要确保已经安装了针对C908的交叉编译工具链。这通常包括交叉编译器(如arm-none-eabi-gcc
或特定于C908的类似工具)、交叉链接器和其他必要的工具。
准备Coremark程序
1. 下载代码
git clone https://github.com/eembc/coremark.git
cd coremark/
2. 移植代码
编写SConstruct文件:
SConstruct文件是SCons的构建脚本。你需要为你的项目编写一个SConstruct文件,指定源文件、构建目标、编译器和其他构建选项。
小核SConstruct文件如下所示:
# 引入SCons的环境
import os
# 交叉编译工具链的路径
toolchain_path = 'k230_sdk/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin'
# 设置环境变量
env = Environment(ENV={'PATH' : os.environ['PATH'] + ':' + toolchain_path})
# 设置交叉编译器
env['CC'] = 'riscv64-unknown-linux-gnu-gcc'
env['LINK'] = '$CC'
# 添加编译和链接选项(根据你的需要调整)
env['CFLAGS'] = '-mcmodel=medany -march=rv64imafdc -mabi=lp64'
env['LINKFLAGS'] = env['CFLAGS']
# 假设你的CoreMark源文件在'src'目录下
src_dir = 'src'
src_files = Glob(os.path.join(src_dir, '*.c'))
# 构建程序(假设你的目标文件名为'coremark')
env.Program(target='coremark', source=src_files)
大核SConstruct文件如下所示:
# 引入SCons的环境
import os
# 交叉编译工具链的路径
toolchain_path = 'k230_sdk/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin'
# 初始化环境变量
env = Environment(tools=['default', 'gcc'], ENV={'PATH' : os.environ['PATH'] + ':' + toolchain_path})
# 设置交叉编译器
env['CC'] = 'riscv64-unknown-linux-musl-gcc'
env['LINK'] = '$CC'
env['LINKFLAGS'] = '-mcmodel=medany -march=rv64imafdcv -mabi=lp64d -T k230_sdk/src/big/mpp/userapps/sample/linker_scripts/riscv64/link.lds -n --static'
env['CPPPATH'] = ['#'] # 如果有头文件路径需要添加
env['LIBPATH'] = [
'k230_sdk/src/big/rt-smart/userapps/sdk/rt-thread/lib',
'k230_sdk/src/big/rt-smart/userapps/sdk/lib/risc-v/rv64',
'k230_sdk/src/big/rt-smart/userapps/sdk/rt-thread/lib/risc-v/rv64'
]
env['LIBS'] = ['rtthread']
env['RPATH'] = [] # 如果有需要添加的运行时搜索路径
# 添加源文件
src_files = Glob('src/*.c') # 假设CoreMark源文件在'src'目录下
# 设置链接选项(针对-Wl, --whole-archive 和 -Wl, --no-whole-archive)
env.Append(LINKFLAGS=['-Wl,--whole-archive', '-lrtthread', '-Wl,--no-whole-archive'])
env.Append(LINKFLAGS=['-Wl,--start-group', '-lrtthread', '-Wl,--end-group'])
# 构建程序
env.Program(target='coremark.elf', source=src_files)
# 如果需要额外的构建步骤或目标,可以在这里添加
运行Scons编译:
进入 k230_sdk/src/big/rt-smart/userapps 目录,编译程序:
canaan@develop:~/k230_sdk/src/big/rt-smart/userapps$ scons --directory=coremark
scons: Entering directory `/home/canaan/k230_sdk/src/big/rt-smart/userapps/coremark'
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build/coremark
CC build/coremark/coremark.o
LINK coremark.elf
/home/canaan/k230_sdk/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin/../lib/gcc/riscv64-unknown-linux-musl/12.0.1/../../../../riscv64-unknown-linux-musl/bin/ld: warning: coremark.elf has a LOAD segment with RWX permissions
scons: done building targets.
运行 coremark:
msh /sdcard/app/coremark>./coremark.elf
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 116797479
Total time (secs): 116.797479
Iterations/Sec : 856.182863
Iterations : 100000
Compiler version : GCC12.0.1 20220505 (prerelease)
Compiler flags : -o2
Memory location : STACK
seedcrc : 0xe9f5
[0]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[0]crcfinal : 0xd340
Correct operation validated. See README.md for run and reporting rules.
CoreMark 1.0 : 856.182863 / GCC12.0.1 20220505 (prerelease) -o2 / STACK
老徐,2024/5/8