新ちゃん 发表于 2020-8-6 11:00:19

RISC-V学习整理

目前网上关于risc-v架构概念介绍的文章比较多,本文从开发角度把学习中的记录整理出来。
以下为作者为自学记录内容,文章仅抛砖引玉,有学习需要的同学还需以官网及risc-v专家的书籍为准。
有错误欢迎指出,共同学习进步。

RISC-V:
[*]RV32I RV32E
RV32G表示RV32IMAFD
I – 32位地址空间,32个通用寄存器
M – 整数乘,整数除
A – 原子操作指令
F – 单精度浮点
D – 双精度浮点
C – 压缩指令,长度16
[*]RISC-V仅支持小端
RISC-V不支持地址自增自减
RISC-V有2条无条件跳转指令,6条条件跳转指令


汇编部分:
1.伪操作,汇编结束伪操作就结束
2. .option rvc 表示接下来的汇编程序可以被汇编生成16位宽的压缩指令
  .option norvc 表示接下来的汇编程序不可以被汇编生成16位宽的压缩指令
3. li 赋值
  la 标签地址赋值

中断和异常:

[*]广义中断和异常都称为异常
同步:非法地址空间,访问地址属性,取指非对齐,非法指令,断点
异步:外部中断(精确),读写存储器(非精确)
[*]异常发生 --> 硬件更改寄存器 --> 软件读取寄存器判断 --> 异常处理
系统会读取mcause寄存器判断何种异常从而跳转异常处理
RISC-V硬件不会保存上下文,需要软件保存和恢复
[*]相关寄存器
mtvec
异常入口地址寄存器,指定异常处理的pc地址,软件可以更改其值
高30为是BASE
低2位是mode模式 —| mode=0 所有异常响应 BASE 为 PC
| mode =1 —| 狭义异常响应 BASE 为 PC
| 狭义中断响应 BASE+4×casue(中断异常编号) 为 PC
mcause
软件可读取寄存器,查看异常原因
高1位 interropt域
低31位 异常编号域 --> 定义了12种中断类型和10种异常类型
mepc
保存原PC,用于异常返回,可读写,软件可以更改
中断时,mepc为下一条指令
异常时,mepc为发生异常时当前的PC
mtral
异常值
如果存储器访问,mtral为存储器地址
如果非法指令,mtral为非法指令编码
mstatus
机器模式状态
MIE=1,该模式下中断全局打开,为0关闭
进入异常和退出时都会更改此寄存器
[*]RISC-V狭义的异常不可以被屏蔽
狭义的中断可以被屏蔽,通过中断使能寄存器mie控制
[*]RISC-V不支持硬件中断嵌套
进入异常后,mstatus中mie会被硬件该为0,则中断全局关闭,不支持硬件中断嵌套
中断嵌套需要有软件实现:
a.读取mcause确认是中断
b.软件强写mie为1
  打开mie前需要注意 —| 屏蔽优先级低的中断可以修改mie中几个域
                      | 也可以通过修改PLIC屏蔽低优先级中断
                      | 软件注意保存中断上下文
                      | 软件注意修改mepc值,恢复使用



PLIC 平台级别中断控制器:

[*]支持0~7共8个中断目标
中断编号0 做为保留,实际中断源为(支持个数-1)个
优先级为0~7,数字越大,优先级越高。优先级0可以认为屏蔽中断
另一种屏蔽中断方法是设置中断使能寄存器 IE为0
[*]中断处理流程
a 中断使能IE为1,中断源优先级大于0
b 外部中断经过gateway 寄存器IP(只读)被置1。
c 仲裁,优先选择高优先级中断,优先级一样则选编号小的中断,仲裁结果必须大于中断目标优先级阈值
d 产生中断。
e 中断目标读取存储器地址映射的中断响应寄存器(可读)进行响应,且返回id ,通过此id进行中断处理
f 将id写入中断完成寄存器(可写)表示中断结束,硬件自动将IP置0, 解除gateway屏蔽,以便其他中断产生



页: [1]
查看完整版本: RISC-V学习整理