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

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

3天内不再提示

RISCV的模块化的概念及编译开发riscv gcc相关

嵌入式小作坊 来源:嵌入式IoT 作者: bigmagic 2021-08-10 10:03 次阅读

1.概述由于RISCV的模块化的指令集的定义,各家都有着自己的实现方式。从当前看来,除了标准的CSR外,很多都实现了自己的CSR指令扩展。如何自定义CSR并且让编译器能够识别,本文将进行一定的分析,同时从riscv gcc开发的角度出发,来分析编译器开发的流程。

2.不改变编译工具链实现CSR添加如果想读写CSR,可以使用汇编指令进行操作。

void test_csr()

{

int a = 0x00200;

asm volatile(“csrw 0x307,%0”::“r”(a));

}

通过反汇编

riscv32-unknown-elf-objdump -D virt_test.elf 》 1.txt

得到该函数的汇编代码

c8a2b35c-f86c-11eb-9bcf-12bb97331649.png

由于编号为0x307的CSR没有标准定义,所以会直接会体现在汇编函数中。但是这样并不会影响功能的使用。

对于这些非标准的CSR的读写操作,RISCV GCC并不会根据特定的编码序号生成相应的名称。

比如芯来科技为其eclic定义的一条CSR。

如果用标准的GCC进行编译,那么需要给定CSR地址(0x7ed)。

这样的实现,在写汇编函数的时候,给定CSR的地址即可,不能写名字。比如:

csrw 0x7ed,zero

通过上述的方式,可以完成不改变编译器的情况下,实现非标准的CSR的操作。

3.在编译器中集成CSR名称往往通过汇编去查看时,若没有CSR名称,直接去查看CSR的地址,有时候还需要通过CSR的地址,查阅相关的寄存器手册,才能明白读写哪个寄存器。为了简化这种操作,可以将CSR的名称添加到gcc中。这里借用玄铁C906上的扩展指令进行实验。

如果不想改变gcc,那么实现上直接可以通过内联汇编。

void test_csr()

{

int a = 0x00200;

asm volatile(“csrw 0x7c0,%0”::“r”(a));

}

那么最后反汇编得到结果如下:

c9b764e0-f86c-11eb-9bcf-12bb97331649.png

这显然还是不够直观。

为了让其更加的直观,可以修改RISCV工具链。

这里使用的是riscv-gnu-toolchain,目前做编译器开发需要对该仓库的使用非常熟悉。

https://github.com/riscv/riscv-gnu-toolchain.git

将代码进行clone后,更新子模块。

git submodule init

git submodule update

其中需要修改的是riscv-gnu-toolchain/riscv-binutils/include/opcode/riscv-opc.h

同时将MXSTATUS的地址添加进去。

这样就能够,编译工具链,用生成的编译工具链去编译代码,就能够正常的看到反汇编的执行效果了。

这样,无论是传递地址csrw 0x7c0,zero,还是传递名称csrw mxstatus,zero,汇编器都能够正常的输出CSR名称。

通过对编译器的修改,也是非常的简单的实现了这个功能。

4.编译开发riscv gcc相关如果要研究riscv gcc的开发工作,搭建环境,加快编译效率很关键。由于编译工具链很大,涉及到的模块很多,而且编译的过程很复杂,为了节省编译的时间,可以通过编译选项来进行约束。

通常情况下,编译全功能的gcc,可以采用

。/configure --prefix=$PREFIX --enable-multilib --with-cmodel=medany

当使能了--enable-multilib,就能够编译很多版本的lib库。

。/riscv64-unknown-elf-gcc --print-multi-lib

。;

rv32i/ilp32;@march=rv32i@mabi=ilp32

rv32ic/ilp32;@march=rv32ic@mabi=ilp32

rv32im/ilp32;@march=rv32im@mabi=ilp32

rv32imc/ilp32;@march=rv32imc@mabi=ilp32

rv32iac/ilp32;@march=rv32iac@mabi=ilp32

rv32imac/ilp32;@march=rv32imac@mabi=ilp32

rv32imafc/ilp32f;@march=rv32imafc@mabi=ilp32f

rv32imafdc/ilp32d;@march=rv32imafdc@mabi=ilp32d

rv32e/ilp32e;@march=rv32e@mabi=ilp32e

rv32ec/ilp32e;@march=rv32ec@mabi=ilp32e

rv32emc/ilp32e;@march=rv32emc@mabi=ilp32e

rv32ema/ilp32e;@march=rv32ema@mabi=ilp32e

rv32emac/ilp32e;@march=rv32emac@mabi=ilp32e

rv32eac/ilp32e;@march=rv32eac@mabi=ilp32e

rv64i/lp64;@march=rv64i@mabi=lp64

rv64im/lp64;@march=rv64im@mabi=lp64

rv64imc/lp64;@march=rv64imc@mabi=lp64

rv64imac/lp64;@march=rv64imac@mabi=lp64

rv64imafc/lp64f;@march=rv64imafc@mabi=lp64f

这样实际上也是消耗了很多时间,为了解决这个问题,可以指定特定的march和mabi进行编译和测试,待开发完成后,发布时在进行整体编译。这样开发效率会高出很多。

make clean

。/configure --prefix=$RISCV/0727/rv32 --with-arch=rv32gc --with-abi=ilp32d --disable-gdb

make -j8

例如上面的命令,只编译march为rv32gc,abi为ilp32d的gcc模型。省略掉很多库的编译,让编译的时间缩短了不少。

