RISC-V GNU Toolchain及交叉编译

交叉编译

想要理解riscv gnu Toolchain的作用,首先要了解交叉编译的概念。我们平时常见的架构有Intel的X86架构、龙芯处理器的MIPS架构、苹果A系列处理器的ARM架构等。

交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如C代码)编译(compile)成计算机可以识别和执行的二进制代码。比如,我们在Windows平台上,可使用Visual C++开发环境,编写程序并编译成可执行程序。这种方式下,我们使用PC平台上的Windows工具开发针对Windows本身的可执行程序,这种编译过程称为native compilation,中文可理解为本机编译。然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的ARM平台,其一般的静态存储空间大概是16到32MB,而CPU的主频大概在100MHz到500MHz之间。这种情况下,在ARM平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilation tool chain)需要很大的存储空间,并需要很强的CPU运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们就可以在CPU能力很强、存储空间足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序。

此外,我们需要明确两个概念,host(宿主机)和target(目标机)。Host指的是程序编译的平台,一般来说是基于x86机构的windows PC机,而target指的是用户所开发的平台,一般是非x86架构的。

要进行交叉编译,我们需要在host上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在target上运行的代码。

Riscv-gnu-toolchain

risv-gnu-toolchain是以PC机(x86)为host,以riscv为target的交叉编译工具链,可以在pc机上编译出能在riscv上运行的程序。它包括了以下几种工具:

riscv-gcc:通常所说的GCC是GUN Compiler Collection的简称,是Linux系统上常用的编译工具。GCC实质上不是一个单独的程序,而是多个程序的集合,因此通常称为GCC工具链。工具链软件包括GCC、C运行库、Binutils、GDB等。GCC的作用即为将用C/C++代码编写的程序转换为处理器所能执行的二进制代码。

riscv-binutils-gdb:二进制工具(链接器,汇编器等)、GDB调试工具等。

riscv-glibc:GNU C标准库实现。

为了解释C运行库,需要先回忆一下C语言标准。C语言标准主要由两部分组成:一部分描述C的语法,另一部分描述C标准库。C标准库定义了一组标准头文件,每个头文件中包含一些相关的函数、变量、类型声明和宏定义,譬如常见的printf函数便是一个C标准库函数,其原型定义在stdio头文件中。

C语言标准仅仅定义了C标准库函数原型,并没有提供实现。因此,C语言编译器通常需要一个C运行时库(C Run Time Libray,CRT)的支持。C运行时库又常简称为C运行库。与C语言类似,C++也定义了自己的标准,同时提供相关支持库,称为C++运行时库。

如上所述,要在一个平台上支持C语言,不仅要实现C编译器,还要实现C标准库,这样的实现才能完全支持C标准。glibc(GNU C Library)是Linux下面C标准库的实现

riscv-openocd是一个基于OpenOCD的RISC-V调试器(Debugger)软件

riscv-opcodes 是一个RISC-V操作码信息转换脚本。

riscv-tests是一组RISC-V指令集测试用例。

riscv-qemu是一个支持RISC-V的QEMU模拟器

riscv-DejaGnu: 程序测试框架,为所有测试提供一个前端支持。

Verilog/SV 写出的代码如何交叉编译

在vivado上完成综合、实现并生成编程文件.bit后,需要导出硬件说明文件(hdf:hardware description file)到sdk,用于软件的开发。创建好SDK工程后,软件会自动创建BSP(Board Support Package,板级支持包),BSP中定义了如何支持硬件,其中存放的是各个硬件单元外设模块的底层驱动代码。

有了板级硬件信息后就可以基于Riscv的软件进行开发,在Freedoom Studio上用C语言写函数调用并编译,接着使用toolchain进行交叉编译,并生成bit stream。

如果不用SDK则上板前的操作如下图所示:

RISC-V GNU Toolchain及交叉编译_第1张图片

(图片来源 知乎:人生状态机) 

        可以理解为verilog/sv综合出的是一个门级网表,上板后相当于构建一个硬件结构,因此不需要交叉编译。而高级语言C/C++等,在上板前需要在keil中进行交叉编译,生成可以在板子上运行的机器码,用来具体操作刚刚生成的硬件结构。

你可能感兴趣的:(risc-v,gnu,arm开发)