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 ...
随机推荐
- Python 面向对象 —— super 的使用(Python 2.x vs Python 3.x)
注意区分当前的 Python 版本是 2.X 还是 3.X,Python 3.X 在 super 的使用上较之 Python 2.X 有较大的变化: 1. Python 2.x class Conta ...
- 【基础篇】Android下拉列表框(Spinner)的基本使用
个人学习经验:第一步:新建工程,在main.xml中,main.xml内容如下: <?xml version="1.0" encoding="utf-8" ...
- idea python notebook连接pyspark
1.启动pyspark 2.查看pyspark服务的token jupyter notebook list 查看正在运行的notebook服务以及他们的token 3.在idea里运行noteboo ...
- IntelliJ IDEA 中如何配置多个jdk版本即(1.7和1.8两个jdk都可用)
IntelliJ IDEA使用教程 (总目录篇) 有时候需要看Java源码,但是 Java 1.7 和 Java 1.8的差别的关系,有时候你想查看不同jdk版本的Java源码. 或者你的项目需要测试 ...
- GCC中-fpic解惑(转载)
参考: 1.<3.18 Options for Code Generation Conventions>2.<Options for Linking>3.<GCC -fP ...
- Irrlicht 3D Engine 笔记系列 之 教程5- User Interface
作者:i_dovelemon 日期:2014 / 12 / 18 来源:CSDN 主题:GUI 引言 今天.博主学习了第五个教程. 这个教程解说了怎样使用Irrlicht内置的一个基础模块.GUI模块 ...
- Android 关于expandableListView childrenView 点击改变颜色
1.点击后改变颜色并保持颜色改变状态: <?xml version="1.0" encoding="utf-8"?> <selector xm ...
- Android 给图片加边框
图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下 ...
- 关于Sleep函数介绍
函数名: Sleep 功 能: 执行挂起一段时间 用 法: void Sleep(DWORD dwMilliseconds); 在VC中使用带上头文件 #include <windows.h&g ...
- Linux桌面新彩虹-Fedora 14 炫酷应用新体验
Linux桌面新彩虹 --Fedora 14 炫酷应用新体验 650) this.width=650;" hspace="12" align="left&quo ...
