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

脚本使用

./compile hello

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

  1. ############## RISC-V ##############
  2. setenv RISCV_PATH /mnt/Software/FreedomStudio/SiFive/riscv64-unknown-elf-gcc-8.1.0-2018.12.0-x86_64-linux-ubuntu14/
  3. set path = ($RISCV_PATH/bin $path)
  4. set RISCV_ARCH = rv32imac
  5. set RISCV_ABI = ilp32
  6. set RISCV_GCC = ${RISCV_PATH}/bin/riscv64-unknown-elf-gcc
  7. set RISCV_GXX = ${RISCV_PATH}/bin/riscv64-unknown-elf-g++
  8. set RISCV_OBJDUMP = ${RISCV_PATH}/bin/riscv64-unknown-elf-objdump
  9. set RISCV_GDB = ${RISCV_PATH}/bin/riscv64-unknown-elf-gdb
  10. set RISCV_AR = ${RISCV_PATH}/bin/riscv64-unknown-elf-ar
  11. set RISCV_ELF2HEX = /usr/local/bin/riscv64-unknown-elf-elf2hex

脚本:编译过程compile

  1. #!/bin/tcsh -f
  2. # usage : ./compile hello
  3. # please set toolchain dir
  4. # Directory structure
  5. # .
  6. # ├── compile
  7. # ├── riscv_set_env
  8. # ├── driver
  9. # │   ├── bits.h
  10. # │   ├── const.h
  11. # │   ├── coreplexip-arty.h
  12. # │   ├── encoding.h
  13. # │   ├── env
  14. # │   │   └── start.S
  15. # │   ├── init.c
  16. # │   ├── one_tim.lds
  17. # │   ├── platform.h
  18. # │   ├── sim_show.c
  19. # │   ├── sim_show.h
  20. # │   └── tim_split.lds
  21. # └── testcase
  22. # └── hello
  23. # ├── obj
  24. # └── src
  25. # └── demo_print.c
  26. source ./riscv_set_env
  27. set INFO = "###(info) ${0}"
  28. set ERROR = "###(error) ${0}"
  29. ######################
  30. # Configuration
  31. ######################
  32. # Default target
  33. if ($#argv == 0) then
  34. set PROGRAM = hello
  35. else
  36. set PROGRAM = $argv[1]
  37. endif
  38. set BOOT_MODE = "SYSTEM_PORT_BOOT"
  39. set DRV_BASE = "driver"
  40. set PROGRAM_DIR = testcase/${PROGRAM}
  41. set ENV_DIR = ${DRV_BASE}/env
  42. ######################
  43. # file
  44. ######################
  45. set SRC_DIR = ${PROGRAM_DIR}/src
  46. set OBJ_DIR = ${PROGRAM_DIR}/obj
  47. # Exit if no .S, .s. or .c files found
  48. if (! -d $SRC_DIR) then
  49. echo "${ERROR}: $SRC_DIR: No such file or directory"
  50. exit 0
  51. endif
  52. set ASM_FILES = `find ${SRC_DIR} -name "*.S" -print`
  53. set C_FILES = `find ${SRC_DIR} -name "*.c" -print`
  54. set HEX_FILES = `find ${SRC_DIR} -name "*.hex" -print`
  55. set ASM_FILES = "${ASM_FILES} ${ENV_DIR}/start.S"
  56. set C_FILES = "${C_FILES} ${DRV_BASE}/init.c ${DRV_BASE}/sim_show.c"
  57. if(("${ASM_FILES}" == "") && ("${C_FILES}" == "" && ("${HEX_FILES}" == ""))) then
  58. echo "ERROR: No test files or dirctory found"
  59. exit 0
  60. else
  61. echo "${INFO}: Test files found are"
  62. echo ${ASM_FILES}
  63. echo ${C_FILES}
  64. echo ${HEX_FILES}
  65. endif
  66. # Create the work dir if it doesn't already exist
  67. if (! -d $OBJ_DIR) then
  68. echo "${INFO}: Creating $OBJ_DIR"
  69. mkdir -p $OBJ_DIR
  70. else
  71. echo "${INFO}: Delecting files in $OBJ_DIR"
  72. rm -rf ${OBJ_DIR}/*
  73. endif
  74. if ($BOOT_MODE == "SYSTEM_PORT_BOOT") then
  75. echo ""
  76. echo "*************************"
  77. echo "****SYSTEM PORT BOOT*****"
  78. set LINK_TARGET = "one_tim"
  79. echo ""
  80. else
  81. echo ""
  82. echo "*************************"
  83. set LINK_TARGET = "flash"
  84. echo ""
  85. endif
  86. # comile parameter
  87. set LINK_SCRPT = ${DRV_BASE}/${LINK_TARGET}.lds
  88. set INCLUDES = "-I${DRV_BASE} -I${ENV_DIR}"
  89. echo ${INCLUDES}
  90. set LINK_FILES = "${ASM_FILES} ${C_FILES}"
  91. set CFLASS = "-o0 -g -march=${RISCV_ARCH} -mabi=${RISCV_ABI} -mcmodel=medany ${INCLUDES}"
  92. set LDFLASS = "-march=${RISCV_ARCH} -mabi=${RISCV_ABI} -T ${LINK_SCRPT} -nostartfiles -L{ENV_DIR} --specs=nano.specs ${INCLUDES}"
  93. ######################
  94. # Compilation
  95. ######################
  96. # if .hex found, only copy he first .hex to simulate
  97. if ("${HEX_FILES}" != "") then
  98. echo "${INFO}: already exist hex file of ${HEX_FILES}"
  99. foreach i ($HEX_FILES)
  100. echo "${INFO}: run simulation with $i"
  101. cp $i ./riscv_rom.hex
  102. exit 0
  103. end
  104. endif
  105. # compile C code
  106. if ("${C_FILES}" != "") then
  107. foreach i (${C_FILES})
  108. set base_name = "$i:t"
  109. set base_name = "$base_name:r"
  110. set obj_name = ${OBJ_DIR}/"${base_name}".o
  111. echo "${INFO} Compile $i"
  112. ${RISCV_GCC} ${CFLASS} -c -Wa,-adlhn $i -o $obj_name > ${OBJ_DIR}/"${base_name}.s"
  113. if ( $status ) exit 1
  114. end
  115. endif
  116. # compile asm code
  117. if ("${ASM_FILES}" != "") then
  118. foreach i (${ASM_FILES})
  119. set base_name = "$i:t"
  120. set base_name = "$base_name:r"
  121. set obj_name = ${OBJ_DIR}/"${base_name}".o
  122. echo "${INFO} Compile $i"
  123. ${RISCV_GCC} ${CFLASS} -c -o $obj_name $i
  124. if ( $status ) exit 1
  125. end
  126. endif
  127. # link library and test object file
  128. set OBJ_FILES = `find ${OBJ_DIR} -name "*.o" -print`
  129. set PROGRAM_ELF = ${OBJ_DIR}/${PROGRAM}.elf
  130. set PROGRAM_HEX = ${OBJ_DIR}/${PROGRAM}.hex
  131. echo "${INFO}: Link library and object file, generate file of ${PROGRAM_ELF}"
  132. ${RISCV_GCC} ${LDFLASS} ${OBJ_FILES} --output ${PROGRAM_ELF}
  133. echo "${INFO}: Convert elf file to hex of ${PROGRAM_HEX}"
  134. ${RISCV_ELF2HEX} --bit-width 32 --input ${PROGRAM_ELF} --output ${PROGRAM_HEX}
  135. cp ${PROGRAM_HEX} riscv_rom.hex
  136. ${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. Python: PS 图像调整--对比度调整

    本文用 Python 实现 PS 里的图像调整–对比度调整.具体的算法原理如下: (1).nRGB = RGB + (RGB - Threshold) * Contrast / 255 公式中,nRG ...

  2. AC自动机 hdu2222

    #include <iostream> using namespace std; struct Node{ Node *next[]; Node* fail; int count; Nod ...

  3. Android 关于::app:clean :app:preBuild UP-TO-DATE :app:preDebugBuild UP-TO-DATE,引用jar冲突问题

    错误提示: Information:Gradle tasks [:app:clean, :app:generateDebugSources, :app:generateDebugAndroidTest ...

  4. Repeater控件的

    http://blog.csdn.net/zhang_xinxiu/article/details/21872433 想起来,公司的aspx页面前台数据展示除了datagrid以为还有Repeater ...

  5. 分享一个vue常用的ui控件

      vue学习文档 http://www.jianshu.com/p/8a272fc4e8e8 vux github ui demo:https://github.com/airyland/vux M ...

  6. spring三大框架整合

        Spring概述 Spring介绍 Spring它是一个一站式的分层轻量级框架. Spring体系结构 1.      core container a)        beans与core ...

  7. 前台技术--div的隐藏与显示

    怎样使用页面元素隐藏或显示. HTML为我们提供了两个变量visibility和display visibility:隐藏要元素可是元素所暂用的空间不予释放.也就是说元素隐藏了,可是页面上会流出一片空 ...

  8. Web前端开发实战4:导航菜单(一)

    在前面的博文中我们提到横向一级菜单,这里我们来看看导航菜单. 导航菜单种类非常多,可是制作原理都是大同 小异的.这里看的比二级下拉式菜单还简单. 来看一些站点上的导航菜单: 垂直导航菜单: 水平导航菜 ...

  9. php函数按地址传递参数(php引用)

    php函数按地址传递参数(php引用) 一.总结 1.php引用:php引用和c++一样,都是在变量前加&(取地址符号) 2.php函数按地址传递参数:php函数按地址传递参数(php引用)也 ...

  10. 洛谷P3165 [CQOI2014]排序机械臂

    题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到摄低的物品的位置P1,并把左起第一个至P1间的物品反序:第二次找到第二低的物品 ...