RSIC-V工具链介绍及其安装教程

前言

(1)此系列文章是跟着汪辰老师的RISC-V课程所记录的学习笔记。
(2)该课程相关代码gitee链接;
(3)PLCT实验室实习生长期招聘:招聘信息链接
(4)在配置RSIC-V工具链的时候,踩了很多坑,虽然网上也有同类型的文章,并且riscv-gnu-toolchain仓库的readme已经进行了讲解。但是我还是斗胆写一个小白能够看懂的RSIC-V工具链配置教程。
(5)强调两点:
<1>因为RSIC-V是比较前沿的产物,所以对汉语的支持并不高,因此建议在Linux环境中尽量使用英文路径处理RSIC-V相关文件。
<2>Windows和Linux的换行符是不一样的,可能因为换行符的不一致,导致编译过程产生很多奇奇怪怪的bug。所以千万不要像我一样,先在Windows中做完一些操作,然后再传递给Linux。

为什么需要交叉编译工具链

(1)在我们刚学习编程语言的时候,都是直接拿一个编译器,写入如下代码。然后点击编译器的执行按钮就可以了。我们会发现,这个过程中,编译此c文件,执行这个c文件的机器都是同一台电脑。这个被称之为本地编译

#include <stdio.h>
int main()
{printf("hello world\r\n");return 0;
}

(2)但是,在嵌入式开发过程中。我们都是在电脑端写好一个程序,之后利用编译器编译程序,之后再将可执行程序烧录进入开发板中。我们能够发现,程序的编译是在电脑端,最终的可执行文件是在开发板中。这种称之为交叉编译
(3)一般来说,我们的电脑都是X86架构的,当我们需要编译RSIC-V的程序时候,肯定是不能使用本地编译工具,因此,我们这个时候就需要使用到交叉编译工具链了。

如何让Linux拥有魔法

(1)因为RSIC-V很多操作是在外网,而且开发过程肯定要在Linux中开发。所以,我这里建议让Linux也拥有访问世界的能力。
(2)需要注意的一点是,你按如下博客进行操作,需要Windows有魔法,否则无力回天呀。
(3)Ubuntu虚拟机共享主机VPN(适用于NAT或桥接)

如何安装交叉编译工具链

方法1

(1)如果是Ubuntu 20.04 环境下,可以直接执行如下指令安装官方提供的 GNU工具链和 QEMU 模拟器。
(2)这里需要注意一点的是,此时安装的gcc-riscv64-unknown-elf工具链似乎还不能编译c库函数。所以要执行第三条指令,使用gcc-riscv64-linux-gnu工具链。
(3)可能会有人要问了,这两条工具链有什么区别呢?
<1>riscv32-unknown-elf-gcc,riscv64-unknown-elf-gcc:使用的riscv-newlib库(面向嵌入式的C库),而且只支持静态链接,不支持动态链接。
<2>riscv32-unknown-linux-gnu-gcc,riscv64-unknown-linux-gnu-gcc:使用的是glibc标准库,支持动态链接。

sudo apt update
sudo apt install build-essential gcc make perl dkms git gcc-riscv64-unknown-elf gdb-multiarch qemu-system-misc
sudo apt install gcc-riscv64-linux-gnu

方法2

(1)我们直接拉取官方仓库的工具链
再次强调,进行如下操作不能有任何非英文的路径!!!

git clone https://github.com/riscv/riscv-gnu-toolchain

(2)拉取完仓库之后,需要安装依赖文件。不同的Linux发行版执行的操作是不一样的,这个需要自己根据版本执行对应的命令。

# Ubuntu 
sudo apt-get install autoconf automake autotools-dev curl python3 python3-pip libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev ninja-build git cmake libglib2.0-dev
# Fedora/CentOS/RHEL
sudo yum install autoconf automake python3 libmpc-devel mpfr-devel gmp-devel gawk  bison flex texinfo patchutils gcc gcc-c++ zlib-devel expat-devel
# Arch Linux 
sudo pacman -Syyu autoconf automake curl python3 libmpc mpfr gmp gawk base-devel bison flex texinfo gperf libtool patchutils bc zlib expat
#  OS X
brew install python3 gawk gnu-sed gmp mpfr libmpc isl zlib expat texinfo flock

(3)执行完上述两步骤之后,我们要根据需求安装gcc编译器。如果是想搞RISC-V的嵌入式开发,安装Newlib 库,只要执行一个make即可。如果是进行大型RSIC-V项目开发,使用Linux cross-compiler,那么编译时候输入make linux

