今天在 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 #include #include rv.hrv_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支持的指令列表参见 支持指令列表。
基于CY8C21534的通用操作面板解析方案
英飞凌旗下IR HiRel公司助力NASA毅力号火星探测车创造新里程碑
小米MIUI9最新消息:MIUI9化繁为简将主打简单好用,对比MIUI8可谓是大刀阔斧的改革
气体质量流量传感器工业自动化行业的应用分析
矽力杰参加2022慕尼黑华南电子展
使用ANSI C代码实现RISC-V CPU内核
爱立信和意法完成ST-Ericsson拆分交易
2025年东南亚的云计算市场规模将达到403.2亿美元
!吉时利2303/吉时利2303/吉时利2303电源 小兵/
Emrod 实现了 Nikola Tesla 的梦想
加速度传感器在铁路交通中的应用
Mindspeed和中国移动就TD-SCDMA/TD-LTE小蜂窝解决方案展开合作
聊聊CPU中最基础的逻辑门
802.11n已out?华为首推802.11ac商用
2018年LoRa市场具备的5大特征
蓄电池内阻检测仪可用来判断蓄电池的电池容量
正确感知周围环境,深度了解自动驾驶传感器
电瓶修复—铅锑合金电池充电器的最佳参数
usb集线器对电脑有什么坏处
影响纯电动汽车续航里程的因素有哪些?