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

SoC编译HEX脚本(基于RISC-V的SoC)的更多相关文章

  1. OpenWrt编译到底脚本

    在办公室编译OpenWrt,费时很久,原因有两个. 一是办公室网络环境比较糟糕,经常断线不说,很多技术网站间歇性的连不上,不是撞到404就是DNS解析失败等. 二是初次编译OpenWrt时需要从网上下 ...

  2. freescale-sdk linux移植一搭建编译环境脚本host-prepare.sh分析

    接下来使用自己的课外歇息时间,对基于PowerPC架构freescale-sdk,进行linux移植和分析.主要參考官方文档freescale linux sdk START_HERE.html,首先 ...

  3. 基于ARM Cortex-M的SoC存储体系结构和实战

    基于ARM Cortex-M的SoC存储体系结构和实战 System on Chip Architecture Tutorial Memory Architecture for ARM Cortex- ...

  4. 一行导出所有任意微软SQL server数据脚本-基于Python的微软官方mssql-scripter工具使用全讲解

    文章标题: 一行导出所有任意微软SQL serer数据脚本-基于Python的微软官方mssql-scripter工具使用全讲解 关键字 : mssql-scripter,SQL Server 文章分 ...

  5. ejabberd编译更新脚本

    ejabberd编译更新脚本 (金庆的专栏 2016.8) 用rebar编译ejabberd源码,然后复制编译所得beam文件到ejabberd安装目录, 调用ejabberdctl热更新. call ...

  6. 基于Xilinx Zynq Z7045 SoC的CNN的视觉识别应用

    基于Xilinx Zynq Z7045 SoC的CNN的视觉识别应用 由 judyzhong 于 星期三, 08/16/2017 - 14:56 发表 作者:stark 近些年来随着科学技术的不断进步 ...

  7. 【java web】java运行预编译Groovy脚本

    在JVM中执行Groovy类有两种方式: 使用Groovy编译全部的*.groovy为java的*.class文件,把这些*.class文件放在java类路径中,通过java类载入器来载入这些类. 通 ...

  8. 动态编译c#脚本(把c#当作脚本执行)

    csscript动态编译C#脚本 This document contains information about the CLR based scripting system CS-Script ( ...

  9. php-fpm编译安装脚本

      PHP是开源.轻量级.高效的开发语言,特别适合web项目开发,在中小型互联网公司中常用于开发web后端.PHP常与Nginx及MySQL数据库结合,搭建LNMP环境.以下为centos7系统下ph ...

随机推荐

  1. 3.Maven之(三)Maven插件

    转自:https://yq.aliyun.com/ziliao/312162 Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,像编译是通过maven- ...

  2. call 方法和 apply方法

    1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...

  3. BootStrap_table.js 学习

    @{ Layout = null; ViewBag.Title = "基于BootstrapTable的简单应用";} <!--添加相关样式引用--><link ...

  4. 搭建 Nginx 静态网站

    示例代码:/etc/nginx/nginx.conf user nginx;worker_processes auto;error_log /var/log/nginx/error.log;pid / ...

  5. java(数组及常用简单算法 )

    数组 数组:数组是存储同一种数据类型数据的集合容器. 数组的定义格式: 数据类型[]  变量名  =  new  数据类型[长度]; 数组的好处:对分配到数组对象中每一个数据都分配一个编号(索引值.角 ...

  6. FileChannel的深入理解

    一,官方描写叙述 一个读,写,映射,操作文件的通道. 文件通道有能够被查询和改动的一个当前位置.文件本身包括了一个可悲读写的变长字节序列,而且它的当前的size会被查询.当被写入的字节超过当前文件的大 ...

  7. 取消cp命令别名

    1. 取消cp命令别名unalias cpcp -rf恢复别名alias cp='cp -i'2.关闭当前用户下的cp别名配置sed -i "s/alias cp='cp -i'/#alia ...

  8. local-语言切换监听事件

    今天在更改时钟的问题的时候,需要监听语言切换来刷新时钟的显示.记录下监听方法 //注册监听事件 intentFilter.addAction(Intent.ACTION_LOCALE_CHANGED) ...

  9. Python: scikit-image gamma and log 对比度调整

    这个函数,主要用来做对比度调整,利用 gamma 曲线 或者 log 函数曲线, gamma 函数的表达式: y=xγ, 其中, x 是输入的像素值,取值范围为 [0−1], y 是输出的像素值,通过 ...

  10. 3.第一个Node.js程序:Hello World!

    转自:http://www.runoob.com/nodejs/nodejs-tutorial.html 以下是我们的第一个Node.js程序: console.log("Hello Wor ...