如何建立自己的RISC-V编译环境--汇编?

查看RISC-V版本的gcc中默认定义的宏 有些时候我们在编写代码或者阅读开源项目时经常会遇到一些陌生的宏定义,在找遍所有源代码都没发现其在哪里被定义过,这时这些宏定义很可能是系统编译器自己定义的。 root@freedom-u540:~# gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/libexec/gcc/riscv64-oe-linux/11.2.0/lto-wrapper Target: riscv64-oe-linux Configured.. 阅读详情

如何建立自己的RISC-V编译环境–汇编?

1.RISC-V编译环境框架

这是我RISC-V编译环境的架构:

build  case  common  toolchain
一级目录 二级目录 说明
build - xx.hex、xx.bin、xx.dump & xx.elf生成的目录。
- Makefile 编译脚本。
- add(例子) 生成文件,根据test.c生成的xx.hex、xx.bin、xx.dump & xx.elf
project - 各个目录的源代码。
- add(例子) 放add项目的S文件。
common - 各个项目公用的文件。
- encoding.h /riscv-tests/env目录中的H文件。
- asm.h /riscv-tests/env/p/riscv_test.h文件,只是我改为asm.h。
- asm.ld /riscv-tests/env/p/link.ld文件,用于链接物理地址和汇编,我改名字为asm.ld了。
toolchain - 工具链。我在/riscv-tools/riscv-gnu-toolchain/的工具链上提取了对我有用的部分。

2.各目录内容介绍

