今天在 GitHub 上看到一个 C 语言项目,用大约 600 行代码实现了一个 RISC-V CPU 核,甚为感叹,分享一下。不管是学习 C,还是学习 RISC-V,这个项目都有非常高的学习价值,开源万岁!
rv
用 ANSI C 编写的 RISC-V CPU 内核。
特征:
- RV32IMC 用户级实现
- 通过 riscv 测试中所有支持的测试
- ~600 行代码
- 不使用任何大于 32 位的整数类型,即使对于乘法也是如此
- 简单 API(两个函数,加上您提供的两个内存回调函数)
- 无内存分配
应用程序接口
/* Memory access callbacks: data is input/output, return RV_BAD on fault, 0 otherwise */
typedef rv_res (*rv_store_cb)(void *user, rv_u32 addr, rv_u8 data);
typedef rv_res (*rv_load_cb)(void *user, rv_u32 addr, rv_u8 *data);
/* Initialize CPU. */
void rv_init(rv *cpu, void *user, rv_load_cb load_cb, rv_store_cb store_cb);
/* Single-step CPU. Returns 0 on success, one of RV_E* on exception. */
rv_u32 rv_step(rv *cpu);
用法
#include < stdio.h >
#include < string.h >
#include "rv.h"
rv_res load_cb(void *user, rv_u32 addr, rv_u8 *data) {
if (addr - 0x80000000 > 0x10000) /* Reset vector is 0x80000000 */
return RV_BAD;
*data = ((rv_u8 *)(user))[addr - 0x80000000];
return RV_OK;
}
rv_res store_cb(void *user, rv_u32 addr, rv_u8 data) {
if (addr - 0x80000000 > 0x10000)
return RV_BAD;
((rv_u8 *)(user))[addr - 0x80000000] = data;
return RV_OK;
}
rv_u32 program[2] = {
/* _start: */
0x02A88893, /* add a7, a7, 42 */
0x00000073 /* ecall */
};
int main(void) {
rv_u8 mem[0x10000];
rv cpu;
rv_init(&cpu, (void *)mem, &load_cb, &store_cb);
memcpy((void *)mem, (void *)program, sizeof(program));
while (rv_step(&cpu) != RV_EECALL) {
}
printf("Environment call @ %08X: %un", cpu.pc, cpu.r[17]);
return 0;
}
为rv
编译程序
使用 riscv-gnu-toolchain工具链和 rv 链接脚本 。
建议使用gcc
命令行:
riscv64-unknown-elf-gcc example.S -nostdlib -nostartfiles -Tlink.ld -march=rv32imc -mabi=ilp32 -o example.o -e _start -g -no-pie
然后用 obj 工具将0x80000000
起始的二进制代码生成能被rv
加载的二进制文件:
riscv64-unknown-elf-objcopy -g -O binary example.o example.bin
支持的指令列表
参见 支持指令列表。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
内核
+关注
关注
3文章
1309浏览量
39848 -
cpu
+关注
关注
68文章
10443浏览量
206566 -
ANSI
+关注
关注
0文章
27浏览量
20419 -
C代码
+关注
关注
1文章
89浏览量
14177 -
RISC-V
+关注
关注
41文章
1904浏览量
45047
发布评论请先 登录
相关推荐
瑞萨电子推出64位RISC-V CPU内核RZ/Five通用MPU,开创RISC-V技术先河
瑞萨电子今日宣布,推出基于64位RISC-V CPU内核的RZ/Five通用微处理器(MPU)——RZ/Five采用Andes AX45MP,基于RISC-V
发表于 03-01 13:54
•1236次阅读
瑞萨电子推出采用自研RISC-V CPU内核的通用32位MCU
2024 年 3 月 26 日,中国北京讯 - 全球半导体解决方案供应商瑞萨电子(TSE:6723)今日宣布率先在业内推出基于内部自研CPU内核构建的通用32位RISC-V微控制器(MCU
发表于 03-30 22:08
科普RISC-V生态架构(认识RISC-V)
的32位,这种等长指令定义使得仅支持整数指令子集的基本RISC-V CPU非常容易设计。但是等长的32位编码指令也会造成代码体积(Code Size)相对较大的问题。为了满足某些对于代码
发表于 08-02 11:50
RISC-V是什么
(刚刚投入芯片行业学习的新人,存在理解错误的地方欢迎指出,并探讨,还请多多包涵,谢谢!) RISC-V是区别于 INTEL x86架构、arm架构的另一种芯片内核架构。 RISC-V,主要区别于当代
发表于 07-23 06:06
RISC-V MCU开发 (一):集成开发环境
近年来,RISC-V生态获得了空前的繁荣发展,国内外众多科技公司纷纷下场布局、行业应用层出不穷,搭载RISC-V内核的MCU也逐渐走入了工程师的日常开发工作中。 工欲善其事必先利其器,要想实现
发表于 09-22 14:44
如何实现一个RISC-V内核架构的芯片移植工作
使用 common 文件夹中的任务切换代码RT-Thread RISC-V 内核移植 API 实现内核移植的主要工作内容,主要就是
发表于 03-25 10:11
RISC-V基础知识:模块化开放式的ISA CISC和RISC代码区别
/ti/)TIonal— 一个开放的 ISARISC-V是一种开放式指令集架构(ISA),这意味着您可以自由地在微处理器或微控制器中实现RISC-V CPU,而无需向任何人支付使用此I
发表于 12-23 17:51
【转载】RISC-V 能打 50 年!risc-v 现在和未来的发展
,预计到 2025 年,市场将总共消费 624 亿个 RISC-V CPU 内核,其中预计工业领域将是最大的细分市场,届时将拥有 167 亿个内核。那么
发表于 02-27 20:02
RISC-V MCU开发实战(一) :DHT11
近年来,RISC-V生态获得了空前的繁荣发展,国内外众多科技公司纷纷下场布局、行业应用层出不穷,搭载RISC-V内核的MCU也逐渐走入了工程师的日常开发工作中。工欲善其事必先利其器,要想实现
发表于 03-06 15:17
FreeRTOS与RISC-V——适用于RISC-V的FreeRTOS概述
1.1简介FreeRTOS中面向RISC-V的接口是易于拓展的,其提供了一系列基本的接口,用于操作适用于所有RISC-V实现中的通用寄存器,以及一系列的宏来处理特定的硬件实现中涉及到的
发表于 04-09 09:26
Occamy RISC-V 前景如何
位 FPU,以及两颗来自美光的 16GB HBM2e 内存。处理器的内核通过中介层实现互连,双块 CPU 可提供 0.75 FP64 TFLOPS 的性能和 6 FP8 TFLOPS 算力。那么Occamy
发表于 05-13 08:44
RISC-V,正在摆脱低端
,届时我国企业有望在全球RISC-V新生态中取得领先优势,打通芯片领域国内国外双循环,实现我国高端处理器芯片产业自立自强。
芯来科技也是国内较早参与RISC-V CPU IP核研发
发表于 05-30 14:11
瑞萨推出采用自研CPU内核的通用32位RISC-V MCU 加强RISC-V生态系统布局
瑞萨电子(TSE:6723)宣布率先在业内推出基于内部自研CPU内核构建的通用32位RISC-V微控制器(MCU)——R9A02G021。尽管多家MCU供应商最近加入了投资联盟以推动RISC-
发表于 03-28 19:00
•121次阅读
评论