0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用ANSI C代码实现RISC-V CPU内核

CHANBAEK ? 来源: FunIO ? 作者: FunIO ? 2023-07-23 11:02 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

今天在 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

    文章

    1423

    浏览量

    41666
  • cpu
    cpu
    +关注

    关注

    68

    文章

    11119

    浏览量

    218352
  • ANSI
    +关注

    关注

    0

    文章

    29

    浏览量

    20811
  • C代码
    +关注

    关注

    1

    文章

    90

    浏览量

    14852
  • RISC-V
    +关注

    关注

    46

    文章

    2635

    浏览量

    49247
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    64位RISC-V CPU发展现状和未来前景

    RISC-V CPU发展情况 实际上,目前RISC-V已经开始64位CPU的研发,也已经有相关内核和产品面市,比如平头哥64位
    的头像 发表于 07-22 07:59 ?4618次阅读

    瑞萨电子推出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 ?1665次阅读
    瑞萨电子推出64位<b class='flag-5'>RISC-V</b> <b class='flag-5'>CPU</b><b class='flag-5'>内核</b>RZ/Five通用MPU,开创<b class='flag-5'>RISC-V</b>技术先河

    瑞萨电子推出采用自研RISC-V CPU内核的通用32位MCU

    2024 年 3 月 26 日,中国北京讯 - 全球半导体解决方案供应商瑞萨电子(TSE:6723)今日宣布率先在业内推出基于内部自研CPU内核构建的通用32位RISC-V微控制器(MCU
    发表于 03-30 22:08

    RISC-V能否复制Linux 的成功?》

    个角度来看,RISC-V ISA是推动RISC-V发展的关键因素。回想20年前,基于Linux内核实现方案非常多,远远超过今天基于RISC-V
    发表于 11-26 20:20

    为什么选择RISC-V

    。例如,如果工程师在FPGA中实现RISC-V内核,则通常可以使用RTL源代码。由于RISC-V免版税,这为将基于
    发表于 07-27 17:38

    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 MCU开发实战(一) :DHT11

    近年来,RISC-V生态获得了空前的繁荣发展,国内外众多科技公司纷纷下场布局、行业应用层出不穷,搭载RISC-V内核的MCU也逐渐走入了工程师的日常开发工作中。工欲善其事必先利其器,要想实现
    发表于 03-06 15:17

    RISC-V MCU开发 (六):代码下载

    、CH58x、CH32Fx、CH32Vx等RISC-V/ARM内核MCU工程的代码下载功能。其中,对于CH56x、CH57x、CH58x等型号,MRS还支持关闭两线仿真调试接口功能;对于CH32Fx、CH32Vx型号,MRS支持
    发表于 12-02 09:06 ?11次下载
    <b class='flag-5'>RISC-V</b> MCU开发 (六):<b class='flag-5'>代码</b>下载

    RISC-V CPU调试机制的设计原理

    本文将详细介绍RISC-V CPU调试机制的设计原理。
    发表于 10-18 09:19 ?2790次阅读

    TenstorrentInc首席CPU构架师 练维汉:助力数字化升级的RISC-V AI 高性能CPU

    ”,曾在水果公司作CPU的架构设计师。练维汉除介绍RISC-V内核的高性能 CPU IP内核技术之外,也对近期热门的
    的头像 发表于 08-28 12:05 ?4446次阅读
    TenstorrentInc首席<b class='flag-5'>CPU</b>构架师 练维汉:助力数字化升级的<b class='flag-5'>RISC-V</b> AI 高性能<b class='flag-5'>CPU</b>

    内核架构意义凸显,RISC-V现新机.zip

    内核架构意义凸显,RISC-V现新机
    发表于 01-13 09:06 ?3次下载

    新闻快讯 | 瑞萨推出第一代32位RISC-V CPU内核

    新闻快讯 全球半导体解决方案供应商瑞萨电子(TSE:6723)宣布成功设计、测试并推出基于开放标准RISC-V指令集架构(ISA)的32位CPU内核。瑞萨作为业内首个为32位通用RISC-V
    的头像 发表于 12-08 11:40 ?849次阅读

    瑞萨推出采用自研CPU内核的通用32位RISC-V MCU 加强RISC-V生态系统布局

    瑞萨推出采用自研CPU内核的通用32位RISC-V MCU 加强RISC-V生态系统布局 RISC-V MCU为开发人员带来低功耗、高性能的
    发表于 03-28 19:00 ?956次阅读