cd riscv-gnu-toolchain/
mkdir build
cd build/
# 下面部分,需要你看需求来执行
# --------------------------------------------------------
# 如果只要进行64位的RISC-V的嵌入式系统开发,执行如下命令
../configure --prefix=/opt/riscv
# 这里的N是数字,表示多少核同时编译,N越大编译速度越快。
# 如果超出了虚拟机所分配的最大内核数量,将只会依据最大内核数量编译
sudo make -JN
# --------------------------------------------------------
# 如果还要进行32位的RISC-V的嵌入式系统开发,执行如下命令。
# 这个既可以进行64位开发,也可进行32位开发
../configure --prefix=/opt/riscv --enable-multilib
# 这里的N是数字,表示多少核同时编译,N越大编译速度越快。
# 如果超出了虚拟机所分配的最大内核数量,将只会依据最大内核数量编译
sudo make -JN
# --------------------------------------------------------
# 如果只要64位大型RSIC-V项目开发,执行如下命令
../configure --prefix=/opt/riscv
# 这里的N是数字,表示多少核同时编译,N越大编译速度越快。
# 如果超出了虚拟机所分配的最大内核数量,将只会依据最大内核数量编译
sudo make Linux -JN
# --------------------------------------------------------
# 如果还要进行32位大型RSIC-V项目开发,执行如下命令
# 这个既可以进行64位开发,也可进行32位开发
../configure --prefix=/opt/riscv --enable-multilib
# 这里的N是数字,表示多少核同时编译,N越大编译速度越快。
# 如果超出了虚拟机所分配的最大内核数量,将只会依据最大内核数量编译
sudo make Linux -JN

虚拟机的内核数量相关信息

如何查看并且设置虚拟机内核数量

(1)关闭虚拟机—>编辑虚拟机—>设置内核数量

在这里插入图片描述
在这里插入图片描述

虚拟机内核数量一般设置多大

(1)一般来说,虚拟机的内核数量最多为实际电脑的内核数量的一半。
(2)我们可以按照如下方式查看实际电脑内核数量

在这里插入图片描述
在这里插入图片描述

执行RSIC-V架构的C程序

编译

(1)根据需求按照下图编译工程

#include <stdio.h>
int main()
{printf("hello world\r\n");return 0;
}

在这里插入图片描述

执行

在这里插入图片描述

参考文章

(1)RISC-V GNU编译环境搭建与运行实践;
(2)Ubuntu虚拟机共享主机VPN(适用于NAT或桥接)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/146614.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构--并查集

一、并查集的概念 并查集是一种树型的数据结构&#xff0c;用于处理一些不相交集合&#xff08;disjoint sets&#xff09;的合并及查询问题。常常在使用中以森林来表示。 最裸并查集&#xff1a; 合并元素a和元素b 所在的集合。查询元素a和元素b 是否属于同一组。是否在一个…

springmvc-页面跳转表单标签其他标签tomcat控制台中文乱码问题

1. WEB-INF下页面跳转 容器启动后&#xff0c;如何默认显示web-inf目录下的系统首页。 2. ModelAttribute来注解非请求处理方法 用途&#xff1a;预加载数据&#xff0c;会在每个RequestMapping方法执行之前调用。 特点&#xff1a;无需返回视图&#xff0c;返回类型void 示例…

Spring的注解开发-非自定义Bean的配置

非自定义Bean注解开发 非自定义Bean不能象自定义Bean一样使用Component注解及其衍生注解进行管理&#xff0c;非自定义Bean要通过工厂的方式进行实例化&#xff0c;使用Bean标注即可&#xff0c;Bean的属性为beanName&#xff0c;使用Bean注解作用在方法中&#xff0c;通过定义…

Audacity 使用教程:轻松录制、编辑音频

Audacity 使用教程&#xff1a;轻松录制、编辑音频 1. 简介 Audacity 是一款免费、开源且功能强大的音频录制和编辑软件。它适用于 Windows、Mac 和 Linux 等多种操作系统&#xff0c;适合音乐制作、广播后期制作以及普通用户进行音频处理。本教程将带领大家熟悉 Audacity 的…

基于SSM的公司项目管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【IDEA】IDEA 单行注释开头添加空格

操作 打开 IDEA 的 Settings 对话框&#xff08;快捷键为CtrlAltS&#xff09;&#xff1b;在左侧面板中选择Editor -> Code Style -> Java&#xff1b;在右侧面板中选择Code Generation选项卡&#xff1b;将Line comment at first column选项设置为false使注释加在行开…

