RISCV-CSR寄存器详解
随着接触越来越多的寄存器, 这篇文章在未来会更新, S-mode的一些寄存器功能与M-mode中差不多名字的寄存器功能类似, 因此只截了图, 网站好像不支持markdown的目录结构,因此要找对应的寄存器说明可以直接网页Ctrl+F查找名字就好了
名词
WARL: (Write any value, read legal value) (写任何值,读合法值)
WLRL: (Write/read only legal value) (读写合法值)
WPRL: (Reserved writes preseve values, reads ignore value) (将来可能会用到)
CSR寄存器快速一览(M-mode与S-mode)
M-mode CSR寄存器Machine ISA Register (misa)
MXL(Machine XLEN): 代表了XLEN的大小, 对应关系为:
MXL
XLEN
1
32
2
64
3
128
剩下的Extensions每个bit代表的意思为(感觉有点深了,就放个图吧):
Machine Stat ...
RISCV特权模式,中断与CSR寄存器
特权模式四种特权模式:
名
缩写
序号
Machine mode
M-mode
3
Hypervisor mode
H-mode
2
Supervisor mode
S-mode
1
User mode
U-mode
0
中断主要类型:
软件中断, 通过写入 mip CSR寄存器触发的中断
时钟中断, 由寄存器mtime和mtimecmp控制
外部中断, 受RISC-V 平台级中断控制器(Platform Level Interrupt Controller, PLIC)控制的,由外部设备触发的中断
中断处理程序 需要通过CSR手动开启, 否则CPU不会接受到任何中断(除了不可屏蔽中断), CPU异常在异常条件满足就会触发,无法通过CSR屏蔽
开启中断步骤:
mstatus[MIE]总开关(置1)
mie CSR寄存器为针对每种中断类型的独立开关
mstatus 前面的m代表的是M-mode的status寄存器, 如果是S-mode, 则寄存器名为 sstatus, 在看这些寄存器名时如果读不通可以看最前面的可不可以翻译为特权级
中断响应程序的地 ...
Rust堆, 智能指针
目的写着一篇的目的主要是看到虚拟内存的struct等过多,看了下面忘了上面的,所以记录一下,之前章节的可能会补充
内存分配静态分配 在编译期由编译器完成,已经知道了当前变量所占大小,分配一块固定的内存存储起来
动态分配 应用有一块可以动态增减的内存空间-堆,需要对这一块堆进行管理,如果堆的大小固定,则为连续内存分配问题。有一个概念,内存碎片,指的是无法分配和使用的内存空间,进一步细分有:
内碎片:已经被分配出去,但是占有的应用不使用这块区域,操作系统无法利用这块区域
外碎片:没被分配出去,但是太小了以至于无法分配给其他应用
经典的C语言中有动态分配的函数,malloc以及free,这两个函数用于动态分配或者释放内存。相比较静态分配,由于动态分配有一个连续内存分配算法,所以会有一些额外的开销。
Rust中的堆
裸指针 *const T/*mut T 与C中的普通指针基本相等
引用&T/&mut T 实际上是一个地址范围(还不清楚为啥)
Rust中与动态内存分配相关的智能指针:
Box<T>在创建时会在堆上分配一个类型为T的变量,当Box<T&g ...
我的世界1.18mod开发学习(1)-环境搭建
Block Entities 在forge文档1.16版本时,Block Entities还叫作Tile Entities,在1.17.x文档后被称为了Block Entities,在这里我会称呼Block Entities
是什么 与Block State不同,Block State的各种状态是初始化的时候已经定死,但游戏中的方块可能需要存储其他的一些数据,Block Entities可以作为一种解决方案用于存储动态数据,例子比如箱子,熔炉等
注册自己的Block Entities待填坑…
我的世界1.18mod开发学习(8)-合成
合成 目前我们的物品没有办法进行合成,在生存模式下无法合成,只能靠创造拿,所以需要在游戏内加入合成配方,默认情况下,forge会读取./data/{modid}/recipes下的所有配方,一般放在resources下,配方的文件类型为json文件,下面给出一个例子用于创建多彩方块:
12345678910111213141516171819202122232425{ "type": "minecraft:crafting_shaped", "pattern": [ "ddd", "dgd", "ddd" ], "key": { "d": { "tag": "forge:gems/diamond" }, "g": { ...
我的世界1.18mod开发学习(7)-网络
网络 在这一章将会讲述我的世界中有关网络的应用,将会添加一个新的物品,客户端使用这个物品与服务端进行通信
创建新物品 首先需要创建一个新的物品,在这里我不提供代码,只提供一个物品材质以及物品的名字:RemoteControl(java类等记得命名为这个,方便后续说明),当运行完后具体的界面应该为:
代码 首先需要创建文件名为MyMessageHandler,放在examplemod/network下
1234567891011121314151617181920212223242526272829303132333435363738394041424344public class MyMessageHandler { private static final String PROTOCOL_VERSION = "1"; protected static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel( new ResourceLocatio ...
我的世界1.18mod开发学习(6)-数据存储
本来打算直接介绍Block Entities,但看了下源代码,还是先需要介绍数据存储 :)
NBT 我的世界中存在一个NBT系统,通过标签(Tag)来存储和读取数据,一个标签由标签名和数值两部分组成,格式为name:data,中间不能有空格,中文或是特殊符号,name对大小写敏感。一串标签(name:data)拼接在一起并用{}包括称之为NBT,比如{damage:3,speed:2},有点像json格式。
数据类型 这一部分主要列出了Tag类型,先介绍简单的Tag,以及复合Tag
整型Tag:
ByteTag:字节Tag,用于存储一字节(8bit)
ShortTag:Short类型Tag,用于存储两字节(16bit)
IntTag:Int类型Tag,用于存储4字节(32bit)
LongTag:Long类型Tag,用于存储8字节(64bit)
浮点数Tag:
FloatTag:Float类型Tag,用于存储浮点数,4字节(32bit)
DoubleTag:Double类型Tag,用于存储浮点数,8字节(64bit)
StringTag:用于保存字符串
集合类 ...
我的世界1.18mod开发学习(5)-Block
Block 方块是我的世界最重要的一部分,在这一篇将介绍如何新建一个方块,注册,然后是材质加载,材质随便画了一个,称为多彩方块(colorful_block)好了
新建一个方块 首先来看Block的构造方法:
1234567891011121314public Block(BlockBehaviour.Properties p_49795_) { super(p_49795_); StateDefinition.Builder<Block, BlockState> builder = new StateDefinition.Builder<>(this); this.createBlockStateDefinition(builder); this.stateDefinition = builder.create(Block::defaultBlockState, BlockState::new); this.registerDefaultState(this.stateDefinition.any()); if ( ...
我的世界1.18mod开发学习(4)-Item
Item 这一章将会正式开始写代码,往游戏内注册第一个物品,我们将以红石锭(redstone_ingot)为例
创建类 在items下创建RedstoneIngot类并继承ItemBase,构造方法修改为
123public RedstoneIngot() { super("redstone_ingot", new Item.Properties().tab(ExampleMod.creativeTab));}
在ModItems中新建一个RedstoneIngot
1public static final Item REDSTONE_INGOT = new RedstoneIngot();
此时进入游戏应该能看见在你的创造栏内有一个物品,名应该为item.examplemod.redstone_ingot,这是因为我们还没有添加其他的属性,比如语言,材质,模型等
添加语言,材质语言 在assets/examplemod/lang下寻找en_us.json,在里面添加一句
1"item.exam ...
我的世界1.18mod开发学习(3)-概念
事件是什么 你关注了一个微信公众号,微信公众号发文章时会通知你有新文章了,你阅读了新文章后可能会做某些操作比如评论,点赞等
在上面场景中,微信公众号发布新文章是一个事件,关注微信公众号就是订阅了这个事件,通知你时代表调用了你的一个函数来通知,新文章代表的是在这个事件包含的内容(参数),做出的某些操作就是你在这个函数中的操作,场景可以简化为:
关注公众号
公众号发布新文章
通知你
做出操作
如果替换成事件,则为:
订阅事件
事件发生
调用你在订阅时给出的函数
你在函数内做出操作
详细可以参考观察者模式
Forge中的事件 大概分为两条线,一个是游戏中的事件线,一个是模组事件线
游戏事件线 如攻击实体,与实体交互等事件
模组事件线点我
怎么用调用的函数定义方法 在函数前加上注解 @SubscribeEvent,参数名为你要订阅的事件,如我想要订阅TickEvent.PlayerTickEvent则函数为:
1234@SubscribeEventpublic void onTick(TickEvent.PlayerTickEvent playerTickEvent) { ...