32位地址与整数指令支持32个通用寄存器
RV32E
草稿
RV32I的子集支持16个通用寄存器
RV64I
59
64位地址与整数指令集及部分32位整数指令支持32个通用寄存器
RV128I
71
128位地址与整数指令集及部分64位和32位整数指令支持32个通用寄存器
扩展指令集
M
8
乘法(Multiplication)与除法指令
A
11
存储器原子(Automic)操作指令
F
26
单精度(32bit)浮点(Float)运算指令
D
双精度(64bit)浮点(Double)运算指令
C
46
压缩(Compressed)指令,指令长度位16bit
Zicsr
6
控制和状态寄存器访问指令
寄存器名称
ABI名称
说明
存储者
x0
zero
读取时总为0,写入时不起任何效果
N/A
x1
ra
程序返回地址
Caller
x2
sp
栈空间指针
callee
x3
gp
全局变量指针(基地址)
/
x4
tp
线程变量指针(基地址)
x5~x7
t0~t2
临时寄存器
x8
s0/fp
保存寄存器/帧指针(配合栈指针界定函数栈)
Callee
x9
s1
保存寄存器(被调用函数使用时需备份并在退出时恢复)
x10,x11
a0,a1
函数参数寄存器(用于函数参数/返回值)
x12~x17
a2~a7
函数参数寄存器(用于函数参数)
x18~x27
s2~s11
x28~x31
t3~t6
图1.1调用与被调用函数图示
等级(Level)
编码(Encoding)
名称(Name)
缩写(Abbreviation)
0
00
用户/应用模式(User/Application)
U
1
01
管理员模式(Supervisor)
S
2
10
Reserved
-
3
机器模式(Machine)
模式数量
支持模式
目标应用
简单嵌入式系统
M,U
安全嵌入式系统
M,S,U
支持Unix、Linux、Windows等操作系统
1.2RISC-V处理器及Roadmap
1.2.1自研RISC-V处理器
Core
支持指令
流水线
特权模式
中断嵌套
硬件压栈
免表中断
整数除法周期
内存保护
V2A
RV32EC
2级
2路
无
V3A
RV32IMAC
3级
M+U
4路
17
V4A
RV标准PMU
V4B
9
V4C
5
V4F
RV32IMAFC
8级
1.2.2RISC-V系列MCU
图1.2增强版MCU+系列产品图示
图1.3RISC-V系列MCURoadmap
1.3工业级互联型MCUCH32V307
图1.4RISC-VMCUCH32V307详细参数
基本指令集的名称后缀都是I,表示Integer,任何一款采用RISC-V架构的处理器都要实现一个基本指令集,根据需要,可以实现多种扩展指令集,例如:如果实现了RV32IM,表示实现了32位基本指令集和乘法除法扩展指令集。如果实现了RV32IMAFD,那么可以使用RV32G来表示,表示实现了通用标量处理器指令集。这里只介绍RV32I的基本情况。
图1.5RISC-V的指令集编码格式
图1.6表示RISC-V指令实现流程与性能参数特性。
图1.6RISC-V指令实现流程与性能参数特性
UCB的研究人员设计的一款采用RISC-V指令集架构的开源处理器Rocket,并且已经成功流片了11次,其中采用台积电40nm工艺时的性能与采用同样工艺的,都是标量处理器的ARMCortex-A5的性能对比如表3所示。可见Rocket占用更小的面积,使用更小的功耗,但是性能却更优。
1.4.RISC-V详细介绍
图1.7x86指令集自诞生依赖,指令数量的增长
图1.8四个RV32I指令
解释说明:四种基础指令格式R/I/S/U
1.4.3RISC-V之乘除法指令
为了正确地得到一个有符号或无符号的64位积,RISC-V中带有四个乘法指令。要得到整数32位乘积(64位中的低32位),就用mul指令。要得到高32位,如果操作数都是有符号数,就用mulh指令;如果操作数都是无符号数,就用mulhu指令;如果一个有符号一个无符号,可以用mulhsu指令。在一条指令中,完成把64位积写入两个32位寄存器的操作,会使硬件设计变得复杂,所以RV32M需要两条乘法指令,才能得到一个完整的64位积。
图1.9:RV32M中用乘法来实现除以常数操作的代码。要证明该算法适用于任何除数,通过详细的数值分析,而对于奇特除数,其中的修正步骤更为复杂。
RV64F和RV64D添加了整数双字转换指令,并称它们为长整数,以避免与双精度浮点数据混淆:fcvt.l.s,fcvt.l.d,fcvt.lu.s,fcvt.lu.d,fcvt.s.l,fcvt.s.lu,fcvt.d.l,fcvt.d.lu。由于整数x寄存器现在是64位宽,它们现在可以保存双精度浮点数据,因此RV64D增加了两个浮点指令:fmv.x.w和fmv.w.x。这里暂时不讲解压缩指令。
图1.10VMULPS指令示意图
图1.11阿里HanGuang芯片
图1.12阿里HanGuang软件架构
图1.13阿里HanGuang软件架构优化编译
2.1预处理(Pre-Processing)
行开始
数据长度
地址
数据类型
数据
校验
:
BB
AAAA
TT
D……D
CC
1字节
2字节
n字节
2、ld链接脚本的主要内容
通过上一节ld文件分析:
2、堆栈的作用
278:01271063bnea4,s2,278
volatileuint8_tflag_interrupt=0;
RISC-VMCU将常量定义到指定的Flash地址--以CH32V103为例
sections.flash_test_address段中以4字节对齐,其余3字节补0。
2.2定义连续的多个单字节常量
二进制bin文件0x1000地址信息如下;
这样指定的方式会造成中间段有56个字节的flash无法分配内容,浪费了,不建议这样指定,如果实在要这样做,需要严格把控,可根据间隔的大小,指定编译后小于该间隔的函数存储到该flash块。