SoC编译HEX脚本(基于RISC-V的SoC)

脚本使用

./compile hello

脚本:设置RISC-V工具链riscv_set_env

##############   RISC-V  ##############
setenv RISCV_PATH /mnt/Software/FreedomStudio/SiFive/riscv64-unknown-elf-gcc-8.1.0-2018.12.0-x86_64-linux-ubuntu14/ set path = ($RISCV_PATH/bin $path)
set RISCV_ARCH = rv32imac
set RISCV_ABI = ilp32 set RISCV_GCC = ${RISCV_PATH}/bin/riscv64-unknown-elf-gcc
set RISCV_GXX = ${RISCV_PATH}/bin/riscv64-unknown-elf-g++
set RISCV_OBJDUMP = ${RISCV_PATH}/bin/riscv64-unknown-elf-objdump
set RISCV_GDB = ${RISCV_PATH}/bin/riscv64-unknown-elf-gdb
set RISCV_AR = ${RISCV_PATH}/bin/riscv64-unknown-elf-ar
set RISCV_ELF2HEX = /usr/local/bin/riscv64-unknown-elf-elf2hex

脚本:编译过程compile

#!/bin/tcsh -f
# usage : ./compile hello
# please set toolchain dir
# Directory structure
# .
# ├── compile
# ├── riscv_set_env
# ├── driver
# │   ├── bits.h
# │   ├── const.h
# │   ├── coreplexip-arty.h
# │   ├── encoding.h
# │   ├── env
# │   │   └── start.S
# │   ├── init.c
# │   ├── one_tim.lds
# │   ├── platform.h
# │   ├── sim_show.c
# │   ├── sim_show.h
# │   └── tim_split.lds
# └── testcase
# └── hello
# ├── obj
# └── src
# └── demo_print.c source ./riscv_set_env set INFO = "###(info) ${0}"
set ERROR = "###(error) ${0}" ######################
# Configuration
######################
# Default target
if ($#argv == 0) then
set PROGRAM = hello
else
set PROGRAM = $argv[1]
endif
set BOOT_MODE = "SYSTEM_PORT_BOOT" set DRV_BASE = "driver"
set PROGRAM_DIR = testcase/${PROGRAM}
set ENV_DIR = ${DRV_BASE}/env
######################
# file
######################
set SRC_DIR = ${PROGRAM_DIR}/src
set OBJ_DIR = ${PROGRAM_DIR}/obj # Exit if no .S, .s. or .c files found
if (! -d $SRC_DIR) then
echo "${ERROR}: $SRC_DIR: No such file or directory"
exit 0
endif set ASM_FILES = `find ${SRC_DIR} -name "*.S" -print`
set C_FILES = `find ${SRC_DIR} -name "*.c" -print`
set HEX_FILES = `find ${SRC_DIR} -name "*.hex" -print` set ASM_FILES = "${ASM_FILES} ${ENV_DIR}/start.S"
set C_FILES = "${C_FILES} ${DRV_BASE}/init.c ${DRV_BASE}/sim_show.c" if(("${ASM_FILES}" == "") && ("${C_FILES}" == "" && ("${HEX_FILES}" == ""))) then
echo "ERROR: No test files or dirctory found"
exit 0
else
echo "${INFO}: Test files found are"
echo ${ASM_FILES}
echo ${C_FILES}
echo ${HEX_FILES}
endif # Create the work dir if it doesn't already exist
if (! -d $OBJ_DIR) then
echo "${INFO}: Creating $OBJ_DIR"
mkdir -p $OBJ_DIR
else
echo "${INFO}: Delecting files in $OBJ_DIR"
rm -rf ${OBJ_DIR}/*
endif if ($BOOT_MODE == "SYSTEM_PORT_BOOT") then
echo ""
echo "*************************"
echo "****SYSTEM PORT BOOT*****"
set LINK_TARGET = "one_tim"
echo ""
else
echo ""
echo "*************************"
set LINK_TARGET = "flash"
echo ""
endif # comile parameter
set LINK_SCRPT = ${DRV_BASE}/${LINK_TARGET}.lds set INCLUDES = "-I${DRV_BASE} -I${ENV_DIR}"
echo ${INCLUDES}
set LINK_FILES = "${ASM_FILES} ${C_FILES}" set CFLASS = "-o0 -g -march=${RISCV_ARCH} -mabi=${RISCV_ABI} -mcmodel=medany ${INCLUDES}"
set LDFLASS = "-march=${RISCV_ARCH} -mabi=${RISCV_ABI} -T ${LINK_SCRPT} -nostartfiles -L{ENV_DIR} --specs=nano.specs ${INCLUDES}" ######################
# Compilation
######################
# if .hex found, only copy he first .hex to simulate
if ("${HEX_FILES}" != "") then
echo "${INFO}: already exist hex file of ${HEX_FILES}"
foreach i ($HEX_FILES)
echo "${INFO}: run simulation with $i"
cp $i ./riscv_rom.hex
exit 0
end
endif
# compile C code
if ("${C_FILES}" != "") then
foreach i (${C_FILES})
set base_name = "$i:t"
set base_name = "$base_name:r"
set obj_name = ${OBJ_DIR}/"${base_name}".o
echo "${INFO} Compile $i"
${RISCV_GCC} ${CFLASS} -c -Wa,-adlhn $i -o $obj_name > ${OBJ_DIR}/"${base_name}.s"
if ( $status ) exit 1
end
endif
# compile asm code
if ("${ASM_FILES}" != "") then
foreach i (${ASM_FILES})
set base_name = "$i:t"
set base_name = "$base_name:r"
set obj_name = ${OBJ_DIR}/"${base_name}".o
echo "${INFO} Compile $i"
${RISCV_GCC} ${CFLASS} -c -o $obj_name $i
if ( $status ) exit 1
end
endif # link library and test object file
set OBJ_FILES = `find ${OBJ_DIR} -name "*.o" -print`
set PROGRAM_ELF = ${OBJ_DIR}/${PROGRAM}.elf
set PROGRAM_HEX = ${OBJ_DIR}/${PROGRAM}.hex echo "${INFO}: Link library and object file, generate file of ${PROGRAM_ELF}"
${RISCV_GCC} ${LDFLASS} ${OBJ_FILES} --output ${PROGRAM_ELF} echo "${INFO}: Convert elf file to hex of ${PROGRAM_HEX}"
${RISCV_ELF2HEX} --bit-width 32 --input ${PROGRAM_ELF} --output ${PROGRAM_HEX}
cp ${PROGRAM_HEX} riscv_rom.hex
${RISCV_OBJDUMP} -D ${PROGRAM_ELF} > riscv_rom.asm

附:RISC-V 工具链


[1].Prebuilt RISC‑V GCC Toolchain

[2].elf2hex

最新文章

  1. Linux系统目录结构
  2. CSS样式覆盖顺序
  3. ex26 纠正练习
  4. Jquery+Ajax+Json的使用(微信答题实例)
  5. Activity与Service通信(不同进程之间)
  6. 利用Testng注释实现多线程并发测试
  7. poj 3169 Layout
  8. C 编程调试集
  9. Light OJ 1136
  10. losbyday Linux查找命令
  11. myeclipse10破解失败,正解
  12. centos下卸载OpenJDK 并安装sun的jdk
  13. tornado 初解
  14. MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义
  15. python框架之Django(9)-CSRF
  16. 《从Lucene到Elasticsearch:全文检索实战》学习笔记一
  17. python要开始记录了20181125
  18. returnFunc.js
  19. Copycat - 状态
  20. day67 crm(4) stark组件的增删改 以及 model_from使用和from组件回顾

热门文章

  1. call() 和 apply() 的作用和区别
  2. 43.可变参数实现printf
  3. ssh框架的总结
  4. PHP截取字符串长度
  5. double 失真例子
  6. POJ——T 3461 Oulipo
  7. Pig源代码分析: 简析运行计划的生成
  8. POJ 1101 The Game(BFS+判方向)
  9. BZOJ2631: tree(LCT)
  10. HDU 1848(sg博弈) Fibonacci again and again