完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>
标签 > OR1200
or1200主要是GNU开发工具链的安装,有了GNU工具链提供的工具,我们可以在Linux环境下将汇编、C代码编译成OR1200平台的可执行代码,这就是交叉编译的过程。
OR1200主要是GNU开发工具链的安装,有了GNU工具链提供的工具,我们可以在Linux环境下将汇编、C代码编译成OR1200平台的可执行代码,这就是交叉编译的过程。有了OR1200的可执行代码,就能够在OR1200模拟器OR1KSim中运行该可执行代码,观察其是否如预期那样执行。
在介绍GNU开发工具链之前简单说明交叉编译的概念,在嵌入式开发中,开发平台与运行平台往往是不同的,这是因为运行平台上一般都资源有限,不能够安装编译开发环境,因此需要在其他性能更好的平台上安装编译环境,比如我们常在x86的平台上开发OR1200、ARM的应用程序,但是x86与OR1200、ARM是不同的处理器体系结构,也就是处理器的指令集不同,那么就需要x86上的编译器编译得到能够在OR1200、ARM架构下执行的目标代码,这就是交叉编译。图2.1显示x86平台与OR1200平台上“寄存器相与”指令对应不同的二进制编码。
or1200开发环境的安装
主要是GNU开发工具链的安装,有了GNU工具链提供的工具,我们可以在Linux环境下将汇编、C代码编译成OR1200平台的可执行代码,这就是交叉编译的过程。有了OR1200的可执行代码,就能够在OR1200模拟器OR1KSim中运行该可执行代码,观察其是否如预期那样执行。
在介绍GNU开发工具链之前简单说明交叉编译的概念,在嵌入式开发中,开发平台与运行平台往往是不同的,这是因为运行平台上一般都资源有限,不能够安装编译开发环境,因此需要在其他性能更好的平台上安装编译环境,比如我们常在x86的平台上开发OR1200、ARM的应用程序,但是x86与OR1200、ARM是不同的处理器体系结构,也就是处理器的指令集不同,那么就需要x86上的编译器编译得到能够在OR1200、ARM架构下执行的目标代码,这就是交叉编译。图2.1显示x86平台与OR1200平台上“寄存器相与”指令对应不同的二进制编码。
图2.1 x86平台与OR1200处理器“寄存器相与”指令的二进制编码是不一样的
因此我们在x86上开发程序的时候就需要针对不同的目标平台使用不同的编译工具,从而得到可以在目标平台上执行的二进制代码。在这方面GNU工具链是一个很好的选择。GNU工具链 (GNU Toolchain) 是一组用于开发应用程序和操作系统的编程工具的集合,这些工具构成了一个完整的系统,最重要的是其支持多种目标平台,其中就包括本书要介绍的OR1200。
GNU工具链包括GCC、Glibc、GDB、GNU Binutils。
1、GCC
GCC(GNU Compiler Collection)主要的工具包括cpp、g++、gcc、gcov、gprof等。其中cpp是C预处理器,主要用于在编译C、C++或Objective-C源代码之前对它们进行预处理,由编译器自动调用。g++和gcc可以认为分别是C++和C编译器。
2、Glibc
Glibc(GNU libc)是GNU的C标准库,Glibc是移植GNU工具链时一个不可或缺的部分。Glibc主要由两部分组成,一部分是头文件,另一部分是库的二进制文件,包括动态和静态两个版本。有了Glibc就可以使用C语言开发程序。
3、GDB
GDB(GNU symbolic debugger)是一个功能很强大的调试工具,可以让用户调试一个程序,包括让程序在希望的地方停下,此时,用户可以查看变量,寄存器,内存及堆栈,而且可以修改变量及内存值。
4、GNU Binutils
GNU Binutils(Binary Utilities) 是一组二进制工具集,用来编译、测试和分析软件。其中主要的两个工具是as和ld。as是GNU汇编器,通常也称为GAS(GNU Assembler),ld是GNU链接器,as对GCC的输出文件进行汇编产生目标文件,然后由ld链接目标文件、重定位数据,从而产生可执行文件。此外,GNUBinutils还包括其它一些工具,如下:
(1)addr2line:用于将程序中的地址对应到文件名和相应的行号。给定一个地址和一个可执行文件,addr2line使用可执行文件中的调试信息来确定该地址所对应的文件和行号。
(2)ar:用于建立、修改和提取档案文件 (archives)。档案文件经常被用作库文件,保存程序常用的函数过程。
(3)c++filt:C++和Java中都有重载函数的特性,编译器要区分重载函数,就需要对函数标识符进行编码转换成一个汇编级别的标签 (label),这个过程称为名字改编 (name mangling) 或名字修饰 (name decoration)。而c++filt所执行的就是这个过程的逆过程。
(4)dlltool:用于创建Windows动态链接库。
(5)ld:是链接器,编译程序最后是调用ld,把目标文件和归档文件链接在一起,重定位数据并链接符号引用。
(6)gold:是一种比ld更快,但只针对ELF文件格式的链接器。
(7)nm:用于列出二进制文件 (包括库文件和可执行文件) 中的符号,这些符号可以是函数、全局变量、静态变量等等。
(8)objcopy:用于将一种格式的目标文件复制成另外一种格式。
(9)objdump:用于列出关于二进制文件的各种信息。
(10)ranlib:用于为档案文件生成索引信息,这样可以提高档案文件的访问速度。
(11)readelf:类似于objdump,但是它只能处理ELF格式的文件,并且没有使用GNU BFD库。
(12)size:用于列出目标文件或者档案文件各段的大小。
(13)strings:用于列出目标文件中的可打印字符串。
(14)strip:用于移除目标文件中的符号,以减少程序文件的大小,这对于嵌入式系统比较有用。
GNU工具链可谓博大精深,功能全面,诸位读者不要惊慌,本书不是一本介绍GNU工具链的书,只是使用到了其中一点工具(实际只有as、ld,因为测试代码都是用汇编写的),所以不懂GNU工具链没有关系,笔者会在使用到其中工具的时候做一个简单介绍,这就足够了。
针对目标平台OR1200的GNU工具链,有三种安装方法:
方法一:下载源文件,在Linux环境下自行编译
方法二:下载编译好的针对OR1200处理器的GNU工具链,可在Linux环境下安装使用
方法三:下载一个Ubuntu的虚拟机文件,里面安装好了针对OR1200处理器的GNU工具链
方法一笔者试过,容易出问题,而且比较耗时,当然对GNU工具链有着强烈兴趣的朋友可以尝试。方法二笔者没用过。方法三简单直接,速度快,不易出错,而且基本都是Windows下的操作,适合新手,所以建议使用方法三,本书也只介绍方法三。
在浏览器中输入地址:ftp://openrisc.opencores.org/virtualbox-image/,FTP的用户名和密码都是openrisc,登录后会出现如图2.2所示界面。
图2.2 Ubuntu虚拟机镜像下载
下载最新的那个文件就可以了,笔者使用的是2011-12-15版。下载完成后解压该文件,大约4GB左右。此时还需要下载VisualBox以打开该文件。VisualBox是一款开源的虚拟机软件,本书使用的是4.1.22版。下载完成后安装VisualBox,安装完成后打开VisualBox,界面如图2.3所示。
图2.3 VisualBox主界面
点击“新建”出现“新建虚拟机”向导,点击“下一步”,出现如下界面:
图2.4 新建虚拟机设置一
此处操作系统选择Linux,版本选择Ubuntu,点击下一步,设置内存大小,如图2.5所示。
图2.5 新建虚拟机设置二
内存大小依据个人情况设置,本人设置的是512M,已经够用了,毕竟我们需要编译的程序都是十分简单的,点击下一步,选择“使用现有的虚拟硬盘”,然后选择解压后的虚拟机文件。
图2.6 新建虚拟机设置三
点击“下一步”,VisualBox会将用户刚才的设置都列出来,确认无误后,点击“创建”,这样虚拟机就创建好了。启动虚拟机,显示如图2.7所示。
图2.7 Ubuntu虚拟机桌面
双击左边的“终端”图标,就可以打开终端,在终端中输入or32-elf-,然后按两次Tab键,会列出虚拟机中已安装的针对OR1200平台的所有编译工具,如图2.8所示。
图2.8 Ubuntu中已安装的编译工具
可见之前介绍过的GNU工具链中的GCC、as、ld、gdb等都包括在内。这样GNU工具链就安装完成了。Ubuntu虚拟机提供的功能远不止GNU工具链,还包括OR1K模拟器、用于硬件调试的OR_DEBUG_PROXY、OpenRISC平台参考SoC设计ORPSoCv2,其中在本书的研究过程中需要使用到OR1K模拟器——OR1KSim,2.2.5节会介绍其使用方法。
最后,因为宿主机是Windows平台,而且在后面仿真时使用的ModelSim也是Windows平台的,为了方便文件的传递,这里需要设置虚拟机与宿主机的文件共享。打开VisualBox中虚拟机的设置界面,选择“共享文件夹”,如图2.9所示。
图2.9 虚拟机与宿主机共享文件夹设置步骤一
点击界面右边的添加文件夹按钮,出现如图2.10所示界面:
图2.10 虚拟机与宿主机共享文件夹设置步骤二
在其中选择共享文件夹的路径,设置名称,参考如上设置,然后启动虚拟机,打开终端,输入命令:
[plain] view plain copysudo mount –t vboxsf UbuntuShareFolder /mnt/sharefolder
该命令的作用是将共享文件夹挂载在/mnt/sharefolder目录下,sudo表示以Root用户身份执行该命令,终端会提示输入密码,Ubuntu虚拟机默认Root用户的密码是openrisc。这样就实现了虚拟机与宿主机的文件共享,对虚拟机而言共享文件放在/mnt/sharefolder路径下,对宿主机而言共享文件放在图2.10所示的E盘UbuntuShareFolder文件夹下。
编辑推荐厂商产品技术软件/工具OS/语言教程专题
电机控制 | DSP | 氮化镓 | 功率放大器 | ChatGPT | 自动驾驶 | TI | 瑞萨电子 |
BLDC | PLC | 碳化硅 | 二极管 | OpenAI | 元宇宙 | 安森美 | ADI |
无刷电机 | FOC | IGBT | 逆变器 | 文心一言 | 5G | 英飞凌 | 罗姆 |
直流电机 | PID | MOSFET | 传感器 | 人工智能 | 物联网 | NXP | 赛灵思 |
步进电机 | SPWM | 充电桩 | IPM | 机器视觉 | 无人机 | 三菱电机 | ST |
伺服电机 | SVPWM | 光伏发电 | UPS | AR | 智能电网 | 国民技术 | Microchip |
开关电源 | 步进电机 | 无线充电 | LabVIEW | EMC | PLC | OLED | 单片机 |
5G | m2m | DSP | MCU | ASIC | CPU | ROM | DRAM |
NB-IoT | LoRa | Zigbee | NFC | 蓝牙 | RFID | Wi-Fi | SIGFOX |
Type-C | USB | 以太网 | 仿真器 | RISC | RAM | 寄存器 | GPU |
语音识别 | 万用表 | CPLD | 耦合 | 电路仿真 | 电容滤波 | 保护电路 | 看门狗 |
CAN | CSI | DSI | DVI | Ethernet | HDMI | I2C | RS-485 |
SDI | nas | DMA | HomeKit | 阈值电压 | UART | 机器学习 | TensorFlow |
Arduino | BeagleBone | 树莓派 | STM32 | MSP430 | EFM32 | ARM mbed | EDA |
示波器 | LPC | imx8 | PSoC | Altium Designer | Allegro | Mentor | Pads |
OrCAD | Cadence | AutoCAD | 华秋DFM | Keil | MATLAB | MPLAB | Quartus |
C++ | Java | Python | JavaScript | node.js | RISC-V | verilog | Tensorflow |
Android | iOS | linux | RTOS | FreeRTOS | LiteOS | RT-THread | uCOS |
DuerOS | Brillo | Windows11 | HarmonyOS |