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

    文章

    1309

    浏览量

    39848
  • cpu
    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次阅读
    瑞萨电子推出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

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

    科普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

    国内RISC-V内核MCU厂商主要有哪些?

    RISC-V发展迅速,国内厂商也纷纷入局,目前国内RISC-V内核MCU厂商主要有哪些呢,前景如何?
    发表于 04-14 10:02

    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次阅读