SoC编译HEX脚本(基于RISC-V的SoC)
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)的更多相关文章
- OpenWrt编译到底脚本
在办公室编译OpenWrt,费时很久,原因有两个. 一是办公室网络环境比较糟糕,经常断线不说,很多技术网站间歇性的连不上,不是撞到404就是DNS解析失败等. 二是初次编译OpenWrt时需要从网上下 ...
- freescale-sdk linux移植一搭建编译环境脚本host-prepare.sh分析
接下来使用自己的课外歇息时间,对基于PowerPC架构freescale-sdk,进行linux移植和分析.主要參考官方文档freescale linux sdk START_HERE.html,首先 ...
- 基于ARM Cortex-M的SoC存储体系结构和实战
基于ARM Cortex-M的SoC存储体系结构和实战 System on Chip Architecture Tutorial Memory Architecture for ARM Cortex- ...
- 一行导出所有任意微软SQL server数据脚本-基于Python的微软官方mssql-scripter工具使用全讲解
文章标题: 一行导出所有任意微软SQL serer数据脚本-基于Python的微软官方mssql-scripter工具使用全讲解 关键字 : mssql-scripter,SQL Server 文章分 ...
- ejabberd编译更新脚本
ejabberd编译更新脚本 (金庆的专栏 2016.8) 用rebar编译ejabberd源码,然后复制编译所得beam文件到ejabberd安装目录, 调用ejabberdctl热更新. call ...
- 基于Xilinx Zynq Z7045 SoC的CNN的视觉识别应用
基于Xilinx Zynq Z7045 SoC的CNN的视觉识别应用 由 judyzhong 于 星期三, 08/16/2017 - 14:56 发表 作者:stark 近些年来随着科学技术的不断进步 ...
- 【java web】java运行预编译Groovy脚本
在JVM中执行Groovy类有两种方式: 使用Groovy编译全部的*.groovy为java的*.class文件,把这些*.class文件放在java类路径中,通过java类载入器来载入这些类. 通 ...
- 动态编译c#脚本(把c#当作脚本执行)
csscript动态编译C#脚本 This document contains information about the CLR based scripting system CS-Script ( ...
- php-fpm编译安装脚本
PHP是开源.轻量级.高效的开发语言,特别适合web项目开发,在中小型互联网公司中常用于开发web后端.PHP常与Nginx及MySQL数据库结合,搭建LNMP环境.以下为centos7系统下ph ...
随机推荐
- 荣获CCF(中国计算机学会)高级会员代表资格
详细地址:http://www.ccf.org.cn/sites/ccf/xjhydb.jsp?contentId=2624287722908 650) this.width=650;" b ...
- 【基础篇】Android下拉列表框(Spinner)的基本使用
个人学习经验:第一步:新建工程,在main.xml中,main.xml内容如下: <?xml version="1.0" encoding="utf-8" ...
- javaweb二
除了servlet规范,还有filter,listener.filter和servlet相似,但是在servlet之前执行,主要区别是有一个FilterChain接口可以执行拦截方法. import ...
- 英语 用on还是/at/还是in
in prep. 1. [表示地点.场所.位置等]在…里面:在…内部:在…上:例句: in the room 在房间里 2. [表示时间]在…期间:在(一段时间)以内:过…之久:例句: in su ...
- Javascript和jquery事件--事件冒泡和事件捕获
jQuery 是一个 JavaScript 库,jQuery 极大地简化了 JavaScript 编程,在有关jq的描述中,jq是兼容现有的主流浏览器,比如谷歌.火狐,safari等(当然是指较新的版 ...
- BZOJ3336: Uva10572 Black and White(插头Dp)
解题思路: 分类讨论即可. 代码(懒得删Debug了): #include<map> #include<cstdio> #include<vector> #incl ...
- python 时间库的用法 时区的转化
1. 月份的加减 https://blog.csdn.net/qq_18863573/article/details/79444094 第三方模块:python-dateutil import dat ...
- RingtoneManager-获得系统当前的铃声
我们直接看代码 bt1 = (Button) findViewById(R.id.bt1); bt2 = (Button) findViewById(R.id.bt2); bt3 = (Button) ...
- 1.19 Python基础知识 - 软件目录开发规范及不同模块之间的调用
一个软件项目的开发,除了需要很厉害的开发能力,同时在软件开发项目时,也需要对项目结构有良好的组织能力,将功能进行拆分,不同的功能放在不同的目录或文件中,方便日后的维护,升级等操作.比如核心代码的目录, ...
- 逐步配置企业版Symantec Norton防病毒服务器
逐步配置企业版Symantec Norton防病毒服务器 配置企业版Symantec Norton NT操作系统,已经安装IIS 安装Symantec Norton 10 安装系统中心 650) th ...