5.小结为自己的处理器添加特定的CSR支持,一种情况下可以使用CSR的地址进行,另外一种就是修改汇编器,前一种方法比较直观,适合使用riscv通用编译器的开发方式进行开发,但是不够直观。后一种则需要修改汇编器,并且需要自己编译工具链,比较复杂,但是使用起来直观,简单。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • CSR
    CSR
    +关注

    关注

    3

    文章

    116

    浏览量

    69401
  • 函数
    +关注

    关注

    3

    文章

    3846

    浏览量

    61228
  • 编译器
    +关注

    关注

    1

    文章

    1564

    浏览量

    48531

原文标题:riscv gcc中添加自定义的csr支持

文章出处:【微信号:gh_390c588e521e,微信公众号:嵌入式小作坊】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    RISCV soft JTAG调试_v1.1

    因为目前软件的限制,RISCV的逻辑不能同时共用JTAG,所以如果想要同时去调试逻辑和RISCV的话,可以通过RISCV的soft Jtag来实现。soft Jtag就是通过GPIO来实现的软件
    的头像 发表于 02-23 16:16 140次阅读
    <b class='flag-5'>RISCV</b> soft JTAG调试_v1.1

    qemu-riscv在scode的gdb调试步骤

    qemu支持gdb调试,只需要在命令中添加 -s -S两个参数即可,在bsp/qemu-riscv下已经有了qemu-dbg.sh,且加入了该参数
    的头像 发表于 09-28 10:54 907次阅读
    qemu-<b class='flag-5'>riscv</b>在scode的gdb调试步骤

    求助,为什么会出现“relocation truncated to fit: R_RISCV_JAL ”?

    relocation truncated to fit: R_RISCV_JAL against `.L314\'编译 mavpich2 报的错。 我查了一下。貌似是 riscv 的连接器默认只能
    发表于 09-12 08:06

    在windows上安装了msys2,riscv-gnu-toolchain工具链编译报错是为什么?

    在windows安装了msys2,编译riscv工具链源码报错,想求助各路大神帮我想想解决方法,谢谢! /d/Home/riscv-gnu-toolchain/riscv-binuti
    发表于 08-17 06:56

    RISCV如何去开启和使用V扩展指令?

    。只需要在编译选项中开启即可。 从传递给riscvgcc的选项来看,带有v扩展即可。 -march是指定了riscv模块化的指令集选
    发表于 08-16 08:15

    riscv实现自定义指令并用qemu运行的过程

    qemu模拟硬件平台,实现特定指令解析,同时写裸机代码来测试该指令的运行情况。当然,如果实现的很好,是需要修改riscvgcc的,让自己的扩展指令加入。这里不做修改,后面会详细描述细节。 自定义指令
    发表于 08-16 07:27

    全志D1开发RISCV64开箱评测

    的生态建设远远没有arm强大,但是也在开源思想的引领下,开始逐步走向大众的视野。 这块哪吒 RISCV64的板子,从主要的核的特性上来看,与目前市面上可见的riscv开发板相比,特性主要有以下几点: 1.
    发表于 08-16 07:05

    NucleiStudio编译出错是什么原因造成的?解决方法是什么?

    写了一个代码,编译后爆出如下错误,请问哪位大神知道是什么问题,解决方法是什么? 错误如下: d:/fpga开发工具/nucleistudio_ide_202102-win64
    发表于 08-16 06:07

    请问蜂鸟E203的sdk开发环境是否可以将编译工具链换成官方的riscv64-unknown-elf-gcc?

    我在Eclipse中将编译器设置为了riscv64-unknown-elf-gcc,但好像编译不了? 请问一下蜂鸟203是否支持用官方工具链编译
    发表于 08-12 08:13

    使用cygwin编译riscv的工具链,切换工具链后报错如何解决?

    我使用cygwin编译riscv的工具链,然后将芯来IDE的工具链切换为我编译出来的工具链但是却报以下的问题。gcc认为没有文件输入,我在查询了一些资料后认为是斜杠引起的,请问该如何
    发表于 08-12 07:51

    RISCV自定义指令编译报错怎么解决?

    各位老师好,本人在学习riscv指令时,在指令编译过程中遇到如下问题,希望老师能够不吝赐教,非常感谢!
    发表于 08-12 07:40

    将hbird-e-sdk项目下载到linux中,使用riscv-gcc工具链编译报错如何解决?

    /home/china/gnu-mcu-eclipse/riscv-none-gcc/7.2.0-4-20180606-1631/bin/../lib/gcc/riscv
    发表于 08-12 06:40

    AG32VF407环境搭建(FPGA+RISCV

    AG32VF407环境搭建(FPGA+RISCV
    的头像 发表于 07-17 09:21 4544次阅读
    AG32VF407环境搭建(FPGA+<b class='flag-5'>RISCV</b>)

    RT-Thread BSP qemu-virt64-riscv编译环境搭建

    与 packages 软件包   交叉编译工具链   再次运行 scons 后,发现提示找不到 gcc 交叉编译工具链, riscv64-unknown-linux-musl-gcc
    发表于 05-16 10:37

    RISC-V GNU Toolchain 编译安装

    -gnu-toolchain.git$cd riscv-gnu-toolchain$git submodule update --init –recursive相关依赖获取由于使用 Ubuntu 开发
    发表于 04-16 00:22