Leetcode 69.x的平方根

给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1&#xff1…

【算法|贪心算法系列No.2】leetcode2208. 将数组和减半的最少操作次数

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

【办公自动化】在Excel中按条件筛选数据并存入新的表(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

分享46个Python源代码总有一个是你想要的

分享46个Python源代码总有一个是你想要的 下载链接&#xff1a;https://pan.baidu.com/s/1oZPrXHwgzcvVpB36_dA72A?pwd8888 提取码&#xff1a;8888 chat-web项目的python后端 Django WEB商城网站项目 django-实时接口获取中国各个城市、省份、国家的新型冠状肺炎 NewsSp…

蓝桥杯每日一题2023.10.2

时间显示 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 输入为毫秒&#xff0c;故我们可以先将毫秒转化为秒&#xff0c;由于只需要输出时分&#xff0c;我们只需要将天数去除即可&#xff0c;可以在这里多训练一次天数判断 #include<bits/stdc.h> using namespace std…

电子地图 | VINS-FUSION | 小觅相机D系列

目录 一、相关介绍 二、VINS-FUSION环境安装及使用 &#xff08;一&#xff09;Ubuntu18.04安装配置 1、Ubuntu下载安装 2、设置虚拟内存&#xff08;可选&#xff09; &#xff08;二&#xff09;VINS-FUSION环境配置 1、ros安装 2、ceres-solver安装 3、vins-fusion…

微服务moleculer03

1. Moleculer 目前支持SQLite&#xff0c;MySQL&#xff0c;MariaDB&#xff0c;PostgreSQL&#xff0c;MSSQL等数据库&#xff0c;这里以mysql为例 2. package.json 增加mysql依赖 "mysql2": "^2.3.3", "sequelize": "^6.21.3", &q…

docker基础命令

目录 一、安装docker 1、查看是否已安装docker 2、如果系统中已经存在旧的Docker 3、配置Docker的yum库 4、安装成功后&#xff0c;执行命令&#xff0c;配置Docker的yum源 5、安装Docker 6、启动和校验 7、配置镜像加速器&#xff0c;阿里云镜像加速为例 7.1、在首页的…

LabVIEW开发虚拟与现实融合的数字电子技术渐进式实验系统

LabVIEW开发虚拟与现实融合的数字电子技术渐进式实验系统 数字电子技术是所有电气专业的重要学科基础&#xff0c;具有很强的理论性和实践性。其实验是提高学生分析、设计和调试数字电路能力&#xff0c;培养学生解决实际问题的工程实践能力&#xff0c;激发学生创新意识&…

38 翻转二叉树

翻转二叉树 理解题意&#xff0c;翻转即每个结点的左右子树翻转/对调题解1 递归——自下而上题解2 迭代——自上而下 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 提示&#xff1a; 树中节点数目范围在 [0, 100] 内-100 < Node.…

开源博客项目Blog .NET Core源码学习(3:数据库操作方式)

开源博客项目Blog采用SqlSugar模块连接并操作数据库&#xff0c;本文学习并记录项目中使用SqlSugar的方式和方法。   首先&#xff0c;数据库连接信息放在了App.Hosting项目的appsettings.json中DbConfig节&#xff0c;支持在DbConfig节配置多个数据库连接信息&#xff0c;以…

探索腾讯企业邮箱替代方案:选择适合你的新邮件服务

腾讯企业邮箱作为一款广受欢迎的企业级电子邮件服务&#xff0c;已经在国内市场占据了相当大的份额。然而&#xff0c;随着全球市场竞争的加剧&#xff0c;腾讯企业邮箱也面临着海外市场的挑战。本文将探讨腾讯企业邮箱出海的劣势&#xff0c;并推荐一些替代品牌&#xff0c;以…

多线程 - 阻塞式队列

阻塞队列 阻塞队列,也是一个队列 ~~ 先进先出 实际上有一些特殊的队列,不一定非得遵守先进先出的 ~~ 优先级队列(PriorityQueue) 阻塞队列,也是特殊的队列,虽然也是先进先出的,但是带有特殊的功能: 阻塞 如果队列为空,执行出队列操作,就会阻塞.阻塞到另一个线程往队列里添加元…

软件测试之Python基础学习

目录 一、Python基础 Python简介、环境搭建及包管理 Python简介 环境搭建 包管理 Python基本语法 缩进(Python有非常严格的要求) 一行多条语句 断行 注释 变量 基本数据类型(6种) 1. 数字Number 2. 字符串String 3. 列表List 4. 元组Tuple 序列相关操作方法 …