2.1 toolchain:工具链目录我不打算介绍,如果有不明白的,可以看我的这个博客:
rocket-chip工具链的编译与使用(https://blog.youkuaiyun.com/a_weiming/article/details/84801051)

2.2 project:这个目录就是放你的项目代码的。每个项目建立一个目录。在这个例子中,我放的是add目录,add的源代码如下(全为汇编代码):
此外,RISC-V汇编不熟悉的可以参考以下链接:
https://github.com/riscv/riscv-asm-manual/blob/master/riscv-asm.md
https://mp.weixin.qq.com/s/-syKN0DibKGGPCllaeNqMg
https://mp.weixin.qq.com/s/jyI-SSm_5Gg-KQyjKsIj5Q
https://mp.weixin.qq.com/s/3RHss3vhfK004-TtM8fpeA
https://mp.weixin.qq.com/s/Ln4qBYvSsgRvdiK1IJqI6Q

下面贴图为.section的说明。
在这里插入图片描述

注意,下文中使用“###”形式的均是我添加的注释,原代码中没有。

#*****************************************************************************
# add.S
#-----------------------------------------------------------------------------
#
# Test add instructions.
#

#屏蔽了原来的include "riscv_test.h"
######include "riscv_test.h"
#使用我自己的asm.h
#include "asm.h"

###使用RVTEST_RV32U段内容
RVTEST_RV32U
###使用RVTEST_CODE_BEGIN段内容
RVTEST_CODE_BEGIN
###按2^2字节(4字节)数据对齐
  .align 2
  ###“.option push”伪操作暂时将当前的选项设置保存起来,
  ###从而允许之后使用.option伪操作指定新的选项;
  ###而“.option pop”伪操作将最近保存的选项设置恢复出来重新生效。
  ###通过“.option push”和“.option pop”的组合,便可以在汇编程序中在不影响全
  ###局选项设置的情况下,为其中嵌入的某一段代码特别地设置不同的选项。
  ###意思就是:
  ###在add.S这个汇编文件中,将前面其他.S/.h文件中的配置选项保存起来,
  ###然后在add.S文件中设置一些新的选项,新的选项就是下面的.option norvc
  .option push
  ###伪操作表示接下来的汇编程序不可以被汇编生成16位宽的压缩指令。
  .option norvc

###定义标签asm_start
asm_start:
  ###将0xAAAAAAAA赋给a1
  li   a1, 0xAAAAAAAA
  ###将0x22222222赋给a1
  li   a0, 0x22222222
  ###将a0和a1相加,并出入a2中
  add  a2, a1, a0
  ###将0x7000_0000存入a4中
  lui  a4, 0x70000
  ###将a4的值+4并存入a6中
  addi a6, a4, 4
  ###将a2的结果存到总线为0x7000_0004的memory中
  sw   a2, 0(a6)
  ###将0xFF存到a5中
  li   a5, 255
  ###将a5的结果存到总线为0x7000_0000的memory中,用于停止VCS仿真
  sw   a5, 0(a4)

  ###恢复原选项配置
  .option pop

###使用RVTEST_CODE_END段内容
RVTEST_CODE_END
  
  ###数据段.data:已初始化的C程序全局变量和静态局部变量。
  .data
###使用RVTEST_DATA_BEGIN段内容
RVTEST_DATA_BEGIN

###使用RVTEST_DATA_END段内容
RVTEST_DATA_END

以下的定义在asm.h中有详细的说明。
RVTEST_RV32U
RVTEST_CODE_BEGIN
RVTEST_CODE_END
RVTEST_DATA_BEGIN
RVTEST_DATA_END

2.3 common:这个目录放的是通用的内容,例如asm.h和asm.lk。

2.3.1 encoding.h:这个文件不解释,就是RISC-V各重要CSR寄存器的定义。

2.3.2 asm.h:这个我是根据/riscv-tests/env/p/riscv_test.h文件进行修改的,下面简单说明一下里面各汇编的含义。
此外,我修改的是p目录下的文件,p目录下是单核的,而且是没有MMU的。具体env中各目录的差异大家可以看:
https://github.com/riscv/riscv-tests/tree/7ef425b4aea0a93568c788e68acebcc2f08da8d6
在这里插入图片描述

// See LICENSE for license details.

#ifndef _ENV_PHYSICAL_SINGLE_CORE_H
#define _ENV_PHYSICAL_SINGLE_CORE_H

#include "./encoding.h"

//-----------------------------------------------------------------------
// Begin Macro
//-----------------------------------------------------------------------

###定义宏init
#define RVTEST_RV64U                                                    \
  .macro init;                                                          \
  .endm

###定义宏init,同时运行RVTEST_FP_ENABLE段
#define RVTEST_RV64UF                                                   \
  .macro init;                                                          \
  RVTEST_FP_ENABLE;                                                     \
  .endm

###定义宏init
#define RVTEST_RV32U                             
RSIC-V——指令集spec阅读笔记——向量扩展0.9 rvv 是risc-v指令集中的向量扩展。 阅读详情

相关推荐

CPU设计——RISC-V指令集

RISC-V(英文发音为"risk-five")架构主要由美国加州伯克利分校(简称伯克利)的Krste Asanovic教授和Yunsup Lee等开发人员于2010年发明。经过几年的发展,伯克利为RISC-V架构开发了完整的软件工具链以及若干开源的处理器实例(例如Pocket Core和BOOM Core),并且得到了计算机体系结构领域的泰斗David Patterson的大力支持。与大多数指令集架构相反,RISC-V指令集架构最大的特点就是开放。

weixin_45585462的博客 1万+

Ubuntu RISC-V 编译环境搭建 芯来RISCV Nuclei GNU Tool chain

Ubuntu RISC-V 编译环境搭建 芯来RISCV Nuclei GNU Tool chain

lwwaixuexi的博客 2428

RISC-V自定义指令工具链适配实战:从汇编器到GCC全流程解析

指令集架构(ISA)的可扩展性是现代处理器设计应对垂直场景高性能计算的关键。RISC-V通过预留自定义扩展空间,使芯片设计者能够针对AI推理、视频编解码、基带处理等负载定义专属指令。然而,一条新指令从RTL实现到真正被软件栈使用,必须经过汇编器、反汇编器、链接器及GCC编译器后端的完整适配。本文从工具链源码出发,系统讲解自定义指令在binutils中的编码匹配、GCC后端RTL模板的生成机制,以及QEMU和FPGA上的运行时验证方法。内容涵盖操作数掩码定义、指令识别、编译优化匹配等工程实践,帮助芯片工程师与

weixin_29192211的博客 226

FII-PRX100-D开发板FPGA的烧录和RISC-V 软件代码下载

1. 生成*.bit文件之前先RESET结果 首先,打开VivadoFII_RISCV_V2.01工程(这里以V2.01版本为例),如图1所示。 图1 FII_RISCV_V2.01工程 要生成相应的*.bit文件需要先synthesis和implementation。推荐在进行synthesis之前,先reset前一次的结果。Reset操作如图2-图4所示。 图2 选中上次的synthesis 图3 选中reset 图4 在弹出窗口中确定reset 2.生成.

c17611255160的博客 1068

树莓派Pico 2深度解析:RISC-V双核RP2350实战与开发环境迁移指南

微控制器(MCU)作为嵌入式系统的核心,其指令集架构(ISA)决定了芯片的性能、功耗与开发生态。RISC-V作为一种开源、模块化的指令集架构,凭借其免授权费、设计透明和可扩展性,正在嵌入式领域快速崛起,为开发者提供了ARM架构之外的新选择。其技术价值在于通过精简的指令集和开放的生态,降低了芯片设计门槛,促进了定制化硬件创新。在物联网(IoT)、边缘计算和创客教育等应用场景中,RISC-V MCU正成为实现低成本、高性能解决方案的关键。本文聚焦于树莓派基金会最新推出的Raspberry Pi Pico 2,它

cmff98425的博客 415

macOS上搭建RISC-V开发环境:从工具链到Spike模拟器完整指南

指令集架构(ISA)是计算机硬件与软件之间的核心接口规范,定义了处理器能够理解和执行的基本操作集合。RISC-V作为一种开源、模块化的指令集架构,其设计原理基于精简指令集(RISC)理念,通过标准扩展机制支持从嵌入式到高性能计算的不同场景。这一开放标准的技术价值在于降低了芯片设计门槛,促进了软硬件协同创新,尤其在物联网、边缘计算和定制化处理器领域具有广泛应用前景。本文聚焦于在macOS平台上配置完整的RISC-V开发环境,涵盖工具链编译、Spike模拟器集成等关键实践,其中涉及交叉编译和GNU工具链等核心概

weixin_30291791的博客 394

RISC-V MCU开发环境搭建实战:工具链、OpenOCD与命令行工程

RISC-V作为开放指令集架构,正推动MCU开发从“开箱即用”走向“自主拼装”。与ARM生态的IDE一键编译不同,RISC-V开发环境需要开发者自行组合交叉编译器、调试代理、SDK与构建系统,这也成为初学者入门的第一道门槛。理解RISC-V工具链(如riscv64-unknown-elf-gcc)的安装与配置、OpenOCD调试服务器的连接原理,是搭建可复现开发环境的基础。当开发者掌握命令行下编译、烧录、调试的最小流程后,无论是评估板验证、裸机编程还是后续的CI集成,都能摆脱厂商IDE的限制。本文以实际开发

weixin_33874713的博客 420

深圳嵌入式实战:RISC-V端侧AI驱动具身智能闭环

嵌入式系统是软硬协同的实时控制基础,其核心原理在于资源约束下的确定性响应与物理世界交互。随着端侧AI和具身智能兴起,传统嵌入式开发正经历从功能实现向‘感知-决策-执行’毫秒级闭环的范式升级。RISC-V凭借指令集可扩展性,成为端侧AI模型轻量化部署的关键接口;而深圳凭借硬件供应链、人才密度与快速验证能力,构成全球少有的全栈落地场域。本文聚焦真实产线中RISC-V指令级优化、端侧AI内存压缩、具身智能物理闭环调试等硬核实践,覆盖从蓝桥杯真题到工业机械臂落地的五层穿透式开发路径。

weixin_34033624的博客 353

RISC-V切入AI芯片的三种路径:主控、RVV与自定义指令

在AI芯片的异构计算架构中,CPU负责调度与控制,专用加速器承担密集型计算,这一组合已成为行业共识。RISC-V凭借精简、可扩展的指令集设计,正从主控角色逐步渗透至AI计算核心。当前,RISC-V介入AI芯片主要有三种路径:一是作为主控核调度外部NPU,实现成熟稳定的SoC方案;二是利用RVV向量扩展指令直接处理并行计算,适用于轻量级推理;三是通过自定义指令集构建领域专用架构,将矩阵运算直接融入流水线以获得极致能效。不同路径对应不同算力区间与软件栈成熟度,实际产品常采用组合形态。理解这些技术原理与应用取舍,

weixin_34116110的博客 431

玄铁C910:高性能RISC-V处理器架构解析与应用实践

RISC-V作为一种开源指令集架构,以其模块化设计和可扩展性为现代处理器设计提供了新的范式。其核心原理在于基础指令集与自定义扩展的灵活组合,使芯片设计者能够针对特定应用场景进行深度优化,从而在性能、功耗和成本之间取得最佳平衡。这一技术价值在高性能计算、边缘AI和网络通信等领域尤为突出,能够有效满足对算力与能效同时有严苛要求的应用场景。玄铁C910正是这一理念的工程实践典范,它基于RISC-V RV64GC指令集,采用超标量乱序执行微架构,并集成了针对AI推理与网络处理的专用扩展指令,为开发者提供了一个经过量

weixin_34111790的博客 340

RISCV——指令集工具链

众所周知,软件生态对CPU是至关重要的,而软件工具链的完备是CPU能够真正运行的第一步。本文将以RISCV工具链为例。

知识,既贵,又便宜。 8364

RISC-V编译选项-march与-mabi匹配原理与实战

RISC-V指令集架构没有默认CPU概念,其程序可执行性高度依赖编译时指定的-march(机器架构)和-mabi(应用二进制接口)组合。-march定义硬件支持的指令扩展集合,如rv64imac中的a代表原子扩展,缺失即导致illegal instruction;-mabi则规定寄存器用途、栈对齐、浮点传参等ABI契约,如lp64d要求硬件必须同时支持F和D扩展。二者不匹配将引发静默崩溃、syscall失败或中断异常等深层问题。在嵌入式开发、Linux内核适配及SoC Bring-up中,需结合芯片手册、工

weixin_33798152的博客 310

告别纯理论:用QEMU+RISC-V+OpenHarmony轻量系统,5分钟搭建你的第一个‘开源鸿蒙’硬件模拟实验室

本文提供了一种极简方法,使用QEMU和RISC-V架构在5分钟内快速搭建OpenHarmony轻量系统模拟环境。无需深入理解底层原理或复杂编译过程,只需Ubuntu环境(或WSL2)即可体验开源鸿蒙系统,适合学生和技术爱好者快速验证和学习。

weixin_30696427的博客 494

HPM6750双核RISC-V飞控实战:非对称架构与实时控制设计

在工业实时控制与无人机飞控系统设计中,算力与外设资源的平衡始终是核心挑战。非对称多处理(AMP)架构通过让不同核心各司其职,既保证硬实时任务的确定性,又兼顾复杂管理功能的灵活性,因而成为高端嵌入式控制器的优选方案。HPM6750作为一款主频816MHz的双核RISC-V处理器,具备FPU、DSP扩展及丰富外设接口,为构建高性能国产飞控提供了扎实的硬件基础。本文从实际项目出发,围绕非对称双核的任务划分、核间无锁通信机制、1kHz控制循环设计以及双核调试与资源分配等工程要点,系统阐释了基于该芯片实现实时飞行控制

weixin_30954817的博客 164

[Rust][RISCV] 二、搭建裸机环境,编译第一个 RISC-V Rust 程序

Rust裸机开发环境搭建指南 本指南介绍如何搭建Rust裸机开发环境并编译第一个最小程序。裸机程序直接运行在硬件上,不依赖操作系统或标准库。 工具链安装 安装Rust工具链 添加RISC-V目标三元组(riscv64imac-unknown-none-elf) 安装LLVM工具和QEMU模拟器 项目配置 创建新项目并配置.cargo/config.toml 使用#![no_std]和#![no_main]属性 自定义panic_handler和程序入口函数 链接脚本 创建linker.ld定义内存布局 设置

wangyijieonline的博客 230

手把手教你玩转服务器芯片架构--​​5.3 链接脚本编写:如何为RISC-V程序指定内存布局?​

本文介绍了RISC-V架构下链接脚本(LINKERSCRIPT)的编写方法,重点讲解如何为RISC-V程序指定内存布局。主要内容包括:链接脚本的核心作用(内存区域划分、段映射和符号管理);RISC-V链接脚本的关键结构(MEMORY块和SECTIONS块);关键配置项解析(入口点、对齐控制和符号导出);典型应用场景(启动代码和动态内存管理);调试与优化技巧;以及基于CH32V307的完整示例。通过合理配置链接脚本,可以实现对程序内存布局的精确控制,提升启动效率和内存利用率,特别适用于资源受限的嵌入式开发场景

MHD0815的博客 123

【寄存器模型】一、一个简单的寄存器模型

在描述寄存器模型之前,首先来了解一下实际寄存器的组成结构:如下图所示的DUT内部真实的寄存器寄存器中最小的一个单位是域(field),域是由一个或多个bit拼接而成的。一个或多个域就构成了一个寄存器(reg)。一个或多个寄存器就构成了一个块(block)。将DUT中的寄存器抽象出来,建立寄存器模型,如下图所示:uvm library已经定义好了field、reg、block等相关的概念,构建寄存器模型时,只需要继承这些类即可。:构建寄存器模型中的域段。uvm_reg。...

carrotbanana的博客 5368

基于Xilinx Artix7 的FPGA高级应用 (二):千兆以太网通信(实战篇)第一期

本项目是基于Xlinx Artix7 XC7A35T芯片 以太网芯片选用的是RTL8211EG PHY芯片 MAC 和PHY接口标准是GMII 开发工具是vivado 2018.3 我们先来复习一下以太网的基本通信原理: 当我们的计算机需要与局域网中另外的设备进行通信的时候,需要将数据传输到网卡进行编码,然后传输到线上,经过另一个设备的网卡解码成该设备能读取的数据。 关于以太网协议的知识在原理篇中已经讲过,不再重复,下面直接看接收代码: 首先注意我们的MAC和PHY通信选择的是GMII接口标准,发送数据一

工大技术底层人员的博客 4034

GD32F303定时器配置:实现两路互补PWM输出与相位控制

本文详细解析了基于GD32F303定时器实现两路互补PWM输出与精确相位控制的方法。通过配置TIMER2的中间对齐模式,结合REMAP功能解决引脚复用问题,从硬件层面稳定生成相位差180度的互补PWM信号,适用于电机驱动、开关电源等对时序要求苛刻的应用场景。

weixin_29182481的博客 307

ch32v103xx 烧写

烧写方式 串口uart, usb,swd(wch link)但不建议按此使用,参官方说明。

qq_39239990的博客 637

lammps案例:reaxff势模拟Fe(OH)3高温反应过程

所有的reaxff模拟,如:氧化、腐蚀、热裂解、燃烧等模拟,均可采用此模拟框架,只需要更换data文件、势文件,代码中的control文件可以不写,电荷平衡文件也可以用reaxff替换。该案例主要模拟Fe(OH)3在高温下的反应过程,主要代码来自lammps自带的案例。lammps自带案例没有产物输出,故在此基础上稍加修改,增加了产物输出命令。如果需要系统学习反应势的模拟,可考虑报名培训课程。本文分享一个reaxff反应势的案例。in文件代码已经注释,以供参考。大家好,我是小马老师。

lammps_jiayou的博客 1966

python全栈入门到实战【基础篇 02】环境搭建:Python解释器与PyCharm、VSCode编辑器安装配置详解

本文详解Python环境搭建步骤。首先安装解释器(运行代码核心),需从官网下载,选3.8及以上版本(勿选2.x)。Windows安装必勾“Add Python.exe to PATH”,验证用`python --version`;Mac选universal2安装包,验证用`python3 --version`。 编辑器二选一:PyCharm社区版(免费,新手推荐),安装后需配置解释器路径;VSCode轻量,需装Python插件并选择解释器。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 5万+

10、进化动力学谱分析中的开放性问题

本文探讨了进化动力学谱分析中的若干开放性问题,重点围绕进化算法的性能与设计理论展开。文章首先介绍了规范模型及其线性动力学特性,随后深入分析了在实际应用中偏离理想情况的两个关键因素:有限种群和双亲重组。在此基础上提出了三个核心开放性问题:寻找最优传输矩阵以实现全局最优解的高效搜索、无限与有限种群模型谱之间的关系、以及卡林定理在多遗传算子下的推广可能性。通过谱条件、快速混合性与首次命中时间的关系分析,文章进一步讨论了全局吸引与快速收敛的理论基础,并提出了未来的研究方向,包括理论深化、实验拓展与跨学科融合,旨在为

cuda7parallel的博客 81

量子编程专业权威教程(十四):Shor 算法

本文系统阐述了Shor算法的原理与实现,重点解析了将大数分解问题转化为周期寻找问题的数论基础,以及模幂运算量子电路的设计方法。通过以N=15为例的完整算法流程演示,展示了量子计算在因数分解问题上的指数级优势。文章详细拆解了受控幺正操作构建、量子傅里叶变换应用等关键技术环节,并提供了可复现的Qiskit代码实现。同时指出了当前量子硬件在比特数、相干时间和错误率等方面面临的工程挑战,这些限制使得分解大整数仍需长期技术突破。该研究为理解量子计算优势提供了典型范例,对后量子密码学发展具有重要启示意义。

分享知识,拥抱变化 799

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: Rocket-Chip-Local_Interrupt
下一篇: Rocket-chip-CLINT
Xxxxxxx..
博客等级 码龄15年 291粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值